lostpage 0.0.0-stage → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (411) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +390 -2
  3. package/dist/catalog.d.ts +2 -0
  4. package/dist/catalog.js +1 -0
  5. package/dist/catalog.json +11438 -0
  6. package/dist/cdn/c/ascii-3d-LO5K5SPJ.js +3 -0
  7. package/dist/cdn/c/astronaut-LH5N45GT.js +2 -0
  8. package/dist/cdn/c/aurora-XF7DCQ7M.js +129 -0
  9. package/dist/cdn/c/autumn-V5GRVYCX.js +1 -0
  10. package/dist/cdn/c/balloon-404-KV6ISJWV.js +1 -0
  11. package/dist/cdn/c/beach-OGS53KAQ.js +95 -0
  12. package/dist/cdn/c/black-hole-635WWF67.js +124 -0
  13. package/dist/cdn/c/block-drop-QU7NYBNQ.js +1 -0
  14. package/dist/cdn/c/blue-screen-GKLGT7XD.js +70 -0
  15. package/dist/cdn/c/breakout-EGDE3QDC.js +1 -0
  16. package/dist/cdn/c/bricks-C6XPPQ64.js +1 -0
  17. package/dist/cdn/c/broken-link-U47D6LR2.js +11 -0
  18. package/dist/cdn/c/brutalist-QFXIHFAD.js +15 -0
  19. package/dist/cdn/c/bubble-wrap-45ZWIQMW.js +1 -0
  20. package/dist/cdn/c/campfire-TFG4DUUS.js +88 -0
  21. package/dist/cdn/c/card-GH5VVMRG.js +15 -0
  22. package/dist/cdn/c/cassette-33OUQ4CF.js +15 -0
  23. package/dist/cdn/c/chalkboard-NAPUHNER.js +3 -0
  24. package/dist/cdn/c/chrome-404-QVPFIQEF.js +1 -0
  25. package/dist/cdn/c/chunk-4ZBXB36L.js +1 -0
  26. package/dist/cdn/c/chunk-A44JMJWI.js +1 -0
  27. package/dist/cdn/c/chunk-HXSSPN2I.js +1 -0
  28. package/dist/cdn/c/chunk-IETNWEVK.js +1 -0
  29. package/dist/cdn/c/chunk-JLRXT2AZ.js +4 -0
  30. package/dist/cdn/c/chunk-LMRCHEWX.js +1 -0
  31. package/dist/cdn/c/chunk-NUQBEDA4.js +296 -0
  32. package/dist/cdn/c/chunk-QHXVYCR6.js +1 -0
  33. package/dist/cdn/c/chunk-QJZBGT2Q.js +75 -0
  34. package/dist/cdn/c/chunk-URWX3LLV.js +1 -0
  35. package/dist/cdn/c/chunk-YNREKTFR.js +70 -0
  36. package/dist/cdn/c/circuit-board-V6VT4OTX.js +1 -0
  37. package/dist/cdn/c/claw-machine-LLCPLZ6W.js +1 -0
  38. package/dist/cdn/c/clay-404-SMDVAQCV.js +1 -0
  39. package/dist/cdn/c/constellation-J5QMY7IB.js +1 -0
  40. package/dist/cdn/c/countdown-2TEFVO73.js +14 -0
  41. package/dist/cdn/c/cross-stitch-N5H5GLAG.js +2 -0
  42. package/dist/cdn/c/deep-sea-ILDVMW5M.js +85 -0
  43. package/dist/cdn/c/divider-PMT4UZEF.js +9 -0
  44. package/dist/cdn/c/dna-CAAKBMRK.js +2 -0
  45. package/dist/cdn/c/dominoes-VLA5MBXM.js +1 -0
  46. package/dist/cdn/c/dot-grid-O7LJO44U.js +11 -0
  47. package/dist/cdn/c/editorial-4C5Z33WO.js +11 -0
  48. package/dist/cdn/c/elevator-EFNB6FVO.js +36 -0
  49. package/dist/cdn/c/emoji-EHAJDQSM.js +8 -0
  50. package/dist/cdn/c/error-cascade-CIJCQLP3.js +18 -0
  51. package/dist/cdn/c/evidence-board-Z7DXMGNE.js +18 -0
  52. package/dist/cdn/c/eyes-VPOHW2CX.js +2 -0
  53. package/dist/cdn/c/fireworks-QLWJ3S43.js +1 -0
  54. package/dist/cdn/c/flashlight-QXI7QT74.js +57 -0
  55. package/dist/cdn/c/flatline-3GBK7IVS.js +1 -0
  56. package/dist/cdn/c/flock-RLSZ7EZQ.js +1 -0
  57. package/dist/cdn/c/foggy-glass-A56REA7E.js +1 -0
  58. package/dist/cdn/c/gears-4HJO7H74.js +5 -0
  59. package/dist/cdn/c/glass-404-WZRMDFTP.js +1 -0
  60. package/dist/cdn/c/glitch-Y4CIADF3.js +60 -0
  61. package/dist/cdn/c/gradient-404-YNSTOPNA.js +6 -0
  62. package/dist/cdn/c/halftone-XZ7F75B4.js +43 -0
  63. package/dist/cdn/c/hanging-letters-Y3VH7EVP.js +1 -0
  64. package/dist/cdn/c/hanging-sign-2KUXPLZE.js +1 -0
  65. package/dist/cdn/c/helpful-links-UFGTWTRQ.js +18 -0
  66. package/dist/cdn/c/hyperspace-R34QNI7J.js +57 -0
  67. package/dist/cdn/c/hypnosis-MK6AV3SC.js +26 -0
  68. package/dist/cdn/c/ink-S332BOPS.js +43 -0
  69. package/dist/cdn/c/invaders-ZSY3Z443.js +1 -0
  70. package/dist/cdn/c/kaleidoscope-BLGSIK4F.js +34 -0
  71. package/dist/cdn/c/lava-lamp-VYY5XFG5.js +55 -0
  72. package/dist/cdn/c/life-QBWZL5FY.js +1 -0
  73. package/dist/cdn/c/lighthouse-QX7QIIPX.js +60 -0
  74. package/dist/cdn/c/loading-LIS67QF7.js +34 -0
  75. package/dist/cdn/c/lost-at-sea-QNURIHBY.js +258 -0
  76. package/dist/cdn/c/magic-8-ball-W3TRJALZ.js +2 -0
  77. package/dist/cdn/c/matrix-rain-4V4SVGGG.js +3 -0
  78. package/dist/cdn/c/maze-QL5TRCE5.js +1 -0
  79. package/dist/cdn/c/mesh-gradient-UISGI62K.js +34 -0
  80. package/dist/cdn/c/metro-map-H64EHOZM.js +30 -0
  81. package/dist/cdn/c/milk-carton-3SDLA5AY.js +53 -0
  82. package/dist/cdn/c/minimal-SB6FU3DE.js +9 -0
  83. package/dist/cdn/c/mirage-IQ3IA3VB.js +70 -0
  84. package/dist/cdn/c/moon-landing-TKZE4Q6G.js +1 -0
  85. package/dist/cdn/c/neon-sign-XGMN75MH.js +1 -0
  86. package/dist/cdn/c/newspaper-YECAUY77.js +49 -0
  87. package/dist/cdn/c/nixie-CQBRCVDE.js +1 -0
  88. package/dist/cdn/c/no-signal-HL4A4CFZ.js +82 -0
  89. package/dist/cdn/c/one-bit-AFIZQPHK.js +49 -0
  90. package/dist/cdn/c/outline-404-REB5E5EN.js +9 -0
  91. package/dist/cdn/c/paint-splash-GZGPOURW.js +1 -0
  92. package/dist/cdn/c/paper-plane-KDCSE3RM.js +2 -0
  93. package/dist/cdn/c/particles-7UMRMT2M.js +1 -0
  94. package/dist/cdn/c/path-not-found-VUEXOVO7.js +14 -0
  95. package/dist/cdn/c/planet-H6QGPDVC.js +157 -0
  96. package/dist/cdn/c/pond-6DL43VUQ.js +106 -0
  97. package/dist/cdn/c/pong-B2ZGAY7T.js +1 -0
  98. package/dist/cdn/c/radar-22JCPGQZ.js +4 -0
  99. package/dist/cdn/c/rainy-window-DTGLJVAR.js +114 -0
  100. package/dist/cdn/c/receipt-ZOYUSMN3.js +32 -0
  101. package/dist/cdn/c/road-closed-3OS55UBX.js +1 -0
  102. package/dist/cdn/c/rpg-dialog-FV53YYNJ.js +14 -0
  103. package/dist/cdn/c/runner-NANXJTQG.js +1 -0
  104. package/dist/cdn/c/scratch-card-GC6U4ZZN.js +1 -0
  105. package/dist/cdn/c/screensaver-UXKJVQUU.js +1 -0
  106. package/dist/cdn/c/search-404-HFKZ4DUA.js +17 -0
  107. package/dist/cdn/c/server-default-RBMMRAHS.js +10 -0
  108. package/dist/cdn/c/server-room-QSKAUFUY.js +1 -0
  109. package/dist/cdn/c/skyline-OMZMF5R6.js +1 -0
  110. package/dist/cdn/c/skywriting-RYNQWJ6I.js +1 -0
  111. package/dist/cdn/c/slot-machine-XXCVI2HK.js +33 -0
  112. package/dist/cdn/c/snake-6Z5V3QA3.js +1 -0
  113. package/dist/cdn/c/snow-globe-RLDPNA2J.js +2 -0
  114. package/dist/cdn/c/soft-blobs-FYEFGINV.js +15 -0
  115. package/dist/cdn/c/solar-system-CQAP6WFU.js +2 -0
  116. package/dist/cdn/c/split-flap-O7JGD5Q4.js +37 -0
  117. package/dist/cdn/c/split-panel-QGXZ24E4.js +12 -0
  118. package/dist/cdn/c/stage-GBZR3JQS.js +2 -0
  119. package/dist/cdn/c/swiss-poster-OON4HBUG.js +20 -0
  120. package/dist/cdn/c/terminal-7BTUDZDB.js +41 -0
  121. package/dist/cdn/c/thunderstorm-FRCKHKXY.js +1 -0
  122. package/dist/cdn/c/topographic-3RIQXKIQ.js +38 -0
  123. package/dist/cdn/c/torn-page-6UT5ZQHG.js +16 -0
  124. package/dist/cdn/c/treasure-map-FALAEBL5.js +3 -0
  125. package/dist/cdn/c/typewriter-7TIO42MH.js +23 -0
  126. package/dist/cdn/c/ufo-6UW34TI3.js +1 -0
  127. package/dist/cdn/c/unplugged-QXKDDH4S.js +1 -0
  128. package/dist/cdn/c/vending-machine-SH3MNFMY.js +27 -0
  129. package/dist/cdn/c/vinyl-3FUP3LSO.js +2 -0
  130. package/dist/cdn/c/voxel-404-LMC43X4B.js +102 -0
  131. package/dist/cdn/c/wormhole-I2RWIMRW.js +113 -0
  132. package/dist/cdn/c/zen-garden-HMAMASJK.js +1 -0
  133. package/dist/cdn/element.js +1 -0
  134. package/dist/cdn/index.js +1 -0
  135. package/dist/chunks/chunk-3ISI6SOJ.js +1 -0
  136. package/dist/chunks/chunk-6HZC24J2.js +296 -0
  137. package/dist/chunks/chunk-7XMDQMDO.js +1 -0
  138. package/dist/chunks/chunk-B2NBRLO2.js +1 -0
  139. package/dist/chunks/chunk-B4TY5M55.js +1 -0
  140. package/dist/chunks/chunk-DAZOIOF7.js +1 -0
  141. package/dist/chunks/chunk-ES56TX4X.js +1 -0
  142. package/dist/chunks/chunk-FVGCB66F.js +1 -0
  143. package/dist/chunks/chunk-KIYSQVWX.js +1 -0
  144. package/dist/chunks/chunk-MNUNTC4L.js +4 -0
  145. package/dist/chunks/chunk-SH72TE6I.js +75 -0
  146. package/dist/chunks/chunk-URB3NNOB.js +70 -0
  147. package/dist/cli.js +97 -0
  148. package/dist/core/canvas2d.d.ts +18 -0
  149. package/dist/core/define.d.ts +16 -0
  150. package/dist/core/gl.d.ts +50 -0
  151. package/dist/core/glsl.d.ts +10 -0
  152. package/dist/core/overlay.d.ts +5 -0
  153. package/dist/core/runtime.d.ts +8 -0
  154. package/dist/core/shader.d.ts +22 -0
  155. package/dist/core/styles.d.ts +4 -0
  156. package/dist/core/text.d.ts +54 -0
  157. package/dist/core/types.d.ts +170 -0
  158. package/dist/core/util.d.ts +16 -0
  159. package/dist/core.d.ts +8 -0
  160. package/dist/core.js +1 -0
  161. package/dist/element.cdn.js +1 -0
  162. package/dist/element.d.ts +21 -0
  163. package/dist/element.js +1 -0
  164. package/dist/engines/arcade.d.ts +25 -0
  165. package/dist/engines/text3d.d.ts +37 -0
  166. package/dist/generated/all.d.ts +2 -0
  167. package/dist/generated/catalog.d.ts +2 -0
  168. package/dist/generated/registry.d.ts +5 -0
  169. package/dist/index.d.ts +23 -0
  170. package/dist/index.js +1 -0
  171. package/dist/lostpage.global.js +3222 -0
  172. package/dist/react.d.ts +21 -0
  173. package/dist/react.js +2 -0
  174. package/dist/scenes/_simple.d.ts +10 -0
  175. package/dist/scenes/ascii-3d.d.ts +10 -0
  176. package/dist/scenes/ascii-3d.js +3 -0
  177. package/dist/scenes/astronaut.d.ts +10 -0
  178. package/dist/scenes/astronaut.js +2 -0
  179. package/dist/scenes/aurora.d.ts +14 -0
  180. package/dist/scenes/aurora.js +129 -0
  181. package/dist/scenes/autumn.d.ts +8 -0
  182. package/dist/scenes/autumn.js +1 -0
  183. package/dist/scenes/balloon-404.d.ts +9 -0
  184. package/dist/scenes/balloon-404.js +1 -0
  185. package/dist/scenes/beach.d.ts +14 -0
  186. package/dist/scenes/beach.js +95 -0
  187. package/dist/scenes/black-hole.d.ts +15 -0
  188. package/dist/scenes/black-hole.js +124 -0
  189. package/dist/scenes/block-drop.d.ts +9 -0
  190. package/dist/scenes/block-drop.js +1 -0
  191. package/dist/scenes/blue-screen.d.ts +5 -0
  192. package/dist/scenes/blue-screen.js +70 -0
  193. package/dist/scenes/breakout.d.ts +10 -0
  194. package/dist/scenes/breakout.js +1 -0
  195. package/dist/scenes/bricks.d.ts +7 -0
  196. package/dist/scenes/bricks.js +1 -0
  197. package/dist/scenes/broken-link.d.ts +8 -0
  198. package/dist/scenes/broken-link.js +11 -0
  199. package/dist/scenes/brutalist.d.ts +7 -0
  200. package/dist/scenes/brutalist.js +15 -0
  201. package/dist/scenes/bubble-wrap.d.ts +9 -0
  202. package/dist/scenes/bubble-wrap.js +1 -0
  203. package/dist/scenes/campfire.d.ts +11 -0
  204. package/dist/scenes/campfire.js +88 -0
  205. package/dist/scenes/card.d.ts +8 -0
  206. package/dist/scenes/card.js +15 -0
  207. package/dist/scenes/cassette.d.ts +9 -0
  208. package/dist/scenes/cassette.js +15 -0
  209. package/dist/scenes/chalkboard.d.ts +8 -0
  210. package/dist/scenes/chalkboard.js +3 -0
  211. package/dist/scenes/chrome-404.d.ts +13 -0
  212. package/dist/scenes/chrome-404.js +1 -0
  213. package/dist/scenes/circuit-board.d.ts +9 -0
  214. package/dist/scenes/circuit-board.js +1 -0
  215. package/dist/scenes/claw-machine.d.ts +8 -0
  216. package/dist/scenes/claw-machine.js +1 -0
  217. package/dist/scenes/clay-404.d.ts +11 -0
  218. package/dist/scenes/clay-404.js +1 -0
  219. package/dist/scenes/constellation.d.ts +10 -0
  220. package/dist/scenes/constellation.js +1 -0
  221. package/dist/scenes/countdown.d.ts +9 -0
  222. package/dist/scenes/countdown.js +14 -0
  223. package/dist/scenes/cross-stitch.d.ts +8 -0
  224. package/dist/scenes/cross-stitch.js +2 -0
  225. package/dist/scenes/deep-sea.d.ts +9 -0
  226. package/dist/scenes/deep-sea.js +85 -0
  227. package/dist/scenes/divider.d.ts +6 -0
  228. package/dist/scenes/divider.js +9 -0
  229. package/dist/scenes/dna.d.ts +9 -0
  230. package/dist/scenes/dna.js +2 -0
  231. package/dist/scenes/dominoes.d.ts +9 -0
  232. package/dist/scenes/dominoes.js +1 -0
  233. package/dist/scenes/dot-grid.d.ts +9 -0
  234. package/dist/scenes/dot-grid.js +11 -0
  235. package/dist/scenes/editorial.d.ts +6 -0
  236. package/dist/scenes/editorial.js +11 -0
  237. package/dist/scenes/elevator.d.ts +10 -0
  238. package/dist/scenes/elevator.js +36 -0
  239. package/dist/scenes/emoji.d.ts +7 -0
  240. package/dist/scenes/emoji.js +8 -0
  241. package/dist/scenes/error-cascade.d.ts +6 -0
  242. package/dist/scenes/error-cascade.js +18 -0
  243. package/dist/scenes/evidence-board.d.ts +7 -0
  244. package/dist/scenes/evidence-board.js +18 -0
  245. package/dist/scenes/eyes.d.ts +12 -0
  246. package/dist/scenes/eyes.js +2 -0
  247. package/dist/scenes/fireworks.d.ts +8 -0
  248. package/dist/scenes/fireworks.js +1 -0
  249. package/dist/scenes/flashlight.d.ts +12 -0
  250. package/dist/scenes/flashlight.js +57 -0
  251. package/dist/scenes/flatline.d.ts +9 -0
  252. package/dist/scenes/flatline.js +1 -0
  253. package/dist/scenes/flock.d.ts +13 -0
  254. package/dist/scenes/flock.js +1 -0
  255. package/dist/scenes/foggy-glass.d.ts +9 -0
  256. package/dist/scenes/foggy-glass.js +1 -0
  257. package/dist/scenes/gears.d.ts +10 -0
  258. package/dist/scenes/gears.js +5 -0
  259. package/dist/scenes/glass-404.d.ts +11 -0
  260. package/dist/scenes/glass-404.js +1 -0
  261. package/dist/scenes/glitch.d.ts +15 -0
  262. package/dist/scenes/glitch.js +60 -0
  263. package/dist/scenes/gradient-404.d.ts +9 -0
  264. package/dist/scenes/gradient-404.js +6 -0
  265. package/dist/scenes/halftone.d.ts +11 -0
  266. package/dist/scenes/halftone.js +43 -0
  267. package/dist/scenes/hanging-letters.d.ts +10 -0
  268. package/dist/scenes/hanging-letters.js +1 -0
  269. package/dist/scenes/hanging-sign.d.ts +9 -0
  270. package/dist/scenes/hanging-sign.js +1 -0
  271. package/dist/scenes/helpful-links.d.ts +6 -0
  272. package/dist/scenes/helpful-links.js +18 -0
  273. package/dist/scenes/hyperspace.d.ts +11 -0
  274. package/dist/scenes/hyperspace.js +57 -0
  275. package/dist/scenes/hypnosis.d.ts +10 -0
  276. package/dist/scenes/hypnosis.js +26 -0
  277. package/dist/scenes/ink.d.ts +10 -0
  278. package/dist/scenes/ink.js +43 -0
  279. package/dist/scenes/invaders.d.ts +10 -0
  280. package/dist/scenes/invaders.js +1 -0
  281. package/dist/scenes/kaleidoscope.d.ts +10 -0
  282. package/dist/scenes/kaleidoscope.js +34 -0
  283. package/dist/scenes/lava-lamp.d.ts +11 -0
  284. package/dist/scenes/lava-lamp.js +55 -0
  285. package/dist/scenes/life.d.ts +13 -0
  286. package/dist/scenes/life.js +1 -0
  287. package/dist/scenes/lighthouse.d.ts +11 -0
  288. package/dist/scenes/lighthouse.js +60 -0
  289. package/dist/scenes/loading.d.ts +6 -0
  290. package/dist/scenes/loading.js +34 -0
  291. package/dist/scenes/lost-at-sea.d.ts +35 -0
  292. package/dist/scenes/lost-at-sea.js +258 -0
  293. package/dist/scenes/magic-8-ball.d.ts +10 -0
  294. package/dist/scenes/magic-8-ball.js +2 -0
  295. package/dist/scenes/matrix-rain.d.ts +13 -0
  296. package/dist/scenes/matrix-rain.js +3 -0
  297. package/dist/scenes/maze.d.ts +9 -0
  298. package/dist/scenes/maze.js +1 -0
  299. package/dist/scenes/mesh-gradient.d.ts +13 -0
  300. package/dist/scenes/mesh-gradient.js +34 -0
  301. package/dist/scenes/metro-map.d.ts +8 -0
  302. package/dist/scenes/metro-map.js +30 -0
  303. package/dist/scenes/milk-carton.d.ts +9 -0
  304. package/dist/scenes/milk-carton.js +53 -0
  305. package/dist/scenes/minimal.d.ts +6 -0
  306. package/dist/scenes/minimal.js +9 -0
  307. package/dist/scenes/mirage.d.ts +10 -0
  308. package/dist/scenes/mirage.js +70 -0
  309. package/dist/scenes/moon-landing.d.ts +8 -0
  310. package/dist/scenes/moon-landing.js +1 -0
  311. package/dist/scenes/neon-sign.d.ts +15 -0
  312. package/dist/scenes/neon-sign.js +1 -0
  313. package/dist/scenes/newspaper.d.ts +10 -0
  314. package/dist/scenes/newspaper.js +49 -0
  315. package/dist/scenes/nixie.d.ts +11 -0
  316. package/dist/scenes/nixie.js +1 -0
  317. package/dist/scenes/no-signal.d.ts +11 -0
  318. package/dist/scenes/no-signal.js +82 -0
  319. package/dist/scenes/one-bit.d.ts +8 -0
  320. package/dist/scenes/one-bit.js +49 -0
  321. package/dist/scenes/outline-404.d.ts +8 -0
  322. package/dist/scenes/outline-404.js +9 -0
  323. package/dist/scenes/paint-splash.d.ts +6 -0
  324. package/dist/scenes/paint-splash.js +1 -0
  325. package/dist/scenes/paper-plane.d.ts +9 -0
  326. package/dist/scenes/paper-plane.js +2 -0
  327. package/dist/scenes/particles.d.ts +22 -0
  328. package/dist/scenes/particles.js +1 -0
  329. package/dist/scenes/path-not-found.d.ts +6 -0
  330. package/dist/scenes/path-not-found.js +14 -0
  331. package/dist/scenes/planet.d.ts +19 -0
  332. package/dist/scenes/planet.js +157 -0
  333. package/dist/scenes/pond.d.ts +11 -0
  334. package/dist/scenes/pond.js +106 -0
  335. package/dist/scenes/pong.d.ts +8 -0
  336. package/dist/scenes/pong.js +1 -0
  337. package/dist/scenes/radar.d.ts +9 -0
  338. package/dist/scenes/radar.js +4 -0
  339. package/dist/scenes/rainy-window.d.ts +11 -0
  340. package/dist/scenes/rainy-window.js +114 -0
  341. package/dist/scenes/receipt.d.ts +8 -0
  342. package/dist/scenes/receipt.js +32 -0
  343. package/dist/scenes/road-closed.d.ts +9 -0
  344. package/dist/scenes/road-closed.js +1 -0
  345. package/dist/scenes/rpg-dialog.d.ts +11 -0
  346. package/dist/scenes/rpg-dialog.js +14 -0
  347. package/dist/scenes/runner.d.ts +10 -0
  348. package/dist/scenes/runner.js +1 -0
  349. package/dist/scenes/scratch-card.d.ts +9 -0
  350. package/dist/scenes/scratch-card.js +1 -0
  351. package/dist/scenes/screensaver.d.ts +8 -0
  352. package/dist/scenes/screensaver.js +1 -0
  353. package/dist/scenes/search-404.d.ts +9 -0
  354. package/dist/scenes/search-404.js +17 -0
  355. package/dist/scenes/server-default.d.ts +6 -0
  356. package/dist/scenes/server-default.js +10 -0
  357. package/dist/scenes/server-room.d.ts +9 -0
  358. package/dist/scenes/server-room.js +1 -0
  359. package/dist/scenes/skyline.d.ts +10 -0
  360. package/dist/scenes/skyline.js +1 -0
  361. package/dist/scenes/skywriting.d.ts +8 -0
  362. package/dist/scenes/skywriting.js +1 -0
  363. package/dist/scenes/slot-machine.d.ts +10 -0
  364. package/dist/scenes/slot-machine.js +33 -0
  365. package/dist/scenes/snake.d.ts +13 -0
  366. package/dist/scenes/snake.js +1 -0
  367. package/dist/scenes/snow-globe.d.ts +10 -0
  368. package/dist/scenes/snow-globe.js +2 -0
  369. package/dist/scenes/soft-blobs.d.ts +9 -0
  370. package/dist/scenes/soft-blobs.js +15 -0
  371. package/dist/scenes/solar-system.d.ts +9 -0
  372. package/dist/scenes/solar-system.js +2 -0
  373. package/dist/scenes/split-flap.d.ts +15 -0
  374. package/dist/scenes/split-flap.js +37 -0
  375. package/dist/scenes/split-panel.d.ts +8 -0
  376. package/dist/scenes/split-panel.js +12 -0
  377. package/dist/scenes/stage.d.ts +10 -0
  378. package/dist/scenes/stage.js +2 -0
  379. package/dist/scenes/swiss-poster.d.ts +9 -0
  380. package/dist/scenes/swiss-poster.js +20 -0
  381. package/dist/scenes/terminal.d.ts +13 -0
  382. package/dist/scenes/terminal.js +41 -0
  383. package/dist/scenes/thunderstorm.d.ts +11 -0
  384. package/dist/scenes/thunderstorm.js +1 -0
  385. package/dist/scenes/topographic.d.ts +13 -0
  386. package/dist/scenes/topographic.js +38 -0
  387. package/dist/scenes/torn-page.d.ts +9 -0
  388. package/dist/scenes/torn-page.js +16 -0
  389. package/dist/scenes/treasure-map.d.ts +10 -0
  390. package/dist/scenes/treasure-map.js +3 -0
  391. package/dist/scenes/typewriter.d.ts +10 -0
  392. package/dist/scenes/typewriter.js +23 -0
  393. package/dist/scenes/ufo.d.ts +11 -0
  394. package/dist/scenes/ufo.js +1 -0
  395. package/dist/scenes/unplugged.d.ts +9 -0
  396. package/dist/scenes/unplugged.js +1 -0
  397. package/dist/scenes/vending-machine.d.ts +7 -0
  398. package/dist/scenes/vending-machine.js +27 -0
  399. package/dist/scenes/vinyl.d.ts +9 -0
  400. package/dist/scenes/vinyl.js +2 -0
  401. package/dist/scenes/voxel-404.d.ts +13 -0
  402. package/dist/scenes/voxel-404.js +102 -0
  403. package/dist/scenes/wormhole.d.ts +13 -0
  404. package/dist/scenes/wormhole.js +113 -0
  405. package/dist/scenes/zen-garden.d.ts +8 -0
  406. package/dist/scenes/zen-garden.js +1 -0
  407. package/dist/svelte.d.ts +17 -0
  408. package/dist/svelte.js +1 -0
  409. package/dist/vue.d.ts +66 -0
  410. package/dist/vue.js +1 -0
  411. package/package.json +114 -4
