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,114 @@
1
+ import{HASH,NOISE,POST,getGL,pass,target,texture}from"../chunks/chunk-SH72TE6I.js";import{linear}from"../chunks/chunk-FVGCB66F.js";import{SANS,drawFittedText}from"../chunks/chunk-3ISI6SOJ.js";import"../chunks/chunk-KIYSQVWX.js";import"../chunks/chunk-7XMDQMDO.js";var BG=`
2
+ uniform sampler2D uText;
3
+ uniform vec3 uSkyTop, uSkyBottom, uNeon, uL0, uL1, uL2, uL3;
4
+ ${HASH}
5
+ ${NOISE}
6
+
7
+ vec3 pal(float h) { return h < 0.25 ? uL0 : h < 0.5 ? uL1 : h < 0.75 ? uL2 : uL3; }
8
+
9
+ void main() {
10
+ vec2 uv = gl_FragCoord.xy / uRes;
11
+ vec2 p = (gl_FragCoord.xy - 0.5 * uRes) / uRes.y + uMouse * 0.02;
12
+ float t = uTime;
13
+ vec3 col = mix(uSkyBottom, uSkyTop, smoothstep(-0.5, 0.6, p.y));
14
+ // building silhouettes with lit windows
15
+ float bx = floor((p.x + 2.0) * 6.0);
16
+ float bh = -0.05 + hash11(bx) * 0.35;
17
+ if (p.y < bh) {
18
+ col = uSkyBottom * 0.35;
19
+ vec2 wq = vec2(fract((p.x + 2.0) * 60.0), fract(p.y * 50.0));
20
+ vec2 wid = floor(vec2((p.x + 2.0) * 60.0, p.y * 50.0));
21
+ float on = step(0.62, hash12(wid)) * step(0.2, wq.x) * step(wq.x, 0.8) * step(0.25, wq.y) * step(wq.y, 0.75);
22
+ col += pal(hash12(wid + 3.0)) * on * 0.7;
23
+ }
24
+ // bokeh street lights and traffic
25
+ for (int i = 0; i < 46; i++) {
26
+ float fi = float(i);
27
+ vec2 c = vec2((hash11(fi * 1.7) - 0.5) * 2.4, -0.45 + hash11(fi * 3.1) * 0.75);
28
+ if (i > 30) c.x = mod(c.x + t * (0.05 + hash11(fi) * 0.1) * (hash11(fi + 5.0) > 0.5 ? 1.0 : -1.0) + 1.2, 2.4) - 1.2, c.y = -0.4 + hash11(fi * 7.0) * 0.08;
29
+ float r = 0.012 + hash11(fi * 5.3) * 0.03;
30
+ float d = length(p - c);
31
+ float tw = 0.75 + 0.25 * sin(t * (0.5 + hash11(fi)) + fi);
32
+ col += pal(hash11(fi * 9.7)) * smoothstep(r, r * 0.6, d) * 1.4 * tw;
33
+ col += pal(hash11(fi * 9.7)) * exp(-d / (r * 3.0)) * 0.12;
34
+ }
35
+ // neon sign with the code
36
+ float a = texture(uText, uv).a;
37
+ float flicker = 0.9 + 0.1 * step(0.15, fract(sin(floor(t * 9.0)) * 43758.5));
38
+ col += uNeon * a * 2.6 * flicker;
39
+ col += uNeon * textureLod(uText, uv, 4.0).a * 1.3 * flicker;
40
+ col += uNeon * textureLod(uText, uv, 6.0).a * 0.8 * flicker;
41
+ fragColor = vec4(col, 1.0);
42
+ }
43
+ `,GLASS=`
44
+ uniform sampler2D uBg;
45
+ uniform float uFog, uRain, uMaxLod;
46
+ ${HASH}
47
+ ${NOISE}
48
+ ${POST}
49
+
50
+ // a sliding drop per cell, with a trail of tiny droplets above it
51
+ vec4 sliding(vec2 uv, float t, float scale, float seed) {
52
+ vec2 aspect = vec2(uRes.x / uRes.y, 1.0);
53
+ vec2 g = uv * aspect * scale * vec2(1.0, 0.25);
54
+ vec2 id = floor(g);
55
+ vec2 f = fract(g);
56
+ float h = hash12(id + seed);
57
+ if (h > uRain) return vec4(0.0);
58
+ float speed = 0.06 + h * 0.08;
59
+ float ph = fract(t * speed + h * 7.0);
60
+ // stick-slip: mostly waiting, then a quick slide
61
+ float y = 1.0 - (ph + 0.05 * sin(ph * 40.0) * (1.0 - ph));
62
+ float x = 0.5 + (hash12(id + 2.0 + seed) - 0.5) * 0.6 + sin(y * 9.0 + h * 6.0) * 0.06;
63
+ vec2 d = (f - vec2(x, y)) * vec2(1.0, 4.0);
64
+ float r = 0.14 + h * 0.08;
65
+ float drop = smoothstep(r, r * 0.75, length(d * vec2(1.0, 0.85)));
66
+ // trail
67
+ float trailX = smoothstep(0.06, 0.0, abs(f.x - x));
68
+ float trail = trailX * step(y, f.y) * smoothstep(1.0, y, f.y);
69
+ float dots = smoothstep(0.08, 0.04, length(vec2(f.x - x, (fract(f.y * 14.0) - 0.5) / 14.0 * 4.0))) * trail;
70
+ vec2 off = d / r * drop * 0.6 + vec2(f.x - x, 0.0) * dots * 0.5;
71
+ return vec4(off, drop + dots * 0.6, trail);
72
+ }
73
+
74
+ // tiny static droplets that appear and evaporate
75
+ vec3 statics(vec2 uv, float t) {
76
+ vec2 aspect = vec2(uRes.x / uRes.y, 1.0);
77
+ vec2 g = uv * aspect * 38.0;
78
+ vec2 id = floor(g);
79
+ vec2 f = fract(g) - 0.5;
80
+ vec2 j = (hash22(id) - 0.5) * 0.6;
81
+ float h = hash12(id + 9.0);
82
+ float life = sin(fract(t * 0.08 + h) * 3.14159);
83
+ float r = (0.12 + h * 0.18) * life * step(0.3, h);
84
+ vec2 d = f - j;
85
+ float m = smoothstep(r, r * 0.7, length(d));
86
+ return vec3(d / max(r, 1e-3) * m * 0.35, m);
87
+ }
88
+
89
+ void main() {
90
+ vec2 fc = gl_FragCoord.xy;
91
+ vec2 uv = fc / uRes;
92
+ float t = uTime;
93
+ vec3 s = statics(uv, t);
94
+ vec4 a = sliding(uv, t, 3.5, 0.0);
95
+ vec4 b = sliding(uv, t * 1.1 + 13.0, 6.0, 4.0);
96
+ float mask = clamp(s.z + a.z + b.z, 0.0, 1.0);
97
+ vec2 off = s.xy + a.xy + b.xy;
98
+ float trail = clamp(a.w + b.w, 0.0, 1.0);
99
+ float fogLod = mix(1.0, uMaxLod, uFog);
100
+ float lod = mix(fogLod, 0.4, mask);
101
+ lod = mix(lod, fogLod * 0.55, trail * (1.0 - mask));
102
+ // drops act like tiny lenses: they flip and magnify what's behind
103
+ vec2 suv = uv - off * 0.05 * (1.0 + mask);
104
+ vec3 col = textureLod(uBg, suv, lod).rgb;
105
+ // fogged glass scatters light: lift the blacks a little
106
+ col = mix(col, col * 0.8 + vec3(0.03, 0.035, 0.05), uFog * (1.0 - mask) * 0.6);
107
+ // highlight on drop tops
108
+ col += vec3(0.6) * mask * smoothstep(0.2, 0.6, -off.y) * 0.25;
109
+ col = toSRGB(aces(col));
110
+ col *= mix(0.7, 1.0, vignette(uv, 0.25));
111
+ col += grain(fc, t) * 0.02;
112
+ fragColor = vec4(col, 1.0);
113
+ }
114
+ `,rainy_window_default={id:"rainy-window",name:"Rainy Window",description:"Rain runs down a fogged window. Behind it, a city at night and a neon sign showing the error, blurred until a drop rolls past and brings it into focus.",category:"Urban",kind:"2d",motion:"live",tags:["webgl","rain","city","night","neon","bokeh","moody","cinematic"],layout:"bottom",codeInScene:!0,copy:{eyebrow:"Rainy night",title:"Nothing out there but rain.",message:"The page you're looking for isn't on this street. Come in from the cold.",actions:[{label:"Head inside",href:"/",variant:"primary"}]},params:{skyTop:"#0a0f1f",skyBottom:"#1a1630",neon:"#ff2d6f",lights:["#ffb35c","#ff5f4a","#5fb7ff","#9dff8a"],fog:.8,rain:.55},theme:{bg:"#0d0f1c",fg:"#f2eef8",accent:"#ff2d6f","accent-fg":"#fff"},presetName:"Neon Night",presets:{green:{name:"Diner Green",params:{neon:"#3dff9a",lights:["#ffe2a8","#3dff9a","#ff6b6b","#ffffff"],skyTop:"#04120c",skyBottom:"#0d2a1f"},theme:{bg:"#06160f",accent:"#3dff9a","accent-fg":"#04120c"}},tokyo:{name:"Tokyo",params:{neon:"#ff2a3d",lights:["#ff2a3d","#ffffff","#ffd23f","#3bd6ff"],skyTop:"#070712",skyBottom:"#1a0f2a",rain:.7},theme:{bg:"#0d0a1a",accent:"#ff2a3d","accent-fg":"#fff"}},blue:{name:"Blue Hour",params:{skyTop:"#14254a",skyBottom:"#2a3a6a",neon:"#4dd8ff",lights:["#ffe2a8","#ffd27a","#9cc8ff","#ffffff"],fog:.65},theme:{bg:"#162448",accent:"#4dd8ff","accent-fg":"#071830"}},amber:{name:"Amber Caf\xE9",eyebrow:"Closed for the night",title:"The caf\xE9's shut. So is this page.",params:{skyTop:"#120b06",skyBottom:"#2a170b",neon:"#ffb347",lights:["#ffcf8a","#ff9a4a","#ffe7c2","#ff7a3d"],fog:.85},theme:{bg:"#1a0f07",accent:"#ffb347","accent-fg":"#1a0f07"}},storm:{name:"Downpour",params:{rain:.85,fog:.9,neon:"#a66bff"},theme:{accent:"#a66bff"}}},css:"& .lp-body{text-shadow:0 2px 18px rgba(0,0,0,.6)}",setup(ctx){let p=ctx.params,canvas=ctx.canvas({adaptive:!0}),gl=getGL(canvas),bgPass=pass(gl,BG),glassPass=pass(gl,GLASS),bgScale=.5,rt=target(gl,2,2),setMips=()=>{gl.bindTexture(gl.TEXTURE_2D,rt.tex),gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MIN_FILTER,gl.LINEAR_MIPMAP_LINEAR)},cv=document.createElement("canvas"),tex,drawText=()=>{let h=Math.max(64,Math.round(1024*ctx.height/Math.max(1,ctx.width)));cv.width=1024,cv.height=h;let g=cv.getContext("2d");g.clearRect(0,0,1024,h),g.save(),g.translate(1024*.06,h*.4-h*.17),g.lineJoin="round",drawFittedText(g,ctx.copy.code||"404",{width:1024*.88,height:h*.34,font:SANS,weight:300,fit:.7}),g.restore(),tex&&(gl.bindTexture(gl.TEXTURE_2D,tex),gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL,!0),gl.texImage2D(gl.TEXTURE_2D,0,gl.RGBA,gl.RGBA,gl.UNSIGNED_BYTE,cv),gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL,!1),gl.generateMipmap(gl.TEXTURE_2D))};drawText(),tex=texture(gl,cv,{filter:"mipmap"});let L=p.lights.map(linear),resize=()=>{rt.resize(canvas.width*bgScale,canvas.height*bgScale),setMips(),drawText()};return resize(),{resize,frame(t){rt.width!==Math.max(1,Math.round(canvas.width*bgScale))&&resize(),bgPass.draw({uTime:t,uMouse:[ctx.pointer.sx,ctx.pointer.sy],uText:tex,uSkyTop:linear(p.skyTop),uSkyBottom:linear(p.skyBottom),uNeon:linear(p.neon),uL0:L[0],uL1:L[1%L.length],uL2:L[2%L.length],uL3:L[3%L.length]},rt),gl.bindTexture(gl.TEXTURE_2D,rt.tex),gl.generateMipmap(gl.TEXTURE_2D);let maxLod=Math.log2(Math.max(rt.width,rt.height))-3;glassPass.draw({uTime:t,uBg:rt,uFog:p.fog,uRain:p.rain,uMaxLod:Math.min(5.5,maxLod)})}}}};export{rainy_window_default as default};
@@ -0,0 +1,8 @@
1
+ interface Params {
2
+ desk: string;
3
+ paper: string;
4
+ ink: string;
5
+ store: string;
6
+ }
7
+ declare const _default: import("..").SceneDef<Params>;
8
+ export default _default;
@@ -0,0 +1,32 @@
1
+ import"../chunks/chunk-KIYSQVWX.js";import"../chunks/chunk-7XMDQMDO.js";var esc=s=>s.replace(/[&<>"]/g,c=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;"})[c]),receipt_default={id:"receipt",name:"Receipt",description:"A thermal printer chatters out a receipt for your visit, itemised down to the missing page, with a total of 404 and a barcode at the bottom.",category:"Paper & Print",kind:"2d",motion:"live",tags:["dom","receipt","print","funny","light","retail","monospace"],layout:"none",copy:{title:"Item not found",message:"No charge. Please visit the homepage for our full range.",actions:[{label:"Continue shopping",href:"/",variant:"primary"}]},params:{desk:"#e7e2d8",paper:"#ffffff",ink:"#222222",store:"THE INTERNET CO."},theme:{bg:"#e7e2d8",fg:"#222"},presetName:"Corner Shop",presets:{dark:{name:"Night Counter",params:{desk:"#1a1d24",paper:"#f7f5ef",ink:"#1a1a1a"},theme:{bg:"#1a1d24"}},cafe:{name:"Caf\xE9",params:{desk:"#c9a27a",paper:"#fffaf0",ink:"#3a2412",store:"CAF\xC9 404"},theme:{bg:"#c9a27a"}},pink:{name:"Boutique",params:{desk:"#ffd6e5",paper:"#ffffff",ink:"#5a1030",store:"BOUTIQUE LOST"},theme:{bg:"#ffd6e5"}}},css:`
2
+ & .rc{position:absolute;inset:0;display:flex;justify-content:center;background:var(--desk);overflow:hidden}
3
+ & .rc-printer{position:absolute;top:0;width:min(400px,86cqw);height:64px;background:linear-gradient(180deg,#3a3d44,#22252b);border-radius:0 0 14px 14px;box-shadow:0 12px 30px rgba(0,0,0,.35);z-index:2}
4
+ & .rc-printer::after{content:"";position:absolute;left:8%;right:8%;bottom:10px;height:6px;border-radius:3px;background:#0b0c0f}
5
+ & .rc-printer i{position:absolute;right:16px;top:14px;width:8px;height:8px;border-radius:50%;background:#3dff7a;box-shadow:0 0 8px #3dff7a}
6
+ & .rc-paper{position:absolute;top:58px;width:min(320px,74cqw);background:var(--paper);color:var(--ink);padding:26px 22px 40px;font:13px/1.55 "Courier Prime","Courier New",ui-monospace,monospace;
7
+ box-shadow:0 18px 30px -18px rgba(0,0,0,.45);transform-origin:50% 0;
8
+ -webkit-mask:linear-gradient(#000,#000) top/100% calc(100% - 10px) no-repeat,conic-gradient(from -45deg at bottom,#0000,#000 1deg 90deg,#0000 91deg) bottom/16px 10px repeat-x;
9
+ mask:linear-gradient(#000,#000) top/100% calc(100% - 10px) no-repeat,conic-gradient(from -45deg at bottom,#0000,#000 1deg 90deg,#0000 91deg) bottom/16px 10px repeat-x}
10
+ & .rc-paper h1{font:inherit;font-weight:700;text-align:center;margin:0;letter-spacing:.08em}
11
+ & .rc-paper .c{text-align:center}
12
+ & .rc-paper .row{display:flex;justify-content:space-between;gap:10px}
13
+ & .rc-paper .row span:first-child{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
14
+ & .rc-paper hr{border:0;border-top:1px dashed currentColor;margin:10px 0;opacity:.6}
15
+ & .rc-paper .tot{font-weight:700;font-size:1.25em}
16
+ & .rc-paper .bar{height:46px;margin:14px 0 4px;background:repeating-linear-gradient(90deg,var(--ink) 0 2px,transparent 2px 3px,var(--ink) 3px 4px,transparent 4px 7px,var(--ink) 7px 10px,transparent 10px 11px)}
17
+ & .rc-paper a{color:var(--ink);font-weight:700}
18
+ & .rc-paper .void{position:absolute;left:50%;top:44%;transform:translate(-50%,-50%) rotate(-14deg);border:4px solid #d62828;color:#d62828;font:900 34px/1 var(--lp-font);padding:6px 14px;letter-spacing:.1em;opacity:0;transition:opacity .3s}
19
+ & .rc-paper.done .void{opacity:.8}
20
+ `,setup(ctx){let p=ctx.params,c=ctx.copy,path=typeof location<"u"?location.pathname:"/missing",now=new Date,wrap=document.createElement("div");wrap.className="rc",wrap.style.setProperty("--desk",p.desk),wrap.style.setProperty("--paper",p.paper),wrap.style.setProperty("--ink",p.ink),wrap.innerHTML=`<div class="rc-printer" aria-hidden="true"><i></i></div><div class="rc-paper">
21
+ <h1><span class="lp-sr">Error ${esc(c.code)}: </span>${esc(p.store)}</h1>
22
+ <div class="c">${esc(now.toLocaleDateString())} ${esc(now.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"}))}<br>TERMINAL ${esc(c.code)} \xB7 CASHIER: SERVER</div><hr>
23
+ <div class="row"><span>1 \xD7 PAGE ${esc(path)}</span><span>\u2014</span></div>
24
+ <div class="row"><span>&nbsp;&nbsp;STATUS</span><span>NOT FOUND</span></div>
25
+ <div class="row"><span>1 \xD7 LOOKING AROUND</span><span>0.00</span></div>
26
+ <div class="row"><span>1 \xD7 MILD CONFUSION</span><span>0.00</span></div><hr>
27
+ <div class="row tot"><span>TOTAL</span><span>${esc(c.code)}</span></div>
28
+ <div class="row"><span>PAID</span><span>NOTHING</span></div><hr>
29
+ <div class="c">${esc(c.title.toUpperCase())}<br>${esc(c.message)}</div>
30
+ <div class="bar" aria-hidden="true"></div><div class="c">* ${esc(c.code)} ${esc(c.code)} ${esc(c.code)} *</div><hr>
31
+ <div class="c">${c.actions.map(a=>`<a href="${esc(a.href??"/")}">${esc(a.label)} \u2192</a>`).join("<br>")}</div>
32
+ <div class="void" aria-hidden="true">VOID</div></div>`,ctx.root.append(wrap),wrap.querySelectorAll("a").forEach(a=>a.addEventListener("click",e=>{e.metaKey||e.ctrlKey||(e.preventDefault(),ctx.navigate(a.getAttribute("href"),e))}));let paper=wrap.querySelector(".rc-paper");return{frame(t){let H=paper.offsetHeight,k=ctx.reducedMotion?1:Math.min(1,t/3.4),stepped=Math.floor(k*40)/40;paper.style.transform=`translateY(${-(1-stepped)*H}px) rotate(${(1-k)*0+Math.sin(t*.8)*.4*k}deg)`,paper.classList.toggle("done",k>=1)},destroy(){wrap.remove()}}}};export{receipt_default as default};
@@ -0,0 +1,9 @@
1
+ interface Params {
2
+ sky: string;
3
+ sky2: string;
4
+ road: string;
5
+ stripe: string;
6
+ night: boolean;
7
+ }
8
+ declare const _default: import("..").SceneDef<Params>;
9
+ export default _default;
@@ -0,0 +1 @@
1
+ import{canvas2d}from"../chunks/chunk-DAZOIOF7.js";import{rgba}from"../chunks/chunk-FVGCB66F.js";import"../chunks/chunk-KIYSQVWX.js";import"../chunks/chunk-7XMDQMDO.js";var road_closed_default={id:"road-closed",name:"Road Closed",description:"A road stretches to the horizon and ends at a striped barrier, cones and blinking warning lamps. The detour sign points home.",category:"Urban",kind:"2d",motion:"live",tags:["canvas","road","construction","barrier","sign","detour","warning"],layout:"bottom",codeInScene:!0,copy:{eyebrow:"Detour ahead",title:"Road closed.",message:"This route to the page has been closed. Please follow the detour back to the homepage.",actions:[{label:"Follow the detour",href:"/",variant:"primary"}]},params:{sky:"#9fd0ff",sky2:"#f2f6fa",road:"#3a3d42",stripe:"#f2f2f2",night:!1},theme:{bg:"#d9e4ec",fg:"#ffffff",accent:"#ff7a00","accent-fg":"#fff","code-color":"rgba(20,24,29,.14)"},presetName:"Daytime",presets:{snow:{name:"Snowed In",eyebrow:"Winter closure",title:"Pass closed for the season.",params:{sky:"#b9c8d8",sky2:"#eef3f7",road:"#5a6070",stripe:"#ffffff"},theme:{bg:"#eef3f7"}},night:{name:"Night Works",params:{sky:"#050912",sky2:"#1a2234",road:"#1d2026",stripe:"#d9d9d9",night:!0},theme:{bg:"#0b111c",fg:"#f2f2f2",accent:"#ffb000","accent-fg":"#000","code-color":"rgba(242,242,242,.1)"}},desert:{name:"Desert Highway",params:{sky:"#ffb38a",sky2:"#ffe6c7",road:"#4a3f3a",stripe:"#ffd23f"},theme:{bg:"#f2c49a",fg:"#2a160a",accent:"#2a160a","accent-fg":"#fff"}}},css:"& .lp-body{text-shadow:0 2px 14px rgba(0,0,0,.55)}& .lp-message{color:rgba(255,255,255,.85)}",setup(ctx){let p=ctx.params,c=canvas2d(ctx);return{resize(){c.reset()},frame(t){let g=c.g;c.reset();let W=c.w,H=c.h,hz=H*.44,sky=g.createLinearGradient(0,0,0,hz);sky.addColorStop(0,p.sky),sky.addColorStop(1,p.sky2),g.fillStyle=sky,g.fillRect(0,0,W,hz),g.fillStyle=p.night?"#0b1410":"#8fb86a",g.fillRect(0,hz,W,H-hz);let vx=W/2+ctx.pointer.sx*W*.03;g.fillStyle=p.road,g.beginPath(),g.moveTo(vx-4,hz),g.lineTo(vx+4,hz),g.lineTo(W*.92,H),g.lineTo(W*.08,H),g.closePath(),g.fill(),g.fillStyle=p.stripe;let off=t*.6%1;for(let i=0;i<14;i++){let z0=(i+off)/14,z1=(i+off+.45)/14,y0=hz+(H-hz)*z0*z0,y1=hz+(H-hz)*z1*z1,w0=2+z0*z0*14,w1=2+z1*z1*14;g.beginPath(),g.moveTo(vx-w0/2+(W/2-vx)*z0*z0,y0),g.lineTo(vx+w0/2+(W/2-vx)*z0*z0,y0),g.lineTo(vx+w1/2+(W/2-vx)*z1*z1,y1),g.lineTo(vx-w1/2+(W/2-vx)*z1*z1,y1),g.fill()}let by=H*.5,bw=Math.min(W*.7,820),bx=W/2-bw/2,bh=bw*.12;g.fillStyle="#555";for(let lx of[bx+bw*.08,bx+bw*.92])g.fillRect(lx-5,by,10,bh*2.4);g.save(),g.beginPath(),g.rect(bx,by,bw,bh),g.clip(),g.fillStyle="#ffffff",g.fillRect(bx,by,bw,bh),g.fillStyle="#e3262f";for(let x=bx-bh*2;x<bx+bw+bh;x+=bh*1.2)g.beginPath(),g.moveTo(x,by+bh),g.lineTo(x+bh*.6,by+bh),g.lineTo(x+bh*1.6,by),g.lineTo(x+bh,by),g.closePath(),g.fill();g.restore();let sw=bw*.46,sh=bh*1.6;g.fillStyle="#ffffff",g.beginPath(),g.roundRect(W/2-sw/2,by-sh-8,sw,sh,8),g.fill(),g.strokeStyle="#e3262f",g.lineWidth=6,g.stroke(),g.fillStyle="#14181d";let label=`${ctx.copy.code} \xB7 CLOSED`;g.font='900 100px "Arial Black",Inter,Arial,sans-serif';let fsz=Math.min(sh*.5,100*sw*.86/g.measureText(label).width);g.font=`900 ${fsz}px "Arial Black",Inter,Arial,sans-serif`,g.textAlign="center",g.textBaseline="middle",g.fillText(label,W/2,by-sh/2-8);let on=Math.floor(t*1.6)%2===0;for(let[i,lx]of[bx+bw*.08,bx+bw*.92].entries()){let lit=i===0===on;if(g.fillStyle=lit?"#ffb000":"#6b4a00",lit&&(g.shadowColor="#ffb000",g.shadowBlur=30),g.beginPath(),g.arc(lx,by-16,12,0,Math.PI*2),g.fill(),g.shadowBlur=0,lit&&p.night){let grd=g.createRadialGradient(lx,by-16,0,lx,by-16,200);grd.addColorStop(0,"rgba(255,176,0,.35)"),grd.addColorStop(1,"rgba(255,176,0,0)"),g.fillStyle=grd,g.fillRect(lx-200,by-216,400,400)}}let cone=(x,y,s)=>{g.fillStyle="#ff6a00",g.beginPath(),g.moveTo(x-s*.18,y-s),g.lineTo(x+s*.18,y-s),g.lineTo(x+s*.42,y),g.lineTo(x-s*.42,y),g.closePath(),g.fill(),g.fillStyle="#fff",g.fillRect(x-s*.29,y-s*.62,s*.58,s*.14),g.fillStyle="#222",g.fillRect(x-s*.55,y,s*1.1,s*.1)};cone(bx-bw*.04,by+bh*2.4,bh*1.4),cone(bx+bw*1.04,by+bh*2.4,bh*1.4);let dx=W*.12,dy=H*.4;g.fillStyle="#444",g.fillRect(dx-3,dy,6,H*.2),g.fillStyle="#ff7a00",g.beginPath(),g.moveTo(dx-70,dy),g.lineTo(dx+80,dy-22),g.lineTo(dx+80,dy+22),g.closePath(),g.beginPath(),g.moveTo(dx-80,dy),g.lineTo(dx-40,dy-30),g.lineTo(dx+80,dy-30),g.lineTo(dx+80,dy+30),g.lineTo(dx-40,dy+30),g.closePath(),g.fill(),g.fillStyle="#14181d",g.font='900 20px "Arial Black",Inter,Arial,sans-serif',g.fillText("DETOUR",dx+14,dy+1)}}}};export{road_closed_default as default};
@@ -0,0 +1,11 @@
1
+ interface Params {
2
+ grass: string;
3
+ grass2: string;
4
+ path: string;
5
+ box: string;
6
+ border: string;
7
+ text: string;
8
+ lines: string[];
9
+ }
10
+ declare const _default: import("..").SceneDef<Params>;
11
+ export default _default;
@@ -0,0 +1,14 @@
1
+ import{PIXEL_FONT}from"../chunks/chunk-MNUNTC4L.js";import{canvas2d}from"../chunks/chunk-DAZOIOF7.js";import"../chunks/chunk-3ISI6SOJ.js";import"../chunks/chunk-KIYSQVWX.js";import"../chunks/chunk-7XMDQMDO.js";var esc=s=>s.replace(/[&<>"]/g,c=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;"})[c]),rpg_dialog_default={id:"rpg-dialog",name:"Quest Log",description:"A tiny pixel-art overworld. An old sage at the crossroads tells you the page isn't on any map, one typed line at a time. Press space to continue.",category:"Games",kind:"2d",motion:"live",tags:["canvas","pixel-art","rpg","8-bit","retro","game","dialog","keyboard"],layout:"none",copy:{title:"You can't go that way.",message:"This path leads nowhere.",actions:[{label:"Return to the village",href:"/",variant:"primary"},{label:"Ask the guild",href:"/contact",variant:"secondary"}]},params:{grass:"#5aa85a",grass2:"#4a944a",path:"#d9c08a",box:"#1a1a3a",border:"#ffffff",text:"#ffffff",lines:["Halt, traveller!","The page you seek is not on any map.","Many have searched. None returned with it.","Best go back to the village."]},theme:{bg:"#3a7a3a",fg:"#fff"},presetName:"Meadow",presets:{desert:{name:"Desert Road",params:{grass:"#e6c98a",grass2:"#d9b874",path:"#b8925c",box:"#3a1d08",border:"#ffd27a",text:"#fff3d6",lines:["The sands have swallowed many roads.","This page is one of them.","Follow the caravan home."]},theme:{bg:"#d9b874"}},dungeon:{name:"Dungeon",params:{grass:"#3a3a44",grass2:"#2e2e36",path:"#55555f",box:"#000000",border:"#d9b25f",text:"#f3e6c8",lines:["A voice echoes in the dark\u2026","There is no page in this dungeon.","Only bats. And regret.","Climb back up the stairs."]},theme:{bg:"#2a2a32"}},snow:{name:"Frozen North",params:{grass:"#e9f2f8",grass2:"#d6e6f0",path:"#b9cbd8",box:"#0d2238",border:"#bfe3ff",text:"#ffffff",lines:["Brrr\u2026 you're far from home.","Even the yetis haven't seen this page.","Head south. Toward the homepage."]},theme:{bg:"#d6e6f0"}}},css:`
2
+ & .rpg{position:absolute;left:50%;bottom:clamp(14px,5cqh,48px);transform:translateX(-50%);width:min(820px,94cqw);z-index:4;pointer-events:auto;
3
+ background:var(--box);color:var(--txt);border:4px solid var(--brd);border-radius:6px;box-shadow:0 0 0 4px var(--box),0 14px 0 0 rgba(0,0,0,.25);
4
+ padding:18px 22px 16px;font:400 clamp(11px,1.25cqw,15px)/1.9 ${PIXEL_FONT.replace(/"/g,"'")};image-rendering:pixelated}
5
+ & .rpg .who{position:absolute;left:14px;top:-18px;background:var(--box);border:4px solid var(--brd);padding:2px 10px;font-size:.8em}
6
+ & .rpg h1{font:inherit;margin:0;min-height:3.8em}
7
+ & .rpg .opts{display:flex;gap:26px;flex-wrap:wrap;margin-top:6px}
8
+ & .rpg .opts a{color:var(--txt);text-decoration:none}
9
+ & .rpg .opts a::before{content:" ";white-space:pre}
10
+ & .rpg .opts a:hover::before,.rpg .opts a:focus::before{content:"\u25B6 "}
11
+ & .rpg .more{position:absolute;right:16px;bottom:10px;animation:rpg-b .8s steps(1) infinite}
12
+ @keyframes rpg-b{50%{opacity:0}}
13
+ @media (prefers-reduced-motion:reduce){& .rpg .more{animation:none}}
14
+ `,setup(ctx){let p=ctx.params,c=canvas2d(ctx),copy=ctx.copy,box=document.createElement("div");box.className="rpg",box.style.setProperty("--box",p.box),box.style.setProperty("--brd",p.border),box.style.setProperty("--txt",p.text),box.innerHTML=`<div class="who">SAGE</div><h1 aria-live="polite"><span class="lp-sr">Error ${esc(copy.code)}: ${esc(copy.title)}</span><span class="say"></span></h1><div class="opts" hidden>${copy.actions.map(a=>`<a href="${esc(a.href??"/")}">${esc(a.label)}</a>`).join("")}</div><span class="more" aria-hidden="true">\u25BC</span>`,ctx.root.append(box);let say=box.querySelector(".say"),opts=box.querySelector(".opts"),more=box.querySelector(".more");box.querySelectorAll("a").forEach(a=>a.addEventListener("click",e=>{e.metaKey||e.ctrlKey||(e.preventDefault(),ctx.navigate(a.getAttribute("href"),e))}));let lines=[...p.lines,`${copy.title} (Error ${copy.code})`],li=0,shownAt=0,nowT=0,advance=()=>{li<lines.length-1&&(li++,shownAt=nowT)};ctx.onWindow("keydown",e=>{(e.code==="Space"||e.code==="Enter")&&ctx.visible()&&li<lines.length-1&&(e.preventDefault(),advance())}),box.addEventListener("click",e=>{e.target.closest("a")||advance()});let tile=()=>Math.max(24,Math.round(Math.min(c.w,c.h)/18)),drawMap=(g,t)=>{let T=tile(),cols=Math.ceil(c.w/T)+1,rows=Math.ceil(c.h/T)+1,midC=Math.floor(cols/2),midR=Math.floor(rows*.42);for(let y=0;y<rows;y++)for(let x=0;x<cols;x++){let onPath=(x===midC||y===midR)&&!(x>midC&&y===midR&&x>midC+2);g.fillStyle=onPath?p.path:(x*7+y*13)%5===0?p.grass2:p.grass,g.fillRect(x*T,y*T,T,T),!onPath&&(x*31+y*17)%11===0&&(g.fillStyle=(x+y)%2?"#ffd84d":"#ff7a9a",g.fillRect(x*T+T*.4,y*T+T*.4,T*.15,T*.15)),!onPath&&(x*13+y*29)%17===0&&(g.fillStyle="#2f6a2f",g.fillRect(x*T+T*.15,y*T+T*.05,T*.7,T*.6),g.fillStyle="#6b3a1e",g.fillRect(x*T+T*.42,y*T+T*.65,T*.16,T*.3))}let bx=(midC+2)*T,by=midR*T;g.fillStyle="#7a7a80";for(let i=0;i<3;i++)g.fillRect(bx+T*(.2+i*.25),by+T*(.2+i%2*.3),T*.4,T*.4);g.fillStyle="#8a5a2a",g.fillRect(bx-T*.6,by-T*.9,T*.12,T*.9),g.fillStyle="#c98a4a",g.fillRect(bx-T*1,by-T*1.4,T*.9,T*.55),g.fillStyle="#3a1d08",g.font=`700 ${Math.round(T*.26)}px ${PIXEL_FONT}`,g.textAlign="center",g.fillText(copy.code,bx-T*.55,by-T*1.02);let hx=midC*T,hy=(midR+2)*T+Math.round(Math.sin(t*6))*2,px=T/8,sprite=(rows2,ox,oy,pal)=>{rows2.forEach((r,y)=>[...r].forEach((ch,x)=>ch!=="."&&(g.fillStyle=pal[ch],g.fillRect(ox+x*px,oy+y*px,px,px))))};sprite(["..hhhh..",".hhhhhh.",".hsssss.",".sseses.","..ssss..",".bbbbbb.",".bbbbbb.","..l..l.."],hx,hy,{h:"#6b3a1e",s:"#ffd1a8",e:"#222",b:"#3a6cff",l:"#222"}),sprite(["..wwww..",".wwwwww.",".wsssss.",".sseses.",".wwwwww.","rrrrrrrr",".rrrrrr.","..r..r.."],hx+T,(midR-1)*T,{w:"#eeeeee",s:"#ffd1a8",e:"#222",r:"#7a2a9a"})};return{resize(){c.reset()},frame(t){nowT=t;let g=c.g;c.reset(),drawMap(g,t);let line=lines[li],n=ctx.reducedMotion?line.length:Math.min(line.length,Math.floor((t-shownAt)*32));say.textContent=line.slice(0,n);let last=li===lines.length-1;opts.style.display=last&&n>=line.length?"flex":"none",more.style.display=!last&&n>=line.length?"":"none",!last&&n>=line.length&&t-shownAt>line.length/32+1.6&&!ctx.reducedMotion&&advance()},destroy(){box.remove()}}}};export{rpg_dialog_default as default};
@@ -0,0 +1,10 @@
1
+ interface Params {
2
+ sky: string;
3
+ ground: string;
4
+ ink: string;
5
+ accent: string;
6
+ far: string;
7
+ night: boolean;
8
+ }
9
+ declare const _default: import("..").SceneDef<Params>;
10
+ export default _default;
@@ -0,0 +1 @@
1
+ import{GAME_CSS,hud,input,loadHigh,saveHigh}from"../chunks/chunk-MNUNTC4L.js";import{canvas2d}from"../chunks/chunk-DAZOIOF7.js";import{rgba}from"../chunks/chunk-FVGCB66F.js";import"../chunks/chunk-3ISI6SOJ.js";import"../chunks/chunk-KIYSQVWX.js";import"../chunks/chunk-7XMDQMDO.js";var ROBOT=[["...xxxxxx...","..xxxxxxxx..","..xooxxoox..","..xooxxoox..","..xxxxxxxx..","...xxxxxx...",".xxxxxxxxxx.","x.xxxxxxxx.x","..xxxxxxxx..","..xxx..xxx..","..xx....xx..",".xx......x.."],["...xxxxxx...","..xxxxxxxx..","..xooxxoox..","..xooxxoox..","..xxxxxxxx..","...xxxxxx...",".xxxxxxxxxx.","x.xxxxxxxx.x","..xxxxxxxx..","..xxx..xxx..","..x.....xx..","..xx.....xx."]],runner_default={id:"runner",name:"Offline Runner",description:"A little lost robot runs across an endless desert, jumping over broken links. Press space or tap to take over.",category:"Games",kind:"2d",motion:"game",tags:["canvas","game","playable","endless-runner","pixel-art","light","keyboard","touch"],layout:"bottom",codeInScene:!0,copy:{eyebrow:"Space / tap to jump",title:"This page isn't available.",message:"Our robot is still out looking for it. You can help it jump, or head back where things work.",actions:[{label:"Go to homepage",href:"/",variant:"primary"}]},params:{sky:"#f7f7f7",ground:"#535353",ink:"#535353",accent:"#535353",far:"#e3e3e3",night:!1},theme:{bg:"#f7f7f7",fg:"#2b2b2b",accent:"#2b2b2b","accent-fg":"#f7f7f7","font-display":"var(--lp-font-mono)","title-weight":"700"},presetName:"Classic",presets:{ocean:{name:"Beach Run",params:{sky:"#bfe7ff",ground:"#c99a5a",ink:"#14466b",accent:"#ff7a3d",far:"#7fd3f0"},theme:{bg:"#bfe7ff",fg:"#0b2a40",accent:"#14466b","accent-fg":"#fff"}},forest:{name:"Forest",params:{sky:"#e6f2d9",ground:"#3a5a2a",ink:"#2a4020",accent:"#e65a2a",far:"#b9d6a0"},theme:{bg:"#e6f2d9",fg:"#1a2a10",accent:"#2a4020","accent-fg":"#fff"}},mars:{name:"Mars",params:{sky:"#ffb38a",ground:"#7a2a12",ink:"#4a1a08",accent:"#ffe14d",far:"#e6806a"},theme:{bg:"#ffb38a",fg:"#2a0a02",accent:"#4a1a08","accent-fg":"#fff"}},night:{name:"Night Run",params:{sky:"#0d1020",ground:"#cfd4ff",ink:"#cfd4ff",accent:"#ffd76b",far:"#1a1f3a",night:!0},theme:{bg:"#0d1020",fg:"#e9ecff",accent:"#ffd76b","accent-fg":"#0d1020"}},desert:{name:"Desert Sunset",params:{sky:"#ffd7a8",ground:"#8a4b2a",ink:"#5a2d16",accent:"#ff5a36",far:"#f2a77a"},theme:{bg:"#ffd7a8",fg:"#3a1d0c",accent:"#5a2d16","accent-fg":"#ffd7a8"}},synth:{name:"Synthwave",params:{sky:"#140726",ground:"#ff3bd4",ink:"#29e7ff",accent:"#ff3bd4",far:"#2a0f4a",night:!0},theme:{bg:"#140726",fg:"#ffe6ff",accent:"#ff3bd4","accent-fg":"#140726"}}},css:GAME_CSS,setup(ctx){let p=ctx.params,c=canvas2d(ctx),inp=input(ctx,{pointerPlays:!1}),rnd=ctx.random,px=4,groundY=0,runner={y:0,vy:0,onGround:!0},obs=[],clouds=[],stars=[],speed=0,dist=0,high=loadHigh("runner"),dead=0,spawnIn=1,wasPlaying=!1;function layout(){px=Math.max(3,Math.min(6,Math.round(c.h/170))),groundY=Math.round(c.h*.6),clouds=Array.from({length:6},()=>({x:rnd()*c.w,y:c.h*(.08+rnd()*.3),s:.6+rnd()*.8})),stars=Array.from({length:60},()=>({x:rnd()*c.w,y:rnd()*groundY*.8})),reset()}function reset(){runner={y:groundY,vy:0,onGround:!0},obs=[],speed=c.w*.32,dist=0,spawnIn=.8}let rx=()=>Math.max(60,c.w*.12);function jump(){runner.onGround&&(runner.vy=-px*210,runner.onGround=!1)}function sprite(rows,x,y,body,eye){let g=c.g;for(let r=0;r<rows.length;r++)for(let q=0;q<rows[r].length;q++){let ch=rows[r][q];ch!=="."&&(g.fillStyle=ch==="o"?eye:body,g.fillRect(x+q*px,y+r*px,px,px))}}function drawObstacle(o){let g=c.g;if(o.kind===0)g.fillStyle=p.ink,g.fillRect(o.x,groundY-o.h,o.w,o.h),g.fillStyle=p.sky,g.fillRect(o.x+px,groundY-o.h+px,o.w-px*2,o.h-px*2),g.fillStyle=p.ink,g.font=`700 ${Math.round(o.w*.34)}px ui-monospace,Menlo,monospace`,g.textAlign="center",g.textBaseline="middle",g.fillText(ctx.copy.code,o.x+o.w/2,groundY-o.h/2);else if(o.kind===1){g.strokeStyle=p.ink,g.lineWidth=px*1.4;let cy=groundY-o.h/2;g.beginPath(),g.ellipse(o.x+o.w*.3,cy,o.w*.28,o.h*.42,-.5,.3,Math.PI*1.7),g.stroke(),g.beginPath(),g.ellipse(o.x+o.w*.72,cy,o.w*.28,o.h*.42,-.5,Math.PI+.3,Math.PI*2.7),g.stroke()}else{g.fillStyle=p.accent;let y=o.y;g.beginPath(),g.arc(o.x+o.w/2,y,o.w/2,0,Math.PI*2),g.fill(),g.fillStyle=p.sky,g.fillRect(o.x+o.w/2-px/2,y-o.w*.28,px,o.w*.34),g.fillRect(o.x+o.w/2-px/2,y+o.w*.14,px,px)}}return layout(),{resize(){c.reset(),layout()},frame(t,dt){let g=c.g;c.reset(),inp.playing&&!wasPlaying&&(wasPlaying=!0,reset());let live=(!ctx.reducedMotion||inp.playing)&&dt>0,rH=12*px;if(dead>0)dead-=dt,inp.pressed()&&dead<.6&&(dead=0),dead<=0&&reset();else if(live){if(speed+=c.w*.006*dt,dist+=speed*dt,inp.playing&&(inp.pressed()||inp.up||inp.action)&&jump(),!inp.playing)for(let o of obs){let gap=o.x-(rx()+rH);(o.kind!==2||o.y>groundY-rH*1.2)&&gap>0&&gap<speed*.2&&jump()}if(runner.vy+=px*620*dt,runner.y+=runner.vy*dt,runner.y>=groundY&&(runner.y=groundY,runner.vy=0,runner.onGround=!0),spawnIn-=dt,spawnIn<=0){let kind=rnd()<.55?0:rnd()<.6?1:2,w=kind===0?px*(9+Math.floor(rnd()*4)):kind===1?px*12:px*8,h=kind===0?px*(8+Math.floor(rnd()*6)):px*8;obs.push({x:c.w+20,w,h,kind,y:groundY-rH*(rnd()<.5?1.9:.6)}),spawnIn=.75+rnd()*1.1-Math.min(.35,dist/4e4)}for(let o of obs)o.x-=speed*dt;obs=obs.filter(o=>o.x+o.w>-20);let x0=rx()+px*2,x1=rx()+rH-px*2,y1=runner.y,y0=runner.y-rH+px*2;for(let o of obs){let oy0=o.kind===2?o.y-o.w/2:groundY-o.h,oy1=o.kind===2?o.y+o.w/2:groundY;if(x1>o.x+px&&x0<o.x+o.w-px&&y1>oy0+px&&y0<oy1)if(inp.playing){dead=1.2;let score2=Math.floor(dist/40);score2>high&&saveHigh("runner",high=score2)}else o.x=-999}}if(g.fillStyle=p.sky,g.fillRect(0,0,c.w,c.h),p.night){g.fillStyle=rgba(p.ink,.7);for(let s of stars)g.fillRect((s.x-dist*.02+c.w*10)%c.w,s.y,px*.5,px*.5);g.fillStyle=p.accent,g.beginPath(),g.arc(c.w*.78,c.h*.16,px*6,0,Math.PI*2),g.fill(),g.fillStyle=p.sky,g.beginPath(),g.arc(c.w*.78+px*2.5,c.h*.16-px*1.5,px*5,0,Math.PI*2),g.fill()}g.fillStyle=p.far,g.beginPath(),g.moveTo(0,groundY);for(let x=0;x<=c.w;x+=8){let wx=x+dist*.15;g.lineTo(x,groundY-c.h*.06-Math.sin(wx*.004)*c.h*.04-Math.sin(wx*.011+2)*c.h*.02)}g.lineTo(c.w,groundY),g.closePath(),g.fill(),g.fillStyle=p.night?rgba(p.ink,.12):rgba(p.ink,.18);for(let cl of clouds){let x=((cl.x-dist*.08*cl.s)%(c.w+200)+c.w+200)%(c.w+200)-100,s=px*cl.s*2;g.fillRect(x,cl.y,22*s,3*s),g.fillRect(x+4*s,cl.y-3*s,12*s,3*s),g.fillRect(x+8*s,cl.y-5*s,6*s,2*s)}g.fillStyle=p.ground,g.fillRect(0,groundY,c.w,px);for(let i=0;i<40;i++){let x=((i*137.7-dist)%c.w+c.w)%c.w;g.fillRect(x,groundY+px*2+i*7%5*px,px*(1+i%3),px*.6)}for(let o of obs)drawObstacle(o);let frame=runner.onGround&&live?Math.floor(t*12)%2:0;sprite(ROBOT[frame],rx(),runner.y-rH,p.ink,p.accent===p.ink?p.sky:p.accent),dead>0&&(g.fillStyle=p.accent,g.fillRect(rx()+3*px,runner.y-rH+2*px,px*2,px*2),g.fillRect(rx()+7*px,runner.y-rH+2*px,px*2,px*2));let fs=Math.max(10,Math.min(14,c.w/90)),score=Math.floor(dist/40);hud(g,`HI ${String(high).padStart(5,"0")} ${String(score).padStart(5,"0")}`,c.w-24,22,fs,p.ink,"right"),!inp.playing&&Math.floor(t*1.6)%2===0&&hud(g,"DEMO \xB7 PRESS SPACE OR TAP",c.w/2,groundY+px*8,fs,rgba(p.ink,.75),"center"),dead>0&&hud(g,"G A M E O V E R",c.w/2,groundY*.42,fs*1.8,p.ink,"center")}}}};export{runner_default as default};
@@ -0,0 +1,9 @@
1
+ interface Params {
2
+ card: string;
3
+ foil: string;
4
+ foil2: string;
5
+ ink: string;
6
+ prize: string;
7
+ }
8
+ declare const _default: import("..").SceneDef<Params>;
9
+ export default _default;
@@ -0,0 +1 @@
1
+ import{canvas2d}from"../chunks/chunk-DAZOIOF7.js";import{SANS}from"../chunks/chunk-3ISI6SOJ.js";import"../chunks/chunk-KIYSQVWX.js";import"../chunks/chunk-7XMDQMDO.js";var scratch_card_default={id:"scratch-card",name:"Scratch Card",description:"A lottery scratch card. Rub off the silver foil with your cursor to reveal what you won: three matching numbers, of course.",category:"Playful",kind:"2d",motion:"interactive",tags:["canvas","scratch","lottery","interactive","funny","reveal","tactile"],layout:"bottom",codeInScene:!0,copy:{eyebrow:"Scratch to reveal",title:"You matched three. Prize: nothing.",message:"Rub off the foil to see what you won. Spoiler: it's an error. The real prize is the homepage.",actions:[{label:"Claim the homepage",href:"/",variant:"primary"}]},params:{card:"#ffcf33",foil:"#c9ced6",foil2:"#9aa1ab",ink:"#1a1a2e",prize:"#e5484d"},theme:{bg:"#2a1b4a",fg:"#fff6dc",accent:"#ffcf33","accent-fg":"#2a1b4a"},presetName:"Golden Ticket",presets:{classic:{name:"Classic Silver",params:{card:"#e6e9ef",foil:"#c9ced6",foil2:"#8e949c",ink:"#14181d",prize:"#d6281a"},theme:{bg:"#14181d",accent:"#e6e9ef","accent-fg":"#14181d"}},mint:{name:"Lucky Mint",params:{card:"#7fe3c0",ink:"#0b2a20",prize:"#c2185b"},theme:{bg:"#0b2a20",accent:"#7fe3c0","accent-fg":"#0b2a20"}},neon:{name:"Neon Jackpot",params:{card:"#ff3bd4",foil:"#d0d4ff",foil2:"#8a90c9",ink:"#12002a",prize:"#3bffd0"},theme:{bg:"#12002a",accent:"#ff3bd4","accent-fg":"#fff"}}},setup(ctx){let p=ctx.params,c=canvas2d(ctx),code=[...ctx.copy.code||"404"].slice(0,6),foil,fg,card={x:0,y:0,w:0,h:0},cells=[],auto=0,scratched=0,build=()=>{let w=Math.min(c.w*.78,760),h=w*.46;card={x:(c.w-w)/2,y:Math.max(16,c.h*.34-h/2),w,h};let s=Math.min(w*.8/code.length,h*.56);cells=code.map((_,i)=>({x:card.x+w/2+(i-(code.length-1)/2)*s*1.08,y:card.y+h*.58,s})),foil=document.createElement("canvas");let sc=Math.min(2,ctx.dpr);foil.width=c.w*sc,foil.height=c.h*sc,fg=foil.getContext("2d"),fg.scale(sc,sc);for(let cell of cells){let grd=fg.createLinearGradient(cell.x-cell.s/2,cell.y-cell.s/2,cell.x+cell.s/2,cell.y+cell.s/2);grd.addColorStop(0,p.foil),grd.addColorStop(.5,p.foil2),grd.addColorStop(1,p.foil),fg.fillStyle=grd,fg.beginPath(),fg.roundRect(cell.x-cell.s*.48,cell.y-cell.s*.48,cell.s*.96,cell.s*.96,cell.s*.12),fg.fill(),fg.fillStyle="rgba(255,255,255,.35)",fg.font=`700 ${cell.s*.14}px ${SANS}`,fg.textAlign="center",fg.fillText("SCRATCH",cell.x,cell.y+cell.s*.05);for(let k=0;k<120;k++)fg.fillStyle=`rgba(0,0,0,${Math.random()*.08})`,fg.fillRect(cell.x-cell.s*.48+Math.random()*cell.s*.96,cell.y-cell.s*.48+Math.random()*cell.s*.96,2,2)}scratched=0};build();let last=null,scratch=(x,y)=>{fg.globalCompositeOperation="destination-out",fg.lineCap="round",fg.lineWidth=Math.max(22,card.w*.05),fg.beginPath(),last?fg.moveTo(last.x,last.y):fg.moveTo(x-.1,y),fg.lineTo(x,y),fg.stroke(),fg.globalCompositeOperation="source-over",last={x,y},scratched++};return ctx.on("pointermove",e=>{if(e.pointerType!=="mouse"&&!e.buttons)return last=null;scratch(ctx.pointer.x,ctx.pointer.y)}),ctx.on("pointerleave",()=>last=null),{resize(){c.reset(),build()},frame(t,dt){let g=c.g;if(c.reset(),!ctx.pointer.engaged&&!ctx.reducedMotion&&dt>0&&t>1){auto+=dt;let cell=cells[Math.floor(auto/1.4)%cells.length];if(auto<cells.length*1.4){let k=auto%1.4/1.4;scratch(cell.x-cell.s*.35+k*cell.s*.7,cell.y+Math.sin(k*18)*cell.s*.3)}else last=null}let bg=g.createRadialGradient(c.w/2,c.h*.35,0,c.w/2,c.h*.35,Math.max(c.w,c.h)*.7);bg.addColorStop(0,"#3a2a66"),bg.addColorStop(1,"#140b26"),g.fillStyle=bg,g.fillRect(0,0,c.w,c.h),g.save(),g.translate(card.x+card.w/2,card.y+card.h/2),g.rotate(-.02),g.translate(-(card.x+card.w/2),-(card.y+card.h/2)),g.fillStyle="rgba(0,0,0,.35)",g.beginPath(),g.roundRect(card.x+8,card.y+14,card.w,card.h,18),g.fill(),g.fillStyle=p.card,g.beginPath(),g.roundRect(card.x,card.y,card.w,card.h,18),g.fill(),g.fillStyle="rgba(0,0,0,.18)";for(let x=card.x+16;x<card.x+card.w-10;x+=14)g.fillRect(x,card.y+card.h*.2,6,2);g.fillStyle=p.ink,g.font=`900 ${card.h*.12}px ${SANS}`,g.textAlign="left",g.fillText("LUCKY 404",card.x+card.w*.05,card.y+card.h*.15),g.font=`700 ${card.h*.055}px ${SANS}`,g.textAlign="right",g.fillText("MATCH 3 TO WIN",card.x+card.w*.95,card.y+card.h*.14);for(let cell of cells)g.fillStyle="#fffdf6",g.beginPath(),g.roundRect(cell.x-cell.s*.48,cell.y-cell.s*.48,cell.s*.96,cell.s*.96,cell.s*.12),g.fill();code.forEach((ch,i)=>{let cell=cells[i];g.fillStyle=p.prize,g.font=`900 ${cell.s*.7}px ${SANS}`,g.textAlign="center",g.textBaseline="middle",g.fillText(ch,cell.x,cell.y+cell.s*.04)}),g.textBaseline="alphabetic",g.drawImage(foil,0,0,c.w,c.h),g.restore()}}}};export{scratch_card_default as default};
@@ -0,0 +1,8 @@
1
+ interface Params {
2
+ bg: string;
3
+ colors: string[];
4
+ speed: number;
5
+ crt: boolean;
6
+ }
7
+ declare const _default: import("..").SceneDef<Params>;
8
+ export default _default;
@@ -0,0 +1 @@
1
+ import{canvas2d}from"../chunks/chunk-DAZOIOF7.js";import{rgba}from"../chunks/chunk-FVGCB66F.js";import"../chunks/chunk-KIYSQVWX.js";import"../chunks/chunk-7XMDQMDO.js";var screensaver_default={id:"screensaver",name:"Screensaver",description:"The logo bounces off the edges and changes colour every time. It's waiting for the perfect corner hit, and so are you.",category:"Retro Tech",kind:"2d",motion:"live",tags:["canvas","screensaver","bounce","nostalgia","funny","dark"],layout:"bottom",codeInScene:!0,copy:{eyebrow:"Idle",title:"Nothing's happening here.",message:"This page went to sleep and never woke up. Wait for the corner hit, or wake up the homepage.",actions:[{label:"Wake up",href:"/",variant:"primary"}]},params:{bg:"#000000",colors:["#ff3b3b","#ffb33b","#fff23b","#3bff6b","#3bd8ff","#7b5cff","#ff3bd8"],speed:1,crt:!1},theme:{bg:"#000",fg:"#f2f2f2",accent:"#f2f2f2","accent-fg":"#000"},presetName:"Classic",presets:{neon:{name:"Neon",params:{bg:"#05000d",colors:["#ff00e6","#00f0ff","#ffe600","#00ff85"]}},mono:{name:"Monochrome",params:{bg:"#000000",colors:["#ffffff","#bbbbbb","#777777"]}},crt:{name:"CRT",params:{crt:!0},theme:{}},pastel:{name:"Pastel",params:{bg:"#f7f3ee",colors:["#ff8fa3","#ffc06b","#7bd88f","#7bc8ff","#b49cff"]},theme:{bg:"#f7f3ee",fg:"#1c1a17",accent:"#1c1a17","accent-fg":"#f7f3ee"}},fast:{name:"Turbo",params:{speed:2.4}}},setup(ctx){let p=ctx.params,c=canvas2d(ctx),rnd=ctx.random,code=ctx.copy.code||"404",x=0,y=0,vx=1,vy=1,w=0,h=0,ci=0,hits=0,corners=0,flash=0,bursts=[],size=()=>{w=Math.min(c.w*.3,340),h=w*.5,x=rnd()*(c.w-w),y=rnd()*(c.h*.62-h);let sp=Math.max(c.w,c.h)*.12*p.speed;vx=sp,vy=sp*.8};size();let logo=(g,col)=>{g.save(),g.translate(x,y),g.fillStyle=col,g.font=`italic 900 ${h*.62}px "Arial Black","Helvetica Neue",Arial,sans-serif`,g.textAlign="center",g.textBaseline="middle",g.fillText(code,w/2,h*.38),g.beginPath(),g.ellipse(w/2,h*.84,w*.46,h*.13,0,0,Math.PI*2),g.fill(),g.fillStyle=p.bg,g.font=`900 ${h*.12}px "Arial Black",Arial,sans-serif`,g.fillText("NOT FOUND",w/2,h*.845),g.restore()};return{resize(){c.reset(),size()},frame(t,dt){let g=c.g;c.reset();let H=c.h*.62;if(dt>0){x+=vx*dt,y+=vy*dt;let hx=!1,hy=!1;if((x<=0||x+w>=c.w)&&(vx=-vx,x=Math.max(0,Math.min(c.w-w,x)),hx=!0),(y<=0||y+h>=H)&&(vy=-vy,y=Math.max(0,Math.min(H-h,y)),hy=!0),(hx||hy)&&(ci=(ci+1)%p.colors.length,hits++),hx&&hy){corners++,flash=1;for(let i=0;i<80;i++)bursts.push({x:x+w/2,y:y+h/2,vx:(rnd()-.5)*900,vy:(rnd()-.8)*900,life:1.4,col:p.colors[i%p.colors.length]})}}g.fillStyle=p.bg,g.fillRect(0,0,c.w,c.h),flash>0&&(g.fillStyle=rgba(p.colors[ci],flash*.2),g.fillRect(0,0,c.w,c.h),flash-=dt),logo(g,p.colors[ci]);for(let b of bursts)b.x+=b.vx*dt,b.y+=b.vy*dt,b.vy+=900*dt,b.life-=dt,g.fillStyle=rgba(b.col,Math.max(0,b.life)),g.fillRect(b.x,b.y,5,9);if(bursts=bursts.filter(b=>b.life>0),g.font="600 12px ui-monospace,Menlo,monospace",g.fillStyle=rgba(p.colors[ci],.7),g.textAlign="right",g.fillText(`edges ${hits} \xB7 corners ${corners}`,c.w-18,24),p.crt){g.fillStyle="rgba(0,0,0,.25)";for(let yy=0;yy<c.h;yy+=3)g.fillRect(0,yy,c.w,1)}}}}};export{screensaver_default as default};
@@ -0,0 +1,9 @@
1
+ interface Params {
2
+ /** Where the search form goes; the query is appended as ?q=… */
3
+ searchUrl: string;
4
+ placeholder: string;
5
+ /** Popular pages listed under the search box, as "Label|/href". */
6
+ links: string[];
7
+ }
8
+ declare const _default: import("..").SceneDef<Params>;
9
+ export default _default;
@@ -0,0 +1,17 @@
1
+ import{actions,esc,layer,sr}from"../chunks/chunk-ES56TX4X.js";import"../chunks/chunk-B2NBRLO2.js";import"../chunks/chunk-KIYSQVWX.js";import"../chunks/chunk-7XMDQMDO.js";var search_404_default={id:"search-404",name:"Search",description:"The most useful 404 for docs, shops and blogs: a search box that sends people straight to your search page, plus a few popular links.",category:"Simple",kind:"2d",motion:"static",tags:["simple","search","docs","ecommerce","blog","useful","static","fast"],layout:"none",copy:{eyebrow:"404",title:"We couldn\u2019t find that page",message:"Try searching for it, or start from one of these:",actions:[{label:"Go home",href:"/",icon:"home"}]},params:{searchUrl:"/search",placeholder:"Search the site\u2026",links:["Getting started|/docs","Pricing|/pricing","Blog|/blog","Contact|/contact"]},theme:{bg:"#ffffff",fg:"#111827",accent:"#2563eb","accent-fg":"#ffffff",radius:"10px"},presetName:"Light",presets:{dark:{name:"Dark",theme:{bg:"#0d1117",fg:"#e6edf3",accent:"#2f81f7","accent-fg":"#ffffff"}},shop:{name:"Shop",title:"This product has left the shelf",message:"Search our store or browse a popular collection:",params:{placeholder:"Search products\u2026",links:["New arrivals|/new","Best sellers|/best-sellers","Sale|/sale","Gift cards|/gift-cards"]},theme:{bg:"#faf7f2",fg:"#1c1917",accent:"#1c1917","accent-fg":"#faf7f2",radius:"999px"}},docs:{name:"Docs",title:"This doc page doesn\u2019t exist",message:"It may have moved in a recent update. Search the docs:",params:{placeholder:"Search documentation\u2026",links:["Quick start|/docs/start","API reference|/docs/api","Guides|/docs/guides","Changelog|/changelog"]},theme:{bg:"#fcfcfd",fg:"#18181b",accent:"#7c3aed","accent-fg":"#ffffff",font:"ui-sans-serif,system-ui,sans-serif"}}},css:`
2
+ & .sr4{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:24px 16px;text-align:center;overflow:auto}
3
+ & .sr4 .ey{font-size:13px;font-weight:700;color:var(--lp-accent);letter-spacing:.06em}
4
+ & .sr4 h1{margin:10px 0 0;font-size:clamp(26px,4.4cqw,48px);font-weight:700;letter-spacing:-.03em;line-height:1.1;text-wrap:balance}
5
+ & .sr4 p{margin:14px 0 0;color:var(--lp-muted);font-size:clamp(14px,1.4cqw,16px)}
6
+ & .sr4 form{margin-top:26px;display:flex;width:min(520px,100%);border:1px solid color-mix(in srgb,var(--lp-fg) 16%,transparent);border-radius:var(--lp-radius);background:color-mix(in srgb,var(--lp-fg) 3%,var(--lp-bg));overflow:hidden;transition:border-color .2s,box-shadow .2s}
7
+ & .sr4 form:focus-within{border-color:var(--lp-accent);box-shadow:0 0 0 4px color-mix(in srgb,var(--lp-accent) 18%,transparent)}
8
+ & .sr4 input{flex:1;min-width:0;border:0;background:none;padding:14px 16px;font:inherit;font-size:15px;color:var(--lp-fg);outline:none}
9
+ & .sr4 form button{border:0;margin:5px;padding:0 18px;border-radius:calc(var(--lp-radius) - 3px);background:var(--lp-accent);color:var(--lp-accent-fg);font:inherit;font-weight:600;font-size:14px;cursor:pointer}
10
+ & .sr4 ul{list-style:none;margin:22px 0 0;padding:0;display:flex;flex-wrap:wrap;justify-content:center;gap:8px}
11
+ & .sr4 ul a{display:block;padding:7px 14px;border-radius:999px;background:color-mix(in srgb,var(--lp-fg) 6%,transparent);color:var(--lp-fg);text-decoration:none;font-size:13.5px;font-weight:500}
12
+ & .sr4 ul a:hover{background:color-mix(in srgb,var(--lp-accent) 14%,transparent);color:var(--lp-accent)}
13
+ & .sr4 .lp-actions{margin-top:26px}
14
+ & .sr4 .lp-btn--primary{background:none;color:var(--lp-fg);padding:8px 4px;font-weight:600}
15
+ `,setup(ctx){let p=ctx.params,c=ctx.copy,links=p.links.map(l=>l.split("|")).map(([label,href])=>`<li><a href="${esc(href??"/")}">${esc(label)}</a></li>`).join(""),el=layer(ctx,"sr4",`<span class="ey">${esc(c.eyebrow||c.code)}</span><h1>${sr(c.code)}${esc(c.title)}</h1><p>${esc(c.message)}</p>
16
+ <form role="search" action="${esc(p.searchUrl)}"><input name="q" type="search" aria-label="Search" placeholder="${esc(p.placeholder)}" data-lp-interactive><button type="submit">Search</button></form>
17
+ <ul>${links}</ul>`);el.querySelectorAll("ul a").forEach(a=>a.addEventListener("click",e=>{e.metaKey||e.ctrlKey||(e.preventDefault(),ctx.navigate(a.getAttribute("href"),e))}));let form=el.querySelector("form");return form.addEventListener("submit",e=>{e.preventDefault();let q=form.elements.namedItem("q").value.trim();ctx.navigate(p.searchUrl+(p.searchUrl.includes("?")?"&":"?")+"q="+encodeURIComponent(q))}),el.append(actions(ctx)),{destroy:()=>el.remove()}}};export{search_404_default as default};
@@ -0,0 +1,6 @@
1
+ interface Params {
2
+ /** Footer line, e.g. "nginx" or "Apache/2.4.58 (Ubuntu) Server at example.com Port 443". */
3
+ server: string;
4
+ }
5
+ declare const _default: import("..").SceneDef<Params>;
6
+ export default _default;
@@ -0,0 +1,10 @@
1
+ import{esc,layer}from"../chunks/chunk-ES56TX4X.js";import"../chunks/chunk-B2NBRLO2.js";import"../chunks/chunk-KIYSQVWX.js";import"../chunks/chunk-7XMDQMDO.js";var server_default_default={id:"server-default",name:"Server Default",description:"The bare web-server error page everyone recognises: a Times heading, a rule and the server signature. Deadpan, tiny and on purpose.",category:"Simple",kind:"2d",motion:"static",tags:["simple","nginx","apache","server","plain","developer","joke","static","fast"],layout:"none",copy:{title:"Not Found",message:"The requested URL was not found on this server.",actions:[{label:"Return to the home page",href:"/"}]},params:{server:"nginx"},theme:{bg:"#ffffff",fg:"#000000"},presetName:"nginx",presets:{apache:{name:"Apache",params:{server:"Apache/2.4.58 (Ubuntu) Server at localhost Port 443"}},iis:{name:"IIS",title:"404 - File or directory not found.",message:"The resource you are looking for might have been removed, had its name changed, or is temporarily unavailable.",params:{server:"Microsoft-IIS/10.0"}},dark:{name:"Dark",theme:{bg:"#1e1e1e",fg:"#d4d4d4"}}},css:`
2
+ & .sd{position:absolute;inset:0;padding:8px 8px;font-family:"Times New Roman",Times,serif;font-size:16px;color:var(--lp-fg);overflow:auto}
3
+ & .sd h1{margin:21px 0;font-size:2em;font-weight:700;text-align:center;font-family:inherit}
4
+ &.sd-apache .sd h1,&.sd-apache .sd p{text-align:left}
5
+ & .sd p{margin:16px 0;text-align:center}
6
+ & .sd hr{border:0;border-top:1px solid color-mix(in srgb,var(--lp-fg) 40%,transparent);margin:8px 0}
7
+ & .sd address,& .sd center{font-style:normal;text-align:center;display:block}
8
+ & .sd a{color:#0000ee}
9
+ & .sd a:visited{color:#551a8b}
10
+ `,setup(ctx){let c=ctx.copy,p=ctx.params,apache=/apache/i.test(p.server);ctx.root.classList.toggle("sd-apache",apache);let title=/^\d/.test(c.title)?c.title:`${c.code} ${c.title}`,link=c.actions[0],el=layer(ctx,"sd",`<h1><span class="lp-sr">Error ${esc(c.code)}: </span>${esc(title)}</h1>${apache||c.message!=="The requested URL was not found on this server."?`<p>${esc(c.message)}</p>`:""}${link?`<p><a href="${esc(link.href??"/")}">${esc(link.label)}</a></p>`:""}<hr>${apache?`<address>${esc(p.server)}</address>`:`<center>${esc(p.server)}</center>`}`);return el.querySelector("a")?.addEventListener("click",e=>{e.metaKey||e.ctrlKey||(e.preventDefault(),ctx.navigate(link.href??"/",e))}),{destroy:()=>el.remove()}}};export{server_default_default as default};
@@ -0,0 +1,9 @@
1
+ interface Params {
2
+ bg: string;
3
+ rack: string;
4
+ led: string[];
5
+ dead: string;
6
+ fire: boolean;
7
+ }
8
+ declare const _default: import("..").SceneDef<Params>;
9
+ export default _default;
@@ -0,0 +1 @@
1
+ import{canvas2d}from"../chunks/chunk-DAZOIOF7.js";import{rgba}from"../chunks/chunk-FVGCB66F.js";import"../chunks/chunk-KIYSQVWX.js";import"../chunks/chunk-7XMDQMDO.js";var server_room_default={id:"server-room",name:"Server Room",description:"Rows of racks blinking away happily in the cold aisle, except one, which is dark, smoking and very much not serving your page.",category:"Retro Tech",kind:"2d",motion:"live",tags:["canvas","server","datacenter","devops","funny","dark","tech"],layout:"bottom",codeInScene:!0,copy:{eyebrow:"Rack 4 \xB7 Unit 04",title:"The server for this page is down.",message:"Every other machine is humming along. This one isn't. An on-call engineer has been paged.",actions:[{label:"Route me home",href:"/",variant:"primary"},{label:"Status page",href:"/status",variant:"secondary"}]},params:{bg:"#06080c",rack:"#14171d",led:["#3dff8a","#3bd6ff","#ffb000"],dead:"#ff3b3b",fire:!1},theme:{bg:"#06080c",fg:"#e6edf5",accent:"#3dff8a","accent-fg":"#021208","code-color":"rgba(230,237,245,.12)"},presetName:"Cold Aisle",presets:{blue:{name:"Blue Hall",params:{bg:"#020814",rack:"#0b1426",led:["#3bd6ff","#5a7bff","#ffffff"],dead:"#ffb000"},theme:{bg:"#020814",accent:"#3bd6ff","accent-fg":"#020814"}},fire:{name:"On Fire",eyebrow:"This is fine",title:"This is fine.",message:"The server hosting this page is having a moment. Everything else is fine. Mostly.",params:{fire:!0}},white:{name:"Clean Room",params:{bg:"#e9edf2",rack:"#ffffff",led:["#16a34a","#2563eb","#d97706"]},theme:{bg:"#e9edf2",fg:"#0f172a",accent:"#0f172a","accent-fg":"#fff","code-color":"rgba(15,23,42,.1)"}}},setup(ctx){let p=ctx.params,c=canvas2d(ctx),rnd=ctx.random,leds=[],smoke=[],deadRack={x:0,y:0,w:0,h:0},racks=()=>{let n=c.w<700?3:5,w=Math.min(160,c.w*.86/n-14),h=c.h*.6,gap=14,x0=(c.w-(n*w+(n-1)*gap))/2;return Array.from({length:n},(_,i)=>({x:x0+i*(w+gap),y:c.h*.06,w,h,dead:i===Math.floor(n/2)}))},build=()=>{leds=[];for(let r of racks()){r.dead&&(deadRack=r);let units=14;for(let u=0;u<units;u++){let uy=r.y+14+u*((r.h-28)/units);for(let k=0;k<6;k++)leds.push({x:r.x+14+k*9,y:uy+8,col:p.led[Math.floor(rnd()*p.led.length)],rate:1+rnd()*8,ph:rnd()*10,dead:r.dead})}}};return build(),{resize(){c.reset(),build()},frame(t,dt){let g=c.g;c.reset(),g.fillStyle=p.bg,g.fillRect(0,0,c.w,c.h),g.strokeStyle=rgba(p.led[1],.06);for(let i=-10;i<=10;i++)g.beginPath(),g.moveTo(c.w/2+i*30,c.h*.66),g.lineTo(c.w/2+i*160,c.h),g.stroke();for(let r of racks()){g.fillStyle=p.rack,g.fillRect(r.x,r.y,r.w,r.h),g.strokeStyle=rgba("#ffffff",.06),g.strokeRect(r.x+.5,r.y+.5,r.w-1,r.h-1);let units=14;for(let u=0;u<units;u++){let uy=r.y+14+u*((r.h-28)/units);g.fillStyle=rgba("#000000",.35),g.fillRect(r.x+8,uy,r.w-16,(r.h-28)/units-4),g.fillStyle=rgba("#ffffff",.05);for(let v=0;v<8;v++)g.fillRect(r.x+r.w-60+v*6,uy+4,3,(r.h-28)/units-12)}r.dead&&(g.fillStyle=rgba(p.dead,.08+.06*Math.sin(t*3)),g.fillRect(r.x,r.y,r.w,r.h),g.fillStyle=p.dead,g.font="700 12px ui-monospace,Menlo,monospace",g.textAlign="center",g.fillText(`ERR ${ctx.copy.code}`,r.x+r.w/2,r.y+r.h+22))}for(let l of leds){let on,col=l.col;l.dead?(on=Math.floor(t*1.5+l.ph)%4===0&&l.x<deadRack.x+20,col=p.dead):on=Math.sin(t*l.rate+l.ph)>-.2||Math.random()<.02,on&&(g.fillStyle=col,g.shadowColor=col,g.shadowBlur=6,g.fillRect(l.x,l.y,4,3))}g.shadowBlur=0,dt>0&&Math.random()<dt*(p.fire?20:6)&&smoke.push({x:deadRack.x+deadRack.w*(.3+Math.random()*.4),y:deadRack.y+10,r:10+Math.random()*14,life:1,vx:(Math.random()-.5)*20});for(let s of smoke)s.y-=30*dt,s.x+=s.vx*dt,s.r+=18*dt,s.life-=dt*.35,g.fillStyle=`rgba(140,140,150,${Math.max(0,s.life*.25)})`,g.beginPath(),g.arc(s.x,s.y,s.r,0,Math.PI*2),g.fill();if(smoke=smoke.filter(s=>s.life>0),p.fire)for(let k=0;k<9;k++){let fx=deadRack.x+10+k/8*(deadRack.w-20),fh=30+Math.sin(t*9+k*1.7)*12+Math.sin(t*17+k)*6,grd=g.createLinearGradient(0,deadRack.y-fh,0,deadRack.y+6);grd.addColorStop(0,"rgba(255,200,60,0)"),grd.addColorStop(.4,"rgba(255,140,30,.85)"),grd.addColorStop(1,"rgba(255,60,20,.95)"),g.fillStyle=grd,g.beginPath(),g.moveTo(fx-12,deadRack.y+6),g.quadraticCurveTo(fx-6,deadRack.y-fh*.5,fx,deadRack.y-fh),g.quadraticCurveTo(fx+6,deadRack.y-fh*.5,fx+12,deadRack.y+6),g.fill()}}}}};export{server_room_default as default};
@@ -0,0 +1,10 @@
1
+ interface Params {
2
+ skyTop: string;
3
+ skyBottom: string;
4
+ building: string;
5
+ window: string;
6
+ lit: string;
7
+ water: boolean;
8
+ }
9
+ declare const _default: import("..").SceneDef<Params>;
10
+ export default _default;
@@ -0,0 +1 @@
1
+ import{codeBitmap}from"../chunks/chunk-MNUNTC4L.js";import{canvas2d}from"../chunks/chunk-DAZOIOF7.js";import{rgba}from"../chunks/chunk-FVGCB66F.js";import"../chunks/chunk-3ISI6SOJ.js";import"../chunks/chunk-KIYSQVWX.js";import"../chunks/chunk-7XMDQMDO.js";var skyline_default={id:"skyline",name:"City Lights",description:"A city at night where the lit office windows across the skyline spell out the error, reflected in the river below.",category:"Urban",kind:"2d",motion:"live",tags:["canvas","city","night","windows","skyline","pixel","calm"],layout:"top",codeInScene:!0,copy:{eyebrow:"After hours",title:"Everyone's gone home. So did the page.",message:"The night shift lit up the windows to tell you. The page you wanted isn't in this building.",actions:[{label:"Head home",href:"/",variant:"primary"}]},params:{skyTop:"#050816",skyBottom:"#1d1640",building:"#0a0c16",window:"#1a1f33",lit:"#ffd27a",water:!0},theme:{bg:"#070a18",fg:"#f4ecdc",accent:"#ffd27a","accent-fg":"#1a1000"},presetName:"Midnight",presets:{green:{name:"Emerald City",params:{lit:"#6bffb0",skyTop:"#020a08",skyBottom:"#0d2a20"},theme:{accent:"#6bffb0","accent-fg":"#02140b"}},snow:{name:"Snowy Night",params:{lit:"#fff1c2",skyTop:"#1a2236",skyBottom:"#4a5a7a",building:"#0f1422",water:!1},theme:{bg:"#1a2236"}},dusk:{name:"Dusk",params:{skyTop:"#2b2a6b",skyBottom:"#ff8a5c",building:"#1a1430",window:"#2a2448",lit:"#fff1c2"},theme:{bg:"#2b2a6b",accent:"#fff1c2","accent-fg":"#2b2a6b"}},cyber:{name:"Neo City",params:{skyTop:"#0a0018",skyBottom:"#3a0a4a",building:"#080010",window:"#1a0a2a",lit:"#ff3bd4"},theme:{bg:"#0a0018",fg:"#ffe6ff",accent:"#ff3bd4","accent-fg":"#fff"}},cold:{name:"Office Blue",params:{lit:"#bfe3ff",skyBottom:"#0f2240"},theme:{accent:"#bfe3ff","accent-fg":"#071226"}}},css:"& .lp-overlay{padding-top:clamp(24px,6cqh,64px)}",setup(ctx){let p=ctx.params,c=canvas2d(ctx),rnd=ctx.random,layer,wins=[],horizon=0;function build(){let W=c.w,H=c.h;horizon=H*(p.water?.8:.96);let cell=Math.max(7,Math.min(13,W/130)),gx=cell,gy=cell*1.35,cols=Math.floor(W/gx),top=H*.36,rows=Math.floor((horizon-top)/gy),bw=Math.round(cols*.86),bh=Math.round(rows*.72),bm=codeBitmap(ctx.copy.code||"404",bw,bh,900),bx=Math.floor((cols-bw)/2),by=Math.floor(rows*.06),sc=Math.min(2,ctx.dpr);layer=document.createElement("canvas"),layer.width=W*sc,layer.height=H*sc;let g=layer.getContext("2d");g.scale(sc,sc),wins=[];let x=0;for(;x<cols;){let w=4+Math.floor(rnd()*7),hRows=x+w/2>bx&&x<bx+bw?Math.max(by+bh+2,rows-Math.floor(rnd()*3)):Math.floor(rows*(.35+rnd()*.6)),y0=horizon-hRows*gy;g.fillStyle=p.building,g.fillRect(x*gx,y0-gy*.6,w*gx,horizon-y0+gy),rnd()>.7&&g.fillRect(x*gx+w*gx/2,y0-gy*3,2,gy*2.4);for(let r=0;r<hRows;r++)for(let q=0;q<w;q++){let gxI=x+q,gyI=rows-hRows+r,inCode=gxI>=bx&&gxI<bx+bw&&gyI>=by&&gyI<by+bh&&bm[(gyI-by)*bw+(gxI-bx)];wins.push({x:gxI*gx+gx*.18,y:horizon-(hRows-r)*gy+gy*.2,w:gx*.64,h:gy*.55,code:!!inCode,flick:rnd(),on:!inCode&&rnd()<.08})}x+=w}}return build(),{resize(){c.reset(),build()},frame(t,dt){let g=c.g;c.reset();let sky=g.createLinearGradient(0,0,0,horizon);sky.addColorStop(0,p.skyTop),sky.addColorStop(1,p.skyBottom),g.fillStyle=sky,g.fillRect(0,0,c.w,c.h),g.drawImage(layer,0,0,c.w,c.h);let reveal=ctx.reducedMotion?1:Math.min(1,t/3);for(let w of wins){dt>0&&!w.code&&Math.random()<4e-4&&(w.on=!w.on);let lit=w.on;w.code&&(lit=w.flick<reveal&&!(Math.sin(t*7+w.flick*40)>.995)),g.fillStyle=lit?w.code?p.lit:rgba(p.lit,.5):p.window,g.fillRect(w.x,w.y,w.w,w.h)}if(p.water){g.save(),g.globalAlpha=.42,g.translate(0,horizon*2),g.scale(1,-1),g.drawImage(c.canvas,0,0,c.canvas.width,c.canvas.height*(horizon/c.h),0,0,c.w,horizon),g.restore();let wg=g.createLinearGradient(0,horizon,0,c.h);wg.addColorStop(0,rgba(p.skyTop,.35)),wg.addColorStop(1,rgba(p.skyTop,.92)),g.fillStyle=wg,g.fillRect(0,horizon,c.w,c.h-horizon),g.fillStyle=rgba(p.lit,.12);for(let i=0;i<70;i++){let y=horizon+i*37.7%(c.h-horizon),x=(i*113.3+t*18*(1+i%3))%(c.w+200)-100;g.fillRect(x,y,30+i%5*12,1)}}}}}};export{skyline_default as default};
@@ -0,0 +1,8 @@
1
+ interface Params {
2
+ skyTop: string;
3
+ skyBottom: string;
4
+ smoke: string;
5
+ plane: string;
6
+ }
7
+ declare const _default: import("..").SceneDef<Params>;
8
+ export default _default;
@@ -0,0 +1 @@
1
+ import{canvas2d}from"../chunks/chunk-DAZOIOF7.js";import{rgba}from"../chunks/chunk-FVGCB66F.js";import{SANS,textPoints}from"../chunks/chunk-3ISI6SOJ.js";import"../chunks/chunk-KIYSQVWX.js";import"../chunks/chunk-7XMDQMDO.js";var skywriting_default={id:"skywriting",name:"Skywriting",description:"A little plane loops across a clear sky, writing the error in white smoke puffs that slowly drift and fade.",category:"Playful",kind:"2d",motion:"live",tags:["canvas","sky","plane","smoke","summer","light","calm"],layout:"bottom",codeInScene:!0,copy:{eyebrow:"Message in the sky",title:"We spelled it out for you.",message:"The page you wanted isn't here, and now everyone in town knows it. Fly home.",actions:[{label:"Fly home",href:"/",variant:"primary"}]},params:{skyTop:"#4aa3f0",skyBottom:"#cfeaff",smoke:"#ffffff",plane:"#e5484d"},theme:{bg:"#8ccaf8",fg:"#06233d",accent:"#06233d","accent-fg":"#fff"},presetName:"Summer",presets:{sunset:{name:"Sunset",params:{skyTop:"#3a3a8a",skyBottom:"#ffb38a",smoke:"#fff1e6",plane:"#1d1d22"},theme:{bg:"#c98a8a",fg:"#1a0a14",accent:"#1a0a14"}},pink:{name:"Cotton Candy",params:{skyTop:"#ff9ec4",skyBottom:"#ffe6f0",smoke:"#ffffff",plane:"#5b2cff"},theme:{bg:"#ffc2da",fg:"#3a0a22",accent:"#3a0a22"}},night:{name:"Searchlights",params:{skyTop:"#050a1f",skyBottom:"#1d2a55",smoke:"#cfe0ff",plane:"#ffd23f"},theme:{bg:"#0b1430",fg:"#eef2ff",accent:"#eef2ff","accent-fg":"#0b1430"}}},setup(ctx){let p=ctx.params,c=canvas2d(ctx),rnd=ctx.random,path=[],puffs=[],head=0,cycleStart=0,build=()=>{let boxW=Math.min(c.w*.8,1e3),boxH=Math.min(boxW*.4,c.h*.42),pts=textPoints(ctx.copy.code||"404",{width:boxW,height:boxH,font:SANS,weight:300,fit:.95,step:Math.max(6,boxW/120),random:rnd}),arr=[];for(let i=0;i<pts.length;i+=2)arr.push([pts[i]+(c.w-boxW)/2,pts[i+1]+c.h*.36-boxH/2]);arr.sort((a,b)=>Math.round(a[0]/14)-Math.round(b[0]/14)||(Math.round(a[0]/14)%2?b[1]-a[1]:a[1]-b[1])),path=arr,puffs=[],head=0};return build(),{resize(){c.reset(),build()},frame(t,dt){let g=c.g;c.reset();let sky=g.createLinearGradient(0,0,0,c.h);if(sky.addColorStop(0,p.skyTop),sky.addColorStop(1,p.skyBottom),g.fillStyle=sky,g.fillRect(0,0,c.w,c.h),ctx.reducedMotion&&!puffs.length)for(let[x,y]of path)puffs.push({x,y,r:7,born:0});if(dt>0){let speed=path.length/7,target=Math.min(path.length,(t-cycleStart)*speed);for(;head<target;){let[x,y]=path[Math.floor(head)];puffs.push({x:x+(rnd()-.5)*3,y:y+(rnd()-.5)*3,r:4+rnd()*3,born:t}),head++}head>=path.length&&t-cycleStart>16&&(cycleStart=t,head=0,puffs=[])}for(let q of puffs){let age=t-q.born,r=q.r+Math.min(age,10)*1.1,a=ctx.reducedMotion?.9:Math.max(0,.95-Math.max(0,age-6)*.12),x=q.x+age*3;g.fillStyle=rgba(p.smoke,a*.75),g.beginPath(),g.arc(x,q.y-age*.6,r,0,Math.PI*2),g.fill()}let i=Math.min(path.length-1,Math.max(0,Math.floor(head)));if(head<path.length&&path.length){let[x,y]=path[i],[px,py]=path[Math.max(0,i-3)],a=Math.atan2(y-py,x-px);g.save(),g.translate(x+6,y),g.rotate(a),g.fillStyle=p.plane,g.beginPath(),g.moveTo(14,0),g.lineTo(-10,-4),g.lineTo(-10,4),g.closePath(),g.fill(),g.fillRect(-2,-12,6,24),g.fillRect(-12,-6,4,12),g.restore()}}}}};export{skywriting_default as default};
@@ -0,0 +1,10 @@
1
+ interface Params {
2
+ body: string;
3
+ trim: string;
4
+ reel: string;
5
+ ink: string;
6
+ lights: string;
7
+ symbols: string[];
8
+ }
9
+ declare const _default: import("..").SceneDef<Params>;
10
+ export default _default;
@@ -0,0 +1,33 @@
1
+ import"../chunks/chunk-KIYSQVWX.js";import"../chunks/chunk-7XMDQMDO.js";var esc=s=>s.replace(/[&<>"]/g,c=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;"})[c]),slot_machine_default={id:"slot-machine",name:"Jackpot",description:"A one-armed bandit that always lands on the error. Pull the lever (or press space) as often as you like.",category:"Playful",kind:"2d",motion:"interactive",tags:["dom","css-3d","casino","game","funny","interactive","neon"],layout:"bottom",codeInScene:!0,copy:{eyebrow:"Pull the lever",title:"Jackpot! Of nothing.",message:"Every spin lands on the same three numbers. The house always wins, and the house is the homepage.",actions:[{label:"Cash out at home",href:"/",variant:"primary"}]},params:{body:"#c4161c",trim:"#ffd166",reel:"#fffaf0",ink:"#1a1a1a",lights:"#ffe08a",symbols:["7","\u{1F352}","\u{1F514}","\u{1F34B}","\u2605","BAR","\u{1F48E}","?"]},theme:{bg:"#1b0b2e",fg:"#fff3d6",accent:"#ffd166","accent-fg":"#1b0b2e"},presetName:"Vegas",presets:{candy:{name:"Candy Crush",params:{body:"#ff6fb1",trim:"#fff1f8",reel:"#ffffff",ink:"#4a0f2a",lights:"#ffe6f2"},theme:{bg:"#ffd6e8",fg:"#4a0f2a",accent:"#4a0f2a","accent-fg":"#fff"}},cyber:{name:"Cyber",params:{body:"#1a1a2e",trim:"#00f0ff",reel:"#0b0b18",ink:"#00f0ff",lights:"#ff00e6"},theme:{bg:"#05050f",fg:"#e6fbff",accent:"#00f0ff","accent-fg":"#05050f"}},mint:{name:"Retro Mint",params:{body:"#3fb8a5",trim:"#f4efe1",reel:"#fffdf6",ink:"#1f3b37",lights:"#fff2c2"},theme:{bg:"#f4efe1",fg:"#1f3b37",accent:"#1f3b37","accent-fg":"#f4efe1"}},noir:{name:"Black & Gold",params:{body:"#111111",trim:"#d4af37",reel:"#f6f1e3",ink:"#111",lights:"#f5d76e"},theme:{bg:"#050505",fg:"#f6f1e3",accent:"#d4af37","accent-fg":"#050505"}}},css:`
2
+ & .sm-wrap{position:absolute;inset:0;display:flex;align-items:flex-start;justify-content:center;padding-top:clamp(16px,5cqh,56px)}
3
+ & .sm{--u:clamp(54px,8.4cqw,112px);position:relative;background:linear-gradient(180deg,color-mix(in srgb,var(--body) 80%,#fff),var(--body) 30%,color-mix(in srgb,var(--body) 70%,#000));
4
+ border-radius:calc(var(--u)*.35) calc(var(--u)*.35) calc(var(--u)*.18) calc(var(--u)*.18);padding:calc(var(--u)*.5) calc(var(--u)*.42) calc(var(--u)*.42);
5
+ box-shadow:0 30px 60px -20px rgba(0,0,0,.6),inset 0 2px 0 rgba(255,255,255,.35),inset 0 -6px 0 rgba(0,0,0,.25);border:4px solid var(--trim)}
6
+ & .sm-top{position:absolute;left:50%;top:calc(var(--u)*-.62);transform:translateX(-50%);background:var(--trim);color:var(--body);font:900 calc(var(--u)*.28)/1 var(--lp-font);
7
+ letter-spacing:.18em;padding:calc(var(--u)*.14) calc(var(--u)*.4);border-radius:999px;white-space:nowrap;box-shadow:0 6px 0 rgba(0,0,0,.25)}
8
+ & .sm-bulbs{position:absolute;inset:calc(var(--u)*.14);border-radius:inherit;pointer-events:none}
9
+ & .sm-bulbs i{position:absolute;width:calc(var(--u)*.09);height:calc(var(--u)*.09);border-radius:50%;background:var(--lights);box-shadow:0 0 10px var(--lights);opacity:.35}
10
+ & .sm-bulbs i.on{opacity:1}
11
+ & .sm-win{display:flex;gap:calc(var(--u)*.12);background:#0b0b0b;padding:calc(var(--u)*.12);border-radius:calc(var(--u)*.14);box-shadow:inset 0 4px 12px rgba(0,0,0,.8)}
12
+ & .sm-reel{width:var(--u);height:calc(var(--u)*1.25);overflow:hidden;background:var(--reel);border-radius:calc(var(--u)*.08);position:relative;
13
+ box-shadow:inset 0 calc(var(--u)*.28) calc(var(--u)*.2) -calc(var(--u)*.1) rgba(0,0,0,.4)}
14
+ & .sm-reel::after{content:"";position:absolute;inset:0;background:linear-gradient(180deg,rgba(0,0,0,.45),transparent 28%,transparent 72%,rgba(0,0,0,.45));pointer-events:none}
15
+ & .sm-strip{position:absolute;left:0;right:0;top:0;will-change:transform}
16
+ & .sm-strip div{height:calc(var(--u)*1.25);display:flex;align-items:center;justify-content:center;font:900 calc(var(--u)*.7)/1 var(--lp-font);color:var(--ink)}
17
+ & .sm-strip div.small{font-size:calc(var(--u)*.38);letter-spacing:.04em}
18
+ & .sm-pay{margin-top:calc(var(--u)*.22);display:flex;justify-content:space-between;align-items:center;color:var(--trim);font:700 calc(var(--u)*.16)/1 var(--lp-font-mono);letter-spacing:.12em}
19
+ & .sm-lever{position:absolute;right:calc(var(--u)*-.62);top:calc(var(--u)*.2);width:calc(var(--u)*.5);height:calc(var(--u)*2.2);cursor:pointer;pointer-events:auto}
20
+ & .sm-lever .arm{position:absolute;left:50%;bottom:calc(var(--u)*.3);width:calc(var(--u)*.12);height:calc(var(--u)*1.7);margin-left:calc(var(--u)*-.06);
21
+ background:linear-gradient(90deg,#9a9a9a,#f2f2f2,#8a8a8a);border-radius:999px;transform-origin:50% 100%;transition:transform .35s cubic-bezier(.3,1.6,.5,1)}
22
+ & .sm-lever .ball{position:absolute;left:50%;top:calc(var(--u)*-.28);width:calc(var(--u)*.42);height:calc(var(--u)*.42);margin-left:calc(var(--u)*-.21);border-radius:50%;
23
+ background:radial-gradient(circle at 35% 30%,#fff,var(--body) 40%,color-mix(in srgb,var(--body) 60%,#000))}
24
+ & .sm-lever .base{position:absolute;left:0;right:0;bottom:0;height:calc(var(--u)*.45);border-radius:calc(var(--u)*.12);background:linear-gradient(180deg,var(--trim),color-mix(in srgb,var(--trim) 60%,#000))}
25
+ & .sm-lever.pulled .arm{transform:scaleY(-.55)}
26
+ & .sm-stage-glow{position:absolute;inset:0;background:radial-gradient(ellipse at 50% 30%,color-mix(in srgb,var(--lights) 22%,transparent),transparent 60%)}
27
+ @media (prefers-reduced-motion:reduce){& .sm-lever .arm{transition:none}}
28
+ `,setup(ctx){let p=ctx.params,code=[...ctx.copy.code||"404"].slice(0,5),syms=p.symbols,wrap=document.createElement("div");wrap.className="sm-wrap";for(let[k,v]of Object.entries({"--body":p.body,"--trim":p.trim,"--reel":p.reel,"--ink":p.ink,"--lights":p.lights}))wrap.style.setProperty(k,v);let REPEAT=4,stripHtml=target=>{let items=[];for(let r=0;r<REPEAT;r++)for(let s of syms)items.push(s);return items.push(target),items.map(s=>`<div class="${s.length>2?"small":""}">${esc(s)}</div>`).join("")};wrap.innerHTML=`<div class="sm-stage-glow"></div><div class="sm" aria-hidden="true">
29
+ <div class="sm-top">ERROR \xB7 ${esc(ctx.copy.code)}</div><div class="sm-bulbs"></div>
30
+ <div class="sm-win">${code.map(ch=>`<div class="sm-reel"><div class="sm-strip">${stripHtml(ch)}</div></div>`).join("")}</div>
31
+ <div class="sm-pay"><span>CREDITS 0</span><span class="spins">SPINS 0</span></div>
32
+ <button class="sm-lever" type="button" aria-label="Pull the lever"><div class="base"></div><div class="arm"><div class="ball"></div></div></button>
33
+ </div>`,ctx.stage.append(wrap),ctx.stage.removeAttribute("aria-hidden"),wrap.querySelector(".sm").removeAttribute("aria-hidden");let bulbs=wrap.querySelector(".sm-bulbs"),NB=22;for(let i=0;i<NB;i++){let b=document.createElement("i"),per=i/NB*4,side=Math.floor(per),f=per-side,pos=side===0?[f,0]:side===1?[1,f]:side===2?[1-f,1]:[0,1-f];b.style.left=`calc(${pos[0]*100}% - 4px)`,b.style.top=`calc(${pos[1]*100}% - 4px)`,bulbs.append(b)}let strips=[...wrap.querySelectorAll(".sm-strip")],lever=wrap.querySelector(".sm-lever"),spinsEl=wrap.querySelector(".spins"),spins=0,spinStart=-10,spinning=!1,total=REPEAT*syms.length,spin=()=>{spinning||(spinning=!0,spins++,spinsEl.textContent=`SPINS ${spins}`,spinStart=performance.now()/1e3,lever.classList.add("pulled"),setTimeout(()=>lever.classList.remove("pulled"),380),ctx.invalidate())};lever.addEventListener("click",spin),ctx.onWindow("keydown",e=>{e.code==="Space"&&ctx.visible()&&!(document.activeElement instanceof HTMLInputElement)&&(e.preventDefault(),spin())}),ctx.reducedMotion||setTimeout(spin,500);let itemH=()=>strips[0].firstElementChild.getBoundingClientRect().height,settle=()=>strips.forEach(s=>s.style.transform=`translateY(${-total*itemH()}px)`);return settle(),{frame(t){let now=performance.now()/1e3,h=itemH(),el=now-spinStart,busy=!1;strips.forEach((s,i)=>{let dur=1.6+i*.5,k=Math.min(1,el/dur);k<1&&(busy=!0);let e=k<1?1-Math.pow(1-k,3)+Math.sin(k*Math.PI)*.02:1,y=spinning||k<1?-total*h*e:-total*h;s.style.transform=`translateY(${y}px)`,s.style.filter=k<.85&&spinning?`blur(${(1-k)*2.5}px)`:"none"}),spinning&&!busy&&(spinning=!1);let lit=Math.floor(t*(busy?14:3));bulbs.querySelectorAll("i").forEach((b,i)=>b.classList.toggle("on",busy?(i+lit)%3===0:(i+lit)%2===0))},resize:settle,destroy(){wrap.remove()}}}};export{slot_machine_default as default};
@@ -0,0 +1,13 @@
1
+ interface Params {
2
+ bg: string;
3
+ grid: string;
4
+ wall: string;
5
+ snake: string;
6
+ head: string;
7
+ food: string;
8
+ text: string;
9
+ /** Moves per second. */
10
+ speed: number;
11
+ }
12
+ declare const _default: import("..").SceneDef<Params>;
13
+ export default _default;
@@ -0,0 +1 @@
1
+ import{GAME_CSS,codeBitmap,hud,input,loadHigh,saveHigh}from"../chunks/chunk-MNUNTC4L.js";import{canvas2d}from"../chunks/chunk-DAZOIOF7.js";import{rgba}from"../chunks/chunk-FVGCB66F.js";import"../chunks/chunk-3ISI6SOJ.js";import"../chunks/chunk-KIYSQVWX.js";import"../chunks/chunk-7XMDQMDO.js";var snake_default={id:"snake",name:"Snake",description:"A snake winds around a maze shaped like the 404. It hunts by itself until you grab the arrow keys or swipe.",category:"Games",kind:"2d",motion:"game",tags:["canvas","game","playable","snake","retro","keyboard","touch"],layout:"bottom",codeInScene:!0,copy:{eyebrow:"Arrow keys or swipe",title:"The page got eaten.",message:"Our snake swallowed it whole. Take control and try to get it back, or slither home.",actions:[{label:"Slither home",href:"/",variant:"primary"}]},params:{bg:"#06110b",grid:"#0b1f14",wall:"#1b3a28",snake:"#3dff8a",head:"#d9ffe9",food:"#ff4d6d",text:"#c9ffd9",speed:13},theme:{bg:"#06110b",fg:"#c9ffd9",accent:"#3dff8a","accent-fg":"#06110b","font-display":"var(--lp-font-mono)","title-weight":"700"},presetName:"Neon Green",presets:{neon:{name:"Synthwave",params:{bg:"#0c0018",grid:"#140026",wall:"#3a0f5a",snake:"#ff3bd4",head:"#ffe6fb",food:"#3bffe6",text:"#ffd6f7"},theme:{bg:"#0c0018",fg:"#ffe6fb",accent:"#ff3bd4","accent-fg":"#fff"}},desert:{name:"Desert",params:{bg:"#f2d9a8",grid:"#ead0a0",wall:"#c99a5a",snake:"#5a3a12",head:"#2a1a05",food:"#d6281a",text:"#3a2410"},theme:{bg:"#f2d9a8",fg:"#2a1a05",accent:"#2a1a05","accent-fg":"#f2d9a8"}},mono:{name:"Monochrome",params:{bg:"#0a0a0a",grid:"#111111",wall:"#2a2a2a",snake:"#f2f2f2",head:"#ffffff",food:"#f2f2f2",text:"#f2f2f2"},theme:{bg:"#0a0a0a",fg:"#f2f2f2",accent:"#f2f2f2","accent-fg":"#000"}},nokia:{name:"Brick Phone",params:{bg:"#c7d3a2",grid:"#bccb93",wall:"#5c6b3b",snake:"#2f3a1c",head:"#1a210f",food:"#2f3a1c",text:"#2f3a1c",speed:10},theme:{bg:"#c7d3a2",fg:"#2f3a1c",accent:"#2f3a1c","accent-fg":"#c7d3a2"}},candy:{name:"Candy",params:{bg:"#fff3f8",grid:"#ffe6f0",wall:"#ffc2da",snake:"#ff4fa3",head:"#c2185b",food:"#3bb9ff",text:"#7a1442"},theme:{bg:"#fff3f8",fg:"#4a0d29",accent:"#ff4fa3","accent-fg":"#fff"}},ocean:{name:"Deep Blue",params:{bg:"#03101f",grid:"#06192e",wall:"#0d2c4a",snake:"#3bd6ff",head:"#e6faff",food:"#ffcc3b",text:"#bfeeff"},theme:{bg:"#03101f",fg:"#d6f4ff",accent:"#3bd6ff","accent-fg":"#03101f"}}},css:GAME_CSS,setup(ctx){let p=ctx.params,c=canvas2d(ctx),inp=input(ctx,{pointerPlays:!1}),rnd=ctx.random,code=ctx.copy.code||"404",cols=0,rows=0,cell=0,ox=0,oy=0,walls=[],body=[],dir=[1,0],nextDir=[1,0],food=[0,0],acc=0,score=0,high=loadHigh("snake"),dead=0,wasPlaying=!1,key=(x,y)=>y*cols+x;function layout(){let areaH=c.h*.6;cell=Math.max(14,Math.min(26,Math.floor(Math.min(c.w/46,areaH/22)))),cols=Math.floor((c.w-32)/cell),rows=Math.floor(areaH/cell),ox=Math.floor((c.w-cols*cell)/2),oy=Math.max(14,Math.floor(c.h*.05));let bw=Math.round(cols*.7),bh=Math.round(rows*.62),bm=codeBitmap(code,bw,bh,900);walls=new Array(cols*rows).fill(!1);let bx=Math.floor((cols-bw)/2),by=Math.floor((rows-bh)/2)+1;for(let y=0;y<bh;y++)for(let x=0;x<bw;x++)bm[y*bw+x]&&(walls[key(bx+x,by+y)]=!0);reset()}function free(x,y){return x>=0&&y>=0&&x<cols&&y<rows&&!walls[key(x,y)]}function reset(){let sx=2,sy=1;for(;!free(sx,sy)||!free(sx-1,sy)||!free(sx-2,sy);)sy++;body=[[sx,sy],[sx-1,sy],[sx-2,sy]],dir=[1,0],nextDir=[1,0],score=0,placeFood()}function placeFood(){for(let i=0;i<500;i++){let x=Math.floor(rnd()*cols),y=Math.floor(rnd()*rows);if(free(x,y)&&!body.some(([bx,by])=>bx===x&&by===y)){food=[x,y];return}}}function aiDir(){let[hx,hy]=body[0],blocked=new Set(body.slice(0,-1).map(([x,y])=>key(x,y))),prev=new Int32Array(cols*rows).fill(-1),start=key(hx,hy);prev[start]=start;let q=[start],goal=key(food[0],food[1]),dirs=[[1,0],[-1,0],[0,1],[0,-1]];for(;q.length;){let k=q.shift();if(k===goal)break;let x=k%cols,y=k/cols|0;for(let[dx,dy]of dirs){let nx=x+dx,ny=y+dy;if(!free(nx,ny))continue;let nk=key(nx,ny);prev[nk]!==-1||blocked.has(nk)||(prev[nk]=k,q.push(nk))}}if(prev[goal]!==-1){let k=goal;for(;prev[k]!==start;)k=prev[k];return[k%cols-hx,(k/cols|0)-hy]}for(let d of dirs)if(free(hx+d[0],hy+d[1])&&!blocked.has(key(hx+d[0],hy+d[1])))return d;return dir}function step(){if(inp.playing){let want=inp.swipe?{left:[-1,0],right:[1,0],up:[0,-1],down:[0,1]}[inp.swipe]:inp.left?[-1,0]:inp.right?[1,0]:inp.up?[0,-1]:inp.down?[0,1]:null;inp.swipe=null,want&&!(want[0]===-dir[0]&&want[1]===-dir[1])&&(nextDir=want)}else nextDir=aiDir();dir=nextDir;let[hx,hy]=body[0],nx=hx+dir[0],ny=hy+dir[1];if(!free(nx,ny)||body.some(([bx,by],i)=>i<body.length-1&&bx===nx&&by===ny)){score>high&&saveHigh("snake",high=score),dead=1.2;return}body.unshift([nx,ny]),nx===food[0]&&ny===food[1]?(score+=10,placeFood()):body.pop()}return layout(),{resize(){c.reset(),layout()},frame(t,dt){let g=c.g;if(c.reset(),inp.playing&&!wasPlaying&&(wasPlaying=!0,reset()),dead>0)dead-=dt,dead<=0&&reset();else if(dt>0&&(!ctx.reducedMotion||inp.playing)){acc+=dt;let interval=1/(p.speed*(inp.playing?.85:1.4));for(;acc>interval&&(acc-=interval,step(),!(dead>0)););}g.fillStyle=p.bg,g.fillRect(0,0,c.w,c.h),g.fillStyle=p.grid;for(let y=0;y<rows;y++)for(let x=0;x<cols;x++)(x+y)%2===0&&g.fillRect(ox+x*cell,oy+y*cell,cell,cell);g.fillStyle=p.wall;for(let i=0;i<walls.length;i++)walls[i]&&g.fillRect(ox+i%cols*cell+1,oy+(i/cols|0)*cell+1,cell-2,cell-2);let pulse=.75+.25*Math.sin(t*6);g.fillStyle=p.food,g.shadowColor=p.food,g.shadowBlur=14,g.beginPath(),g.arc(ox+food[0]*cell+cell/2,oy+food[1]*cell+cell/2,cell/2.6*pulse,0,Math.PI*2),g.fill(),g.shadowBlur=0,body.forEach(([x,y],i)=>{let k=i/body.length;g.fillStyle=i===0?p.head:rgba(p.snake,1-k*.55);let inset=i===0?1:2+k*2;g.fillRect(ox+x*cell+inset,oy+y*cell+inset,cell-inset*2,cell-inset*2)}),dead>0&&Math.floor(t*8)%2&&(g.fillStyle=rgba(p.food,.25),g.fillRect(ox,oy,cols*cell,rows*cell));let fs=Math.max(10,Math.min(14,c.w/90));hud(g,`SCORE ${score}`,ox,oy+rows*cell+8,fs,p.text),hud(g,`HI ${high}`,ox+cols*cell,oy+rows*cell+8,fs,p.text,"right"),!inp.playing&&Math.floor(t*1.6)%2===0&&hud(g,"DEMO \xB7 PRESS AN ARROW KEY",c.w/2,oy+rows*cell+8,fs,rgba(p.text,.75),"center")}}}};export{snake_default as default};
@@ -0,0 +1,10 @@
1
+ interface Params {
2
+ bg: string;
3
+ bg2: string;
4
+ water: string;
5
+ base: string;
6
+ flakes: string;
7
+ house: string;
8
+ }
9
+ declare const _default: import("..").SceneDef<Params>;
10
+ export default _default;
@@ -0,0 +1,2 @@
1
+ import{canvas2d}from"../chunks/chunk-DAZOIOF7.js";import{rgba}from"../chunks/chunk-FVGCB66F.js";import"../chunks/chunk-KIYSQVWX.js";import"../chunks/chunk-7XMDQMDO.js";var snow_globe_default={id:"snow-globe",name:"Snow Globe",description:"A tiny town inside a snow globe, with a little signpost pointing to 404. Click or drag to shake it and watch the snow settle.",category:"Playful",kind:"2d",motion:"interactive",tags:["canvas","snow","winter","christmas","cozy","interactive","toy"],layout:"right",copy:{eyebrow:"Shake it",title:"Snowed under.",message:"This page is somewhere under all that snow. Shake the globe all you like. It isn't in there.",actions:[{label:"Back to the warm homepage",href:"/",variant:"primary"}]},params:{bg:"#2a1f3d",bg2:"#0f0b18",water:"#bfe3ff",base:"#6b3a1e",flakes:"#ffffff",house:"#d64545"},theme:{bg:"#1b142a",fg:"#f6f0ff",accent:"#f6f0ff","accent-fg":"#1b142a"},presetName:"Winter Night",presets:{rose:{name:"Rose",params:{bg:"#ffe6ec",bg2:"#ffc2d1",water:"#fff0f4",base:"#c2185b",house:"#7a1f4a"},theme:{bg:"#ffe6ec",fg:"#3a0a1a",accent:"#3a0a1a","accent-fg":"#fff"}},ocean:{name:"Seaside",params:{bg:"#06243a",bg2:"#010a14",water:"#bfe7ff",base:"#14466b",house:"#ffd23f"},theme:{bg:"#06243a",fg:"#e6f6ff",accent:"#e6f6ff","accent-fg":"#06243a"}},mint:{name:"Mint",params:{bg:"#e6f5ef",bg2:"#c7e6da",water:"#d9fff2",base:"#2f6b57",house:"#e86a5a"},theme:{bg:"#e6f5ef",fg:"#123327",accent:"#123327","accent-fg":"#fff"}},gold:{name:"Gilded",params:{bg:"#1a1206",bg2:"#050300",water:"#fff1c9",base:"#a8822e",flakes:"#ffd77a",house:"#1d3b2a"},theme:{bg:"#120c04",fg:"#fff3d6",accent:"#ffd77a","accent-fg":"#120c04"}}},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(ctx){let p=ctx.params,c=canvas2d(ctx),rnd=ctx.random,fl=Array.from({length:420},()=>({x:rnd()*2-1,y:rnd()*2-1,vx:0,vy:0,s:.4+rnd()})),shake={x:0,y:0,v:0},last=null,auto=2,stir=power=>{for(let f of fl)f.vx+=(rnd()-.5)*power,f.vy-=rnd()*power*1.2;shake.v=power*.6};return ctx.on("pointerdown",()=>stir(3)),ctx.on("pointermove",e=>{if(!e.buttons)return last=null;if(last){let d=Math.hypot(ctx.pointer.x-last.x,ctx.pointer.y-last.y);d>4&&stir(Math.min(4,d*.05))}last={x:ctx.pointer.x,y:ctx.pointer.y}}),{resize(){c.reset()},frame(t,dt){let g=c.g;c.reset();let narrow=c.w<760,R=narrow?Math.min(c.w*.36,c.h*.26):Math.min(c.h*.32,c.w*.22),cx0=narrow?c.w/2:c.w*.32,cy0=narrow?c.h*.3:c.h*.44;!ctx.pointer.engaged&&!ctx.reducedMotion&&t>auto&&(auto=t+9,stir(3)),shake.v*=Math.exp(-4*dt);let sx=Math.sin(t*40)*shake.v*8,cx=cx0+sx,cy=cy0,bg=g.createRadialGradient(cx,cy,R*.3,cx,cy,Math.max(c.w,c.h)*.8);bg.addColorStop(0,p.bg),bg.addColorStop(1,p.bg2),g.fillStyle=bg,g.fillRect(0,0,c.w,c.h),g.fillStyle="rgba(0,0,0,.35)",g.beginPath(),g.ellipse(cx,cy+R*1.18,R*.95,R*.12,0,0,Math.PI*2),g.fill();let bgrad=g.createLinearGradient(cx-R,0,cx+R,0);bgrad.addColorStop(0,p.base),bgrad.addColorStop(.5,rgba("#ffffff",.25)),bgrad.addColorStop(1,p.base),g.fillStyle=p.base,g.beginPath(),g.moveTo(cx-R*.78,cy+R*.72),g.lineTo(cx+R*.78,cy+R*.72),g.lineTo(cx+R*.92,cy+R*1.15),g.lineTo(cx-R*.92,cy+R*1.15),g.closePath(),g.fill(),g.fillStyle=bgrad,g.globalAlpha=.35,g.fill(),g.globalAlpha=1,g.fillStyle="rgba(255,255,255,.85)",g.font=`700 ${R*.1}px Georgia,serif`,g.textAlign="center",g.fillText(`~ ${ctx.copy.code} ~`,cx,cy+R*1),g.save(),g.beginPath(),g.arc(cx,cy,R,0,Math.PI*2),g.clip();let wg=g.createLinearGradient(0,cy-R,0,cy+R);wg.addColorStop(0,rgba(p.water,.25)),wg.addColorStop(1,rgba(p.water,.55)),g.fillStyle=wg,g.fillRect(cx-R,cy-R,R*2,R*2),g.fillStyle="#f7fbff",g.beginPath(),g.ellipse(cx,cy+R*.72,R*.95,R*.32,0,Math.PI,0),g.fill();for(let[tx,s]of[[-.5,.9],[-.32,.65],[.55,.8]]){let bx=cx+tx*R,by=cy+R*.58;g.fillStyle="#1f5a3a";for(let k=0;k<3;k++)g.beginPath(),g.moveTo(bx,by-R*(.28+k*.1)*s-R*.1),g.lineTo(bx-R*(.14-k*.03)*s,by-R*k*.1*s),g.lineTo(bx+R*(.14-k*.03)*s,by-R*k*.1*s),g.fill();g.fillStyle="#fff",g.beginPath(),g.moveTo(bx,by-R*.48*s),g.lineTo(bx-R*.04*s,by-R*.4*s),g.lineTo(bx+R*.04*s,by-R*.4*s),g.fill()}let hx=cx-R*.02,hy=cy+R*.48;g.fillStyle=p.house,g.fillRect(hx-R*.16,hy-R*.2,R*.32,R*.2),g.fillStyle="#fff",g.beginPath(),g.moveTo(hx-R*.2,hy-R*.2),g.lineTo(hx,hy-R*.36),g.lineTo(hx+R*.2,hy-R*.2),g.fill(),g.fillStyle="#ffd77a",g.fillRect(hx-R*.1,hy-R*.14,R*.06,R*.06),g.fillRect(hx+R*.04,hy-R*.14,R*.06,R*.06),g.fillStyle="#6b3a1e",g.fillRect(cx+R*.28,cy+R*.3,R*.025,R*.3),g.fillStyle="#c98a4a",g.beginPath(),g.moveTo(cx+R*.22,cy+R*.28),g.lineTo(cx+R*.46,cy+R*.28),g.lineTo(cx+R*.5,cy+R*.33),g.lineTo(cx+R*.46,cy+R*.38),g.lineTo(cx+R*.22,cy+R*.38),g.fill(),g.fillStyle="#2a1406",g.font=`700 ${R*.07}px Inter,Arial,sans-serif`,g.fillText(ctx.copy.code,cx+R*.35,cy+R*.355);for(let f of fl){if(dt>0){if(f.vy+=.25*dt,f.vx*=Math.exp(-1.5*dt),f.vy*=Math.exp(-1.5*dt),f.vy=Math.min(f.vy,.12*f.s),f.x+=(f.vx+Math.sin(t+f.s*9)*.02)*dt,f.y+=f.vy*dt,f.x*f.x+f.y*f.y>.92){let d=Math.hypot(f.x,f.y);f.x*=.95/d,f.y*=.95/d,f.vx*=-.3,f.vy*=-.3}f.y>.62-Math.abs(f.x)*.1&&(f.y=.62-Math.abs(f.x)*.1,f.vy=0,f.vx=0)}g.fillStyle=rgba(p.flakes,.9),g.beginPath(),g.arc(cx+f.x*R,cy+f.y*R,1.2+f.s*1.4,0,Math.PI*2),g.fill()}g.restore(),g.strokeStyle="rgba(255,255,255,.35)",g.lineWidth=2,g.beginPath(),g.arc(cx,cy,R,0,Math.PI*2),g.stroke();let hl=g.createRadialGradient(cx-R*.45,cy-R*.45,0,cx-R*.45,cy-R*.45,R*.6);hl.addColorStop(0,"rgba(255,255,255,.5)"),hl.addColorStop(1,"rgba(255,255,255,0)"),g.fillStyle=hl,g.beginPath(),g.arc(cx,cy,R,0,Math.PI*2),g.fill(),g.strokeStyle="rgba(255,255,255,.55)",g.lineWidth=R*.03,g.lineCap="round",g.beginPath(),g.arc(cx,cy,R*.86,Math.PI*1.08,Math.PI*1.32),g.stroke()}}}};export{snow_globe_default as default};
@@ -0,0 +1,9 @@
1
+ interface Params {
2
+ colors: string[];
3
+ /** Blob drift speed. */
4
+ speed: number;
5
+ /** Frosted card behind the text. */
6
+ card: boolean;
7
+ }
8
+ declare const _default: import("..").SceneDef<Params>;
9
+ export default _default;