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,34 @@
1
+ import"./chunk-URWX3LLV.js";var e=p=>p.replace(/[&<>"]/g,l=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;"})[l]),b={id:"loading",name:"Still Loading",description:"A progress bar that tries its best: resolving, asking nicely, checking under the couch. It stalls at 99%, then gives up at 404%.",category:"Playful",kind:"2d",motion:"live",tags:["dom","progress","funny","minimal","light","loading"],layout:"none",copy:{title:"Loading the page you asked for\u2026",message:"Any moment now. Actually, it doesn't exist.",actions:[{label:"Load the homepage instead",href:"/",variant:"primary"}]},params:{style:"minimal",steps:["Resolving address\u2026","Asking the server nicely\u2026","Checking under the couch\u2026","Looking behind the cache\u2026","Bribing the CDN\u2026","Almost there\u2026","Hmm.","Still nothing."]},theme:{bg:"#fafaf8",fg:"#111",accent:"#111","accent-fg":"#fff"},presetName:"Minimal",presets:{dark:{name:"Minimal Dark",params:{style:"minimal"},theme:{bg:"#0b0b0d",fg:"#f2f2f2",accent:"#f2f2f2","accent-fg":"#0b0b0d"}},warm:{name:"Minimal Warm",params:{style:"minimal"},theme:{bg:"#f6ede2",fg:"#2a1a0a",accent:"#e8572a","accent-fg":"#fff"}},dialog:{name:"Retro Dialog",params:{style:"dialog"},theme:{bg:"#008080",fg:"#000",accent:"#000","accent-fg":"#fff"}},terminal:{name:"Package Manager",params:{style:"terminal",steps:["resolving dependencies","fetching page@latest","linking","building","verifying integrity"]},theme:{bg:"#0d1117",fg:"#c9d1d9",accent:"#58a6ff","accent-fg":"#0d1117"}}},css:`
2
+ & .ld{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;padding:20px}
3
+ & .ld-min{width:min(720px,100%)}
4
+ & .ld-min h1{font:600 clamp(28px,4.4cqw,56px)/1.08 var(--lp-font-display);letter-spacing:-.04em;margin:0 0 10px}
5
+ & .ld-min .step{color:var(--lp-muted);font-size:clamp(14px,1.3cqw,17px);min-height:1.4em;margin:0 0 28px}
6
+ & .ld-bar{position:relative;height:8px;border-radius:99px;background:color-mix(in srgb,var(--lp-fg) 10%,transparent);overflow:hidden}
7
+ & .ld-bar i{position:absolute;inset:0 auto 0 0;background:var(--lp-fg);border-radius:inherit}
8
+ & .ld-bar.err i{background:#e5484d}
9
+ & .ld-row{display:flex;justify-content:space-between;margin-top:12px;font:600 14px/1 var(--lp-font-mono)}
10
+ & .ld-actions{margin-top:28px;opacity:0;transform:translateY(6px);transition:.5s}
11
+ & .ld.done .ld-actions{opacity:1;transform:none}
12
+ & .ld a.btn{display:inline-flex;padding:12px 18px;border-radius:999px;background:var(--lp-accent);color:var(--lp-accent-fg);text-decoration:none;font-size:13px;font-weight:600}
13
+ & .ld-dialog{width:min(460px,100%);background:#c0c0c0;box-shadow:inset -2px -2px #000,inset 2px 2px #fff,inset -4px -4px #808080,inset 4px 4px #dfdfdf;padding:4px;font:12px/1.4 "MS Sans Serif","Tahoma","Geneva",sans-serif;color:#000}
14
+ & .ld-dialog .tb{background:linear-gradient(90deg,#000080,#1084d0);color:#fff;font-weight:700;padding:4px 6px;display:flex;justify-content:space-between}
15
+ & .ld-dialog .tb b{background:#c0c0c0;color:#000;width:16px;height:14px;display:flex;align-items:center;justify-content:center;box-shadow:inset -1px -1px #000,inset 1px 1px #fff;font-size:10px}
16
+ & .ld-dialog .bd{padding:14px 12px}
17
+ & .ld-dialog .anim{height:46px;position:relative;margin-bottom:10px}
18
+ & .ld-dialog .anim .f{position:absolute;top:6px;width:34px;height:30px;background:#ffd84d;box-shadow:inset 0 0 0 1px #8a6b00}
19
+ & .ld-dialog .anim .f.a{left:4px}& .ld-dialog .anim .f.b{right:4px}
20
+ & .ld-dialog .anim .doc{position:absolute;top:2px;width:18px;height:22px;background:#fff;box-shadow:inset 0 0 0 1px #000}
21
+ & .ld-dialog .pb{height:20px;box-shadow:inset 1px 1px #808080,inset -1px -1px #fff;background:#fff;padding:2px;display:flex;gap:2px;overflow:hidden;margin:8px 0}
22
+ & .ld-dialog .pb i{width:10px;flex:none;background:#000080}
23
+ & .ld-dialog .btns{display:flex;justify-content:flex-end;gap:6px;margin-top:10px}
24
+ & .ld-dialog .btns a{min-width:76px;text-align:center;padding:4px 8px;background:#c0c0c0;color:#000;text-decoration:none;box-shadow:inset -1px -1px #000,inset 1px 1px #fff,inset -2px -2px #808080}
25
+ & .ld-term{width:min(820px,100%);font:clamp(13px,1.2cqw,16px)/1.75 var(--lp-font-mono)}
26
+ & .ld-term .ok{color:#3fb950}& .ld-term .er{color:#f85149}& .ld-term .dim{color:#8b949e}
27
+ & .ld-term a{color:#58a6ff}
28
+ & .ld-term .bar{color:#58a6ff;white-space:pre}
29
+ `,setup(p){let l=p.params,t=p.copy,m=t.actions[0]?.href??"/",a=document.createElement("div");a.className="ld";let h;if(l.style==="dialog"){a.innerHTML=`<div class="ld-dialog" role="dialog" aria-labelledby="ldt"><div class="tb"><span id="ldt">Copying page\u2026</span><b aria-hidden="true">\u2715</b></div><div class="bd">
30
+ <div class="anim" aria-hidden="true"><div class="f a"></div><div class="f b"></div><div class="doc"></div></div>
31
+ <h1 class="lp-sr">Error ${e(t.code)}: ${e(t.title)}</h1><div class="msg">${e(t.title)}</div><div class="pb"></div><div class="eta">Calculating time remaining\u2026</div>
32
+ <div class="btns"><a href="${e(m)}">${e(t.actions[0]?.label??"Home")}</a><a href="${e(m)}">Cancel</a></div></div></div>`;let i=a.querySelector(".pb"),s=a.querySelector(".doc"),g=a.querySelector(".eta"),d=a.querySelector(".msg");h=n=>{let o=Math.min(.99,n/9),r=Math.floor(o*34);i.children.length!==r&&(i.innerHTML="<i></i>".repeat(r));let x=n*.7%1;s.style.left=`calc(${10+x*80}% - 9px)`,s.style.top=`${2+Math.sin(x*Math.PI)*-6+6}px`;let f=Math.floor(n*37)%9999;g.textContent=n>9?`Error ${t.code}: the source page cannot be found.`:`${Math.max(1,9999-f)} minutes remaining`,n>9&&(d.textContent=t.message)}}else if(l.style==="terminal"){a.innerHTML=`<div class="ld-term"><h1 class="lp-sr">Error ${e(t.code)}: ${e(t.title)}</h1><div class="log"></div></div>`;let i=a.querySelector(".log"),s=-1;h=g=>{let d=Math.floor(g/.9),n=[`<span class="dim">$</span> npm install ${e(location?.pathname?.replace(/^\//,"")||"page")}`];for(let o=0;o<Math.min(d,l.steps.length);o++)n.push(`<span class="ok">\u2714</span> ${e(l.steps[o])}`);if(d<l.steps.length){let o=Math.floor(g%.9/.9*24);n.push(`<span class="bar">[${"\u2588".repeat(o)}${"\u2591".repeat(24-o)}]</span> ${e(l.steps[d]??"")}`)}else n.push(`<span class="er">\u2716 ERR! code E${e(t.code)}</span>`,`<span class="er">\u2716 ERR! ${e(t.title)}</span>`,`<span class="dim">npm ERR! ${e(t.message)}</span>`,`<span class="dim">Try:</span> <a href="${e(m)}">${e(t.actions[0]?.label??"go home")}</a>`);(n.length!==s||d<l.steps.length)&&(i.innerHTML=n.join("<br>"),s=n.length)}}else{a.innerHTML=`<div class="ld-min"><h1><span class="lp-sr">Error ${e(t.code)}: </span><span class="ttl">${e(t.title)}</span></h1><p class="step"></p>
33
+ <div class="ld-bar"><i></i></div><div class="ld-row"><span class="pct">0%</span><span class="eta"></span></div>
34
+ <div class="ld-actions"><a class="btn" href="${e(m)}">${e(t.actions[0]?.label??"Home")}</a></div></div>`;let i=a.querySelector(".ld-bar"),s=i.querySelector("i"),g=a.querySelector(".pct"),d=a.querySelector(".step"),n=a.querySelector(".eta"),o=a.querySelector(".ttl");h=r=>{let x=r<6?1-Math.pow(1-r/6,2.4):1,f=Math.min(99,Math.floor(x*99)),c=r>8.5;s.style.width=`${c?100:f}%`,i.classList.toggle("err",c),g.textContent=c?`${t.code}%`:`${f}%`,n.textContent=c?"failed":r>6?"any second now":`${Math.max(1,Math.ceil(6-r))}s left`,d.textContent=c?t.message:l.steps[Math.min(l.steps.length-1,Math.floor(r/1.05))],c&&(o.textContent="Couldn't load that page."),a.classList.toggle("done",c)}}return p.root.append(a),a.querySelectorAll("a").forEach(i=>i.addEventListener("click",s=>{s.metaKey||s.ctrlKey||(s.preventDefault(),p.navigate(i.getAttribute("href"),s))})),{frame(i){h(p.reducedMotion?99:i)},destroy(){a.remove()}}}};export{b as default};
@@ -0,0 +1,258 @@
1
+ import{a as n}from"./chunk-LMRCHEWX.js";import{a as s,b as i,c as l}from"./chunk-QJZBGT2Q.js";import{e as r}from"./chunk-HXSSPN2I.js";import"./chunk-URWX3LLV.js";var c=`
2
+ uniform vec3 uSkyTop, uSkyMid, uSkyHorizon, uCloudLit, uCloudDark, uWater, uScatter, uSunDir, uSunColor, uLamp, uFogColor;
3
+ uniform float uClouds, uSunDisc, uSunGlow, uSunSize, uBuoy, uLampPower, uBlink, uAmp, uChop, uSpeed, uCamH, uFog, uStars, uRain, uLightning, uBio, uExposure;
4
+ ${s}
5
+ ${i}
6
+ ${l}
7
+
8
+ const float FOCAL = 1.65;
9
+ const vec3 BUOY = vec3(0.0, 0.0, -190.0);
10
+
11
+ // Sum of sharpened directional waves, each one dragging the sample point along its slope,
12
+ // which bunches crests together and widens troughs like real wind sea.
13
+ float waves(vec2 p, int iters) {
14
+ float t = uTime * uSpeed;
15
+ float freq = 0.26;
16
+ float amp = uAmp * 0.5;
17
+ float h = 0.0;
18
+ float ang = 0.55;
19
+ for (int i = 0; i < 48; i++) {
20
+ if (i >= iters) break;
21
+ vec2 d = vec2(sin(ang), cos(ang));
22
+ float x = dot(d, p) * freq + t * sqrt(9.81 * freq) + float(i) * 1.618;
23
+ float w = exp(sin(x) - 1.0);
24
+ float dw = w * cos(x);
25
+ h += (w - 0.4) * amp;
26
+ p -= d * dw * amp * uChop * 0.9;
27
+ freq *= 1.18;
28
+ amp *= 0.82;
29
+ ang += 2.399;
30
+ }
31
+ return h;
32
+ }
33
+
34
+ vec3 waterNormal(vec2 p, float dist) {
35
+ float e = 0.01 + dist * 0.0024;
36
+ int iters = int(mix(34.0, 8.0, smoothstep(6.0, 420.0, dist)));
37
+ float h = waves(p, iters);
38
+ float hx = waves(p + vec2(e, 0.0), iters);
39
+ float hz = waves(p + vec2(0.0, e), iters);
40
+ return normalize(vec3(h - hx, e, h - hz));
41
+ }
42
+
43
+ float lightningFlash(float t) {
44
+ float k = floor(t / 7.3);
45
+ float lt = t - k * 7.3 - hash11(k) * 4.0;
46
+ float f = step(0.0, lt) * exp(-lt * 9.0) + step(0.16, lt) * 0.7 * exp(-(lt - 0.16) * 7.0) + step(0.42, lt) * 0.4 * exp(-(lt - 0.42) * 12.0);
47
+ return f * step(0.35, hash11(k + 3.1)) * uLightning;
48
+ }
49
+
50
+ vec3 sky(vec3 rd, float flash, bool detailed) {
51
+ float y = max(rd.y, 0.0);
52
+ vec3 col = mix(uSkyHorizon, uSkyMid, smoothstep(0.0, 0.14, y));
53
+ col = mix(col, uSkyTop, smoothstep(0.1, 0.75, y));
54
+
55
+ float sd = max(dot(rd, uSunDir), 0.0);
56
+ col += uSunColor * uSunGlow * (0.18 * pow(sd, 6.0) + 0.5 * pow(sd, 48.0) + 0.9 * pow(sd, 600.0));
57
+ // atmosphere band hugging the horizon near the light
58
+ col += uSunColor * uSunGlow * 0.35 * exp(-y * 18.0) * pow(sd, 3.0);
59
+
60
+ if (detailed && uStars > 0.0 && rd.y > 0.0) {
61
+ vec2 g = vec2(atan(rd.x, -rd.z), asin(rd.y)) * 260.0;
62
+ vec2 id = floor(g);
63
+ vec2 lp = fract(g) - 0.5 - (hash22(id) - 0.5) * 0.6;
64
+ float rnd = hash12(id + 7.0);
65
+ float s = smoothstep(0.16, 0.0, length(lp)) * step(0.985, rnd) * (0.5 + 0.5 * sin(uTime * (1.0 + rnd * 3.0) + rnd * 40.0));
66
+ col += vec3(0.85, 0.9, 1.0) * s * uStars * smoothstep(0.02, 0.2, y) * 1.4;
67
+ }
68
+
69
+ float disc = smoothstep(uSunSize, uSunSize * 0.8, acos(clamp(dot(rd, uSunDir), -1.0, 1.0)));
70
+ vec3 discCol = uSunColor * uSunDisc;
71
+ if (detailed && uSunDisc > 0.0 && uSunDir.y > 0.12) {
72
+ // moon: a little surface texture
73
+ vec2 mp = (rd.xy - uSunDir.xy) / uSunSize;
74
+ discCol *= 0.82 + 0.18 * fbm(mp * 3.0 + 4.0);
75
+ }
76
+ col = mix(col, discCol, disc * uSunDisc / max(uSunDisc, 1e-4));
77
+
78
+ if (uClouds > 0.0 && rd.y > -0.02) {
79
+ float yy = max(rd.y, 0.0) + 0.035;
80
+ vec2 cp = rd.xz / yy;
81
+ cp = cp * vec2(0.3, 0.8) + vec2(uTime * 0.012, uTime * 0.004);
82
+ float n = detailed ? fbm(cp * 0.9) : vnoise(cp * 0.9) * 0.55 + vnoise(cp * 1.9) * 0.3;
83
+ float n2 = detailed ? fbm(cp * 2.6 + 9.0) : 0.5;
84
+ float cov = smoothstep(1.0 - uClouds, 1.0 - uClouds + 0.38, n);
85
+ float thick = smoothstep(0.3, 0.75, n2 * 0.5 + n * 0.6);
86
+ vec3 cc = mix(uCloudLit, uCloudDark, thick);
87
+ cc += uSunColor * uSunGlow * 0.6 * pow(sd, 10.0) * (1.0 - thick);
88
+ cc += vec3(0.55, 0.62, 0.85) * flash * (0.6 + n2);
89
+ float fade = smoothstep(-0.02, 0.06, rd.y);
90
+ col = mix(col, cc, cov * fade * 0.92);
91
+ }
92
+ col += vec3(0.35, 0.4, 0.6) * flash * 0.35;
93
+ return col;
94
+ }
95
+
96
+ // Ray against the moving water surface: slab search, then bisection.
97
+ float traceWater(vec3 ro, vec3 rd) {
98
+ float top = 1.7 * uAmp, bot = -0.75 * uAmp;
99
+ if (rd.y >= -1e-4) return -1.0;
100
+ float t0 = (ro.y - top) / -rd.y;
101
+ float t1 = min((ro.y - bot) / -rd.y, 4000.0);
102
+ float prevT = t0;
103
+ float t = t0;
104
+ float stepT = (t1 - t0) / 26.0;
105
+ for (int i = 0; i < 27; i++) {
106
+ vec3 p = ro + rd * t;
107
+ if (p.y < waves(p.xz, 9)) break;
108
+ prevT = t;
109
+ t += stepT;
110
+ }
111
+ float a = prevT, b = min(t, t1);
112
+ for (int i = 0; i < 6; i++) {
113
+ float m = 0.5 * (a + b);
114
+ vec3 p = ro + rd * m;
115
+ if (p.y < waves(p.xz, 9)) b = m; else a = m;
116
+ }
117
+ return 0.5 * (a + b);
118
+ }
119
+
120
+ float buoyBob(){ return waves(BUOY.xz, 10); }
121
+
122
+ // Silhouette of a navigation buoy in metres (x across, y up from the waterline).
123
+ float buoySDF(vec2 q) {
124
+ float hull = length(max(abs(q - vec2(0.0, 0.18)) - vec2(0.62, 0.22), 0.0)) - 0.08;
125
+ float tower = abs(q.x) - mix(0.36, 0.13, clamp((q.y - 0.3) / 2.0, 0.0, 1.0));
126
+ tower = max(tower, abs(q.y - 1.35) - 1.05);
127
+ float cage = length(max(abs(q - vec2(0.0, 2.52)) - vec2(0.17, 0.14), 0.0)) - 0.02;
128
+ float cap = length(max(abs(q - vec2(0.0, 2.73)) - vec2(0.2, 0.025), 0.0));
129
+ float mast = max(abs(q.x) - 0.018, abs(q.y - 3.0) - 0.28);
130
+ return min(min(min(hull, tower), min(cage, cap)), mast);
131
+ }
132
+
133
+ void main() {
134
+ vec2 fc = gl_FragCoord.xy;
135
+ vec2 uv = (fc - 0.5 * uRes) / uRes.y;
136
+ float t = uTime;
137
+ float flash = lightningFlash(t);
138
+
139
+ // camera: slight swell bob and roll, pointer adds a gentle look-around
140
+ float bob = sin(t * 0.55) * 0.16 * (0.4 + uAmp) + sin(t * 0.31 + 1.3) * 0.08;
141
+ vec3 ro = vec3(0.0, uCamH + bob, 0.0);
142
+ float yaw = uMouse.x * 0.07;
143
+ float pitch = 0.028 + uMouse.y * 0.025 + sin(t * 0.4) * 0.004 * (0.5 + uAmp);
144
+ float roll = sin(t * 0.47) * 0.006 * (0.6 + uAmp);
145
+ vec3 fw = normalize(vec3(sin(yaw), sin(pitch), -cos(yaw)));
146
+ vec3 rt = normalize(cross(fw, vec3(sin(roll), cos(roll), 0.0)));
147
+ vec3 up = cross(rt, fw);
148
+ vec3 rd = normalize(fw * FOCAL + rt * uv.x + up * uv.y);
149
+ float px = 1.0 / (FOCAL * uRes.y); // radians per pixel
150
+
151
+ vec3 col;
152
+ float tw = traceWater(ro, rd);
153
+ float hitDist = tw > 0.0 ? tw : 1e9;
154
+ float blink = uBlink > 0.0 ? 0.25 + 0.75 * pow(max(sin(t * 6.2831 / uBlink) * 0.5 + 0.5, 1e-4), 6.0) : 1.0;
155
+ float bobY = buoyBob();
156
+ vec3 lampPos = BUOY + vec3(0.0, 2.52 + bobY, 0.0);
157
+
158
+ if (tw > 0.0) {
159
+ vec3 p = ro + rd * tw;
160
+ vec3 n = waterNormal(p.xz, tw);
161
+ float h01 = clamp(p.y / max(uAmp * 1.9, 1e-3) + 0.35, 0.0, 1.0);
162
+ float ndv = max(dot(n, -rd), 0.0);
163
+ float fres = 0.02 + 0.98 * pow(1.0 - ndv, 5.0);
164
+ vec3 r = reflect(rd, n);
165
+ r.y = abs(r.y);
166
+ vec3 refl = sky(r, flash, false);
167
+ vec3 body = uWater + uScatter * pow(h01, 2.0) * (0.35 + 0.65 * max(dot(n, normalize(vec3(uSunDir.x, 0.0, uSunDir.z) + vec3(0, 0.3, 0))), 0.0));
168
+ col = mix(body, refl, fres);
169
+
170
+ // sun / moon glitter
171
+ float sr = max(dot(r, uSunDir), 0.0);
172
+ col += uSunColor * uSunGlow * (pow(sr, 900.0) * 7.0 + pow(sr, 90.0) * 0.35) * smoothstep(-0.05, 0.02, uSunDir.y);
173
+
174
+ // buoy lamp glitter (finite light)
175
+ if (uBuoy > 0.5) {
176
+ vec3 L = normalize(lampPos - p);
177
+ float lr = max(dot(r, L), 0.0);
178
+ float att = 1.0 / (1.0 + 0.00002 * dot(lampPos - p, lampPos - p));
179
+ float near = smoothstep(15.0, 140.0, tw);
180
+ col += uLamp * uLampPower * blink * att * (pow(lr, 2600.0) * 22.0 * (0.25 + 0.75 * near) + (pow(lr, 420.0) * 0.45 + pow(lr, 40.0) * 0.02) * near);
181
+ }
182
+
183
+ // crest foam and bioluminescence
184
+ float foam = smoothstep(0.78, 1.0, h01) * smoothstep(0.6, 1.4, uAmp) * (0.5 + 0.5 * vnoise(p.xz * 1.7 + t));
185
+ col = mix(col, uCloudLit * 1.4 + 0.05, foam * 0.45);
186
+ if (uBio > 0.0) {
187
+ float sparkle = pow(vnoise(p.xz * 6.0 - t * 0.9), 3.0) * 3.0 + pow(vnoise(p.xz * 17.0 + t), 4.0) * 4.0;
188
+ float crest = smoothstep(0.5, 0.9, h01) * (1.0 - smoothstep(0.92, 1.0, h01) * 0.5);
189
+ float edge = smoothstep(0.35, 0.0, abs(vnoise(p.xz * 0.9 + t * 0.15) - 0.5));
190
+ col += vec3(0.08, 0.8, 1.0) * uBio * crest * (0.15 + sparkle * edge) * exp(-tw * 0.01);
191
+ }
192
+
193
+ // aerial perspective
194
+ float haze = 1.0 - exp(-tw * (0.0016 + uFog * 0.02));
195
+ col = mix(col, mix(uSkyHorizon, uFogColor, clamp(uFog * 3.0, 0.0, 1.0)), haze);
196
+ } else {
197
+ col = sky(rd, flash, true);
198
+ if (uFog > 0.0) col = mix(col, uFogColor, clamp(uFog * 2.2, 0.0, 1.0) * exp(-max(rd.y, 0.0) * 9.0));
199
+ }
200
+
201
+ // buoy silhouette (a vertical card at the buoy distance)
202
+ if (uBuoy > 0.5) {
203
+ float tb = (ro.z - BUOY.z) / -rd.z;
204
+ if (tb > 0.0 && tb < hitDist + 1.5) {
205
+ vec3 q = ro + rd * tb;
206
+ vec2 local = vec2(q.x - BUOY.x, q.y - BUOY.y - bobY + 0.25);
207
+ float tilt = sin(t * 0.9) * 0.05;
208
+ local = mat2(cos(tilt), -sin(tilt), sin(tilt), cos(tilt)) * local;
209
+ float d = buoySDF(local);
210
+ float pxm = px * tb * 1.2;
211
+ float a = smoothstep(pxm, -pxm, d);
212
+ vec3 bc = mix(vec3(0.012, 0.016, 0.025), uLamp * 0.35 * blink, smoothstep(1.6, 2.6, local.y) * 0.5);
213
+ float haze = 1.0 - exp(-tb * (0.0016 + uFog * 0.02));
214
+ bc = mix(bc, mix(uSkyHorizon, uFogColor, clamp(uFog * 3.0, 0.0, 1.0)), haze * 0.85);
215
+ col = mix(col, bc, a);
216
+ }
217
+ // lamp core, halo, wide bloom and a faint horizontal streak
218
+ vec3 ld = normalize(lampPos - ro);
219
+ float ang = acos(clamp(dot(rd, ld), -1.0, 1.0)) / px;
220
+ vec3 lrel = vec3(dot(rd - ld, rt), dot(rd - ld, up), 0.0) / px;
221
+ float fogDim = exp(-uFog * 4.0);
222
+ float g = exp(-ang * ang / 4.5) * 3.0 + exp(-ang / 7.0) * 0.55 * fogDim + exp(-ang / 60.0) * 0.12 + exp(-ang / 240.0) * 0.05 * (1.0 + uFog * 6.0);
223
+ g += exp(-abs(lrel.y) / 1.6) * exp(-abs(lrel.x) / 90.0) * 0.08 * fogDim;
224
+ if (tw > 0.0 && hitDist < length(lampPos - ro) - 2.0) g *= 0.25;
225
+ col += uLamp * uLampPower * blink * g;
226
+ }
227
+
228
+ // rain streaks
229
+ if (uRain > 0.0) {
230
+ for (int i = 0; i < 3; i++) {
231
+ float fi = float(i);
232
+ vec2 ruv = uv * (vec2(90.0, 3.2) + fi * vec2(40.0, 1.5)) + vec2(uv.y * 9.0, t * (6.0 + fi * 2.5));
233
+ vec2 id = floor(ruv);
234
+ float rnd = hash12(id + fi * 17.0);
235
+ float y = fract(ruv.y + rnd * 7.0);
236
+ float streak = step(0.82, rnd) * smoothstep(0.0, 0.05, y) * smoothstep(0.45, 0.05, y) * smoothstep(0.12, 0.0, abs(fract(ruv.x) - 0.5));
237
+ col += mix(uSkyHorizon, vec3(0.7, 0.75, 0.85), 0.5) * streak * uRain * (0.18 - fi * 0.04);
238
+ }
239
+ }
240
+
241
+ col *= uExposure;
242
+ col = aces(col);
243
+ col = toSRGB(col);
244
+ col *= mix(0.72, 1.0, vignette(vUv, 0.22));
245
+ col += grain(fc, t) * 0.022;
246
+ fragColor = vec4(col, 1.0);
247
+ }
248
+ `,u=(a,e)=>{let o=a*Math.PI/180,t=e*Math.PI/180;return[Math.sin(t)*Math.cos(o),Math.sin(o),-Math.cos(t)*Math.cos(o)]},d={id:"lost-at-sea",name:"Lost at Sea",description:"A live ocean at blue hour, one buoy light blinking on the horizon. Waves, reflections and weather are all rendered in real time.",category:"Ocean",kind:"3d",motion:"live",tags:["webgl","ocean","night","calm","cinematic","photoreal","weather"],layout:"split",copy:{eyebrow:"Off the chart",title:"Lost at sea.",message:"This page drifted beyond the map. Let's get you back to familiar waters.",actions:[{label:"Back to familiar waters",href:"/",variant:"primary",icon:"back"},{label:"Explore the site",href:"/",variant:"secondary",icon:"arrow"}]},params:{skyTop:"#08111f",skyMid:"#18273f",skyHorizon:"#3f5576",cloudLit:"#3a4f6f",cloudDark:"#0e1829",clouds:.62,water:"#020a15",scatter:"#0b2638",sunElevation:-4,sunAzimuth:-38,sunColor:"#7d8fb3",sunDisc:0,sunGlow:.35,sunSize:.012,buoy:!0,lamp:"#ffb057",lampPower:1.4,blink:4,waveHeight:.42,choppiness:1,speed:1,cameraHeight:2.3,fog:0,fogColor:"#3b4a60",stars:0,rain:0,lightning:0,bioluminescence:0,exposure:.9},theme:{bg:"#0a1424",fg:"#f3f5f8","code-color":"rgba(178,196,224,.24)",accent:"#f2eee6","accent-fg":"#0b1424"},presetName:"Blue Hour",presets:{midday:{name:"Midday",eyebrow:"Clear skies",title:"Calm seas. No page.",message:"Perfect sailing weather, and still not a sign of the page you wanted. The harbour's this way.",params:{skyTop:"#2f7fd6",skyMid:"#6fb3ee",skyHorizon:"#cfe8f7",cloudLit:"#ffffff",cloudDark:"#b9cfe0",clouds:.35,water:"#053a5c",scatter:"#0e8aa8",sunElevation:38,sunAzimuth:18,sunColor:"#fff6e0",sunDisc:2,sunGlow:.9,sunSize:.02,lampPower:.25,exposure:.72,waveHeight:.5},theme:{bg:"#1d6aa8","code-color":"rgba(255,255,255,.42)",accent:"#ffffff","accent-fg":"#06263d"}},"red-dawn":{name:"Red Dawn",eyebrow:"Red sky at morning",title:"Sailors take warning.",message:"The page set out at first light and never came back. Best stay close to home today.",params:{skyTop:"#1b1030",skyMid:"#7a1f3a",skyHorizon:"#ff5a3c",cloudLit:"#ff7a5a",cloudDark:"#2a0f1f",clouds:.7,water:"#0a0610",scatter:"#3a1220",sunElevation:1,sunAzimuth:-12,sunColor:"#ff6a3c",sunDisc:5,sunGlow:1.2,sunSize:.026,exposure:.75,waveHeight:.6},theme:{bg:"#2a0f1f","code-color":"rgba(255,190,170,.25)",accent:"#ffd9cc","accent-fg":"#2a0f1f"}},starless:{name:"New Moon",eyebrow:"Dead reckoning",title:"Not a star to steer by.",message:"No moon, no stars, no page. Just one small light out there, and it isn't yours.",params:{skyTop:"#010205",skyMid:"#03070f",skyHorizon:"#0b1424",cloudLit:"#0b1424",cloudDark:"#010205",clouds:.5,water:"#000204",scatter:"#020a12",sunGlow:.02,lamp:"#ffd36b",lampPower:2.2,blink:5,exposure:1.3},theme:{bg:"#010205","code-color":"rgba(170,190,220,.14)"}},monsoon:{name:"Monsoon",eyebrow:"Heavy weather",title:"Swept overboard.",message:"The page went over the side in the downpour. We're turning back for port.",params:{skyTop:"#1d2a2a",skyMid:"#3a4a48",skyHorizon:"#6b7a72",cloudLit:"#55645f",cloudDark:"#141c1c",clouds:.95,water:"#071210",scatter:"#16302a",sunGlow:.08,waveHeight:.95,choppiness:1.2,rain:1.4,fog:.08,fogColor:"#5a6a64",lamp:"#ffe36b",exposure:1.05},theme:{bg:"#1d2a2a","code-color":"rgba(220,235,225,.16)"}},lavender:{name:"Lavender Dusk",eyebrow:"Last light",title:"Drifting into the evening.",message:"The page sailed off as the sky turned violet. The lights of home are behind you.",params:{skyTop:"#241a4a",skyMid:"#5a4a8a",skyHorizon:"#d9a6c9",cloudLit:"#c99ad0",cloudDark:"#2a2050",clouds:.45,water:"#0a0818",scatter:"#2a1f4a",sunElevation:-2,sunAzimuth:25,sunColor:"#ffc2d9",sunGlow:.8,exposure:.85},theme:{bg:"#2a2050","code-color":"rgba(240,215,240,.24)",accent:"#fbe6ff","accent-fg":"#241a4a"}},"golden-hour":{name:"Golden Hour",eyebrow:"Sunset bearing",title:"Sailed past the sunset.",message:"The page you're after slipped below the horizon. The way home is still lit.",params:{skyTop:"#1a2340",skyMid:"#6b4a62",skyHorizon:"#f39a5c",cloudLit:"#e88f6b",cloudDark:"#3a2a3c",clouds:.5,water:"#06101c",scatter:"#3a2a2a",sunElevation:2.2,sunAzimuth:8,sunColor:"#ffb26a",sunDisc:6,sunGlow:1.3,sunSize:.022,lampPower:.8,exposure:.72,waveHeight:.45},theme:{bg:"#3a2a3c","code-color":"rgba(255,226,196,.26)",accent:"#fff3e6","accent-fg":"#2a1a20"}},moonlit:{name:"Moonlit",eyebrow:"Night watch",title:"Nothing but moonlight here.",message:"We searched every wave for this page. Follow the silver path back.",params:{skyTop:"#02050c",skyMid:"#0a1424",skyHorizon:"#1d2b44",cloudLit:"#3d4b66",cloudDark:"#070c16",clouds:.32,water:"#01050b",scatter:"#06131f",sunElevation:17,sunAzimuth:14,sunColor:"#c9d6f5",sunDisc:2.2,sunGlow:.32,sunSize:.03,stars:1,lampPower:.9,lamp:"#9ff0c4",blink:2.5},theme:{bg:"#050a14","code-color":"rgba(210,222,255,.18)"}},storm:{name:"Storm",eyebrow:"Small craft warning",title:"Rough waters.",message:"This page didn't survive the storm. Head for the harbour while we search.",actions:[{label:"Head for harbour",href:"/",variant:"primary",icon:"back"}],params:{skyTop:"#05070b",skyMid:"#151b24",skyHorizon:"#3b4652",cloudLit:"#2c3540",cloudDark:"#07090d",clouds:.92,water:"#03080d",scatter:"#0e2229",sunGlow:.1,waveHeight:1.05,choppiness:1.25,speed:1.25,cameraHeight:3.4,rain:1,lightning:1,lamp:"#ff5a4a",blink:1.6,lampPower:1.6,exposure:1.25},theme:{bg:"#0a0d12","code-color":"rgba(200,210,220,.17)"}},fog:{name:"Fog Bank",eyebrow:"Visibility nil",title:"Lost in the fog.",message:"We can hear the page, but we can't see it. Sound the horn and head back.",params:{skyTop:"#5e6a76",skyMid:"#76818c",skyHorizon:"#8a949d",cloudLit:"#97a0a8",cloudDark:"#6b7580",clouds:.2,water:"#141c23",scatter:"#26343c",fog:.32,fogColor:"#7f8a94",sunGlow:.2,sunColor:"#c9d2da",lamp:"#ff4b3a",blink:3,lampPower:2.2,waveHeight:.35,exposure:.95},theme:{bg:"#6f7a84",fg:"#0f171e","code-color":"rgba(20,30,40,.18)",accent:"#0f171e","accent-fg":"#eef1f3"}},bioluminescent:{name:"Bioluminescent",eyebrow:"Glowing waters",title:"The sea lit up, the page didn't.",message:"Every wave is glowing except the one you came for. Swim back to shore.",params:{skyTop:"#010309",skyMid:"#040a18",skyHorizon:"#0c1a2e",cloudLit:"#0f1d33",cloudDark:"#02050b",clouds:.25,water:"#000306",scatter:"#001820",stars:.8,bioluminescence:1.4,buoy:!1,sunGlow:.05,waveHeight:.7,exposure:1.2},theme:{bg:"#01050b","code-color":"rgba(120,240,255,.22)",accent:"#7ff3ff","accent-fg":"#00141a"}},arctic:{name:"Arctic Dawn",eyebrow:"Latitude unknown",title:"Too far north.",message:"The page froze somewhere past the last chart. Thaw out back home.",params:{skyTop:"#2c3c5c",skyMid:"#8a93b8",skyHorizon:"#f1c6c0",cloudLit:"#e9d4dc",cloudDark:"#7b829f",clouds:.4,water:"#0b1622",scatter:"#28485a",sunElevation:.5,sunAzimuth:-22,sunColor:"#ffd2b8",sunDisc:4,sunGlow:.9,sunSize:.02,lamp:"#fff1c9",lampPower:.6,waveHeight:.3,choppiness:.7,speed:.8,exposure:.78},theme:{bg:"#8a93b8","code-color":"rgba(255,255,255,.3)",accent:"#ffffff","accent-fg":"#1d2840"}}},css:`
249
+ & .lp-eyebrow{display:flex;align-items:center;gap:16px;font-size:10px;letter-spacing:.42em}
250
+ & .lp-eyebrow::before,& .lp-eyebrow::after{content:"";width:34px;height:1px;background:currentColor;opacity:.45}
251
+ & .lp-code{font-weight:500;letter-spacing:-.02em;
252
+ -webkit-mask-image:linear-gradient(180deg,#000 25%,rgba(0,0,0,.5));mask-image:linear-gradient(180deg,#000 25%,rgba(0,0,0,.5))}
253
+ & .lp-btn--primary{border-radius:3px;padding:12px 18px;font-size:12px}
254
+ & .lp-btn--secondary{font-size:12px;border-bottom:0;opacity:.85}
255
+ & .lp-btn--secondary:hover{opacity:1}
256
+ & .lp-title{text-shadow:0 2px 30px rgba(0,0,0,.25)}
257
+ & .lp-message,& .lp-btn--secondary{text-shadow:0 1px 14px rgba(0,0,0,.55)}
258
+ `,setup(a){let e=a.params,o=t=>r(t);return n(a,{frag:c,uniforms:()=>({uSkyTop:o(e.skyTop),uSkyMid:o(e.skyMid),uSkyHorizon:o(e.skyHorizon),uCloudLit:o(e.cloudLit),uCloudDark:o(e.cloudDark),uClouds:e.clouds,uWater:o(e.water),uScatter:o(e.scatter),uSunDir:u(e.sunElevation,e.sunAzimuth),uSunColor:o(e.sunColor),uSunDisc:e.sunDisc,uSunGlow:e.sunGlow,uSunSize:e.sunSize,uBuoy:e.buoy?1:0,uLamp:o(e.lamp),uLampPower:e.lampPower,uBlink:e.blink,uAmp:e.waveHeight,uChop:e.choppiness,uSpeed:e.speed,uCamH:e.cameraHeight,uFog:e.fog,uFogColor:o(e.fogColor),uStars:e.stars,uRain:e.rain,uLightning:e.lightning,uBio:e.bioluminescence,uExposure:e.exposure})})}};export{d as default};
@@ -0,0 +1,2 @@
1
+ import{a as A}from"./chunk-4ZBXB36L.js";import{f as O}from"./chunk-HXSSPN2I.js";import"./chunk-URWX3LLV.js";var E={id:"magic-8-ball",name:"Magic 8 Ball",description:"Ask the oracle where your page went. Click or tap to shake it, and the answer floats up through the dark liquid.",category:"Playful",kind:"2d",motion:"interactive",tags:["canvas","toy","funny","interactive","glossy","dark"],layout:"right",copy:{eyebrow:"Ask again later",title:"Outlook: not found.",message:"Even the oracle doesn't know where this page went. Shake it for a second opinion.",actions:[{label:"Go home",href:"/",variant:"primary"}]},params:{ball:"#0d0d10",window:"#06061a",die:"#2b3cff",bg:"#1c1530",bg2:"#05040a",answers:["PAGE NOT FOUND","ASK AGAIN LATER","OUTLOOK NOT SO GOOD","TRY THE HOMEPAGE","SIGNS POINT TO 404","REPLY HAZY, GO HOME","MY SOURCES SAY NO","CANNOT PREDICT NOW","DON'T COUNT ON IT"]},theme:{bg:"#120d20",fg:"#f2edff",accent:"#f2edff","accent-fg":"#120d20"},presetName:"Classic",presets:{gold:{name:"Gold Oracle",params:{ball:"#1a1206",window:"#0d0802",die:"#d4af37",bg:"#2a1d0a",bg2:"#0a0702"},theme:{bg:"#140d04",fg:"#fff3d6",accent:"#d4af37","accent-fg":"#140d04"}},mint:{name:"Mint",params:{ball:"#2ec4b6",window:"#04201d",die:"#ffffff",bg:"#e6fbf7",bg2:"#bff0e6"},theme:{bg:"#e6fbf7",fg:"#04201d",accent:"#04201d","accent-fg":"#fff"}},pink:{name:"Bubblegum",params:{ball:"#ff5fa2",window:"#2a0718",die:"#ffd23f",bg:"#ffe0ee",bg2:"#ffc2dc"},theme:{bg:"#ffe0ee",fg:"#3a0b22",accent:"#3a0b22","accent-fg":"#fff"}},crystal:{name:"Crystal",params:{ball:"#2a2f45",window:"#0a1430",die:"#00d1ff",bg:"#e8ecf7",bg2:"#c7cfe6"},theme:{bg:"#e8ecf7",fg:"#141a2e",accent:"#141a2e","accent-fg":"#fff"}}},css:`& .lp-overlay{padding-right:clamp(24px,8cqw,140px)}& .lp-head,& .lp-body{max-width:min(460px,42cqw)}
2
+ @container (max-width:760px){& .lp-head,& .lp-body{max-width:none}& .lp-overlay{justify-content:flex-end}}`,setup(s){let o=s.params,l=A(s),m=0,P=-10,g=1,k=0,T=()=>{P=performance.now()/1e3,g=0,m=(m+1+Math.floor(Math.random()*(o.answers.length-1)))%o.answers.length,s.invalidate()};s.on("pointerdown",i=>{i.target.closest("a,button")||T()});let x=(i,w,e)=>{let y=w.split(" "),f=[],a="";for(let t of y){let n=a?a+" "+t:t;i.measureText(n).width>e&&a?(f.push(a),a=t):a=n}return a&&f.push(a),f};return{resize(){l.reset()},frame(i,w){let e=l.g;l.reset();let y=performance.now()/1e3,f=l.w<760,a=f?Math.min(l.w*.36,l.h*.26):Math.min(l.h*.34,l.w*.24),t=f?l.w/2:l.w*.32,n=f?l.h*.3:l.h*.48,c=y-P;if(c<.9){let p=1-c/.9;t+=Math.sin(c*60)*a*.08*p,n+=Math.cos(c*47)*a*.05*p}else s.reducedMotion||(n+=Math.sin(i*1.2)*a*.02);c>.9&&(g=Math.min(1,g+w*.8)),!s.pointer.engaged&&!s.reducedMotion&&i-k>7&&(k=i,T());let S=e.createRadialGradient(t,n,a*.5,t,n,Math.max(l.w,l.h));S.addColorStop(0,o.bg),S.addColorStop(1,o.bg2),e.fillStyle=S,e.fillRect(0,0,l.w,l.h),e.fillStyle="rgba(0,0,0,.35)",e.beginPath(),e.ellipse(t,n+a*1.08,a*.8,a*.12,0,0,Math.PI*2),e.fill();let h=e.createRadialGradient(t-a*.35,n-a*.4,a*.05,t,n,a);h.addColorStop(0,O("#ffffff",.35)),h.addColorStop(.18,o.ball),h.addColorStop(1,"#000000"),e.fillStyle=h,e.beginPath(),e.arc(t,n,a,0,Math.PI*2),e.fill(),e.strokeStyle="rgba(255,255,255,.12)",e.lineWidth=a*.03,e.beginPath(),e.arc(t,n,a*.985,Math.PI*.1,Math.PI*.9),e.stroke();let d=a*.46,u=e.createRadialGradient(t,n,0,t,n,d);u.addColorStop(0,o.window),u.addColorStop(1,"#000"),e.fillStyle=u,e.beginPath(),e.arc(t,n,d,0,Math.PI*2),e.fill(),e.strokeStyle="rgba(255,255,255,.25)",e.lineWidth=a*.02,e.stroke();let b=g;e.save(),e.translate(t,n+(1-b)*d*.4+Math.sin(i*1.5)*d*.015),e.rotate((1-b)*.6+Math.sin(i*.8)*.03),e.globalAlpha=b;let r=d*.88;e.fillStyle=o.die,e.beginPath(),e.moveTo(0,-r*.62),e.lineTo(r*.82,r*.5),e.lineTo(-r*.82,r*.5),e.closePath(),e.fill(),e.fillStyle="#e8ecff",e.textAlign="center",e.textBaseline="middle",e.font=`800 ${r*.13}px "Inter",ui-sans-serif,system-ui,sans-serif`;let C=x(e,o.answers[m],r*.62);C.forEach((p,N)=>e.fillText(p,0,r*.12+(N-(C.length-1)/2)*r*.16)),e.restore(),e.globalAlpha=1,e.fillStyle=O(o.window,.35*(1-b)),e.beginPath(),e.arc(t,n,d,0,Math.PI*2),e.fill();let M=e.createRadialGradient(t-a*.42,n-a*.48,0,t-a*.42,n-a*.48,a*.38);M.addColorStop(0,"rgba(255,255,255,.55)"),M.addColorStop(1,"rgba(255,255,255,0)"),e.fillStyle=M,e.beginPath(),e.arc(t,n,a,0,Math.PI*2),e.fill(),s.pointer.engaged||(e.fillStyle="rgba(255,255,255,.55)",e.font="600 12px ui-monospace,Menlo,monospace",e.textAlign="center",e.fillText("click to shake",t,n+a*1.28))}}}};export{E as default};
@@ -0,0 +1,3 @@
1
+ import{a as I}from"./chunk-4ZBXB36L.js";import{f as F}from"./chunk-HXSSPN2I.js";import{a as S,b as R,d as C}from"./chunk-IETNWEVK.js";import"./chunk-URWX3LLV.js";var G="\uFF71\uFF72\uFF73\uFF74\uFF75\uFF76\uFF77\uFF78\uFF79\uFF7A\uFF7B\uFF7C\uFF7D\uFF7E\uFF7F\uFF80\uFF81\uFF82\uFF83\uFF84\uFF85\uFF86\uFF87\uFF88\uFF89\uFF8A\uFF8B\uFF8C\uFF8D\uFF8E\uFF8F\uFF90\uFF91\uFF92\uFF93\uFF94\uFF95\uFF96\uFF97\uFF98\uFF99\uFF9A\uFF9B\uFF9C\uFF9D0123456789",z={id:"matrix-rain",name:"Digital Rain",description:"Falling columns of glyphs. Look closer and the 404 is written in the rain.",category:"Retro Tech",kind:"2d",motion:"live",tags:["canvas","matrix","code","hacker","green","dark"],layout:"bottom",codeInScene:!0,copy:{eyebrow:"Wake up",title:"There is no page.",message:"You followed the link down the rabbit hole. Take the green button back to reality.",actions:[{label:"Take me back",href:"/",variant:"primary"},{label:"Stay in the rain",href:"#",variant:"secondary"}]},params:{color:"#18ff6d",head:"#d7ffe6",bg:"#000a03",cell:16,speed:1,glyphs:G,reveal:.9},theme:{bg:"#000a03",fg:"#c9ffd9",accent:"#18ff6d","accent-fg":"#000a03","font-display":"var(--lp-font-mono)","title-weight":"600"},presetName:"Green",presets:{violet:{name:"Violet",params:{color:"#b47bff",head:"#f3e6ff",bg:"#07000f"},theme:{bg:"#07000f",fg:"#f3e6ff",accent:"#b47bff","accent-fg":"#07000f"}},gold:{name:"Gold",params:{color:"#ffcf4d",head:"#fff6d6",bg:"#0a0700",glyphs:"0123456789$\xA5\u20AC\xA3"},theme:{bg:"#0a0700",fg:"#fff6d6",accent:"#ffcf4d","accent-fg":"#0a0700"}},hex:{name:"Hex Dump",title:"0x404: page not mapped.",params:{color:"#3bd6ff",head:"#e6faff",bg:"#00070c",glyphs:"0123456789ABCDEF",cell:15},theme:{bg:"#00070c",fg:"#e6faff",accent:"#3bd6ff","accent-fg":"#00070c"}},sakura:{name:"Pink Rain",params:{color:"#ff6fae",head:"#ffe6f2",bg:"#0d0208"},theme:{bg:"#0d0208",fg:"#ffe6f2",accent:"#ff6fae","accent-fg":"#0d0208"}},amber:{name:"Amber",params:{color:"#ffb000",head:"#fff0c8",bg:"#0a0600",glyphs:"0123456789ABCDEF"},theme:{bg:"#0a0600",fg:"#ffe2a8",accent:"#ffb000","accent-fg":"#0a0600"}},ice:{name:"Ice",params:{color:"#4fd8ff",head:"#e8fbff",bg:"#00060c"},theme:{bg:"#00060c",fg:"#d6f6ff",accent:"#4fd8ff","accent-fg":"#00060c"}},binary:{name:"Binary",title:"01000110 01101111 01110101 01101110 01100100? No.",params:{color:"#e6e6e6",head:"#ffffff",bg:"#050505",glyphs:"01",cell:14},theme:{bg:"#050505",fg:"#f2f2f2",accent:"#ffffff","accent-fg":"#050505"}},blood:{name:"Red Pill",eyebrow:"You took the red pill",title:"And it led here. Nowhere.",params:{color:"#ff2a3d",head:"#ffd6da",bg:"#0a0002"},theme:{bg:"#0a0002",fg:"#ffd6da",accent:"#ff2a3d","accent-fg":"#0a0002"}},paper:{name:"Paper",params:{color:"#2b2b2b",head:"#000000",bg:"#f4f1ea",glyphs:"abcdefghijklmnopqrstuvwxyz0123456789"},theme:{bg:"#f4f1ea",fg:"#111",accent:"#111","accent-fg":"#f4f1ea"}}},css:`& .lp-title{text-shadow:0 0 18px color-mix(in srgb,var(--lp-accent) 45%,transparent)}
2
+ & .lp-message{color:color-mix(in srgb,var(--lp-fg) 75%,transparent)}
3
+ & .lp-body{background:radial-gradient(closest-side,color-mix(in srgb,var(--lp-bg) 85%,transparent),transparent);padding:24px 40px}`,setup(y){let g=y.params,c=I(y),s=y.random,u=[...g.glyphs],N=parseInt(g.bg.slice(1,3),16)>128,T,t=0,o=0,w,A,x,d,n=g.cell;function B(h,m){let f=n*2,l=document.createElement("canvas");l.width=f*u.length,l.height=f*2;let r=l.getContext("2d");return r.font=`${f*.78}px ${R}`,r.textAlign="center",r.textBaseline="middle",u.forEach((p,e)=>{r.save(),r.translate(e*f+f/2,f/2),e%2===0&&r.scale(-1,1),r.fillStyle=h,r.fillText(p,0,0),r.restore(),r.save(),r.translate(e*f+f/2,f+f/2),r.fillStyle=m,r.shadowColor=h,r.shadowBlur=f*.4,r.fillText(p,0,0),r.restore()}),l}function D(){n=Math.max(11,Math.round(g.cell*Math.min(1,Math.max(.75,c.w/1440)))),t=Math.ceil(c.w/n),o=Math.ceil(c.h/n),w=new Float32Array(t),A=new Float32Array(t);for(let e=0;e<t;e++)w[e]=s()*o*1.5-o*.5,A[e]=(.5+s()*.9)*g.speed;d=new Uint16Array(t*o);for(let e=0;e<d.length;e++)d[e]=Math.floor(s()*u.length);let h=Math.min(c.w*.86,1200),m=Math.min(h*.42,c.h*.45),l=C(y.copy.code||"404",{width:t,height:o,font:S,weight:900,fit:1,cx:.5,cy:.4}).getContext("2d");l.clearRect(0,0,t,o);let r=C(y.copy.code||"404",{width:h/n,height:m/n,font:S,weight:900,fit:.98});l.drawImage(r,(t-h/n)/2,o*.4-m/n/2);let p=l.getImageData(0,0,t,o).data;x=new Uint8Array(t*o);for(let e=0;e<t*o;e++)x[e]=p[e*4+3]>110?1:0;T=B(g.color,g.head),c.reset(),c.g.fillStyle=g.bg,c.g.fillRect(0,0,c.w,c.h)}D();let v=0;return{resize(){D()},frame(h,m){let f=c.g;c.reset();let l=m===0;if(v+=m,!(l||v>1/30))return;let p=l?0:v;v=0,f.globalCompositeOperation="source-over",f.fillStyle=F(g.bg,l?1:.11),f.fillRect(0,0,c.w,c.h);let e=n*2,k=(a,i,b,M,U)=>{f.globalAlpha=U,f.drawImage(T,a*e,M?e:0,e,e,i,b,n,n)};for(let a=0;a<t;a++){w[a]+=A[a]*p*22;let i=Math.floor(w[a]);if(i>=0&&i<o){let b=i*t+a;s()<.3&&(d[b]=Math.floor(s()*u.length)),k(d[b],a*n,i*n,!0,1)}i>o+8&&s()>.96&&(w[a]=-s()*20)}let E=g.reveal*(l?1:.7+.3*Math.sin(h*.8)**2),P=l?t*o:Math.ceil(t*o*.22);for(let a=0;a<P;a++){let i=l?a:Math.floor(s()*t*o);if(!x[i])continue;let b=i%t,M=i/t|0;s()<.15&&(d[i]=Math.floor(s()*u.length)),k(d[i],b*n,M*n,s()<.35,E)}if(l)for(let a=0;a<t*o;a++)!x[a]&&s()<.18&&k(d[a],a%t*n,(a/t|0)*n,!1,.25+s()*.4);f.globalAlpha=1}}}};export{z as default};
@@ -0,0 +1 @@
1
+ import{a as R,d as P,g as W}from"./chunk-JLRXT2AZ.js";import{a as N}from"./chunk-4ZBXB36L.js";import{f as D}from"./chunk-HXSSPN2I.js";import"./chunk-IETNWEVK.js";import"./chunk-URWX3LLV.js";var L={id:"maze",name:"Labyrinth",description:"You're a dot lost in a maze. Use the arrow keys, WASD or swipes to find the exit, and the exit takes you home.",category:"Games",kind:"2d",motion:"game",tags:["canvas","game","playable","maze","puzzle","keyboard","touch","minimal"],layout:"bottom",codeInScene:!0,copy:{eyebrow:"Find the way out",title:"You took a wrong turn.",message:"Navigate to the glowing exit and we'll take you home. Arrow keys, WASD or swipe.",actions:[{label:"Skip the maze",href:"/",variant:"secondary",icon:"arrow"}]},params:{bg:"#f4f1ea",wall:"#1c1a17",player:"#ff4d2e",exit:"#2bb673",trail:"#ffb8a8"},theme:{bg:"#f4f1ea",fg:"#1c1a17",accent:"#1c1a17","accent-fg":"#f4f1ea"},presetName:"Paper",presets:{blueprint:{name:"Blueprint",params:{bg:"#123e7a",wall:"#e6f0ff",player:"#ffd23f",exit:"#3dff8a",trail:"#3a6aa8"},theme:{bg:"#123e7a",fg:"#e6f0ff",accent:"#e6f0ff","accent-fg":"#123e7a"}},candy:{name:"Candy",params:{bg:"#fff2f7",wall:"#ff4f8b",player:"#5b2cff",exit:"#2bb673",trail:"#d9ccff"},theme:{bg:"#fff2f7",fg:"#3a0a22",accent:"#3a0a22","accent-fg":"#fff"}},neon:{name:"Neon",params:{bg:"#07070f",wall:"#3bd6ff",player:"#ff3bd4",exit:"#3dff8a",trail:"#5a1a52"},theme:{bg:"#07070f",fg:"#e6f9ff",accent:"#3bd6ff","accent-fg":"#07070f"}},hedge:{name:"Hedge Maze",params:{bg:"#c9b98a",wall:"#2f5a2a",player:"#e8402a",exit:"#ffd23f",trail:"#e8c9a0"},theme:{bg:"#c9b98a",fg:"#1d2a14",accent:"#1d2a14","accent-fg":"#fff"}}},css:W,setup(b){let y=b.params,s=N(b),h=R(b,{pointerPlays:!1}),Y=b.random,n=0,c=0,t=0,d=0,g=0,M,m={x:0,y:0,dx:0,dy:0},k=[],S=0,I=0,E=[],z=0;function O(){let u=s.h*.6;t=Math.max(18,Math.min(34,Math.floor(Math.min(s.w/30,u/15)))),n=Math.floor(s.w*.86/t),c=Math.floor(u/t),d=Math.floor((s.w-n*t)/2),g=Math.max(16,Math.floor(s.h*.05)),M=new Uint8Array(n*c).fill(15);let p=new Uint8Array(n*c),e=[[0,0]];p[0]=1;let T=[[0,-1,1,4],[1,0,2,8],[0,1,4,1],[-1,0,8,2]];for(;e.length;){let[o,a]=e[e.length-1],l=T.filter(([B,G])=>{let U=o+B,C=a+G;return U>=0&&C>=0&&U<n&&C<c&&!p[C*n+U]});if(!l.length){e.pop();continue}let[f,i,r,A]=l[Math.floor(Y()*l.length)];M[a*n+o]&=~r,M[(a+i)*n+o+f]&=~A,p[(a+i)*n+o+f]=1,e.push([o+f,a+i])}m={x:0,y:0,dx:0,dy:0},k=[[0,0]],S=0;let w=new Int32Array(n*c).fill(-1);w[0]=0;let v=[0];for(;v.length;){let o=v.shift(),a=o%n,l=o/n|0;for(let[f,i,r]of T){if(M[o]&r)continue;let A=(l+i)*n+a+f;w[A]===-1&&(w[A]=o,v.push(A))}}E=[];let x=n*c-1;for(;x!==0;)E.unshift([x%n,x/n|0]),x=w[x];z=0}O();let H=(u,p)=>{let e=p<0?1:u>0?2:p>0?4:8;return M[m.y*n+m.x]&e?!1:(m.x+=u,m.y+=p,k.push([m.x,m.y]),k.length>400&&k.shift(),!0)};return{resize(){s.reset(),O()},frame(u,p){let e=s.g;if(s.reset(),I-=p,S>0)S-=p,S<=0&&(h.playing&&b.navigate(b.copy.actions[0]?.href??"/"),O());else if(I<=0){let a=null;if(h.playing){let l=h.swipe;h.swipe=null,h.left||l==="left"?a=[-1,0]:h.right||l==="right"?a=[1,0]:h.up||l==="up"?a=[0,-1]:(h.down||l==="down")&&(a=[0,1])}else if(!b.reducedMotion&&p>0&&E[z]){let[l,f]=E[z];a=[l-m.x,f-m.y],z++}a&&H(a[0],a[1])&&(I=h.playing?.09:.11),m.x===n-1&&m.y===c-1&&(S=1.4)}e.fillStyle=y.bg,e.fillRect(0,0,s.w,s.h),e.strokeStyle=y.trail,e.lineWidth=t*.36,e.lineCap="round",e.lineJoin="round",e.beginPath(),k.forEach(([a,l],f)=>{let i=d+a*t+t/2,r=g+l*t+t/2;f===0?e.moveTo(i,r):e.lineTo(i,r)}),e.stroke();let T=d+(n-.5)*t,w=g+(c-.5)*t;e.fillStyle=D(y.exit,.25+.15*Math.sin(u*4)),e.beginPath(),e.arc(T,w,t*.8,0,Math.PI*2),e.fill(),e.fillStyle=y.exit,e.fillRect(T-t*.3,w-t*.3,t*.6,t*.6),e.strokeStyle=y.wall,e.lineWidth=Math.max(2,t*.12),e.lineCap="square",e.beginPath();for(let a=0;a<c;a++)for(let l=0;l<n;l++){let f=M[a*n+l],i=d+l*t,r=g+a*t;f&1&&(e.moveTo(i,r),e.lineTo(i+t,r)),f&8&&(e.moveTo(i,r),e.lineTo(i,r+t)),a===c-1&&f&4&&(e.moveTo(i,r+t),e.lineTo(i+t,r+t)),l===n-1&&f&2&&(e.moveTo(i+t,r),e.lineTo(i+t,r+t))}e.stroke();let v=d+m.x*t+t/2,x=g+m.y*t+t/2;e.fillStyle=y.player,e.shadowColor=y.player,e.shadowBlur=12,e.beginPath(),e.arc(v,x,t*.3,0,Math.PI*2),e.fill(),e.shadowBlur=0;let o=Math.max(10,Math.min(14,s.w/90));P(e,"YOU",d,g-o-6,o,y.wall),P(e,h.playing?"EXIT \u2192 HOME":"EXIT",d+n*t,g+c*t+8,o,y.wall,"right"),!h.playing&&Math.floor(u*1.6)%2===0&&P(e,"DEMO \xB7 PRESS AN ARROW KEY",s.w/2,g+c*t+8,o,D(y.wall,.7),"center"),S>0&&P(e,h.playing?"FOUND IT. TAKING YOU HOME\u2026":"SOLVED",s.w/2,g+c*t/2-o,o*1.6,y.player,"center")}}}};export{L as default};
@@ -0,0 +1,34 @@
1
+ import{a as f}from"./chunk-LMRCHEWX.js";import{a as o,b as r,c as t}from"./chunk-QJZBGT2Q.js";import{e as a}from"./chunk-HXSSPN2I.js";import"./chunk-URWX3LLV.js";var s=`
2
+ uniform vec3 uC1, uC2, uC3, uC4, uBase;
3
+ uniform float uSpeed, uGrain;
4
+ ${o}
5
+ ${r}
6
+ ${t}
7
+ void main() {
8
+ vec2 fc = gl_FragCoord.xy;
9
+ vec2 uv = fc / uRes;
10
+ vec2 p = (fc - 0.5 * uRes) / uRes.y;
11
+ float t = uTime * 0.08 * uSpeed;
12
+ // domain-warped coordinates give the soft, folded look of a mesh gradient
13
+ vec2 q = p + 0.35 * vec2(fbm(p * 1.2 + t), fbm(p * 1.2 - t + 3.0)) + uMouse * 0.08;
14
+ vec3 col = uBase;
15
+ vec2 c1 = vec2(sin(t * 1.3) * 0.6, cos(t * 1.1) * 0.35);
16
+ vec2 c2 = vec2(cos(t * 0.9 + 2.0) * 0.7, sin(t * 1.4 + 1.0) * 0.4);
17
+ vec2 c3 = vec2(sin(t * 0.7 + 4.0) * 0.5, cos(t * 0.8 + 3.0) * 0.45);
18
+ vec2 c4 = vec2(cos(t * 1.2 + 5.0) * 0.65, sin(t * 0.6 + 2.0) * 0.3);
19
+ col = mix(col, uC1, smoothstep(0.9, 0.0, length(q - c1)));
20
+ col = mix(col, uC2, smoothstep(0.85, 0.0, length(q - c2)));
21
+ col = mix(col, uC3, smoothstep(0.8, 0.0, length(q - c3)));
22
+ col = mix(col, uC4, smoothstep(0.7, 0.0, length(q - c4)) * 0.85);
23
+ col = toSRGB(col);
24
+ col += (hash12(fc + fract(uTime) * 61.0) - 0.5) * uGrain;
25
+ fragColor = vec4(col, 1.0);
26
+ }
27
+ `,p={id:"mesh-gradient",name:"Mesh Gradient",description:"A slow, living mesh gradient behind a frosted-glass card. The calm, polished 404 that drops straight into most modern product sites.",category:"Abstract",kind:"2d",motion:"live",tags:["webgl","gradient","glassmorphism","saas","minimal","modern","light"],layout:"center",copy:{eyebrow:"Error 404",title:"This page doesn't exist.",message:"It may have been moved or deleted. Check the address, or head back to safety.",actions:[{label:"Go to homepage",href:"/",variant:"primary"},{label:"Contact support",href:"/contact",variant:"secondary"}]},params:{c1:"#ff9ecb",c2:"#8ec5ff",c3:"#b9a6ff",c4:"#ffe0a8",base:"#f6f3ff",speed:1,grain:.035,card:!0},theme:{bg:"#f1ecff",fg:"#17132b",accent:"#17132b","accent-fg":"#fff","code-color":"#17132b"},presetName:"Dawn",presets:{ocean:{name:"Ocean",params:{c1:"#3bd6ff",c2:"#2b59ff",c3:"#8affd6",c4:"#e6f9ff",base:"#eaf6ff"},theme:{bg:"#e3f2ff",fg:"#071a33",accent:"#071a33","code-color":"#071a33"}},sunset:{name:"Sunset",params:{c1:"#ff6b3d",c2:"#ff3d8a",c3:"#ffb13d",c4:"#7a3dff",base:"#2a0f2a"},theme:{bg:"#3a1230",fg:"#fff3ec",accent:"#fff3ec","accent-fg":"#3a1230","code-color":"#fff3ec"}},forest:{name:"Forest",params:{c1:"#2bb673",c2:"#a3e635",c3:"#0ea5a3",c4:"#fef08a",base:"#ecfdf3"},theme:{bg:"#e6f8ee",fg:"#06281a",accent:"#06281a","code-color":"#06281a"}},midnight:{name:"Midnight",params:{c1:"#4f46e5",c2:"#9333ea",c3:"#0ea5e9",c4:"#1e1b4b",base:"#05030f"},theme:{bg:"#0a0820",fg:"#eef0ff",accent:"#eef0ff","accent-fg":"#0a0820","code-color":"#eef0ff"}},peach:{name:"Peach",params:{c1:"#ffb38a",c2:"#ffd6a5",c3:"#ff8fa3",c4:"#fff1e6",base:"#fff7f0"},theme:{bg:"#ffeee2",fg:"#3a1a0a",accent:"#3a1a0a","code-color":"#3a1a0a"}},mono:{name:"Graphite",params:{c1:"#d4d4d8",c2:"#a1a1aa",c3:"#f4f4f5",c4:"#71717a",base:"#e4e4e7",grain:.05},theme:{bg:"#e4e4e7",fg:"#18181b",accent:"#18181b","code-color":"#18181b"}}},css:`& .lp-overlay{gap:0}
28
+ & .lp-head,& .lp-body{width:min(560px,92cqw)}
29
+ & .lp-head{padding:clamp(16px,3.4cqw,36px) clamp(18px,3.6cqw,40px) 0;border-radius:28px 28px 0 0;background:var(--mg-card);backdrop-filter:blur(24px) saturate(1.4);-webkit-backdrop-filter:blur(24px) saturate(1.4);border:1px solid var(--mg-line);border-bottom:0}
30
+ & .lp-body{padding:4px clamp(18px,3.6cqw,40px) clamp(16px,3.4cqw,36px);border-radius:0 0 28px 28px;background:var(--mg-card);backdrop-filter:blur(24px) saturate(1.4);-webkit-backdrop-filter:blur(24px) saturate(1.4);border:1px solid var(--mg-line);border-top:0;box-shadow:0 40px 80px -40px rgba(0,0,0,.35)}
31
+ & .lp-code{--lp-code-size:clamp(44px,11cqw,128px);font-weight:700;letter-spacing:-.06em;opacity:.92}
32
+ & .lp-title{--lp-title-size:clamp(18px,3cqw,36px);font-weight:650}
33
+ &{--mg-card:color-mix(in srgb,var(--lp-bg) 42%,transparent);--mg-line:color-mix(in srgb,var(--lp-fg) 12%,transparent)}
34
+ &.mg-nocard .lp-head,&.mg-nocard .lp-body{background:none;border:0;box-shadow:none;backdrop-filter:none;-webkit-backdrop-filter:none}`,setup(c){let e=c.params;return e.card||c.root.classList.add("mg-nocard"),f(c,{frag:s,scale:.6,uniforms:()=>({uC1:a(e.c1),uC2:a(e.c2),uC3:a(e.c3),uC4:a(e.c4),uBase:a(e.base),uSpeed:e.speed,uGrain:e.grain})})}};export{p as default};
@@ -0,0 +1,30 @@
1
+ import"./chunk-URWX3LLV.js";var o=l=>l.replace(/[&<>"]/g,n=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;"})[n]),k={id:"metro-map",name:"Metro Map",description:"A transit map of the site. Trains run between real stations, and the one you wanted is closed.",category:"Urban",kind:"2d",motion:"live",tags:["svg","map","transit","subway","design","light","navigation"],layout:"none",copy:{title:"Station closed.",message:"Trains no longer stop at this page. Change here for another line.",actions:[{label:"Home",href:"/",variant:"primary"},{label:"Blog",href:"/blog",variant:"secondary"},{label:"About",href:"/about",variant:"secondary"},{label:"Contact",href:"/contact",variant:"secondary"}]},params:{bg:"#f7f5f0",ink:"#1a1a1a",lines:["#e3262f","#0098d4","#00a651","#f5a623","#8a3ab9"],label:"Line"},theme:{bg:"#f7f5f0",fg:"#1a1a1a",accent:"#1a1a1a","accent-fg":"#fff"},presetName:"Day Map",presets:{mono:{name:"Monochrome",params:{bg:"#ffffff",ink:"#111111",lines:["#111111","#555555","#999999","#333333","#777777"]},theme:{bg:"#ffffff",fg:"#111",accent:"#111","accent-fg":"#fff"}},night:{name:"Night Service",params:{bg:"#11131a",ink:"#f2f2f2",lines:["#ff4d5a","#3bb8ff","#3dff8a","#ffc23b","#c07bff"]},theme:{bg:"#11131a",fg:"#f2f2f2",accent:"#f2f2f2","accent-fg":"#11131a"}},pastel:{name:"Pastel",params:{bg:"#fff8f2",ink:"#2a2230",lines:["#ff8fa3","#7bc8ff","#7bdcb5","#ffcf7a","#b9a3ff"]},theme:{bg:"#fff8f2",fg:"#2a2230",accent:"#2a2230","accent-fg":"#fff"}}},css:`
2
+ & .mm{position:absolute;inset:0;display:grid;grid-template-columns:1fr minmax(260px,340px);gap:24px;padding:clamp(16px,3cqw,40px)}
3
+ & .mm svg{width:100%;height:100%}
4
+ & .mm .info{align-self:center;display:flex;flex-direction:column;gap:14px}
5
+ & .mm .sign{display:flex;align-items:center;gap:12px;font:800 13px/1 var(--lp-font);letter-spacing:.14em;text-transform:uppercase}
6
+ & .mm .roundel{width:42px;height:42px;border-radius:50%;border:8px solid var(--l0);position:relative;flex:none}
7
+ & .mm .roundel::after{content:"";position:absolute;left:-14px;right:-14px;top:50%;height:10px;margin-top:-5px;background:#1f3a8a}
8
+ & .mm h1{margin:0;font:800 clamp(28px,3.4cqw,46px)/1 var(--lp-font-display);letter-spacing:-.04em}
9
+ & .mm p{margin:0;color:var(--lp-muted);line-height:1.55}
10
+ & .mm nav{display:grid;gap:8px;margin-top:6px}
11
+ & .mm nav a{display:flex;align-items:center;gap:10px;text-decoration:none;font-weight:600;padding:10px 12px;border-radius:12px;background:color-mix(in srgb,var(--lp-fg) 5%,transparent)}
12
+ & .mm nav a:hover{background:color-mix(in srgb,var(--lp-fg) 10%,transparent)}
13
+ & .mm nav a i{width:14px;height:14px;border-radius:50%;flex:none;border:3px solid currentColor}
14
+ & .mm .closed{animation:mm-b 1.4s steps(1) infinite}
15
+ @keyframes mm-b{50%{opacity:.25}}
16
+ @container (max-width:760px){& .mm{grid-template-columns:1fr;grid-template-rows:1fr auto}}
17
+ @media (prefers-reduced-motion:reduce){& .mm .closed{animation:none}}
18
+ `,setup(l){let n=l.params,f=l.copy,i=n.lines,c=f.actions.map((e,t)=>({name:e.label,href:e.href??"/",i:t})),p=[{col:i[0],d:"M60 120 H360 Q400 120 400 160 V420 Q400 460 440 460 H760",stops:[[60,120],[220,120],[400,290],[600,460],[760,460]]},{col:i[1],d:"M120 520 L400 290 L640 100 H860",stops:[[120,520],[260,405],[400,290],[640,100],[860,100]]},{col:i[2],d:"M80 300 H880",stops:[[80,300],[240,300],[400,290],[560,300],[720,300],[880,300]]},{col:i[3],d:"M400 290 Q520 200 600 200 H700 Q740 200 760 180 L820 120",stops:[[600,200],[700,200]]}],a=[820,120],s=document.createElement("div");s.className="mm",s.style.setProperty("--l0",i[0]);let u=[[220,120,c[1]?.name??"Blog"],[600,460,c[2]?.name??"About"],[860,100,c[3]?.name??"Contact"],[400,290,c[0]?.name??"Home"]];s.innerHTML=`<svg viewBox="0 0 940 600" aria-hidden="true">
19
+ ${p.map(e=>`<path d="${e.d}" fill="none" stroke="${e.col}" stroke-width="14" stroke-linecap="round" stroke-linejoin="round"/>`).join("")}
20
+ <path d="M760 180 L820 120" stroke="${n.bg}" stroke-width="6" stroke-dasharray="6 8"/>
21
+ ${p.flatMap(e=>e.stops.map(([t,r])=>`<circle cx="${t}" cy="${r}" r="8" fill="${n.bg}" stroke="${n.ink}" stroke-width="4"/>`)).join("")}
22
+ <circle cx="400" cy="290" r="18" fill="${n.bg}" stroke="${n.ink}" stroke-width="6"/>
23
+ ${u.map(([e,t,r])=>`<text x="${e+16}" y="${t-16}" font-family="Inter,Arial,sans-serif" font-weight="700" font-size="18" fill="${n.ink}">${o(r)}</text>`).join("")}
24
+ <g class="closed"><circle cx="${a[0]}" cy="${a[1]}" r="16" fill="#fff" stroke="#e3262f" stroke-width="6"/><path d="M${a[0]-9} ${a[1]-9} L${a[0]+9} ${a[1]+9} M${a[0]+9} ${a[1]-9} L${a[0]-9} ${a[1]+9}" stroke="#e3262f" stroke-width="5" stroke-linecap="round"/></g>
25
+ <text x="${a[0]-10}" y="${a[1]+44}" font-family="Inter,Arial,sans-serif" font-weight="800" font-size="20" fill="#e3262f" text-anchor="end">${o(f.code)} \xB7 closed</text>
26
+ ${p.map((e,t)=>`<rect data-train="${t}" width="26" height="12" rx="4" fill="${n.ink}"/>`).join("")}
27
+ </svg>
28
+ <div class="info"><div class="sign"><span class="roundel" aria-hidden="true"></span>Error ${o(f.code)}</div>
29
+ <h1><span class="lp-sr">Error ${o(f.code)}: </span>${o(f.title)}</h1><p>${o(f.message)}</p>
30
+ <nav aria-label="Other stations">${c.map(e=>`<a href="${o(e.href)}" style="color:${i[e.i%i.length]}"><i></i><span style="color:var(--lp-fg)">${o(e.name)}</span></a>`).join("")}</nav></div>`,l.root.append(s),s.querySelectorAll("nav a").forEach(e=>e.addEventListener("click",t=>{t.metaKey||t.ctrlKey||(t.preventDefault(),l.navigate(e.getAttribute("href"),t))}));let g=s.querySelector("svg"),d=[...g.querySelectorAll("path")].slice(0,p.length),$=d.map(e=>e.getTotalLength()),y=[...g.querySelectorAll("[data-train]")];return{frame(e){y.forEach((t,r)=>{let h=$[r],b=(Math.sin(e*(.12+r*.03)+r*2)*.5+.5)*h,m=d[r].getPointAtLength(b),x=d[r].getPointAtLength(Math.min(h,b+1)),v=Math.atan2(x.y-m.y,x.x-m.x)*180/Math.PI;t.setAttribute("transform",`translate(${m.x-13} ${m.y-6}) rotate(${v} 13 6)`)})},destroy(){s.remove()}}}};export{k as default};
@@ -0,0 +1,53 @@
1
+ import"./chunk-URWX3LLV.js";var l=a=>a.replace(/[&<>"]/g,n=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;"})[n]),k={page:'<svg viewBox="0 0 80 96" aria-hidden="true"><rect x="10" y="6" width="60" height="84" rx="4" fill="#fff" stroke="currentColor" stroke-width="3"/><path d="M52 6v16h18" fill="none" stroke="currentColor" stroke-width="3"/><circle cx="31" cy="44" r="3.5" fill="currentColor"/><circle cx="49" cy="44" r="3.5" fill="currentColor"/><path d="M30 64q10-8 20 0" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round"/><path d="M18 78h44" stroke="currentColor" stroke-width="2" opacity=".3"/></svg>',cat:'<svg viewBox="0 0 80 96" aria-hidden="true"><path d="M18 40 14 16l16 12h20l16-12-4 24c4 6 6 12 6 18 0 16-12 26-28 26S12 74 12 58c0-6 2-12 6-18z" fill="#fff" stroke="currentColor" stroke-width="3" stroke-linejoin="round"/><circle cx="31" cy="52" r="3.5" fill="currentColor"/><circle cx="49" cy="52" r="3.5" fill="currentColor"/><path d="M36 62h8l-4 4z" fill="currentColor"/><path d="M8 60h14M8 66h14M58 60h14M58 66h14" stroke="currentColor" stroke-width="2"/></svg>',ghost:'<svg viewBox="0 0 80 96" aria-hidden="true"><path d="M16 84V40a24 24 0 0 1 48 0v44l-8-6-8 6-8-6-8 6-8-6z" fill="#fff" stroke="currentColor" stroke-width="3" stroke-linejoin="round"/><ellipse cx="32" cy="44" rx="3.5" ry="5" fill="currentColor"/><ellipse cx="48" cy="44" rx="3.5" ry="5" fill="currentColor"/><ellipse cx="40" cy="60" rx="5" ry="6" fill="currentColor"/></svg>'},M={id:"milk-carton",name:"Missing",description:"A 3D milk carton with your page printed on the side: last seen at this URL. Drag it around to read the back.",category:"Playful",kind:"3d",motion:"interactive",tags:["css-3d","dom","funny","illustration","light","interactive","print"],layout:"right",codeInScene:!1,copy:{eyebrow:"Have you seen this page?",title:"Missing since your last click.",message:"It was last seen at this exact address. If you find it, please return it to the homepage.",actions:[{label:"Return to homepage",href:"/",variant:"primary"},{label:"File a report",href:"/contact",variant:"secondary"}]},params:{carton:"#ffffff",accent:"#1f6feb",ink:"#11203a",brand:"Lost & Found Dairy",photo:"page"},theme:{bg:"#dfeaf6",fg:"#11203a",accent:"#11203a","accent-fg":"#fff","code-color":"rgba(17,32,58,.14)"},presetName:"Classic Blue",presets:{banana:{name:"Banana Milk",params:{carton:"#fffbe6",accent:"#f2b705",ink:"#3a2a00"},theme:{bg:"#fff3b8",fg:"#3a2a00",accent:"#3a2a00","code-color":"rgba(58,42,0,.12)"}},matcha:{name:"Matcha",params:{carton:"#f4f8ee",accent:"#4a7c2a",ink:"#1a2e10",photo:"ghost"},theme:{bg:"#dcebcf",fg:"#1a2e10",accent:"#1a2e10","code-color":"rgba(26,46,16,.12)"}},blueberry:{name:"Blueberry",params:{carton:"#f6f2ff",accent:"#5b3cc4",ink:"#1f1247",photo:"cat"},theme:{bg:"#e2daff",fg:"#1f1247",accent:"#1f1247","code-color":"rgba(31,18,71,.12)"}},strawberry:{name:"Strawberry",params:{accent:"#e5486b",ink:"#3a0f1b"},theme:{bg:"#fbe3e8",fg:"#3a0f1b",accent:"#3a0f1b","code-color":"rgba(58,15,27,.12)"}},chocolate:{name:"Chocolate",params:{carton:"#fff7ee",accent:"#7a4a2a",ink:"#2b1709",photo:"cat"},theme:{bg:"#efe0cf",fg:"#2b1709",accent:"#2b1709","code-color":"rgba(43,23,9,.12)"}},oat:{name:"Oat Milk",params:{carton:"#f4eedf",accent:"#2f7d4a",ink:"#14301e",brand:"Oatly Lost",photo:"ghost"},theme:{bg:"#e4ead9",fg:"#14301e",accent:"#14301e","code-color":"rgba(20,48,30,.12)"}},night:{name:"Midnight Snack",params:{accent:"#5b7cff",ink:"#0c1233"},theme:{bg:"#0f1430",fg:"#eef1ff",accent:"#eef1ff","accent-fg":"#0f1430","code-color":"rgba(238,241,255,.1)"}}},css:`
2
+ & .mc-stage{position:absolute;inset:0;display:flex;align-items:center;justify-content:flex-start;padding-left:clamp(24px,12cqw,220px);perspective:1400px}
3
+ & .mc{--w:clamp(150px,17cqw,250px);margin-top:calc(var(--w) * .5);--d:var(--w);--h:calc(var(--w) * 1.62);position:relative;width:var(--w);height:var(--h);transform-style:preserve-3d;
4
+ transform:rotateX(var(--rx,-8deg)) rotateY(var(--ry,-28deg));cursor:grab;touch-action:none}
5
+ & .mc:active{cursor:grabbing}
6
+ & .mc .f{position:absolute;inset:0;backface-visibility:hidden;background:var(--carton);color:var(--ink);overflow:hidden;
7
+ box-shadow:inset 0 0 0 1px rgba(0,0,0,.06);font-family:var(--lp-font)}
8
+ & .mc .front{transform:translateZ(calc(var(--d)/2))}
9
+ & .mc .back{transform:rotateY(180deg) translateZ(calc(var(--d)/2))}
10
+ & .mc .left{width:var(--d);transform:rotateY(-90deg) translateZ(calc(var(--d)/2))}
11
+ & .mc .right{width:var(--d);transform:rotateY(90deg) translateZ(calc(var(--w) - var(--d)/2))}
12
+ & .mc .bottom{height:var(--d);top:auto;bottom:0;transform:rotateX(-90deg) translateZ(calc(var(--d)/2));background:#d8dde3}
13
+ & .mc .shade{position:absolute;inset:0;pointer-events:none;background:linear-gradient(90deg,rgba(0,0,0,var(--sh,0)),rgba(0,0,0,calc(var(--sh,0)*.4)))}
14
+ & .mc .roofA,& .mc .roofB{position:absolute;left:0;width:var(--w);height:calc(var(--d) * .7071);top:calc(var(--d) * -.7071);background:var(--carton);
15
+ transform-origin:50% 100%;box-shadow:inset 0 0 0 1px rgba(0,0,0,.07);backface-visibility:hidden}
16
+ & .mc .roofA{transform:translateZ(calc(var(--d)/2)) rotateX(45deg);background:linear-gradient(180deg,color-mix(in srgb,var(--carton) 88%,#000),var(--carton))}
17
+ & .mc .roofB{transform:rotateY(180deg) translateZ(calc(var(--d)/2)) rotateX(45deg);background:linear-gradient(180deg,color-mix(in srgb,var(--carton) 80%,#000),color-mix(in srgb,var(--carton) 92%,#000))}
18
+ & .mc .gl,& .mc .gr{position:absolute;left:0;top:calc(var(--d) * -.5);width:var(--d);height:calc(var(--d) * .5);clip-path:polygon(0 100%,50% 0,100% 100%);
19
+ background:color-mix(in srgb,var(--carton) 86%,#000)}
20
+ & .mc .gl{transform:rotateY(-90deg) translateZ(calc(var(--d)/2))}
21
+ & .mc .gr{transform:rotateY(90deg) translateZ(calc(var(--w) - var(--d)/2))}
22
+ & .mc .ridge{position:absolute;left:0;top:calc(var(--d) * -.5 - var(--w) * .1);width:var(--w);height:calc(var(--w) * .1);background:var(--carton);
23
+ box-shadow:inset 0 0 0 1px rgba(0,0,0,.1),inset 0 -6px 8px -6px rgba(0,0,0,.25)}
24
+ & .band{background:var(--accent);color:#fff;text-align:center;font-weight:800;letter-spacing:.14em;font-size:calc(var(--w) * .12);padding:.32em 0 .26em;line-height:1}
25
+ & .brand{font-size:calc(var(--w) * .052);text-align:center;letter-spacing:.2em;text-transform:uppercase;padding:.7em .4em .3em;font-weight:700;color:var(--accent)}
26
+ & .q{font-size:calc(var(--w) * .062);text-align:center;font-weight:700;margin:.35em .5em .5em;line-height:1.2}
27
+ & .photo{width:52%;margin:0 auto;aspect-ratio:4/5;border:3px solid var(--ink);padding:5%;background:#f2f4f7;display:flex;align-items:center;justify-content:center;color:var(--ink);filter:grayscale(1) contrast(1.1)}
28
+ & .photo svg{width:100%;height:100%}
29
+ & .facts{font-size:calc(var(--w) * .05);line-height:1.45;padding:.7em .9em;margin:0}
30
+ & .facts b{display:inline-block;min-width:5.6em}
31
+ & .back .facts{font-size:calc(var(--w) * .052)}
32
+ & .nf{border:2px solid var(--ink);margin:.8em;padding:.5em .6em;font-size:calc(var(--w) * .045);line-height:1.35}
33
+ & .nf h3{margin:0 0 .2em;font-size:1.6em;font-weight:900;border-bottom:6px solid var(--ink);padding-bottom:.1em;letter-spacing:-.02em}
34
+ & .nf div{display:flex;justify-content:space-between;border-bottom:1px solid var(--ink);padding:.18em 0}
35
+ & .side-text{writing-mode:vertical-rl;transform:rotate(180deg);font-weight:900;font-size:calc(var(--w) * .2);letter-spacing:.06em;color:var(--accent);opacity:.9;
36
+ display:flex;align-items:center;justify-content:center;height:100%;width:100%}
37
+ & .mc-shadow{position:absolute;left:50%;bottom:calc(var(--h) * -.06);width:calc(var(--w) * 1.5);height:calc(var(--w) * .3);transform:translateX(-50%) translateZ(-1px) rotateX(90deg);
38
+ background:radial-gradient(closest-side,rgba(0,0,0,.28),transparent);pointer-events:none}
39
+ & .lp-overlay{padding-right:clamp(24px,9cqw,160px)}
40
+ & .lp-body,& .lp-head{max-width:min(520px,46cqw)}
41
+ & .lp-code{--lp-code-size:clamp(90px,11cqw,170px);font-weight:800;letter-spacing:-.05em}
42
+ @container (max-width:760px){& .mc-stage{justify-content:center;align-items:flex-start;padding:7cqh 0 0}& .mc{--w:clamp(110px,30cqw,170px)}
43
+ & .lp-overlay{justify-content:flex-end;padding-right:16px}& .lp-body,& .lp-head{max-width:none}& .lp-code{display:none}}
44
+ `,setup(a){let n=a.params,b=a.copy,p=typeof location<"u"?location.pathname:"/missing",w=new Date().toLocaleDateString(void 0,{month:"short",day:"numeric",year:"numeric"}),t=document.createElement("div");t.className="mc-stage",t.style.setProperty("--carton",n.carton),t.style.setProperty("--accent",n.accent),t.style.setProperty("--ink",n.ink),t.setAttribute("aria-hidden","true"),t.innerHTML=`<div class="mc">
45
+ <div class="f front"><div class="band">MISSING</div><div class="q">Have you seen this page?</div><div class="photo">${k[n.photo]}</div>
46
+ <p class="facts"><b>Name:</b> ${l(p.length>22?"\u2026"+p.slice(-21):p)}<br><b>Code:</b> ${l(b.code)}<br><b>Last seen:</b> ${l(w)}<br><b>Reward:</b> the homepage</p><div class="shade"></div></div>
47
+ <div class="f back"><div class="brand">${l(n.brand)}</div><div class="nf"><h3>Page Facts</h3>
48
+ <div><span>Serving size</span><b>0 pages</b></div><div><span>Content</span><b>0%</b></div><div><span>Links that work</span><b>0g</b></div><div><span>Existential dread</span><b>404%</b></div>
49
+ <div style="border:0"><span>Store in your bookmarks</span></div></div><div class="shade"></div></div>
50
+ <div class="f left"><div class="side-text">${l(b.code)}</div><div class="shade"></div></div>
51
+ <div class="f right"><div class="side-text">LOST</div><div class="shade"></div></div>
52
+ <div class="roofA"></div><div class="roofB"></div><div class="gl"></div><div class="gr"></div><div class="ridge"></div>
53
+ <div class="mc-shadow"></div></div>`,a.stage.append(t),a.stage.removeAttribute("aria-hidden");let o=t.querySelector(".mc"),x=[...t.querySelectorAll(".f")],i=-28,c=-8,d=0,g=!1,h=0,m=0;o.addEventListener("pointerdown",e=>{g=!0,h=e.clientX,m=e.clientY,o.setPointerCapture(e.pointerId)}),o.addEventListener("pointermove",e=>{if(!g)return;let r=e.clientX-h,s=e.clientY-m;h=e.clientX,m=e.clientY,i+=r*.6,c=Math.max(-35,Math.min(20,c-s*.3)),d=r*.6,a.invalidate()});let u=()=>g=!1;o.addEventListener("pointerup",u),o.addEventListener("pointercancel",u),t.style.pointerEvents="auto";let y=()=>{o.style.setProperty("--ry",`${i}deg`),o.style.setProperty("--rx",`${c}deg`);let e=i*Math.PI/180,r=[0,Math.PI,-Math.PI/2,Math.PI/2];x.forEach((s,f)=>{if(f>3)return;let v=Math.cos(e+r[f]-.5);s.style.setProperty("--sh",String(Math.max(0,.32-v*.32)))})};return y(),{frame(e,r){if(!g){d*=Math.exp(-2.5*r),i+=d*r*10;let s=-28+Math.sin(e*.6)*10+a.pointer.sx*12,f=Math.abs(d)<.5?1.2:0,v=((i-s)%360+540)%360-180;i-=v*Math.min(1,f*r),c+=(-8+a.pointer.sy*6-c)*Math.min(1,r*2)}y()},destroy(){t.remove()}}}};export{M as default};
@@ -0,0 +1,9 @@
1
+ import"./chunk-URWX3LLV.js";var a={id:"minimal",name:"Minimal",description:"The classic: a large status code, one line of explanation and a way home. Nothing animates, nothing loads; it just works.",category:"Simple",kind:"2d",motion:"static",tags:["simple","minimal","clean","static","light","fast","classic"],layout:"center",copy:{eyebrow:"",title:"Page not found",message:"Sorry, we couldn\u2019t find the page you\u2019re looking for.",actions:[{label:"Go back home",href:"/",variant:"primary"},{label:"Contact support",href:"/contact",variant:"secondary",icon:"arrow"}]},params:{rule:!1},theme:{bg:"#ffffff",fg:"#0f172a",accent:"#4f46e5","accent-fg":"#ffffff","code-color":"#4f46e5","code-size":"clamp(15px,1.4cqw,17px)","code-weight":"600",radius:"8px"},presetName:"Indigo",presets:{dark:{name:"Dark",theme:{bg:"#0b0f19",fg:"#f1f5f9",accent:"#818cf8","accent-fg":"#0b0f19","code-color":"#818cf8"}},emerald:{name:"Emerald",theme:{bg:"#f7faf9",fg:"#052e22",accent:"#059669","accent-fg":"#fff","code-color":"#059669"}},big:{name:"Big number",title:"Lost your way?",params:{rule:!0},theme:{bg:"#fafafa",fg:"#18181b",accent:"#18181b","accent-fg":"#fafafa","code-color":"#18181b","code-size":"clamp(72px,16cqw,180px)","code-weight":"800",radius:"999px"}},warm:{name:"Warm",theme:{bg:"#fbf6ef",fg:"#3b2414",accent:"#c2410c","accent-fg":"#fff","code-color":"#c2410c"}}},css:`
2
+ & .lp-code{letter-spacing:.02em;line-height:1;margin-bottom:12px}
3
+ & .lp-title{font-weight:700;letter-spacing:-.03em;font-size:clamp(28px,5cqw,56px)}
4
+ & .lp-message{font-size:clamp(14px,1.4cqw,17px)}
5
+ & .lp-btn--primary{padding:12px 20px;font-weight:600}
6
+ & .lp-btn--secondary{border:0;font-weight:600}
7
+ &.lp-p-big .lp-code{letter-spacing:-.05em;line-height:.9}
8
+ &.mn-rule .lp-code::after{content:"";display:block;width:56px;height:3px;margin:22px auto 0;background:var(--lp-accent);border-radius:2px}
9
+ `,setup(e){e.root.classList.toggle("mn-rule",e.params.rule)}};export{a as default};
@@ -0,0 +1,70 @@
1
+ import{a as p}from"./chunk-LMRCHEWX.js";import{a as f,b as r,c,h as u}from"./chunk-QJZBGT2Q.js";import{e as a}from"./chunk-HXSSPN2I.js";import{a as n,e as i}from"./chunk-IETNWEVK.js";import"./chunk-URWX3LLV.js";var l=`
2
+ uniform sampler2D uText;
3
+ uniform vec3 uSkyTop, uSkyHorizon, uSandL, uSandD, uSun;
4
+ uniform float uHaze;
5
+ ${f}
6
+ ${r}
7
+ ${c}
8
+
9
+ float dune(float x, float seed, float amp, float base) {
10
+ return base + amp * (0.6 * sin(x * 2.1 + seed) + 0.3 * sin(x * 4.7 + seed * 2.0) + 0.1 * sin(x * 9.3 + seed * 3.0)) + (fbm(vec2(x * 1.5, seed)) - 0.5) * amp;
11
+ }
12
+
13
+ void main() {
14
+ vec2 fc = gl_FragCoord.xy;
15
+ vec2 uv = fc / uRes;
16
+ vec2 p = (fc - 0.5 * uRes) / uRes.y + vec2(uMouse.x * 0.03, 0.0);
17
+ float t = uTime;
18
+ float horizon = -0.02;
19
+ // heat shimmer: wobble the image near the horizon
20
+ float shim = uHaze * smoothstep(0.25, 0.0, abs(p.y - horizon)) * 0.006;
21
+ vec2 q = p + vec2(sin(p.y * 160.0 + t * 6.0) * shim, sin(p.x * 30.0 + t * 3.0) * shim * 0.5);
22
+ vec3 col = mix(uSkyHorizon, uSkyTop, smoothstep(horizon, 0.55, q.y));
23
+ // sun
24
+ vec2 sp = vec2(0.42, 0.22);
25
+ float sd = length(q - sp);
26
+ col = mix(col, uSun * 1.6, smoothstep(0.06, 0.055, sd));
27
+ col += uSun * 0.35 * exp(-sd * 6.0);
28
+ // the mirage: the code floats above the horizon, wavering, with an inverted reflection below it
29
+ vec2 tuv = vec2(q.x * uRes.y / uRes.x + 0.5, (q.y - horizon - 0.02) * 2.2 + 0.08);
30
+ if (tuv.x > 0.0 && tuv.x < 1.0 && tuv.y > 0.0 && tuv.y < 1.0) {
31
+ float a = texture(uText, tuv + vec2(sin(tuv.y * 40.0 + t * 5.0) * 0.004, 0.0)).a;
32
+ col = mix(col, mix(uSkyHorizon, uSkyTop, 0.6) * 0.75, a * 0.55 * (0.75 + 0.25 * sin(t * 1.3)));
33
+ }
34
+ vec2 ruv = vec2(tuv.x, (horizon - q.y + 0.02) * 2.2 + 0.08);
35
+ if (q.y < horizon && ruv.x > 0.0 && ruv.x < 1.0 && ruv.y > 0.0 && ruv.y < 1.0) {
36
+ float a = texture(uText, ruv + vec2(sin(ruv.y * 60.0 + t * 7.0) * 0.008, 0.0)).a;
37
+ col = mix(col, uSkyHorizon * 1.05, a * 0.3);
38
+ }
39
+ // dunes, far to near
40
+ for (int i = 0; i < 4; i++) {
41
+ float fi = float(i);
42
+ float h = dune(q.x * (1.0 + fi * 0.4) + fi * 3.7, fi * 1.9, 0.03 + fi * 0.03, horizon - 0.02 - fi * 0.09);
43
+ if (q.y < h) {
44
+ float slope = dune(q.x * (1.0 + fi * 0.4) + fi * 3.7 + 0.01, fi * 1.9, 0.03 + fi * 0.03, 0.0) - dune(q.x * (1.0 + fi * 0.4) + fi * 3.7 - 0.01, fi * 1.9, 0.03 + fi * 0.03, 0.0);
45
+ vec3 sand = mix(uSandD, uSandL, smoothstep(-0.004, 0.006, -slope + (h - q.y) * 0.02));
46
+ sand = mix(sand, uSkyHorizon, 0.45 - fi * 0.13);
47
+ // wind ripples on the nearest dunes
48
+ sand *= 0.95 + 0.05 * sin((q.x * 3.0 + q.y) * (90.0 + fi * 40.0) + fbm(q * 8.0) * 6.0) * step(1.5, fi);
49
+ col = sand;
50
+ }
51
+ }
52
+ // a cactus silhouette
53
+ vec2 cp = q - vec2(-0.62, -0.25);
54
+ float trunk = step(abs(cp.x), 0.016) * step(0.0, cp.y) * step(cp.y, 0.22);
55
+ float arm1 = step(abs(cp.x + 0.04), 0.012) * step(0.08, cp.y) * step(cp.y, 0.16) + step(abs(cp.y - 0.08), 0.012) * step(-0.04, cp.x) * step(cp.x, 0.0);
56
+ float arm2 = step(abs(cp.x - 0.042), 0.012) * step(0.11, cp.y) * step(cp.y, 0.19) + step(abs(cp.y - 0.11), 0.012) * step(0.0, cp.x) * step(cp.x, 0.042);
57
+ col = mix(col, uSandD * 0.35, clamp(trunk + arm1 + arm2, 0.0, 1.0));
58
+ // tumbleweed rolling across
59
+ float tx = mod(t * 0.12, 2.4) - 1.2;
60
+ vec2 tw = q - vec2(tx * uRes.x / uRes.y * 0.9, -0.3 + abs(sin(t * 3.0)) * 0.03);
61
+ float ang = -t * 4.0;
62
+ tw = mat2(cos(ang), -sin(ang), sin(ang), cos(ang)) * tw;
63
+ float r = length(tw);
64
+ float weed = smoothstep(0.035, 0.03, r) * smoothstep(0.35, 0.65, abs(sin(atan(tw.y, tw.x) * 7.0 + r * 120.0)));
65
+ col = mix(col, uSandD * 0.45, weed * 0.85);
66
+ col = toSRGB(aces(col * 1.05));
67
+ col += grain(fc, t) * 0.02;
68
+ fragColor = vec4(col, 1.0);
69
+ }
70
+ `,b={id:"mirage",name:"Mirage",description:"Rolling dunes under a white-hot sun. On the shimmering horizon the 404 wavers like a mirage, and a tumbleweed rolls past.",category:"Nature",kind:"2d",motion:"live",tags:["webgl","desert","dunes","heat","mirage","warm","nature"],layout:"bottom",codeInScene:!0,copy:{eyebrow:"Heat haze",title:"Just a mirage.",message:"You thought you saw the page out there. It was the heat. Water and the homepage are back this way.",actions:[{label:"Back to the oasis",href:"/",variant:"primary"}]},params:{skyTop:"#3d8fd6",skyHorizon:"#f2e3c4",sandLight:"#f2c48a",sandDark:"#b8743f",sun:"#fff6dc",haze:1},theme:{bg:"#d9a066",fg:"#2a1406",accent:"#2a1406","accent-fg":"#fff3e0"},presetName:"Midday",presets:{salt:{name:"Salt Flats",params:{skyTop:"#5fa8e6",skyHorizon:"#ffffff",sandLight:"#ffffff",sandDark:"#d9dce6",sun:"#fffbe6",haze:1.4},theme:{bg:"#eef2f6",fg:"#0f1a26",accent:"#0f1a26","accent-fg":"#fff"}},dusk:{name:"Dusk",params:{skyTop:"#3a2a6b",skyHorizon:"#ff9a6b",sandLight:"#d9805a",sandDark:"#5a2a3a",sun:"#ffd2a8"},theme:{bg:"#8a4a4a",fg:"#fff0e6",accent:"#fff0e6","accent-fg":"#3a1a1a"}},white:{name:"White Sands",params:{skyTop:"#7fb8e6",skyHorizon:"#f4f6f8",sandLight:"#ffffff",sandDark:"#c9cfd6",sun:"#ffffff"},theme:{bg:"#e9edf1",fg:"#1c2a36",accent:"#1c2a36","accent-fg":"#fff"}}},css:"& .lp-body{text-shadow:0 1px 14px rgba(255,240,220,.5)}",setup(o){let e=o.params,t=document.createElement("canvas");t.width=1024,t.height=256;let d=t.getContext("2d");i(d,o.copy.code||"404",{width:1024,height:256,font:n,weight:800,fit:.9});let s;return p(o,{frag:l,init(m){s=u(m,t,{filter:"linear"})},uniforms:()=>({uText:s,uSkyTop:a(e.skyTop),uSkyHorizon:a(e.skyHorizon),uSandL:a(e.sandLight),uSandD:a(e.sandDark),uSun:a(e.sun),uHaze:e.haze})})}};export{b as default};