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.
- package/LICENSE +21 -0
- package/README.md +390 -2
- package/dist/catalog.d.ts +2 -0
- package/dist/catalog.js +1 -0
- package/dist/catalog.json +11438 -0
- package/dist/cdn/c/ascii-3d-LO5K5SPJ.js +3 -0
- package/dist/cdn/c/astronaut-LH5N45GT.js +2 -0
- package/dist/cdn/c/aurora-XF7DCQ7M.js +129 -0
- package/dist/cdn/c/autumn-V5GRVYCX.js +1 -0
- package/dist/cdn/c/balloon-404-KV6ISJWV.js +1 -0
- package/dist/cdn/c/beach-OGS53KAQ.js +95 -0
- package/dist/cdn/c/black-hole-635WWF67.js +124 -0
- package/dist/cdn/c/block-drop-QU7NYBNQ.js +1 -0
- package/dist/cdn/c/blue-screen-GKLGT7XD.js +70 -0
- package/dist/cdn/c/breakout-EGDE3QDC.js +1 -0
- package/dist/cdn/c/bricks-C6XPPQ64.js +1 -0
- package/dist/cdn/c/broken-link-U47D6LR2.js +11 -0
- package/dist/cdn/c/brutalist-QFXIHFAD.js +15 -0
- package/dist/cdn/c/bubble-wrap-45ZWIQMW.js +1 -0
- package/dist/cdn/c/campfire-TFG4DUUS.js +88 -0
- package/dist/cdn/c/card-GH5VVMRG.js +15 -0
- package/dist/cdn/c/cassette-33OUQ4CF.js +15 -0
- package/dist/cdn/c/chalkboard-NAPUHNER.js +3 -0
- package/dist/cdn/c/chrome-404-QVPFIQEF.js +1 -0
- package/dist/cdn/c/chunk-4ZBXB36L.js +1 -0
- package/dist/cdn/c/chunk-A44JMJWI.js +1 -0
- package/dist/cdn/c/chunk-HXSSPN2I.js +1 -0
- package/dist/cdn/c/chunk-IETNWEVK.js +1 -0
- package/dist/cdn/c/chunk-JLRXT2AZ.js +4 -0
- package/dist/cdn/c/chunk-LMRCHEWX.js +1 -0
- package/dist/cdn/c/chunk-NUQBEDA4.js +296 -0
- package/dist/cdn/c/chunk-QHXVYCR6.js +1 -0
- package/dist/cdn/c/chunk-QJZBGT2Q.js +75 -0
- package/dist/cdn/c/chunk-URWX3LLV.js +1 -0
- package/dist/cdn/c/chunk-YNREKTFR.js +70 -0
- package/dist/cdn/c/circuit-board-V6VT4OTX.js +1 -0
- package/dist/cdn/c/claw-machine-LLCPLZ6W.js +1 -0
- package/dist/cdn/c/clay-404-SMDVAQCV.js +1 -0
- package/dist/cdn/c/constellation-J5QMY7IB.js +1 -0
- package/dist/cdn/c/countdown-2TEFVO73.js +14 -0
- package/dist/cdn/c/cross-stitch-N5H5GLAG.js +2 -0
- package/dist/cdn/c/deep-sea-ILDVMW5M.js +85 -0
- package/dist/cdn/c/divider-PMT4UZEF.js +9 -0
- package/dist/cdn/c/dna-CAAKBMRK.js +2 -0
- package/dist/cdn/c/dominoes-VLA5MBXM.js +1 -0
- package/dist/cdn/c/dot-grid-O7LJO44U.js +11 -0
- package/dist/cdn/c/editorial-4C5Z33WO.js +11 -0
- package/dist/cdn/c/elevator-EFNB6FVO.js +36 -0
- package/dist/cdn/c/emoji-EHAJDQSM.js +8 -0
- package/dist/cdn/c/error-cascade-CIJCQLP3.js +18 -0
- package/dist/cdn/c/evidence-board-Z7DXMGNE.js +18 -0
- package/dist/cdn/c/eyes-VPOHW2CX.js +2 -0
- package/dist/cdn/c/fireworks-QLWJ3S43.js +1 -0
- package/dist/cdn/c/flashlight-QXI7QT74.js +57 -0
- package/dist/cdn/c/flatline-3GBK7IVS.js +1 -0
- package/dist/cdn/c/flock-RLSZ7EZQ.js +1 -0
- package/dist/cdn/c/foggy-glass-A56REA7E.js +1 -0
- package/dist/cdn/c/gears-4HJO7H74.js +5 -0
- package/dist/cdn/c/glass-404-WZRMDFTP.js +1 -0
- package/dist/cdn/c/glitch-Y4CIADF3.js +60 -0
- package/dist/cdn/c/gradient-404-YNSTOPNA.js +6 -0
- package/dist/cdn/c/halftone-XZ7F75B4.js +43 -0
- package/dist/cdn/c/hanging-letters-Y3VH7EVP.js +1 -0
- package/dist/cdn/c/hanging-sign-2KUXPLZE.js +1 -0
- package/dist/cdn/c/helpful-links-UFGTWTRQ.js +18 -0
- package/dist/cdn/c/hyperspace-R34QNI7J.js +57 -0
- package/dist/cdn/c/hypnosis-MK6AV3SC.js +26 -0
- package/dist/cdn/c/ink-S332BOPS.js +43 -0
- package/dist/cdn/c/invaders-ZSY3Z443.js +1 -0
- package/dist/cdn/c/kaleidoscope-BLGSIK4F.js +34 -0
- package/dist/cdn/c/lava-lamp-VYY5XFG5.js +55 -0
- package/dist/cdn/c/life-QBWZL5FY.js +1 -0
- package/dist/cdn/c/lighthouse-QX7QIIPX.js +60 -0
- package/dist/cdn/c/loading-LIS67QF7.js +34 -0
- package/dist/cdn/c/lost-at-sea-QNURIHBY.js +258 -0
- package/dist/cdn/c/magic-8-ball-W3TRJALZ.js +2 -0
- package/dist/cdn/c/matrix-rain-4V4SVGGG.js +3 -0
- package/dist/cdn/c/maze-QL5TRCE5.js +1 -0
- package/dist/cdn/c/mesh-gradient-UISGI62K.js +34 -0
- package/dist/cdn/c/metro-map-H64EHOZM.js +30 -0
- package/dist/cdn/c/milk-carton-3SDLA5AY.js +53 -0
- package/dist/cdn/c/minimal-SB6FU3DE.js +9 -0
- package/dist/cdn/c/mirage-IQ3IA3VB.js +70 -0
- package/dist/cdn/c/moon-landing-TKZE4Q6G.js +1 -0
- package/dist/cdn/c/neon-sign-XGMN75MH.js +1 -0
- package/dist/cdn/c/newspaper-YECAUY77.js +49 -0
- package/dist/cdn/c/nixie-CQBRCVDE.js +1 -0
- package/dist/cdn/c/no-signal-HL4A4CFZ.js +82 -0
- package/dist/cdn/c/one-bit-AFIZQPHK.js +49 -0
- package/dist/cdn/c/outline-404-REB5E5EN.js +9 -0
- package/dist/cdn/c/paint-splash-GZGPOURW.js +1 -0
- package/dist/cdn/c/paper-plane-KDCSE3RM.js +2 -0
- package/dist/cdn/c/particles-7UMRMT2M.js +1 -0
- package/dist/cdn/c/path-not-found-VUEXOVO7.js +14 -0
- package/dist/cdn/c/planet-H6QGPDVC.js +157 -0
- package/dist/cdn/c/pond-6DL43VUQ.js +106 -0
- package/dist/cdn/c/pong-B2ZGAY7T.js +1 -0
- package/dist/cdn/c/radar-22JCPGQZ.js +4 -0
- package/dist/cdn/c/rainy-window-DTGLJVAR.js +114 -0
- package/dist/cdn/c/receipt-ZOYUSMN3.js +32 -0
- package/dist/cdn/c/road-closed-3OS55UBX.js +1 -0
- package/dist/cdn/c/rpg-dialog-FV53YYNJ.js +14 -0
- package/dist/cdn/c/runner-NANXJTQG.js +1 -0
- package/dist/cdn/c/scratch-card-GC6U4ZZN.js +1 -0
- package/dist/cdn/c/screensaver-UXKJVQUU.js +1 -0
- package/dist/cdn/c/search-404-HFKZ4DUA.js +17 -0
- package/dist/cdn/c/server-default-RBMMRAHS.js +10 -0
- package/dist/cdn/c/server-room-QSKAUFUY.js +1 -0
- package/dist/cdn/c/skyline-OMZMF5R6.js +1 -0
- package/dist/cdn/c/skywriting-RYNQWJ6I.js +1 -0
- package/dist/cdn/c/slot-machine-XXCVI2HK.js +33 -0
- package/dist/cdn/c/snake-6Z5V3QA3.js +1 -0
- package/dist/cdn/c/snow-globe-RLDPNA2J.js +2 -0
- package/dist/cdn/c/soft-blobs-FYEFGINV.js +15 -0
- package/dist/cdn/c/solar-system-CQAP6WFU.js +2 -0
- package/dist/cdn/c/split-flap-O7JGD5Q4.js +37 -0
- package/dist/cdn/c/split-panel-QGXZ24E4.js +12 -0
- package/dist/cdn/c/stage-GBZR3JQS.js +2 -0
- package/dist/cdn/c/swiss-poster-OON4HBUG.js +20 -0
- package/dist/cdn/c/terminal-7BTUDZDB.js +41 -0
- package/dist/cdn/c/thunderstorm-FRCKHKXY.js +1 -0
- package/dist/cdn/c/topographic-3RIQXKIQ.js +38 -0
- package/dist/cdn/c/torn-page-6UT5ZQHG.js +16 -0
- package/dist/cdn/c/treasure-map-FALAEBL5.js +3 -0
- package/dist/cdn/c/typewriter-7TIO42MH.js +23 -0
- package/dist/cdn/c/ufo-6UW34TI3.js +1 -0
- package/dist/cdn/c/unplugged-QXKDDH4S.js +1 -0
- package/dist/cdn/c/vending-machine-SH3MNFMY.js +27 -0
- package/dist/cdn/c/vinyl-3FUP3LSO.js +2 -0
- package/dist/cdn/c/voxel-404-LMC43X4B.js +102 -0
- package/dist/cdn/c/wormhole-I2RWIMRW.js +113 -0
- package/dist/cdn/c/zen-garden-HMAMASJK.js +1 -0
- package/dist/cdn/element.js +1 -0
- package/dist/cdn/index.js +1 -0
- package/dist/chunks/chunk-3ISI6SOJ.js +1 -0
- package/dist/chunks/chunk-6HZC24J2.js +296 -0
- package/dist/chunks/chunk-7XMDQMDO.js +1 -0
- package/dist/chunks/chunk-B2NBRLO2.js +1 -0
- package/dist/chunks/chunk-B4TY5M55.js +1 -0
- package/dist/chunks/chunk-DAZOIOF7.js +1 -0
- package/dist/chunks/chunk-ES56TX4X.js +1 -0
- package/dist/chunks/chunk-FVGCB66F.js +1 -0
- package/dist/chunks/chunk-KIYSQVWX.js +1 -0
- package/dist/chunks/chunk-MNUNTC4L.js +4 -0
- package/dist/chunks/chunk-SH72TE6I.js +75 -0
- package/dist/chunks/chunk-URB3NNOB.js +70 -0
- package/dist/cli.js +97 -0
- package/dist/core/canvas2d.d.ts +18 -0
- package/dist/core/define.d.ts +16 -0
- package/dist/core/gl.d.ts +50 -0
- package/dist/core/glsl.d.ts +10 -0
- package/dist/core/overlay.d.ts +5 -0
- package/dist/core/runtime.d.ts +8 -0
- package/dist/core/shader.d.ts +22 -0
- package/dist/core/styles.d.ts +4 -0
- package/dist/core/text.d.ts +54 -0
- package/dist/core/types.d.ts +170 -0
- package/dist/core/util.d.ts +16 -0
- package/dist/core.d.ts +8 -0
- package/dist/core.js +1 -0
- package/dist/element.cdn.js +1 -0
- package/dist/element.d.ts +21 -0
- package/dist/element.js +1 -0
- package/dist/engines/arcade.d.ts +25 -0
- package/dist/engines/text3d.d.ts +37 -0
- package/dist/generated/all.d.ts +2 -0
- package/dist/generated/catalog.d.ts +2 -0
- package/dist/generated/registry.d.ts +5 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.js +1 -0
- package/dist/lostpage.global.js +3222 -0
- package/dist/react.d.ts +21 -0
- package/dist/react.js +2 -0
- package/dist/scenes/_simple.d.ts +10 -0
- package/dist/scenes/ascii-3d.d.ts +10 -0
- package/dist/scenes/ascii-3d.js +3 -0
- package/dist/scenes/astronaut.d.ts +10 -0
- package/dist/scenes/astronaut.js +2 -0
- package/dist/scenes/aurora.d.ts +14 -0
- package/dist/scenes/aurora.js +129 -0
- package/dist/scenes/autumn.d.ts +8 -0
- package/dist/scenes/autumn.js +1 -0
- package/dist/scenes/balloon-404.d.ts +9 -0
- package/dist/scenes/balloon-404.js +1 -0
- package/dist/scenes/beach.d.ts +14 -0
- package/dist/scenes/beach.js +95 -0
- package/dist/scenes/black-hole.d.ts +15 -0
- package/dist/scenes/black-hole.js +124 -0
- package/dist/scenes/block-drop.d.ts +9 -0
- package/dist/scenes/block-drop.js +1 -0
- package/dist/scenes/blue-screen.d.ts +5 -0
- package/dist/scenes/blue-screen.js +70 -0
- package/dist/scenes/breakout.d.ts +10 -0
- package/dist/scenes/breakout.js +1 -0
- package/dist/scenes/bricks.d.ts +7 -0
- package/dist/scenes/bricks.js +1 -0
- package/dist/scenes/broken-link.d.ts +8 -0
- package/dist/scenes/broken-link.js +11 -0
- package/dist/scenes/brutalist.d.ts +7 -0
- package/dist/scenes/brutalist.js +15 -0
- package/dist/scenes/bubble-wrap.d.ts +9 -0
- package/dist/scenes/bubble-wrap.js +1 -0
- package/dist/scenes/campfire.d.ts +11 -0
- package/dist/scenes/campfire.js +88 -0
- package/dist/scenes/card.d.ts +8 -0
- package/dist/scenes/card.js +15 -0
- package/dist/scenes/cassette.d.ts +9 -0
- package/dist/scenes/cassette.js +15 -0
- package/dist/scenes/chalkboard.d.ts +8 -0
- package/dist/scenes/chalkboard.js +3 -0
- package/dist/scenes/chrome-404.d.ts +13 -0
- package/dist/scenes/chrome-404.js +1 -0
- package/dist/scenes/circuit-board.d.ts +9 -0
- package/dist/scenes/circuit-board.js +1 -0
- package/dist/scenes/claw-machine.d.ts +8 -0
- package/dist/scenes/claw-machine.js +1 -0
- package/dist/scenes/clay-404.d.ts +11 -0
- package/dist/scenes/clay-404.js +1 -0
- package/dist/scenes/constellation.d.ts +10 -0
- package/dist/scenes/constellation.js +1 -0
- package/dist/scenes/countdown.d.ts +9 -0
- package/dist/scenes/countdown.js +14 -0
- package/dist/scenes/cross-stitch.d.ts +8 -0
- package/dist/scenes/cross-stitch.js +2 -0
- package/dist/scenes/deep-sea.d.ts +9 -0
- package/dist/scenes/deep-sea.js +85 -0
- package/dist/scenes/divider.d.ts +6 -0
- package/dist/scenes/divider.js +9 -0
- package/dist/scenes/dna.d.ts +9 -0
- package/dist/scenes/dna.js +2 -0
- package/dist/scenes/dominoes.d.ts +9 -0
- package/dist/scenes/dominoes.js +1 -0
- package/dist/scenes/dot-grid.d.ts +9 -0
- package/dist/scenes/dot-grid.js +11 -0
- package/dist/scenes/editorial.d.ts +6 -0
- package/dist/scenes/editorial.js +11 -0
- package/dist/scenes/elevator.d.ts +10 -0
- package/dist/scenes/elevator.js +36 -0
- package/dist/scenes/emoji.d.ts +7 -0
- package/dist/scenes/emoji.js +8 -0
- package/dist/scenes/error-cascade.d.ts +6 -0
- package/dist/scenes/error-cascade.js +18 -0
- package/dist/scenes/evidence-board.d.ts +7 -0
- package/dist/scenes/evidence-board.js +18 -0
- package/dist/scenes/eyes.d.ts +12 -0
- package/dist/scenes/eyes.js +2 -0
- package/dist/scenes/fireworks.d.ts +8 -0
- package/dist/scenes/fireworks.js +1 -0
- package/dist/scenes/flashlight.d.ts +12 -0
- package/dist/scenes/flashlight.js +57 -0
- package/dist/scenes/flatline.d.ts +9 -0
- package/dist/scenes/flatline.js +1 -0
- package/dist/scenes/flock.d.ts +13 -0
- package/dist/scenes/flock.js +1 -0
- package/dist/scenes/foggy-glass.d.ts +9 -0
- package/dist/scenes/foggy-glass.js +1 -0
- package/dist/scenes/gears.d.ts +10 -0
- package/dist/scenes/gears.js +5 -0
- package/dist/scenes/glass-404.d.ts +11 -0
- package/dist/scenes/glass-404.js +1 -0
- package/dist/scenes/glitch.d.ts +15 -0
- package/dist/scenes/glitch.js +60 -0
- package/dist/scenes/gradient-404.d.ts +9 -0
- package/dist/scenes/gradient-404.js +6 -0
- package/dist/scenes/halftone.d.ts +11 -0
- package/dist/scenes/halftone.js +43 -0
- package/dist/scenes/hanging-letters.d.ts +10 -0
- package/dist/scenes/hanging-letters.js +1 -0
- package/dist/scenes/hanging-sign.d.ts +9 -0
- package/dist/scenes/hanging-sign.js +1 -0
- package/dist/scenes/helpful-links.d.ts +6 -0
- package/dist/scenes/helpful-links.js +18 -0
- package/dist/scenes/hyperspace.d.ts +11 -0
- package/dist/scenes/hyperspace.js +57 -0
- package/dist/scenes/hypnosis.d.ts +10 -0
- package/dist/scenes/hypnosis.js +26 -0
- package/dist/scenes/ink.d.ts +10 -0
- package/dist/scenes/ink.js +43 -0
- package/dist/scenes/invaders.d.ts +10 -0
- package/dist/scenes/invaders.js +1 -0
- package/dist/scenes/kaleidoscope.d.ts +10 -0
- package/dist/scenes/kaleidoscope.js +34 -0
- package/dist/scenes/lava-lamp.d.ts +11 -0
- package/dist/scenes/lava-lamp.js +55 -0
- package/dist/scenes/life.d.ts +13 -0
- package/dist/scenes/life.js +1 -0
- package/dist/scenes/lighthouse.d.ts +11 -0
- package/dist/scenes/lighthouse.js +60 -0
- package/dist/scenes/loading.d.ts +6 -0
- package/dist/scenes/loading.js +34 -0
- package/dist/scenes/lost-at-sea.d.ts +35 -0
- package/dist/scenes/lost-at-sea.js +258 -0
- package/dist/scenes/magic-8-ball.d.ts +10 -0
- package/dist/scenes/magic-8-ball.js +2 -0
- package/dist/scenes/matrix-rain.d.ts +13 -0
- package/dist/scenes/matrix-rain.js +3 -0
- package/dist/scenes/maze.d.ts +9 -0
- package/dist/scenes/maze.js +1 -0
- package/dist/scenes/mesh-gradient.d.ts +13 -0
- package/dist/scenes/mesh-gradient.js +34 -0
- package/dist/scenes/metro-map.d.ts +8 -0
- package/dist/scenes/metro-map.js +30 -0
- package/dist/scenes/milk-carton.d.ts +9 -0
- package/dist/scenes/milk-carton.js +53 -0
- package/dist/scenes/minimal.d.ts +6 -0
- package/dist/scenes/minimal.js +9 -0
- package/dist/scenes/mirage.d.ts +10 -0
- package/dist/scenes/mirage.js +70 -0
- package/dist/scenes/moon-landing.d.ts +8 -0
- package/dist/scenes/moon-landing.js +1 -0
- package/dist/scenes/neon-sign.d.ts +15 -0
- package/dist/scenes/neon-sign.js +1 -0
- package/dist/scenes/newspaper.d.ts +10 -0
- package/dist/scenes/newspaper.js +49 -0
- package/dist/scenes/nixie.d.ts +11 -0
- package/dist/scenes/nixie.js +1 -0
- package/dist/scenes/no-signal.d.ts +11 -0
- package/dist/scenes/no-signal.js +82 -0
- package/dist/scenes/one-bit.d.ts +8 -0
- package/dist/scenes/one-bit.js +49 -0
- package/dist/scenes/outline-404.d.ts +8 -0
- package/dist/scenes/outline-404.js +9 -0
- package/dist/scenes/paint-splash.d.ts +6 -0
- package/dist/scenes/paint-splash.js +1 -0
- package/dist/scenes/paper-plane.d.ts +9 -0
- package/dist/scenes/paper-plane.js +2 -0
- package/dist/scenes/particles.d.ts +22 -0
- package/dist/scenes/particles.js +1 -0
- package/dist/scenes/path-not-found.d.ts +6 -0
- package/dist/scenes/path-not-found.js +14 -0
- package/dist/scenes/planet.d.ts +19 -0
- package/dist/scenes/planet.js +157 -0
- package/dist/scenes/pond.d.ts +11 -0
- package/dist/scenes/pond.js +106 -0
- package/dist/scenes/pong.d.ts +8 -0
- package/dist/scenes/pong.js +1 -0
- package/dist/scenes/radar.d.ts +9 -0
- package/dist/scenes/radar.js +4 -0
- package/dist/scenes/rainy-window.d.ts +11 -0
- package/dist/scenes/rainy-window.js +114 -0
- package/dist/scenes/receipt.d.ts +8 -0
- package/dist/scenes/receipt.js +32 -0
- package/dist/scenes/road-closed.d.ts +9 -0
- package/dist/scenes/road-closed.js +1 -0
- package/dist/scenes/rpg-dialog.d.ts +11 -0
- package/dist/scenes/rpg-dialog.js +14 -0
- package/dist/scenes/runner.d.ts +10 -0
- package/dist/scenes/runner.js +1 -0
- package/dist/scenes/scratch-card.d.ts +9 -0
- package/dist/scenes/scratch-card.js +1 -0
- package/dist/scenes/screensaver.d.ts +8 -0
- package/dist/scenes/screensaver.js +1 -0
- package/dist/scenes/search-404.d.ts +9 -0
- package/dist/scenes/search-404.js +17 -0
- package/dist/scenes/server-default.d.ts +6 -0
- package/dist/scenes/server-default.js +10 -0
- package/dist/scenes/server-room.d.ts +9 -0
- package/dist/scenes/server-room.js +1 -0
- package/dist/scenes/skyline.d.ts +10 -0
- package/dist/scenes/skyline.js +1 -0
- package/dist/scenes/skywriting.d.ts +8 -0
- package/dist/scenes/skywriting.js +1 -0
- package/dist/scenes/slot-machine.d.ts +10 -0
- package/dist/scenes/slot-machine.js +33 -0
- package/dist/scenes/snake.d.ts +13 -0
- package/dist/scenes/snake.js +1 -0
- package/dist/scenes/snow-globe.d.ts +10 -0
- package/dist/scenes/snow-globe.js +2 -0
- package/dist/scenes/soft-blobs.d.ts +9 -0
- package/dist/scenes/soft-blobs.js +15 -0
- package/dist/scenes/solar-system.d.ts +9 -0
- package/dist/scenes/solar-system.js +2 -0
- package/dist/scenes/split-flap.d.ts +15 -0
- package/dist/scenes/split-flap.js +37 -0
- package/dist/scenes/split-panel.d.ts +8 -0
- package/dist/scenes/split-panel.js +12 -0
- package/dist/scenes/stage.d.ts +10 -0
- package/dist/scenes/stage.js +2 -0
- package/dist/scenes/swiss-poster.d.ts +9 -0
- package/dist/scenes/swiss-poster.js +20 -0
- package/dist/scenes/terminal.d.ts +13 -0
- package/dist/scenes/terminal.js +41 -0
- package/dist/scenes/thunderstorm.d.ts +11 -0
- package/dist/scenes/thunderstorm.js +1 -0
- package/dist/scenes/topographic.d.ts +13 -0
- package/dist/scenes/topographic.js +38 -0
- package/dist/scenes/torn-page.d.ts +9 -0
- package/dist/scenes/torn-page.js +16 -0
- package/dist/scenes/treasure-map.d.ts +10 -0
- package/dist/scenes/treasure-map.js +3 -0
- package/dist/scenes/typewriter.d.ts +10 -0
- package/dist/scenes/typewriter.js +23 -0
- package/dist/scenes/ufo.d.ts +11 -0
- package/dist/scenes/ufo.js +1 -0
- package/dist/scenes/unplugged.d.ts +9 -0
- package/dist/scenes/unplugged.js +1 -0
- package/dist/scenes/vending-machine.d.ts +7 -0
- package/dist/scenes/vending-machine.js +27 -0
- package/dist/scenes/vinyl.d.ts +9 -0
- package/dist/scenes/vinyl.js +2 -0
- package/dist/scenes/voxel-404.d.ts +13 -0
- package/dist/scenes/voxel-404.js +102 -0
- package/dist/scenes/wormhole.d.ts +13 -0
- package/dist/scenes/wormhole.js +113 -0
- package/dist/scenes/zen-garden.d.ts +8 -0
- package/dist/scenes/zen-garden.js +1 -0
- package/dist/svelte.d.ts +17 -0
- package/dist/svelte.js +1 -0
- package/dist/vue.d.ts +66 -0
- package/dist/vue.js +1 -0
- package/package.json +114 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{__export}from"./chunk-7XMDQMDO.js";var text_exports={};__export(text_exports,{MONO:()=>MONO,SANS:()=>SANS,SERIF:()=>SERIF,blurField:()=>blurField,drawFittedText:()=>drawFittedText,sdfFromAlpha:()=>sdfFromAlpha,textCanvas:()=>textCanvas,textPoints:()=>textPoints,textSDF:()=>textSDF});var SANS='"Inter","SF Pro Display",ui-sans-serif,system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif',MONO='"JetBrains Mono","SF Mono",ui-monospace,SFMono-Regular,Menlo,Consolas,monospace',SERIF='"Fraunces","Playfair Display",ui-serif,Georgia,"Times New Roman",serif';function textCanvas(text,o){let c=document.createElement("canvas");c.width=Math.max(1,Math.round(o.width)),c.height=Math.max(1,Math.round(o.height));let g=c.getContext("2d");return drawFittedText(g,text,o),c}function drawFittedText(g,text,o){let fit=o.fit??.8,font=o.font??SANS,weight=o.weight??800,style=o.style??"normal",size=100;g.font=`${style} ${weight} ${size}px ${font}`;let tracking=o.tracking??-.02,measure=()=>{let m2=g.measureText(text),w=m2.width+tracking*size*(text.length-1),h=(m2.actualBoundingBoxAscent||size*.72)+(m2.actualBoundingBoxDescent||0);return{w,h,asc:m2.actualBoundingBoxAscent||size*.72,desc:m2.actualBoundingBoxDescent||0}},m=measure();size=Math.min(o.width*fit/m.w,o.height*fit/m.h)*100,g.font=`${style} ${weight} ${size}px ${font}`,m=measure();let cx=o.width*(o.cx??.5),cy=o.height*(o.cy??.5);g.fillStyle=o.color??"#fff",g.textBaseline="alphabetic";let baseY=cy+(m.asc-m.desc)/2;if(Math.abs(tracking)<1e-4)g.textAlign="center",g.fillText(text,cx,baseY);else{g.textAlign="left";let x=cx-m.w/2;for(let ch of text)g.fillText(ch,x,baseY),x+=g.measureText(ch).width+tracking*size}return{size,width:m.w,height:m.h,x:cx-m.w/2,y:baseY-m.asc}}function textPoints(text,o){let c=textCanvas(text,{...o,width:o.width*1,height:o.height*1}),g=c.getContext("2d"),{data,width,height}=g.getImageData(0,0,c.width,c.height),out=[],rnd=o.random??Math.random,j=o.jitter??0;for(let y=0;y<height;y+=o.step)for(let x=0;x<width;x+=o.step)data[(y*width+x)*4+3]>140&&out.push(x/1+(rnd()-.5)*j*o.step,y/1+(rnd()-.5)*j*o.step);return new Float32Array(out)}var INF=1e20;function edt1d(f,n,d,v,z){let k=0;v[0]=0,z[0]=-INF,z[1]=INF;for(let q=1;q<n;q++){let s=(f[q]+q*q-(f[v[k]]+v[k]*v[k]))/(2*q-2*v[k]);for(;s<=z[k];)k--,s=(f[q]+q*q-(f[v[k]]+v[k]*v[k]))/(2*q-2*v[k]);k++,v[k]=q,z[k]=s,z[k+1]=INF}k=0;for(let q=0;q<n;q++){for(;z[k+1]<q;)k++;d[q]=(q-v[k])*(q-v[k])+f[v[k]]}}function edt2d(grid,w,h){let n=Math.max(w,h),f=new Float64Array(n),d=new Float64Array(n),v=new Int32Array(n),z=new Float64Array(n+1);for(let x=0;x<w;x++){for(let y=0;y<h;y++)f[y]=grid[y*w+x];edt1d(f,h,d,v,z);for(let y=0;y<h;y++)grid[y*w+x]=d[y]}for(let y=0;y<h;y++){for(let x=0;x<w;x++)f[x]=grid[y*w+x];edt1d(f,w,d,v,z);for(let x=0;x<w;x++)grid[y*w+x]=d[x]}}function sdfFromAlpha(alpha,w,h,stride=4,offset=3){let outside=new Float64Array(w*h),inside=new Float64Array(w*h);for(let i=0;i<w*h;i++){let a=alpha[i*stride+offset]/255;if(a>=.999)outside[i]=0,inside[i]=INF;else if(a<=.001)outside[i]=INF,inside[i]=0;else{let dd=Math.max(0,.5-a),di=Math.max(0,a-.5);outside[i]=dd*dd,inside[i]=di*di}}edt2d(outside,w,h),edt2d(inside,w,h);let out=new Float32Array(w*h);for(let i=0;i<w*h;i++)out[i]=Math.sqrt(outside[i])-Math.sqrt(inside[i]);return out}function blurField(f,w,h,sigma=1.6){let r=Math.ceil(sigma*2.5),k=[],sum=0;for(let i=-r;i<=r;i++){let v=Math.exp(-(i*i)/(2*sigma*sigma));k.push(v),sum+=v}for(let i=0;i<k.length;i++)k[i]/=sum;let tmp=new Float32Array(f.length);for(let y=0;y<h;y++){let row=y*w;for(let x=0;x<w;x++){let acc=0;for(let i=-r;i<=r;i++)acc+=f[row+Math.min(w-1,Math.max(0,x+i))]*k[i+r];tmp[row+x]=acc}}for(let x=0;x<w;x++)for(let y=0;y<h;y++){let acc=0;for(let i=-r;i<=r;i++)acc+=tmp[Math.min(h-1,Math.max(0,y+i))*w+x]*k[i+r];f[y*w+x]=acc}return f}function textSDF(text,o){let c=textCanvas(text,o),img=c.getContext("2d").getImageData(0,0,c.width,c.height),sdf=sdfFromAlpha(img.data,c.width,c.height);(o.smooth??1.8)>0&&blurField(sdf,c.width,c.height,o.smooth??1.8);let flipped=new Float32Array(sdf.length);for(let y=0;y<c.height;y++)flipped.set(sdf.subarray(y*c.width,(y+1)*c.width),(c.height-1-y)*c.width);return{data:flipped,width:c.width,height:c.height}}export{SANS,MONO,SERIF,textCanvas,drawFittedText,textPoints,textSDF,text_exports};
|
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
import{HASH,NOISE,POST,dataTexture,getGL,pass}from"./chunk-SH72TE6I.js";import{linear}from"./chunk-FVGCB66F.js";import{SANS,textSDF}from"./chunk-3ISI6SOJ.js";var COMMON=`
|
|
2
|
+
uniform sampler2D uSdf;
|
|
3
|
+
uniform vec2 uHalf; // half extents of the SDF box (world)
|
|
4
|
+
uniform float uScale; // sdf px -> world
|
|
5
|
+
uniform float uInflate;
|
|
6
|
+
uniform float uDepth, uRound, uSpin, uFloat, uGloss, uEnvSpeed, uStrings, uDisp, uFloor, uSize, uY;
|
|
7
|
+
uniform vec3 uA, uB, uC, uBg0, uBg1, uLight;
|
|
8
|
+
${HASH}
|
|
9
|
+
${NOISE}
|
|
10
|
+
${POST}
|
|
11
|
+
|
|
12
|
+
mat3 rotY(float a){ float c = cos(a), s = sin(a); return mat3(c,0,-s, 0,1,0, s,0,c); }
|
|
13
|
+
mat3 rotX(float a){ float c = cos(a), s = sin(a); return mat3(1,0,0, 0,c,s, 0,-s,c); }
|
|
14
|
+
|
|
15
|
+
// Cubic B-spline filtering from 4 bilinear taps: C2-smooth distances, so normals don't kink at texel edges.
|
|
16
|
+
float sdfBicubic(vec2 uv) {
|
|
17
|
+
vec2 size = vec2(textureSize(uSdf, 0));
|
|
18
|
+
vec2 st = uv * size - 0.5;
|
|
19
|
+
vec2 i = floor(st);
|
|
20
|
+
vec2 f = st - i;
|
|
21
|
+
vec2 f2 = f * f, f3 = f2 * f;
|
|
22
|
+
vec2 w0 = (1.0 - 3.0 * f + 3.0 * f2 - f3) / 6.0;
|
|
23
|
+
vec2 w1 = (4.0 - 6.0 * f2 + 3.0 * f3) / 6.0;
|
|
24
|
+
vec2 w2 = (1.0 + 3.0 * f + 3.0 * f2 - 3.0 * f3) / 6.0;
|
|
25
|
+
vec2 w3 = f3 / 6.0;
|
|
26
|
+
vec2 g0 = w0 + w1, g1 = w2 + w3;
|
|
27
|
+
vec2 h0 = (w1 / g0 - 1.0 + i + 0.5) / size;
|
|
28
|
+
vec2 h1 = (w3 / g1 + 1.0 + i + 0.5) / size;
|
|
29
|
+
float a = texture(uSdf, vec2(h0.x, h0.y)).r, b = texture(uSdf, vec2(h1.x, h0.y)).r;
|
|
30
|
+
float c = texture(uSdf, vec2(h0.x, h1.y)).r, d = texture(uSdf, vec2(h1.x, h1.y)).r;
|
|
31
|
+
return mix(mix(d, c, g0.x), mix(b, a, g0.x), g0.y);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
float sdText2(vec2 p) {
|
|
35
|
+
vec2 uv = p / (2.0 * uHalf) + 0.5;
|
|
36
|
+
vec2 q = clamp(uv, 0.004, 0.996);
|
|
37
|
+
float d = sdfBicubic(q) * uScale;
|
|
38
|
+
return d + length((uv - q) * 2.0 * uHalf);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
mat3 objRot;
|
|
42
|
+
vec3 objOff;
|
|
43
|
+
float floorY = -1.15;
|
|
44
|
+
|
|
45
|
+
float mapText(vec3 p) {
|
|
46
|
+
p = objRot * (p - objOff);
|
|
47
|
+
if (uInflate > 0.0) {
|
|
48
|
+
// pillow: thickness grows with distance from the outline along a circular profile
|
|
49
|
+
float d2 = sdText2(p.xy);
|
|
50
|
+
float s = clamp(-d2 / uInflate, 0.0, 1.0);
|
|
51
|
+
float h = uDepth * sqrt(max(1.0 - (1.0 - s) * (1.0 - s), 0.0));
|
|
52
|
+
return max(d2, abs(p.z) - h) * 0.6;
|
|
53
|
+
}
|
|
54
|
+
float d2 = sdText2(p.xy) + uRound;
|
|
55
|
+
vec2 w = vec2(d2, abs(p.z) - uDepth);
|
|
56
|
+
return min(max(w.x, w.y), 0.0) + length(max(w, 0.0)) - uRound;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// which letter (0,1,2) a point belongs to, by x position in object space
|
|
60
|
+
float letterId(vec3 p) {
|
|
61
|
+
vec3 q = objRot * (p - objOff);
|
|
62
|
+
return clamp(floor((q.x / (2.0 * uHalf.x) + 0.5) * 3.0), 0.0, 2.0);
|
|
63
|
+
}
|
|
64
|
+
vec3 letterColor(vec3 p) {
|
|
65
|
+
float id = letterId(p);
|
|
66
|
+
return id < 0.5 ? uA : id < 1.5 ? uB : uC;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
float mapStrings(vec3 p) {
|
|
70
|
+
if (uStrings < 0.5) return 1e5;
|
|
71
|
+
vec3 q = objRot * (p - objOff);
|
|
72
|
+
float d = 1e5;
|
|
73
|
+
for (int i = 0; i < 3; i++) {
|
|
74
|
+
float x = (float(i) - 1.0) * uHalf.x * 0.62;
|
|
75
|
+
float sway = sin(uTime * 0.9 + float(i) * 1.7) * 0.08 * (-q.y - uHalf.y * 0.7);
|
|
76
|
+
vec3 a = vec3(x + sway, q.y, 0.0);
|
|
77
|
+
float inY = step(q.y, -uHalf.y * 0.55);
|
|
78
|
+
float dd = length(q.xz - a.xz) - 0.006;
|
|
79
|
+
d = min(d, mix(1e5, dd, inY));
|
|
80
|
+
}
|
|
81
|
+
return d;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
float map(vec3 p) {
|
|
85
|
+
float d = mapText(p);
|
|
86
|
+
d = min(d, mapStrings(p));
|
|
87
|
+
if (uFloor > 0.5) d = min(d, p.y - floorY);
|
|
88
|
+
return d;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
vec3 calcNormal(vec3 p) {
|
|
92
|
+
const vec2 k = vec2(1, -1);
|
|
93
|
+
float e = 0.003;
|
|
94
|
+
return normalize(k.xyy * map(p + k.xyy * e) + k.yyx * map(p + k.yyx * e) + k.yxy * map(p + k.yxy * e) + k.xxx * map(p + k.xxx * e));
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
float trace(vec3 ro, vec3 rd, float tmax) {
|
|
98
|
+
float t = 0.0;
|
|
99
|
+
for (int i = 0; i < 140; i++) {
|
|
100
|
+
float d = map(ro + rd * t);
|
|
101
|
+
if (d < 0.00012 * t + 0.0002) return t;
|
|
102
|
+
t += d * 0.85;
|
|
103
|
+
if (t > tmax) break;
|
|
104
|
+
}
|
|
105
|
+
return -1.0;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
float softShadow(vec3 ro, vec3 rd) {
|
|
109
|
+
float res = 1.0, t = 0.02;
|
|
110
|
+
for (int i = 0; i < 40; i++) {
|
|
111
|
+
float h = mapText(ro + rd * t);
|
|
112
|
+
res = min(res, 10.0 * h / t);
|
|
113
|
+
t += clamp(h, 0.02, 0.25);
|
|
114
|
+
if (res < 0.002 || t > 6.0) break;
|
|
115
|
+
}
|
|
116
|
+
return clamp(res, 0.0, 1.0);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
float ao(vec3 p, vec3 n) {
|
|
120
|
+
float occ = 0.0, s = 1.0;
|
|
121
|
+
for (int i = 1; i <= 5; i++) {
|
|
122
|
+
float h = 0.03 * float(i) * float(i);
|
|
123
|
+
occ += (h - map(p + n * h)) * s;
|
|
124
|
+
s *= 0.6;
|
|
125
|
+
}
|
|
126
|
+
return clamp(1.0 - 1.6 * occ, 0.0, 1.0);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// A photo-studio environment: dark floor, gradient walls, long softboxes and a ring light.
|
|
130
|
+
vec3 studio(vec3 r) {
|
|
131
|
+
float a = uTime * uEnvSpeed;
|
|
132
|
+
r = rotY(a) * r;
|
|
133
|
+
vec3 c = mix(uBg1 * 0.6 + 0.04, uBg0 * 1.6 + 0.08, smoothstep(-0.25, 0.9, r.y));
|
|
134
|
+
c = mix(c, uBg1 * 0.15, smoothstep(-0.02, -0.35, r.y));
|
|
135
|
+
// broad gradient bands so curved surfaces always pick up something
|
|
136
|
+
c += uLight * 0.35 * smoothstep(0.6, 1.0, sin(atan(r.x, r.z) * 3.0 + 0.6) * 0.5 + 0.5) * smoothstep(-0.1, 0.4, r.y);
|
|
137
|
+
// horizon line
|
|
138
|
+
c += uLight * 0.9 * exp(-abs(r.y + 0.02) * 60.0);
|
|
139
|
+
// overhead strip softboxes
|
|
140
|
+
float strip1 = smoothstep(0.08, 0.06, abs(r.x - 0.35)) * smoothstep(0.35, 0.45, r.y);
|
|
141
|
+
float strip2 = smoothstep(0.05, 0.03, abs(r.x + 0.55)) * smoothstep(0.1, 0.25, r.y) * smoothstep(0.95, 0.75, r.y);
|
|
142
|
+
float box = smoothstep(0.02, 0.0, max(abs(r.z + 0.55) - 0.32, abs(r.y - 0.25) - 0.18)) * step(0.0, r.x);
|
|
143
|
+
float ring = smoothstep(0.03, 0.0, abs(length(r.xy - vec2(-0.2, 0.55)) - 0.22)) * step(0.0, -r.z);
|
|
144
|
+
c += uLight * (strip1 * 6.0 + strip2 * 4.0 + box * 3.0 + ring * 2.5);
|
|
145
|
+
// behind the camera: a big diffused panel split by a dark gap, so front faces read as polished metal
|
|
146
|
+
float fz = smoothstep(0.35, 0.95, r.z);
|
|
147
|
+
float diag = r.x * 0.8 + r.y * 0.6;
|
|
148
|
+
float panel = smoothstep(-0.05, 0.05, diag + 0.1) * smoothstep(0.75, 0.2, diag) + 0.55 * smoothstep(-0.3, -0.18, diag) * smoothstep(-0.05, -0.15, diag);
|
|
149
|
+
c += uLight * fz * panel * 1.1;
|
|
150
|
+
return c;
|
|
151
|
+
}
|
|
152
|
+
`,BG=`
|
|
153
|
+
vec3 background(vec2 uv, vec2 fc) {
|
|
154
|
+
vec3 c = mix(uBg1, uBg0, smoothstep(-0.6, 0.6, uv.y));
|
|
155
|
+
return c;
|
|
156
|
+
}
|
|
157
|
+
`,GLASS_BG=`
|
|
158
|
+
// moving colour fields behind the glass
|
|
159
|
+
vec3 background(vec2 uv, vec2 fc) {
|
|
160
|
+
float t = uTime * 0.12;
|
|
161
|
+
vec3 c = mix(uBg1, uBg0, smoothstep(-0.7, 0.7, uv.y));
|
|
162
|
+
for (int i = 0; i < 4; i++) {
|
|
163
|
+
float fi = float(i);
|
|
164
|
+
vec2 cp = vec2(sin(t * (1.0 + fi * 0.3) + fi * 2.1) * 0.75, cos(t * (0.8 + fi * 0.2) + fi * 1.3) * 0.38);
|
|
165
|
+
vec3 col = fi < 0.5 ? uA : fi < 1.5 ? uB : fi < 2.5 ? uC : mix(uA, uB, 0.5);
|
|
166
|
+
c = mix(c, col, smoothstep(0.75, 0.0, length(uv - cp)) * 0.85);
|
|
167
|
+
}
|
|
168
|
+
// fine stripes make refraction readable
|
|
169
|
+
c *= 0.92 + 0.08 * smoothstep(0.3, 0.7, abs(fract(uv.x * 9.0 + uv.y * 3.0) - 0.5) * 2.0);
|
|
170
|
+
return c;
|
|
171
|
+
}
|
|
172
|
+
`,MAIN=material=>`
|
|
173
|
+
void main() {
|
|
174
|
+
vec2 fc = gl_FragCoord.xy;
|
|
175
|
+
vec2 uv = (fc - 0.5 * uRes) / uRes.y;
|
|
176
|
+
float t = uTime;
|
|
177
|
+
float aspect = uRes.x / uRes.y;
|
|
178
|
+
|
|
179
|
+
// object motion: gentle sway, follows the pointer
|
|
180
|
+
float sway = sin(t * 0.45) * uSpin + uMouse.x * 0.45;
|
|
181
|
+
float tilt = sin(t * 0.33 + 1.0) * uSpin * 0.35 - uMouse.y * 0.25;
|
|
182
|
+
objRot = rotX(tilt) * rotY(sway);
|
|
183
|
+
// fit text width to the screen (and never taller than ~42% of it)
|
|
184
|
+
float fov = 1.8;
|
|
185
|
+
float dist = max(uHalf.x * 2.0 * fov / (uSize * min(aspect, 2.2)), uHalf.y * 2.0 * fov / 0.42);
|
|
186
|
+
objOff = vec3(0.0, sin(t * 0.8) * uFloat + uY * dist / fov, 0.0);
|
|
187
|
+
floorY = uY * dist / fov - uHalf.y - 0.45;
|
|
188
|
+
vec3 ro = vec3(0.0, 0.0, dist);
|
|
189
|
+
vec3 rd = normalize(vec3(uv, -fov));
|
|
190
|
+
|
|
191
|
+
vec3 col = background(uv, fc);
|
|
192
|
+
float tmax = dist + 8.0;
|
|
193
|
+
float th = trace(ro, rd, tmax);
|
|
194
|
+
|
|
195
|
+
if (th > 0.0) {
|
|
196
|
+
vec3 p = ro + rd * th;
|
|
197
|
+
vec3 n = calcNormal(p);
|
|
198
|
+
bool isFloor = uFloor > 0.5 && p.y < floorY + 0.02 && mapText(p) > 0.01;
|
|
199
|
+
vec3 L = normalize(vec3(0.55, 0.85, 0.6));
|
|
200
|
+
${MATERIAL[material]}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
col = aces(col * 1.0);
|
|
204
|
+
col = toSRGB(col);
|
|
205
|
+
col += grain(fc, t) * 0.012;
|
|
206
|
+
fragColor = vec4(col, 1.0);
|
|
207
|
+
}
|
|
208
|
+
`,MATERIAL={chrome:`
|
|
209
|
+
if (isFloor) {
|
|
210
|
+
vec3 r = reflect(rd, n);
|
|
211
|
+
float tr = trace(p + n * 0.01, r, 8.0);
|
|
212
|
+
vec3 rc = col * 0.6;
|
|
213
|
+
if (tr > 0.0) { vec3 q = p + n * 0.01 + r * tr; vec3 qn = calcNormal(q); rc = studio(reflect(r, qn)) * letterColor(q) * 0.7; }
|
|
214
|
+
float fr = 0.04 + 0.5 * pow(1.0 - max(dot(n, -rd), 0.0), 5.0);
|
|
215
|
+
col = mix(col * 0.8, rc, fr + 0.15) * smoothstep(9.0, 2.0, length(p.xz));
|
|
216
|
+
} else {
|
|
217
|
+
vec3 r = reflect(rd, n);
|
|
218
|
+
vec3 tint = letterColor(p);
|
|
219
|
+
vec3 rc = studio(r);
|
|
220
|
+
// one inter-reflection so the letters mirror each other
|
|
221
|
+
float tr = trace(p + n * 0.004, r, 6.0);
|
|
222
|
+
if (tr > 0.0) { vec3 q = p + n * 0.004 + r * tr; vec3 qn = calcNormal(q); rc = studio(reflect(r, qn)) * letterColor(q) * 0.85; }
|
|
223
|
+
float ndv = max(dot(n, -rd), 0.0);
|
|
224
|
+
vec3 F = tint + (1.0 - tint) * pow(1.0 - ndv, 5.0);
|
|
225
|
+
col = rc * F;
|
|
226
|
+
col += uLight * pow(max(dot(r, L), 0.0), 160.0) * 3.0;
|
|
227
|
+
col *= 0.65 + 0.35 * ao(p, n);
|
|
228
|
+
}`,glass:`
|
|
229
|
+
float ndv = max(dot(n, -rd), 0.0);
|
|
230
|
+
float fres = 0.04 + 0.96 * pow(1.0 - ndv, 5.0);
|
|
231
|
+
vec3 refl = studio(reflect(rd, n)) * 0.55;
|
|
232
|
+
vec3 acc = vec3(0.0);
|
|
233
|
+
for (int ch = 0; ch < 3; ch++) {
|
|
234
|
+
float ior = 1.45 + (float(ch) - 1.0) * 0.035 * uDisp;
|
|
235
|
+
vec3 rdi = refract(rd, n, 1.0 / ior);
|
|
236
|
+
// march through the inside to the back face
|
|
237
|
+
vec3 q = p - n * 0.003;
|
|
238
|
+
float s = 0.0;
|
|
239
|
+
for (int i = 0; i < 48; i++) {
|
|
240
|
+
float d = -mapText(q + rdi * s);
|
|
241
|
+
if (d < 0.0008) break;
|
|
242
|
+
s += max(d, 0.004);
|
|
243
|
+
}
|
|
244
|
+
vec3 qb = q + rdi * s;
|
|
245
|
+
vec3 nb = -calcNormal(qb);
|
|
246
|
+
vec3 rdo = refract(rdi, nb, ior);
|
|
247
|
+
if (dot(rdo, rdo) < 1e-4) rdo = reflect(rdi, nb);
|
|
248
|
+
vec2 suv = uv + rdo.xy * 0.22 + rdi.xy * s * 0.05;
|
|
249
|
+
vec3 b = background(suv, fc);
|
|
250
|
+
b *= exp(-s * (1.0 - letterColor(p)) * 0.9);
|
|
251
|
+
acc[ch] = b[ch];
|
|
252
|
+
}
|
|
253
|
+
col = mix(acc, refl, fres);
|
|
254
|
+
col += uLight * pow(max(dot(reflect(rd, n), L), 0.0), 220.0) * 2.5;
|
|
255
|
+
col += uLight * 0.25 * pow(1.0 - ndv, 3.0);`,clay:`
|
|
256
|
+
vec3 base = isFloor ? mix(uBg1, uBg0, 0.35) : letterColor(p);
|
|
257
|
+
float dif = clamp(dot(n, L) * 0.5 + 0.5, 0.0, 1.0);
|
|
258
|
+
dif *= dif;
|
|
259
|
+
float sh = softShadow(p + n * 0.01, L);
|
|
260
|
+
float occ = ao(p, n);
|
|
261
|
+
float rim = pow(1.0 - max(dot(n, -rd), 0.0), 3.0);
|
|
262
|
+
vec3 sky = mix(uBg1, uBg0, 0.7);
|
|
263
|
+
vec3 lit = base * (0.42 * sky * occ + 0.95 * uLight * dif * mix(0.35, 1.0, sh));
|
|
264
|
+
lit += base * rim * 0.35 * occ;
|
|
265
|
+
if (!isFloor) {
|
|
266
|
+
vec3 h = normalize(L - rd);
|
|
267
|
+
lit += uLight * pow(max(dot(n, h), 0.0), 60.0) * uGloss * sh * 0.9;
|
|
268
|
+
// subtle surface tooth
|
|
269
|
+
lit *= 0.97 + 0.03 * vnoise(p.xy * 90.0);
|
|
270
|
+
} else {
|
|
271
|
+
float fade = smoothstep(9.0, 1.5, length(p.xz));
|
|
272
|
+
lit = mix(col, lit, fade);
|
|
273
|
+
}
|
|
274
|
+
col = lit;`,foil:`
|
|
275
|
+
if (isFloor) {
|
|
276
|
+
float sh = softShadow(p + n * 0.01, L);
|
|
277
|
+
vec3 fl = mix(uBg1, uBg0, 0.3) * (0.55 + 0.45 * sh);
|
|
278
|
+
col = mix(col, fl, smoothstep(9.0, 1.5, length(p.xz)));
|
|
279
|
+
} else if (mapStrings(p) < mapText(p)) {
|
|
280
|
+
col = vec3(0.85) * (0.6 + 0.4 * dot(n, L));
|
|
281
|
+
} else {
|
|
282
|
+
vec3 q = objRot * (p - objOff);
|
|
283
|
+
// crinkles: low-amplitude noise on the normal
|
|
284
|
+
vec3 bump = vec3(vnoise(q.xy * 18.0) - 0.5, vnoise(q.yx * 18.0 + 3.0) - 0.5, 0.0) * 0.18;
|
|
285
|
+
vec3 nn = normalize(n + bump * (0.3 + 0.7 * smoothstep(0.0, 0.2, uDepth - abs(q.z))));
|
|
286
|
+
vec3 r = reflect(rd, nn);
|
|
287
|
+
vec3 tint = letterColor(p);
|
|
288
|
+
vec3 rc = studio(r);
|
|
289
|
+
float ndv = max(dot(nn, -rd), 0.0);
|
|
290
|
+
vec3 F = tint * 0.85 + (1.0 - tint * 0.85) * pow(1.0 - ndv, 4.0);
|
|
291
|
+
col = rc * F + tint * 0.08;
|
|
292
|
+
col += uLight * pow(max(dot(r, L), 0.0), 90.0) * 2.0;
|
|
293
|
+
// seam around the edge
|
|
294
|
+
float seam = smoothstep(0.012, 0.0, abs(q.z)) * 0.5;
|
|
295
|
+
col *= 1.0 - seam;
|
|
296
|
+
}`};function text3dScene(ctx,o){let canvas=ctx.canvas({adaptive:!0}),gl=getGL(canvas),prog=pass(gl,COMMON+(o.material==="glass"?GLASS_BG:BG)+MAIN(o.material)),code=ctx.copy.code||"404",tw=1024,th=400,sdf=textSDF(code,{width:tw,height:th,font:o.font??SANS,weight:o.weight??800,fit:.86,tracking:-.01}),tex=dataTexture(gl,sdf.data,sdf.width,sdf.height,1),halfX=2,scale=halfX*2/tw,halfY=th*scale/2,c=o.colors,u={uSdf:tex,uHalf:[halfX,halfY],uScale:scale,uDepth:o.depth??.22,uInflate:o.inflate??0,uRound:o.round??.04,uSpin:o.spin??.25,uFloat:o.float??.03,uGloss:o.gloss??.4,uEnvSpeed:o.envSpeed??.08,uStrings:o.strings?1:0,uDisp:o.dispersion??1,uFloor:o.floor?1:0,uSize:o.scale??.62,uY:o.y??.08,uA:linear(c.a),uB:linear(c.b),uC:linear(c.c??c.a),uBg0:linear(c.bg0),uBg1:linear(c.bg1),uLight:linear(c.light??"#ffffff")};return{frame(t){prog.draw({...u,uTime:t,uMouse:[ctx.pointer.sx,ctx.pointer.sy]})}}}export{text3dScene};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var __defProp=Object.defineProperty;var __export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})};export{__export};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var ICONS={back:'<svg data-dir="back" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M13 8H3M7 4 3 8l4 4"/></svg>',arrow:'<svg data-dir="arrow" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 11 11 5M6 5h5v5"/></svg>',home:'<svg data-dir="home" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M2.5 7.5 8 3l5.5 4.5M4 6.5V13h8V6.5"/></svg>'};function el(tag,cls,text){let n=document.createElement(tag);return n.className=cls,text!==void 0&&(n.textContent=text),n}function buildAction(a,onNavigate){let variant=a.variant??"primary",node=a.href!==void 0?el("a",`lp-btn lp-btn--${variant}`):el("button",`lp-btn lp-btn--${variant}`);node instanceof HTMLAnchorElement?node.href=a.href:node.type="button";let icon=a.icon??(variant==="primary"?"back":"arrow"),label=el("span","lp-btn-label",a.label);if(icon!=="none"&&ICONS[icon]){let holder=document.createElement("span");holder.innerHTML=ICONS[icon];let svg=holder.firstChild;icon==="arrow"?node.append(label,svg):node.append(svg,label)}else node.append(label);return node.addEventListener("click",ev=>{let e=ev;a.onClick?.(e),!e.defaultPrevented&&a.href!==void 0&&onNavigate&&!(e.metaKey||e.ctrlKey||e.shiftKey||e.button===1)&&(e.preventDefault(),onNavigate(a.href,e))}),node}function buildOverlay(copy,layout,onNavigate){let overlay=el("div",`lp-overlay lp-layout-${layout} lp-fadein`),head=el("div","lp-head");if(copy.eyebrow&&head.append(el("p","lp-eyebrow",copy.eyebrow)),copy.code){let code=el("div","lp-code",copy.code);code.setAttribute("aria-hidden","true"),head.append(code)}let body=el("div","lp-body");if(copy.title){let h1=el("h1","lp-title");copy.code&&h1.append(el("span","lp-sr",`Error ${copy.code}: `)),h1.append(copy.title),body.append(h1)}if(copy.message&&body.append(el("p","lp-message",copy.message)),copy.actions?.length){let actions=el("div","lp-actions");for(let a of copy.actions)actions.append(buildAction(a,onNavigate));body.append(actions)}return overlay.append(head,body),overlay}export{buildAction,buildOverlay};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{getGL,pass}from"./chunk-SH72TE6I.js";function shaderScene(ctx,o){let canvas=ctx.canvas({scale:o.scale??1,adaptive:o.adaptive??!0,z:o.z}),gl=getGL(canvas),p=pass(gl,o.frag);return o.init?.(gl,p),{gl,pass:p,frame(t,dt){p.draw({uTime:t,uMouse:[ctx.pointer.sx,ctx.pointer.sy],...o.uniforms?.(t,dt)??{}})}}}export{shaderScene};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function canvas2d(ctx,o={}){let canvas=ctx.canvas({z:o.z,scale:o.scale}),g=canvas.getContext("2d",{alpha:o.alpha??!1}),c={canvas,g,get w(){return ctx.width},get h(){return ctx.height},reset(){let sx=canvas.width/Math.max(1,ctx.width),sy=canvas.height/Math.max(1,ctx.height);g.setTransform(sx,0,0,sy,0,0)}};return c.reset(),c}function glowSprite(color,size=64,hardness=.15){let c=document.createElement("canvas");c.width=c.height=size;let g=c.getContext("2d"),grd=g.createRadialGradient(size/2,size/2,0,size/2,size/2,size/2);return grd.addColorStop(0,color),grd.addColorStop(hardness,color),grd.addColorStop(1,"rgba(0,0,0,0)"),g.fillStyle=grd,g.fillRect(0,0,size,size),c}export{canvas2d,glowSprite};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{buildAction}from"./chunk-B2NBRLO2.js";var esc=s=>s.replace(/[&<>"]/g,c=>({"&":"&","<":"<",">":">",'"':"""})[c]),path=()=>typeof location<"u"?location.pathname+location.search:"/missing-page";function actions(ctx,className="lp-actions"){let box=document.createElement("div");box.className=className;for(let a of ctx.copy.actions)box.append(buildAction(a,ctx.navigate));return box}function layer(ctx,className,html,vars={}){let el=document.createElement("div");el.className=className;for(let[k,v]of Object.entries(vars))el.style.setProperty(`--${k}`,String(v));return el.innerHTML=html,ctx.root.append(el),el}var sr=code=>`<span class="lp-sr">Error ${esc(code)}: </span>`;export{esc,path,actions,layer,sr};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{__export}from"./chunk-7XMDQMDO.js";var util_exports={};__export(util_exports,{TAU:()=>TAU,clamp:()=>clamp,damp:()=>damp,fract:()=>fract,isBrowser:()=>isBrowser,lerp:()=>lerp,linear:()=>linear,mixColor:()=>mixColor,rgb:()=>rgb,rgba:()=>rgba,rng:()=>rng,smoothstep:()=>smoothstep});var clamp=(x,a=0,b=1)=>x<a?a:x>b?b:x,lerp=(a,b,t)=>a+(b-a)*t,smoothstep=(a,b,x)=>{let t=clamp((x-a)/(b-a));return t*t*(3-2*t)},fract=x=>x-Math.floor(x),TAU=Math.PI*2,damp=(a,b,lambda,dt)=>lerp(a,b,1-Math.exp(-lambda*dt));function rng(seed=1){let s=seed>>>0||1;return()=>{s=s+1831565813>>>0;let t=s;return t=Math.imul(t^t>>>15,t|1),t^=t+Math.imul(t^t>>>7,t|61),((t^t>>>14)>>>0)/4294967296}}function rgb(input){let s=input.trim();if(s.startsWith("#")){let h=s.slice(1);(h.length===3||h.length===4)&&(h=h.split("").map(c=>c+c).join(""));let n=parseInt(h.slice(0,6),16);return[(n>>16&255)/255,(n>>8&255)/255,(n&255)/255]}let m=s.match(/[\d.]+/g);return m&&m.length>=3?[+m[0]/255,+m[1]/255,+m[2]/255]:[1,1,1]}function linear(input){return rgb(input).map(c=>c<=.04045?c/12.92:Math.pow((c+.055)/1.055,2.4))}function mixColor(a,b,t){let ca=rgb(a),cb=rgb(b),c=ca.map((v,i)=>Math.round(lerp(v,cb[i],t)*255));return`rgb(${c[0]},${c[1]},${c[2]})`}function rgba(color,alpha){let[r,g,b]=rgb(color);return`rgba(${Math.round(r*255)},${Math.round(g*255)},${Math.round(b*255)},${alpha})`}var isBrowser=()=>typeof window<"u"&&typeof document<"u";export{clamp,damp,rng,rgb,linear,rgba,isBrowser,util_exports};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function defineScene(def){return def}var DEFAULT_COPY={code:"404",eyebrow:"Error 404",title:"Page not found",message:"The page you were looking for doesn't exist or has moved.",actions:[{label:"Back to home",href:"/",variant:"primary",icon:"back"}]},COPY_KEYS=["code","eyebrow","title","message","actions"];function resolve(def,opts={}){let presetId=opts.preset&&def.presets?.[opts.preset]?opts.preset:"default",preset=presetId==="default"?void 0:def.presets[presetId],copy={...DEFAULT_COPY};for(let layer of[def.copy,preset,opts])if(layer)for(let k of COPY_KEYS){let v=layer[k];v!=null&&(copy[k]=v)}return{preset:presetId,params:{...def.params,...preset?.params??{},...opts.params??{}},copy,theme:{...def.theme??{},...preset?.theme??{},...opts.theme??{}}}}function presetIds(def){return["default",...Object.keys(def.presets??{})]}export{defineScene,DEFAULT_COPY,resolve,presetIds};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import{SANS,textCanvas}from"./chunk-3ISI6SOJ.js";var KEYMAP={ArrowLeft:"left",KeyA:"left",ArrowRight:"right",KeyD:"right",ArrowUp:"up",KeyW:"up",ArrowDown:"down",KeyS:"down",Space:"action",Enter:"action"};function input(ctx,opts={}){let pressedFlag=!1,st={left:!1,right:!1,up:!1,down:!1,action:!1,playing:!1,swipe:null,pressed(){let p=pressedFlag;return pressedFlag=!1,p}},inEditable=()=>{let a=document.activeElement;return!!a&&(a.tagName==="INPUT"||a.tagName==="TEXTAREA"||a.isContentEditable)};ctx.onWindow("keydown",e=>{let k=KEYMAP[e.code];if(!k||!ctx.visible()||inEditable()||e.metaKey||e.ctrlKey)return;let r=ctx.root.getBoundingClientRect();r.top<innerHeight*.5&&r.bottom>innerHeight*.5&&e.preventDefault(),!st[k]&&k==="action"&&(pressedFlag=!0),!st[k]&&k==="up"&&(pressedFlag=!0),st[k]=!0,st.playing=!0}),ctx.onWindow("keyup",e=>{let k=KEYMAP[e.code];k&&(st[k]=!1)});let sx=0,sy=0;return ctx.on("pointerdown",e=>{e.target.closest("a,button")||(sx=e.clientX,sy=e.clientY,pressedFlag=!0,opts.pointerPlays!==!1&&(st.playing=!0))}),ctx.on("pointerup",e=>{let dx=e.clientX-sx,dy=e.clientY-sy;Math.hypot(dx,dy)>30&&(st.swipe=Math.abs(dx)>Math.abs(dy)?dx>0?"right":"left":dy>0?"down":"up")}),opts.pointerPlays&&ctx.on("pointermove",()=>st.playing=!0),st}function codeBitmap(code,cols,rows,weight=900){let d=textCanvas(code,{width:cols,height:rows,font:SANS,weight,fit:1}).getContext("2d").getImageData(0,0,cols,rows).data,out=[];for(let i=0;i<cols*rows;i++)out.push(d[i*4+3]>120);return out}var PIXEL_FONT='"Press Start 2P","Silkscreen","VT323",ui-monospace,SFMono-Regular,Menlo,monospace';function hud(g,text,x,y,size,color,align="left"){g.font=`700 ${size}px ${PIXEL_FONT}`,g.textAlign=align,g.textBaseline="top",g.fillStyle=color,g.fillText(text,x,y)}function loadHigh(key){try{return Number(localStorage.getItem(`lostpage:${key}`)||0)}catch{return 0}}function saveHigh(key,v){try{localStorage.setItem(`lostpage:${key}`,String(v))}catch{}}var GAME_CSS=`& .lp-title{--lp-title-size:clamp(22px,2.6vw,34px)}
|
|
2
|
+
& .lp-message{margin-top:8px}
|
|
3
|
+
& .lp-actions{margin-top:16px}
|
|
4
|
+
& .lp-eyebrow{font-family:var(--lp-font-mono);letter-spacing:.2em}`;export{input,codeBitmap,PIXEL_FONT,hud,loadHigh,saveHigh,GAME_CSS};
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import{__export}from"./chunk-7XMDQMDO.js";var glsl_exports={};__export(glsl_exports,{HASH:()=>HASH,NOISE:()=>NOISE,POST:()=>POST,SDF2:()=>SDF2,SIMPLEX:()=>SIMPLEX});var HASH=`
|
|
2
|
+
float hash11(float p){ p = fract(p * .1031); p *= p + 33.33; p *= p + p; return fract(p); }
|
|
3
|
+
float hash12(vec2 p){ vec3 p3 = fract(vec3(p.xyx) * .1031); p3 += dot(p3, p3.yzx + 33.33); return fract((p3.x + p3.y) * p3.z); }
|
|
4
|
+
vec2 hash22(vec2 p){ vec3 p3 = fract(vec3(p.xyx) * vec3(.1031, .1030, .0973)); p3 += dot(p3, p3.yzx + 33.33); return fract((p3.xx + p3.yz) * p3.zy); }
|
|
5
|
+
vec3 hash32(vec2 p){ vec3 p3 = fract(vec3(p.xyx) * vec3(.1031, .1030, .0973)); p3 += dot(p3, p3.yxz + 33.33); return fract((p3.xxy + p3.yzz) * p3.zyx); }
|
|
6
|
+
float hash13(vec3 p3){ p3 = fract(p3 * .1031); p3 += dot(p3, p3.zyx + 31.32); return fract((p3.x + p3.y) * p3.z); }
|
|
7
|
+
`,NOISE=`
|
|
8
|
+
float vnoise(vec2 p){
|
|
9
|
+
vec2 i = floor(p), f = fract(p);
|
|
10
|
+
vec2 u = f * f * (3.0 - 2.0 * f);
|
|
11
|
+
return mix(mix(hash12(i), hash12(i + vec2(1,0)), u.x), mix(hash12(i + vec2(0,1)), hash12(i + vec2(1,1)), u.x), u.y);
|
|
12
|
+
}
|
|
13
|
+
float vnoise3(vec3 p){
|
|
14
|
+
vec3 i = floor(p), f = fract(p);
|
|
15
|
+
vec3 u = f * f * (3.0 - 2.0 * f);
|
|
16
|
+
return mix(mix(mix(hash13(i), hash13(i + vec3(1,0,0)), u.x), mix(hash13(i + vec3(0,1,0)), hash13(i + vec3(1,1,0)), u.x), u.y),
|
|
17
|
+
mix(mix(hash13(i + vec3(0,0,1)), hash13(i + vec3(1,0,1)), u.x), mix(hash13(i + vec3(0,1,1)), hash13(i + vec3(1,1,1)), u.x), u.y), u.z);
|
|
18
|
+
}
|
|
19
|
+
float fbm(vec2 p){ float a = .5, s = 0.; mat2 r = mat2(.8, -.6, .6, .8); for(int i = 0; i < 6; i++){ s += a * vnoise(p); p = r * p * 2.03 + 11.7; a *= .5; } return s; }
|
|
20
|
+
float fbm3(vec3 p){ float a = .5, s = 0.; for(int i = 0; i < 5; i++){ s += a * vnoise3(p); p = p * 2.02 + vec3(13.1, 7.7, 3.3); a *= .5; } return s; }
|
|
21
|
+
`,SIMPLEX=`
|
|
22
|
+
vec3 _sxp(vec3 x){ return mod(((x * 34.0) + 1.0) * x, 289.0); }
|
|
23
|
+
float snoise(vec2 v){
|
|
24
|
+
const vec4 C = vec4(0.211324865405187, 0.366025403784439, -0.577350269189626, 0.024390243902439);
|
|
25
|
+
vec2 i = floor(v + dot(v, C.yy));
|
|
26
|
+
vec2 x0 = v - i + dot(i, C.xx);
|
|
27
|
+
vec2 i1 = (x0.x > x0.y) ? vec2(1.0, 0.0) : vec2(0.0, 1.0);
|
|
28
|
+
vec4 x12 = x0.xyxy + C.xxzz; x12.xy -= i1;
|
|
29
|
+
i = mod(i, 289.0);
|
|
30
|
+
vec3 p = _sxp(_sxp(i.y + vec3(0.0, i1.y, 1.0)) + i.x + vec3(0.0, i1.x, 1.0));
|
|
31
|
+
vec3 m = max(0.5 - vec3(dot(x0, x0), dot(x12.xy, x12.xy), dot(x12.zw, x12.zw)), 0.0);
|
|
32
|
+
m = m * m; m = m * m;
|
|
33
|
+
vec3 x = 2.0 * fract(p * C.www) - 1.0;
|
|
34
|
+
vec3 h = abs(x) - 0.5;
|
|
35
|
+
vec3 ox = floor(x + 0.5);
|
|
36
|
+
vec3 a0 = x - ox;
|
|
37
|
+
m *= 1.79284291400159 - 0.85373472095314 * (a0 * a0 + h * h);
|
|
38
|
+
vec3 g; g.x = a0.x * x0.x + h.x * x0.y; g.yz = a0.yz * x12.xz + h.yz * x12.yw;
|
|
39
|
+
return 130.0 * dot(m, g);
|
|
40
|
+
}
|
|
41
|
+
`,POST=`
|
|
42
|
+
vec3 aces(vec3 x){ return clamp((x * (2.51 * x + 0.03)) / (x * (2.43 * x + 0.59) + 0.14), 0.0, 1.0); }
|
|
43
|
+
vec3 toSRGB(vec3 c){ c = max(c, vec3(0.0)); return mix(c * 12.92, 1.055 * pow(max(c, vec3(1e-6)), vec3(1.0 / 2.4)) - 0.055, step(0.0031308, c)); }
|
|
44
|
+
vec3 toLinear(vec3 c){ return pow(max(c, vec3(1e-6)), vec3(2.2)); }
|
|
45
|
+
float grain(vec2 fc, float t){ return fract(sin(dot(fc + fract(t) * 91.7, vec2(12.9898, 78.233))) * 43758.5453) - 0.5; }
|
|
46
|
+
float vignette(vec2 uv, float k){ uv = uv * (1.0 - uv.yx); return pow(max(uv.x * uv.y * 16.0, 1e-5), k); }
|
|
47
|
+
`,SDF2=`
|
|
48
|
+
float sdBox(vec2 p, vec2 b){ vec2 d = abs(p) - b; return length(max(d, 0.0)) + min(max(d.x, d.y), 0.0); }
|
|
49
|
+
float sdRoundBox(vec2 p, vec2 b, float r){ return sdBox(p, b - r) - r; }
|
|
50
|
+
float sdSeg(vec2 p, vec2 a, vec2 b){ vec2 pa = p - a, ba = b - a; float h = clamp(dot(pa, ba) / dot(ba, ba), 0.0, 1.0); return length(pa - ba * h); }
|
|
51
|
+
float sdCircle(vec2 p, float r){ return length(p) - r; }
|
|
52
|
+
float sdTrap(vec2 p, float r1, float r2, float he){
|
|
53
|
+
vec2 k1 = vec2(r2, he); vec2 k2 = vec2(r2 - r1, 2.0 * he);
|
|
54
|
+
p.x = abs(p.x);
|
|
55
|
+
vec2 ca = vec2(p.x - min(p.x, (p.y < 0.0) ? r1 : r2), abs(p.y) - he);
|
|
56
|
+
vec2 cb = p - k1 + k2 * clamp(dot(k1 - p, k2) / dot(k2, k2), 0.0, 1.0);
|
|
57
|
+
float s = (cb.x < 0.0 && ca.y < 0.0) ? -1.0 : 1.0;
|
|
58
|
+
return s * sqrt(min(dot(ca, ca), dot(cb, cb)));
|
|
59
|
+
}
|
|
60
|
+
mat2 rot(float a){ float c = cos(a), s = sin(a); return mat2(c, -s, s, c); }
|
|
61
|
+
`;var gl_exports={};__export(gl_exports,{FS_PRELUDE:()=>FS_PRELUDE,FULLSCREEN_VS:()=>FULLSCREEN_VS,dataTexture:()=>dataTexture,getGL:()=>getGL,pass:()=>pass,program:()=>program,swapTargets:()=>swapTargets,target:()=>target,texture:()=>texture,updateTexture:()=>updateTexture});function getGL(canvas,attrs={}){let gl=canvas.getContext("webgl2",{alpha:!1,antialias:!1,depth:!1,stencil:!1,premultipliedAlpha:!0,powerPreference:"high-performance",preserveDrawingBuffer:!1,...attrs});if(!gl)throw new Error("WebGL2 unavailable");return canvas.__lpgl=gl,gl}var FULLSCREEN_VS=`#version 300 es
|
|
62
|
+
in vec2 aPos;
|
|
63
|
+
out vec2 vUv;
|
|
64
|
+
void main(){ vUv = aPos * 0.5 + 0.5; gl_Position = vec4(aPos, 0.0, 1.0); }`,FS_PRELUDE=`#version 300 es
|
|
65
|
+
precision highp float;
|
|
66
|
+
precision highp int;
|
|
67
|
+
in vec2 vUv;
|
|
68
|
+
out vec4 fragColor;
|
|
69
|
+
uniform vec2 uRes;
|
|
70
|
+
uniform float uTime;
|
|
71
|
+
uniform vec2 uMouse;
|
|
72
|
+
`;function compileShader(gl,type,src){let sh=gl.createShader(type);if(gl.shaderSource(sh,src),gl.compileShader(sh),!gl.getShaderParameter(sh,gl.COMPILE_STATUS)){let log=gl.getShaderInfoLog(sh)??"",lines=src.split(`
|
|
73
|
+
`),m=log.match(/ERROR: \d+:(\d+)/),at=m?+m[1]:0,excerpt=at?lines.slice(Math.max(0,at-3),at+2).map((l,i)=>`${at-2+i}: ${l}`).join(`
|
|
74
|
+
`):"";throw gl.deleteShader(sh),new Error(`[lostpage] shader compile failed: ${log}
|
|
75
|
+
${excerpt}`)}return sh}function program(gl,vs,fs){let p=gl.createProgram();if(gl.attachShader(p,compileShader(gl,gl.VERTEX_SHADER,vs)),gl.attachShader(p,compileShader(gl,gl.FRAGMENT_SHADER,fs)),gl.bindAttribLocation(p,0,"aPos"),gl.linkProgram(p),!gl.getProgramParameter(p,gl.LINK_STATUS))throw new Error(`[lostpage] link failed: ${gl.getProgramInfoLog(p)}`);return p}var triangles=new WeakMap;function fullscreenVAO(gl){let vao=triangles.get(gl);if(vao)return vao;vao=gl.createVertexArray(),gl.bindVertexArray(vao);let buf=gl.createBuffer();return gl.bindBuffer(gl.ARRAY_BUFFER,buf),gl.bufferData(gl.ARRAY_BUFFER,new Float32Array([-1,-1,3,-1,-1,3]),gl.STATIC_DRAW),gl.enableVertexAttribArray(0),gl.vertexAttribPointer(0,2,gl.FLOAT,!1,0,0),gl.bindVertexArray(null),triangles.set(gl,vao),vao}function target(gl,w,h,o={}){o.float&&gl.getExtension("EXT_color_buffer_float"),o.float&&gl.getExtension("OES_texture_float_linear");let tex=gl.createTexture(),fbo=gl.createFramebuffer(),filter=o.filter==="nearest"?gl.NEAREST:gl.LINEAR,wrap=o.wrap==="repeat"?gl.REPEAT:gl.CLAMP_TO_EDGE,ch=o.channels??4,half=o.half??!0,fmt=ch===1?gl.RED:ch===2?gl.RG:gl.RGBA,internal=o.float?half?ch===1?gl.R16F:ch===2?gl.RG16F:gl.RGBA16F:ch===1?gl.R32F:ch===2?gl.RG32F:gl.RGBA32F:ch===1?gl.R8:ch===2?gl.RG8:gl.RGBA8,type=o.float?half?gl.HALF_FLOAT:gl.FLOAT:gl.UNSIGNED_BYTE,t={fbo,tex,width:0,height:0,resize(nw,nh){nw=Math.max(1,Math.round(nw)),nh=Math.max(1,Math.round(nh)),!(nw===t.width&&nh===t.height)&&(t.width=nw,t.height=nh,gl.bindTexture(gl.TEXTURE_2D,tex),gl.texImage2D(gl.TEXTURE_2D,0,internal,nw,nh,0,fmt,type,null),gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MIN_FILTER,filter),gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MAG_FILTER,filter),gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_WRAP_S,wrap),gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_WRAP_T,wrap),gl.bindFramebuffer(gl.FRAMEBUFFER,fbo),gl.framebufferTexture2D(gl.FRAMEBUFFER,gl.COLOR_ATTACHMENT0,gl.TEXTURE_2D,tex,0),gl.viewport(0,0,nw,nh),gl.clearColor(0,0,0,0),gl.clear(gl.COLOR_BUFFER_BIT),gl.bindFramebuffer(gl.FRAMEBUFFER,null))}};return t.resize(w,h),t}function swapTargets(gl,w,h,o={}){let pair={read:target(gl,w,h,o),write:target(gl,w,h,o),swap(){let r=pair.read;pair.read=pair.write,pair.write=r},resize(nw,nh){pair.read.resize(nw,nh),pair.write.resize(nw,nh)}};return pair}function texture(gl,source,o={}){let tex=gl.createTexture();return updateTexture(gl,tex,source,o),tex}function updateTexture(gl,tex,source,o={}){gl.bindTexture(gl.TEXTURE_2D,tex),gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL,o.flipY??!0),gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!1),source?gl.texImage2D(gl.TEXTURE_2D,0,gl.RGBA,gl.RGBA,gl.UNSIGNED_BYTE,source):gl.texImage2D(gl.TEXTURE_2D,0,gl.RGBA,1,1,0,gl.RGBA,gl.UNSIGNED_BYTE,new Uint8Array([0,0,0,255]));let f=o.filter??"linear";gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MIN_FILTER,f==="nearest"?gl.NEAREST:f==="mipmap"?gl.LINEAR_MIPMAP_LINEAR:gl.LINEAR),gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MAG_FILTER,f==="nearest"?gl.NEAREST:gl.LINEAR);let w=o.wrap==="repeat"?gl.REPEAT:gl.CLAMP_TO_EDGE;gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_WRAP_S,w),gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_WRAP_T,w),f==="mipmap"&&source&&gl.generateMipmap(gl.TEXTURE_2D),gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL,!1)}function dataTexture(gl,data,w,h,channels=1,filter="linear"){let tex=gl.createTexture();gl.bindTexture(gl.TEXTURE_2D,tex),gl.pixelStorei(gl.UNPACK_ALIGNMENT,1),channels===1?gl.texImage2D(gl.TEXTURE_2D,0,gl.R16F,w,h,0,gl.RED,gl.FLOAT,data):gl.texImage2D(gl.TEXTURE_2D,0,gl.RGBA16F,w,h,0,gl.RGBA,gl.FLOAT,data);let f=filter==="linear"?gl.LINEAR:gl.NEAREST;return gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MIN_FILTER,f),gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MAG_FILTER,f),gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_WRAP_S,gl.CLAMP_TO_EDGE),gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_WRAP_T,gl.CLAMP_TO_EDGE),tex}function pass(gl,fs,vs=FULLSCREEN_VS){let src=fs.trimStart().startsWith("#version")?fs:FS_PRELUDE+fs,prog=program(gl,vs,src),vao=fullscreenVAO(gl),info=new Map,n=gl.getProgramParameter(prog,gl.ACTIVE_UNIFORMS),unit=0;for(let i=0;i<n;i++){let u=gl.getActiveUniform(prog,i),name=u.name.replace(/\[0\]$/,""),loc=gl.getUniformLocation(prog,u.name),isSampler=u.type===gl.SAMPLER_2D||u.type===gl.SAMPLER_3D||u.type===gl.SAMPLER_CUBE;info.set(name,{loc,type:u.type,unit:isSampler?unit++:-1})}function set(name,v){let u=info.get(name);if(!(!u||v===null||v===void 0))switch(u.type){case gl.FLOAT:return gl.uniform1f(u.loc,Number(v));case gl.INT:case gl.BOOL:return gl.uniform1i(u.loc,Number(v));case gl.FLOAT_VEC2:return gl.uniform2fv(u.loc,v);case gl.FLOAT_VEC3:return gl.uniform3fv(u.loc,v);case gl.FLOAT_VEC4:return gl.uniform4fv(u.loc,v);case gl.FLOAT_MAT3:return gl.uniformMatrix3fv(u.loc,!1,v);case gl.FLOAT_MAT4:return gl.uniformMatrix4fv(u.loc,!1,v);case gl.SAMPLER_2D:{gl.activeTexture(gl.TEXTURE0+u.unit);let tex=v.tex??v;return gl.bindTexture(gl.TEXTURE_2D,tex),gl.uniform1i(u.loc,u.unit)}}}return{program:prog,draw(uniforms={},to=null){gl.useProgram(prog);for(let k in uniforms)set(k,uniforms[k]);to?(gl.bindFramebuffer(gl.FRAMEBUFFER,to.fbo),gl.viewport(0,0,to.width,to.height),set("uRes",[to.width,to.height])):(gl.bindFramebuffer(gl.FRAMEBUFFER,null),gl.viewport(0,0,gl.drawingBufferWidth,gl.drawingBufferHeight),"uRes"in uniforms||set("uRes",[gl.drawingBufferWidth,gl.drawingBufferHeight])),gl.bindVertexArray(vao),gl.drawArrays(gl.TRIANGLES,0,3),gl.bindVertexArray(null)}}}export{HASH,NOISE,POST,glsl_exports,getGL,target,swapTargets,texture,updateTexture,dataTexture,pass,gl_exports};
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import{buildOverlay}from"./chunk-B2NBRLO2.js";import{clamp,damp,isBrowser,rng}from"./chunk-FVGCB66F.js";import{resolve}from"./chunk-KIYSQVWX.js";var BASE_CSS=`
|
|
2
|
+
.lp-root{
|
|
3
|
+
--lp-bg:#0b0d12;--lp-fg:#f5f6f8;--lp-muted:color-mix(in srgb,var(--lp-fg) 64%,transparent);
|
|
4
|
+
--lp-accent:var(--lp-fg);--lp-accent-fg:var(--lp-bg);
|
|
5
|
+
--lp-font:"Inter","Manrope",ui-sans-serif,system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;
|
|
6
|
+
--lp-font-display:var(--lp-font);
|
|
7
|
+
--lp-font-mono:"JetBrains Mono","IBM Plex Mono",ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
|
|
8
|
+
--lp-font-serif:"Fraunces","Playfair Display",ui-serif,Georgia,"Times New Roman",serif;
|
|
9
|
+
--lp-code-color:color-mix(in srgb,var(--lp-fg) 22%,transparent);
|
|
10
|
+
--lp-code-size:clamp(64px,23cqw,300px);--lp-code-weight:500;
|
|
11
|
+
--lp-title-size:clamp(22px,4.6cqw,58px);--lp-title-weight:500;
|
|
12
|
+
--lp-radius:999px;--lp-pad:clamp(14px,5cqw,72px);
|
|
13
|
+
position:relative;box-sizing:border-box;overflow:hidden;width:100%;
|
|
14
|
+
height:var(--lp-height,100vh);height:var(--lp-height,100dvh);
|
|
15
|
+
background:var(--lp-bg);color:var(--lp-fg);font-family:var(--lp-font);
|
|
16
|
+
isolation:isolate;container-type:size;container-name:lp;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;
|
|
17
|
+
text-rendering:optimizeLegibility;touch-action:manipulation;
|
|
18
|
+
}
|
|
19
|
+
.lp-root *,.lp-root *::before,.lp-root *::after{box-sizing:border-box}
|
|
20
|
+
.lp-root [hidden]{display:none!important}
|
|
21
|
+
.lp-stage{position:absolute;inset:0;z-index:0;overflow:hidden}
|
|
22
|
+
.lp-stage>canvas{position:absolute;inset:0;width:100%;height:100%;display:block}
|
|
23
|
+
.lp-custom{position:absolute;inset:0;z-index:3}
|
|
24
|
+
.lp-overlay{position:absolute;inset:0;z-index:2;display:flex;flex-direction:column;align-items:center;
|
|
25
|
+
justify-content:center;gap:clamp(12px,3cqh,32px);padding:var(--lp-pad) max(16px,var(--lp-pad));pointer-events:none}
|
|
26
|
+
.lp-overlay a,.lp-overlay button,.lp-overlay [data-lp-interactive]{pointer-events:auto}
|
|
27
|
+
.lp-head,.lp-body{display:flex;flex-direction:column;align-items:center;text-align:center;max-width:100%}
|
|
28
|
+
.lp-eyebrow{margin:0 0 6px;font-size:11px;font-weight:600;letter-spacing:.32em;text-transform:uppercase;color:var(--lp-muted)}
|
|
29
|
+
.lp-code{margin:0;font-family:var(--lp-font-display);font-weight:var(--lp-code-weight);font-size:var(--lp-code-size);
|
|
30
|
+
line-height:.86;letter-spacing:-.045em;color:var(--lp-code-color);user-select:none;white-space:nowrap}
|
|
31
|
+
.lp-title{margin:0;font-family:var(--lp-font-display);font-size:var(--lp-title-size);font-weight:var(--lp-title-weight);
|
|
32
|
+
letter-spacing:-.035em;line-height:1.04;text-wrap:balance}
|
|
33
|
+
.lp-message{margin:14px 0 0;max-width:36ch;color:var(--lp-muted);font-size:clamp(12.5px,1.25cqw,16px);line-height:1.6;text-wrap:pretty}
|
|
34
|
+
.lp-actions{margin-top:clamp(20px,3.2cqh,32px);display:flex;gap:10px 22px;flex-wrap:wrap;align-items:center;justify-content:center}
|
|
35
|
+
.lp-btn{display:inline-flex;align-items:center;gap:10px;font:inherit;font-size:13px;font-weight:500;letter-spacing:.01em;
|
|
36
|
+
text-decoration:none;cursor:pointer;border:0;transition:transform .25s cubic-bezier(.2,.8,.2,1),background .25s,color .25s,box-shadow .25s}
|
|
37
|
+
.lp-btn--primary{padding:13px 22px;border-radius:var(--lp-radius);background:var(--lp-accent);color:var(--lp-accent-fg)}
|
|
38
|
+
.lp-btn--primary:hover{transform:translateY(-1px);box-shadow:0 10px 30px -10px color-mix(in srgb,var(--lp-accent) 60%,transparent)}
|
|
39
|
+
.lp-btn--secondary{padding:13px 4px;background:none;color:var(--lp-fg);border-bottom:1px solid color-mix(in srgb,var(--lp-fg) 30%,transparent);border-radius:0}
|
|
40
|
+
.lp-btn--secondary:hover{border-bottom-color:var(--lp-fg)}
|
|
41
|
+
.lp-btn svg{width:14px;height:14px;flex:none;transition:transform .25s cubic-bezier(.2,.8,.2,1)}
|
|
42
|
+
.lp-btn:hover svg[data-dir=back]{transform:translateX(-3px)}
|
|
43
|
+
.lp-btn:hover svg[data-dir=arrow]{transform:translate(2px,-2px)}
|
|
44
|
+
.lp-btn:focus-visible{outline:2px solid var(--lp-accent);outline-offset:3px}
|
|
45
|
+
.lp-sr{position:absolute!important;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}
|
|
46
|
+
|
|
47
|
+
.lp-layout-split{justify-content:space-between}
|
|
48
|
+
.lp-layout-split .lp-head{padding-top:clamp(8px,4cqh,48px)}
|
|
49
|
+
.lp-layout-split .lp-body{padding-bottom:clamp(8px,3cqh,40px)}
|
|
50
|
+
.lp-layout-bottom{justify-content:flex-end}
|
|
51
|
+
.lp-layout-top{justify-content:flex-start}
|
|
52
|
+
.lp-layout-bottom-left{justify-content:flex-end;align-items:flex-start}
|
|
53
|
+
.lp-layout-bottom-left .lp-head,.lp-layout-bottom-left .lp-body,
|
|
54
|
+
.lp-layout-left .lp-head,.lp-layout-left .lp-body{align-items:flex-start;text-align:left}
|
|
55
|
+
.lp-layout-bottom-left .lp-actions,.lp-layout-left .lp-actions{justify-content:flex-start}
|
|
56
|
+
.lp-layout-left{align-items:flex-start;padding-left:max(16px,calc(var(--lp-pad) * 1.4))}
|
|
57
|
+
.lp-layout-right{align-items:flex-end}
|
|
58
|
+
.lp-layout-right .lp-head,.lp-layout-right .lp-body{align-items:flex-end;text-align:right}
|
|
59
|
+
.lp-layout-right .lp-actions{justify-content:flex-end}
|
|
60
|
+
.lp-layout-none .lp-head,.lp-layout-none .lp-body{display:none}
|
|
61
|
+
.lp-code-hidden .lp-code{position:absolute!important;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0)}
|
|
62
|
+
|
|
63
|
+
.lp-fadein .lp-head,.lp-fadein .lp-body{animation:lp-rise 1.1s cubic-bezier(.2,.8,.2,1) both}
|
|
64
|
+
.lp-fadein .lp-body{animation-delay:.18s}
|
|
65
|
+
@keyframes lp-rise{from{opacity:0;transform:translateY(14px)}to{opacity:1;transform:none}}
|
|
66
|
+
@container (max-width:640px){.lp-layout-left,.lp-layout-right{align-items:center}
|
|
67
|
+
.lp-layout-left .lp-head,.lp-layout-left .lp-body,.lp-layout-right .lp-head,.lp-layout-right .lp-body{align-items:center;text-align:center}
|
|
68
|
+
.lp-layout-left .lp-actions,.lp-layout-right .lp-actions{justify-content:center}}
|
|
69
|
+
@media (prefers-reduced-motion:reduce){.lp-fadein .lp-head,.lp-fadein .lp-body{animation:none}.lp-btn,.lp-btn svg{transition:none}}
|
|
70
|
+
`,injected=new Set;function inject(key,css){if(typeof document>"u"||injected.has(key))return;if(document.querySelector(`style[data-lostpage="${key}"]`)){injected.add(key);return}let el=document.createElement("style");el.setAttribute("data-lostpage",key),el.textContent=css,document.head.appendChild(el),injected.add(key)}function injectBase(){inject("base",BASE_CSS)}function injectScene(id,css){css&&inject(`scene:${id}`,css.replace(/&/g,`.lp-s-${id}`))}function mount(target,scene,options={}){let current=null,destroyed=!1,paused=!1,opts=options,def=typeof scene=="object"?scene:null,host=typeof target=="string"?isBrowser()?document.querySelector(target):null:target,start=()=>{destroyed||!def||!host||(current?.destroy(),current=createInstance(host,def,opts),paused&¤t.pause())},ready=(async()=>{if(!(!isBrowser()||!host)){if(!def){if(typeof scene=="string")throw new Error(`[lostpage] "lostpage/core" can't load "${scene}" by id. Import mount from "lostpage", or pass the scene object from "lostpage/scenes/${scene}".`);def=await scene()}start()}})();return ready.catch(e=>console.error(e)),{get root(){return current?.root??null},ready,update(next){let prev=opts;if(opts={...opts,...next},!current)return;["preset","params","motion","interactive","seed","maxDpr","overlay"].some(k=>k in next&&JSON.stringify(next[k])!==JSON.stringify(prev[k]))?start():current.refreshCopy(opts)},pause(){paused=!0,current?.pause()},resume(){paused=!1,current?.resume()},destroy(){destroyed=!0,current?.destroy(),current=null}}}function createInstance(host,def,opts){injectBase(),injectScene(def.id,def.css);let r=resolve(def,opts),root=document.createElement("div");root.className=`lp-root lp-s-${def.id} lp-p-${r.preset}${def.codeInScene?" lp-code-hidden":""}${opts.className?" "+opts.className:""}`,root.setAttribute("data-lostpage",def.id),opts.height&&root.style.setProperty("--lp-height",opts.height);let applyTheme=theme=>{for(let[k,v]of Object.entries(theme))root.style.setProperty(k.startsWith("--")?k:`--lp-${k}`,v)};applyTheme(r.theme);let stage=document.createElement("div");stage.className="lp-stage",stage.setAttribute("aria-hidden","true"),root.append(stage);let overlay=null;opts.overlay!==!1&&(overlay=buildOverlay(r.copy,def.layout,opts.onNavigate),root.append(overlay)),host.append(root);let reduceQuery=window.matchMedia?.("(prefers-reduced-motion: reduce)"),reducedMotion=opts.motion==="reduce"||opts.motion!=="full"&&!!reduceQuery?.matches,interactive=opts.interactive!==!1,maxDpr=opts.maxDpr??2,motionless=def.motion==="static"||reducedMotion&&def.motion!=="game",pointer={x:0,y:0,nx:0,ny:0,sx:0,sy:0,down:!1,inside:!1,engaged:!1},canvases=[],cleanups=[],width=0,height=0,dpr=1,quality=1,inView=!0,pageVisible=!document.hidden,pausedByUser=!1,raf=0,last=0,t=0,needsFrame=!0,instance={},failed=!1,ctx={root,stage,overlay,params:r.params,copy:r.copy,preset:r.preset,get width(){return width},get height(){return height},get dpr(){return dpr*quality},pointer,reducedMotion,interactive,random:rng(opts.seed??1337),canvas(o={}){let el=document.createElement("canvas");el.style.zIndex=String(o.z??0),stage.append(el);let mc={el,scale:o.scale??1,adaptive:!!o.adaptive};return canvases.push(mc),sizeCanvas(mc),el},on(type,fn,o){root.addEventListener(type,fn,o),cleanups.push(()=>root.removeEventListener(type,fn,o))},onWindow(type,fn,o){window.addEventListener(type,fn,o),cleanups.push(()=>window.removeEventListener(type,fn,o))},invalidate(){needsFrame=!0,!raf&&!failed&&schedule()},visible:()=>inView&&pageVisible,navigate(href,e){opts.onNavigate?opts.onNavigate(href,e??new MouseEvent("click")):location.assign(href)},cssVar:name=>getComputedStyle(root).getPropertyValue(name.startsWith("--")?name:`--lp-${name}`).trim()};function sizeCanvas(mc){let s=dpr*mc.scale*(mc.adaptive?quality:1),w=Math.max(1,Math.round(width*s)),h=Math.max(1,Math.round(height*s));(mc.el.width!==w||mc.el.height!==h)&&(mc.el.width=w,mc.el.height=h)}function measure(){let rect2=root.getBoundingClientRect();width=Math.max(1,Math.round(rect2.width)),height=Math.max(1,Math.round(rect2.height)),dpr=Math.min(window.devicePixelRatio||1,maxDpr);for(let mc of canvases)sizeCanvas(mc);try{instance.resize?.(width,height,dpr)}catch(e){fail(e)}ctx.invalidate()}if(interactive){let setPos=e=>{let rect2=root.getBoundingClientRect();pointer.x=e.clientX-rect2.left,pointer.y=e.clientY-rect2.top,pointer.nx=clamp(pointer.x/rect2.width*2-1,-1,1),pointer.ny=clamp(1-pointer.y/rect2.height*2,-1,1),pointer.engaged=!0};ctx.on("pointermove",e=>{setPos(e),pointer.inside=!0,motionless&&ctx.invalidate()}),ctx.on("pointerdown",e=>{setPos(e),pointer.down=!0,motionless&&ctx.invalidate()}),ctx.onWindow("pointerup",()=>{pointer.down=!1}),ctx.on("pointerleave",()=>{pointer.inside=!1})}function frame(now){if(raf=0,failed)return;let dt=last?Math.min((now-last)/1e3,1/20):1/60;last=now,pointer.sx=damp(pointer.sx,pointer.nx,3,dt),pointer.sy=damp(pointer.sy,pointer.ny,3,dt),motionless?(t=def.stillTime??4,pointer.sx=pointer.nx,pointer.sy=pointer.ny):t+=dt;try{instance.frame?.(t,motionless?0:dt)}catch(e){fail(e);return}motionless||govern(dt),needsFrame=!1,motionless||schedule()}function schedule(){raf||failed||pausedByUser||!(inView&&pageVisible)||motionless&&!needsFrame||(raf=requestAnimationFrame(frame))}let acc=0,frames=0,warmup=1.5;function govern(dt){if(!canvases.some(c=>c.adaptive))return;if(warmup>0){warmup-=dt;return}if(acc+=dt,frames++,acc<1)return;let avg=acc/frames;acc=0,frames=0;let next=quality;if(avg>1/45?next=Math.max(.5,quality*.85):avg<1/58&&quality<1&&(next=Math.min(1,quality*1.08)),Math.abs(next-quality)>.01){quality=next;for(let mc of canvases)mc.adaptive&&sizeCanvas(mc);instance.resize?.(width,height,dpr)}}function fail(e){failed=!0,raf&&cancelAnimationFrame(raf),raf=0,root.classList.add("lp-fallback");for(let mc of canvases)mc.el.style.display="none";console.warn(`[lostpage] scene "${def.id}" could not render, showing text only.`,e)}let io=new IntersectionObserver(entries=>{inView=entries[entries.length-1].isIntersecting,inView&&(last=0,schedule())});io.observe(root);let onVis=()=>{pageVisible=!document.hidden,pageVisible&&(last=0,schedule())};document.addEventListener("visibilitychange",onVis);let ro=new ResizeObserver(()=>measure());ro.observe(root);let rect=root.getBoundingClientRect();width=Math.max(1,Math.round(rect.width)),height=Math.max(1,Math.round(rect.height)),dpr=Math.min(window.devicePixelRatio||1,maxDpr);try{instance=def.setup(ctx)||{},instance.resize?.(width,height,dpr)}catch(e){fail(e)}return schedule(),{root,pause(){pausedByUser=!0,raf&&cancelAnimationFrame(raf),raf=0},resume(){pausedByUser=!1,last=0,schedule()},refreshCopy(next){let nr=resolve(def,next);if(applyTheme(nr.theme),overlay){let fresh=buildOverlay(nr.copy,def.layout,next.onNavigate);fresh.classList.remove("lp-fadein"),overlay.replaceWith(fresh),overlay=fresh,ctx.overlay=fresh}Object.assign(ctx.copy,nr.copy)},destroy(){raf&&cancelAnimationFrame(raf),raf=0,failed=!0,io.disconnect(),ro.disconnect(),document.removeEventListener("visibilitychange",onVis);for(let c of cleanups)c();try{instance.destroy?.()}catch{}for(let mc of canvases)mc.el.__lpgl?.getExtension("WEBGL_lose_context")?.loseContext();root.remove()}}}export{mount};
|