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{a as S}from"./chunk-4ZBXB36L.js";import{f as w}from"./chunk-HXSSPN2I.js";import"./chunk-URWX3LLV.js";var T={id:"moon-landing",name:"Moon Landing",description:"Bootprints lead away from the lander across grey dust, past a planted 404 flag, and off the edge of the screen. Earth hangs in the black sky.",category:"Space",kind:"2d",motion:"live",tags:["canvas","moon","space","lunar","illustration","calm","dark"],layout:"top",copy:{eyebrow:"Tranquility Base",title:"One small step into nowhere.",message:"We came all this way and the page isn't here. The footprints lead back home.",actions:[{label:"Return to Earth",href:"/",variant:"primary"}]},params:{sky:"#000000",ground:"#8f8f8c",earth:!0,flag:"#ff4d2e"},theme:{bg:"#000000",fg:"#f2f2f0",accent:"#f2f2f0","accent-fg":"#000","code-color":"rgba(242,242,240,.14)"},presetName:"Earthrise",presets:{europa:{name:"Ice Moon",eyebrow:"Europa",title:"Frozen solid. No page.",params:{sky:"#020617",ground:"#c9d6e6",flag:"#ff3b5c",earth:!1}},mars:{name:"Red Planet",eyebrow:"Jezero Crater",title:"Not even a rover could find it.",params:{sky:"#d9a07a",ground:"#b5532c",earth:!1,flag:"#1f6feb"},theme:{bg:"#b5532c",fg:"#2a0f05",accent:"#2a0f05","accent-fg":"#fff","code-color":"rgba(42,15,5,.14)"}},blue:{name:"Blue Moon",params:{sky:"#020617",ground:"#6b7a99",flag:"#ffd23f"}}},css:"& .lp-overlay{padding-top:clamp(20px,5cqh,56px)}& .lp-code{--lp-code-size:clamp(64px,10cqw,140px)}& .lp-actions{margin-top:16px}",setup(m){let p=m.params,t=S(m),s=m.random,g,b=()=>t.h*.68,u=()=>{let l=Math.min(2,m.dpr);g=document.createElement("canvas"),g.width=t.w*l,g.height=t.h*l;let e=g.getContext("2d");if(e.scale(l,l),e.fillStyle=p.sky,e.fillRect(0,0,t.w,t.h),p.sky==="#000000"||p.sky.startsWith("#02"))for(let i=0;i<400;i++)e.fillStyle=`rgba(255,255,255,${s()*.8})`,e.fillRect(s()*t.w,s()*b(),1.2,1.2);let r=b(),a=e.createLinearGradient(0,r,0,t.h);a.addColorStop(0,p.ground),a.addColorStop(1,w(p.ground,.45)),e.fillStyle=a,e.beginPath(),e.moveTo(0,t.h),e.lineTo(0,r+20),e.quadraticCurveTo(t.w/2,r-30,t.w,r+20),e.lineTo(t.w,t.h),e.fill();for(let i=0;i<26;i++){let o=r+20+s()**1.5*(t.h-r),h=s()*t.w,n=(6+s()*50)*((o-r)/(t.h-r)+.3);e.fillStyle="rgba(0,0,0,.18)",e.beginPath(),e.ellipse(h,o,n,n*.35,0,0,Math.PI*2),e.fill(),e.strokeStyle="rgba(255,255,255,.15)",e.lineWidth=2,e.beginPath(),e.ellipse(h,o,n,n*.35,0,Math.PI*.1,Math.PI*.9),e.stroke()}for(let i=0;i<t.w*(t.h-r)/30;i++)e.fillStyle=`rgba(${s()>.5?"255,255,255":"0,0,0"},${s()*.08})`,e.fillRect(s()*t.w,r+s()*(t.h-r),1.5,1.5);let c=t.w*.24,f=r+(t.h-r)*.32;for(let i=0;i<40;i++){let o=i/40,h=c+o*(t.w*.85-c)+Math.sin(o*9)*20,n=f+o*(t.h*.95-f)*.9,d=3+o*6;e.fillStyle="rgba(0,0,0,.25)",e.beginPath(),e.ellipse(h+(i%2?d:-d),n,d*.6,d*.28,-.3,0,Math.PI*2),e.fill()}};u();let P=(l,e,r,a)=>{l.save(),l.translate(e,r),l.strokeStyle="#c9c9c9",l.lineWidth=a*.04;for(let c of[-1,1])l.beginPath(),l.moveTo(c*a*.3,-a*.3),l.lineTo(c*a*.6,0),l.stroke(),l.fillStyle="#c9c9c9",l.fillRect(c*a*.6-a*.08,-a*.02,a*.16,a*.04);l.fillStyle="#d9a441",l.fillRect(-a*.4,-a*.55,a*.8,a*.3),l.fillStyle="#e9e9e9",l.beginPath(),l.moveTo(-a*.3,-a*.55),l.lineTo(-a*.2,-a*.95),l.lineTo(a*.25,-a*.95),l.lineTo(a*.35,-a*.55),l.closePath(),l.fill(),l.fillStyle="#222",l.fillRect(-a*.08,-a*.85,a*.16,a*.12),l.restore()};return{resize(){t.reset(),u()},frame(l){let e=t.g;t.reset(),e.drawImage(g,0,0,t.w,t.h);let r=b();if(p.earth){let o=t.w*.78,h=t.h*.26+Math.sin(l*.05)*4,n=Math.min(t.w,t.h)*.07,d=e.createRadialGradient(o-n*.4,h-n*.4,n*.1,o,h,n);d.addColorStop(0,"#9fd3ff"),d.addColorStop(.6,"#2a6fd6"),d.addColorStop(1,"#0a2a66"),e.fillStyle=d,e.beginPath(),e.arc(o,h,n,0,Math.PI*2),e.fill(),e.fillStyle="rgba(255,255,255,.55)";for(let y=0;y<6;y++)e.fillRect(o-n*.6+y*n*.22,h-n*.2+Math.sin(y+l*.1)*n*.3,n*.3,n*.08);e.fillStyle="rgba(0,0,0,.75)",e.beginPath(),e.arc(o+n*.45,h+n*.1,n*1.02,0,Math.PI*2),e.fill()}P(e,t.w*.22,r+(t.h-r)*.3,Math.min(t.w,t.h)*.16);let a=t.w*.52,c=r+(t.h-r)*.22,f=Math.min(t.w,t.h)*.2;e.fillStyle="#ddd",e.fillRect(a,c-f,3,f),e.fillRect(a,c-f,f*.75,2);let i=f*.75;e.fillStyle=p.flag,e.beginPath(),e.moveTo(a+3,c-f+2);for(let o=0;o<=10;o++)e.lineTo(a+3+o/10*i,c-f+2+Math.sin(o*.9)*3);for(let o=10;o>=0;o--)e.lineTo(a+3+o/10*i,c-f*.55+Math.sin(o*.9)*3);e.closePath(),e.fill(),e.fillStyle="#fff",e.font=`900 ${f*.22}px Inter,Arial,sans-serif`,e.textAlign="center",e.fillText(m.copy.code,a+3+i/2,c-f*.69),e.fillStyle="rgba(0,0,0,.25)",e.beginPath(),e.ellipse(a+f*.4,c+4,f*.45,5,0,0,Math.PI*2),e.fill()}}}};export{T as default};
@@ -0,0 +1 @@
1
+ import{a as W}from"./chunk-4ZBXB36L.js";import{f as k}from"./chunk-HXSSPN2I.js";import"./chunk-URWX3LLV.js";var U={id:"neon-sign",name:"Neon Sign",description:"A buzzing neon sign on a back-alley wall. The tubes flicker and their light spills across the surface. Click it and it falters.",category:"Urban",kind:"2d",motion:"live",tags:["canvas","neon","night","urban","glow","retro","interactive"],layout:"bottom",codeInScene:!0,copy:{eyebrow:"Open 24/7, except this page",title:"Lights are on. Nobody's home.",message:"This page closed down a while ago. The rest of the street is still open.",actions:[{label:"Back to the main street",href:"/",variant:"primary"}]},params:{neon:"#ff2d95",neon2:"#2de2ff",wall:"#2a1a1d",mortar:"#130b0d",sub:"NOT FOUND",font:'"Inter",ui-sans-serif,system-ui,sans-serif',flicker:.5,surface:"brick"},theme:{bg:"#0d0709",accent:"#ff2d95","accent-fg":"#fff",fg:"#ffe9f3"},presetName:"Pink & Cyan",presets:{vegas:{name:"Vegas",eyebrow:"Welcome to fabulous",title:"What happens here stays lost.",params:{neon:"#ffcf3b",neon2:"#ff3b5c",sub:"NO JACKPOT",wall:"#24101a",mortar:"#120810"},theme:{accent:"#ffcf3b","accent-fg":"#1a0a00"}},arcade:{name:"Arcade",eyebrow:"Game over",params:{neon:"#3dff6b",neon2:"#b45cff",sub:"GAME OVER",surface:"tile",wall:"#141024",mortar:"#0a0814"},theme:{accent:"#3dff6b","accent-fg":"#02140a"}},pastel:{name:"Pastel Caf\xE9",params:{neon:"#ff7ab8",neon2:"#6bd6ff",sub:"SORRY!",surface:"tile",wall:"#e9e3f2",mortar:"#cfc6de",flicker:.2},theme:{bg:"#e9e3f2",fg:"#2a1a33",accent:"#ff4fa0","accent-fg":"#fff"}},bar:{name:"Dive Bar",eyebrow:"Last call",title:"Bar's closed. So is this page.",params:{neon:"#ff2a2a",neon2:"#2a6bff",sub:"CLOSED",wall:"#1a1410",mortar:"#0d0a08",flicker:.7},theme:{accent:"#ff2a2a","accent-fg":"#fff"}},motel:{name:"Motel",eyebrow:"No vacancy",title:"No rooms at this address.",params:{neon:"#ff3b1f",neon2:"#ffd23f",sub:"NO VACANCY",wall:"#1d1a24",mortar:"#0d0c12",font:'"Georgia",ui-serif,serif'},theme:{accent:"#ffd23f","accent-fg":"#1a0a00",bg:"#0b0a10"}},diner:{name:"Diner",eyebrow:"Kitchen closed",title:"We're all out of this page.",params:{neon:"#3dffb1",neon2:"#ff4fd8",sub:"EAT AT HOME",surface:"tile",wall:"#16302c",mortar:"#0a1615"},theme:{accent:"#3dffb1","accent-fg":"#002116",bg:"#081413"}},tokyo:{name:"Tokyo",eyebrow:"\u30DA\u30FC\u30B8\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093",params:{neon:"#ff2a3d",neon2:"#ffffff",sub:"\u898B\u3064\u304B\u308A\u307E\u305B\u3093",surface:"concrete",wall:"#1c1e24",mortar:"#101116"},theme:{accent:"#ff2a3d","accent-fg":"#fff",bg:"#0b0c10"}},blue:{name:"Blue Hour",params:{neon:"#4d7cff",neon2:"#b26bff",sub:"PAGE MISSING",wall:"#151a2a",mortar:"#0a0d16",flicker:.25},theme:{accent:"#7d9cff","accent-fg":"#050a1a",bg:"#080b14"}},broken:{name:"Busted",eyebrow:"Needs repair",title:"Half the letters are out. So is the page.",params:{neon:"#ff9a1f",neon2:"#ff4a4a",sub:"OUT OF ORDER",flicker:1},theme:{accent:"#ff9a1f","accent-fg":"#1a0a00"}}},setup(h){let l=h.params,n=W(h),o=h.random,S=h.copy.code||"404",u,T,C,b={x:0,y:0,w:0,h:0};function I(){let i=Math.ceil(n.w),s=Math.ceil(n.h);u=document.createElement("canvas");let e=Math.min(2,h.dpr);u.width=i*e,u.height=s*e;let t=u.getContext("2d");if(t.scale(e,e),t.fillStyle=l.mortar,t.fillRect(0,0,i,s),l.surface==="brick")for(let f=0,w=0;f<s+34;f+=34,w++)for(let m=w%2?-92/2:0;m<i+92;m+=92){let a=.82+o()*.3;t.fillStyle=$(l.wall,a),t.fillRect(m+3,f+3,86,28);for(let v=0;v<14;v++)t.fillStyle=`rgba(0,0,0,${o()*.18})`,t.fillRect(m+3+o()*82,f+3+o()*26,2+o()*6,1+o()*3)}else if(l.surface==="tile")for(let c=0;c<s+46;c+=46)for(let f=0;f<i+46;f+=46)t.fillStyle=$(l.wall,.9+o()*.2),t.fillRect(f+2,c+2,42,42),t.fillStyle="rgba(255,255,255,.05)",t.fillRect(f+2,c+2,42,3);else{t.fillStyle=l.wall,t.fillRect(0,0,i,s);for(let r=0;r<i*s/60;r++)t.fillStyle=`rgba(${o()>.5?"255,255,255":"0,0,0"},${o()*.06})`,t.fillRect(o()*i,o()*s,1+o()*2,1+o()*2);t.strokeStyle="rgba(0,0,0,.35)",t.lineWidth=2;for(let r=0;r<i;r+=240)t.beginPath(),t.moveTo(r,0),t.lineTo(r,s),t.stroke()}let d=t.createLinearGradient(0,0,0,s);d.addColorStop(0,"rgba(0,0,0,.45)"),d.addColorStop(.5,"rgba(0,0,0,.1)"),d.addColorStop(1,"rgba(0,0,0,.6)"),t.fillStyle=d,t.fillRect(0,0,i,s)}function P(){let i=Math.ceil(n.w),s=Math.ceil(n.h),e=Math.min(2,h.dpr),t=()=>{let a=document.createElement("canvas");return a.width=i*e,a.height=s*e,a.getContext("2d").scale(e,e),a};T=t(),C=t();let d=Math.min(i*.72,980),r=d/(S.length*.62);r=Math.min(r,s*.3);let c=i/2,f=s*.34,w=r*.2;b={x:c,y:f,w:d,h:r};let m=(a,v)=>{a.lineJoin="round",a.lineCap="round",a.textAlign="center",a.textBaseline="middle";let N=(x,B,O,R,g)=>{if(a.font=B,v){for(let[G,L,D]of[[g*9,.55,g*1.2],[g*3.5,.85,g],[0,1,g*.9]])a.shadowColor=R,a.shadowBlur=G,a.strokeStyle=k(R,L),a.lineWidth=D,a.strokeText(x,c,O);a.shadowBlur=0,a.strokeStyle="rgba(255,255,255,.85)",a.lineWidth=g*.32,a.strokeText(x,c,O)}else a.strokeStyle=k(R,.18),a.lineWidth=g,a.strokeText(x,c,O),a.strokeStyle="rgba(255,255,255,.08)",a.lineWidth=g*.3,a.strokeText(x,c,O)};N(S,`400 ${r}px ${l.font}`,f,l.neon,Math.max(3,r*.035)),N(l.sub,`600 ${w}px ${l.font}`,f+r*.62,l.neon2,Math.max(2,w*.09))};m(T.getContext("2d"),!1),m(C.getContext("2d"),!0)}let p=1,y=1,M=0;h.on("pointerdown",()=>{M=1.4});let A=()=>{n.reset(),I(),P()};A();let E=2;return{resize:A,frame(i,s){let e=n.g;n.reset(),M=Math.max(0,M-s);let t=l.flicker+M;s===0?(p=1,y=1):(i>E&&(E=i+.8+o()*(6-t*4),p=o()>.5?.15:.5),p+=(1-p)*Math.min(1,s*(6+o()*20)),o()<.02*t&&(p*=.3+o()*.5),y=.9+.1*Math.sin(i*50)+(o()<.008*t?-.7:0),y=Math.max(.15,y)),e.globalCompositeOperation="source-over",e.drawImage(u,0,0,n.w,n.h);let d=(r,c,f,w)=>{let m=e.createRadialGradient(b.x,f,0,b.x,f,w);m.addColorStop(0,k(r,.4*c)),m.addColorStop(.5,k(r,.12*c)),m.addColorStop(1,k(r,0)),e.globalCompositeOperation="lighter",e.fillStyle=m,e.fillRect(0,0,n.w,n.h)};d(l.neon,p,b.y,b.w*.75),d(l.neon2,y*.6,b.y+b.h*.62,b.w*.45),e.globalCompositeOperation="source-over",e.drawImage(T,0,0,n.w,n.h),e.globalCompositeOperation="lighter",e.save(),e.beginPath(),e.rect(0,0,n.w,b.y+b.h*.45),e.clip(),e.globalAlpha=p,e.drawImage(C,0,0,n.w,n.h),e.restore(),e.save(),e.beginPath(),e.rect(0,b.y+b.h*.45,n.w,n.h),e.clip(),e.globalAlpha=y,e.drawImage(C,0,0,n.w,n.h),e.restore(),e.globalAlpha=1,e.globalCompositeOperation="source-over"}}}};function $(h,l){let n=parseInt(h.slice(1),16),o=Math.min(255,(n>>16&255)*l),S=Math.min(255,(n>>8&255)*l),u=Math.min(255,(n&255)*l);return`rgb(${o|0},${S|0},${u|0})`}export{U as default};
@@ -0,0 +1,49 @@
1
+ import"./chunk-URWX3LLV.js";var e=t=>t.replace(/[&<>"]/g,n=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;"})[n]),c={id:"newspaper",name:"Extra! Extra!",description:"A front page spins onto the screen like an old movie montage: page vanishes without a trace, with witness quotes and a halftone photo.",category:"Paper & Print",kind:"2d",motion:"live",tags:["dom","print","newspaper","vintage","funny","light","editorial"],layout:"none",copy:{eyebrow:"Late edition",title:"Page vanishes without a trace",message:"Authorities are baffled after a visitor clicked a link and found nothing on the other side. The homepage remains open for business.",actions:[{label:"Continue on the homepage",href:"/",variant:"primary"},{label:"Contact the newsroom",href:"/contact",variant:"secondary"}]},params:{masthead:"The Daily 404",headline:"",paper:"#f3eee2",ink:"#1b1a17",spot:"#b3261e",spin:!0},theme:{bg:"#2b2a27",fg:"#1b1a17"},presetName:"Morning Edition",presets:{gazette:{name:"Old Gazette",params:{masthead:"The 404 Gazette",paper:"#e8dcc0",ink:"#2b2014",spot:"#6b2a14"},theme:{bg:"#3a2d1c"}},tech:{name:"Tech Daily",title:"Startup's page pivots out of existence",message:"Sources close to the URL say the page 'moved fast and broke things', mostly itself.",params:{masthead:"The Daily Bug",paper:"#f4f6f8",ink:"#0f172a",spot:"#2563eb"},theme:{bg:"#0f172a"}},sports:{name:"Sports Final",title:"Page fumbles at the one-yard line",message:"A heartbreaking 404 for fans who had already clicked. The homepage remains undefeated.",params:{masthead:"Sports 404",paper:"#fffdf5",ink:"#111",spot:"#16a34a"},theme:{bg:"#14532d"}},tabloid:{name:"Tabloid",title:"Page abducted by aliens!",message:"Shocking new evidence suggests the page you requested was beamed up moments before you arrived.",params:{masthead:"The Weekly Lost",paper:"#ffffff",ink:"#111",spot:"#e3061a"},theme:{bg:"#ffd400"}},pink:{name:"Financial Pink",title:"Page value plunges to zero",message:"Markets react as the requested page delists overnight. Analysts recommend moving to the homepage.",params:{masthead:"The 404 Times",paper:"#fbe3d0",ink:"#262626",spot:"#0d5a8c"},theme:{bg:"#3a2f2a"}},noir:{name:"Noir",params:{masthead:"Evening Shadow",paper:"#d9d4c7",ink:"#0d0d0d",spot:"#0d0d0d",spin:!0},theme:{bg:"#0d0d0d"}}},css:`
2
+ & .np-wrap{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;padding:clamp(10px,3cqw,40px);perspective:1200px;overflow:hidden;
3
+ background:radial-gradient(ellipse at 50% 40%,color-mix(in srgb,var(--lp-bg) 70%,#fff),var(--lp-bg) 70%)}
4
+ & .np{width:min(980px,100%);max-height:100%;overflow:hidden;background:var(--paper);color:var(--ink);padding:clamp(16px,2.6cqw,36px) clamp(16px,3cqw,44px);
5
+ font-family:"Times New Roman",Georgia,ui-serif,serif;box-shadow:0 30px 80px -20px rgba(0,0,0,.55);position:relative;transform-origin:50% 50%}
6
+ & .np::before{content:"";position:absolute;inset:0;pointer-events:none;opacity:.5;mix-blend-mode:multiply;
7
+ background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='200' height='200'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.8' numOctaves='3'/%3E%3CfeColorMatrix values='0 0 0 0 .5 0 0 0 0 .45 0 0 0 0 .35 0 0 0 .35 0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E")}
8
+ & .np-top{display:flex;justify-content:space-between;font:600 11px/1.2 var(--lp-font);letter-spacing:.16em;text-transform:uppercase;border-bottom:1px solid var(--ink);padding-bottom:6px}
9
+ & .np-mast{font-family:"Old English Text MT","UnifrakturMaguntia","Engravers MT",Georgia,serif;font-size:clamp(34px,7cqw,84px);text-align:center;line-height:1;margin:.12em 0 .06em;font-weight:700;letter-spacing:-.01em}
10
+ & .np-rule{border-top:3px double var(--ink);border-bottom:1px solid var(--ink);height:5px;margin:4px 0 10px}
11
+ & .np-extra{display:flex;align-items:center;gap:14px;justify-content:center;margin:.2em 0 .1em}
12
+ & .np-extra span{background:var(--spot);color:var(--paper);font:900 clamp(12px,1.4cqw,16px)/1 var(--lp-font);letter-spacing:.3em;padding:.45em .8em}
13
+ & .np h1{font-size:clamp(30px,5.6cqw,70px);line-height:.95;text-align:center;margin:.1em 0 .18em;font-weight:900;text-transform:uppercase;letter-spacing:-.02em}
14
+ & .np .deck{text-align:center;font-style:italic;font-size:clamp(14px,1.6cqw,19px);margin:0 auto .8em;max-width:60ch}
15
+ & .np-cols{display:grid;grid-template-columns:1.25fr 1fr 1fr;gap:clamp(12px,2cqw,26px);border-top:1px solid var(--ink);padding-top:12px}
16
+ & .np-cols p{margin:0 0 .7em;font-size:clamp(11.5px,1.05cqw,14px);line-height:1.42;text-align:justify;hyphens:auto}
17
+ & .np-cols p:first-of-type::first-letter{float:left;font-size:3.4em;line-height:.8;padding:.06em .08em 0 0;font-weight:900}
18
+ & .np-photo{aspect-ratio:4/3;border:1px solid var(--ink);margin-bottom:6px;position:relative;overflow:hidden;
19
+ background:radial-gradient(circle at 50% 45%,var(--paper) 0 28%,transparent 29%),
20
+ radial-gradient(var(--ink) 34%,transparent 36%) 0 0/7px 7px,
21
+ linear-gradient(180deg,color-mix(in srgb,var(--ink) 15%,transparent),color-mix(in srgb,var(--ink) 55%,transparent))}
22
+ & .np-photo b{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;font:900 clamp(34px,6cqw,76px)/1 var(--lp-font);color:var(--ink)}
23
+ & .np-cap{font:italic 11px/1.3 var(--lp-font);margin-bottom:10px;opacity:.8}
24
+ & .np-q{font-size:clamp(15px,1.7cqw,20px)!important;line-height:1.2!important;font-weight:700;text-align:left!important;border-top:2px solid var(--ink);border-bottom:2px solid var(--ink);padding:.5em 0}
25
+ & .np a{color:var(--spot);font-weight:700}
26
+ & .np-act{display:flex;gap:12px;flex-wrap:wrap;margin-top:10px}
27
+ & .np-act a{font:700 12px/1 var(--lp-font);text-transform:uppercase;letter-spacing:.12em;padding:10px 14px;border:2px solid var(--ink);color:var(--ink);text-decoration:none;background:transparent}
28
+ & .np-act a:first-child{background:var(--ink);color:var(--paper)}
29
+ & .np.spin{animation:np-spin 1.5s cubic-bezier(.17,.84,.29,1.06) both}
30
+ @keyframes np-spin{from{transform:rotate(-1080deg) scale(.02)}to{transform:rotate(-1.2deg) scale(1)}}
31
+ & .np.idle{transform:rotate(-1.2deg)}
32
+ @container (max-width:760px){& .np-cols{grid-template-columns:1fr}& .np-cols>div:nth-child(3){display:none}}
33
+ @media (prefers-reduced-motion:reduce){& .np.spin{animation:none;transform:rotate(-1.2deg)}}
34
+ `,setup(t){let n=t.params,i=t.copy,s=typeof location<"u"?location.pathname:"/missing",l=new Date().toLocaleDateString(void 0,{weekday:"long",month:"long",day:"numeric",year:"numeric"}),a=document.createElement("div");a.className="np-wrap",a.style.setProperty("--paper",n.paper),a.style.setProperty("--ink",n.ink),a.style.setProperty("--spot",n.spot);let d=i.actions.map(r=>`<a href="${e(r.href??"/")}">${e(r.label)}</a>`).join("");a.innerHTML=`<article class="np ${n.spin?"spin":"idle"}">
35
+ <div class="np-top"><span>${e(l)}</span><span>Vol. ${e(i.code)} \xB7 No. ${e(i.code)}</span><span>Price: one click</span></div>
36
+ <div class="np-mast">${e(n.masthead)}</div><div class="np-rule"></div>
37
+ <div class="np-extra"><span>EXTRA</span><span>${e(i.eyebrow||"Breaking")}</span></div>
38
+ <h1><span class="lp-sr">Error ${e(i.code)}: </span>${e(n.headline||i.title)}</h1>
39
+ <p class="deck">${e(i.message)}</p>
40
+ <div class="np-cols">
41
+ <div><div class="np-photo"><b>${e(i.code)}</b></div><div class="np-cap">The scene at <em>${e(s)}</em>, moments after the disappearance.</div>
42
+ <p>It was an ordinary visit until the link was clicked. Witnesses describe a brief loading spinner, then nothing at all. The address was correct, the request polite, the server awake.</p></div>
43
+ <div><p>"I've been browsing for years and I've never seen anything like it," said one visitor, still holding the back button. "One second it's there, the next it's a four-oh-four."</p>
44
+ <p class="np-q">"The page you are looking for does not exist, may have moved, or was never here."</p>
45
+ <p>Engineers confirmed the page is not hiding in the cache.</p></div>
46
+ <div><p>Readers are urged to remain calm. Every other page is accounted for and the homepage reports no damage.</p>
47
+ <p>Anyone with information is asked to return to the front page, where a full investigation continues.</p>
48
+ <div class="np-act">${d}</div></div>
49
+ </div></article>`,t.root.append(a),a.querySelectorAll(".np-act a").forEach(r=>r.addEventListener("click",o=>{o.metaKey||o.ctrlKey||(o.preventDefault(),t.navigate(r.getAttribute("href"),o))}));let p=a.querySelector(".np");return{frame(r){r<1.6&&!t.reducedMotion||(p.classList.remove("spin"),p.style.transform=`rotate(${-1.2+t.pointer.sx*1.2}deg) translate(${t.pointer.sx*6}px, ${-t.pointer.sy*4}px)`)},destroy(){a.remove()}}}};export{c as default};
@@ -0,0 +1 @@
1
+ import{a as F}from"./chunk-4ZBXB36L.js";import{f as g}from"./chunk-HXSSPN2I.js";import"./chunk-URWX3LLV.js";var q={id:"nixie",name:"Nixie Tubes",description:"Warm cold-cathode tubes. The digits roll like a slot machine before settling on the error, and every glass envelope catches the light.",category:"Signs & Displays",kind:"2d",motion:"live",tags:["canvas","nixie","vintage","glow","electronics","warm","dark"],layout:"bottom",codeInScene:!0,copy:{eyebrow:"Readout",title:"The tubes are warm. The page is cold.",message:"Our instruments read 404, no matter how many times we let them roll. Let's take you somewhere that exists.",actions:[{label:"Return home",href:"/",variant:"primary"}]},params:{glow:"#ff7a1f",core:"#ffe1b8",bg:"#0b0806",table:"#1a120d",metal:"#5a4a3c",roll:11},theme:{bg:"#0b0806",fg:"#ffe9d2",accent:"#ff8a33","accent-fg":"#1a0a00"},presetName:"Neon Orange",presets:{ice:{name:"Cold Cathode",params:{glow:"#5ac8ff",core:"#e6f7ff",bg:"#03070c",table:"#08111c",metal:"#3a4a5a"},theme:{bg:"#03070c",accent:"#5ac8ff","accent-fg":"#03070c"}},magenta:{name:"Magenta",params:{glow:"#ff3bd4",core:"#ffe6f8",bg:"#0a0309",table:"#160915",metal:"#4a3550"},theme:{bg:"#0a0309",accent:"#ff7ae0","accent-fg":"#1a0016"}},white:{name:"Incandescent",params:{glow:"#ffd9a8",core:"#ffffff",bg:"#100b07",table:"#2a1d12",metal:"#6b5a48"},theme:{bg:"#100b07",accent:"#ffe6c7","accent-fg":"#1a0d00"}},argon:{name:"Argon",params:{glow:"#8c6bff",core:"#efe6ff",bg:"#07060d",table:"#120f1d",metal:"#4a4560"},theme:{bg:"#07060d",accent:"#b9a3ff","accent-fg":"#0d0820"}},vfd:{name:"VFD Green",eyebrow:"Display",params:{glow:"#2bffc6",core:"#e6fff7",bg:"#020807",table:"#06130f",metal:"#2f4a42"},theme:{bg:"#020807",accent:"#2bffc6","accent-fg":"#002116"}},ruby:{name:"Ruby",params:{glow:"#ff2a3a",core:"#ffd9dc",bg:"#0a0405",table:"#160a0b",metal:"#4d3536"},theme:{bg:"#0a0405",accent:"#ff5864","accent-fg":"#1a0004"}},brass:{name:"Brass & Walnut",params:{glow:"#ff9a3c",core:"#fff0d6",bg:"#140c06",table:"#3a2412",metal:"#b08a4a"},theme:{bg:"#140c06",accent:"#ffb066","accent-fg":"#1a0c00"}}},setup(r){let l=r.params,a=F(r),h=[...r.copy.code||"404"].slice(0,6),m=h.length,p=h.map(()=>"0"),H=h.map((e,t)=>1.4+t*.45),D=l.roll,O=-10,G=-1,W={tw:0,th:0,gap:0,x0:0,y0:0},N=()=>{let e=Math.min(a.w*.62/m,190,a.h*.26),t=e*1.78,c=e*.16,o=m*e+(m-1)*c;W={tw:e,th:t,gap:c,x0:(a.w-o)/2,y0:a.h*.36-t/2}};N(),r.on("pointermove",e=>{let t=r.root.getBoundingClientRect(),c=e.clientX-t.left,o=e.clientY-t.top,{tw:f,th:M,gap:S,x0:d,y0:s}=W;if(G=-1,o>s&&o<s+M)for(let i=0;i<m;i++)c>d+i*(f+S)&&c<d+i*(f+S)+f&&(G=i)});function J(e,t,c,o,f,M,S,d){let s=o/2,i=c+s;e.save(),e.beginPath(),e.moveTo(t,c+f),e.lineTo(t,i),e.arc(t+s,i,s,Math.PI,0),e.lineTo(t+o,c+f),e.closePath();let C=e.createLinearGradient(t,0,t+o,0);C.addColorStop(0,"rgba(255,255,255,.07)"),C.addColorStop(.5,"rgba(40,28,20,.35)"),C.addColorStop(1,"rgba(255,255,255,.05)"),e.fillStyle=C,e.fill(),e.clip(),e.strokeStyle=g(l.metal,.35),e.lineWidth=.7;let n=o/11;for(let b=0;b*n*.86<f;b++)for(let T=-1;T*n<o+n;T++){let B=t+T*n+(b%2?n/2:0),V=i-s*.4+b*n*.86;e.beginPath();for(let I=0;I<6;I++){let $=Math.PI/3*I+Math.PI/6,z=B+Math.cos($)*n*.5,Y=V+Math.sin($)*n*.5;I===0?e.moveTo(z,Y):e.lineTo(z,Y)}e.closePath(),e.stroke()}let u=o*.95,v=t+o/2,y=c+f*.53;e.textAlign="center",e.textBaseline="middle",e.lineJoin="round",e.font=`300 ${u}px "Helvetica Neue",Arial,sans-serif`;for(let b=0;b<10;b++)e.strokeStyle=g(l.metal,.22+b*.015),e.lineWidth=Math.max(1,u*.022),e.strokeText(String(b),v+(b-5)*.4,y+(b-5)*.3);let R=d;e.globalCompositeOperation="lighter";for(let[b,T,B]of[[u*.5,.35,u*.06],[u*.16,.75,u*.04],[u*.04,1,u*.028]])e.shadowColor=l.glow,e.shadowBlur=b,e.strokeStyle=g(l.glow,T*R),e.lineWidth=B,e.strokeText(M,v,y);e.shadowBlur=0,e.strokeStyle=g(l.core,.9*R),e.lineWidth=u*.012,e.strokeText(M,v,y);let L=e.createRadialGradient(v,y,0,v,y,o);L.addColorStop(0,g(l.glow,.16*R)),L.addColorStop(1,g(l.glow,0)),e.fillStyle=L,e.fillRect(t,c,o,f),e.globalCompositeOperation="source-over",e.restore(),e.save(),e.globalCompositeOperation="lighter";let k=e.createLinearGradient(t+o*.12,0,t+o*.26,0);k.addColorStop(0,"rgba(255,255,255,0)"),k.addColorStop(.5,"rgba(255,255,255,.16)"),k.addColorStop(1,"rgba(255,255,255,0)"),e.fillStyle=k,e.fillRect(t+o*.12,i-s*.3,o*.14,f-s*.8),e.fillStyle="rgba(255,255,255,.07)",e.fillRect(t+o*.78,i,o*.05,f-s*1.4),e.fillStyle="rgba(255,255,255,.12)",e.beginPath(),e.arc(t+s,c+2,o*.035,0,Math.PI*2),e.fill(),e.restore();let P=c+f,A=e.createLinearGradient(0,P,0,P+o*.32);A.addColorStop(0,w(l.metal,1.1)),A.addColorStop(1,w(l.metal,.45)),e.fillStyle=A,X(e,t-o*.06,P-o*.05,o*1.12,o*.32,o*.06),e.fill(),e.fillStyle="rgba(255,255,255,.18)",e.fillRect(t-o*.04,P-o*.04,o*1.08,1.2)}return{resize(){a.reset(),N()},frame(e){let t=a.g;a.reset(),t.fillStyle=l.bg,t.fillRect(0,0,a.w,a.h);let{tw:c,th:o,gap:f,x0:M,y0:S}=W,d=S+o+c*.27,s=t.createLinearGradient(0,d,0,a.h);s.addColorStop(0,w(l.table,1.25)),s.addColorStop(1,w(l.table,.5)),t.fillStyle=s,t.fillRect(0,d,a.w,a.h-d);let i=t.createRadialGradient(a.w/2,S+o*.55,0,a.w/2,S+o*.55,a.w*.5);i.addColorStop(0,g(l.glow,.13)),i.addColorStop(1,g(l.glow,0)),t.fillStyle=i,t.fillRect(0,0,a.w,a.h),!r.reducedMotion&&e>D&&(O=e,D=e+l.roll);for(let n=0;n<m;n++){let u=r.reducedMotion||e>H[n],v=!r.reducedMotion&&e-O<1.1+n*.25,y=h[n];(!u||v||G===n)&&/\d/.test(y)?Math.floor(e*18+n*3)!==Math.floor((e-1/60)*18+n*3)&&(p[n]=String(Math.floor(Math.random()*10))):p[n]=y;let R=r.reducedMotion?1:.93+.07*Math.sin(e*90+n*7)*Math.sin(e*13+n);J(t,M+n*(c+f),S,c,o,p[n],e,R)}t.save(),t.globalAlpha=.18,t.translate(0,d*2+c*.06),t.scale(1,-1),t.beginPath(),t.rect(0,d,a.w,o),t.clip(),t.drawImage(a.canvas,0,0,a.canvas.width,a.canvas.height,0,0,a.w,a.h),t.restore();let C=t.createLinearGradient(0,d,0,d+o*.6);C.addColorStop(0,g(w(l.table,1.25),0)),C.addColorStop(1,w(l.table,.8)),t.fillStyle=C,t.fillRect(0,d,a.w,o*.6+2)}}}};function w(r,l){if(r.startsWith("rgb"))return r;let a=parseInt(r.slice(1),16),h=Math.min(255,(a>>16&255)*l),m=Math.min(255,(a>>8&255)*l),p=Math.min(255,(a&255)*l);return`rgb(${h|0},${m|0},${p|0})`}function X(r,l,a,h,m,p){r.beginPath(),r.moveTo(l+p,a),r.arcTo(l+h,a,l+h,a+m,p),r.arcTo(l+h,a+m,l,a+m,p),r.arcTo(l,a+m,l,a,p),r.arcTo(l,a,l+h,a,p),r.closePath()}export{q as default};
@@ -0,0 +1,82 @@
1
+ import{a as T}from"./chunk-LMRCHEWX.js";import{a as x,c as y,h as w,i as S}from"./chunk-QJZBGT2Q.js";import{b as c}from"./chunk-IETNWEVK.js";import"./chunk-URWX3LLV.js";var k={static:0,bars:1,blue:2,nosignal:3},A=`
2
+ uniform sampler2D uOSD;
3
+ uniform float uMode, uSwitch, uCurve, uPhos;
4
+ ${x}
5
+ ${y}
6
+
7
+ vec3 bars(vec2 uv) {
8
+ vec3 top[7] = vec3[7](vec3(.75), vec3(.75,.75,0.), vec3(0.,.75,.75), vec3(0.,.75,0.), vec3(.75,0.,.75), vec3(.75,0.,0.), vec3(0.,0.,.75));
9
+ int i = int(clamp(floor(uv.x * 7.0), 0.0, 6.0));
10
+ if (uv.y > 0.33) return top[i];
11
+ if (uv.y > 0.25) {
12
+ vec3 mid[7] = vec3[7](vec3(0.,0.,.75), vec3(.07), vec3(.75,0.,.75), vec3(.07), vec3(0.,.75,.75), vec3(.07), vec3(.75));
13
+ return mid[i];
14
+ }
15
+ float x = uv.x;
16
+ if (x < 0.18) return vec3(0.0, 0.13, 0.3);
17
+ if (x < 0.36) return vec3(1.0);
18
+ if (x < 0.54) return vec3(0.2, 0.0, 0.4);
19
+ if (x < 0.71) return vec3(0.07);
20
+ if (x < 0.76) return vec3(0.03);
21
+ if (x < 0.81) return vec3(0.07);
22
+ if (x < 0.86) return vec3(0.11);
23
+ return vec3(0.07);
24
+ }
25
+
26
+ vec3 staticNoise(vec2 uv, vec2 fc, float t) {
27
+ float line = floor(fc.y / 2.0);
28
+ float jitter = (hash12(vec2(line, floor(t * 30.0))) - 0.5) * 6.0;
29
+ float n = hash12(floor(vec2(fc.x + jitter, fc.y) / 1.5) + floor(t * 60.0) * 17.31);
30
+ float roll = smoothstep(0.0, 0.15, fract(uv.y * 0.6 - t * 0.35)) * 0.25 + 0.75;
31
+ return vec3(n * roll);
32
+ }
33
+
34
+ vec3 content(vec2 uv, vec2 fc, float t) {
35
+ if (uMode < 0.5) return staticNoise(uv, fc, t);
36
+ if (uMode < 1.5) return bars(uv) + (hash12(fc + t) - 0.5) * 0.04;
37
+ if (uMode < 2.5) return vec3(0.02, 0.05, 0.75) + (hash12(fc * 0.5 + t) - 0.5) * 0.02;
38
+ return vec3(0.0);
39
+ }
40
+
41
+ void main() {
42
+ vec2 fc = gl_FragCoord.xy;
43
+ vec2 uv = fc / uRes;
44
+ float t = uTime;
45
+ // barrel distortion
46
+ vec2 c = uv * 2.0 - 1.0;
47
+ c *= 1.0 + uCurve * dot(c.yx, c.yx) * vec2(0.06, 0.09);
48
+ vec2 cuv = c * 0.5 + 0.5;
49
+ float edge = smoothstep(0.0, 0.006, cuv.x) * smoothstep(1.0, 0.994, cuv.x) * smoothstep(0.0, 0.008, cuv.y) * smoothstep(1.0, 0.992, cuv.y);
50
+
51
+ // channel switch: vertical roll + static burst
52
+ float sw = clamp(uSwitch / 0.55, 0.0, 1.0);
53
+ vec2 suv = cuv;
54
+ suv.y = fract(suv.y + (1.0 - sw) * (1.0 - sw) * 1.7);
55
+ vec3 col = content(suv, fc, t);
56
+ vec4 osd = texture(uOSD, suv);
57
+ col = mix(col, osd.rgb, osd.a);
58
+ col = mix(staticNoise(cuv, fc, t), col, smoothstep(0.0, 1.0, sw));
59
+
60
+ // horizontal sync wobble
61
+ col *= 0.94 + 0.06 * sin(cuv.y * 900.0 + t * 8.0);
62
+ // scanlines + aperture grille
63
+ float scan = 0.72 + 0.28 * sin(fc.y * 3.14159 * 0.5) * sin(fc.y * 3.14159 * 0.5);
64
+ vec3 mask = vec3(1.0);
65
+ float m = mod(fc.x, 3.0);
66
+ mask = m < 1.0 ? vec3(1.0, 0.75, 0.75) : m < 2.0 ? vec3(0.75, 1.0, 0.75) : vec3(0.75, 0.75, 1.0);
67
+ col *= scan * mix(vec3(1.0), mask, 0.6);
68
+ // phosphor tint for mono monitors
69
+ float lum = dot(col, vec3(0.3, 0.59, 0.11));
70
+ if (uPhos > 0.5 && uPhos < 1.5) col = vec3(0.2, 1.0, 0.35) * lum * 1.3;
71
+ if (uPhos > 1.5) col = vec3(1.0, 0.65, 0.1) * lum * 1.3;
72
+ // glow, flicker, vignette
73
+ col += col * col * 0.35;
74
+ col *= 0.97 + 0.03 * sin(t * 120.0);
75
+ col *= mix(0.45, 1.0, vignette(cuv, 0.35));
76
+ col *= edge;
77
+ fragColor = vec4(col, 1.0);
78
+ }
79
+ `,$={id:"no-signal",name:"No Signal",description:"An old CRT television: static, test cards and blue VCR screens. Click to change the channel.",category:"Retro Tech",kind:"2d",motion:"live",tags:["webgl","crt","tv","static","retro","vhs","interactive"],layout:"bottom",codeInScene:!0,copy:{eyebrow:"Channel 404",title:"We've lost the signal.",message:"This channel isn't broadcasting. Click the screen to flip channels, or tune back in to the homepage.",actions:[{label:"Tune in to home",href:"/",variant:"primary"}]},params:{channels:["static","bars","blue","nosignal"],hold:3.5,curvature:1,osd:"#3dff6e",phosphor:"color"},theme:{bg:"#000000",fg:"#f2f2f2",accent:"#f2f2f2","accent-fg":"#000","font-display":"var(--lp-font-mono)","title-weight":"700"},presetName:"Channel Surf",presets:{flat:{name:"Flat Panel",params:{curvature:0,channels:["nosignal","bars"]}},surf:{name:"Fast Surf",params:{hold:1.4}},static:{name:"Static",params:{channels:["static"],hold:0}},"test-card":{name:"Test Card",eyebrow:"Please stand by",title:"Technical difficulties.",params:{channels:["bars"],hold:0}},vcr:{name:"VCR Blue",eyebrow:"Tracking",title:"Nothing recorded here.",message:"The tape for this page is blank. Rewind to the homepage.",params:{channels:["blue"],hold:0,osd:"#ffffff"}},green:{name:"Green Monitor",params:{phosphor:"green",channels:["nosignal","static","bars"]},theme:{accent:"#3dff6e",fg:"#c9ffd6"}},amber:{name:"Amber Monitor",params:{phosphor:"amber",channels:["nosignal","static","bars"]},theme:{accent:"#ffb000",fg:"#ffe4b0"}}},css:`& .lp-body{background:linear-gradient(180deg,transparent,rgba(0,0,0,.72) 30%);padding:28px 32px 6px;border-radius:14px}
80
+ & .lp-title{letter-spacing:-.01em;text-transform:uppercase;font-size:clamp(24px,3.6cqw,44px)}
81
+ & .lp-message{color:rgba(255,255,255,.75)}
82
+ & .lp-eyebrow{color:#fff;opacity:.8}`,setup(a){let o=a.params,n=o.channels.length?o.channels:["static"],s=0,u=-10,v=0,l=document.createElement("canvas"),i=null,h,r=a.copy.code||"404";function m(t,f){l.width=1024,l.height=768;let e=l.getContext("2d");if(e.clearRect(0,0,1024,768),e.font=`700 44px ${c}`,e.textBaseline="top",e.shadowColor="rgba(0,0,0,.8)",e.shadowOffsetX=3,e.shadowOffsetY=3,e.fillStyle=o.osd,e.textAlign="right",e.fillText(`CH ${r}`,954,60),e.textAlign="left",t==="blue")e.fillStyle="#fff",e.fillText("PLAY \u25B6",70,60),e.font=`700 32px ${c}`,e.fillText(`SP 0:${r.slice(0,2)}:${r.slice(-2)}`,70,658),e.textAlign="center",e.font=`700 150px ${c}`,e.fillText(r,1024/2,768*.33);else if(t==="nosignal"){let g=(Math.sin(f*.7)*.5+.5)*604+40,b=(Math.sin(f*.53+1)*.5+.5)*508+40;e.strokeStyle=o.osd,e.lineWidth=4,e.strokeRect(g,b,340,120),e.textAlign="center",e.font=`700 46px ${c}`,e.fillText("NO SIGNAL",g+170,b+36)}else t==="bars"?(e.textAlign="center",e.fillStyle="#000",e.shadowColor="transparent",e.fillRect(1024/2-170,768*.36,340,120),e.fillStyle="#fff",e.font=`700 92px ${c}`,e.fillText(r,1024/2,768*.37)):(e.textAlign="center",e.font=`700 64px ${c}`,e.fillText(r,1024/2,768*.36));i&&S(h,i,l,{filter:"linear"})}let p=()=>{s=(s+1)%n.length,u=v,m(n[s],v)};a.on("pointerdown",t=>{t.target.closest("a,button")||p()});let C=T(a,{frag:A,adaptive:!1,init(t){h=t,m(n[0],0),i=w(h,l,{filter:"linear"})},uniforms:t=>({uOSD:i,uMode:k[n[s]],uSwitch:t-u,uCurve:o.curvature,uPhos:o.phosphor==="green"?1:o.phosphor==="amber"?2:0})}),d=0;return{frame(t,f){v=t,o.hold>0&&n.length>1&&t-u>o.hold&&!a.reducedMotion&&p(),n[s]==="nosignal"&&t-d>1/30&&(d=t,m("nosignal",t)),C.frame(t,f)}}}};export{$ as default};
@@ -0,0 +1,49 @@
1
+ import{a as g}from"./chunk-LMRCHEWX.js";import{a as s,b as m,h as d}from"./chunk-QJZBGT2Q.js";import{d as n}from"./chunk-HXSSPN2I.js";import{a as c,e as f}from"./chunk-IETNWEVK.js";import"./chunk-URWX3LLV.js";var h=`
2
+ uniform sampler2D uText;
3
+ uniform vec3 uDark, uLight;
4
+ uniform float uPix;
5
+ ${s}
6
+ ${m}
7
+ float bayer(vec2 p) {
8
+ ivec2 q = ivec2(mod(p, 8.0));
9
+ int m[64] = int[64](0,32,8,40,2,34,10,42,48,16,56,24,50,18,58,26,12,44,4,36,14,46,6,38,60,28,52,20,62,30,54,22,3,35,11,43,1,33,9,41,51,19,59,27,49,17,57,25,15,47,7,39,13,45,5,37,63,31,55,23,61,29,53,21);
10
+ return (float(m[q.y * 8 + q.x]) + 0.5) / 64.0;
11
+ }
12
+ void main() {
13
+ vec2 cell = floor(gl_FragCoord.xy / uPix);
14
+ vec2 fc = cell * uPix + uPix * 0.5;
15
+ vec2 uv = fc / uRes;
16
+ vec2 p = (fc - 0.5 * uRes) / uRes.y;
17
+ float t = uTime;
18
+ vec3 L = normalize(vec3(-0.5 + uMouse.x * 0.8, 0.5 + uMouse.y * 0.5, 0.7));
19
+ // background: a soft vertical gradient
20
+ float lum = 0.03 + 0.09 * (p.y + 0.5);
21
+ // a globe with continents, lit from the pointer side
22
+ vec2 gc = vec2(0.5 * uRes.x / uRes.y - 0.3, 0.1);
23
+ vec2 d = p - gc;
24
+ float R = 0.24;
25
+ if (length(d) < R) {
26
+ vec3 n = vec3(d / R, sqrt(max(1.0 - dot(d, d) / (R * R), 0.0)));
27
+ float a = t * 0.15;
28
+ vec3 q = vec3(n.x * cos(a) - n.z * sin(a), n.y, n.x * sin(a) + n.z * cos(a));
29
+ float land = step(0.52, fbm3(q * 2.2 + 3.0));
30
+ float dif = max(dot(n, L), 0.0);
31
+ lum = dif * (land > 0.5 ? 0.95 : 0.55) + 0.04;
32
+ }
33
+ // orbit ring
34
+ vec2 od = d / vec2(1.0, 0.22);
35
+ float ring = smoothstep(0.012, 0.0, abs(length(od) - R * 1.45)) * step(0.0, -d.y + (length(d) < R ? -1.0 : 1.0) * 0.0);
36
+ if (length(d) > R || d.y < 0.0) lum = max(lum, ring * 0.9);
37
+ // satellite
38
+ float sa = t * 0.6;
39
+ vec2 sp = gc + vec2(cos(sa) * R * 1.45, sin(sa) * R * 1.45 * 0.22);
40
+ lum = max(lum, step(length(p - sp), 0.012) * (sin(sa) < 0.0 || length(p - gc) > R ? 1.0 : 0.0));
41
+ // the code, shaded with a vertical gradient
42
+ float txt = texture(uText, uv).a;
43
+ if (txt > 0.5) lum = 0.35 + 0.6 * smoothstep(0.1, 0.9, uv.y + 0.2 * sin(t + uv.x * 3.0));
44
+ // stars
45
+ lum = max(lum, step(0.996, hash12(cell)) * 0.9);
46
+ float on = step(bayer(cell), lum);
47
+ fragColor = vec4(mix(uDark, uLight, on), 1.0);
48
+ }
49
+ `,y={id:"one-bit",name:"One Bit",description:"Everything in two colours with ordered dithering, like an early Mac or a pocket console. A little globe turns and the light follows your pointer.",category:"Retro Tech",kind:"3d",motion:"live",tags:["webgl","dither","1-bit","retro","pixel","monochrome","mac"],layout:"bottom-left",codeInScene:!0,copy:{eyebrow:"Error 404",title:"The page could not be found.",message:"It may have been moved, renamed, or ejected along with the disk.",actions:[{label:"Restart at home",href:"/",variant:"primary"}]},params:{dark:"#1b1b1b",light:"#f2efe6",pixel:3},theme:{bg:"#1b1b1b",fg:"#f2efe6",accent:"#f2efe6","accent-fg":"#1b1b1b","font-display":'"Chicago","ChicagoFLF","Geneva",var(--lp-font-mono)',radius:"0"},presetName:"Classic",presets:{pocket:{name:"Pocket Console",params:{dark:"#0f380f",light:"#9bbc0f",pixel:4},theme:{bg:"#0f380f",fg:"#9bbc0f",accent:"#9bbc0f","accent-fg":"#0f380f"}},amber:{name:"Amber Terminal",params:{dark:"#120a00",light:"#ffb000",pixel:3},theme:{bg:"#120a00",fg:"#ffb000",accent:"#ffb000","accent-fg":"#120a00"}},paper:{name:"Paper",params:{dark:"#f2efe6",light:"#1b1b1b",pixel:2},theme:{bg:"#f2efe6",fg:"#1b1b1b",accent:"#1b1b1b","accent-fg":"#f2efe6"}},ice:{name:"Ice Blue",params:{dark:"#0a1a3a",light:"#bfe7ff",pixel:3},theme:{bg:"#0a1a3a",fg:"#bfe7ff",accent:"#bfe7ff","accent-fg":"#0a1a3a"}}},setup(i){let r=i.params,t=document.createElement("canvas"),o=null,e,l=()=>{t.width=1024,t.height=Math.max(64,Math.round(1024*i.height/Math.max(1,i.width)));let a=t.getContext("2d");a.clearRect(0,0,t.width,t.height),a.save(),a.translate(t.width*.05,t.height*.12),f(a,i.copy.code||"404",{width:t.width*.5,height:t.height*.4,font:c,weight:900,fit:.9,cx:.4}),a.restore(),o&&(e.bindTexture(e.TEXTURE_2D,o),e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t),e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL,!1))};return{...g(i,{frag:h,adaptive:!1,init(a){e=a,l(),o=d(e,t,{filter:"nearest"})},uniforms:()=>({uText:o,uDark:n(r.dark),uLight:n(r.light),uPix:Math.round(r.pixel*Math.min(2,i.dpr))})}),resize:l}}};export{y as default};
@@ -0,0 +1,9 @@
1
+ import{a}from"./chunk-A44JMJWI.js";import"./chunk-QHXVYCR6.js";import"./chunk-URWX3LLV.js";var o={id:"outline-404",name:"Outline",description:"A giant outlined 404 sits behind a short, bold headline. One of the most common agency and portfolio looks, done with pure CSS.",category:"Simple",kind:"2d",motion:"static",tags:["simple","outline","stroke","typography","static","fast","portfolio"],layout:"center",copy:{eyebrow:"Error 404",title:"Oops! Nothing here.",message:"The page you\u2019re after has moved, been renamed or never existed.",actions:[{label:"Back to homepage",href:"/"}]},params:{stroke:2,fade:.7},theme:{bg:"#0d0d0f",fg:"#f4f4f5",accent:"#f4f4f5","accent-fg":"#0d0d0f"},presetName:"Night",presets:{paper:{name:"Paper",theme:{bg:"#f5f3ee",fg:"#141414",accent:"#141414","accent-fg":"#f5f3ee"}},lime:{name:"Lime",params:{stroke:3},theme:{bg:"#101010",fg:"#d9f99d",accent:"#bef264","accent-fg":"#101010"}},blue:{name:"Cobalt",theme:{bg:"#1d3bd8",fg:"#ffffff",accent:"#ffffff","accent-fg":"#1d3bd8"}}},css:`
2
+ & .ol{position:absolute;inset:0;display:grid;place-items:center;pointer-events:none;overflow:hidden}
3
+ & .ol span{font-family:var(--lp-font-display);font-weight:900;font-size:clamp(170px,42cqw,620px);line-height:1;letter-spacing:-.04em;white-space:nowrap;
4
+ color:transparent;-webkit-text-stroke:var(--sw) color-mix(in srgb,var(--lp-fg) 32%,transparent);
5
+ -webkit-mask-image:linear-gradient(180deg,#000 20%,rgba(0,0,0,calc(1 - var(--fade))));mask-image:linear-gradient(180deg,#000 20%,rgba(0,0,0,calc(1 - var(--fade))))}
6
+ & .lp-code{display:none}
7
+ & .lp-title{font-weight:800;font-size:clamp(30px,5.4cqw,68px)}
8
+ & .lp-eyebrow{color:var(--lp-fg);opacity:.7}
9
+ `,setup(t){let e=document.createElement("div");return e.className="ol",e.setAttribute("aria-hidden","true"),e.style.setProperty("--sw",t.params.stroke+"px"),e.style.setProperty("--fade",String(t.params.fade)),e.innerHTML=`<span>${a(t.copy.code)}</span>`,t.stage.append(e),{destroy:()=>e.remove()}}};export{o as default};
@@ -0,0 +1 @@
1
+ import{a as S}from"./chunk-4ZBXB36L.js";import{a as P,f as v}from"./chunk-IETNWEVK.js";import"./chunk-URWX3LLV.js";var I={id:"paint-splash",name:"Paint Splash",description:"Splats of paint fly at a white wall until the error is painted in drips and spatter. Click to throw a splat of your own.",category:"Playful",kind:"2d",motion:"live",tags:["canvas","paint","splatter","art","colorful","interactive","light"],layout:"bottom",codeInScene:!0,copy:{eyebrow:"Wet paint",title:"We painted over this page.",message:"Someone redecorated and the page didn't survive. Throw some paint if it helps.",actions:[{label:"Back to the gallery",href:"/",variant:"primary"}]},params:{wall:"#f7f5f0",paints:["#ff3b5c","#ffb000","#1fb5ff","#7a3dff","#16c47f"]},theme:{bg:"#f7f5f0",fg:"#1a1a1a",accent:"#1a1a1a","accent-fg":"#fff"},presetName:"Primary",presets:{mono:{name:"Black Ink",params:{paints:["#111111","#2a2a2a","#444444"]}},neon:{name:"Neon on Black",params:{wall:"#0b0b0d",paints:["#ff00e6","#00f0ff","#ffe600","#00ff85"]},theme:{bg:"#0b0b0d",fg:"#f2f2f2",accent:"#f2f2f2","accent-fg":"#0b0b0d"}},pastel:{name:"Pastel",params:{paints:["#ffb3c7","#a8d8ff","#ffe08a","#b8f0c8","#d6c2ff"]}},gold:{name:"Gold Leaf",params:{wall:"#14110d",paints:["#d4af37","#f5d76e","#b8860b"]},theme:{bg:"#14110d",fg:"#f7ecd0",accent:"#d4af37","accent-fg":"#14110d"}}},setup(i){let g=i.params,a=S(i),n=i.random,d,e,s=[],p=0,b=[],y=()=>{let f=Math.min(2,i.dpr);d=document.createElement("canvas"),d.width=a.w*f,d.height=a.h*f,e=d.getContext("2d"),e.scale(f,f),e.fillStyle=g.wall,e.fillRect(0,0,a.w,a.h);for(let l=0;l<a.w*a.h/40;l++)e.fillStyle=`rgba(0,0,0,${n()*.03})`,e.fillRect(n()*a.w,n()*a.h,2,2);let o=Math.min(a.w*.8,1e3),r=Math.min(o*.4,a.h*.42),t=v(i.copy.code||"404",{width:o,height:r,font:P,weight:900,fit:.95,step:Math.max(14,o/50),random:n});s=[];for(let l=0;l<t.length;l+=2)s.push([t[l]+(a.w-o)/2,t[l+1]+a.h*.38-r/2]);if(s.sort(()=>n()-.5),p=0,b=[],i.reducedMotion)for(;p<s.length;)w(s[p][0],s[p++][1],16,!0)},w=(f,o,r,t=!1)=>{let l=g.paints[Math.floor(n()*g.paints.length)];e.fillStyle=l,e.beginPath();let M=18;for(let c=0;c<=M;c++){let m=c/M*Math.PI*2,h=r*(.75+n()*.5);c?e.lineTo(f+Math.cos(m)*h,o+Math.sin(m)*h):e.moveTo(f+Math.cos(m)*h,o+Math.sin(m)*h)}e.fill();for(let c=0;c<(t?4:14);c++){let m=n()*Math.PI*2,h=r*(1.2+n()*2.5);e.beginPath(),e.arc(f+Math.cos(m)*h,o+Math.sin(m)*h,r*(.05+n()*.18),0,Math.PI*2),e.fill()}n()<.5&&b.push({x:f+(n()-.5)*r,y:o+r*.6,len:0,max:r*(1+n()*5),w:r*(.12+n()*.15),col:l})};y(),i.on("pointerdown",f=>{f.target.closest("a,button")||w(i.pointer.x,i.pointer.y,40+n()*30)});let u=0;return{resize(){a.reset(),y()},frame(f,o){let r=a.g;if(a.reset(),o>0){for(u+=o;u>.025&&p<s.length;){u-=.025;let[t,l]=s[p++];w(t,l,Math.max(10,a.w/90)*(.8+n()*.6))}for(let t of b){if(t.len>=t.max)continue;let l=30*o*(.5+n());e.fillStyle=t.col,e.fillRect(t.x-t.w/2,t.y+t.len,t.w,l+1),t.len+=l,t.len>=t.max&&(e.beginPath(),e.arc(t.x,t.y+t.len,t.w*.8,0,Math.PI*2),e.fill())}}r.drawImage(d,0,0,a.w,a.h)}}}};export{I as default};
@@ -0,0 +1,2 @@
1
+ import{a as S}from"./chunk-4ZBXB36L.js";import{f as P}from"./chunk-HXSSPN2I.js";import"./chunk-URWX3LLV.js";var C={id:"paper-plane",name:"Paper Plane",description:"Your page was folded into a paper plane and is now looping lazily through the clouds. Steer it with the pointer.",category:"Playful",kind:"2d",motion:"live",tags:["canvas","paper","sky","clouds","light","calm","interactive"],layout:"bottom",codeInScene:!1,copy:{eyebrow:"Took off",title:"This page flew away.",message:"Someone folded it into a plane and let it go. It's somewhere above the clouds now.",actions:[{label:"Land at home",href:"/",variant:"primary"}]},params:{skyTop:"#8fc9ff",skyBottom:"#e8f5ff",plane:"#ffffff",cloud:"#ffffff",trail:"#ffffff"},theme:{bg:"#cbe6ff",fg:"#0d2238",accent:"#0d2238","accent-fg":"#fff","code-color":"rgba(13,34,56,.14)"},presetName:"Blue Sky",presets:{mint:{name:"Mint Sky",params:{skyTop:"#7fe3c0",skyBottom:"#e6fff6",cloud:"#ffffff",trail:"#ffffff"},theme:{bg:"#bdf2df",fg:"#06302a",accent:"#06302a","code-color":"rgba(6,48,42,.14)"}},sunset:{name:"Sunset",params:{skyTop:"#3a3a8a",skyBottom:"#ffb38a",cloud:"#ffd9c7",trail:"#ffe6d6"},theme:{bg:"#d98a8a",fg:"#2a0f1a",accent:"#2a0f1a","code-color":"rgba(42,15,26,.14)"}},night:{name:"Night Flight",params:{skyTop:"#050a1f",skyBottom:"#1d2a55",plane:"#f2f6ff",cloud:"#2a3a66",trail:"#9fb4ff"},theme:{bg:"#0d1530",fg:"#eef2ff",accent:"#eef2ff","accent-fg":"#0d1530","code-color":"rgba(238,242,255,.1)"}},notebook:{name:"Notebook",params:{skyTop:"#f7f4ec",skyBottom:"#f7f4ec",plane:"#ffffff",cloud:"#e3ecf7",trail:"#4a6fa5"},theme:{bg:"#f7f4ec",fg:"#1f2a3a",accent:"#1f2a3a","code-color":"rgba(31,42,58,.1)"}}},css:`& .lp-code{--lp-code-size:clamp(120px,20cqw,300px);font-weight:900;letter-spacing:-.06em}
2
+ & .lp-overlay{justify-content:center}`,setup(f){let l=f.params,a=S(f),p=f.random,k=[],d=[],c=0,m=0,h=0,T=()=>{k=Array.from({length:9},()=>({x:p()*a.w,y:p()*a.h*.8,s:.5+p()*1.2,v:.3+p()*.7})),c=a.w*.3,m=a.h*.3};T();let x=(n,r,e,i)=>{n.fillStyle=l.cloud;for(let[y,b,w]of[[0,0,40],[36,-14,46],[80,0,38],[40,12,40],[-30,10,30]])n.beginPath(),n.arc(r+y*i,e+b*i,w*i,0,Math.PI*2),n.fill()};return{resize(){a.reset(),T()},frame(n,r){let e=a.g;a.reset();let i=e.createLinearGradient(0,0,0,a.h);if(i.addColorStop(0,l.skyTop),i.addColorStop(1,l.skyBottom),e.fillStyle=i,e.fillRect(0,0,a.w,a.h),l.skyTop===l.skyBottom){e.strokeStyle="rgba(74,111,165,.18)";for(let t=40;t<a.h;t+=32)e.beginPath(),e.moveTo(0,t),e.lineTo(a.w,t),e.stroke();e.strokeStyle="rgba(220,60,60,.3)",e.beginPath(),e.moveTo(80,0),e.lineTo(80,a.h),e.stroke()}for(let t of k)t.x-=t.v*22*r,t.x<-200&&(t.x=a.w+200),e.globalAlpha=.55+.35*t.v,x(e,t.x,t.y,t.s);e.globalAlpha=1;let y=f.pointer.engaged?f.pointer.x:a.w*(.5+.3*Math.sin(n*.35)),b=f.pointer.engaged?f.pointer.y:a.h*(.35+.15*Math.sin(n*.7)+.08*Math.sin(n*1.9)),s=Math.atan2(b-m,y-c)-h;for(;s>Math.PI;)s-=Math.PI*2;for(;s<-Math.PI;)s+=Math.PI*2;h+=s*Math.min(1,r*2.2);let v=Math.min(a.w,a.h)*.32;r>0&&(c+=Math.cos(h)*v*r,m+=Math.sin(h)*v*r,d.push({x:c,y:m}),d.length>70&&d.shift()),e.strokeStyle=P(l.trail,.8),e.lineWidth=2,e.setLineDash([6,8]),e.beginPath(),d.forEach((t,g)=>g?e.lineTo(t.x,t.y):e.moveTo(t.x,t.y)),e.stroke(),e.setLineDash([]);let u=Math.max(-1,Math.min(1,s*2)),o=Math.max(28,Math.min(a.w,a.h)*.06);e.save(),e.translate(c,m),e.rotate(h),e.fillStyle="rgba(0,0,0,.08)",e.beginPath(),e.moveTo(o*1.1,18),e.lineTo(-o*.9,-o*.5+18),e.lineTo(-o*.6,18),e.lineTo(-o*.9,o*.5+18),e.closePath(),e.fill();let M=(t,g)=>{e.fillStyle=`rgb(${g},${g},${Math.min(255,g+6)})`,e.beginPath(),e.moveTo(o*1.1,0),e.lineTo(-o*.9,t*o*(.55-u*t*.2)),e.lineTo(-o*.6,0),e.closePath(),e.fill()};M(-1,Math.round(255-30*(1+u))),M(1,Math.round(255-30*(1-u))),e.strokeStyle="rgba(0,0,0,.18)",e.lineWidth=1,e.beginPath(),e.moveTo(o*1.1,0),e.lineTo(-o*.6,0),e.stroke(),e.fillStyle="rgba(0,0,0,.12)",e.beginPath(),e.moveTo(o*1.1,0),e.lineTo(-o*.75,o*.12),e.lineTo(-o*.6,0),e.closePath(),e.fill(),e.restore(),l.plane}}}};export{C as default};
@@ -0,0 +1 @@
1
+ import{a as L,b as X}from"./chunk-4ZBXB36L.js";import{f as G}from"./chunk-HXSSPN2I.js";import{a as U,f as H}from"./chunk-IETNWEVK.js";import"./chunk-URWX3LLV.js";var Z={id:"particles",name:"Particle Field",description:"Thousands of particles hold the shape of the code. Push them with the pointer, click to scatter them, and watch them find their way back.",category:"Abstract",kind:"2d",motion:"interactive",tags:["canvas","particles","interactive","physics","mouse"],layout:"bottom",codeInScene:!0,copy:{eyebrow:"Error 404",title:"This page scattered into stardust.",message:"Move your cursor through it. It always pulls itself back together. The page you wanted won't.",actions:[{label:"Back to home",href:"/",variant:"primary"}]},params:{mode:"glow",colors:["#cfe0ff","#ffffff","#8fb5ff"],bg:"#050816",count:2600,size:2.2,spring:7,radius:120,drift:0,trail:0,twinkle:1,wind:0,ambient:140},theme:{bg:"#050816",accent:"#e8efff","accent-fg":"#050816"},presetName:"Stardust",presets:{neon:{name:"Neon",params:{colors:["#00f0ff","#ff00e6","#7a5cff"],bg:"#05000d",size:2.4,ambient:180},theme:{bg:"#05000d",accent:"#00f0ff","accent-fg":"#05000d"}},gold:{name:"Gold Dust",eyebrow:"Glittering",title:"All that glitters is not found.",params:{colors:["#ffd36b","#fff2c9","#e8a83b"],bg:"#0d0903",size:2,ambient:260},theme:{bg:"#0d0903",accent:"#ffd36b","accent-fg":"#0d0903"}},sakura:{name:"Sakura",eyebrow:"Spring",title:"Carried off by the blossoms.",params:{mode:"confetti",colors:["#ffb7c5","#ffd1dc","#ff8fab","#ffffff"],bg:"#fff5f7",count:1300,size:5,spring:4,twinkle:0,drift:-.3,ambient:90},theme:{bg:"#fff5f7",fg:"#4a1a2a",accent:"#4a1a2a","accent-fg":"#fff"}},smoke:{name:"Smoke",eyebrow:"Up in smoke",title:"This page went up in smoke.",params:{colors:["#9aa0a6","#c9ccd1","#6b7076"],bg:"#0d0e10",drift:1.2,trail:.12,size:3.2,twinkle:0,ambient:200,spring:5},theme:{bg:"#0d0e10",accent:"#e6e8eb","accent-fg":"#0d0e10"}},ocean:{name:"Sea Foam",params:{colors:["#bff7ff","#7fe3ff","#ffffff"],bg:"#03243a",size:2.4,drift:-.2,ambient:220},theme:{bg:"#03243a",accent:"#bff7ff","accent-fg":"#03243a"}},embers:{name:"Embers",eyebrow:"Still warm",title:"This page burned down.",message:"Only embers left. Stir them if you like, but home is the safer bet.",params:{colors:["#ff8a3d","#ffcf6b","#ff4d1f"],bg:"#0d0503",drift:1,trail:.22,size:2.4,ambient:220},theme:{bg:"#0d0503",accent:"#ffb066","accent-fg":"#1a0802"}},snow:{name:"Snowfall",eyebrow:"Snowed in",title:"This page is buried in snow.",message:"We'll dig it out by spring. Until then, there's a warm fire back home.",params:{colors:["#ffffff","#e4f1ff","#cfe3ff"],bg:"#1b2a40",drift:-1,size:2.6,ambient:260,twinkle:0},theme:{bg:"#1b2a40",accent:"#ffffff","accent-fg":"#1b2a40"}},confetti:{name:"Confetti",eyebrow:"Surprise",title:"We threw a party. The page didn't come.",message:"Click anywhere to pop the confetti again.",params:{mode:"confetti",colors:["#ff4f79","#ffb627","#2ec4b6","#5b5ff5","#ff7b3d"],bg:"#fff8ef",count:1500,size:4.2,spring:5,twinkle:0,ambient:60},theme:{bg:"#fff8ef",fg:"#1b1530",accent:"#1b1530","accent-fg":"#fff8ef"}},sand:{name:"Sand",eyebrow:"Shifting sands",title:"Blown away.",message:"The wind took this page. Brush past the letters and see.",params:{mode:"square",colors:["#b8925c","#9c7443","#cfa871"],bg:"#f4e7d3",count:5200,size:1.8,spring:3,wind:1,twinkle:0,ambient:0,radius:110},theme:{bg:"#f4e7d3",fg:"#3a2a17",accent:"#3a2a17","accent-fg":"#f4e7d3"}},pixels:{name:"Arcade Pixels",eyebrow:"Player 1",title:"Level not found.",message:"Insert coin to continue. Or just go back home.",params:{mode:"square",colors:["#39ff14","#00e5ff","#ff2bd6","#fff700"],bg:"#07010d",count:1400,size:5,spring:9,twinkle:0,ambient:0},theme:{bg:"#07010d",accent:"#39ff14","accent-fg":"#07010d","font-display":"var(--lp-font-mono)"}},ink:{name:"Ink",eyebrow:"Error 404",title:"Smudged out of existence.",params:{mode:"square",colors:["#141414","#2b2b2b","#4a4a4a"],bg:"#f3f0ea",count:3600,size:1.8,twinkle:0,ambient:0,spring:6},theme:{bg:"#f3f0ea",fg:"#141414",accent:"#141414","accent-fg":"#f3f0ea","font-display":"var(--lp-font-serif)"}},fireflies:{name:"Fireflies",eyebrow:"Summer night",title:"Even the fireflies can't find it.",params:{colors:["#d9ff6b","#f6ff9e","#b8ff3d"],bg:"#03100a",count:900,size:3.4,spring:2.5,twinkle:1,ambient:120,drift:.2},theme:{bg:"#03100a",accent:"#e6ff9a","accent-fg":"#03100a"}}},setup(m){let o=m.params,h=L(m),l=m.random,F=o.colors.map(n=>X(n,48,.12)),y=10,t=new Float32Array(0),z=0,f=new Float32Array(0),B=0;function E(){let n=h.w,a=h.h,i=Math.min(n*.82,1150),b=Math.min(i*.42,a*.42),d=Math.min(1,n*a/(1440*900))**.5,k=Math.max(400,Math.round(o.count*d)),v=Math.max(2,Math.round(Math.sqrt(i*b*.32/k))),u=H(m.copy.code||"404",{width:i,height:b,font:U,weight:800,fit:.95,step:v,jitter:.9,random:l}),w=(n-i)/2,I=a*.4-b/2,R=t;z=u.length/2,t=new Float32Array(z*y);for(let r=0;r<z;r++){let c=r*y,e=u[r*2]+w,g=u[r*2+1]+I,s=r*y<R.length?r*y:-1;t[c]=s>=0?R[s]:m.reducedMotion?e:l()*n,t[c+1]=s>=0?R[s+1]:m.reducedMotion?g:l()*a,t[c+2]=e,t[c+3]=g,t[c+6]=o.size*(.6+l()*.8),t[c+7]=Math.floor(l()*o.colors.length),t[c+8]=l()*100}let T=Math.round(o.ambient*d);f=new Float32Array(T*4);for(let r=0;r<T;r++)f[r*4]=l()*n,f[r*4+1]=l()*a,f[r*4+2]=.3+l()*.9,f[r*4+3]=l()*100}function O(n,a,i){for(let b=0;b<z;b++){let d=b*y,k=t[d]-n,v=t[d+1]-a,u=Math.hypot(k,v)+1,w=i*(.4+l())/Math.sqrt(u);t[d+4]+=k/u*w*60,t[d+5]+=v/u*w*60-(o.mode==="confetti"?200*l():0)}}if(m.on("pointerdown",n=>{let a=m.root.getBoundingClientRect();O(n.clientX-a.left,n.clientY-a.top,9)}),E(),!m.reducedMotion)for(let n=0;n<z;n++)t[n*y]=h.w/2+(l()-.5)*h.w*1.2,t[n*y+1]=h.h*.4+(l()-.5)*h.h*1.2;return{resize(){h.reset(),E()},frame(n,a){let i=h.g,b=h.w,d=h.h;h.reset(),i.globalCompositeOperation="source-over",o.trail>0&&a>0?(i.fillStyle=G(o.bg,o.trail),i.fillRect(0,0,b,d)):(i.fillStyle=o.bg,i.fillRect(0,0,b,d)),!m.pointer.engaged&&n-B>7&&n>3&&a>0&&(B=n,O(b/2+(l()-.5)*b*.3,d*.42,4));let k=o.mode==="glow";k&&(i.globalCompositeOperation="lighter");for(let c=0;c<f.length/4;c++){let e=c*4;f[e+1]-=o.drift*22*f[e+2]*a,f[e]+=Math.sin(n*.5+f[e+3])*8*a+o.wind*30*a,f[e+1]<-10&&(f[e+1]=d+10),f[e+1]>d+10&&(f[e+1]=-10),f[e]>b+10&&(f[e]=-10);let g=o.twinkle?.4+.6*Math.abs(Math.sin(n*1.3+f[e+3])):.7,s=o.size*f[e+2]*1.4;i.globalAlpha=g*.55,k?i.drawImage(F[c%F.length],f[e]-s*3,f[e+1]-s*3,s*6,s*6):(i.fillStyle=o.colors[c%o.colors.length],i.fillRect(f[e],f[e+1],s,s))}let v=m.pointer.x,u=m.pointer.y,w=o.radius,I=w*w,R=m.pointer.inside&&m.interactive,T=o.spring,r=Math.exp(-3.2*a);for(let c=0;c<z;c++){let e=c*y,g=t[e],s=t[e+1],M=t[e+4],S=t[e+5],N=t[e+2]-g,W=t[e+3]-s,Y=Math.abs(N)+Math.abs(W);if(M+=N*T*a,S+=W*T*a,R){let x=g-v,A=s-u,j=x*x+A*A;if(j<I){let C=Math.sqrt(j)+.01,D=(1-C/w)*2600*a;M+=x/C*D,S+=A/C*D,o.wind&&(M+=900*a*(1-C/w),t[e+9]=1.6+l()*1.4)}}o.drift&&Y>4&&(S-=o.drift*60*a),o.wind&&t[e+9]>0&&(M+=o.wind*140*a*Math.min(1,t[e+9]),S+=Math.sin(n*3+t[e+8])*30*a,t[e+9]-=a),M*=r,S*=r,g+=M*a,s+=S*a;let q=t[e+8];g+=Math.sin(n*1.1+q)*.08,s+=Math.cos(n*.9+q*1.3)*.08,t[e]=g,t[e+1]=s,t[e+4]=M,t[e+5]=S;let p=t[e+6],P=t[e+7]|0,J=o.twinkle?.55+.45*Math.sin(n*2.2+q):1;if(k)i.globalAlpha=J,i.drawImage(F[P],g-p*2.5,s-p*2.5,p*5,p*5);else if(o.mode==="confetti"){let x=q+n*(1.5+q%3)+M*.004,A=p*Math.abs(Math.cos(x));i.globalAlpha=1,i.fillStyle=o.colors[P],i.fillRect(g-A/2,s-p*.35,A||.5,p*.7)}else i.globalAlpha=1,i.fillStyle=o.colors[P],i.fillRect(g-p/2,s-p/2,p,p)}i.globalAlpha=1,i.globalCompositeOperation="source-over"}}}};export{Z as default};
@@ -0,0 +1,14 @@
1
+ import{a as e,b as r,c as i,d as p,e as s}from"./chunk-A44JMJWI.js";import"./chunk-QHXVYCR6.js";import"./chunk-URWX3LLV.js";var d={id:"path-not-found",name:"Path Not Found",description:"Shows people exactly what went wrong: the address they asked for, in a code chip or a request line, so a typo is easy to spot.",category:"Simple",kind:"2d",motion:"static",tags:["simple","url","path","developer","docs","useful","static","fast"],layout:"none",copy:{title:"Nothing lives at this address",message:"Double-check the spelling, or go back to where you came from.",actions:[{label:"Go home",href:"/"},{label:"Report a broken link",href:"/contact",variant:"secondary",icon:"arrow"}]},params:{request:!1},theme:{bg:"#fafafa",fg:"#18181b",accent:"#18181b","accent-fg":"#fafafa",radius:"8px"},presetName:"Chip",presets:{request:{name:"Request line",params:{request:!0},theme:{bg:"#0b0b0e",fg:"#e4e4e7",accent:"#e4e4e7","accent-fg":"#0b0b0e"}},soft:{name:"Soft",theme:{bg:"#eef2ff",fg:"#1e1b4b",accent:"#4338ca","accent-fg":"#fff",radius:"999px"}}},css:`
2
+ & .pnf{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;padding:24px 16px}
3
+ & .pnf h1{margin:0;font-size:clamp(26px,4.2cqw,46px);font-weight:700;letter-spacing:-.03em;line-height:1.1;text-wrap:balance}
4
+ & .pnf code{font-family:var(--lp-font-mono);font-size:14px;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
5
+ & .pnf .chip{display:inline-flex;gap:10px;align-items:center;max-width:min(560px,100%);margin-bottom:22px;padding:8px 14px;border-radius:8px;
6
+ background:color-mix(in srgb,var(--lp-fg) 6%,transparent);border:1px dashed color-mix(in srgb,var(--lp-fg) 22%,transparent)}
7
+ & .pnf .chip b{flex:none;color:#e11d48;font-family:var(--lp-font-mono);font-size:13px}
8
+ & .pnf .req{width:min(560px,100%);margin-bottom:26px;text-align:left;border-radius:10px;overflow:hidden;border:1px solid color-mix(in srgb,var(--lp-fg) 14%,transparent)}
9
+ & .pnf .req div{display:flex;gap:12px;padding:12px 16px;font-family:var(--lp-font-mono);font-size:13.5px;min-width:0}
10
+ & .pnf .req div+div{border-top:1px solid color-mix(in srgb,var(--lp-fg) 10%,transparent);color:var(--lp-muted)}
11
+ & .pnf .req em{font-style:normal;color:#22c55e;flex:none}
12
+ & .pnf .req strong{color:#f43f5e;flex:none}
13
+ & .pnf p{margin:14px 0 0;color:var(--lp-muted);font-size:15px;max-width:44ch}
14
+ `,setup(t){let o=t.copy,n=r(),l=t.params.request?`<div class="req" aria-hidden="true"><div><em>GET</em><code>${e(n)}</code></div><div><strong>${e(o.code)}</strong><span>Not Found</span></div></div>`:`<div class="chip"><b>${e(o.code)}</b><code>${e(n)}</code></div>`,a=p(t,"pnf",`${l}<h1>${s(o.code)}${e(o.title)}</h1><p>${e(o.message)}</p>`);return a.append(i(t)),{destroy:()=>a.remove()}}};export{d as default};
@@ -0,0 +1,157 @@
1
+ import{a as s}from"./chunk-LMRCHEWX.js";import{a as o,b as c,c as r}from"./chunk-QJZBGT2Q.js";import{e as a}from"./chunk-HXSSPN2I.js";import"./chunk-URWX3LLV.js";var n=`
2
+ uniform vec3 uDeep, uShallow, uLand, uHigh, uIce, uAtmo, uRingCol;
3
+ uniform float uType, uSea, uClouds, uRings, uCity, uMoon, uSpin;
4
+ ${o}
5
+ ${c}
6
+ ${r}
7
+
8
+ const vec3 SUN = normalize(vec3(-0.8, 0.35, 0.55));
9
+
10
+ mat3 rotY(float a){ float c = cos(a), s = sin(a); return mat3(c,0,-s, 0,1,0, s,0,c); }
11
+ mat3 rotX(float a){ float c = cos(a), s = sin(a); return mat3(1,0,0, 0,c,s, 0,-s,c); }
12
+
13
+ float sphere(vec3 ro, vec3 rd, vec3 c, float r) {
14
+ vec3 oc = ro - c;
15
+ float b = dot(oc, rd), h = b * b - dot(oc, oc) + r * r;
16
+ if (h < 0.0) return -1.0;
17
+ return -b - sqrt(h);
18
+ }
19
+
20
+ vec3 stars(vec3 d) {
21
+ vec3 p = d * 220.0;
22
+ vec3 id = floor(p);
23
+ float h = hash13(id);
24
+ vec3 c = id + 0.5 + (vec3(hash13(id + 1.0), hash13(id + 2.0), hash13(id + 3.0)) - 0.5) * 0.7;
25
+ float s = smoothstep(0.32, 0.0, length(p - c)) * step(0.987, h) * (h - 0.987) * 70.0;
26
+ return vec3(0.8, 0.88, 1.0) * s;
27
+ }
28
+
29
+ vec3 surface(vec3 q, out float spec, out float night) {
30
+ spec = 0.0; night = 0.0;
31
+ if (uType > 0.5 && uType < 1.5) {
32
+ // gas giant bands
33
+ float lat = q.y;
34
+ float w = fbm(vec2(lat * 6.0, 0.0) + vec2(fbm(q.xz * 2.5 + uTime * 0.01), 0.0)) ;
35
+ float bands = sin(lat * 22.0 + w * 6.0) * 0.5 + 0.5;
36
+ vec3 c = mix(uLand, uHigh, bands);
37
+ c = mix(c, uShallow, smoothstep(0.55, 0.8, fbm(vec2(lat * 30.0, atan(q.z, q.x) * 2.0))) * 0.4);
38
+ // storm eye
39
+ float storm = smoothstep(0.16, 0.0, length(vec2(atan(q.z, q.x) - 0.8, (q.y + 0.35) * 2.2)));
40
+ return mix(c, uIce, storm * 0.8);
41
+ }
42
+ float h = fbm3(q * 1.6) * 0.65 + fbm3(q * 4.5 + 7.0) * 0.35;
43
+ float lat = abs(q.y);
44
+ if (uType > 1.5) {
45
+ // lava world: dark crust, glowing cracks
46
+ float cr = abs(fbm3(q * 3.0) - 0.5);
47
+ vec3 c = mix(uLand, uHigh, smoothstep(0.4, 0.7, h));
48
+ night = smoothstep(0.05, 0.0, cr) * 2.5 + smoothstep(uSea, uSea - 0.05, h) * 1.5;
49
+ return c;
50
+ }
51
+ if (h < uSea) {
52
+ spec = 1.0;
53
+ return mix(uDeep, uShallow, smoothstep(uSea - 0.12, uSea, h));
54
+ }
55
+ vec3 c = mix(uLand, uHigh, smoothstep(uSea + 0.04, uSea + 0.22, h));
56
+ c = mix(c, uIce, smoothstep(0.72, 0.86, lat + (h - uSea) * 0.4));
57
+ night = uCity * step(0.62, vnoise(q.xz * 40.0 + q.y * 20.0)) * smoothstep(0.7, 0.3, lat) * smoothstep(uSea, uSea + 0.05, h);
58
+ return c;
59
+ }
60
+
61
+ void main() {
62
+ vec2 fc = gl_FragCoord.xy;
63
+ vec2 uv = (fc - 0.5 * uRes) / uRes.y;
64
+ float aspect = uRes.x / uRes.y;
65
+ float t = uTime;
66
+
67
+ // planet sits right of centre on wide screens, above the copy on narrow ones
68
+ vec3 pc = aspect > 1.15 ? vec3(0.95, 0.02, 0.0) : vec3(0.0, 0.55, 0.0);
69
+ float pr = aspect > 1.15 ? 1.0 : 0.82;
70
+ vec3 ro = vec3(uMouse.x * 0.25, uMouse.y * 0.15, 4.2);
71
+ vec3 rd = normalize(vec3(uv * 1.0 - (ro.xy * 0.24), -1.6));
72
+
73
+ vec3 col = stars(rd);
74
+ // ring plane, tilted
75
+ mat3 tilt = rotX(0.42) * rotY(0.3);
76
+ vec3 rn = tilt * vec3(0.0, 1.0, 0.0);
77
+
78
+ float tp = sphere(ro, rd, pc, pr);
79
+ // moon
80
+ float ma = t * 0.12;
81
+ vec3 mc = pc + vec3(cos(ma) * 2.0, sin(ma) * 0.35, sin(ma) * 2.0) * pr;
82
+ float tm = uMoon > 0.5 ? sphere(ro, rd, mc, 0.12 * pr) : -1.0;
83
+
84
+ // atmosphere halo (outside the disc)
85
+ vec3 oc = ro - pc;
86
+ float b = dot(oc, rd);
87
+ float closest = sqrt(max(dot(oc, oc) - b * b, 0.0));
88
+ float halo = exp(-max(closest - pr, 0.0) / (0.06 * pr)) * step(pr, closest);
89
+ vec3 toP = normalize(pc - ro);
90
+ float lit = clamp(dot(normalize(cross(cross(toP, rd), toP) + 1e-5), SUN) * 0.5 + 0.6, 0.0, 1.0);
91
+ col += uAtmo * halo * lit * 0.9;
92
+
93
+ if (tp > 0.0) {
94
+ vec3 p = ro + rd * tp;
95
+ vec3 n = normalize(p - pc);
96
+ vec3 q = rotY(t * 0.04 * uSpin) * rotX(0.25) * n;
97
+ float spec, night;
98
+ vec3 albedo = surface(q, spec, night);
99
+ float dif = max(dot(n, SUN), 0.0);
100
+ float term = smoothstep(-0.12, 0.2, dot(n, SUN));
101
+ vec3 c = albedo * (dif * 1.4 + 0.015);
102
+ vec3 h = normalize(SUN - rd);
103
+ c += vec3(1.0, 0.95, 0.85) * pow(max(dot(n, h), 0.0), 60.0) * spec * 0.6 * dif;
104
+ // clouds and their shadows
105
+ if (uClouds > 0.0) {
106
+ vec3 cq = rotY(t * 0.055 * uSpin) * rotX(0.25) * n;
107
+ float cl = smoothstep(1.0 - uClouds, 1.0 - uClouds + 0.3, fbm3(cq * 2.4 + 3.0));
108
+ c = mix(c, vec3(1.0) * (dif * 1.3 + 0.02), cl * 0.9);
109
+ }
110
+ c += vec3(1.0, 0.62, 0.25) * night * (1.0 - term) * 0.9;
111
+ if (uType > 1.5) c += vec3(1.0, 0.35, 0.08) * night * 0.7;
112
+ // rim atmosphere
113
+ float fres = pow(1.0 - max(dot(n, -rd), 0.0), 3.0);
114
+ c += uAtmo * fres * (0.25 + term) * 1.2;
115
+ col = c;
116
+ // ring shadow on the planet
117
+ if (uRings > 0.0) {
118
+ float s = dot(pc - p, rn) / dot(SUN, rn);
119
+ vec3 rp = p + SUN * s - pc;
120
+ float rr = length(rp) / pr;
121
+ if (s > 0.0 && rr > 1.35 && rr < 2.3) col *= 1.0 - 0.6 * uRings;
122
+ }
123
+ }
124
+ if (tm > 0.0 && (tp < 0.0 || tm < tp)) {
125
+ vec3 p = ro + rd * tm;
126
+ vec3 n = normalize(p - mc);
127
+ float crater = vnoise(n.xy * 9.0 + n.z * 4.0) * 0.4 + vnoise(n.yz * 25.0) * 0.2;
128
+ col = vec3(0.6, 0.58, 0.55) * (0.7 + crater) * max(dot(n, SUN), 0.0) + 0.005;
129
+ }
130
+ // rings
131
+ if (uRings > 0.0) {
132
+ float tr = dot(pc - ro, rn) / dot(rd, rn);
133
+ if (tr > 0.0) {
134
+ vec3 rp = ro + rd * tr - pc;
135
+ float rr = length(rp) / pr;
136
+ if (rr > 1.35 && rr < 2.3 && (tp < 0.0 || tr < tp)) {
137
+ float band = fbm(vec2(rr * 40.0, 0.0)) * 0.7 + 0.3 * sin(rr * 120.0);
138
+ float a = smoothstep(1.35, 1.45, rr) * smoothstep(2.3, 2.15, rr) * (0.35 + 0.65 * band) * step(abs(rr - 1.9), 0.4 - 0.01) ;
139
+ a *= 1.0 - 0.75 * smoothstep(0.02, 0.0, abs(rr - 1.82));
140
+ // planet shadow on rings
141
+ vec3 w = ro + rd * tr;
142
+ float sh = sphere(w, SUN, pc, pr) > 0.0 ? 0.15 : 1.0;
143
+ vec3 rc = uRingCol * (0.25 + 0.9 * abs(dot(rn, SUN))) * sh;
144
+ col = mix(col, rc, a * uRings);
145
+ }
146
+ }
147
+ }
148
+
149
+ col = aces(col * 1.1);
150
+ col = toSRGB(col);
151
+ col += grain(fc, t) * 0.012;
152
+ fragColor = vec4(col, 1.0);
153
+ }
154
+ `,p={id:"planet",name:"Lonely Planet",description:"A small procedural world turning slowly in the dark, with clouds, oceans, night lights, rings and a moon.",category:"Space",kind:"3d",motion:"live",tags:["webgl","space","planet","procedural","calm","dark"],layout:"left",copy:{eyebrow:"Planet 404",title:"No signs of this page.",message:"We scanned the whole planet: oceans, clouds and city lights. Your page isn't on it.",actions:[{label:"Fly home",href:"/",variant:"primary"},{label:"Mission control",href:"/contact",variant:"secondary"}]},params:{deep:"#03142e",shallow:"#0b4d78",land:"#3e5a2c",high:"#8a7a58",ice:"#f2f5f7",atmosphere:"#4f8dff",type:0,seaLevel:.5,clouds:.45,rings:0,ringColor:"#d9c7a4",cityLights:1,moon:!0,spin:1},theme:{bg:"#000207",accent:"#e8f0ff","accent-fg":"#000207"},presetName:"Terra",presets:{jungle:{name:"Jungle World",eyebrow:"Planet 404 \xB7 Overgrown",title:"Lost in the canopy.",params:{deep:"#04202a",shallow:"#0b6b6b",land:"#1f6b2a",high:"#3a8a2a",ice:"#e9f7e9",atmosphere:"#7fffb0",seaLevel:.42,clouds:.6,cityLights:0},theme:{accent:"#c9ffd9","accent-fg":"#021a0a"}},candy:{name:"Candy Planet",eyebrow:"Planet 404 \xB7 Sweet",params:{deep:"#5a1a6b",shallow:"#c25cd6",land:"#ff9ec7",high:"#ffd6e8",ice:"#ffffff",atmosphere:"#ffb3e6",seaLevel:.48,clouds:.4,cityLights:0},theme:{accent:"#ffd6ef","accent-fg":"#2a0a33"}},"ice-giant":{name:"Ice Giant",eyebrow:"Planet 404 \xB7 Cold and far",params:{type:1,land:"#6fb3e6",high:"#cfeaff",shallow:"#3a7ab8",ice:"#ffffff",atmosphere:"#9fd8ff",rings:.7,ringColor:"#bcd8f0",clouds:0,cityLights:0},theme:{accent:"#dff2ff","accent-fg":"#04122a"}},toxic:{name:"Sulphur",eyebrow:"Planet 404 \xB7 Toxic",title:"Do not land here.",params:{type:1,land:"#c9b33a",high:"#f2e88a",shallow:"#8a7a1a",ice:"#fff6c9",atmosphere:"#e6ff6b",rings:0,clouds:0,cityLights:0},theme:{accent:"#f2ff9e","accent-fg":"#1a1a02"}},dune:{name:"Dune",eyebrow:"Planet 404 \xB7 Arid",title:"Nothing out here but sand.",params:{deep:"#5a2a14",shallow:"#8a4423",land:"#c46a3a",high:"#e7b07a",ice:"#f4e3d0",atmosphere:"#ff9a5c",seaLevel:.2,clouds:.1,cityLights:0},theme:{accent:"#ffd2b0","accent-fg":"#1a0a03"}},glacier:{name:"Glacier",eyebrow:"Planet 404 \xB7 Frozen",title:"This page froze over.",params:{deep:"#0a2a44",shallow:"#3f88b5",land:"#b9d5e6",high:"#ffffff",ice:"#ffffff",atmosphere:"#9fd3ff",seaLevel:.42,clouds:.35,cityLights:0},theme:{accent:"#e6f6ff","accent-fg":"#071a2a"}},giant:{name:"Ringed Giant",eyebrow:"Planet 404 \xB7 Gas giant",title:"No solid ground for this page.",message:"It's all gas and rings out here. Let's head back to something solid.",params:{type:1,land:"#c9a273",high:"#f1dcb8",shallow:"#a86b3c",ice:"#fff2dc",atmosphere:"#f0c48a",rings:1,clouds:0,cityLights:0,moon:!0},theme:{accent:"#f4dfbd","accent-fg":"#1f1405"}},inferno:{name:"Inferno",eyebrow:"Planet 404 \xB7 Volcanic",title:"This page burned up on entry.",params:{type:2,land:"#140a08",high:"#3a2a24",atmosphere:"#ff5a1f",seaLevel:.36,clouds:0,cityLights:0},theme:{accent:"#ff8a4c","accent-fg":"#1a0500"}},ocean:{name:"Ocean World",eyebrow:"Planet 404 \xB7 Water",title:"Lost at sea, planet-wide.",params:{seaLevel:.78,deep:"#021a3a",shallow:"#0e6aa0",clouds:.55,cityLights:0,atmosphere:"#5fb2ff"}}},css:`&{--lp-code-size:clamp(84px,11cqw,170px)}
155
+ & .lp-overlay{padding-left:max(16px,calc(var(--lp-pad) * 1.6))}
156
+ & .lp-title{max-width:12ch}
157
+ @container (max-width:820px){& .lp-overlay{justify-content:flex-end;align-items:center}& .lp-head,& .lp-body{align-items:center;text-align:center}& .lp-actions{justify-content:center}& .lp-title{max-width:none}}`,setup(t){let e=t.params;return s(t,{frag:n,uniforms:()=>({uDeep:a(e.deep),uShallow:a(e.shallow),uLand:a(e.land),uHigh:a(e.high),uIce:a(e.ice),uAtmo:a(e.atmosphere),uRingCol:a(e.ringColor),uType:e.type,uSea:e.seaLevel,uClouds:e.clouds,uRings:e.rings,uCity:e.cityLights,uMoon:e.moon?1:0,uSpin:e.spin})})}};export{p as default};
@@ -0,0 +1,106 @@
1
+ import{a as W,b as M,c as C,e as E,g as I,h as R,k as T}from"./chunk-QJZBGT2Q.js";import{e as b}from"./chunk-HXSSPN2I.js";import"./chunk-URWX3LLV.js";var _=`
2
+ uniform sampler2D uPrev;
3
+ uniform vec2 uTexel;
4
+ uniform vec4 uDrop; // x, y (0..1), radius, strength
5
+ void main() {
6
+ vec2 uv = vUv;
7
+ vec4 s = texture(uPrev, uv);
8
+ float h = s.r, v = s.g;
9
+ float avg = (texture(uPrev, uv + vec2(uTexel.x, 0.0)).r + texture(uPrev, uv - vec2(uTexel.x, 0.0)).r +
10
+ texture(uPrev, uv + vec2(0.0, uTexel.y)).r + texture(uPrev, uv - vec2(0.0, uTexel.y)).r) * 0.25;
11
+ v += (avg - h) * 2.0;
12
+ v *= 0.992;
13
+ h += v;
14
+ h *= 0.998;
15
+ vec2 d = (uv - uDrop.xy) * vec2(uTexel.y / uTexel.x, 1.0);
16
+ float r = length(d);
17
+ if (uDrop.z > 0.0) h -= uDrop.w * smoothstep(uDrop.z, 0.0, r);
18
+ fragColor = vec4(h, v, 0.0, 1.0);
19
+ }
20
+ `,$=`
21
+ uniform sampler2D uH;
22
+ uniform sampler2D uFloor;
23
+ uniform vec2 uTexel;
24
+ uniform vec3 uWater, uDeep, uSky;
25
+ uniform float uKoi, uLilies;
26
+ ${W}
27
+ ${M}
28
+ ${C}
29
+
30
+ vec2 koiPos(float i, float t) {
31
+ float a = t * (0.13 + i * 0.05) + i * 2.4;
32
+ return vec2(0.5 + cos(a) * (0.28 - i * 0.05), 0.5 + sin(a * 1.3) * (0.22 + i * 0.04));
33
+ }
34
+
35
+ vec4 koi(vec2 uv, float t, float aspect) {
36
+ vec4 acc = vec4(0.0);
37
+ for (int k = 0; k < 3; k++) {
38
+ float i = float(k);
39
+ vec2 c = koiPos(i, t);
40
+ vec2 dir = normalize(koiPos(i, t + 0.05) - c);
41
+ vec2 q = (uv - c) * vec2(aspect, 1.0);
42
+ q = vec2(dot(q, dir), dot(q, vec2(-dir.y, dir.x)));
43
+ float wig = sin(q.x * 40.0 - t * 8.0) * 0.012 * smoothstep(0.0, -0.08, q.x);
44
+ q.y += wig;
45
+ float body = length(q / vec2(0.075, 0.022)) - 1.0;
46
+ float tail = length((q - vec2(-0.085, 0.0)) / vec2(0.025, 0.02)) - 1.0;
47
+ float d = min(body, tail);
48
+ float m = smoothstep(0.15, -0.1, d);
49
+ float spots = step(0.5, vnoise(q * 60.0 + i * 7.0));
50
+ vec3 col = mix(vec3(1.0, 0.95, 0.9), i == 1.0 ? vec3(0.05) : vec3(1.0, 0.35, 0.05), spots);
51
+ acc = mix(acc, vec4(col, 1.0), m * (1.0 - acc.a));
52
+ }
53
+ return acc;
54
+ }
55
+
56
+ void main() {
57
+ vec2 uv = vUv;
58
+ float aspect = uRes.x / uRes.y;
59
+ float t = uTime;
60
+ float hx = texture(uH, uv + vec2(uTexel.x, 0.0)).r - texture(uH, uv - vec2(uTexel.x, 0.0)).r;
61
+ float hy = texture(uH, uv + vec2(0.0, uTexel.y)).r - texture(uH, uv - vec2(0.0, uTexel.y)).r;
62
+ vec3 n = normalize(vec3(-hx * 6.0, -hy * 6.0, 1.0));
63
+ // the pond floor, refracted
64
+ vec2 ruv = uv + n.xy * 0.05;
65
+ vec3 floorCol = texture(uFloor, ruv).rgb;
66
+ // koi swim between floor and surface, refracted too
67
+ if (uKoi > 0.5) {
68
+ vec4 k = koi(uv + n.xy * 0.035, t, aspect);
69
+ // shadow of the koi on the floor
70
+ vec4 ks = koi(uv + n.xy * 0.035 - vec2(0.012, -0.018), t, aspect);
71
+ floorCol *= 1.0 - ks.a * 0.35;
72
+ floorCol = mix(floorCol, k.rgb, k.a * 0.92);
73
+ }
74
+ vec3 col = floorCol * uWater;
75
+ // depth tint toward the edges
76
+ col = mix(col, uDeep, 0.25 + 0.45 * smoothstep(0.2, 0.75, length((uv - 0.5) * vec2(aspect, 1.0))));
77
+ // caustics
78
+ float caus = pow(abs(sin(fbm(uv * vec2(aspect, 1.0) * 8.0 + n.xy * 3.0 + t * 0.2) * 10.0)), 8.0);
79
+ col += uSky * caus * 0.06;
80
+ // sky reflection and sun glint
81
+ float fres = 0.04 + 0.5 * pow(1.0 - n.z, 2.0);
82
+ col = mix(col, uSky, fres * 0.5);
83
+ vec3 L = normalize(vec3(-0.4, 0.5, 0.75));
84
+ col += vec3(1.0) * pow(max(dot(reflect(-L, n), vec3(0, 0, 1)), 0.0), 120.0) * 1.2;
85
+ // lily pads float on top
86
+ if (uLilies > 0.5) {
87
+ for (int i = 0; i < 5; i++) {
88
+ float fi = float(i);
89
+ vec2 c = vec2(hash11(fi * 3.3), hash11(fi * 7.1)) * 0.9 + 0.05 + vec2(sin(t * 0.1 + fi), cos(t * 0.08 + fi)) * 0.01;
90
+ vec2 q = (uv - c) * vec2(aspect, 1.0) + n.xy * 0.004;
91
+ float r = 0.05 + hash11(fi) * 0.035;
92
+ float a = atan(q.y, q.x) + fi;
93
+ float notch = smoothstep(0.0, 0.25, abs(mod(a, 6.28318) - 0.2));
94
+ float pad = smoothstep(r, r * 0.97, length(q)) * notch;
95
+ vec3 pc = vec3(0.18, 0.45, 0.16) * (0.85 + 0.15 * sin(a * 9.0)) + vec3(0.1) * smoothstep(r * 0.2, 0.0, length(q));
96
+ col = mix(col * (1.0 - smoothstep(r * 1.15, r * 0.9, length(q - vec2(0.006, -0.008))) * 0.25), pc, pad);
97
+ if (fi < 2.0) {
98
+ float fl = smoothstep(r * 0.32, r * 0.25, length(q - vec2(r * 0.2, 0.0)));
99
+ col = mix(col, vec3(1.0, 0.75, 0.85), fl);
100
+ }
101
+ }
102
+ }
103
+ col = toSRGB(aces(col * 1.2));
104
+ fragColor = vec4(col, 1.0);
105
+ }
106
+ `,U={id:"pond",name:"Koi Pond",description:"A real-time water simulation. Koi glide under the surface, the 404 is laid in stones on the bottom, and the water ripples wherever you touch it.",category:"Nature",kind:"2d",motion:"live",tags:["webgl","water","simulation","ripples","zen","calm","interactive","nature"],layout:"bottom",codeInScene:!0,copy:{eyebrow:"Still water",title:"Only ripples here.",message:"Touch the water if you like. The page you're looking for isn't at the bottom of this pond.",actions:[{label:"Back to the garden",href:"/",variant:"primary"}]},params:{water:"#bfe6dc",deep:"#0f3b3a",sky:"#cfe8ff",stone:"#e9e4da",koi:!0,lilies:!0,rain:.4},theme:{bg:"#1d4a45",fg:"#f0fbf8",accent:"#f0fbf8","accent-fg":"#123430"},presetName:"Garden",presets:{sakura:{name:"Sakura",params:{water:"#f2d6e0",deep:"#3a1a2a",sky:"#ffe6ef",lilies:!0,rain:.3},theme:{bg:"#4a2a3a",accent:"#ffe6ef","accent-fg":"#3a1a2a"}},jade:{name:"Jade",params:{water:"#9fe6c9",deep:"#063a2a",sky:"#d9fff2",koi:!0},theme:{bg:"#0a3a2a",accent:"#d9fff2","accent-fg":"#063a2a"}},night:{name:"Moonlit",params:{water:"#6f8fb3",deep:"#050c1a",sky:"#7f93c9",koi:!0,lilies:!0,rain:.2},theme:{bg:"#0a1426",accent:"#e8eeff","accent-fg":"#0a1426"}},autumn:{name:"Autumn",params:{water:"#d9c79b",deep:"#2a2410",sky:"#ffe2b8",lilies:!1,rain:.5},theme:{bg:"#3a2f12",accent:"#ffd28a","accent-fg":"#2a1e05"}},rain:{name:"Rain Shower",eyebrow:"Raining",params:{rain:3,lilies:!0}}},css:"& .lp-body{text-shadow:0 2px 16px rgba(0,0,0,.45)}",setup(a){let c=a.params,t=a.random,L=a.canvas({adaptive:!0}),r=E(L),G=T(r,_),H=T(r,$),v=256,d=160,p=I(r,v,d,{float:!0,channels:2}),m=document.createElement("canvas"),x=null;function z(){let n=Math.round(1024*a.height/Math.max(1,a.width));m.width=1024,m.height=n;let e=m.getContext("2d");e.fillStyle="#5b6b52",e.fillRect(0,0,1024,n);for(let l=0;l<2600;l++){let f=1+t()*3.5,s=60+t()*80;e.fillStyle=`rgb(${s+10},${s+12},${s})`,e.beginPath(),e.ellipse(t()*1024,t()*n,f,f*(.6+t()*.4),t()*3,0,Math.PI*2),e.fill()}let o=document.createElement("canvas");o.width=200,o.height=Math.round(200*(n/1024));let i=o.getContext("2d");i.fillStyle="#fff",i.font=`900 ${o.height*.5}px "Inter",ui-sans-serif,system-ui,sans-serif`,i.textAlign="center",i.textBaseline="middle",i.fillText(a.copy.code||"404",o.width/2,o.height*.4);let A=i.getImageData(0,0,o.width,o.height).data,g=1024/o.width;for(let l=0;l<o.height;l+=2)for(let f=0;f<o.width;f+=2){if(A[(l*o.width+f)*4+3]<128)continue;let s=f*g+(t()-.5)*g,y=l*g+(t()-.5)*g,u=g*(.75+t()*.45);e.fillStyle="rgba(0,0,0,.25)",e.beginPath(),e.ellipse(s+2,y+3,u,u*.8,0,0,Math.PI*2),e.fill();let k=e.createRadialGradient(s-u*.3,y-u*.3,0,s,y,u);k.addColorStop(0,"#ffffff"),k.addColorStop(1,c.stone),e.fillStyle=k,e.beginPath(),e.ellipse(s,y,u,u*(.75+t()*.2),t()*3,0,Math.PI*2),e.fill()}for(let l=0;l<18;l++)e.save(),e.translate(t()*1024,t()*n),e.rotate(t()*6),e.fillStyle=`rgba(${120+t()*80},${70+t()*40},20,.8)`,e.beginPath(),e.ellipse(0,0,10,4,0,0,Math.PI*2),e.fill(),e.restore();x?(r.bindTexture(r.TEXTURE_2D,x),r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,!0),r.texImage2D(r.TEXTURE_2D,0,r.RGBA,r.RGBA,r.UNSIGNED_BYTE,m),r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,!1)):x=R(r,m,{filter:"linear"})}let P=()=>{v=320,d=Math.max(80,Math.round(320*a.height/Math.max(1,a.width))),p.resize(v,d),z()};P();let h=[],S=-1,D=-1;a.on("pointerdown",()=>h.push([a.pointer.x/a.width,1-a.pointer.y/a.height,.03,.9]));let w=0;return{resize:P,frame(q,n){if(a.pointer.inside){let o=a.pointer.x/a.width,i=1-a.pointer.y/a.height;Math.hypot(o-S,i-D)>.004&&h.push([o,i,.012,.25]),S=o,D=i}for(w+=n*c.rain*2;w>1;)w-=1,h.push([t(),t(),.008+t()*.01,.4+t()*.4]);let e=n===0?0:2;for(let o=0;o<e;o++){let i=h.shift()??[0,0,0,0];G.draw({uPrev:p.read,uTexel:[1/v,1/d],uDrop:i},p.write),p.swap()}h.length=Math.min(h.length,8),H.draw({uTime:q,uH:p.read,uFloor:x,uTexel:[1/v,1/d],uWater:b(c.water),uDeep:b(c.deep),uSky:b(c.sky),uKoi:c.koi?1:0,uLilies:c.lilies?1:0})}}}};export{U as default};