@@ -0,0 +1 @@
1
+ import{canvas2d}from"../chunks/chunk-DAZOIOF7.js";import{rgba}from"../chunks/chunk-FVGCB66F.js";import"../chunks/chunk-KIYSQVWX.js";import"../chunks/chunk-7XMDQMDO.js";var foggy_glass_default={id:"foggy-glass",name:"Foggy Glass",description:"Someone wrote the error with a finger on a steamed-up window. Wipe the glass with your cursor and watch it fog back over.",category:"Nature",kind:"2d",motion:"interactive",tags:["canvas","fog","window","wipe","interactive","cozy","winter"],layout:"bottom",codeInScene:!0,copy:{eyebrow:"Wipe the glass",title:"Can't see the page from here.",message:"Drag across the window to clear it. It'll mist up again, and the page still won't be out there.",actions:[{label:"Step back inside",href:"/",variant:"primary"}]},params:{view:"city",fog:"#c9d3dc",regrow:6},theme:{bg:"#7d8b99",fg:"#13202b",accent:"#13202b","accent-fg":"#eef3f7"},presetName:"City Night",presets:{rain:{name:"Rainy Night",params:{view:"city",fog:"#9fb0c2",regrow:3}},forest:{name:"Snowy Forest",eyebrow:"Cold outside",title:"It's freezing, and the page is gone.",params:{view:"forest",fog:"#e6edf2"},theme:{bg:"#c8d4dc",fg:"#14212a",accent:"#14212a","accent-fg":"#fff"}},sunset:{name:"Sunset Drive",params:{view:"sunset",fog:"#f1d9c9"},theme:{bg:"#e8b8a0",fg:"#2c140a",accent:"#2c140a","accent-fg":"#fff"}}},css:"& .lp-body{text-shadow:0 1px 12px rgba(255,255,255,.45)}",setup(ctx){let p=ctx.params,c=canvas2d(ctx),rnd=ctx.random,view,blurred,mask,mg,writing,fogLayer,drips=[],sc=1,mk=(w,h)=>{let cv=document.createElement("canvas");return cv.width=Math.max(1,Math.round(w)),cv.height=Math.max(1,Math.round(h)),cv};function drawView(){let w=c.w,h=c.h;sc=Math.min(2,ctx.dpr),view=mk(w*sc,h*sc);let g=view.getContext("2d");if(g.scale(sc,sc),p.view==="city"){let sky=g.createLinearGradient(0,0,0,h);sky.addColorStop(0,"#0b1430"),sky.addColorStop(1,"#2b2140"),g.fillStyle=sky,g.fillRect(0,0,w,h);for(let x=0;x<w;){let bw=40+rnd()*90,bh=h*(.25+rnd()*.45);g.fillStyle="#0a0c18",g.fillRect(x,h-bh,bw,bh);for(let wy=h-bh+10;wy<h-10;wy+=14)for(let wx=x+6;wx<x+bw-8;wx+=12)rnd()>.55&&(g.fillStyle=["#ffcf7a","#ffe9b8","#9fd1ff","#ff9f6b"][Math.floor(rnd()*4)],g.fillRect(wx,wy,6,8));x+=bw+4}for(let i=0;i<40;i++){let x=rnd()*w,y=h*(.7+rnd()*.3),r=6+rnd()*16,grd=g.createRadialGradient(x,y,0,x,y,r),col=["#ffb347","#ff4d4d","#ffffff","#7fc8ff"][Math.floor(rnd()*4)];grd.addColorStop(0,col),grd.addColorStop(1,rgba(col,0)),g.fillStyle=grd,g.fillRect(x-r,y-r,r*2,r*2)}}else if(p.view==="forest"){let sky=g.createLinearGradient(0,0,0,h);sky.addColorStop(0,"#9fb4c8"),sky.addColorStop(1,"#e8eef3"),g.fillStyle=sky,g.fillRect(0,0,w,h);for(let layer=0;layer<3;layer++){let shade=["#7e93a6","#4f6577","#25384a"][layer];for(let i=0;i<24+layer*8;i++){let x=rnd()*w,th=h*(.25+layer*.12+rnd()*.15),base=h*(.72+layer*.1);g.fillStyle=shade,g.beginPath(),g.moveTo(x,base-th),g.lineTo(x-th*.22,base),g.lineTo(x+th*.22,base),g.closePath(),g.fill(),g.fillStyle="rgba(255,255,255,.55)",g.beginPath(),g.moveTo(x,base-th),g.lineTo(x-th*.06,base-th*.7),g.lineTo(x+th*.06,base-th*.7),g.fill()}}g.fillStyle="#f4f7f9",g.fillRect(0,h*.9,w,h*.1)}else{let sky=g.createLinearGradient(0,0,0,h);sky.addColorStop(0,"#3a2a6b"),sky.addColorStop(.55,"#ff7a59"),sky.addColorStop(1,"#ffd6a0"),g.fillStyle=sky,g.fillRect(0,0,w,h),g.fillStyle="#fff1c9",g.beginPath(),g.arc(w*.62,h*.62,Math.min(w,h)*.12,0,Math.PI*2),g.fill(),g.fillStyle="#2a1838",g.beginPath(),g.moveTo(0,h);for(let x=0;x<=w;x+=20)g.lineTo(x,h*.72-Math.sin(x*.006)*h*.06-Math.sin(x*.017)*h*.03);g.lineTo(w,h),g.fill()}blurred=mk(view.width,view.height);let bg=blurred.getContext("2d");bg.filter=`blur(${18*sc}px) saturate(.8)`,bg.drawImage(view,0,0),bg.filter="none",bg.fillStyle=rgba(p.fog,.55),bg.fillRect(0,0,blurred.width,blurred.height);for(let i=0;i<blurred.width*blurred.height/260;i++){bg.fillStyle=`rgba(255,255,255,${rnd()*.18})`;let r=(.5+rnd()*1.6)*sc;bg.beginPath(),bg.arc(rnd()*blurred.width,rnd()*blurred.height,r,0,Math.PI*2),bg.fill()}mask=mk(view.width,view.height),mg=mask.getContext("2d"),fogLayer=mk(view.width,view.height),writing=mk(view.width,view.height);let wg=writing.getContext("2d");wg.scale(sc,sc);let code=ctx.copy.code||"404",size=Math.min(w*.24,h*.34);wg.font=`400 ${size}px "Marker Felt","Chalkboard SE","Segoe Print","Comic Sans MS",cursive`,wg.textAlign="center",wg.textBaseline="middle",wg.lineJoin="round",wg.lineCap="round",wg.strokeStyle="#000";for(let k=0;k<3;k++)wg.lineWidth=size*(.07+k*.01),wg.save(),wg.translate((rnd()-.5)*3,(rnd()-.5)*3),wg.strokeText(code,w/2,h*.37),wg.restore();drips=[];for(let i=0;i<14;i++)drips.push({x:w/2+(rnd()-.5)*size*code.length*.5,y:h*.37+size*.3,v:0,len:0})}drawView();let last=null,wipe=(x,y)=>{mg.save(),mg.scale(sc,sc),mg.globalCompositeOperation="source-over",mg.strokeStyle="#000",mg.fillStyle="#000",mg.lineCap="round",mg.lineWidth=Math.max(40,c.w*.05),mg.filter=`blur(${6*sc}px)`,mg.beginPath(),last?(mg.moveTo(last.x,last.y),mg.lineTo(x,y),mg.stroke()):(mg.arc(x,y,mg.lineWidth/2,0,Math.PI*2),mg.fill()),mg.filter="none",mg.restore(),last={x,y}};return ctx.on("pointermove",e=>{(e.pointerType==="mouse"||e.buttons)&&(wipe(ctx.pointer.x,ctx.pointer.y),Math.random()<.06&&drips.push({x:ctx.pointer.x,y:ctx.pointer.y+Math.max(20,c.w*.025),v:0,len:0}))}),ctx.on("pointerleave",()=>last=null),{resize(){c.reset(),drawView()},frame(t,dt){let g=c.g;c.reset(),dt>0&&(mg.globalCompositeOperation="destination-out",mg.fillStyle=`rgba(0,0,0,${Math.min(1,dt/p.regrow)*1.6})`,mg.fillRect(0,0,mask.width,mask.height),mg.globalCompositeOperation="source-over");let dg=writing.getContext("2d");for(let d of drips){if(d.len>c.h*.3||dt===0)continue;d.v=Math.min(60,d.v+(Math.random()<.02?40:2)*dt*10);let ny=d.y+d.v*dt;dg.save(),dg.scale(sc,sc),dg.strokeStyle="#000",dg.lineWidth=3,dg.lineCap="round",dg.beginPath(),dg.moveTo(d.x,d.y),d.x+=(Math.random()-.5)*.6,dg.lineTo(d.x,ny),dg.stroke(),dg.restore(),d.len+=ny-d.y,d.y=ny}g.drawImage(view,0,0,c.w,c.h);let fg=fogLayer.getContext("2d");fg.globalCompositeOperation="source-over",fg.clearRect(0,0,fogLayer.width,fogLayer.height),fg.drawImage(blurred,0,0),fg.globalCompositeOperation="destination-out",fg.drawImage(mask,0,0),fg.drawImage(writing,0,0),g.drawImage(fogLayer,0,0,c.w,c.h)}}}};export{foggy_glass_default as default};
@@ -0,0 +1,10 @@
1
+ interface Params {
2
+ metal: string;
3
+ metal2: string;
4
+ bg: string;
5
+ accent: string;
6
+ /** Seconds between jams. */
7
+ jam: number;
8
+ }
9
+ declare const _default: import("..").SceneDef<Params>;
10
+ export default _default;
@@ -0,0 +1,5 @@
1
+ import"../chunks/chunk-KIYSQVWX.js";import"../chunks/chunk-7XMDQMDO.js";function gearPath(n,r,depth,hole){let pts=[],step=Math.PI*2/n;for(let i=0;i<n;i++){let a=i*step,k=[[a-step*.3,r-depth],[a-step*.18,r],[a+step*.18,r],[a+step*.3,r-depth]];for(let[ang,rad]of k)pts.push(`${(Math.cos(ang)*rad).toFixed(2)},${(Math.sin(ang)*rad).toFixed(2)}`)}let holePath=`M${hole},0 A${hole},${hole} 0 1,0 ${-hole},0 A${hole},${hole} 0 1,0 ${hole},0Z`;return`M${pts.join("L")}Z ${holePath}`}var gears_default={id:"gears",name:"Broken Machine",description:"The machinery behind this page has jammed. The gears turn, grind, shudder and try again. The 0 is a gear too.",category:"Playful",kind:"2d",motion:"live",tags:["svg","gears","mechanical","industrial","maintenance","light"],layout:"bottom",codeInScene:!0,copy:{eyebrow:"Mechanical failure",title:"Something jammed in the works.",message:"Our engineers are oiling the gears. The page you asked for won't be produced today.",actions:[{label:"Back to working pages",href:"/",variant:"primary"}]},params:{metal:"#2b2f36",metal2:"#8b939e",bg:"#ecebe6",accent:"#ff5a1f",jam:6},theme:{bg:"#ecebe6",fg:"#1c1f24",accent:"#1c1f24","accent-fg":"#fff"},presetName:"Workshop",presets:{copper:{name:"Copper",params:{metal:"#7a3a1a",metal2:"#e8875a",bg:"#f6ece3",accent:"#1a6b5a"},theme:{bg:"#f6ece3",fg:"#2a1206",accent:"#2a1206","accent-fg":"#fff"}},neon:{name:"Neon Machine",params:{metal:"#3bd6ff",metal2:"#1a4a6b",bg:"#020a12",accent:"#ff3bd4"},theme:{bg:"#020a12",fg:"#e6f9ff",accent:"#3bd6ff","accent-fg":"#020a12"}},brass:{name:"Steampunk",params:{metal:"#8a5a22",metal2:"#d9a85b",bg:"#1c140c",accent:"#ffb347"},theme:{bg:"#1c140c",fg:"#f3e2c4",accent:"#d9a85b","accent-fg":"#1c140c"}},blueprint:{name:"Blueprint",params:{metal:"#e9f1ff",metal2:"#9cc0ff",bg:"#1b4f9c",accent:"#ffffff"},theme:{bg:"#1b4f9c",fg:"#ffffff",accent:"#ffffff","accent-fg":"#1b4f9c"}}},css:`
2
+ & .gr{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;padding-bottom:22cqh}
3
+ & .gr svg{width:min(980px,94cqw);height:auto;overflow:visible}
4
+ & .gr .grid{opacity:.07}
5
+ `,setup(ctx){let p=ctx.params,code=ctx.copy.code||"404",wrap=document.createElement("div");wrap.className="gr",wrap.setAttribute("aria-hidden","true");let chars=[...code],W=1e3,cw=W/chars.length,big=(cx,r,id)=>`<g transform="translate(${cx} 260)"><g data-gear="${id}"><path d="${gearPath(14,r,r*.16,r*.42)}" fill="${p.metal}" fill-rule="evenodd"/><circle r="${r*.62}" fill="none" stroke="${p.metal2}" stroke-width="6" opacity=".6"/>${Array.from({length:6},(_,i)=>`<rect x="${r*.44}" y="-6" width="${r*.16}" height="12" transform="rotate(${i*60})" fill="${p.metal2}" opacity=".7"/>`).join("")}</g><circle r="${r*.12}" fill="${p.accent}"/></g>`,small=(x,y,r,n,id,col)=>`<g transform="translate(${x} ${y})"><g data-gear="${id}" data-n="${n}"><path d="${gearPath(n,r,r*.22,r*.3)}" fill="${col}" fill-rule="evenodd"/></g></g>`,svg=`<svg viewBox="0 0 ${W} 520"><defs><pattern id="gp" width="40" height="40" patternUnits="userSpaceOnUse"><path d="M40 0H0V40" fill="none" stroke="${p.metal}" stroke-width="1"/></pattern></defs><rect class="grid" x="-200" y="-100" width="${W+400}" height="720" fill="url(#gp)"/>`;svg+=small(cw*.95,110,70,12,"s1",p.metal2),svg+=small(cw*2.05,420,60,10,"s2",p.metal2),svg+=small(cw*1.5,470,34,8,"s3",p.metal),chars.forEach((ch,i)=>{let cx=cw*(i+.5);/[0oO]/.test(ch)?svg+=big(cx,190,`b${i}`):svg+=`<text x="${cx}" y="400" text-anchor="middle" font-family="Inter,Arial Black,sans-serif" font-weight="900" font-size="380" fill="${p.metal}" letter-spacing="-10">${ch.replace(/[<&]/g,"")}</text>`}),svg+="<g data-spark></g></svg>",wrap.innerHTML=svg,ctx.stage.append(wrap);let gears=[...wrap.querySelectorAll("[data-gear]")],spark=wrap.querySelector("[data-spark]"),angle=0,jamUntil=-1,nextJam=p.jam;return{frame(t,dt){let jammed=t<jamUntil;!jammed&&t>nextJam&&!ctx.reducedMotion&&(jamUntil=t+1.4,nextJam=t+p.jam+Math.random()*3),angle+=(jammed?0:28)*dt;let shudder=jammed?Math.sin(t*70)*2.2:0;gears.forEach((g,i)=>{let dir=i%2?-1:1,n=Number(g.dataset.n??14);g.setAttribute("transform",`rotate(${angle*dir*14/n+shudder})`)}),spark.innerHTML=jammed?Array.from({length:7},()=>{let x=470+(Math.random()-.5)*120,y=190+(Math.random()-.5)*80;return`<line x1="${x}" y1="${y}" x2="${x+(Math.random()-.5)*40}" y2="${y-Math.random()*40}" stroke="${p.accent}" stroke-width="3" stroke-linecap="round"/>`}).join(""):""},destroy(){wrap.remove()}}}};export{gears_default as default};
@@ -0,0 +1,11 @@
1
+ interface Params {
2
+ c1: string;
3
+ c2: string;
4
+ c3: string;
5
+ bgTop: string;
6
+ bgBottom: string;
7
+ dispersion: number;
8
+ depth: number;
9
+ }
10
+ declare const _default: import("..").SceneDef<Params>;
11
+ export default _default;
@@ -0,0 +1 @@
1
+ import{text3dScene}from"../chunks/chunk-6HZC24J2.js";import"../chunks/chunk-SH72TE6I.js";import"../chunks/chunk-FVGCB66F.js";import"../chunks/chunk-3ISI6SOJ.js";import"../chunks/chunk-KIYSQVWX.js";import"../chunks/chunk-7XMDQMDO.js";var glass_404_default={id:"glass-404",name:"Prism Glass",description:"Thick refractive glass numerals with real dispersion, bending a field of slow colour behind them.",category:"Typography",kind:"3d",motion:"live",tags:["webgl","raymarching","glass","refraction","dispersion","gradient","light"],layout:"bottom",codeInScene:!0,copy:{eyebrow:"Error 404",title:"Crystal clear: it's not here.",message:"We looked straight through this page. There's nothing behind the glass.",actions:[{label:"Back to home",href:"/",variant:"primary"}]},params:{c1:"#7b5cff",c2:"#ff6ec7",c3:"#36d6ff",bgTop:"#f6f4ff",bgBottom:"#d9d4f5",dispersion:1.2,depth:.28},theme:{bg:"#ebe8fb",fg:"#14112a",accent:"#14112a","accent-fg":"#ffffff"},presetName:"Iris",presets:{forest:{name:"Forest Glass",params:{c1:"#1f9d55",c2:"#a3e635",c3:"#0ea5a3",bgTop:"#06140d",bgBottom:"#0b2a1a"},theme:{bg:"#07170f",fg:"#eafff2",accent:"#a3e635","accent-fg":"#07170f"}},ocean:{name:"Deep Ocean",params:{c1:"#2563eb",c2:"#06b6d4",c3:"#1e3a8a",bgTop:"#020617",bgBottom:"#0b1a3a"},theme:{bg:"#030b1f",fg:"#e6f4ff",accent:"#67e8f9","accent-fg":"#030b1f"}},lava:{name:"Molten",params:{c1:"#ff4d00",c2:"#ffb000",c3:"#ff1f5a",bgTop:"#0a0302",bgBottom:"#1f0703",dispersion:1.6},theme:{bg:"#120402",fg:"#fff0e6",accent:"#ffb000","accent-fg":"#120402"}},lavender:{name:"Lavender",params:{c1:"#a78bfa",c2:"#f0abfc",c3:"#93c5fd",bgTop:"#faf5ff",bgBottom:"#e9defa"},theme:{bg:"#f1eafc",fg:"#2a1a47",accent:"#2a1a47","accent-fg":"#fff"}},neon:{name:"Neon Night",params:{c1:"#ff00e6",c2:"#00f0ff",c3:"#7a00ff",bgTop:"#05000a",bgBottom:"#12001f",dispersion:1.8},theme:{bg:"#08000f",fg:"#fbe6ff",accent:"#00f0ff","accent-fg":"#08000f"}},aurora:{name:"Aurora",params:{c1:"#22e3a1",c2:"#3a7bff",c3:"#b25cff",bgTop:"#050a18",bgBottom:"#0b1030"},theme:{bg:"#070c1f",fg:"#eef2ff",accent:"#e9fff6","accent-fg":"#04140e"}},sunset:{name:"Sunset",params:{c1:"#ff7a3d",c2:"#ff3d77",c3:"#ffd23d",bgTop:"#fff4ea",bgBottom:"#ffd9c4"},theme:{bg:"#ffe8da",fg:"#2a1208",accent:"#2a1208","accent-fg":"#fff"}},ice:{name:"Ice",title:"Frozen solid. Page not found.",params:{c1:"#9ad8ff",c2:"#d7f1ff",c3:"#5aa9ff",bgTop:"#f4fbff",bgBottom:"#cfe6f7",dispersion:.6,depth:.34},theme:{bg:"#e3f2fc",fg:"#0b2233",accent:"#0b2233","accent-fg":"#fff"}},mono:{name:"Monochrome",params:{c1:"#111111",c2:"#555555",c3:"#999999",bgTop:"#fafafa",bgBottom:"#dcdcdc",dispersion:1.6},theme:{bg:"#ededed",fg:"#0a0a0a",accent:"#0a0a0a","accent-fg":"#fff"}},candy:{name:"Candy",params:{c1:"#ff4fa3",c2:"#ffb13b",c3:"#4fd1ff",bgTop:"#fff0f7",bgBottom:"#ffd6ea"},theme:{bg:"#ffe5f1",fg:"#2b0a1b",accent:"#ff3d95","accent-fg":"#fff"}}},setup(ctx){let p=ctx.params;return text3dScene(ctx,{material:"glass",colors:{a:p.c1,b:p.c2,c:p.c3,bg0:p.bgTop,bg1:p.bgBottom,light:"#ffffff"},depth:p.depth,round:.07,spin:.3,dispersion:p.dispersion,envSpeed:.05,y:.1})}};export{glass_404_default as default};
@@ -0,0 +1,15 @@
1
+ interface Params {
2
+ bg: string;
3
+ ink: string;
4
+ a: string;
5
+ b: string;
6
+ /** Glitch intensity 0..2 */
7
+ intensity: number;
8
+ /** Pointer proximity amplifies the glitch. */
9
+ reactive: boolean;
10
+ scanlines: number;
11
+ grid: boolean;
12
+ weight: number;
13
+ }
14
+ declare const _default: import("..").SceneDef<Params>;
15
+ export default _default;
@@ -0,0 +1,60 @@
1
+ import{shaderScene}from"../chunks/chunk-B4TY5M55.js";import{HASH,NOISE,POST,texture}from"../chunks/chunk-SH72TE6I.js";import{linear}from"../chunks/chunk-FVGCB66F.js";import{SANS,drawFittedText}from"../chunks/chunk-3ISI6SOJ.js";import"../chunks/chunk-KIYSQVWX.js";import"../chunks/chunk-7XMDQMDO.js";var FRAG=`
2
+ uniform sampler2D uText;
3
+ uniform vec3 uBg, uInk, uA, uB;
4
+ uniform float uAmt, uScan, uGrid, uBurst, uLight;
5
+ ${HASH}
6
+ ${NOISE}
7
+ ${POST}
8
+
9
+ float textAt(vec2 uv) { return texture(uText, uv).a; }
10
+
11
+ void main() {
12
+ vec2 fc = gl_FragCoord.xy;
13
+ vec2 uv = fc / uRes;
14
+ float t = uTime;
15
+ // bursts: mostly calm, then violent for a few frames
16
+ float slot = floor(t * 7.0);
17
+ float burst = step(0.82, hash11(slot)) + uBurst;
18
+ float amt = uAmt * (0.25 + burst * 1.4);
19
+
20
+ // horizontal slice displacement
21
+ float rows = 18.0 + 40.0 * hash11(slot + 3.0);
22
+ float row = floor(uv.y * rows);
23
+ float shift = (hash12(vec2(row, slot)) - 0.5) * 0.08 * amt * step(0.55, hash12(vec2(row * 1.3, slot + 1.0)));
24
+ // block displacement
25
+ vec2 bid = floor(uv * vec2(12.0, 24.0));
26
+ float bh = hash12(bid + slot * 7.1);
27
+ vec2 boff = (bh > 0.93 ? (hash22(bid + slot) - 0.5) * vec2(0.12, 0.02) : vec2(0.0)) * amt;
28
+ vec2 q = uv + vec2(shift, 0.0) + boff;
29
+
30
+ float split = 0.004 + 0.012 * amt;
31
+ float r = textAt(q + vec2(split, 0.0));
32
+ float g = textAt(q);
33
+ float b = textAt(q - vec2(split, 0.0));
34
+
35
+ vec3 col = uBg;
36
+ // background grid
37
+ if (uGrid > 0.5) {
38
+ vec2 gp = fc / 32.0;
39
+ float gl = smoothstep(0.47, 0.5, max(abs(fract(gp.x) - 0.5), abs(fract(gp.y) - 0.5)));
40
+ col = mix(col, uInk, gl * 0.06);
41
+ }
42
+ // channel-separated text: a and b fringes, ink core
43
+ if (uLight > 0.5) {
44
+ col = mix(col, uA, max(r - g, 0.0));
45
+ col = mix(col, uB, max(b - g, 0.0));
46
+ col = mix(col, uInk, g);
47
+ } else {
48
+ col += uA * max(r - g * 0.6, 0.0) + uB * max(b - g * 0.6, 0.0);
49
+ col = mix(col, uInk, g * 0.92);
50
+ }
51
+ // corrupted line artefacts
52
+ float lineN = hash12(vec2(floor(fc.y / 2.0), slot));
53
+ col = mix(col, uA, step(0.996 - 0.01 * amt, lineN) * 0.6);
54
+ // scanlines and noise
55
+ col *= 1.0 - uScan * 0.18 * step(0.5, fract(fc.y / 3.0));
56
+ col = toSRGB(clamp(col, 0.0, 1.0));
57
+ col += (hash12(fc + fract(t) * 100.0) - 0.5) * 0.05 * (0.5 + amt);
58
+ fragColor = vec4(col, 1.0);
59
+ }
60
+ `,glitch_default={id:"glitch",name:"Signal Corruption",description:"The numerals tear, shift and split into colour channels in short violent bursts. Hover close and it gets worse.",category:"Typography",kind:"2d",motion:"live",tags:["webgl","glitch","rgb-split","cyberpunk","typography","interactive"],layout:"bottom",codeInScene:!0,copy:{eyebrow:"ERR_PAGE_CORRUPTED",title:"Something broke in transmission.",message:"The page you requested got scrambled on the way here. A fresh copy lives on the homepage.",actions:[{label:"Reload home",href:"/",variant:"primary"},{label:"Report the glitch",href:"/contact",variant:"secondary"}]},params:{bg:"#06060a",ink:"#f4f4f6",a:"#ff1f6d",b:"#1ff4ff",intensity:1,reactive:!0,scanlines:1,grid:!0,weight:900},theme:{bg:"#06060a",accent:"#f4f4f6","accent-fg":"#06060a","font-display":"var(--lp-font-mono)","title-weight":"600"},presetName:"Cyber",presets:{sunset:{name:"Sunset",params:{bg:"#1a0b1f",ink:"#ffe6cc",a:"#ff5a36",b:"#b026ff"},theme:{bg:"#1a0b1f",fg:"#ffe6cc",accent:"#ffe6cc","accent-fg":"#1a0b1f"}},ice:{name:"Ice",params:{bg:"#eaf6ff",ink:"#0b2a40",a:"#00b3ff",b:"#7a5cff",scanlines:.4},theme:{bg:"#eaf6ff",fg:"#0b2a40",accent:"#0b2a40","accent-fg":"#eaf6ff"}},blood:{name:"Corrupted",eyebrow:"FATAL_CORRUPTION",params:{bg:"#0a0000",ink:"#ff2a2a",a:"#ffffff",b:"#5a0000",intensity:1.6},theme:{bg:"#0a0000",fg:"#ffd6d6",accent:"#ff2a2a","accent-fg":"#0a0000"}},blueprint:{name:"Blueprint",params:{bg:"#123e7a",ink:"#ffffff",a:"#7fd3ff",b:"#ffe14d",grid:!0},theme:{bg:"#123e7a",fg:"#ffffff",accent:"#ffffff","accent-fg":"#123e7a"}},vapor:{name:"Vaporwave",params:{bg:"#ffd6f0",ink:"#2a1b5c",a:"#ff4fd8",b:"#3bd0ff",grid:!0},theme:{bg:"#ffd6f0",fg:"#2a1b5c",accent:"#2a1b5c","accent-fg":"#ffd6f0"}},print:{name:"Misprint",eyebrow:"Misregistration",title:"Printed off the edge of the page.",params:{bg:"#f5f2ea",ink:"#141414",a:"#ff3b30",b:"#0a84ff",scanlines:0,grid:!1},theme:{bg:"#f5f2ea",fg:"#141414",accent:"#141414","accent-fg":"#f5f2ea","font-display":"var(--lp-font)"}},toxic:{name:"Toxic",params:{bg:"#050a02",ink:"#d7ff3b",a:"#3bff7a",b:"#ff3bd7",intensity:1.4},theme:{bg:"#050a02",fg:"#efffc2",accent:"#d7ff3b","accent-fg":"#050a02"}},mono:{name:"Monochrome",params:{bg:"#000000",ink:"#ffffff",a:"#8a8a8a",b:"#4a4a4a",grid:!1},theme:{bg:"#000",accent:"#fff","accent-fg":"#000"}},calm:{name:"Subtle",params:{intensity:.35,reactive:!0,scanlines:.4,bg:"#0b0d12",a:"#7c5cff",b:"#2bd4ff"}}},setup(ctx){let p=ctx.params,cv=document.createElement("canvas"),tex=null,glRef,light=parseInt(p.bg.replace("#","").slice(0,2),16)>140,draw=()=>{let w=Math.max(2,Math.round(ctx.width*Math.min(ctx.dpr,2))),h=Math.max(2,Math.round(ctx.height*Math.min(ctx.dpr,2)));cv.width=w,cv.height=h;let g=cv.getContext("2d");g.clearRect(0,0,w,h),g.save(),g.translate(0,h*.36-h*.25),drawFittedText(g,ctx.copy.code||"404",{width:w,height:h*.5,font:SANS,weight:p.weight,fit:.84,tracking:-.03}),g.restore(),tex&&(glRef.bindTexture(glRef.TEXTURE_2D,tex),glRef.pixelStorei(glRef.UNPACK_FLIP_Y_WEBGL,!0),glRef.texImage2D(glRef.TEXTURE_2D,0,glRef.RGBA,glRef.RGBA,glRef.UNSIGNED_BYTE,cv),glRef.pixelStorei(glRef.UNPACK_FLIP_Y_WEBGL,!1))},near=0;return{...shaderScene(ctx,{frag:FRAG,adaptive:!1,init(gl){glRef=gl,draw(),tex=texture(gl,cv,{filter:"linear"})},uniforms:(_t,dt)=>{let target=p.reactive&&ctx.pointer.inside?Math.max(0,1-Math.hypot(ctx.pointer.nx,(ctx.pointer.ny-.28)*1.6)):0;return near+=(target-near)*Math.min(1,dt*6),{uText:tex,uBg:linear(p.bg),uInk:linear(p.ink),uA:linear(p.a),uB:linear(p.b),uAmt:p.intensity,uScan:p.scanlines,uGrid:p.grid?1:0,uBurst:near*.9,uLight:light?1:0}}}),resize(){draw()}}}};export{glitch_default as default};
@@ -0,0 +1,9 @@
1
+ interface Params {
2
+ from: string;
3
+ via: string;
4
+ to: string;
5
+ /** Soft colour glow behind the number. */
6
+ glow: boolean;
7
+ }
8
+ declare const _default: import("..").SceneDef<Params>;
9
+ export default _default;
@@ -0,0 +1,6 @@
1
+ import"../chunks/chunk-KIYSQVWX.js";import"../chunks/chunk-7XMDQMDO.js";var gradient_404_default={id:"gradient-404",name:"Gradient",description:"The modern SaaS 404: a heavy gradient-filled number with a soft glow, a short headline and a pill button.",category:"Simple",kind:"2d",motion:"static",tags:["simple","gradient","saas","startup","static","fast","modern"],layout:"center",copy:{eyebrow:"",title:"Page not found",message:"The link may be broken, or the page may have been removed.",actions:[{label:"Take me home",href:"/"},{label:"Help center",href:"/help",variant:"secondary"}]},params:{from:"#6366f1",via:"#a855f7",to:"#ec4899",glow:!0},theme:{bg:"#ffffff",fg:"#0f172a",accent:"#0f172a","accent-fg":"#ffffff","code-size":"clamp(110px,24cqw,260px)","code-weight":"800"},presetName:"Violet",presets:{night:{name:"Night",params:{from:"#22d3ee",via:"#6366f1",to:"#d946ef"},theme:{bg:"#070a13",fg:"#e2e8f0",accent:"#e2e8f0","accent-fg":"#070a13"}},sunset:{name:"Sunset",params:{from:"#f59e0b",via:"#ef4444",to:"#db2777"},theme:{bg:"#fffaf5",fg:"#2a1406",accent:"#2a1406","accent-fg":"#fffaf5"}},mint:{name:"Mint",params:{from:"#10b981",via:"#06b6d4",to:"#3b82f6",glow:!1},theme:{bg:"#f8fafc",fg:"#0f172a",accent:"#0f172a","accent-fg":"#fff"}}},css:`
2
+ & .lp-code{background:linear-gradient(120deg,var(--g1),var(--g2),var(--g3));-webkit-background-clip:text;background-clip:text;color:transparent;letter-spacing:-.06em;line-height:.95;padding:0 .04em}
3
+ & .gr-glow{position:absolute;left:50%;top:38%;width:min(70cqw,760px);aspect-ratio:2/1;translate:-50% -50%;filter:blur(70px);opacity:.28;
4
+ background:radial-gradient(closest-side,var(--g1),transparent),radial-gradient(closest-side at 70% 50%,var(--g3),transparent)}
5
+ & .lp-title{font-weight:700;font-size:clamp(24px,3.6cqw,44px)}
6
+ `,setup(ctx){let p=ctx.params;if(ctx.root.style.setProperty("--g1",p.from),ctx.root.style.setProperty("--g2",p.via),ctx.root.style.setProperty("--g3",p.to),!p.glow)return;let glow=document.createElement("div");return glow.className="gr-glow",ctx.stage.append(glow),{destroy:()=>glow.remove()}}};export{gradient_404_default as default};
@@ -0,0 +1,11 @@
1
+ interface Params {
2
+ paper: string;
3
+ ink1: string;
4
+ ink2: string;
5
+ /** Dot cell size in px. */
6
+ cell: number;
7
+ /** Misregistration between the two inks. */
8
+ offset: number;
9
+ }
10
+ declare const _default: import("..").SceneDef<Params>;
11
+ export default _default;
@@ -0,0 +1,43 @@
1
+ import{shaderScene}from"../chunks/chunk-B4TY5M55.js";import{HASH,NOISE,POST,texture}from"../chunks/chunk-SH72TE6I.js";import{linear}from"../chunks/chunk-FVGCB66F.js";import{SANS,drawFittedText}from"../chunks/chunk-3ISI6SOJ.js";import"../chunks/chunk-KIYSQVWX.js";import"../chunks/chunk-7XMDQMDO.js";var FRAG=`
2
+ uniform sampler2D uText;
3
+ uniform vec3 uPaper, uInk1, uInk2;
4
+ uniform float uCell, uOffset;
5
+ ${HASH}
6
+ ${NOISE}
7
+ ${POST}
8
+ float tone(vec2 uv, vec2 p, float t) {
9
+ // soft blobs plus the code
10
+ float a = textureLod(uText, uv, 1.5).a;
11
+ float b = 0.5 + 0.5 * sin(p.x * 3.0 + t * 0.4) * cos(p.y * 2.5 - t * 0.3);
12
+ return clamp(a * 0.9 + b * 0.25 + fbm(p * 2.0 + t * 0.05) * 0.2, 0.0, 1.0);
13
+ }
14
+ float dots(vec2 fc, float angle, float tv, float cell) {
15
+ float c = cos(angle), s = sin(angle);
16
+ vec2 q = mat2(c, -s, s, c) * fc / cell;
17
+ vec2 f = fract(q) - 0.5;
18
+ float r = sqrt(tv) * 0.62;
19
+ float d = length(f);
20
+ float w = fwidth(d);
21
+ return 1.0 - smoothstep(r - w, r + w, d);
22
+ }
23
+ void main() {
24
+ vec2 fc = gl_FragCoord.xy;
25
+ vec2 uv = fc / uRes;
26
+ vec2 p = (fc - 0.5 * uRes) / uRes.y;
27
+ float t = uTime;
28
+ // the pointer works like a loupe: bigger dots under it
29
+ vec2 m = (uMouse * 0.5 + 0.5) * uRes;
30
+ float loupe = smoothstep(220.0, 0.0, length(fc - m)) * step(0.001, length(uMouse));
31
+ float cell = uCell * (1.0 + loupe * 1.6);
32
+ float t1 = tone(uv, p, t);
33
+ float t2 = tone(uv + vec2(0.02, -0.01), p + 0.3, t * 0.8) * 0.85;
34
+ vec3 col = uPaper;
35
+ float d2 = dots(fc + vec2(uOffset, -uOffset), 0.26, t2 * 0.8, cell);
36
+ float d1 = dots(fc, 0.785, t1, cell);
37
+ // multiply the inks like a riso print
38
+ col *= mix(vec3(1.0), uInk2, d2);
39
+ col *= mix(vec3(1.0), uInk1, d1);
40
+ col *= 0.97 + 0.03 * hash12(floor(fc * 0.5));
41
+ fragColor = vec4(toSRGB(col), 1.0);
42
+ }
43
+ `,halftone_default={id:"halftone",name:"Risograph",description:"Two-colour halftone print, slightly misregistered like a risograph. The dots swell and shrink, and a loupe follows your cursor.",category:"Paper & Print",kind:"2d",motion:"live",tags:["webgl","halftone","riso","print","editorial","light","graphic"],layout:"bottom",codeInScene:!0,copy:{eyebrow:"Misprint",title:"This page didn't make it to press.",message:"The plates were inked, the paper loaded, and then nothing came out. The homepage is in stock.",actions:[{label:"Back to the shop",href:"/",variant:"primary"}]},params:{paper:"#f6f1e7",ink1:"#ff4f8b",ink2:"#2a6bff",cell:9,offset:3},theme:{bg:"#f6f1e7",fg:"#1a1a2e",accent:"#1a1a2e","accent-fg":"#fff"},presetName:"Pink & Blue",presets:{citrus:{name:"Yellow & Green",params:{ink1:"#00a95c",ink2:"#ffe800"},theme:{fg:"#0a2a1a",accent:"#0a2a1a"}},sunset:{name:"Orange & Purple",params:{ink1:"#7a3dff",ink2:"#ff6c2f"},theme:{fg:"#24103f",accent:"#24103f"}},mono:{name:"Black Only",params:{ink1:"#1a1a1a",ink2:"#ffffff",cell:7},theme:{fg:"#111",accent:"#111"}},news:{name:"Newsprint",params:{paper:"#e8e2d4",ink1:"#2a2a2a",ink2:"#c1121f",cell:6,offset:2},theme:{bg:"#e8e2d4",fg:"#1a1a1a",accent:"#c1121f"}}},setup(ctx){let p=ctx.params,cv=document.createElement("canvas"),tex=null,gl,draw=()=>{cv.width=512,cv.height=Math.max(64,Math.round(512*ctx.height/Math.max(1,ctx.width)));let g=cv.getContext("2d");g.clearRect(0,0,cv.width,cv.height),g.save(),g.translate(0,cv.height*.38-cv.height*.24),drawFittedText(g,ctx.copy.code||"404",{width:cv.width,height:cv.height*.48,font:SANS,weight:900,fit:.86}),g.restore(),tex&&(gl.bindTexture(gl.TEXTURE_2D,tex),gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL,!0),gl.texImage2D(gl.TEXTURE_2D,0,gl.RGBA,gl.RGBA,gl.UNSIGNED_BYTE,cv),gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL,!1),gl.generateMipmap(gl.TEXTURE_2D))};return{...shaderScene(ctx,{frag:FRAG,adaptive:!1,init(g){gl=g,draw(),tex=texture(gl,cv,{filter:"mipmap"})},uniforms:()=>({uText:tex,uPaper:linear(p.paper),uInk1:linear(p.ink1),uInk2:linear(p.ink2),uCell:p.cell*Math.min(2,ctx.dpr),uOffset:p.offset*Math.min(2,ctx.dpr)})}),resize:draw}}};export{halftone_default as default};
@@ -0,0 +1,10 @@
1
+ interface Params {
2
+ bg: string;
3
+ letters: string[];
4
+ string: string;
5
+ /** "solid" painted wood, "neon" outline, "paper" cut-outs */
6
+ look: "solid" | "outline" | "paper";
7
+ wind: number;
8
+ }
9
+ declare const _default: import("..").SceneDef<Params>;
10
+ export default _default;
@@ -0,0 +1 @@
1
+ import{canvas2d}from"../chunks/chunk-DAZOIOF7.js";import{rgba}from"../chunks/chunk-FVGCB66F.js";import{SANS}from"../chunks/chunk-3ISI6SOJ.js";import"../chunks/chunk-KIYSQVWX.js";import"../chunks/chunk-7XMDQMDO.js";var hanging_letters_default={id:"hanging-letters",name:"Hanging Letters",description:"Each numeral dangles on its own string like a mobile. Brush past them with the cursor and they swing and twist.",category:"Physics",kind:"2d",motion:"live",tags:["canvas","physics","pendulum","mobile","interactive","light","playful"],layout:"bottom",codeInScene:!0,copy:{eyebrow:"Hanging by a thread",title:"This page came undone.",message:"All that's left are the numbers, swinging in the breeze. Give them a nudge.",actions:[{label:"Back to the homepage",href:"/",variant:"primary"}]},params:{bg:"#f4efe6",letters:["#ff5a3c","#2b59ff","#ffb800","#16a34a","#9b5cff"],string:"#2b2620",look:"solid",wind:1},theme:{bg:"#f4efe6",fg:"#2b2620",accent:"#2b2620","accent-fg":"#fff"},presetName:"Primary",presets:{autumn:{name:"Autumn",params:{bg:"#f6e7cf",letters:["#d9541e","#a8461a","#e8a83b"],string:"#5a3a1a"},theme:{bg:"#f6e7cf",fg:"#3a1d0a",accent:"#3a1d0a"}},neon:{name:"Neon",params:{bg:"#08000f",letters:["#ff3bd4","#3bd6ff","#ffe14d"],string:"#3a2a4a",look:"outline"},theme:{bg:"#08000f",fg:"#ffe6fb",accent:"#ff3bd4","accent-fg":"#fff"}},paper:{name:"Paper Cut",params:{bg:"#eaf2f8",letters:["#ffffff"],string:"#7a8a99",look:"paper"},theme:{bg:"#eaf2f8",fg:"#1c2b38",accent:"#1c2b38"}},noir:{name:"Noir",params:{bg:"#111114",letters:["#f2f2f2"],string:"#555",look:"outline"},theme:{bg:"#111114",fg:"#f2f2f2",accent:"#f2f2f2","accent-fg":"#111"}},pastel:{name:"Nursery",params:{bg:"#fff6f0",letters:["#ffb3c7","#a8d8ff","#ffe08a","#b8f0c8"],string:"#c9a98a"},theme:{bg:"#fff6f0",fg:"#4a2a3a",accent:"#4a2a3a"}}},setup(ctx){let p=ctx.params,c=canvas2d(ctx),chars=[...ctx.copy.code||"404"],items=[],build=()=>{let n=chars.length,size=Math.min(c.w*.7/n,c.h*.32);items=chars.map((ch,i)=>({ch,ax:c.w/2+(i-(n-1)/2)*size*.95,L:c.h*.12+i*37%3*c.h*.04,a:ctx.reducedMotion?0:(Math.random()-.5)*.4,va:0,tw:0,vtw:0,size,col:p.letters[i%p.letters.length]}))};build();let lpx=0,lpy=0;return{resize(){c.reset(),build()},frame(t,dt){let g=c.g;c.reset();let px=ctx.pointer.x,py=ctx.pointer.y,vx=dt>0?(px-lpx)/dt:0;lpx=px,lpy=py;for(let it of items){if(dt<=0)break;let grav=9;it.va+=(-grav/Math.max(1,it.L/100)*Math.sin(it.a)+Math.sin(t*.7+it.ax)*.25*p.wind)*dt,it.va*=Math.exp(-.6*dt),it.vtw+=(-it.tw*6+Math.sin(t*.5+it.ax*.01)*.3*p.wind)*dt,it.vtw*=Math.exp(-.8*dt);let cx=it.ax+Math.sin(it.a)*(it.L+it.size*.5),cy=Math.cos(it.a)*(it.L+it.size*.5);ctx.pointer.inside&&Math.abs(px-cx)<it.size*.45&&Math.abs(py-cy)<it.size*.55&&(it.va+=vx*12e-5,it.vtw+=vx*6e-4),it.a+=it.va*dt,it.tw+=it.vtw*dt}g.fillStyle=p.bg,g.fillRect(0,0,c.w,c.h),g.fillStyle=rgba(p.string,.85),g.fillRect(c.w*.1,0,c.w*.8,6);for(let it of items){let ex=it.ax+Math.sin(it.a)*it.L,ey=Math.cos(it.a)*it.L;g.strokeStyle=p.string,g.lineWidth=1.5,g.beginPath(),g.moveTo(it.ax,3),g.lineTo(ex,ey),g.stroke(),g.save(),g.translate(ex,ey),g.rotate(-it.a);let sq=Math.cos(it.tw);if(g.scale(Math.max(.08,Math.abs(sq)),1),g.font=`900 ${it.size}px ${SANS}`,g.textAlign="center",g.textBaseline="top",g.fillStyle="rgba(0,0,0,.12)",g.fillText(it.ch,it.size*.08,it.size*.1),p.look==="outline")g.strokeStyle=it.col,g.lineWidth=it.size*.03,g.strokeText(it.ch,0,0);else{let shade=sq<0?.75:1;g.fillStyle=it.col,g.globalAlpha=shade,g.fillText(it.ch,0,0),g.globalAlpha=1,p.look==="paper"?(g.strokeStyle="rgba(0,0,0,.08)",g.lineWidth=2,g.strokeText(it.ch,0,0)):(g.fillStyle="rgba(255,255,255,.18)",g.fillText(it.ch,-it.size*.012,-it.size*.012),g.fillStyle=it.col,g.globalAlpha=shade,g.fillText(it.ch,0,it.size*.006),g.globalAlpha=1)}g.restore(),g.fillStyle=p.string,g.beginPath(),g.arc(ex,ey,2.5,0,Math.PI*2),g.fill()}}}}};export{hanging_letters_default as default};
@@ -0,0 +1,9 @@
1
+ interface Params {
2
+ board: "wood" | "closed" | "metal";
3
+ wall: string;
4
+ line1: string;
5
+ line2: string;
6
+ chain: string;
7
+ }
8
+ declare const _default: import("..").SceneDef<Params>;
9
+ export default _default;
@@ -0,0 +1 @@
1
+ import{canvas2d}from"../chunks/chunk-DAZOIOF7.js";import{rgba}from"../chunks/chunk-FVGCB66F.js";import"../chunks/chunk-KIYSQVWX.js";import"../chunks/chunk-7XMDQMDO.js";var hanging_sign_default={id:"hanging-sign",name:"Hanging Sign",description:"A sign hangs on two chains and swings with real physics. Grab it, throw it and watch it settle.",category:"Physics",kind:"2d",motion:"live",tags:["canvas","physics","verlet","drag","interactive","shop","tactile"],layout:"bottom",codeInScene:!0,copy:{eyebrow:"Sorry",title:"We couldn't find that page.",message:"Give the sign a swing if you like. The way back is below.",actions:[{label:"Back to the shop front",href:"/",variant:"primary"}]},params:{board:"wood",wall:"#e9e3d7",line1:"",line2:"PAGE NOT FOUND",chain:"#6b6b6b"},theme:{bg:"#e9e3d7",fg:"#2b2118",accent:"#2b2118","accent-fg":"#f4efe5"},presetName:"Tavern",presets:{mint:{name:"Mint Caf\xE9",params:{board:"closed",wall:"#d9f2e6",line1:"Sorry",line2:"WE'RE CLOSED",chain:"#9ab8aa"},theme:{bg:"#d9f2e6",fg:"#0f3326",accent:"#0f3326","accent-fg":"#fff"}},brick:{name:"Brick Pub",params:{board:"wood",wall:"#7a3a2a",chain:"#2a2a2a",line2:"NO PAGE ON TAP"},theme:{bg:"#7a3a2a",fg:"#fff0e0",accent:"#ffd27a","accent-fg":"#2a1206"}},closed:{name:"Sorry, We're Closed",eyebrow:"Back soon",title:"This page has closed for good.",params:{board:"closed",wall:"#cfe3e8",line1:"SORRY",line2:"WE'RE CLOSED",chain:"#c9c9c9"},theme:{bg:"#cfe3e8",fg:"#0f2a33",accent:"#d7263d","accent-fg":"#fff"}},metal:{name:"Industrial",eyebrow:"Access denied",title:"Nothing beyond this point.",params:{board:"metal",wall:"#2a2d31",line2:"NO ENTRY",chain:"#9a9a9a"},theme:{bg:"#2a2d31",fg:"#eceff2",accent:"#ffcc00","accent-fg":"#1a1a1a"}},night:{name:"Night Tavern",params:{board:"wood",wall:"#1b1f2a",chain:"#8a8f99"},theme:{bg:"#1b1f2a",fg:"#f2ebdc",accent:"#f2c46b","accent-fg":"#1b1f2a"}}},setup(ctx){let p=ctx.params,c=canvas2d(ctx),rnd=ctx.random,code=ctx.copy.code||"404",pts=[],cons=[],sign=[0,0,0,0],sw=0,sh=0,grab=-1,grabOff={x:0,y:0},wood,N=9,pt=(x,y,pinned=!1)=>(pts.push({x,y,px:x,py:y,pinned}),pts.length-1),link=(a,b)=>cons.push([a,b,Math.hypot(pts[a].x-pts[b].x,pts[a].y-pts[b].y)]);function build(){pts=[],cons=[],sw=Math.min(c.w*.62,640),sh=sw*.42;let cx=c.w/2,top=0,hang=Math.max(60,c.h*.36-sh/2),ax=sw*.36,sx=cx-sw/2,sy=top+hang;sign=[pt(sx,sy),pt(sx+sw,sy),pt(sx+sw,sy+sh),pt(sx,sy+sh)],link(sign[0],sign[1]),link(sign[1],sign[2]),link(sign[2],sign[3]),link(sign[3],sign[0]),link(sign[0],sign[2]),link(sign[1],sign[3]);for(let[side,corner]of[[-1,sign[0]],[1,sign[1]]]){let prev=pt(cx+side*ax,top,!0);for(let i=1;i<N;i++){let t=i/N,id=pt(cx+side*ax+(pts[corner].x+side*0-(cx+side*ax))*t,top+hang*t);link(prev,id),prev=id}link(prev,corner)}if(!ctx.reducedMotion)for(let s of sign)pts[s].px-=sw*.06;buildBoard()}function buildBoard(){let sc=Math.min(2,ctx.dpr);wood=document.createElement("canvas"),wood.width=Math.ceil(sw*sc),wood.height=Math.ceil(sh*sc);let g=wood.getContext("2d");g.scale(sc,sc);let r=sh*.08,rr=(x,y,w,h,rad)=>{g.beginPath(),g.roundRect(x,y,w,h,rad)};if(p.board==="wood"){let grd=g.createLinearGradient(0,0,0,sh);grd.addColorStop(0,"#9a6a3c"),grd.addColorStop(1,"#6e4522"),rr(0,0,sw,sh,r),g.fillStyle=grd,g.fill(),g.save(),g.clip();for(let i=0;i<70;i++){g.strokeStyle=`rgba(50,25,8,${.08+rnd()*.15})`,g.lineWidth=1+rnd()*2;let y=rnd()*sh;g.beginPath(),g.moveTo(0,y);for(let x=0;x<=sw;x+=20)g.lineTo(x,y+Math.sin(x*.02+i)*3+(rnd()-.5)*2);g.stroke()}for(let i=0;i<3;i++){let kx=rnd()*sw,ky=rnd()*sh;g.strokeStyle="rgba(50,25,8,.35)";for(let k=1;k<5;k++)g.beginPath(),g.ellipse(kx,ky,k*5,k*2.4,0,0,Math.PI*2),g.stroke()}g.restore(),g.strokeStyle="#4a2c12",g.lineWidth=6,rr(3,3,sw-6,sh-6,r),g.stroke(),g.fillStyle="#2a1606",g.textAlign="center",g.textBaseline="middle",g.font=`900 ${sh*.48}px "Rockwell","Georgia",serif`,g.shadowColor="rgba(255,220,170,.35)",g.shadowOffsetY=2,g.fillText(p.line1||code,sw/2,sh*.42),g.font=`700 ${sh*.14}px "Rockwell","Georgia",serif`,g.fillText(p.line2,sw/2,sh*.8),g.shadowColor="transparent"}else if(p.board==="closed")rr(0,0,sw,sh,r*1.4),g.fillStyle="#ffffff",g.fill(),g.lineWidth=sh*.05,g.strokeStyle="#d7263d",rr(sh*.06,sh*.06,sw-sh*.12,sh-sh*.12,r),g.stroke(),g.fillStyle="#d7263d",g.textAlign="center",g.textBaseline="middle",g.font=`italic 800 ${sh*.32}px "Brush Script MT","Snell Roundhand",cursive,serif`,g.fillText(p.line1||"Sorry",sw/2,sh*.36),g.font=`900 ${sh*.2}px Inter,Arial,sans-serif`,g.fillText(p.line2,sw/2,sh*.7),g.fillStyle="#0f2a33",g.font=`600 ${sh*.07}px Inter,Arial,sans-serif`,g.fillText(`ERROR ${code}`,sw/2,sh*.88);else{let grd=g.createLinearGradient(0,0,sw,sh);grd.addColorStop(0,"#c7ccd2"),grd.addColorStop(.5,"#8b9199"),grd.addColorStop(1,"#b9bec5"),rr(0,0,sw,sh,r*.6),g.fillStyle=grd,g.fill(),g.save(),g.clip();for(let y=0;y<sh;y+=2)g.fillStyle=`rgba(255,255,255,${rnd()*.06})`,g.fillRect(0,y,sw,1);g.fillStyle="#ffcc00",g.fillRect(0,0,sw,sh*.16),g.fillRect(0,sh*.84,sw,sh*.16),g.fillStyle="#1a1a1a";for(let x=-sh;x<sw+sh;x+=sh*.22)for(let y0 of[0,sh*.84])g.beginPath(),g.moveTo(x,y0+sh*.16),g.lineTo(x+sh*.11,y0+sh*.16),g.lineTo(x+sh*.27,y0),g.lineTo(x+sh*.16,y0),g.closePath(),g.fill();g.restore(),g.fillStyle="#1a1a1a",g.textAlign="center",g.textBaseline="middle",g.font=`900 ${sh*.38}px "Stencil","Impact","Arial Black",sans-serif`,g.fillText(code,sw/2,sh*.44),g.font=`900 ${sh*.12}px "Impact","Arial Black",sans-serif`,g.fillText(p.line2,sw/2,sh*.7);for(let[x,y]of[[sh*.1,sh*.3],[sw-sh*.1,sh*.3],[sh*.1,sh*.7],[sw-sh*.1,sh*.7]])g.fillStyle="#6b7078",g.beginPath(),g.arc(x,y,sh*.035,0,Math.PI*2),g.fill(),g.strokeStyle="#3a3d42",g.lineWidth=1.5,g.beginPath(),g.moveTo(x-sh*.025,y),g.lineTo(x+sh*.025,y),g.stroke()}g.fillStyle="#3a3a3a";for(let x of[sw*.14,sw*.86])g.beginPath(),g.arc(x,sh*.06+6,4,0,Math.PI*2),g.fill()}ctx.on("pointerdown",e=>{if(e.target.closest("a,button"))return;let r=ctx.root.getBoundingClientRect(),x=e.clientX-r.left,y=e.clientY-r.top,best=-1,bd=1/0;for(let s of sign){let d=Math.hypot(pts[s].x-x,pts[s].y-y);d<bd&&(bd=d,best=s)}bd<sw*.8&&(grab=best,grabOff={x:pts[best].x-x,y:pts[best].y-y})}),ctx.onWindow("pointerup",()=>grab=-1),build();let gust=3;return{resize(){c.reset(),build()},frame(t,dt){let g=c.g;if(c.reset(),dt>0){let h=Math.min(dt,.03333333333333333),grav=c.h*2.2;if(t>gust&&(gust=t+4+rnd()*6,!ctx.pointer.engaged))for(let s of sign)pts[s].px+=(rnd()-.5)*sw*.03;for(let q of pts){if(q.pinned)continue;let vx=(q.x-q.px)*.992,vy=(q.y-q.py)*.992;q.px=q.x,q.py=q.y,q.x+=vx,q.y+=vy+grav*h*h}if(grab>=0){let q=pts[grab];q.x+=(ctx.pointer.x+grabOff.x-q.x)*.5,q.y+=(ctx.pointer.y+grabOff.y-q.y)*.5}for(let it=0;it<14;it++)for(let[a2,b2,len]of cons){let A=pts[a2],B=pts[b2],dx=B.x-A.x,dy=B.y-A.y,d2=Math.hypot(dx,dy)||1,diff=(d2-len)/d2,wa=A.pinned?0:B.pinned?1:.5,wb=B.pinned?0:A.pinned?1:.5;A.x+=dx*diff*wa,A.y+=dy*diff*wa,B.x-=dx*diff*wb,B.y-=dy*diff*wb}}g.fillStyle=p.wall,g.fillRect(0,0,c.w,c.h);let v=g.createRadialGradient(c.w/2,c.h*.3,0,c.w/2,c.h*.3,Math.max(c.w,c.h)*.8);v.addColorStop(0,"rgba(255,255,255,.18)"),v.addColorStop(1,"rgba(0,0,0,.22)"),g.fillStyle=v,g.fillRect(0,0,c.w,c.h),g.fillStyle="#3a3a3a",g.fillRect(c.w/2-sw*.45,0,sw*.9,10);let[a,b,cc,d]=sign.map(i=>pts[i]),ang=Math.atan2(b.y-a.y,b.x-a.x);g.save(),g.translate(a.x+18,a.y+22),g.rotate(ang),g.fillStyle="rgba(0,0,0,.18)",g.filter="blur(10px)",g.fillRect(0,0,sw,sh),g.filter="none",g.restore(),g.strokeStyle=p.chain,g.lineWidth=2.6;for(let k=0;k<pts.length;k++)sign.includes(k);for(let[i0,i1]of cons){if(sign.includes(i0)&&sign.includes(i1))continue;let A=pts[i0],B=pts[i1],mx=(A.x+B.x)/2,my=(A.y+B.y)/2,la=Math.atan2(B.y-A.y,B.x-A.x),L=Math.hypot(B.x-A.x,B.y-A.y);g.save(),g.translate(mx,my),g.rotate(la),g.beginPath(),g.ellipse(0,0,L*.62,i0%2?2.2:4.6,0,0,Math.PI*2),g.stroke(),g.restore()}g.save(),g.translate(a.x,a.y),g.rotate(ang),g.drawImage(wood,0,0,sw,sh);let sheen=g.createLinearGradient(0,0,sw,0),s0=.5+ang*2;sheen.addColorStop(Math.max(0,Math.min(1,s0-.2)),"rgba(255,255,255,0)"),sheen.addColorStop(Math.max(0,Math.min(1,s0)),"rgba(255,255,255,.12)"),sheen.addColorStop(Math.max(0,Math.min(1,s0+.2)),"rgba(255,255,255,0)"),g.fillStyle=sheen,g.beginPath(),g.roundRect(0,0,sw,sh,sh*.08),g.fill(),g.restore()}}}};export{hanging_sign_default as default};
@@ -0,0 +1,6 @@
1
+ interface Params {
2
+ /** Rows of "Title|Description|/href". */
3
+ links: string[];
4
+ }
5
+ declare const _default: import("..").SceneDef<Params>;
6
+ export default _default;
@@ -0,0 +1,18 @@
1
+ import{actions,esc,layer,sr}from"../chunks/chunk-ES56TX4X.js";import"../chunks/chunk-B2NBRLO2.js";import"../chunks/chunk-KIYSQVWX.js";import"../chunks/chunk-7XMDQMDO.js";var helpful_links_default={id:"helpful-links",name:"Helpful Links",description:"Headline on top, then a tidy list of where people probably wanted to go, each with a one-line description and an arrow.",category:"Simple",kind:"2d",motion:"static",tags:["simple","links","list","useful","saas","docs","static","fast"],layout:"none",copy:{eyebrow:"404 error",title:"This page does not exist",message:"Sorry, we couldn\u2019t find the page you\u2019re looking for. These might help:",actions:[{label:"Back to home",href:"/"}]},params:{links:["Documentation|Learn how to integrate our tools with your app.|/docs","API reference|A complete reference of every endpoint.|/docs/api","Guides|Step-by-step tutorials for common tasks.|/guides","Blog|Read our latest news and articles.|/blog"]},theme:{bg:"#ffffff",fg:"#111827",accent:"#4f46e5","accent-fg":"#ffffff"},presetName:"Light",presets:{dark:{name:"Dark",theme:{bg:"#0f1117",fg:"#e5e7eb",accent:"#a5b4fc","accent-fg":"#0f1117"}},sand:{name:"Sand",theme:{bg:"#f6f1e9",fg:"#292018",accent:"#b45309","accent-fg":"#fff"}}},css:`
2
+ & .hl{position:absolute;inset:0;overflow:auto;display:flex;justify-content:center;padding:clamp(28px,8cqh,96px) 16px}
3
+ & .hl .in{width:min(560px,100%);margin:auto 0}
4
+ & .hl .ey{font-size:13px;font-weight:600;color:var(--lp-accent)}
5
+ & .hl h1{margin:8px 0 0;font-size:clamp(28px,4.4cqw,48px);font-weight:700;letter-spacing:-.03em;line-height:1.1}
6
+ & .hl p{margin:14px 0 0;color:var(--lp-muted);font-size:15px;line-height:1.6}
7
+ & .hl ul{list-style:none;margin:28px 0 0;padding:0;border-top:1px solid color-mix(in srgb,var(--lp-fg) 12%,transparent)}
8
+ & .hl li a{display:flex;gap:16px;align-items:center;padding:16px 4px;border-bottom:1px solid color-mix(in srgb,var(--lp-fg) 12%,transparent);color:inherit;text-decoration:none}
9
+ & .hl li i{flex:none;width:40px;height:40px;border-radius:10px;display:grid;place-items:center;font-style:normal;font-weight:700;font-size:15px;
10
+ background:color-mix(in srgb,var(--lp-accent) 12%,transparent);color:var(--lp-accent)}
11
+ & .hl li b{display:block;font-size:15px;font-weight:600}
12
+ & .hl li small{display:block;color:var(--lp-muted);font-size:13.5px;margin-top:2px}
13
+ & .hl li span{flex:1;min-width:0}
14
+ & .hl li em{font-style:normal;color:var(--lp-muted);transition:transform .2s}
15
+ & .hl li a:hover em{transform:translateX(4px);color:var(--lp-accent)}
16
+ & .hl .lp-actions{justify-content:flex-start;margin-top:26px}
17
+ & .hl .lp-btn--primary{background:none;color:var(--lp-accent);padding:6px 0;font-weight:600}
18
+ `,setup(ctx){let c=ctx.copy,rows=ctx.params.links.map(l=>l.split("|")).map(([t,d,h])=>`<li><a href="${esc(h??"/")}"><i aria-hidden="true">${esc((t??"?").charAt(0))}</i><span><b>${esc(t??"")}</b><small>${esc(d??"")}</small></span><em aria-hidden="true">\u2192</em></a></li>`).join(""),el=layer(ctx,"hl",`<div class="in"><span class="ey">${esc(c.eyebrow||c.code)}</span><h1>${sr(c.code)}${esc(c.title)}</h1><p>${esc(c.message)}</p><ul>${rows}</ul></div>`);return el.querySelectorAll("ul a").forEach(a=>a.addEventListener("click",e=>{e.metaKey||e.ctrlKey||(e.preventDefault(),ctx.navigate(a.getAttribute("href"),e))})),el.querySelector(".in").append(actions(ctx)),{destroy:()=>el.remove()}}};export{helpful_links_default as default};
@@ -0,0 +1,11 @@
1
+ interface Params {
2
+ star: string;
3
+ tint: string;
4
+ core: string;
5
+ bg: string;
6
+ /** Seconds per jump cycle. */
7
+ cycle: number;
8
+ density: number;
9
+ }
10
+ declare const _default: import("..").SceneDef<Params>;
11
+ export default _default;
@@ -0,0 +1,57 @@
1
+ import{shaderScene}from"../chunks/chunk-B4TY5M55.js";import{HASH,POST}from"../chunks/chunk-SH72TE6I.js";import{linear}from"../chunks/chunk-FVGCB66F.js";import"../chunks/chunk-KIYSQVWX.js";import"../chunks/chunk-7XMDQMDO.js";var FRAG=`
2
+ uniform vec3 uStar, uTint, uCore, uBg;
3
+ uniform float uCycle, uDensity;
4
+ ${HASH}
5
+ ${POST}
6
+
7
+ // warp factor over a jump cycle: cruise \u2192 spool \u2192 jump \u2192 drop out
8
+ float warp(float t) {
9
+ float c = mod(t, uCycle) / uCycle;
10
+ float spool = smoothstep(0.35, 0.6, c);
11
+ float jump = smoothstep(0.6, 0.66, c) * (1.0 - smoothstep(0.86, 0.96, c));
12
+ return 0.06 + spool * 0.25 + jump * 1.6;
13
+ }
14
+
15
+ void main() {
16
+ vec2 fc = gl_FragCoord.xy;
17
+ vec2 uv = (fc - 0.5 * uRes) / uRes.y;
18
+ uv -= uMouse * 0.08;
19
+ float t = uTime;
20
+ float w = warp(t);
21
+ float r = length(uv);
22
+ float a = atan(uv.y, uv.x);
23
+ vec3 col = uBg;
24
+
25
+ for (int l = 0; l < 7; l++) {
26
+ float fl = float(l);
27
+ float bins = 90.0 + fl * 55.0;
28
+ float ab = a / 6.28318 * bins;
29
+ float id = floor(ab);
30
+ float h = hash12(vec2(id, fl * 7.3));
31
+ if (h > uDensity) continue;
32
+ float fa = fract(ab) - 0.5 - (hash12(vec2(id, fl + 1.7)) - 0.5) * 0.6;
33
+ // each star travels outward; z cycles
34
+ float speed = 0.35 + h * 0.6;
35
+ float z = fract(hash12(vec2(id, fl * 3.1)) + t * speed * (0.12 + w * 0.9));
36
+ float r0 = 0.04 / max(1.0 - z, 0.02) * 0.6;
37
+ float len = r0 * (0.02 + w * 1.2);
38
+ float along = smoothstep(r0 - len, r0, r) * smoothstep(r0 + 0.004 + w * 0.02, r0, r);
39
+ float width = abs(fa) * (r * 6.2832 / bins) * uRes.y;
40
+ float across = smoothstep(1.4 + w * 0.6, 0.0, width);
41
+ float bright = (0.4 + 0.6 * z) * along * across;
42
+ vec3 sc = mix(uStar, uTint, h * 1.3);
43
+ col += sc * bright * (1.0 + w);
44
+ }
45
+ // core glow and tunnel haze during jump
46
+ col += uCore * (exp(-r * 9.0) * (0.3 + w * 1.2) + exp(-r * 2.0) * 0.08 * w);
47
+ col += uTint * 0.05 * w * smoothstep(0.9, 0.2, r);
48
+ // flash at the jump
49
+ float c = mod(t, uCycle) / uCycle;
50
+ col += uCore * 0.6 * exp(-abs(c - 0.62) * 70.0);
51
+
52
+ col = aces(col);
53
+ col = toSRGB(col);
54
+ col *= mix(0.65, 1.0, vignette(vUv, 0.3));
55
+ fragColor = vec4(col, 1.0);
56
+ }
57
+ `,hyperspace_default={id:"hyperspace",name:"Hyperspace Jump",description:"Stars stretch into light as the ship spools up, jumps, and drops out somewhere unexpected.",category:"Space",kind:"2d",motion:"live",tags:["webgl","space","warp","stars","speed","sci-fi"],layout:"center",copy:{eyebrow:"Navigation error",title:"Jumped to the wrong coordinates.",message:"The navicomputer says this page should be here. Space says otherwise.",actions:[{label:"Plot a course home",href:"/",variant:"primary"}]},params:{star:"#e8f0ff",tint:"#7fb3ff",core:"#cfe0ff",bg:"#01020a",cycle:9,density:.55},theme:{bg:"#01020a","code-color":"rgba(230,240,255,.9)",accent:"#e8f0ff","accent-fg":"#01020a"},presetName:"Classic",presets:{ice:{name:"Ice Lanes",params:{star:"#ffffff",tint:"#9fe8ff",core:"#e6f9ff",bg:"#000a12",density:.65},theme:{bg:"#000a12",accent:"#9fe8ff","accent-fg":"#000a12"}},magenta:{name:"Magenta Drive",params:{star:"#ffe6f7",tint:"#ff3bb8",core:"#ff9edb",bg:"#0d0008",cycle:7},theme:{bg:"#0d0008",accent:"#ff9edb","accent-fg":"#1a0010"}},sunburst:{name:"Sunburst",params:{star:"#fffbe6",tint:"#ff7a1f",core:"#ffd36b",bg:"#120500",density:.75},theme:{bg:"#120500",accent:"#ffd36b","accent-fg":"#120500"}},mono:{name:"Monochrome",params:{star:"#ffffff",tint:"#bbbbbb",core:"#ffffff",bg:"#000000"},theme:{bg:"#000",accent:"#fff","accent-fg":"#000"}},plasma:{name:"Plasma Drive",params:{star:"#ffd9ff",tint:"#b45cff",core:"#ff9cf5",bg:"#07010d"},theme:{bg:"#07010d",accent:"#f5d9ff","accent-fg":"#12001f"}},"red-alert":{name:"Red Alert",eyebrow:"Red alert",title:"All hands: page not found.",params:{star:"#ffe1d9",tint:"#ff4a3d",core:"#ff7a5c",bg:"#0a0101",cycle:6},theme:{bg:"#0a0101",accent:"#ffb3a8","accent-fg":"#200402"}},emerald:{name:"Emerald",params:{star:"#e0fff2",tint:"#2bffb1",core:"#a6ffe0",bg:"#00080a"},theme:{bg:"#00080a",accent:"#c9ffe9","accent-fg":"#00140d"}},gold:{name:"Solar Sail",params:{star:"#fff4dd",tint:"#ffbf47",core:"#ffd88a",bg:"#080500",density:.7},theme:{bg:"#080500",accent:"#ffe0a3","accent-fg":"#1a1000"}}},css:"& .lp-code{font-weight:200;letter-spacing:.06em;text-shadow:0 0 30px rgba(170,200,255,.45)}",setup(ctx){let p=ctx.params;return shaderScene(ctx,{frag:FRAG,uniforms:()=>({uStar:linear(p.star),uTint:linear(p.tint),uCore:linear(p.core),uBg:linear(p.bg),uCycle:p.cycle,uDensity:p.density})})}};export{hyperspace_default as default};
@@ -0,0 +1,10 @@
1
+ interface Params {
2
+ a: string;
3
+ b: string;
4
+ arms: number;
5
+ speed: number;
6
+ /** 0 spiral, 1 rings, 2 checker tunnel */
7
+ pattern: number;
8
+ }
9
+ declare const _default: import("..").SceneDef<Params>;
10
+ export default _default;
@@ -0,0 +1,26 @@
1
+ import{shaderScene}from"../chunks/chunk-B4TY5M55.js";import{POST}from"../chunks/chunk-SH72TE6I.js";import{linear}from"../chunks/chunk-FVGCB66F.js";import"../chunks/chunk-KIYSQVWX.js";import"../chunks/chunk-7XMDQMDO.js";var FRAG=`
2
+ uniform vec3 uA, uB;
3
+ uniform float uArms, uSpeed, uPattern;
4
+ ${POST}
5
+ void main() {
6
+ vec2 fc = gl_FragCoord.xy;
7
+ vec2 p = (fc - 0.5 * uRes) / uRes.y - uMouse * 0.05;
8
+ float t = uTime * uSpeed;
9
+ float r = length(p);
10
+ float a = atan(p.y, p.x);
11
+ float v;
12
+ if (uPattern < 0.5) v = sin(a * uArms + log(max(r, 1e-3)) * 9.0 - t * 3.0);
13
+ else if (uPattern < 1.5) v = sin(r * 60.0 - t * 4.0);
14
+ else {
15
+ float z = 0.3 / max(r, 1e-3) + t * 0.6;
16
+ v = sin(a * uArms * 0.5 * 3.14159 / 3.14159 * 2.0) * sin(z * 6.0);
17
+ }
18
+ float w = fwidth(v) * 1.5;
19
+ float m = smoothstep(-w, w, v);
20
+ vec3 col = mix(uA, uB, m);
21
+ col *= smoothstep(0.0, 0.08, r) * 0.6 + 0.4;
22
+ col *= mix(0.55, 1.0, vignette(fc / uRes, 0.3));
23
+ fragColor = vec4(toSRGB(col), 1.0);
24
+ }
25
+ `,hypnosis_default={id:"hypnosis",name:"Hypnosis",description:"An endlessly turning hypnotic spiral. Keep looking. You are getting very, very lost.",category:"Abstract",kind:"2d",motion:"live",tags:["webgl","spiral","op-art","trippy","funny","black-and-white"],layout:"center",copy:{eyebrow:"Look into the spiral",title:"You are getting very lost.",message:"When I snap my fingers, you'll forget this URL and click the button below.",actions:[{label:"*snap*",href:"/",variant:"primary",icon:"none"}]},params:{a:"#0a0a0a",b:"#f5f5f5",arms:4,speed:1,pattern:0},theme:{bg:"#0a0a0a",fg:"#ffffff",accent:"#ff2d55","accent-fg":"#fff","code-color":"#ffffff"},presetName:"Classic",presets:{ocean:{name:"Deep Blue",params:{a:"#020a2a",b:"#3bd6ff",arms:3},theme:{accent:"#3bd6ff","accent-fg":"#020a2a"}},toxic:{name:"Toxic",params:{a:"#0a1a02",b:"#c6ff3b",arms:5,speed:1.4},theme:{accent:"#c6ff3b","accent-fg":"#0a1a02"}},candy:{name:"Candy Swirl",params:{a:"#ff2d6f",b:"#ffe6ee",arms:6},theme:{accent:"#111","accent-fg":"#fff"}},rings:{name:"Ripples",params:{pattern:1,a:"#0b1a3a",b:"#4dd8ff"},theme:{accent:"#4dd8ff","accent-fg":"#0b1a3a"}},tunnel:{name:"Op-Art Tunnel",params:{pattern:2,arms:12,a:"#000000",b:"#ffffff"}}},css:`& .lp-content,& .lp-head,& .lp-body{background:color-mix(in srgb,var(--lp-bg) 82%,transparent);border-radius:24px;padding:18px 28px}
26
+ & .lp-code{font-weight:800}`,setup(ctx){let p=ctx.params;return shaderScene(ctx,{frag:FRAG,uniforms:()=>({uA:linear(p.a),uB:linear(p.b),uArms:p.arms,uSpeed:p.speed,uPattern:p.pattern})})}};export{hypnosis_default as default};
@@ -0,0 +1,10 @@
1
+ interface Params {
2
+ paper: string;
3
+ ink: string;
4
+ ink2: string;
5
+ /** Seconds for one dissolve-and-return cycle. */
6
+ cycle: number;
7
+ font: string;
8
+ }
9
+ declare const _default: import("..").SceneDef<Params>;
10
+ export default _default;
@@ -0,0 +1,43 @@
1
+ import{shaderScene}from"../chunks/chunk-B4TY5M55.js";import{HASH,NOISE,POST,texture}from"../chunks/chunk-SH72TE6I.js";import{linear}from"../chunks/chunk-FVGCB66F.js";import{SERIF,drawFittedText}from"../chunks/chunk-3ISI6SOJ.js";import"../chunks/chunk-KIYSQVWX.js";import"../chunks/chunk-7XMDQMDO.js";var FRAG=`
2
+ uniform sampler2D uText;
3
+ uniform vec3 uPaper, uInk, uInk2;
4
+ uniform float uCycle;
5
+ ${HASH}
6
+ ${NOISE}
7
+ ${POST}
8
+
9
+ vec2 warp(vec2 p, float t, float amt) {
10
+ vec2 q = vec2(fbm(p * 2.0 + t * 0.05), fbm(p * 2.0 + vec2(5.2, 1.3) - t * 0.04));
11
+ vec2 r = vec2(fbm(p * 3.0 + q * 3.0 + vec2(1.7, 9.2) + t * 0.07), fbm(p * 3.0 + q * 3.0 + vec2(8.3, 2.8) - t * 0.06));
12
+ return (r - 0.5) * amt;
13
+ }
14
+
15
+ void main() {
16
+ vec2 fc = gl_FragCoord.xy;
17
+ vec2 uv = fc / uRes;
18
+ vec2 p = (fc - 0.5 * uRes) / uRes.y;
19
+ float t = uTime;
20
+ // dissolve phase: 0 = crisp letters, 1 = fully bloomed ink
21
+ float c = fract(t / uCycle);
22
+ float phase = smoothstep(0.08, 0.6, c) * (1.0 - smoothstep(0.78, 0.98, c));
23
+ float amt = phase * 0.35;
24
+ vec2 w = warp(p, t, amt);
25
+ // the ink spreads outward from the letters, sinking slightly
26
+ vec2 suv = uv + vec2(w.x * uRes.y / uRes.x, w.y) + vec2(0.0, phase * 0.03);
27
+ float lod = phase * 4.5;
28
+ float d = textureLod(uText, suv, lod).a;
29
+ float d2 = textureLod(uText, uv + vec2(w.x * uRes.y / uRes.x, w.y) * 1.6, lod + 1.0).a;
30
+ float density = clamp(d * (1.0 + phase * 0.8) + d2 * phase * 0.6, 0.0, 1.0);
31
+ // feathered tendrils
32
+ float tend = fbm(p * 7.0 + w * 6.0 + t * 0.03);
33
+ density *= mix(1.0, 0.55 + 0.9 * tend, phase);
34
+ vec3 inkCol = mix(uInk, uInk2, smoothstep(0.2, 0.9, tend) * phase);
35
+ // paper with fibres
36
+ vec3 paper = uPaper * (0.97 + 0.03 * vnoise(p * 240.0)) * (0.98 + 0.02 * fbm(p * 9.0));
37
+ vec3 col = mix(paper, inkCol, smoothstep(0.02, 0.9, density) * 0.96);
38
+ // darker edges where ink pools
39
+ col = mix(col, uInk * 0.6, smoothstep(0.45, 0.5, density) * smoothstep(0.62, 0.5, density) * 0.25 * phase);
40
+ col *= mix(0.92, 1.0, vignette(uv, 0.2));
41
+ fragColor = vec4(toSRGB(col), 1.0);
42
+ }
43
+ `,ink_default={id:"ink",name:"Ink in Water",description:"The numerals bleed into the paper like ink dropped in water, bloom into clouds, then slowly gather back into shape.",category:"Abstract",kind:"2d",motion:"live",tags:["webgl","ink","watercolor","calm","light","editorial","elegant"],layout:"bottom",codeInScene:!0,stillTime:.2,copy:{eyebrow:"Error 404",title:"This page dissolved.",message:"It was here a moment ago, then it bled into the paper. Let's start on a clean page.",actions:[{label:"Start fresh",href:"/",variant:"primary"}]},params:{paper:"#f6f2ea",ink:"#14213d",ink2:"#4a1d6b",cycle:12,font:SERIF},theme:{bg:"#f6f2ea",fg:"#14213d",accent:"#14213d","accent-fg":"#f6f2ea","font-display":"var(--lp-font-serif)","title-weight":"500"},presetName:"Indigo",presets:{ocean:{name:"Blue Ink",params:{paper:"#f4f7fb",ink:"#0b3a8a",ink2:"#2a7bd6"},theme:{bg:"#f4f7fb",fg:"#0b1e3a",accent:"#0b3a8a","accent-fg":"#fff"}},green:{name:"Moss",params:{paper:"#f2f2ea",ink:"#2a4a1a",ink2:"#7a9a3a"},theme:{bg:"#f2f2ea",fg:"#1a2a10",accent:"#2a4a1a","accent-fg":"#fff"}},violet:{name:"Violet",params:{paper:"#faf6ff",ink:"#4a1a8a",ink2:"#c25cd6"},theme:{bg:"#faf6ff",fg:"#24103f",accent:"#4a1a8a","accent-fg":"#fff"}},sumi:{name:"Sumi",params:{paper:"#efe9dc",ink:"#111111",ink2:"#3a3a3a"},theme:{bg:"#efe9dc",fg:"#111",accent:"#111","accent-fg":"#efe9dc"}},crimson:{name:"Crimson",params:{paper:"#fbf6ef",ink:"#8c1c13",ink2:"#d1495b"},theme:{bg:"#fbf6ef",fg:"#3d0b07",accent:"#8c1c13","accent-fg":"#fff"}},teal:{name:"Teal",params:{paper:"#f1f5f2",ink:"#0b4f4a",ink2:"#2a9d8f"},theme:{bg:"#f1f5f2",fg:"#0b2b28",accent:"#0b4f4a","accent-fg":"#fff"}},night:{name:"Gold on Black",params:{paper:"#0e0d0c",ink:"#d9b25f",ink2:"#f3dfa2"},theme:{bg:"#0e0d0c",fg:"#f3e6c8",accent:"#d9b25f","accent-fg":"#0e0d0c"}}},setup(ctx){let p=ctx.params,cv=document.createElement("canvas"),tex=null,gl,draw=()=>{let w=Math.min(2048,Math.round(ctx.width*Math.min(2,ctx.dpr))),h=Math.round(w*ctx.height/Math.max(1,ctx.width));cv.width=w,cv.height=h;let g=cv.getContext("2d");g.clearRect(0,0,w,h),g.save(),g.translate(0,h*.37-h*.22),drawFittedText(g,ctx.copy.code||"404",{width:w,height:h*.44,font:p.font,weight:700,fit:.86}),g.restore(),tex&&(gl.bindTexture(gl.TEXTURE_2D,tex),gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL,!0),gl.texImage2D(gl.TEXTURE_2D,0,gl.RGBA,gl.RGBA,gl.UNSIGNED_BYTE,cv),gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL,!1),gl.generateMipmap(gl.TEXTURE_2D))};return{...shaderScene(ctx,{frag:FRAG,init(g){gl=g,draw(),tex=texture(gl,cv,{filter:"mipmap"})},uniforms:()=>({uText:tex,uPaper:linear(p.paper),uInk:linear(p.ink),uInk2:linear(p.ink2),uCycle:p.cycle})}),resize:draw}}};export{ink_default as default};
@@ -0,0 +1,10 @@
1
+ interface Params {
2
+ bg: string;
3
+ aliens: string[];
4
+ ship: string;
5
+ shot: string;
6
+ text: string;
7
+ stars: boolean;
8
+ }
9
+ declare const _default: import("..").SceneDef<Params>;
10
+ export default _default;
@@ -0,0 +1 @@
1
+ import{GAME_CSS,codeBitmap,hud,input,loadHigh,saveHigh}from"../chunks/chunk-MNUNTC4L.js";import{canvas2d}from"../chunks/chunk-DAZOIOF7.js";import{rgba}from"../chunks/chunk-FVGCB66F.js";import"../chunks/chunk-3ISI6SOJ.js";import"../chunks/chunk-KIYSQVWX.js";import"../chunks/chunk-7XMDQMDO.js";var ALIEN=[["..x..x..","...xx...","..xxxx..",".xx.xx.x","xxxxxxxx","x.xxxx.x","x.x..x.x","...xx..."],["..x..x..","x..xx..x","x.xxxx.x","xxx.xx.x","xxxxxxxx",".xxxxxx.","..x..x..",".x....x."]],SHIP=["....x....","...xxx...","...xxx...",".xxxxxxx.","xxxxxxxxx","xxxxxxxxx","xx.....xx"],invaders_default={id:"invaders",name:"Page Invaders",description:"The 404 marches down the screen as a fleet of pixel aliens. The ship defends itself until you take the controls.",category:"Games",kind:"2d",motion:"game",tags:["canvas","game","playable","space","shooter","pixel-art","retro"],layout:"bottom",codeInScene:!0,copy:{eyebrow:"\u2190 \u2192 move \xB7 space fires",title:"Your page was abducted.",message:"The invaders took it and they're not giving it back. Blast a few, then fly home.",actions:[{label:"Retreat to home",href:"/",variant:"primary"}]},params:{bg:"#03030a",aliens:["#7dff6b","#3bd6ff","#ff5ad1"],ship:"#e9ecff",shot:"#ffef5a",text:"#e9ecff",stars:!0},theme:{bg:"#03030a",fg:"#e9ecff",accent:"#7dff6b","accent-fg":"#03030a","font-display":"var(--lp-font-mono)","title-weight":"700"},presetName:"Arcade",presets:{neon:{name:"Neon",params:{bg:"#08000f",aliens:["#ff3bd4","#3bffe6","#ffe14d"],ship:"#ffffff",shot:"#ffffff",text:"#ffe6fb"},theme:{bg:"#08000f",fg:"#ffe6fb",accent:"#ff3bd4","accent-fg":"#fff"}},green:{name:"Phosphor",params:{bg:"#010a03",aliens:["#3dff6b"],ship:"#3dff6b",shot:"#c9ffd6",text:"#3dff6b"},theme:{bg:"#010a03",fg:"#c9ffd6",accent:"#3dff6b","accent-fg":"#010a03"}},mono:{name:"Cabinet White",params:{aliens:["#ffffff"],ship:"#3dff6b",shot:"#ffffff",text:"#ffffff"},theme:{accent:"#ffffff","accent-fg":"#000"}},blush:{name:"Bubblegum",params:{bg:"#fff1f6",aliens:["#ff4f8b","#8a5cff","#ffb13b"],ship:"#2a1640",shot:"#ff4f8b",text:"#2a1640",stars:!1},theme:{bg:"#fff1f6",fg:"#2a1640",accent:"#2a1640","accent-fg":"#fff1f6"}},amber:{name:"Amber",params:{bg:"#0a0600",aliens:["#ffb000","#ff7a00"],ship:"#ffe0a0",shot:"#fff2cc",text:"#ffb000"},theme:{bg:"#0a0600",fg:"#ffe0a0",accent:"#ffb000","accent-fg":"#0a0600"}}},css:GAME_CSS,setup(ctx){let p=ctx.params,c=canvas2d(ctx),inp=input(ctx,{pointerPlays:!1}),rnd=ctx.random,px=3,aliens=[],form={x:0,y:0,dir:1,cell:0},ship={x:0,y:0},shots=[],booms=[],stars=[],cool=0,score=0,lives=3,high=loadHigh("invaders"),dead=0,wasPlaying=!1,aiTarget=0;function wave(){let cols=Math.max(18,Math.min(30,Math.round(c.w/52))),rows=Math.round(cols*.38),bm=codeBitmap(ctx.copy.code||"404",cols,rows);aliens=[];for(let r=0;r<rows;r++)for(let q=0;q<cols;q++)bm[r*cols+q]&&aliens.push({gx:q,gy:r,alive:!0,col:p.aliens[r%p.aliens.length]});form.cell=Math.min(c.w*.62/cols,c.h*.36/rows),px=Math.max(1.5,form.cell/10),form.x=(c.w-cols*form.cell)/2,form.y=c.h*.08,form.dir=1}function layout(){wave(),ship={x:c.w/2,y:c.h*.6},stars=Array.from({length:120},()=>({x:rnd()*c.w,y:rnd()*c.h,z:.3+rnd()}))}function sprite(rows,x,y,s,col){c.g.fillStyle=col;for(let r=0;r<rows.length;r++)for(let q=0;q<rows[r].length;q++)rows[r][q]==="x"&&c.g.fillRect(x+q*s,y+r*s,s+.3,s+.3)}return layout(),{resize(){c.reset(),layout()},frame(t,dt){let g=c.g;c.reset(),inp.playing&&!wasPlaying&&(wasPlaying=!0,score=0,lives=3,wave(),shots=[]);let live=(!ctx.reducedMotion||inp.playing)&&dt>0,cols=aliens.reduce((m,a)=>Math.max(m,a.gx),0)+1;if(live&&dead<=0){let speed=c.w*.03*(1+(1-aliens.filter(a=>a.alive).length/Math.max(1,aliens.length))*2.5);form.x+=form.dir*speed*dt;let alive=aliens.filter(a=>a.alive),minX=form.x+Math.min(...alive.map(a=>a.gx))*form.cell,maxX=form.x+(Math.max(...alive.map(a=>a.gx))+1)*form.cell;(form.dir>0&&maxX>c.w-20||form.dir<0&&minX<20)&&(form.dir*=-1,form.y+=form.cell*.5);let maxRow=Math.max(...alive.map(a=>a.gy));form.y+(maxRow+1)*form.cell>ship.y-20&&(form.y=c.h*.08);let sw=9*px*1.4;if(inp.playing)inp.left&&(ship.x-=c.w*.55*dt),inp.right&&(ship.x+=c.w*.55*dt),(inp.action||inp.pressed())&&cool<=0&&(shots.push({x:ship.x,y:ship.y-4,vy:-c.h*1.2,enemy:!1}),cool=.32);else{alive.some(a=>a.gx===aiTarget)||(aiTarget=alive[Math.floor(rnd()*alive.length)]?.gx??0);let tx=form.x+(aiTarget+.5)*form.cell;ship.x+=Math.sign(tx-ship.x)*Math.min(Math.abs(tx-ship.x),c.w*.35*dt),Math.abs(tx-ship.x)<form.cell&&cool<=0&&(shots.push({x:ship.x,y:ship.y-4,vy:-c.h*1.2,enemy:!1}),cool=.45,rnd()<.35&&(aiTarget=alive[Math.floor(rnd()*alive.length)]?.gx??0))}if(ship.x=Math.max(sw,Math.min(c.w-sw,ship.x)),cool-=dt,rnd()<dt*1.2&&alive.length){let a=alive[Math.floor(rnd()*alive.length)];shots.push({x:form.x+(a.gx+.5)*form.cell,y:form.y+(a.gy+1)*form.cell,vy:c.h*.45,enemy:!0})}for(let s of shots)s.y+=s.vy*dt;for(let s of shots){if(s.enemy){Math.abs(s.x-ship.x)<sw*.5&&Math.abs(s.y-ship.y-6*px)<8*px&&(s.y=1e6,booms.push({x:ship.x,y:ship.y,life:.6,col:p.ship}),inp.playing&&(lives--,lives<=0&&(dead=2,score>high&&saveHigh("invaders",high=score))));continue}for(let a of aliens){if(!a.alive)continue;let ax=form.x+a.gx*form.cell,ay=form.y+a.gy*form.cell;if(s.x>ax&&s.x<ax+form.cell&&s.y>ay&&s.y<ay+form.cell){a.alive=!1,s.y=-1e6,score+=20,booms.push({x:ax+form.cell/2,y:ay+form.cell/2,life:.4,col:a.col});break}}}shots=shots.filter(s=>s.y>-50&&s.y<c.h+50),aliens.some(a=>a.alive)||wave()}else dead>0&&(dead-=dt,dead<=0&&(score=0,lives=3,wave(),shots=[]));if(g.fillStyle=p.bg,g.fillRect(0,0,c.w,c.h),p.stars)for(let s of stars)s.y+=s.z*18*dt,s.y>c.h&&(s.y=0),g.fillStyle=rgba(p.text,.25*s.z),g.fillRect(s.x,s.y,s.z*1.6,s.z*1.6);let frame=Math.floor(t*2)%2;for(let a of aliens)a.alive&&sprite(ALIEN[frame],form.x+a.gx*form.cell+form.cell*.1,form.y+a.gy*form.cell+form.cell*.1,form.cell*.8/8,a.col);for(let s of shots)g.fillStyle=s.enemy?p.aliens[0]:p.shot,g.fillRect(s.x-px*.6,s.y,px*1.2,px*5);for(let b of booms){b.life-=dt,g.fillStyle=rgba(b.col,Math.max(0,b.life*2));for(let i=0;i<8;i++){let a=i/8*Math.PI*2,r=(.6-b.life)*form.cell*2;g.fillRect(b.x+Math.cos(a)*r,b.y+Math.sin(a)*r,px*1.5,px*1.5)}}booms=booms.filter(b=>b.life>0),(dead<=0||Math.floor(t*8)%2)&&sprite(SHIP,ship.x-4.5*px*1.4,ship.y,px*1.4,p.ship);let fs=Math.max(10,Math.min(14,c.w/90));hud(g,`SCORE ${String(score).padStart(5,"0")}`,20,16,fs,p.text),hud(g,`HI ${String(high).padStart(5,"0")}`,c.w/2,16,fs,p.text,"center"),inp.playing?hud(g,`LIVES ${lives}`,c.w-20,16,fs,p.text,"right"):Math.floor(t*1.6)%2===0&&hud(g,"DEMO \xB7 PRESS SPACE",c.w/2,ship.y+14*px,fs,rgba(p.text,.75),"center")}}}};export{invaders_default as default};
@@ -0,0 +1,10 @@
1
+ interface Params {
2
+ a: string;
3
+ b: string;
4
+ c: string;
5
+ bg: string;
6
+ segments: number;
7
+ speed: number;
8
+ }
9
+ declare const _default: import("..").SceneDef<Params>;
10
+ export default _default;
@@ -0,0 +1,34 @@
1
+ import{shaderScene}from"../chunks/chunk-B4TY5M55.js";import{HASH,NOISE,POST,texture}from"../chunks/chunk-SH72TE6I.js";import{linear}from"../chunks/chunk-FVGCB66F.js";import{SANS,drawFittedText}from"../chunks/chunk-3ISI6SOJ.js";import"../chunks/chunk-KIYSQVWX.js";import"../chunks/chunk-7XMDQMDO.js";var FRAG=`
2
+ uniform sampler2D uText;
3
+ uniform vec3 uA, uB, uC, uBg;
4
+ uniform float uSeg, uSpeed;
5
+ ${HASH}
6
+ ${NOISE}
7
+ ${POST}
8
+ void main() {
9
+ vec2 fc = gl_FragCoord.xy;
10
+ vec2 p = (fc - 0.5 * uRes) / uRes.y;
11
+ float t = uTime * uSpeed;
12
+ float r = length(p);
13
+ float a = atan(p.y, p.x) + t * 0.08 + uMouse.x * 0.6;
14
+ float seg = 6.28318 / uSeg;
15
+ a = mod(a, seg);
16
+ a = abs(a - seg * 0.5);
17
+ vec2 q = vec2(cos(a), sin(a)) * r;
18
+ q = q * (1.2 + 0.2 * sin(t * 0.3)) + vec2(t * 0.05, 0.0);
19
+ // coloured glass shards
20
+ float n1 = fbm(q * 3.0 + t * 0.1);
21
+ float n2 = fbm(q * 6.0 - t * 0.07 + 4.0);
22
+ vec3 col = mix(uA, uB, smoothstep(0.35, 0.65, n1));
23
+ col = mix(col, uC, smoothstep(0.55, 0.8, n2));
24
+ float edges = smoothstep(0.02, 0.0, abs(fract(n1 * 6.0) - 0.5) - 0.46);
25
+ col = mix(col, uBg, edges * 0.8);
26
+ // the code tumbles through the mirrors
27
+ vec2 tuv = fract(q * 0.6 + vec2(0.5, 0.5 + t * 0.02));
28
+ float txt = texture(uText, tuv).a;
29
+ col = mix(col, vec3(1.0), txt * 0.85);
30
+ col *= smoothstep(1.2, 0.2, r) * 0.9 + 0.15;
31
+ col = toSRGB(col);
32
+ fragColor = vec4(col, 1.0);
33
+ }
34
+ `,kaleidoscope_default={id:"kaleidoscope",name:"Kaleidoscope",description:"Mirrored shards of colour turn endlessly, with the error tumbling through the mirrors. Move the pointer to rotate the tube.",category:"Abstract",kind:"2d",motion:"live",tags:["webgl","kaleidoscope","psychedelic","colorful","generative","trippy"],layout:"bottom",copy:{eyebrow:"Every angle",title:"We looked from every angle.",message:"Twelve mirrors, endless reflections, and not one of them shows the page you wanted.",actions:[{label:"Stop the spin",href:"/",variant:"primary"}]},params:{a:"#ff3d7f",b:"#3dd6ff",c:"#ffd23d",bg:"#0b0614",segments:12,speed:1},theme:{bg:"#0b0614",fg:"#ffffff",accent:"#ffffff","accent-fg":"#0b0614","code-color":"rgba(255,255,255,.95)"},presetName:"Candy Glass",presets:{ocean:{name:"Ocean Glass",params:{a:"#0077b6",b:"#90e0ef",c:"#ffffff",bg:"#03045e",segments:10}},autumn:{name:"Autumn Glass",params:{a:"#d9541e",b:"#f2b33d",c:"#5a2a12",bg:"#1a0a05",segments:8}},jewel:{name:"Jewel Box",params:{a:"#0a7a5a",b:"#5a0a7a",c:"#d4af37",segments:8}},pastel:{name:"Pastel",params:{a:"#ffc2d9",b:"#c2e7ff",c:"#fff2b3",bg:"#ffffff",segments:10},theme:{bg:"#ffe9f2",fg:"#2a1030",accent:"#2a1030","accent-fg":"#fff","code-color":"#2a1030"}},mono:{name:"Monochrome",params:{a:"#111111",b:"#777777",c:"#eeeeee",bg:"#000000",segments:16}}},css:"& .lp-code{font-weight:900;text-shadow:0 4px 30px rgba(0,0,0,.4)}& .lp-body{text-shadow:0 2px 14px rgba(0,0,0,.5)}",setup(ctx){let p=ctx.params,cv=document.createElement("canvas");cv.width=512,cv.height=512;let g=cv.getContext("2d");g.save(),g.translate(0,166),drawFittedText(g,ctx.copy.code||"404",{width:512,height:180,font:SANS,weight:900,fit:.7}),g.restore();let tex;return shaderScene(ctx,{frag:FRAG,init(gl){tex=texture(gl,cv,{filter:"linear",wrap:"repeat"})},uniforms:()=>({uText:tex,uA:linear(p.a),uB:linear(p.b),uC:linear(p.c),uBg:linear(p.bg),uSeg:p.segments,uSpeed:p.speed})})}};export{kaleidoscope_default as default};
@@ -0,0 +1,11 @@
1
+ interface Params {
2
+ wax: string;
3
+ wax2: string;
4
+ liquid: string;
5
+ liquid2: string;
6
+ /** How strongly the code shape pulls the wax together (0..1). */
7
+ form: number;
8
+ speed: number;
9
+ }
10
+ declare const _default: import("..").SceneDef<Params>;
11
+ export default _default;