1681-engine 0.0.0-stage → 0.5.8
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/CHANGELOG.md +304 -0
- package/LICENSE +21 -0
- package/README.md +164 -2
- package/dist/1681-engine.js +417 -0
- package/dist/1681-engine.js.map +1 -0
- package/dist/ambient/ColorGrade.js +41 -0
- package/dist/ambient/ColorGrade.js.map +1 -0
- package/dist/ambient/DayClock.js +57 -0
- package/dist/ambient/DayClock.js.map +1 -0
- package/dist/ambient/WeatherLayer.js +91 -0
- package/dist/ambient/WeatherLayer.js.map +1 -0
- package/dist/ambient/grade.js +13 -0
- package/dist/ambient/grade.js.map +1 -0
- package/dist/ambient/weather.js +52 -0
- package/dist/ambient/weather.js.map +1 -0
- package/dist/anim/AnimStateMachine.js +164 -0
- package/dist/anim/AnimStateMachine.js.map +1 -0
- package/dist/anim/Animator.js +67 -0
- package/dist/anim/Animator.js.map +1 -0
- package/dist/anim/animStateCompile.js +113 -0
- package/dist/anim/animStateCompile.js.map +1 -0
- package/dist/anim/animStateSystem.js +17 -0
- package/dist/anim/animStateSystem.js.map +1 -0
- package/dist/anim/animationSystem.js +15 -0
- package/dist/anim/animationSystem.js.map +1 -0
- package/dist/anim/asepriteSlices.js +22 -0
- package/dist/anim/asepriteSlices.js.map +1 -0
- package/dist/anim/asepriteTags.js +35 -0
- package/dist/anim/asepriteTags.js.map +1 -0
- package/dist/anim/parseAseprite.js +83 -0
- package/dist/anim/parseAseprite.js.map +1 -0
- package/dist/assets/AssetLoader.js +104 -0
- package/dist/assets/AssetLoader.js.map +1 -0
- package/dist/assets/loadAseprite.js +50 -0
- package/dist/assets/loadAseprite.js.map +1 -0
- package/dist/assets/takeCleanerWorker-DTcI_Jqr.js +31 -0
- package/dist/assets/takeCleanerWorker-DTcI_Jqr.js.map +1 -0
- package/dist/audio/Footsteps.js +26 -0
- package/dist/audio/Footsteps.js.map +1 -0
- package/dist/audio/MusicPlayer.js +78 -0
- package/dist/audio/MusicPlayer.js.map +1 -0
- package/dist/audio/SoundEngine.js +119 -0
- package/dist/audio/SoundEngine.js.map +1 -0
- package/dist/audio/cleanTake.js +30 -0
- package/dist/audio/cleanTake.js.map +1 -0
- package/dist/audio/music/ElementVoice.js +35 -0
- package/dist/audio/music/ElementVoice.js.map +1 -0
- package/dist/audio/music/GraphVoice.js +39 -0
- package/dist/audio/music/GraphVoice.js.map +1 -0
- package/dist/audio/music/MusicChannel.js +58 -0
- package/dist/audio/music/MusicChannel.js.map +1 -0
- package/dist/audio/music/musicVoice.js +13 -0
- package/dist/audio/music/musicVoice.js.map +1 -0
- package/dist/audio/sampleBank.js +82 -0
- package/dist/audio/sampleBank.js.map +1 -0
- package/dist/audio/soundTable.js +9 -0
- package/dist/audio/soundTable.js.map +1 -0
- package/dist/audio/synth.js +36 -0
- package/dist/audio/synth.js.map +1 -0
- package/dist/core/BitmapLabel.js +49 -0
- package/dist/core/BitmapLabel.js.map +1 -0
- package/dist/core/Camera.js +150 -0
- package/dist/core/Camera.js.map +1 -0
- package/dist/core/Clock.js +30 -0
- package/dist/core/Clock.js.map +1 -0
- package/dist/core/Graphics.js +69 -0
- package/dist/core/Graphics.js.map +1 -0
- package/dist/core/Group.js +29 -0
- package/dist/core/Group.js.map +1 -0
- package/dist/core/Image.js +51 -0
- package/dist/core/Image.js.map +1 -0
- package/dist/core/ObjectFactory.js +55 -0
- package/dist/core/ObjectFactory.js.map +1 -0
- package/dist/core/Pointer.js +58 -0
- package/dist/core/Pointer.js.map +1 -0
- package/dist/core/Rectangle.js +51 -0
- package/dist/core/Rectangle.js.map +1 -0
- package/dist/core/Stage.js +86 -0
- package/dist/core/Stage.js.map +1 -0
- package/dist/core/Text.js +22 -0
- package/dist/core/Text.js.map +1 -0
- package/dist/core/TextureRegistry.js +111 -0
- package/dist/core/TextureRegistry.js.map +1 -0
- package/dist/core/Timeline.js +211 -0
- package/dist/core/Timeline.js.map +1 -0
- package/dist/core/TimelineBuilder.js +73 -0
- package/dist/core/TimelineBuilder.js.map +1 -0
- package/dist/core/TimelineChild.js +84 -0
- package/dist/core/TimelineChild.js.map +1 -0
- package/dist/core/Tweener.js +136 -0
- package/dist/core/Tweener.js.map +1 -0
- package/dist/core/atlas.js +38 -0
- package/dist/core/atlas.js.map +1 -0
- package/dist/core/atlasPlan.js +22 -0
- package/dist/core/atlasPlan.js.map +1 -0
- package/dist/core/eases.js +21 -0
- package/dist/core/eases.js.map +1 -0
- package/dist/core/gameObject.js +115 -0
- package/dist/core/gameObject.js.map +1 -0
- package/dist/core/pixiPatches.js +18 -0
- package/dist/core/pixiPatches.js.map +1 -0
- package/dist/core/timelinePlace.js +24 -0
- package/dist/core/timelinePlace.js.map +1 -0
- package/dist/core/tweenProps.js +12 -0
- package/dist/core/tweenProps.js.map +1 -0
- package/dist/debug/DebugOverlay.js +94 -0
- package/dist/debug/DebugOverlay.js.map +1 -0
- package/dist/debug/DrawCallCounter.js +41 -0
- package/dist/debug/DrawCallCounter.js.map +1 -0
- package/dist/debug/ErrorLog.js +22 -0
- package/dist/debug/ErrorLog.js.map +1 -0
- package/dist/debug/FrameStats.js +42 -0
- package/dist/debug/FrameStats.js.map +1 -0
- package/dist/debug/inspectWorld.js +29 -0
- package/dist/debug/inspectWorld.js.map +1 -0
- package/dist/diagnostics/ErrorDeduper.js +27 -0
- package/dist/diagnostics/ErrorDeduper.js.map +1 -0
- package/dist/diagnostics/FrameSampler.js +42 -0
- package/dist/diagnostics/FrameSampler.js.map +1 -0
- package/dist/diagnostics/bootWatch.js +21 -0
- package/dist/diagnostics/bootWatch.js.map +1 -0
- package/dist/diagnostics/captureErrors.js +27 -0
- package/dist/diagnostics/captureErrors.js.map +1 -0
- package/dist/diagnostics/contextLoss.js +25 -0
- package/dist/diagnostics/contextLoss.js.map +1 -0
- package/dist/diagnostics/frameStats.js +31 -0
- package/dist/diagnostics/frameStats.js.map +1 -0
- package/dist/diagnostics/gpuInfo.js +22 -0
- package/dist/diagnostics/gpuInfo.js.map +1 -0
- package/dist/diagnostics/renderGuard.js +24 -0
- package/dist/diagnostics/renderGuard.js.map +1 -0
- package/dist/ecs/SparseSet.js +55 -0
- package/dist/ecs/SparseSet.js.map +1 -0
- package/dist/ecs/World.js +307 -0
- package/dist/ecs/World.js.map +1 -0
- package/dist/ecs/fields.js +26 -0
- package/dist/ecs/fields.js.map +1 -0
- package/dist/engine/Engine.js +82 -0
- package/dist/engine/Engine.js.map +1 -0
- package/dist/engine/FixedLoop.js +37 -0
- package/dist/engine/FixedLoop.js.map +1 -0
- package/dist/engine/Scene.js +79 -0
- package/dist/engine/Scene.js.map +1 -0
- package/dist/engine/SceneManager.js +73 -0
- package/dist/engine/SceneManager.js.map +1 -0
- package/dist/events/EventBus.js +42 -0
- package/dist/events/EventBus.js.map +1 -0
- package/dist/fx/FloatingText.js +72 -0
- package/dist/fx/FloatingText.js.map +1 -0
- package/dist/fx/hitStop.js +28 -0
- package/dist/fx/hitStop.js.map +1 -0
- package/dist/fx/viewCull.js +10 -0
- package/dist/fx/viewCull.js.map +1 -0
- package/dist/i18n/Translator.js +72 -0
- package/dist/i18n/Translator.js.map +1 -0
- package/dist/i18n/extractStrings.js +58 -0
- package/dist/i18n/extractStrings.js.map +1 -0
- package/dist/i18n/formatMessage.js +19 -0
- package/dist/i18n/formatMessage.js.map +1 -0
- package/dist/input/Actions.js +131 -0
- package/dist/input/Actions.js.map +1 -0
- package/dist/input/AimGesture.js +75 -0
- package/dist/input/AimGesture.js.map +1 -0
- package/dist/input/Keyboard.js +54 -0
- package/dist/input/Keyboard.js.map +1 -0
- package/dist/input/Keymap.js +171 -0
- package/dist/input/Keymap.js.map +1 -0
- package/dist/input/TargetLock.js +73 -0
- package/dist/input/TargetLock.js.map +1 -0
- package/dist/input/aimAxis.js +8 -0
- package/dist/input/aimAxis.js.map +1 -0
- package/dist/input/keyChord.js +29 -0
- package/dist/input/keyChord.js.map +1 -0
- package/dist/input/longPress.js +32 -0
- package/dist/input/longPress.js.map +1 -0
- package/dist/input/stickAxis.js +23 -0
- package/dist/input/stickAxis.js.map +1 -0
- package/dist/input/touchDetect.js +7 -0
- package/dist/input/touchDetect.js.map +1 -0
- package/dist/light/LightLayer.js +84 -0
- package/dist/light/LightLayer.js.map +1 -0
- package/dist/nav/MinHeap.js +39 -0
- package/dist/nav/MinHeap.js.map +1 -0
- package/dist/nav/findPath.js +78 -0
- package/dist/nav/findPath.js.map +1 -0
- package/dist/nav/navGrid.js +36 -0
- package/dist/nav/navGrid.js.map +1 -0
- package/dist/nav/nearestOpen.js +19 -0
- package/dist/nav/nearestOpen.js.map +1 -0
- package/dist/nav/straightenPath.js +51 -0
- package/dist/nav/straightenPath.js.map +1 -0
- package/dist/net/Connection.js +84 -0
- package/dist/net/Connection.js.map +1 -0
- package/dist/net/InterpolationBuffer.js +57 -0
- package/dist/net/InterpolationBuffer.js.map +1 -0
- package/dist/net/PredictedMover.js +61 -0
- package/dist/net/PredictedMover.js.map +1 -0
- package/dist/net/Room.js +92 -0
- package/dist/net/Room.js.map +1 -0
- package/dist/net/RoomHost.js +101 -0
- package/dist/net/RoomHost.js.map +1 -0
- package/dist/net/cadence.js +22 -0
- package/dist/net/cadence.js.map +1 -0
- package/dist/net/constants.js +11 -0
- package/dist/net/constants.js.map +1 -0
- package/dist/net/lobby/LobbyClient.js +124 -0
- package/dist/net/lobby/LobbyClient.js.map +1 -0
- package/dist/net/lobby/LobbyHost.js +366 -0
- package/dist/net/lobby/LobbyHost.js.map +1 -0
- package/dist/net/lobby/LobbyRooms.js +66 -0
- package/dist/net/lobby/LobbyRooms.js.map +1 -0
- package/dist/net/lobby/Matchmaker.js +106 -0
- package/dist/net/lobby/Matchmaker.js.map +1 -0
- package/dist/net/movement.js +83 -0
- package/dist/net/movement.js.map +1 -0
- package/dist/net/protocol.js +11 -0
- package/dist/net/protocol.js.map +1 -0
- package/dist/net/serverClock.js +22 -0
- package/dist/net/serverClock.js.map +1 -0
- package/dist/net/snapshotCodec.js +92 -0
- package/dist/net/snapshotCodec.js.map +1 -0
- package/dist/parallax/Parallax.js +32 -0
- package/dist/parallax/Parallax.js.map +1 -0
- package/dist/parallax/ParallaxLayer.js +70 -0
- package/dist/parallax/ParallaxLayer.js.map +1 -0
- package/dist/parallax/parallaxMath.js +27 -0
- package/dist/parallax/parallaxMath.js.map +1 -0
- package/dist/particles/Emitter.js +108 -0
- package/dist/particles/Emitter.js.map +1 -0
- package/dist/particles/ParticleBudget.js +32 -0
- package/dist/particles/ParticleBudget.js.map +1 -0
- package/dist/particles/ParticleSim.js +60 -0
- package/dist/particles/ParticleSim.js.map +1 -0
- package/dist/particles/particleCurves.js +48 -0
- package/dist/particles/particleCurves.js.map +1 -0
- package/dist/particles/particleSampling.js +30 -0
- package/dist/particles/particleSampling.js.map +1 -0
- package/dist/physics/Body.js +202 -0
- package/dist/physics/Body.js.map +1 -0
- package/dist/physics/BroadPhase.js +56 -0
- package/dist/physics/BroadPhase.js.map +1 -0
- package/dist/physics/Contact.js +76 -0
- package/dist/physics/Contact.js.map +1 -0
- package/dist/physics/ContactSolver.js +70 -0
- package/dist/physics/ContactSolver.js.map +1 -0
- package/dist/physics/PhysicsWorld.js +221 -0
- package/dist/physics/PhysicsWorld.js.map +1 -0
- package/dist/physics/SpatialHash.js +39 -0
- package/dist/physics/SpatialHash.js.map +1 -0
- package/dist/physics/collide.js +76 -0
- package/dist/physics/collide.js.map +1 -0
- package/dist/physics/collidePolygon.js +94 -0
- package/dist/physics/collidePolygon.js.map +1 -0
- package/dist/physics/contactReport.js +14 -0
- package/dist/physics/contactReport.js.map +1 -0
- package/dist/physics/drawColliders.js +31 -0
- package/dist/physics/drawColliders.js.map +1 -0
- package/dist/physics/physicsSystem.js +8 -0
- package/dist/physics/physicsSystem.js.map +1 -0
- package/dist/physics/polygon.js +80 -0
- package/dist/physics/polygon.js.map +1 -0
- package/dist/physics/raycast.js +62 -0
- package/dist/physics/raycast.js.map +1 -0
- package/dist/physics/syncToBody.js +19 -0
- package/dist/physics/syncToBody.js.map +1 -0
- package/dist/physics/tileBodies.js +59 -0
- package/dist/physics/tileBodies.js.map +1 -0
- package/dist/physics/types.js +8 -0
- package/dist/physics/types.js.map +1 -0
- package/dist/pixel/Darkness.js +166 -0
- package/dist/pixel/Darkness.js.map +1 -0
- package/dist/pixel/DitherVignette.js +57 -0
- package/dist/pixel/DitherVignette.js.map +1 -0
- package/dist/pixel/Evaporation.js +85 -0
- package/dist/pixel/Evaporation.js.map +1 -0
- package/dist/pixel/NightShade.js +34 -0
- package/dist/pixel/NightShade.js.map +1 -0
- package/dist/pixel/PixelLayer.js +211 -0
- package/dist/pixel/PixelLayer.js.map +1 -0
- package/dist/pixel/SwayProp.js +75 -0
- package/dist/pixel/SwayProp.js.map +1 -0
- package/dist/pixel/lights.js +44 -0
- package/dist/pixel/lights.js.map +1 -0
- package/dist/pixel/nineSlice.js +62 -0
- package/dist/pixel/nineSlice.js.map +1 -0
- package/dist/pixel/paintLayer.js +36 -0
- package/dist/pixel/paintLayer.js.map +1 -0
- package/dist/pixel/palette.js +57 -0
- package/dist/pixel/palette.js.map +1 -0
- package/dist/pixel/pixel.js +278 -0
- package/dist/pixel/pixel.js.map +1 -0
- package/dist/pixel/pixelPaint.js +194 -0
- package/dist/pixel/pixelPaint.js.map +1 -0
- package/dist/pixel/pixelTone.js +164 -0
- package/dist/pixel/pixelTone.js.map +1 -0
- package/dist/pixel/propKit.js +41 -0
- package/dist/pixel/propKit.js.map +1 -0
- package/dist/pixel/ramp.js +102 -0
- package/dist/pixel/ramp.js.map +1 -0
- package/dist/pixel/selout.js +35 -0
- package/dist/pixel/selout.js.map +1 -0
- package/dist/pixel/spritePixels.js +59 -0
- package/dist/pixel/spritePixels.js.map +1 -0
- package/dist/pixel/swayRig.js +87 -0
- package/dist/pixel/swayRig.js.map +1 -0
- package/dist/pixel/vignetteMask.js +24 -0
- package/dist/pixel/vignetteMask.js.map +1 -0
- package/dist/pixel/weatherArt.js +61 -0
- package/dist/pixel/weatherArt.js.map +1 -0
- package/dist/pixel.js +90 -0
- package/dist/pixel.js.map +1 -0
- package/dist/platform/touch.js +33 -0
- package/dist/platform/touch.js.map +1 -0
- package/dist/postfx/BloomFilter.js +65 -0
- package/dist/postfx/BloomFilter.js.map +1 -0
- package/dist/postfx/ChromaticAberrationFilter.js +25 -0
- package/dist/postfx/ChromaticAberrationFilter.js.map +1 -0
- package/dist/postfx/ColorAdjustFilter.js +76 -0
- package/dist/postfx/ColorAdjustFilter.js.map +1 -0
- package/dist/postfx/CrtFilter.js +42 -0
- package/dist/postfx/CrtFilter.js.map +1 -0
- package/dist/postfx/PixelateFilter.js +27 -0
- package/dist/postfx/PixelateFilter.js.map +1 -0
- package/dist/postfx/PostFx.js +123 -0
- package/dist/postfx/PostFx.js.map +1 -0
- package/dist/postfx/ShockwaveFilter.js +49 -0
- package/dist/postfx/ShockwaveFilter.js.map +1 -0
- package/dist/postfx/VignetteFilter.js +37 -0
- package/dist/postfx/VignetteFilter.js.map +1 -0
- package/dist/postfx/fxAnimator.js +38 -0
- package/dist/postfx/fxAnimator.js.map +1 -0
- package/dist/postfx/fxShader.js +128 -0
- package/dist/postfx/fxShader.js.map +1 -0
- package/dist/postfx.js +26 -0
- package/dist/postfx.js.map +1 -0
- package/dist/react/ChoiceDialog.js +51 -0
- package/dist/react/ChoiceDialog.js.map +1 -0
- package/dist/react/ConfirmDialog.js +53 -0
- package/dist/react/ConfirmDialog.js.map +1 -0
- package/dist/react/Glyph.js +63 -0
- package/dist/react/Glyph.js.map +1 -0
- package/dist/react/Modal.js +38 -0
- package/dist/react/Modal.js.map +1 -0
- package/dist/react/Panel.js +24 -0
- package/dist/react/Panel.js.map +1 -0
- package/dist/react/PixelImage.js +24 -0
- package/dist/react/PixelImage.js.map +1 -0
- package/dist/react/Select.js +99 -0
- package/dist/react/Select.js.map +1 -0
- package/dist/react/Slider.js +62 -0
- package/dist/react/Slider.js.map +1 -0
- package/dist/react/SplitPane.js +24 -0
- package/dist/react/SplitPane.js.map +1 -0
- package/dist/react/TabStrip.js +32 -0
- package/dist/react/TabStrip.js.map +1 -0
- package/dist/react/TitleTips.js +42 -0
- package/dist/react/TitleTips.js.map +1 -0
- package/dist/react/Tooltip.js +28 -0
- package/dist/react/Tooltip.js.map +1 -0
- package/dist/react/UiProvider.js +50 -0
- package/dist/react/UiProvider.js.map +1 -0
- package/dist/react/baseCss.js +222 -0
- package/dist/react/baseCss.js.map +1 -0
- package/dist/react/choiceStore.js +23 -0
- package/dist/react/choiceStore.js.map +1 -0
- package/dist/react/classNames.js +19 -0
- package/dist/react/classNames.js.map +1 -0
- package/dist/react/confirmStore.js +30 -0
- package/dist/react/confirmStore.js.map +1 -0
- package/dist/react/labels.js +18 -0
- package/dist/react/labels.js.map +1 -0
- package/dist/react/placement.js +49 -0
- package/dist/react/placement.js.map +1 -0
- package/dist/react/useFillSheet.js +23 -0
- package/dist/react/useFillSheet.js.map +1 -0
- package/dist/react/useFitToViewport.js +29 -0
- package/dist/react/useFitToViewport.js.map +1 -0
- package/dist/react/usePicked.js +13 -0
- package/dist/react/usePicked.js.map +1 -0
- package/dist/react/useStore.js +9 -0
- package/dist/react/useStore.js.map +1 -0
- package/dist/react/useViewport.js +17 -0
- package/dist/react/useViewport.js.map +1 -0
- package/dist/react.js +78 -0
- package/dist/react.js.map +1 -0
- package/dist/rig/PosePlayer.js +92 -0
- package/dist/rig/PosePlayer.js.map +1 -0
- package/dist/rig/RigView.js +125 -0
- package/dist/rig/RigView.js.map +1 -0
- package/dist/rig/Skeleton.js +31 -0
- package/dist/rig/Skeleton.js.map +1 -0
- package/dist/rig/humanoid.js +6 -0
- package/dist/rig/humanoid.js.map +1 -0
- package/dist/rig/humanoid.json.js +30 -0
- package/dist/rig/humanoid.json.js.map +1 -0
- package/dist/rig/humanoidPoses.js +30 -0
- package/dist/rig/humanoidPoses.js.map +1 -0
- package/dist/rig/poseMath.js +54 -0
- package/dist/rig/poseMath.js.map +1 -0
- package/dist/rig/poses.json.js +150 -0
- package/dist/rig/poses.json.js.map +1 -0
- package/dist/save/Autosaver.js +54 -0
- package/dist/save/Autosaver.js.map +1 -0
- package/dist/save/MemoryBackend.js +19 -0
- package/dist/save/MemoryBackend.js.map +1 -0
- package/dist/save/SaveStore.js +103 -0
- package/dist/save/SaveStore.js.map +1 -0
- package/dist/save/WebStorageBackend.js +27 -0
- package/dist/save/WebStorageBackend.js.map +1 -0
- package/dist/save/checksum.js +10 -0
- package/dist/save/checksum.js.map +1 -0
- package/dist/save/migrateSave.js +27 -0
- package/dist/save/migrateSave.js.map +1 -0
- package/dist/settings.js +27 -0
- package/dist/settings.js.map +1 -0
- package/dist/tilemap/TilemapView.js +69 -0
- package/dist/tilemap/TilemapView.js.map +1 -0
- package/dist/tilemap/collision.js +25 -0
- package/dist/tilemap/collision.js.map +1 -0
- package/dist/tilemap/tiled.js +138 -0
- package/dist/tilemap/tiled.js.map +1 -0
- package/dist/transitions/CrossfadeTransition.js +24 -0
- package/dist/transitions/CrossfadeTransition.js.map +1 -0
- package/dist/transitions/DitherWipeTransition.js +70 -0
- package/dist/transitions/DitherWipeTransition.js.map +1 -0
- package/dist/transitions/FadeTransition.js +34 -0
- package/dist/transitions/FadeTransition.js.map +1 -0
- package/dist/transitions/Letterbox.js +42 -0
- package/dist/transitions/Letterbox.js.map +1 -0
- package/dist/transitions/ditherMask.js +15 -0
- package/dist/transitions/ditherMask.js.map +1 -0
- package/dist/transitions/transitionTo.js +28 -0
- package/dist/transitions/transitionTo.js.map +1 -0
- package/dist/transitions/tweenDone.js +15 -0
- package/dist/transitions/tweenDone.js.map +1 -0
- package/dist/types/ambient/ColorGrade.d.ts +41 -0
- package/dist/types/ambient/ColorGrade.d.ts.map +1 -0
- package/dist/types/ambient/DayClock.d.ts +80 -0
- package/dist/types/ambient/DayClock.d.ts.map +1 -0
- package/dist/types/ambient/WeatherLayer.d.ts +78 -0
- package/dist/types/ambient/WeatherLayer.d.ts.map +1 -0
- package/dist/types/ambient/grade.d.ts +22 -0
- package/dist/types/ambient/grade.d.ts.map +1 -0
- package/dist/types/ambient/weather.d.ts +49 -0
- package/dist/types/ambient/weather.d.ts.map +1 -0
- package/dist/types/anim/AnimStateMachine.d.ts +80 -0
- package/dist/types/anim/AnimStateMachine.d.ts.map +1 -0
- package/dist/types/anim/Animator.d.ts +50 -0
- package/dist/types/anim/Animator.d.ts.map +1 -0
- package/dist/types/anim/animStateCompile.d.ts +52 -0
- package/dist/types/anim/animStateCompile.d.ts.map +1 -0
- package/dist/types/anim/animStateSystem.d.ts +10 -0
- package/dist/types/anim/animStateSystem.d.ts.map +1 -0
- package/dist/types/anim/animStateTypes.d.ts +50 -0
- package/dist/types/anim/animStateTypes.d.ts.map +1 -0
- package/dist/types/anim/animationSystem.d.ts +13 -0
- package/dist/types/anim/animationSystem.d.ts.map +1 -0
- package/dist/types/anim/asepriteSlices.d.ts +19 -0
- package/dist/types/anim/asepriteSlices.d.ts.map +1 -0
- package/dist/types/anim/asepriteTags.d.ts +16 -0
- package/dist/types/anim/asepriteTags.d.ts.map +1 -0
- package/dist/types/anim/asepriteTypes.d.ts +159 -0
- package/dist/types/anim/asepriteTypes.d.ts.map +1 -0
- package/dist/types/anim/parseAseprite.d.ts +21 -0
- package/dist/types/anim/parseAseprite.d.ts.map +1 -0
- package/dist/types/assets/AssetLoader.d.ts +85 -0
- package/dist/types/assets/AssetLoader.d.ts.map +1 -0
- package/dist/types/assets/loadAseprite.d.ts +27 -0
- package/dist/types/assets/loadAseprite.d.ts.map +1 -0
- package/dist/types/audio/Footsteps.d.ts +33 -0
- package/dist/types/audio/Footsteps.d.ts.map +1 -0
- package/dist/types/audio/MusicPlayer.d.ts +65 -0
- package/dist/types/audio/MusicPlayer.d.ts.map +1 -0
- package/dist/types/audio/SoundEngine.d.ts +42 -0
- package/dist/types/audio/SoundEngine.d.ts.map +1 -0
- package/dist/types/audio/cleanTake.d.ts +3 -0
- package/dist/types/audio/cleanTake.d.ts.map +1 -0
- package/dist/types/audio/music/ElementVoice.d.ts +14 -0
- package/dist/types/audio/music/ElementVoice.d.ts.map +1 -0
- package/dist/types/audio/music/GraphVoice.d.ts +22 -0
- package/dist/types/audio/music/GraphVoice.d.ts.map +1 -0
- package/dist/types/audio/music/MusicChannel.d.ts +35 -0
- package/dist/types/audio/music/MusicChannel.d.ts.map +1 -0
- package/dist/types/audio/music/musicVoice.d.ts +26 -0
- package/dist/types/audio/music/musicVoice.d.ts.map +1 -0
- package/dist/types/audio/sampleBank.d.ts +27 -0
- package/dist/types/audio/sampleBank.d.ts.map +1 -0
- package/dist/types/audio/soundTable.d.ts +14 -0
- package/dist/types/audio/soundTable.d.ts.map +1 -0
- package/dist/types/audio/synth.d.ts +34 -0
- package/dist/types/audio/synth.d.ts.map +1 -0
- package/dist/types/audio/takeCleanerWorker.d.ts +2 -0
- package/dist/types/audio/takeCleanerWorker.d.ts.map +1 -0
- package/dist/types/core/BitmapLabel.d.ts +36 -0
- package/dist/types/core/BitmapLabel.d.ts.map +1 -0
- package/dist/types/core/Camera.d.ts +115 -0
- package/dist/types/core/Camera.d.ts.map +1 -0
- package/dist/types/core/Clock.d.ts +11 -0
- package/dist/types/core/Clock.d.ts.map +1 -0
- package/dist/types/core/Graphics.d.ts +37 -0
- package/dist/types/core/Graphics.d.ts.map +1 -0
- package/dist/types/core/Group.d.ts +15 -0
- package/dist/types/core/Group.d.ts.map +1 -0
- package/dist/types/core/Image.d.ts +25 -0
- package/dist/types/core/Image.d.ts.map +1 -0
- package/dist/types/core/ObjectFactory.d.ts +34 -0
- package/dist/types/core/ObjectFactory.d.ts.map +1 -0
- package/dist/types/core/Pointer.d.ts +27 -0
- package/dist/types/core/Pointer.d.ts.map +1 -0
- package/dist/types/core/Rectangle.d.ts +26 -0
- package/dist/types/core/Rectangle.d.ts.map +1 -0
- package/dist/types/core/Stage.d.ts +58 -0
- package/dist/types/core/Stage.d.ts.map +1 -0
- package/dist/types/core/Text.d.ts +22 -0
- package/dist/types/core/Text.d.ts.map +1 -0
- package/dist/types/core/TextureRegistry.d.ts +51 -0
- package/dist/types/core/TextureRegistry.d.ts.map +1 -0
- package/dist/types/core/Timeline.d.ts +115 -0
- package/dist/types/core/Timeline.d.ts.map +1 -0
- package/dist/types/core/TimelineBuilder.d.ts +53 -0
- package/dist/types/core/TimelineBuilder.d.ts.map +1 -0
- package/dist/types/core/TimelineChild.d.ts +51 -0
- package/dist/types/core/TimelineChild.d.ts.map +1 -0
- package/dist/types/core/Tweener.d.ts +70 -0
- package/dist/types/core/Tweener.d.ts.map +1 -0
- package/dist/types/core/atlas.d.ts +16 -0
- package/dist/types/core/atlas.d.ts.map +1 -0
- package/dist/types/core/atlasPlan.d.ts +34 -0
- package/dist/types/core/atlasPlan.d.ts.map +1 -0
- package/dist/types/core/eases.d.ts +3 -0
- package/dist/types/core/eases.d.ts.map +1 -0
- package/dist/types/core/gameObject.d.ts +42 -0
- package/dist/types/core/gameObject.d.ts.map +1 -0
- package/dist/types/core/pixiPatches.d.ts +9 -0
- package/dist/types/core/pixiPatches.d.ts.map +1 -0
- package/dist/types/core/timelinePlace.d.ts +23 -0
- package/dist/types/core/timelinePlace.d.ts.map +1 -0
- package/dist/types/core/tweenProps.d.ts +8 -0
- package/dist/types/core/tweenProps.d.ts.map +1 -0
- package/dist/types/core/types.d.ts +4 -0
- package/dist/types/core/types.d.ts.map +1 -0
- package/dist/types/debug/DebugOverlay.d.ts +63 -0
- package/dist/types/debug/DebugOverlay.d.ts.map +1 -0
- package/dist/types/debug/DrawCallCounter.d.ts +20 -0
- package/dist/types/debug/DrawCallCounter.d.ts.map +1 -0
- package/dist/types/debug/ErrorLog.d.ts +20 -0
- package/dist/types/debug/ErrorLog.d.ts.map +1 -0
- package/dist/types/debug/FrameStats.d.ts +21 -0
- package/dist/types/debug/FrameStats.d.ts.map +1 -0
- package/dist/types/debug/inspectWorld.d.ts +14 -0
- package/dist/types/debug/inspectWorld.d.ts.map +1 -0
- package/dist/types/diagnostics/ErrorDeduper.d.ts +17 -0
- package/dist/types/diagnostics/ErrorDeduper.d.ts.map +1 -0
- package/dist/types/diagnostics/FrameSampler.d.ts +37 -0
- package/dist/types/diagnostics/FrameSampler.d.ts.map +1 -0
- package/dist/types/diagnostics/bootWatch.d.ts +25 -0
- package/dist/types/diagnostics/bootWatch.d.ts.map +1 -0
- package/dist/types/diagnostics/captureErrors.d.ts +24 -0
- package/dist/types/diagnostics/captureErrors.d.ts.map +1 -0
- package/dist/types/diagnostics/contextLoss.d.ts +35 -0
- package/dist/types/diagnostics/contextLoss.d.ts.map +1 -0
- package/dist/types/diagnostics/frameStats.d.ts +30 -0
- package/dist/types/diagnostics/frameStats.d.ts.map +1 -0
- package/dist/types/diagnostics/gpuInfo.d.ts +9 -0
- package/dist/types/diagnostics/gpuInfo.d.ts.map +1 -0
- package/dist/types/diagnostics/renderGuard.d.ts +12 -0
- package/dist/types/diagnostics/renderGuard.d.ts.map +1 -0
- package/dist/types/ecs/SparseSet.d.ts +25 -0
- package/dist/types/ecs/SparseSet.d.ts.map +1 -0
- package/dist/types/ecs/World.d.ts +137 -0
- package/dist/types/ecs/World.d.ts.map +1 -0
- package/dist/types/ecs/fields.d.ts +34 -0
- package/dist/types/ecs/fields.d.ts.map +1 -0
- package/dist/types/engine/Engine.d.ts +80 -0
- package/dist/types/engine/Engine.d.ts.map +1 -0
- package/dist/types/engine/FixedLoop.d.ts +32 -0
- package/dist/types/engine/FixedLoop.d.ts.map +1 -0
- package/dist/types/engine/Scene.d.ts +67 -0
- package/dist/types/engine/Scene.d.ts.map +1 -0
- package/dist/types/engine/SceneManager.d.ts +36 -0
- package/dist/types/engine/SceneManager.d.ts.map +1 -0
- package/dist/types/events/EventBus.d.ts +20 -0
- package/dist/types/events/EventBus.d.ts.map +1 -0
- package/dist/types/fx/FloatingText.d.ts +71 -0
- package/dist/types/fx/FloatingText.d.ts.map +1 -0
- package/dist/types/fx/hitStop.d.ts +20 -0
- package/dist/types/fx/hitStop.d.ts.map +1 -0
- package/dist/types/fx/viewCull.d.ts +14 -0
- package/dist/types/fx/viewCull.d.ts.map +1 -0
- package/dist/types/i18n/Translator.d.ts +52 -0
- package/dist/types/i18n/Translator.d.ts.map +1 -0
- package/dist/types/i18n/extractStrings.d.ts +25 -0
- package/dist/types/i18n/extractStrings.d.ts.map +1 -0
- package/dist/types/i18n/formatMessage.d.ts +10 -0
- package/dist/types/i18n/formatMessage.d.ts.map +1 -0
- package/dist/types/index.d.ts +149 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/input/Actions.d.ts +94 -0
- package/dist/types/input/Actions.d.ts.map +1 -0
- package/dist/types/input/AimGesture.d.ts +106 -0
- package/dist/types/input/AimGesture.d.ts.map +1 -0
- package/dist/types/input/Keyboard.d.ts +30 -0
- package/dist/types/input/Keyboard.d.ts.map +1 -0
- package/dist/types/input/Keymap.d.ts +85 -0
- package/dist/types/input/Keymap.d.ts.map +1 -0
- package/dist/types/input/TargetLock.d.ts +56 -0
- package/dist/types/input/TargetLock.d.ts.map +1 -0
- package/dist/types/input/aimAxis.d.ts +9 -0
- package/dist/types/input/aimAxis.d.ts.map +1 -0
- package/dist/types/input/keyChord.d.ts +15 -0
- package/dist/types/input/keyChord.d.ts.map +1 -0
- package/dist/types/input/longPress.d.ts +21 -0
- package/dist/types/input/longPress.d.ts.map +1 -0
- package/dist/types/input/stickAxis.d.ts +26 -0
- package/dist/types/input/stickAxis.d.ts.map +1 -0
- package/dist/types/input/touchDetect.d.ts +18 -0
- package/dist/types/input/touchDetect.d.ts.map +1 -0
- package/dist/types/light/LightLayer.d.ts +65 -0
- package/dist/types/light/LightLayer.d.ts.map +1 -0
- package/dist/types/nav/MinHeap.d.ts +15 -0
- package/dist/types/nav/MinHeap.d.ts.map +1 -0
- package/dist/types/nav/findPath.d.ts +38 -0
- package/dist/types/nav/findPath.d.ts.map +1 -0
- package/dist/types/nav/navGrid.d.ts +48 -0
- package/dist/types/nav/navGrid.d.ts.map +1 -0
- package/dist/types/nav/nearestOpen.d.ts +8 -0
- package/dist/types/nav/nearestOpen.d.ts.map +1 -0
- package/dist/types/nav/straightenPath.d.ts +13 -0
- package/dist/types/nav/straightenPath.d.ts.map +1 -0
- package/dist/types/net/Connection.d.ts +66 -0
- package/dist/types/net/Connection.d.ts.map +1 -0
- package/dist/types/net/InterpolationBuffer.d.ts +36 -0
- package/dist/types/net/InterpolationBuffer.d.ts.map +1 -0
- package/dist/types/net/PredictedMover.d.ts +43 -0
- package/dist/types/net/PredictedMover.d.ts.map +1 -0
- package/dist/types/net/Room.d.ts +69 -0
- package/dist/types/net/Room.d.ts.map +1 -0
- package/dist/types/net/RoomHost.d.ts +74 -0
- package/dist/types/net/RoomHost.d.ts.map +1 -0
- package/dist/types/net/cadence.d.ts +22 -0
- package/dist/types/net/cadence.d.ts.map +1 -0
- package/dist/types/net/constants.d.ts +24 -0
- package/dist/types/net/constants.d.ts.map +1 -0
- package/dist/types/net/lobby/LobbyClient.d.ts +107 -0
- package/dist/types/net/lobby/LobbyClient.d.ts.map +1 -0
- package/dist/types/net/lobby/LobbyHost.d.ts +147 -0
- package/dist/types/net/lobby/LobbyHost.d.ts.map +1 -0
- package/dist/types/net/lobby/LobbyRooms.d.ts +56 -0
- package/dist/types/net/lobby/LobbyRooms.d.ts.map +1 -0
- package/dist/types/net/lobby/Matchmaker.d.ts +57 -0
- package/dist/types/net/lobby/Matchmaker.d.ts.map +1 -0
- package/dist/types/net/lobby/index.d.ts +6 -0
- package/dist/types/net/lobby/index.d.ts.map +1 -0
- package/dist/types/net/lobby/lobbyProtocol.d.ts +143 -0
- package/dist/types/net/lobby/lobbyProtocol.d.ts.map +1 -0
- package/dist/types/net/movement.d.ts +50 -0
- package/dist/types/net/movement.d.ts.map +1 -0
- package/dist/types/net/protocol.d.ts +59 -0
- package/dist/types/net/protocol.d.ts.map +1 -0
- package/dist/types/net/serverClock.d.ts +14 -0
- package/dist/types/net/serverClock.d.ts.map +1 -0
- package/dist/types/net/snapshotCodec.d.ts +55 -0
- package/dist/types/net/snapshotCodec.d.ts.map +1 -0
- package/dist/types/parallax/Parallax.d.ts +37 -0
- package/dist/types/parallax/Parallax.d.ts.map +1 -0
- package/dist/types/parallax/ParallaxLayer.d.ts +80 -0
- package/dist/types/parallax/ParallaxLayer.d.ts.map +1 -0
- package/dist/types/parallax/parallaxMath.d.ts +50 -0
- package/dist/types/parallax/parallaxMath.d.ts.map +1 -0
- package/dist/types/particles/Emitter.d.ts +97 -0
- package/dist/types/particles/Emitter.d.ts.map +1 -0
- package/dist/types/particles/ParticleBudget.d.ts +28 -0
- package/dist/types/particles/ParticleBudget.d.ts.map +1 -0
- package/dist/types/particles/ParticleSim.d.ts +38 -0
- package/dist/types/particles/ParticleSim.d.ts.map +1 -0
- package/dist/types/particles/particleCurves.d.ts +21 -0
- package/dist/types/particles/particleCurves.d.ts.map +1 -0
- package/dist/types/particles/particleSampling.d.ts +20 -0
- package/dist/types/particles/particleSampling.d.ts.map +1 -0
- package/dist/types/physics/Body.d.ts +130 -0
- package/dist/types/physics/Body.d.ts.map +1 -0
- package/dist/types/physics/BroadPhase.d.ts +26 -0
- package/dist/types/physics/BroadPhase.d.ts.map +1 -0
- package/dist/types/physics/Contact.d.ts +62 -0
- package/dist/types/physics/Contact.d.ts.map +1 -0
- package/dist/types/physics/ContactSolver.d.ts +29 -0
- package/dist/types/physics/ContactSolver.d.ts.map +1 -0
- package/dist/types/physics/PhysicsWorld.d.ts +78 -0
- package/dist/types/physics/PhysicsWorld.d.ts.map +1 -0
- package/dist/types/physics/PhysicsWorldOptions.d.ts +24 -0
- package/dist/types/physics/PhysicsWorldOptions.d.ts.map +1 -0
- package/dist/types/physics/SpatialHash.d.ts +23 -0
- package/dist/types/physics/SpatialHash.d.ts.map +1 -0
- package/dist/types/physics/collide.d.ts +27 -0
- package/dist/types/physics/collide.d.ts.map +1 -0
- package/dist/types/physics/collidePolygon.d.ts +14 -0
- package/dist/types/physics/collidePolygon.d.ts.map +1 -0
- package/dist/types/physics/contactReport.d.ts +8 -0
- package/dist/types/physics/contactReport.d.ts.map +1 -0
- package/dist/types/physics/drawColliders.d.ts +43 -0
- package/dist/types/physics/drawColliders.d.ts.map +1 -0
- package/dist/types/physics/physicsSystem.d.ts +5 -0
- package/dist/types/physics/physicsSystem.d.ts.map +1 -0
- package/dist/types/physics/polygon.d.ts +28 -0
- package/dist/types/physics/polygon.d.ts.map +1 -0
- package/dist/types/physics/raycast.d.ts +19 -0
- package/dist/types/physics/raycast.d.ts.map +1 -0
- package/dist/types/physics/syncToBody.d.ts +16 -0
- package/dist/types/physics/syncToBody.d.ts.map +1 -0
- package/dist/types/physics/tileBodies.d.ts +36 -0
- package/dist/types/physics/tileBodies.d.ts.map +1 -0
- package/dist/types/physics/types.d.ts +116 -0
- package/dist/types/physics/types.d.ts.map +1 -0
- package/dist/types/pixel/Darkness.d.ts +78 -0
- package/dist/types/pixel/Darkness.d.ts.map +1 -0
- package/dist/types/pixel/DitherVignette.d.ts +35 -0
- package/dist/types/pixel/DitherVignette.d.ts.map +1 -0
- package/dist/types/pixel/Evaporation.d.ts +30 -0
- package/dist/types/pixel/Evaporation.d.ts.map +1 -0
- package/dist/types/pixel/NightShade.d.ts +38 -0
- package/dist/types/pixel/NightShade.d.ts.map +1 -0
- package/dist/types/pixel/PixelLayer.d.ts +85 -0
- package/dist/types/pixel/PixelLayer.d.ts.map +1 -0
- package/dist/types/pixel/SwayProp.d.ts +52 -0
- package/dist/types/pixel/SwayProp.d.ts.map +1 -0
- package/dist/types/pixel/index.d.ts +31 -0
- package/dist/types/pixel/index.d.ts.map +1 -0
- package/dist/types/pixel/lights.d.ts +34 -0
- package/dist/types/pixel/lights.d.ts.map +1 -0
- package/dist/types/pixel/nineSlice.d.ts +71 -0
- package/dist/types/pixel/nineSlice.d.ts.map +1 -0
- package/dist/types/pixel/paintLayer.d.ts +35 -0
- package/dist/types/pixel/paintLayer.d.ts.map +1 -0
- package/dist/types/pixel/palette.d.ts +58 -0
- package/dist/types/pixel/palette.d.ts.map +1 -0
- package/dist/types/pixel/pixel.d.ts +80 -0
- package/dist/types/pixel/pixel.d.ts.map +1 -0
- package/dist/types/pixel/pixelPaint.d.ts +43 -0
- package/dist/types/pixel/pixelPaint.d.ts.map +1 -0
- package/dist/types/pixel/pixelTone.d.ts +51 -0
- package/dist/types/pixel/pixelTone.d.ts.map +1 -0
- package/dist/types/pixel/propKit.d.ts +26 -0
- package/dist/types/pixel/propKit.d.ts.map +1 -0
- package/dist/types/pixel/ramp.d.ts +57 -0
- package/dist/types/pixel/ramp.d.ts.map +1 -0
- package/dist/types/pixel/selout.d.ts +3 -0
- package/dist/types/pixel/selout.d.ts.map +1 -0
- package/dist/types/pixel/spritePixels.d.ts +29 -0
- package/dist/types/pixel/spritePixels.d.ts.map +1 -0
- package/dist/types/pixel/swayRig.d.ts +72 -0
- package/dist/types/pixel/swayRig.d.ts.map +1 -0
- package/dist/types/pixel/vignetteMask.d.ts +16 -0
- package/dist/types/pixel/vignetteMask.d.ts.map +1 -0
- package/dist/types/pixel/weatherArt.d.ts +29 -0
- package/dist/types/pixel/weatherArt.d.ts.map +1 -0
- package/dist/types/platform/touch.d.ts +10 -0
- package/dist/types/platform/touch.d.ts.map +1 -0
- package/dist/types/postfx/BloomFilter.d.ts +33 -0
- package/dist/types/postfx/BloomFilter.d.ts.map +1 -0
- package/dist/types/postfx/ChromaticAberrationFilter.d.ts +11 -0
- package/dist/types/postfx/ChromaticAberrationFilter.d.ts.map +1 -0
- package/dist/types/postfx/ColorAdjustFilter.d.ts +32 -0
- package/dist/types/postfx/ColorAdjustFilter.d.ts.map +1 -0
- package/dist/types/postfx/CrtFilter.d.ts +16 -0
- package/dist/types/postfx/CrtFilter.d.ts.map +1 -0
- package/dist/types/postfx/PixelateFilter.d.ts +8 -0
- package/dist/types/postfx/PixelateFilter.d.ts.map +1 -0
- package/dist/types/postfx/PostFx.d.ts +92 -0
- package/dist/types/postfx/PostFx.d.ts.map +1 -0
- package/dist/types/postfx/ShockwaveFilter.d.ts +20 -0
- package/dist/types/postfx/ShockwaveFilter.d.ts.map +1 -0
- package/dist/types/postfx/VignetteFilter.d.ts +19 -0
- package/dist/types/postfx/VignetteFilter.d.ts.map +1 -0
- package/dist/types/postfx/fxAnimator.d.ts +32 -0
- package/dist/types/postfx/fxAnimator.d.ts.map +1 -0
- package/dist/types/postfx/fxShader.d.ts +49 -0
- package/dist/types/postfx/fxShader.d.ts.map +1 -0
- package/dist/types/postfx/index.d.ts +11 -0
- package/dist/types/postfx/index.d.ts.map +1 -0
- package/dist/types/react/ChoiceDialog.d.ts +8 -0
- package/dist/types/react/ChoiceDialog.d.ts.map +1 -0
- package/dist/types/react/ConfirmDialog.d.ts +9 -0
- package/dist/types/react/ConfirmDialog.d.ts.map +1 -0
- package/dist/types/react/Glyph.d.ts +54 -0
- package/dist/types/react/Glyph.d.ts.map +1 -0
- package/dist/types/react/Modal.d.ts +22 -0
- package/dist/types/react/Modal.d.ts.map +1 -0
- package/dist/types/react/Panel.d.ts +29 -0
- package/dist/types/react/Panel.d.ts.map +1 -0
- package/dist/types/react/PixelImage.d.ts +19 -0
- package/dist/types/react/PixelImage.d.ts.map +1 -0
- package/dist/types/react/Select.d.ts +27 -0
- package/dist/types/react/Select.d.ts.map +1 -0
- package/dist/types/react/Slider.d.ts +24 -0
- package/dist/types/react/Slider.d.ts.map +1 -0
- package/dist/types/react/SplitPane.d.ts +26 -0
- package/dist/types/react/SplitPane.d.ts.map +1 -0
- package/dist/types/react/TabStrip.d.ts +31 -0
- package/dist/types/react/TabStrip.d.ts.map +1 -0
- package/dist/types/react/TitleTips.d.ts +15 -0
- package/dist/types/react/TitleTips.d.ts.map +1 -0
- package/dist/types/react/Tooltip.d.ts +22 -0
- package/dist/types/react/Tooltip.d.ts.map +1 -0
- package/dist/types/react/UiProvider.d.ts +52 -0
- package/dist/types/react/UiProvider.d.ts.map +1 -0
- package/dist/types/react/baseCss.d.ts +27 -0
- package/dist/types/react/baseCss.d.ts.map +1 -0
- package/dist/types/react/choiceStore.d.ts +34 -0
- package/dist/types/react/choiceStore.d.ts.map +1 -0
- package/dist/types/react/classNames.d.ts +12 -0
- package/dist/types/react/classNames.d.ts.map +1 -0
- package/dist/types/react/confirmStore.d.ts +30 -0
- package/dist/types/react/confirmStore.d.ts.map +1 -0
- package/dist/types/react/index.d.ts +33 -0
- package/dist/types/react/index.d.ts.map +1 -0
- package/dist/types/react/labels.d.ts +24 -0
- package/dist/types/react/labels.d.ts.map +1 -0
- package/dist/types/react/placement.d.ts +59 -0
- package/dist/types/react/placement.d.ts.map +1 -0
- package/dist/types/react/useFillSheet.d.ts +9 -0
- package/dist/types/react/useFillSheet.d.ts.map +1 -0
- package/dist/types/react/useFitToViewport.d.ts +20 -0
- package/dist/types/react/useFitToViewport.d.ts.map +1 -0
- package/dist/types/react/usePicked.d.ts +9 -0
- package/dist/types/react/usePicked.d.ts.map +1 -0
- package/dist/types/react/useStore.d.ts +8 -0
- package/dist/types/react/useStore.d.ts.map +1 -0
- package/dist/types/react/useViewport.d.ts +4 -0
- package/dist/types/react/useViewport.d.ts.map +1 -0
- package/dist/types/rig/PosePlayer.d.ts +64 -0
- package/dist/types/rig/PosePlayer.d.ts.map +1 -0
- package/dist/types/rig/RigView.d.ts +68 -0
- package/dist/types/rig/RigView.d.ts.map +1 -0
- package/dist/types/rig/Skeleton.d.ts +14 -0
- package/dist/types/rig/Skeleton.d.ts.map +1 -0
- package/dist/types/rig/humanoid.d.ts +4 -0
- package/dist/types/rig/humanoid.d.ts.map +1 -0
- package/dist/types/rig/humanoidPoses.d.ts +117 -0
- package/dist/types/rig/humanoidPoses.d.ts.map +1 -0
- package/dist/types/rig/poseMath.d.ts +14 -0
- package/dist/types/rig/poseMath.d.ts.map +1 -0
- package/dist/types/rig/rigTypes.d.ts +82 -0
- package/dist/types/rig/rigTypes.d.ts.map +1 -0
- package/dist/types/save/Autosaver.d.ts +43 -0
- package/dist/types/save/Autosaver.d.ts.map +1 -0
- package/dist/types/save/MemoryBackend.d.ts +10 -0
- package/dist/types/save/MemoryBackend.d.ts.map +1 -0
- package/dist/types/save/SaveBackend.d.ts +14 -0
- package/dist/types/save/SaveBackend.d.ts.map +1 -0
- package/dist/types/save/SaveStore.d.ts +73 -0
- package/dist/types/save/SaveStore.d.ts.map +1 -0
- package/dist/types/save/WebStorageBackend.d.ts +14 -0
- package/dist/types/save/WebStorageBackend.d.ts.map +1 -0
- package/dist/types/save/checksum.d.ts +7 -0
- package/dist/types/save/checksum.d.ts.map +1 -0
- package/dist/types/save/migrateSave.d.ts +17 -0
- package/dist/types/save/migrateSave.d.ts.map +1 -0
- package/dist/types/settings.d.ts +25 -0
- package/dist/types/settings.d.ts.map +1 -0
- package/dist/types/tilemap/TilemapView.d.ts +42 -0
- package/dist/types/tilemap/TilemapView.d.ts.map +1 -0
- package/dist/types/tilemap/collision.d.ts +16 -0
- package/dist/types/tilemap/collision.d.ts.map +1 -0
- package/dist/types/tilemap/tiled.d.ts +104 -0
- package/dist/types/tilemap/tiled.d.ts.map +1 -0
- package/dist/types/transitions/CrossfadeTransition.d.ts +20 -0
- package/dist/types/transitions/CrossfadeTransition.d.ts.map +1 -0
- package/dist/types/transitions/DitherWipeTransition.d.ts +35 -0
- package/dist/types/transitions/DitherWipeTransition.d.ts.map +1 -0
- package/dist/types/transitions/FadeTransition.d.ts +20 -0
- package/dist/types/transitions/FadeTransition.d.ts.map +1 -0
- package/dist/types/transitions/Letterbox.d.ts +33 -0
- package/dist/types/transitions/Letterbox.d.ts.map +1 -0
- package/dist/types/transitions/Transition.d.ts +22 -0
- package/dist/types/transitions/Transition.d.ts.map +1 -0
- package/dist/types/transitions/ditherMask.d.ts +13 -0
- package/dist/types/transitions/ditherMask.d.ts.map +1 -0
- package/dist/types/transitions/transitionTo.d.ts +16 -0
- package/dist/types/transitions/transitionTo.d.ts.map +1 -0
- package/dist/types/transitions/tweenDone.d.ts +5 -0
- package/dist/types/transitions/tweenDone.d.ts.map +1 -0
- package/dist/types/ui/Bar.d.ts +41 -0
- package/dist/types/ui/Bar.d.ts.map +1 -0
- package/dist/types/ui/Button.d.ts +47 -0
- package/dist/types/ui/Button.d.ts.map +1 -0
- package/dist/types/ui/Dialog.d.ts +47 -0
- package/dist/types/ui/Dialog.d.ts.map +1 -0
- package/dist/types/ui/FocusManager.d.ts +53 -0
- package/dist/types/ui/FocusManager.d.ts.map +1 -0
- package/dist/types/ui/Label.d.ts +24 -0
- package/dist/types/ui/Label.d.ts.map +1 -0
- package/dist/types/ui/List.d.ts +23 -0
- package/dist/types/ui/List.d.ts.map +1 -0
- package/dist/types/ui/Panel.d.ts +38 -0
- package/dist/types/ui/Panel.d.ts.map +1 -0
- package/dist/types/ui/ScrollView.d.ts +56 -0
- package/dist/types/ui/ScrollView.d.ts.map +1 -0
- package/dist/types/ui/Slider.d.ts +47 -0
- package/dist/types/ui/Slider.d.ts.map +1 -0
- package/dist/types/ui/Stack.d.ts +16 -0
- package/dist/types/ui/Stack.d.ts.map +1 -0
- package/dist/types/ui/Toggle.d.ts +31 -0
- package/dist/types/ui/Toggle.d.ts.map +1 -0
- package/dist/types/ui/UiHost.d.ts +18 -0
- package/dist/types/ui/UiHost.d.ts.map +1 -0
- package/dist/types/ui/UiPointerGate.d.ts +17 -0
- package/dist/types/ui/UiPointerGate.d.ts.map +1 -0
- package/dist/types/ui/UiRoot.d.ts +73 -0
- package/dist/types/ui/UiRoot.d.ts.map +1 -0
- package/dist/types/ui/Widget.d.ts +56 -0
- package/dist/types/ui/Widget.d.ts.map +1 -0
- package/dist/types/ui/dom/DomOverlay.d.ts +52 -0
- package/dist/types/ui/dom/DomOverlay.d.ts.map +1 -0
- package/dist/types/ui/dom/DomWorldAnchors.d.ts +50 -0
- package/dist/types/ui/dom/DomWorldAnchors.d.ts.map +1 -0
- package/dist/types/ui/dom/InputShield.d.ts +20 -0
- package/dist/types/ui/dom/InputShield.d.ts.map +1 -0
- package/dist/types/ui/dom/createStore.d.ts +22 -0
- package/dist/types/ui/dom/createStore.d.ts.map +1 -0
- package/dist/types/ui/dom/shieldDecision.d.ts +34 -0
- package/dist/types/ui/dom/shieldDecision.d.ts.map +1 -0
- package/dist/types/ui/dom/worldToScreen.d.ts +24 -0
- package/dist/types/ui/dom/worldToScreen.d.ts.map +1 -0
- package/dist/types/ui/index.d.ts +38 -0
- package/dist/types/ui/index.d.ts.map +1 -0
- package/dist/types/ui/layout/anchor.d.ts +9 -0
- package/dist/types/ui/layout/anchor.d.ts.map +1 -0
- package/dist/types/ui/layout/barDrain.d.ts +25 -0
- package/dist/types/ui/layout/barDrain.d.ts.map +1 -0
- package/dist/types/ui/layout/fitToViewport.d.ts +32 -0
- package/dist/types/ui/layout/fitToViewport.d.ts.map +1 -0
- package/dist/types/ui/layout/focusNav.d.ts +13 -0
- package/dist/types/ui/layout/focusNav.d.ts.map +1 -0
- package/dist/types/ui/layout/geometry.d.ts +35 -0
- package/dist/types/ui/layout/geometry.d.ts.map +1 -0
- package/dist/types/ui/layout/listWidth.d.ts +13 -0
- package/dist/types/ui/layout/listWidth.d.ts.map +1 -0
- package/dist/types/ui/layout/placeTooltip.d.ts +23 -0
- package/dist/types/ui/layout/placeTooltip.d.ts.map +1 -0
- package/dist/types/ui/layout/scroll.d.ts +17 -0
- package/dist/types/ui/layout/scroll.d.ts.map +1 -0
- package/dist/types/ui/layout/slider.d.ts +7 -0
- package/dist/types/ui/layout/slider.d.ts.map +1 -0
- package/dist/types/ui/layout/stack.d.ts +26 -0
- package/dist/types/ui/layout/stack.d.ts.map +1 -0
- package/dist/types/ui/layout/wrapRow.d.ts +6 -0
- package/dist/types/ui/layout/wrapRow.d.ts.map +1 -0
- package/dist/ui/Bar.js +54 -0
- package/dist/ui/Bar.js.map +1 -0
- package/dist/ui/Button.js +58 -0
- package/dist/ui/Button.js.map +1 -0
- package/dist/ui/Dialog.js +56 -0
- package/dist/ui/Dialog.js.map +1 -0
- package/dist/ui/FocusManager.js +97 -0
- package/dist/ui/FocusManager.js.map +1 -0
- package/dist/ui/Label.js +36 -0
- package/dist/ui/Label.js.map +1 -0
- package/dist/ui/List.js +45 -0
- package/dist/ui/List.js.map +1 -0
- package/dist/ui/Panel.js +38 -0
- package/dist/ui/Panel.js.map +1 -0
- package/dist/ui/ScrollView.js +96 -0
- package/dist/ui/ScrollView.js.map +1 -0
- package/dist/ui/Slider.js +55 -0
- package/dist/ui/Slider.js.map +1 -0
- package/dist/ui/Stack.js +28 -0
- package/dist/ui/Stack.js.map +1 -0
- package/dist/ui/Toggle.js +37 -0
- package/dist/ui/Toggle.js.map +1 -0
- package/dist/ui/UiHost.js +9 -0
- package/dist/ui/UiHost.js.map +1 -0
- package/dist/ui/UiPointerGate.js +25 -0
- package/dist/ui/UiPointerGate.js.map +1 -0
- package/dist/ui/UiRoot.js +93 -0
- package/dist/ui/UiRoot.js.map +1 -0
- package/dist/ui/Widget.js +90 -0
- package/dist/ui/Widget.js.map +1 -0
- package/dist/ui/dom/DomOverlay.js +59 -0
- package/dist/ui/dom/DomOverlay.js.map +1 -0
- package/dist/ui/dom/DomWorldAnchors.js +59 -0
- package/dist/ui/dom/DomWorldAnchors.js.map +1 -0
- package/dist/ui/dom/InputShield.js +27 -0
- package/dist/ui/dom/InputShield.js.map +1 -0
- package/dist/ui/dom/createStore.js +42 -0
- package/dist/ui/dom/createStore.js.map +1 -0
- package/dist/ui/dom/shieldDecision.js +36 -0
- package/dist/ui/dom/shieldDecision.js.map +1 -0
- package/dist/ui/dom/worldToScreen.js +11 -0
- package/dist/ui/dom/worldToScreen.js.map +1 -0
- package/dist/ui/layout/anchor.js +20 -0
- package/dist/ui/layout/anchor.js.map +1 -0
- package/dist/ui/layout/barDrain.js +25 -0
- package/dist/ui/layout/barDrain.js.map +1 -0
- package/dist/ui/layout/fitToViewport.js +17 -0
- package/dist/ui/layout/fitToViewport.js.map +1 -0
- package/dist/ui/layout/focusNav.js +42 -0
- package/dist/ui/layout/focusNav.js.map +1 -0
- package/dist/ui/layout/geometry.js +21 -0
- package/dist/ui/layout/geometry.js.map +1 -0
- package/dist/ui/layout/listWidth.js +10 -0
- package/dist/ui/layout/listWidth.js.map +1 -0
- package/dist/ui/layout/placeTooltip.js +28 -0
- package/dist/ui/layout/placeTooltip.js.map +1 -0
- package/dist/ui/layout/scroll.js +24 -0
- package/dist/ui/layout/scroll.js.map +1 -0
- package/dist/ui/layout/slider.js +20 -0
- package/dist/ui/layout/slider.js.map +1 -0
- package/dist/ui/layout/stack.js +27 -0
- package/dist/ui/layout/stack.js.map +1 -0
- package/dist/ui/layout/wrapRow.js +13 -0
- package/dist/ui/layout/wrapRow.js.map +1 -0
- package/dist/ui.js +85 -0
- package/dist/ui.js.map +1 -0
- package/package.json +115 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Select.js","sources":["../../src/react/Select.tsx"],"sourcesContent":["import { type KeyboardEvent, type ReactNode, useEffect, useLayoutEffect, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { listWidth } from '../ui/layout/listWidth';\nimport { scrollIntoView } from '../ui/layout/scroll';\nimport { Glyph } from './Glyph';\nimport { listPlacement, type ListPlacement } from './placement';\nimport { useUi, useCx } from './UiProvider';\n\nexport interface SelectOption<T extends string | number> {\n value: T;\n label: ReactNode;\n}\n\nexport interface SelectProps<T extends string | number> {\n value: T;\n options: readonly SelectOption<T>[];\n onChange: (value: T) => void;\n /** What it chooses, for a screen reader. */\n label?: string;\n /** Fills its row, cutting the label with an ellipsis instead of growing. */\n grow?: boolean;\n className?: string;\n disabled?: boolean;\n}\n\n/** The next option along the list, wrapping round. */\nexport function stepOption(index: number, step: number, count: number): number {\n return count > 0 ? (((Math.max(0, index) + step) % count) + count) % count : 0;\n}\n\n/**\n * A drop-down drawn by the theme instead of the browser's `<select>`, whose list is the OS's own widget and whose box\n * clips its text at a fixed width. The button is as wide as its longest label (every label stacked in one cell, the\n * picked one shown). The list opens in a portal, so no window's `overflow` cuts it: as wide as its longest label\n * (`listWidth`), under the button or over it when the screen ends below (`listPlacement`). A press never takes the\n * focus, so a text field beside it keeps its keyboard.\n */\nexport function Select<T extends string | number>({ value, options, onChange, label, grow, className, disabled }: SelectProps<T>) {\n const cx = useCx();\n const ui = useUi();\n const [open, setOpen] = useState(false);\n const [place, setPlace] = useState<(ListPlacement & { width: number }) | null>(null);\n const [hot, setHot] = useState(0);\n const buttonRef = useRef<HTMLButtonElement>(null);\n const listRef = useRef<HTMLDivElement>(null);\n const picked = options.findIndex((o) => o.value === value);\n\n // first rendered hidden at its natural size, then measured and placed\n useLayoutEffect(() => {\n const list = listRef.current;\n const button = buttonRef.current;\n if (!open || !list || !button || place) return;\n const rows = Array.from(list.children) as HTMLElement[];\n const widest = rows.reduce((w, r) => Math.max(w, r.offsetWidth), 0);\n const view = ui.viewport();\n const width = listWidth(\n rows.map((_, i) => String(i)),\n (i) => rows[Number(i)]?.offsetWidth ?? 0,\n { padding: list.offsetWidth - widest, min: Math.round(button.offsetWidth), max: view.width - 2 * ui.margin },\n );\n const r = button.getBoundingClientRect();\n const at = listPlacement({ x: r.left, y: r.top, width: r.width, height: r.height }, { width, height: list.offsetHeight }, view, 2, ui.margin);\n setPlace({ ...at, width });\n }, [open, place, ui]);\n\n // the option moved to by the keyboard is scrolled into view, no further\n useEffect(() => {\n const list = listRef.current;\n const row = list?.children[hot] as HTMLElement | undefined;\n if (list && row) list.scrollTop = scrollIntoView(list.scrollTop, row.offsetTop, row.offsetHeight, list.clientHeight, list.scrollHeight);\n }, [hot, place]);\n\n useEffect(() => {\n if (!open) return;\n const away = (e: PointerEvent) => {\n const t = e.target as Node;\n if (!buttonRef.current?.contains(t) && !listRef.current?.contains(t)) setOpen(false);\n };\n const shut = () => setOpen(false);\n document.addEventListener('pointerdown', away, true);\n window.addEventListener('resize', shut);\n return () => {\n document.removeEventListener('pointerdown', away, true);\n window.removeEventListener('resize', shut);\n };\n }, [open]);\n\n const show = (on: boolean) => {\n setPlace(null);\n setOpen(on);\n };\n const choose = (i: number) => {\n const o = options[i];\n show(false);\n if (o && o.value !== value) onChange(o.value);\n };\n const toggle = () => {\n if (disabled) return;\n setHot(Math.max(0, picked));\n show(!open);\n };\n const onKey = (e: KeyboardEvent) => {\n // the game's own keys never see what is pressed here\n e.stopPropagation();\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {\n e.preventDefault();\n const step = e.key === 'ArrowDown' ? 1 : -1;\n if (open) setHot((h) => stepOption(h, step, options.length));\n else choose(stepOption(picked, step, options.length));\n } else if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n if (open) choose(hot);\n else toggle();\n } else if (e.key === 'Escape' && open) {\n e.preventDefault();\n show(false);\n }\n };\n\n const target = ui.portal();\n const list = (\n <div\n ref={listRef}\n className={cx(`e1681-select-list e1681-tip-frame${place ? '' : ' measuring'}`)}\n role=\"listbox\"\n aria-label={label}\n style={place ? { left: place.x, top: place.y, width: place.width, maxHeight: place.height } : { left: 0, top: 0, visibility: 'hidden' }}\n onPointerDown={(e) => e.preventDefault()}\n >\n {options.map((o, i) => (\n <div\n key={String(o.value)}\n role=\"option\"\n aria-selected={i === picked}\n className={cx(`e1681-select-option${i === picked ? ' picked' : ''}${i === hot ? ' hot' : ''}`)}\n onPointerEnter={() => setHot(i)}\n onClick={() => choose(i)}\n >\n {o.label}\n </div>\n ))}\n </div>\n );\n return (\n <>\n <button\n ref={buttonRef}\n type=\"button\"\n className={cx(`e1681-select${open ? ' open' : ''}${grow ? ' grow' : ''}${className ? ` ${className}` : ''}`)}\n aria-label={label}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n disabled={disabled}\n onPointerDown={(e) => e.preventDefault()}\n onClick={toggle}\n onKeyDown={onKey}\n >\n <span className={cx('e1681-select-labels')}>\n {options.map((o, i) => (\n <span key={String(o.value)} className={cx(i === picked ? 'shown' : undefined)} aria-hidden={i !== picked}>\n {o.label}\n </span>\n ))}\n </span>\n <Glyph id={open ? 'up' : 'down'} />\n </button>\n {open && (target ? createPortal(list, target) : list)}\n </>\n );\n}\n"],"names":["stepOption","index","step","count","Select","value","options","onChange","label","grow","className","disabled","cx","useCx","ui","useUi","open","setOpen","useState","place","setPlace","hot","setHot","buttonRef","useRef","listRef","picked","o","useLayoutEffect","list","button","rows","widest","r","view","width","listWidth","_","i","at","listPlacement","useEffect","row","scrollIntoView","away","e","t","shut","show","on","choose","toggle","onKey","h","target","jsx","jsxs","Fragment","Glyph","createPortal"],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { jsxs as g, jsx as d } from "react/jsx-runtime";
|
|
2
|
+
import { useRef as A } from "react";
|
|
3
|
+
import { quantize as N, sliderFraction as $, sliderValueAt as k } from "../ui/layout/slider.js";
|
|
4
|
+
import { useCx as x } from "./UiProvider.js";
|
|
5
|
+
const C = (o) => `${Math.round(o * 100)}%`;
|
|
6
|
+
function I(o, e, l, n, t) {
|
|
7
|
+
const s = {
|
|
8
|
+
ArrowLeft: e - t,
|
|
9
|
+
ArrowDown: e - t,
|
|
10
|
+
ArrowRight: e + t,
|
|
11
|
+
ArrowUp: e + t,
|
|
12
|
+
PageDown: e - t * 4,
|
|
13
|
+
PageUp: e + t * 4,
|
|
14
|
+
Home: l,
|
|
15
|
+
End: n
|
|
16
|
+
}[o];
|
|
17
|
+
return s === void 0 ? void 0 : N(s, l, n, t);
|
|
18
|
+
}
|
|
19
|
+
function M({ value: o, onChange: e, label: l, min: n = 0, max: t = 1, step: f = 0.05, format: s = C, hideValue: v, disabled: a, className: u }) {
|
|
20
|
+
const c = x(), w = A(null), p = (r) => {
|
|
21
|
+
r !== o && e(r);
|
|
22
|
+
}, h = (r) => {
|
|
23
|
+
const i = w.current?.getBoundingClientRect();
|
|
24
|
+
i && i.width > 0 && p(k(r, i.left, i.width, n, t, f));
|
|
25
|
+
}, P = (r) => {
|
|
26
|
+
a || r.button !== 0 || (r.currentTarget.setPointerCapture(r.pointerId), r.currentTarget.focus(), h(r.clientX), r.preventDefault());
|
|
27
|
+
}, D = (r) => {
|
|
28
|
+
!a && r.currentTarget.hasPointerCapture(r.pointerId) && h(r.clientX);
|
|
29
|
+
}, y = (r) => {
|
|
30
|
+
const i = a ? void 0 : I(r.key, o, n, t, f);
|
|
31
|
+
i !== void 0 && (r.preventDefault(), r.stopPropagation(), p(i));
|
|
32
|
+
}, m = $(o, n, t) * 100;
|
|
33
|
+
return /* @__PURE__ */ g("div", { className: c(`e1681-slider-row${u ? ` ${u}` : ""}`), children: [
|
|
34
|
+
/* @__PURE__ */ d(
|
|
35
|
+
"div",
|
|
36
|
+
{
|
|
37
|
+
className: c("e1681-slider"),
|
|
38
|
+
role: "slider",
|
|
39
|
+
tabIndex: a ? -1 : 0,
|
|
40
|
+
"aria-label": l,
|
|
41
|
+
"aria-valuemin": n,
|
|
42
|
+
"aria-valuemax": t,
|
|
43
|
+
"aria-valuenow": o,
|
|
44
|
+
"aria-valuetext": s(o),
|
|
45
|
+
"aria-disabled": a || void 0,
|
|
46
|
+
onPointerDown: P,
|
|
47
|
+
onPointerMove: D,
|
|
48
|
+
onKeyDown: y,
|
|
49
|
+
children: /* @__PURE__ */ g("div", { className: c("e1681-slider-track"), ref: w, children: [
|
|
50
|
+
/* @__PURE__ */ d("div", { className: c("e1681-slider-fill"), style: { width: `${m}%` } }),
|
|
51
|
+
/* @__PURE__ */ d("div", { className: c("e1681-slider-knob"), style: { left: `${m}%` } })
|
|
52
|
+
] })
|
|
53
|
+
}
|
|
54
|
+
),
|
|
55
|
+
!v && /* @__PURE__ */ d("span", { className: c("e1681-slider-value"), children: s(o) })
|
|
56
|
+
] });
|
|
57
|
+
}
|
|
58
|
+
export {
|
|
59
|
+
M as Slider,
|
|
60
|
+
I as sliderKeyValue
|
|
61
|
+
};
|
|
62
|
+
//# sourceMappingURL=Slider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Slider.js","sources":["../../src/react/Slider.tsx"],"sourcesContent":["import { type KeyboardEvent, type PointerEvent, useRef } from 'react';\nimport { quantize, sliderFraction, sliderValueAt } from '../ui/layout/slider';\nimport { useCx } from './UiProvider';\n\nexport interface SliderProps {\n value: number;\n onChange: (value: number) => void;\n /** Spoken name (`aria-label`). */\n label: string;\n min?: number;\n max?: number;\n step?: number;\n /** What the value reads as, for the screen reader and the number beside the track (default: a percentage). */\n format?: (value: number) => string;\n /** Hides the number beside the track. */\n hideValue?: boolean;\n disabled?: boolean;\n className?: string;\n}\n\nconst percent = (v: number) => `${Math.round(v * 100)}%`;\n\n/** The value an arrow, Page or Home/End key moves a slider to; `undefined` for any other key. */\nexport function sliderKeyValue(key: string, value: number, min: number, max: number, step: number): number | undefined {\n const moves: Record<string, number> = {\n ArrowLeft: value - step,\n ArrowDown: value - step,\n ArrowRight: value + step,\n ArrowUp: value + step,\n PageDown: value - step * 4,\n PageUp: value + step * 4,\n Home: min,\n End: max,\n };\n const to = moves[key];\n return to === undefined ? undefined : quantize(to, min, max, step);\n}\n\n/**\n * A slider drawn by the theme instead of the browser's range: a sunk track, a fill and a square knob. Dragging,\n * pressing anywhere on the track and the arrow / Page / Home / End keys move it; it is a `role=\"slider\"` with its aria\n * values, so it reads like the native range it replaces. Focused, it keeps the arrow keys from the game.\n */\nexport function Slider({ value, onChange, label, min = 0, max = 1, step = 0.05, format = percent, hideValue, disabled, className }: SliderProps) {\n const cx = useCx();\n const track = useRef<HTMLDivElement>(null);\n const set = (v: number) => {\n if (v !== value) onChange(v);\n };\n const fromPointer = (clientX: number) => {\n const r = track.current?.getBoundingClientRect();\n if (r && r.width > 0) set(sliderValueAt(clientX, r.left, r.width, min, max, step));\n };\n const onPointerDown = (e: PointerEvent<HTMLDivElement>) => {\n if (disabled || e.button !== 0) return;\n e.currentTarget.setPointerCapture(e.pointerId);\n e.currentTarget.focus();\n fromPointer(e.clientX);\n e.preventDefault();\n };\n const onPointerMove = (e: PointerEvent<HTMLDivElement>) => {\n if (!disabled && e.currentTarget.hasPointerCapture(e.pointerId)) fromPointer(e.clientX);\n };\n const onKeyDown = (e: KeyboardEvent<HTMLDivElement>) => {\n const to = disabled ? undefined : sliderKeyValue(e.key, value, min, max, step);\n if (to === undefined) return;\n e.preventDefault();\n e.stopPropagation();\n set(to);\n };\n const pct = sliderFraction(value, min, max) * 100;\n return (\n <div className={cx(`e1681-slider-row${className ? ` ${className}` : ''}`)}>\n <div\n className={cx('e1681-slider')}\n role=\"slider\"\n tabIndex={disabled ? -1 : 0}\n aria-label={label}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={value}\n aria-valuetext={format(value)}\n aria-disabled={disabled || undefined}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onKeyDown={onKeyDown}\n >\n <div className={cx('e1681-slider-track')} ref={track}>\n <div className={cx('e1681-slider-fill')} style={{ width: `${pct}%` }} />\n <div className={cx('e1681-slider-knob')} style={{ left: `${pct}%` }} />\n </div>\n </div>\n {!hideValue && <span className={cx('e1681-slider-value')}>{format(value)}</span>}\n </div>\n );\n}\n"],"names":["percent","v","sliderKeyValue","key","value","min","max","step","to","quantize","Slider","onChange","label","format","hideValue","disabled","className","cx","useCx","track","useRef","set","fromPointer","clientX","r","sliderValueAt","onPointerDown","e","onPointerMove","onKeyDown","pct","sliderFraction","jsxs","jsx"],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { jsxs as n, jsx as i } from "react/jsx-runtime";
|
|
2
|
+
import { useState as v, useRef as C } from "react";
|
|
3
|
+
import { splitModeFor as N, SPLIT_STACK_BELOW as $ } from "./placement.js";
|
|
4
|
+
import { useFillSheet as y } from "./useFillSheet.js";
|
|
5
|
+
import { useCx as L, useUi as T } from "./UiProvider.js";
|
|
6
|
+
import { useViewport as j } from "./useViewport.js";
|
|
7
|
+
function E({ list: p, detail: m, empty: u, listWidth: o, fit: l, stackBelow: d = $, pickSelector: h = ".e1681-pickable", backLabel: f, className: c }) {
|
|
8
|
+
const t = L(), e = T(), k = j(e.touch).width, s = N(k, e.touch, d) === "stack", [b, a] = v(!1), r = C(null);
|
|
9
|
+
y(r, e.touch, !!l);
|
|
10
|
+
const w = o && !s ? { "--e1681-split-list": o } : void 0, x = (S) => {
|
|
11
|
+
s && S.target.closest(h) && a(!0);
|
|
12
|
+
};
|
|
13
|
+
return /* @__PURE__ */ n("div", { ref: r, className: t(`e1681-split${l ? " fit" : ""}${s ? b ? " stack show-detail" : " stack show-list" : ""}${c ? ` ${c}` : ""}`), style: w, children: [
|
|
14
|
+
/* @__PURE__ */ i("div", { className: t("e1681-split-list"), onClickCapture: x, children: p }),
|
|
15
|
+
/* @__PURE__ */ n("div", { className: t("e1681-split-detail"), children: [
|
|
16
|
+
s && /* @__PURE__ */ i("button", { type: "button", className: t("e1681-button small e1681-split-back"), onClick: () => a(!1), children: f ?? e.labels.backToList }),
|
|
17
|
+
m || /* @__PURE__ */ i("div", { className: t("e1681-split-empty"), children: u ?? e.labels.pickHint })
|
|
18
|
+
] })
|
|
19
|
+
] });
|
|
20
|
+
}
|
|
21
|
+
export {
|
|
22
|
+
E as SplitPane
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=SplitPane.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SplitPane.js","sources":["../../src/react/SplitPane.tsx"],"sourcesContent":["import { type CSSProperties, type MouseEvent, type ReactNode, useRef, useState } from 'react';\nimport { splitModeFor, SPLIT_STACK_BELOW } from './placement';\nimport { useFillSheet } from './useFillSheet';\nimport { useUi, useCx } from './UiProvider';\nimport { useViewport } from './useViewport';\n\nexport interface SplitPaneProps {\n list: ReactNode;\n /** The right pane; `null`/`undefined`/`false` shows `empty` instead. */\n detail?: ReactNode;\n empty?: ReactNode;\n /** The list column's width (any CSS grid track); by default the two share the width evenly. */\n listWidth?: string;\n /** Height follows the content (capped) instead of the fixed window height: for panes with little in them. */\n fit?: boolean;\n /** Below this width a touch screen shows one pane at a time (default `SPLIT_STACK_BELOW`, 600). */\n stackBelow?: number;\n /** A click on an element matching this opens the detail when stacked (default `.e1681-pickable`). */\n pickSelector?: string;\n /** The back button's word (default: the provider's `backToList`). */\n backLabel?: ReactNode;\n className?: string;\n}\n\n/**\n * Two panes side by side: a list that scrolls on its own and the detail of what is picked, which stays in view\n * however long the list grows, so a window is as tall as `.e1681-split` says and never taller. On a touch screen\n * narrower than `stackBelow` only one pane shows at a time: tapping a pickable row (`.e1681-pickable`) opens its\n * detail, and the back button returns. In a touch sheet it fills the height left below what sits above it.\n */\nexport function SplitPane({ list, detail, empty, listWidth, fit, stackBelow = SPLIT_STACK_BELOW, pickSelector = '.e1681-pickable', backLabel, className }: SplitPaneProps) {\n const cx = useCx();\n const ui = useUi();\n const width = useViewport(ui.touch).width;\n const stack = splitModeFor(width, ui.touch, stackBelow) === 'stack';\n const [showDetail, setShowDetail] = useState(false);\n const box = useRef<HTMLDivElement>(null);\n useFillSheet(box, ui.touch, !!fit);\n const style = listWidth && !stack ? ({ '--e1681-split-list': listWidth } as CSSProperties) : undefined;\n const picked = (e: MouseEvent) => {\n if (stack && (e.target as HTMLElement).closest(pickSelector)) setShowDetail(true);\n };\n const mode = stack ? (showDetail ? ' stack show-detail' : ' stack show-list') : '';\n return (\n <div ref={box} className={cx(`e1681-split${fit ? ' fit' : ''}${mode}${className ? ` ${className}` : ''}`)} style={style}>\n <div className={cx('e1681-split-list')} onClickCapture={picked}>\n {list}\n </div>\n <div className={cx('e1681-split-detail')}>\n {stack && (\n <button type=\"button\" className={cx('e1681-button small e1681-split-back')} onClick={() => setShowDetail(false)}>\n {backLabel ?? ui.labels.backToList}\n </button>\n )}\n {detail || <div className={cx('e1681-split-empty')}>{empty ?? ui.labels.pickHint}</div>}\n </div>\n </div>\n );\n}\n"],"names":["SplitPane","list","detail","empty","listWidth","fit","stackBelow","SPLIT_STACK_BELOW","pickSelector","backLabel","className","cx","useCx","ui","useUi","width","useViewport","stack","splitModeFor","showDetail","setShowDetail","useState","box","useRef","useFillSheet","style","picked","e","jsxs","jsx"],"mappings":";;;;;;AA8BO,SAASA,EAAU,EAAE,MAAAC,GAAM,QAAAC,GAAQ,OAAAC,GAAO,WAAAC,GAAW,KAAAC,GAAK,YAAAC,IAAaC,GAAmB,cAAAC,IAAe,mBAAmB,WAAAC,GAAW,WAAAC,KAA6B;AACzK,QAAMC,IAAKC,EAAA,GACLC,IAAKC,EAAA,GACLC,IAAQC,EAAYH,EAAG,KAAK,EAAE,OAC9BI,IAAQC,EAAaH,GAAOF,EAAG,OAAOP,CAAU,MAAM,SACtD,CAACa,GAAYC,CAAa,IAAIC,EAAS,EAAK,GAC5CC,IAAMC,EAAuB,IAAI;AACvC,EAAAC,EAAaF,GAAKT,EAAG,OAAO,CAAC,CAACR,CAAG;AACjC,QAAMoB,IAAQrB,KAAa,CAACa,IAAS,EAAE,sBAAsBb,MAAgC,QACvFsB,IAAS,CAACC,MAAkB;AAChC,IAAIV,KAAUU,EAAE,OAAuB,QAAQnB,CAAY,OAAiB,EAAI;AAAA,EAClF;AAEA,SACE,gBAAAoB,EAAC,SAAI,KAAKN,GAAK,WAAWX,EAAG,cAAcN,IAAM,SAAS,EAAE,GAFjDY,IAASE,IAAa,uBAAuB,qBAAsB,EAEX,GAAGT,IAAY,IAAIA,CAAS,KAAK,EAAE,EAAE,GAAG,OAAAe,GACzG,UAAA;AAAA,IAAA,gBAAAI,EAAC,SAAI,WAAWlB,EAAG,kBAAkB,GAAG,gBAAgBe,GACrD,UAAAzB,GACH;AAAA,IACA,gBAAA2B,EAAC,OAAA,EAAI,WAAWjB,EAAG,oBAAoB,GACpC,UAAA;AAAA,MAAAM,uBACE,UAAA,EAAO,MAAK,UAAS,WAAWN,EAAG,qCAAqC,GAAG,SAAS,MAAMS,EAAc,EAAK,GAC3G,UAAAX,KAAaI,EAAG,OAAO,YAC1B;AAAA,MAEDX,KAAU,gBAAA2B,EAAC,OAAA,EAAI,WAAWlB,EAAG,mBAAmB,GAAI,UAAAR,KAASU,EAAG,OAAO,SAAA,CAAS;AAAA,IAAA,EAAA,CACnF;AAAA,EAAA,GACF;AAEJ;"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { jsx as a } from "react/jsx-runtime";
|
|
2
|
+
import { useCx as f } from "./UiProvider.js";
|
|
3
|
+
function y({ tabs: s, value: o, onChange: l, small: t, wrap: d, className: n, label: c, onPointerDown: b }) {
|
|
4
|
+
const r = f(), m = ["e1681-tabs", t ? "small" : "", d ? "wrap" : "", n ?? ""].filter(Boolean).join(" ");
|
|
5
|
+
return /* @__PURE__ */ a("div", { className: r(m), role: "tablist", "aria-label": c, children: s.map((i) => {
|
|
6
|
+
const p = i.color ? { color: i.color } : void 0;
|
|
7
|
+
return /* @__PURE__ */ a(
|
|
8
|
+
"button",
|
|
9
|
+
{
|
|
10
|
+
type: "button",
|
|
11
|
+
role: "tab",
|
|
12
|
+
"aria-selected": i.id === o,
|
|
13
|
+
className: r(i.id === o ? "e1681-tab active" : "e1681-tab"),
|
|
14
|
+
style: p,
|
|
15
|
+
disabled: i.disabled,
|
|
16
|
+
title: i.title,
|
|
17
|
+
onPointerDown: (e) => {
|
|
18
|
+
b?.(e), e.pointerType === "mouse" && e.button === 0 && !i.disabled && i.id !== o && l(i.id);
|
|
19
|
+
},
|
|
20
|
+
onClick: () => {
|
|
21
|
+
i.id !== o && l(i.id);
|
|
22
|
+
},
|
|
23
|
+
children: i.label
|
|
24
|
+
},
|
|
25
|
+
i.id
|
|
26
|
+
);
|
|
27
|
+
}) });
|
|
28
|
+
}
|
|
29
|
+
export {
|
|
30
|
+
y as TabStrip
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=TabStrip.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TabStrip.js","sources":["../../src/react/TabStrip.tsx"],"sourcesContent":["import type { CSSProperties, PointerEvent, ReactNode } from 'react';\nimport { useCx } from './UiProvider';\n\nexport interface Tab<T extends string> {\n id: T;\n label: ReactNode;\n /** Why a disabled tab cannot be taken. */\n title?: string;\n disabled?: boolean;\n /** The tab's own colour for its label, kept on both states. */\n color?: string;\n}\n\nexport interface TabStripProps<T extends string> {\n tabs: readonly Tab<T>[];\n value: T;\n onChange: (id: T) => void;\n /** The short strip that sits over a field or in a row of controls. */\n small?: boolean;\n /** Breaks onto more rows instead of scrolling sideways (same as `className={cx('wrap')}`). */\n wrap?: boolean;\n className?: string;\n /** What the strip chooses, for a screen reader. */\n label?: string;\n /** Lets a strip beside a text field keep the keyboard open (`e.preventDefault()`). */\n onPointerDown?: (e: PointerEvent) => void;\n}\n\n/**\n * One strip of tabs: the chosen one lifted and open into the pane below, the rest a step lower. Every row of tabs —\n * a window's sections, a filter, a difficulty — goes through here so they all read the same; never a row of buttons\n * or a `<select>`. A strip too long for one row takes `wrap` (or `className={cx('wrap')}`).\n */\nexport function TabStrip<T extends string>({ tabs, value, onChange, small, wrap, className, label, onPointerDown }: TabStripProps<T>) {\n const cx = useCx();\n const classes = ['e1681-tabs', small ? 'small' : '', wrap ? 'wrap' : '', className ?? ''].filter(Boolean).join(' ');\n return (\n <div className={cx(classes)} role=\"tablist\" aria-label={label}>\n {tabs.map((t) => {\n const style: CSSProperties | undefined = t.color ? { color: t.color } : undefined;\n return (\n <button\n key={t.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={t.id === value}\n className={cx(t.id === value ? 'e1681-tab active' : 'e1681-tab')}\n style={style}\n disabled={t.disabled}\n title={t.title}\n // a mouse takes a tab the moment it is pressed, or it lags a beat behind the hand; a finger only on a tap\n // (the click, which the browser never sends after a scroll), since a finger also presses to scroll the strip\n onPointerDown={(e) => {\n onPointerDown?.(e);\n if (e.pointerType === 'mouse' && e.button === 0 && !t.disabled && t.id !== value) onChange(t.id);\n }}\n onClick={() => {\n if (t.id !== value) onChange(t.id);\n }}\n >\n {t.label}\n </button>\n );\n })}\n </div>\n );\n}\n"],"names":["TabStrip","tabs","value","onChange","small","wrap","className","label","onPointerDown","cx","useCx","classes","jsx","t","style"],"mappings":";;AAiCO,SAASA,EAA2B,EAAE,MAAAC,GAAM,OAAAC,GAAO,UAAAC,GAAU,OAAAC,GAAO,MAAAC,GAAM,WAAAC,GAAW,OAAAC,GAAO,eAAAC,KAAmC;AACpI,QAAMC,IAAKC,EAAA,GACLC,IAAU,CAAC,cAAcP,IAAQ,UAAU,IAAIC,IAAO,SAAS,IAAIC,KAAa,EAAE,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAClH,SACE,gBAAAM,EAAC,OAAA,EAAI,WAAWH,EAAGE,CAAO,GAAG,MAAK,WAAU,cAAYJ,GACrD,UAAAN,EAAK,IAAI,CAACY,MAAM;AACf,UAAMC,IAAmCD,EAAE,QAAQ,EAAE,OAAOA,EAAE,UAAU;AACxE,WACE,gBAAAD;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,MAAK;AAAA,QACL,MAAK;AAAA,QACL,iBAAeC,EAAE,OAAOX;AAAA,QACxB,WAAWO,EAAGI,EAAE,OAAOX,IAAQ,qBAAqB,WAAW;AAAA,QAC/D,OAAAY;AAAA,QACA,UAAUD,EAAE;AAAA,QACZ,OAAOA,EAAE;AAAA,QAGT,eAAe,CAAC,MAAM;AACpB,UAAAL,IAAgB,CAAC,GACb,EAAE,gBAAgB,WAAW,EAAE,WAAW,KAAK,CAACK,EAAE,YAAYA,EAAE,OAAOX,KAAOC,EAASU,EAAE,EAAE;AAAA,QACjG;AAAA,QACA,SAAS,MAAM;AACb,UAAIA,EAAE,OAAOX,KAAOC,EAASU,EAAE,EAAE;AAAA,QACnC;AAAA,QAEC,UAAAA,EAAE;AAAA,MAAA;AAAA,MAlBEA,EAAE;AAAA,IAAA;AAAA,EAqBb,CAAC,EAAA,CACH;AAEJ;"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { jsx as L } from "react/jsx-runtime";
|
|
2
|
+
import { useState as b, useEffect as y } from "react";
|
|
3
|
+
import { Tooltip as A } from "./Tooltip.js";
|
|
4
|
+
import { useCx as g, useUi as C } from "./UiProvider.js";
|
|
5
|
+
function S({ delayMs: d = 350, root: m, className: f }) {
|
|
6
|
+
const T = g(), p = C(), [s, i] = b(null);
|
|
7
|
+
return y(() => {
|
|
8
|
+
if (p.touch || typeof document > "u") return;
|
|
9
|
+
let t = null, n = "", c = 0, u = !1, l = { x: 0, y: 0 };
|
|
10
|
+
const h = () => m?.() ?? document.documentElement, v = () => {
|
|
11
|
+
if (!t) return;
|
|
12
|
+
const e = t.getAttribute("title");
|
|
13
|
+
e !== null && (t.removeAttribute("title"), n = e, u && i(n ? { text: n, ...l } : null));
|
|
14
|
+
}, o = () => {
|
|
15
|
+
window.clearTimeout(c), t && t.isConnected && !t.hasAttribute("title") && n && t.setAttribute("title", n), t = null, n = "", u = !1, i(null);
|
|
16
|
+
}, a = (e) => {
|
|
17
|
+
if (e.pointerType === "touch") return;
|
|
18
|
+
const r = e.target?.closest?.("[title]");
|
|
19
|
+
!r || r === t || !h().contains(r) || (o(), t = r, l = { x: e.clientX, y: e.clientY }, v(), n && (c = window.setTimeout(() => {
|
|
20
|
+
u = !0, i({ text: n, ...l });
|
|
21
|
+
}, d)));
|
|
22
|
+
}, w = (e) => {
|
|
23
|
+
if (t) {
|
|
24
|
+
if (!t.isConnected) return o();
|
|
25
|
+
l = { x: e.clientX, y: e.clientY }, v(), u && i(n ? { text: n, ...l } : null);
|
|
26
|
+
}
|
|
27
|
+
}, x = (e) => {
|
|
28
|
+
if (!t) return;
|
|
29
|
+
const r = e.relatedTarget;
|
|
30
|
+
r && t.contains(r) || o();
|
|
31
|
+
}, E = () => {
|
|
32
|
+
window.clearTimeout(c), u = !1, i(null);
|
|
33
|
+
};
|
|
34
|
+
return document.addEventListener("pointerover", a, !0), document.addEventListener("pointermove", w, !0), document.addEventListener("pointerout", x, !0), document.addEventListener("pointerdown", E, !0), window.addEventListener("blur", o), () => {
|
|
35
|
+
document.removeEventListener("pointerover", a, !0), document.removeEventListener("pointermove", w, !0), document.removeEventListener("pointerout", x, !0), document.removeEventListener("pointerdown", E, !0), window.removeEventListener("blur", o), o();
|
|
36
|
+
};
|
|
37
|
+
}, [p.touch, d, m]), s ? /* @__PURE__ */ L(A, { x: s.x, y: s.y, ...f ? { className: f } : {}, children: /* @__PURE__ */ L("div", { className: T("e1681-title-tip"), children: s.text }) }) : null;
|
|
38
|
+
}
|
|
39
|
+
export {
|
|
40
|
+
S as TitleTips
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=TitleTips.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TitleTips.js","sources":["../../src/react/TitleTips.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport { Tooltip } from './Tooltip';\nimport { useUi, useCx } from './UiProvider';\n\nexport interface TitleTipsProps {\n /** How long the pointer rests on an element before its tip shows (default 350 ms). */\n delayMs?: number;\n /** Only elements inside this one (default: the whole document). */\n root?: () => HTMLElement | null;\n className?: string;\n}\n\ntype Tip = { text: string; x: number; y: number };\n\n/**\n * Every `title=` drawn as the kit's `Tooltip` instead of the browser's. Mounted once: the element under the pointer\n * has its `title` taken off while the pointer stays on it (so the browser shows nothing) and put back when it leaves,\n * so components keep writing plain `title=` and React's diffing never sees a change. Pointer events, not mouse\n * events, because a disabled button fires only those. Desktop only: a touch screen never showed a title.\n */\nexport function TitleTips({ delayMs = 350, root, className }: TitleTipsProps) {\n const cx = useCx();\n const ui = useUi();\n const [tip, setTip] = useState<Tip | null>(null);\n\n useEffect(() => {\n if (ui.touch || typeof document === 'undefined') return;\n let el: HTMLElement | null = null;\n let text = '';\n let timer = 0;\n let shown = false;\n let at = { x: 0, y: 0 };\n const scope = () => root?.() ?? document.documentElement;\n\n // takes the title off `el` (again, if React wrote a new one meanwhile) and keeps its text\n const take = () => {\n if (!el) return;\n const t = el.getAttribute('title');\n if (t !== null) {\n el.removeAttribute('title');\n text = t;\n if (shown) setTip(text ? { text, ...at } : null);\n }\n };\n const release = () => {\n window.clearTimeout(timer);\n if (el && el.isConnected && !el.hasAttribute('title') && text) el.setAttribute('title', text);\n el = null;\n text = '';\n shown = false;\n setTip(null);\n };\n const over = (e: PointerEvent) => {\n if (e.pointerType === 'touch') return;\n const next = (e.target as Element | null)?.closest?.('[title]') as HTMLElement | null;\n if (!next || next === el || !scope().contains(next)) return;\n release();\n el = next;\n at = { x: e.clientX, y: e.clientY };\n take();\n if (!text) return;\n timer = window.setTimeout(() => {\n shown = true;\n setTip({ text, ...at });\n }, delayMs);\n };\n const move = (e: PointerEvent) => {\n if (!el) return;\n if (!el.isConnected) return release();\n at = { x: e.clientX, y: e.clientY };\n take();\n if (shown) setTip(text ? { text, ...at } : null);\n };\n const out = (e: PointerEvent) => {\n if (!el) return;\n const to = e.relatedTarget as Node | null;\n if (to && el.contains(to)) return;\n release();\n };\n // a press hides it, as the browser's own did, until the pointer leaves and comes back\n const press = () => {\n window.clearTimeout(timer);\n shown = false;\n setTip(null);\n };\n\n document.addEventListener('pointerover', over, true);\n document.addEventListener('pointermove', move, true);\n document.addEventListener('pointerout', out, true);\n document.addEventListener('pointerdown', press, true);\n window.addEventListener('blur', release);\n return () => {\n document.removeEventListener('pointerover', over, true);\n document.removeEventListener('pointermove', move, true);\n document.removeEventListener('pointerout', out, true);\n document.removeEventListener('pointerdown', press, true);\n window.removeEventListener('blur', release);\n release();\n };\n }, [ui.touch, delayMs, root]);\n\n if (!tip) return null;\n return (\n <Tooltip x={tip.x} y={tip.y} {...(className ? { className } : {})}>\n <div className={cx('e1681-title-tip')}>{tip.text}</div>\n </Tooltip>\n );\n}\n"],"names":["TitleTips","delayMs","root","className","cx","useCx","ui","useUi","tip","setTip","useState","useEffect","el","text","timer","shown","at","scope","take","t","release","over","next","move","out","to","press","jsx","Tooltip"],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { jsx as w } from "react/jsx-runtime";
|
|
2
|
+
import { useRef as x, useState as b, useLayoutEffect as y } from "react";
|
|
3
|
+
import { createPortal as H } from "react-dom";
|
|
4
|
+
import { placeTooltip as T } from "../ui/layout/placeTooltip.js";
|
|
5
|
+
import { cursorTip as z } from "./placement.js";
|
|
6
|
+
import { useCx as S, useUi as W } from "./UiProvider.js";
|
|
7
|
+
function P({ x: c = 0, y: l = 0, anchor: r, above: s, side: n, className: a, children: g }) {
|
|
8
|
+
const u = S(), t = W(), f = x(null), [i, d] = b({ width: 0, height: 0 });
|
|
9
|
+
y(() => {
|
|
10
|
+
const o = f.current;
|
|
11
|
+
o && (o.offsetWidth !== i.width || o.offsetHeight !== i.height) && d({ width: o.offsetWidth, height: o.offsetHeight });
|
|
12
|
+
});
|
|
13
|
+
const e = t.viewport(), p = r ? T(r, i, e, { side: n ?? (s ? "above" : "below"), margin: t.margin, snap: t.snap }) : z(c, l, i, e, { above: s ?? n === "above", margin: t.margin, snap: t.snap }), m = t.portal(), v = i.width > 0, h = /* @__PURE__ */ w(
|
|
14
|
+
"div",
|
|
15
|
+
{
|
|
16
|
+
ref: f,
|
|
17
|
+
className: u(`e1681-tooltip e1681-tip-frame${a ? ` ${a}` : ""}`),
|
|
18
|
+
role: "tooltip",
|
|
19
|
+
style: { left: p.x, top: p.y, maxHeight: Math.max(0, e.height - 2 * t.margin), visibility: v ? void 0 : "hidden" },
|
|
20
|
+
children: g
|
|
21
|
+
}
|
|
22
|
+
);
|
|
23
|
+
return m ? H(h, m) : h;
|
|
24
|
+
}
|
|
25
|
+
export {
|
|
26
|
+
P as Tooltip
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=Tooltip.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Tooltip.js","sources":["../../src/react/Tooltip.tsx"],"sourcesContent":["import { type ReactNode, useLayoutEffect, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport type { Rect, Size } from '../ui/layout/geometry';\nimport { placeTooltip, type TipSide } from '../ui/layout/placeTooltip';\nimport { cursorTip } from './placement';\nimport { useUi, useCx } from './UiProvider';\n\nexport interface TooltipProps {\n /** By the cursor: its screen position. */\n x?: number;\n y?: number;\n /** Or beside an element: its screen rect (`getBoundingClientRect()`). Wins over `x`/`y`. */\n anchor?: Rect;\n /** Open over the cursor (or on this side of the anchor) first; it flips when there is no room. */\n above?: boolean;\n side?: TipSide;\n className?: string;\n children: ReactNode;\n}\n\n/**\n * A tooltip frame kept on screen by its own measured size (`placeTooltip`): under the cursor while it fits, over it\n * when it does not, slid along the edge, never taller than the viewport. Portalled to the `UiProvider`'s `portal`, so\n * a window's `overflow` or transform never clips or shifts it.\n */\nexport function Tooltip({ x = 0, y = 0, anchor, above, side, className, children }: TooltipProps) {\n const cx = useCx();\n const ui = useUi();\n const ref = useRef<HTMLDivElement>(null);\n const [size, setSize] = useState<Size>({ width: 0, height: 0 });\n useLayoutEffect(() => {\n const el = ref.current;\n if (el && (el.offsetWidth !== size.width || el.offsetHeight !== size.height)) setSize({ width: el.offsetWidth, height: el.offsetHeight });\n });\n const view = ui.viewport();\n const at = anchor\n ? placeTooltip(anchor, size, view, { side: side ?? (above ? 'above' : 'below'), margin: ui.margin, snap: ui.snap })\n : cursorTip(x, y, size, view, { above: above ?? side === 'above', margin: ui.margin, snap: ui.snap });\n const target = ui.portal();\n const measured = size.width > 0;\n const tip = (\n <div\n ref={ref}\n className={cx(`e1681-tooltip e1681-tip-frame${className ? ` ${className}` : ''}`)}\n role=\"tooltip\"\n style={{ left: at.x, top: at.y, maxHeight: Math.max(0, view.height - 2 * ui.margin), visibility: measured ? undefined : 'hidden' }}\n >\n {children}\n </div>\n );\n return target ? createPortal(tip, target) : tip;\n}\n"],"names":["Tooltip","x","y","anchor","above","side","className","children","cx","useCx","ui","useUi","ref","useRef","size","setSize","useState","useLayoutEffect","el","view","at","placeTooltip","cursorTip","target","measured","tip","jsx","createPortal"],"mappings":";;;;;;AAyBO,SAASA,EAAQ,EAAE,GAAAC,IAAI,GAAG,GAAAC,IAAI,GAAG,QAAAC,GAAQ,OAAAC,GAAO,MAAAC,GAAM,WAAAC,GAAW,UAAAC,EAAA,GAA0B;AAChG,QAAMC,IAAKC,EAAA,GACLC,IAAKC,EAAA,GACLC,IAAMC,EAAuB,IAAI,GACjC,CAACC,GAAMC,CAAO,IAAIC,EAAe,EAAE,OAAO,GAAG,QAAQ,GAAG;AAC9D,EAAAC,EAAgB,MAAM;AACpB,UAAMC,IAAKN,EAAI;AACf,IAAIM,MAAOA,EAAG,gBAAgBJ,EAAK,SAASI,EAAG,iBAAiBJ,EAAK,WAASC,EAAQ,EAAE,OAAOG,EAAG,aAAa,QAAQA,EAAG,cAAc;AAAA,EAC1I,CAAC;AACD,QAAMC,IAAOT,EAAG,SAAA,GACVU,IAAKjB,IACPkB,EAAalB,GAAQW,GAAMK,GAAM,EAAE,MAAMd,MAASD,IAAQ,UAAU,UAAU,QAAQM,EAAG,QAAQ,MAAMA,EAAG,KAAA,CAAM,IAChHY,EAAUrB,GAAGC,GAAGY,GAAMK,GAAM,EAAE,OAAOf,KAASC,MAAS,SAAS,QAAQK,EAAG,QAAQ,MAAMA,EAAG,MAAM,GAChGa,IAASb,EAAG,OAAA,GACZc,IAAWV,EAAK,QAAQ,GACxBW,IACJ,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAAd;AAAA,MACA,WAAWJ,EAAG,gCAAgCF,IAAY,IAAIA,CAAS,KAAK,EAAE,EAAE;AAAA,MAChF,MAAK;AAAA,MACL,OAAO,EAAE,MAAMc,EAAG,GAAG,KAAKA,EAAG,GAAG,WAAW,KAAK,IAAI,GAAGD,EAAK,SAAS,IAAIT,EAAG,MAAM,GAAG,YAAYc,IAAW,SAAY,SAAA;AAAA,MAEvH,UAAAjB;AAAA,IAAA;AAAA,EAAA;AAGL,SAAOgB,IAASI,EAAaF,GAAKF,CAAM,IAAIE;AAC9C;"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { jsx as v } from "react/jsx-runtime";
|
|
2
|
+
import { useContext as S, useMemo as C, createContext as y } from "react";
|
|
3
|
+
import { isTouchUi as L } from "../platform/touch.js";
|
|
4
|
+
import { classJoiner as b } from "./classNames.js";
|
|
5
|
+
import { DEFAULT_LABELS as N } from "./labels.js";
|
|
6
|
+
const w = {};
|
|
7
|
+
function A() {
|
|
8
|
+
return typeof window > "u" ? { width: 0, height: 0 } : { width: window.innerWidth, height: window.innerHeight };
|
|
9
|
+
}
|
|
10
|
+
function E() {
|
|
11
|
+
return typeof document > "u" ? null : document.body;
|
|
12
|
+
}
|
|
13
|
+
function g() {
|
|
14
|
+
return { touch: L(), scale: 1, minScale: 1, sheetScale: 1, margin: 8, snap: !0, labels: N, viewport: A, portal: E, classNames: w, cx: b(w) };
|
|
15
|
+
}
|
|
16
|
+
const r = y(null);
|
|
17
|
+
function z({ children: t, labels: n, touch: s, scale: c, minScale: u, sheetScale: a, margin: l, snap: m, viewport: d, portal: f, classNames: o }) {
|
|
18
|
+
const h = S(r), U = C(() => {
|
|
19
|
+
const e = h ?? g(), p = c ?? e.scale, i = o ? { ...e.classNames, ...o } : e.classNames;
|
|
20
|
+
return {
|
|
21
|
+
touch: s ?? e.touch,
|
|
22
|
+
scale: p,
|
|
23
|
+
minScale: u ?? Math.min(e.minScale, p),
|
|
24
|
+
sheetScale: a ?? e.sheetScale,
|
|
25
|
+
margin: l ?? e.margin,
|
|
26
|
+
snap: m ?? e.snap,
|
|
27
|
+
labels: n ? { ...e.labels, ...n } : e.labels,
|
|
28
|
+
viewport: d ?? e.viewport,
|
|
29
|
+
portal: f ?? e.portal,
|
|
30
|
+
classNames: i,
|
|
31
|
+
cx: i === e.classNames ? e.cx : b(i)
|
|
32
|
+
};
|
|
33
|
+
}, [h, n, s, c, u, a, l, m, d, f, o]);
|
|
34
|
+
return /* @__PURE__ */ v(r.Provider, { value: U, children: t });
|
|
35
|
+
}
|
|
36
|
+
let x = null;
|
|
37
|
+
function M() {
|
|
38
|
+
const t = S(r);
|
|
39
|
+
return t || (x ??= g(), x);
|
|
40
|
+
}
|
|
41
|
+
function B() {
|
|
42
|
+
return M().cx;
|
|
43
|
+
}
|
|
44
|
+
export {
|
|
45
|
+
z as UiProvider,
|
|
46
|
+
g as defaultUiSettings,
|
|
47
|
+
B as useCx,
|
|
48
|
+
M as useUi
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=UiProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UiProvider.js","sources":["../../src/react/UiProvider.tsx"],"sourcesContent":["import { createContext, useContext, useMemo, type ReactNode } from 'react';\nimport { isTouchUi } from '../platform/touch';\nimport type { Size } from '../ui/layout/geometry';\nimport { classJoiner, type ClassJoiner } from './classNames';\nimport { DEFAULT_LABELS, type UiLabels } from './labels';\n\n/** What every component of the kit reads: where it is, how big the screen is and the words it prints. */\nexport interface UiSettings {\n /** Fingers, not a mouse: windows become full-screen sheets, tooltips are not shown. Default: `isTouchUi()`. */\n touch: boolean;\n /**\n * The scale windows and dialogs are meant to be drawn at (`fitToViewport`'s `scale`): a whole multiple for a\n * pixel-art UI laid out on small units. Default 1.\n */\n scale: number;\n /** The smallest scale a window may shrink to before its body scrolls instead (default: `scale`, never shrinks). */\n minScale: number;\n /** A player's \"window size\" for touch sheets: laid out on a box `1 / sheetScale` the screen and drawn back down. */\n sheetScale: number;\n /** Kept clear between a window and the screen's edges (default 8). */\n margin: number;\n /** Positions and sizes land on whole pixels (default true): pixel art at x.5 reads blurred. */\n snap: boolean;\n labels: UiLabels;\n /** The box windows, tooltips and lists are placed in. Default: the browser window. */\n viewport: () => Size;\n /** Where tooltips, the select's list and dialogs are portalled. Default: `document.body`. */\n portal: () => HTMLElement | null;\n /**\n * A game's own class names hung beside the kit's, keyed by the kit's name without its prefix (`tabs`, `tab`,\n * `button`, `select-list`…) or by a state (`picked`, `open`): a game whose stylesheet already styles its own names\n * takes the kit without rewriting it. Default none.\n */\n classNames: Readonly<Record<string, string>>;\n /** Joins class names, adding the game's beside each of the kit's (`classNames`); what every component calls. */\n cx: ClassJoiner;\n}\n\nexport interface UiProviderProps extends Partial<Omit<UiSettings, 'labels' | 'cx'>> {\n labels?: Partial<UiLabels>;\n children?: ReactNode;\n}\n\nconst NO_CLASSES: Readonly<Record<string, string>> = {};\n\nfunction windowSize(): Size {\n return typeof window === 'undefined' ? { width: 0, height: 0 } : { width: window.innerWidth, height: window.innerHeight };\n}\n\nfunction body(): HTMLElement | null {\n return typeof document === 'undefined' ? null : document.body;\n}\n\n/** The settings a component sees with no `UiProvider` above it. */\nexport function defaultUiSettings(): UiSettings {\n return { touch: isTouchUi(), scale: 1, minScale: 1, sheetScale: 1, margin: 8, snap: true, labels: DEFAULT_LABELS, viewport: windowSize, portal: body, classNames: NO_CLASSES, cx: classJoiner(NO_CLASSES) };\n}\n\nconst UiContext = createContext<UiSettings | null>(null);\n\n/**\n * Optional: sets the touch mode, the window scale, the words and the box to place things in for every component\n * below it. A UI mounted in a `DomOverlay` passes the overlay's content size as `viewport` and the overlay's\n * content as `portal`, so tooltips and lists land inside its scaled box.\n */\nexport function UiProvider({ children, labels, touch, scale, minScale, sheetScale, margin, snap, viewport, portal, classNames }: UiProviderProps) {\n const outer = useContext(UiContext);\n const value = useMemo<UiSettings>(() => {\n const base = outer ?? defaultUiSettings();\n const s = scale ?? base.scale;\n const classes = classNames ? { ...base.classNames, ...classNames } : base.classNames;\n return {\n touch: touch ?? base.touch,\n scale: s,\n minScale: minScale ?? Math.min(base.minScale, s),\n sheetScale: sheetScale ?? base.sheetScale,\n margin: margin ?? base.margin,\n snap: snap ?? base.snap,\n labels: labels ? { ...base.labels, ...labels } : base.labels,\n viewport: viewport ?? base.viewport,\n portal: portal ?? base.portal,\n classNames: classes,\n cx: classes === base.classNames ? base.cx : classJoiner(classes),\n };\n }, [outer, labels, touch, scale, minScale, sheetScale, margin, snap, viewport, portal, classNames]);\n return <UiContext.Provider value={value}>{children}</UiContext.Provider>;\n}\n\nlet fallback: UiSettings | null = null;\n\n/** The kit's settings: the nearest `UiProvider`'s, or the defaults. */\nexport function useUi(): UiSettings {\n const ui = useContext(UiContext);\n if (ui) return ui;\n fallback ??= defaultUiSettings();\n return fallback;\n}\n\n/** The class joiner of the nearest `UiProvider` (`UiSettings.cx`). */\nexport function useCx(): ClassJoiner {\n return useUi().cx;\n}\n"],"names":["NO_CLASSES","windowSize","body","defaultUiSettings","isTouchUi","DEFAULT_LABELS","classJoiner","UiContext","createContext","UiProvider","children","labels","touch","scale","minScale","sheetScale","margin","snap","viewport","portal","classNames","outer","useContext","value","useMemo","base","s","classes","jsx","fallback","useUi","ui","useCx"],"mappings":";;;;;AA2CA,MAAMA,IAA+C,CAAA;AAErD,SAASC,IAAmB;AAC1B,SAAO,OAAO,SAAW,MAAc,EAAE,OAAO,GAAG,QAAQ,EAAA,IAAM,EAAE,OAAO,OAAO,YAAY,QAAQ,OAAO,YAAA;AAC9G;AAEA,SAASC,IAA2B;AAClC,SAAO,OAAO,WAAa,MAAc,OAAO,SAAS;AAC3D;AAGO,SAASC,IAAgC;AAC9C,SAAO,EAAE,OAAOC,EAAA,GAAa,OAAO,GAAG,UAAU,GAAG,YAAY,GAAG,QAAQ,GAAG,MAAM,IAAM,QAAQC,GAAgB,UAAUJ,GAAY,QAAQC,GAAM,YAAYF,GAAY,IAAIM,EAAYN,CAAU,EAAA;AAC1M;AAEA,MAAMO,IAAYC,EAAiC,IAAI;AAOhD,SAASC,EAAW,EAAE,UAAAC,GAAU,QAAAC,GAAQ,OAAAC,GAAO,OAAAC,GAAO,UAAAC,GAAU,YAAAC,GAAY,QAAAC,GAAQ,MAAAC,GAAM,UAAAC,GAAU,QAAAC,GAAQ,YAAAC,KAA+B;AAChJ,QAAMC,IAAQC,EAAWf,CAAS,GAC5BgB,IAAQC,EAAoB,MAAM;AACtC,UAAMC,IAAOJ,KAASlB,EAAA,GAChBuB,IAAIb,KAASY,EAAK,OAClBE,IAAUP,IAAa,EAAE,GAAGK,EAAK,YAAY,GAAGL,MAAeK,EAAK;AAC1E,WAAO;AAAA,MACL,OAAOb,KAASa,EAAK;AAAA,MACrB,OAAOC;AAAA,MACP,UAAUZ,KAAY,KAAK,IAAIW,EAAK,UAAUC,CAAC;AAAA,MAC/C,YAAYX,KAAcU,EAAK;AAAA,MAC/B,QAAQT,KAAUS,EAAK;AAAA,MACvB,MAAMR,KAAQQ,EAAK;AAAA,MACnB,QAAQd,IAAS,EAAE,GAAGc,EAAK,QAAQ,GAAGd,EAAA,IAAWc,EAAK;AAAA,MACtD,UAAUP,KAAYO,EAAK;AAAA,MAC3B,QAAQN,KAAUM,EAAK;AAAA,MACvB,YAAYE;AAAA,MACZ,IAAIA,MAAYF,EAAK,aAAaA,EAAK,KAAKnB,EAAYqB,CAAO;AAAA,IAAA;AAAA,EAEnE,GAAG,CAACN,GAAOV,GAAQC,GAAOC,GAAOC,GAAUC,GAAYC,GAAQC,GAAMC,GAAUC,GAAQC,CAAU,CAAC;AAClG,SAAO,gBAAAQ,EAACrB,EAAU,UAAV,EAAmB,OAAAgB,GAAe,UAAAb,EAAA,CAAS;AACrD;AAEA,IAAImB,IAA8B;AAG3B,SAASC,IAAoB;AAClC,QAAMC,IAAKT,EAAWf,CAAS;AAC/B,SAAIwB,MACJF,MAAa1B,EAAA,GACN0B;AACT;AAGO,SAASG,IAAqB;AACnC,SAAOF,IAAQ;AACjB;"}
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
const o = `
|
|
2
|
+
:root {
|
|
3
|
+
--e1681-font: inherit;
|
|
4
|
+
--e1681-font-size: 16px;
|
|
5
|
+
--e1681-text: #ece6d6;
|
|
6
|
+
--e1681-muted: #9c968a;
|
|
7
|
+
--e1681-accent: #e8c060;
|
|
8
|
+
--e1681-bg: #1d242e;
|
|
9
|
+
--e1681-well: #131a24;
|
|
10
|
+
--e1681-control-bg: #2a323e;
|
|
11
|
+
--e1681-border: #6a5634;
|
|
12
|
+
--e1681-border-width: 2px;
|
|
13
|
+
--e1681-backdrop: rgba(0, 0, 0, 0.5);
|
|
14
|
+
--e1681-frame: none;
|
|
15
|
+
--e1681-frame-slice: 0;
|
|
16
|
+
--e1681-frame-width: var(--e1681-border-width);
|
|
17
|
+
--e1681-tip-frame: var(--e1681-frame);
|
|
18
|
+
--e1681-tip-frame-slice: var(--e1681-frame-slice);
|
|
19
|
+
--e1681-tip-frame-width: var(--e1681-frame-width);
|
|
20
|
+
--e1681-control-frame: none;
|
|
21
|
+
--e1681-control-frame-slice: 0;
|
|
22
|
+
--e1681-control-frame-width: var(--e1681-border-width);
|
|
23
|
+
--e1681-tab-frame: var(--e1681-control-frame);
|
|
24
|
+
--e1681-tab-active-frame: var(--e1681-tab-frame);
|
|
25
|
+
--e1681-tab-frame-slice: var(--e1681-control-frame-slice);
|
|
26
|
+
--e1681-tab-frame-width: var(--e1681-control-frame-width);
|
|
27
|
+
--e1681-well-frame: none;
|
|
28
|
+
--e1681-well-frame-slice: 0;
|
|
29
|
+
--e1681-well-frame-width: var(--e1681-border-width);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
.e1681-frame {
|
|
33
|
+
color: var(--e1681-text);
|
|
34
|
+
font-family: var(--e1681-font);
|
|
35
|
+
font-size: var(--e1681-font-size);
|
|
36
|
+
background: var(--e1681-bg) padding-box;
|
|
37
|
+
border-style: solid; border-color: var(--e1681-border); border-width: var(--e1681-frame-width);
|
|
38
|
+
border-image: var(--e1681-frame) var(--e1681-frame-slice) / var(--e1681-frame-width) stretch;
|
|
39
|
+
box-sizing: border-box;
|
|
40
|
+
}
|
|
41
|
+
.e1681-tip-frame {
|
|
42
|
+
color: var(--e1681-text);
|
|
43
|
+
font-family: var(--e1681-font);
|
|
44
|
+
font-size: var(--e1681-font-size);
|
|
45
|
+
background: var(--e1681-bg) padding-box;
|
|
46
|
+
border-style: solid; border-color: var(--e1681-border); border-width: var(--e1681-tip-frame-width);
|
|
47
|
+
border-image: var(--e1681-tip-frame) var(--e1681-tip-frame-slice) / var(--e1681-tip-frame-width) stretch;
|
|
48
|
+
box-sizing: border-box;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/* windows: placed by useFitToViewport in whole pixels; header kept, body scrolls */
|
|
52
|
+
.e1681-panel {
|
|
53
|
+
position: fixed;
|
|
54
|
+
z-index: 10;
|
|
55
|
+
display: flex;
|
|
56
|
+
flex-direction: column;
|
|
57
|
+
min-width: 0;
|
|
58
|
+
overflow: hidden;
|
|
59
|
+
pointer-events: auto;
|
|
60
|
+
}
|
|
61
|
+
.e1681-panel-header { display: flex; align-items: center; gap: 8px; flex: none; padding: 2px 4px 6px; }
|
|
62
|
+
.e1681-panel-title { flex: 1; min-width: 0; margin: 0; font-size: 1.25em; font-weight: normal; color: var(--e1681-accent); }
|
|
63
|
+
.e1681-panel-body { flex: 1 1 auto; min-height: 0; overflow-y: auto; overflow-x: hidden; padding: 0 4px 4px; }
|
|
64
|
+
.e1681-panel-footer { flex: none; display: flex; flex-wrap: wrap; gap: 6px; justify-content: flex-end; padding: 6px 4px 0; }
|
|
65
|
+
.e1681-close {
|
|
66
|
+
flex: none; padding: 2px; border: 0; background: none; color: var(--e1681-text); cursor: pointer; line-height: 0;
|
|
67
|
+
}
|
|
68
|
+
.e1681-close:hover { color: var(--e1681-accent); }
|
|
69
|
+
/* a touch screen's sheet: the whole screen inside the safe area */
|
|
70
|
+
.e1681-panel.e1681-sheet {
|
|
71
|
+
inset: env(safe-area-inset-top, 0px) env(safe-area-inset-right, 0px) env(safe-area-inset-bottom, 0px) env(safe-area-inset-left, 0px);
|
|
72
|
+
width: auto;
|
|
73
|
+
height: auto;
|
|
74
|
+
}
|
|
75
|
+
.e1681-panel.e1681-sheet .e1681-panel-body { overscroll-behavior: contain; -webkit-overflow-scrolling: touch; }
|
|
76
|
+
|
|
77
|
+
/* controls */
|
|
78
|
+
.e1681-button, .e1681-input, .e1681-select {
|
|
79
|
+
color: var(--e1681-text);
|
|
80
|
+
font: inherit;
|
|
81
|
+
background: var(--e1681-control-bg) padding-box;
|
|
82
|
+
border-style: solid; border-color: var(--e1681-border); border-width: var(--e1681-control-frame-width);
|
|
83
|
+
border-image: var(--e1681-control-frame) var(--e1681-control-frame-slice) / var(--e1681-control-frame-width) stretch;
|
|
84
|
+
box-shadow: none;
|
|
85
|
+
}
|
|
86
|
+
.e1681-button { padding: 2px 10px; cursor: pointer; min-height: 28px; }
|
|
87
|
+
.e1681-button.small { padding: 0 6px; min-height: 22px; }
|
|
88
|
+
.e1681-button.ghost { background-color: transparent; }
|
|
89
|
+
.e1681-button:hover:not(:disabled) { color: var(--e1681-accent); }
|
|
90
|
+
/* pressed: the same face a pixel lower, never a transform */
|
|
91
|
+
.e1681-button:active:not(:disabled) { padding-top: 3px; padding-bottom: 1px; }
|
|
92
|
+
.e1681-button:disabled { opacity: 0.55; cursor: default; }
|
|
93
|
+
.e1681-input { padding: 2px 6px; min-width: 0; }
|
|
94
|
+
.e1681-glyph { display: inline-block; flex: none; vertical-align: -1px; }
|
|
95
|
+
|
|
96
|
+
/* tabs: a row that scrolls sideways, or wraps with .wrap */
|
|
97
|
+
.e1681-tabs { display: flex; gap: 2px; align-items: flex-end; overflow-x: auto; overflow-y: hidden; scrollbar-width: none; margin-bottom: 8px; }
|
|
98
|
+
.e1681-tabs::-webkit-scrollbar { display: none; }
|
|
99
|
+
.e1681-tabs.wrap { flex-wrap: wrap; overflow-x: visible; row-gap: 4px; }
|
|
100
|
+
.e1681-tab {
|
|
101
|
+
flex: 0 0 auto;
|
|
102
|
+
padding: 2px 10px;
|
|
103
|
+
color: var(--e1681-muted);
|
|
104
|
+
font: inherit;
|
|
105
|
+
cursor: pointer;
|
|
106
|
+
white-space: nowrap;
|
|
107
|
+
background: var(--e1681-control-bg) padding-box;
|
|
108
|
+
border-style: solid; border-color: var(--e1681-border); border-width: var(--e1681-tab-frame-width);
|
|
109
|
+
border-image: var(--e1681-tab-frame) var(--e1681-tab-frame-slice) / var(--e1681-tab-frame-width) stretch;
|
|
110
|
+
}
|
|
111
|
+
.e1681-tab:hover:not(.active):not(:disabled) { color: var(--e1681-text); }
|
|
112
|
+
.e1681-tab.active { color: var(--e1681-accent); padding-bottom: 6px; border-image-source: var(--e1681-tab-active-frame); }
|
|
113
|
+
.e1681-tab:disabled { opacity: 0.55; cursor: default; }
|
|
114
|
+
.e1681-tab:focus-visible { outline: 2px solid var(--e1681-accent); outline-offset: -4px; }
|
|
115
|
+
.e1681-tabs.small { margin-bottom: 4px; }
|
|
116
|
+
.e1681-tabs.small .e1681-tab { padding: 0 6px; }
|
|
117
|
+
.e1681-tabs.small .e1681-tab.active { padding-bottom: 4px; }
|
|
118
|
+
|
|
119
|
+
/* list beside detail */
|
|
120
|
+
.e1681-split {
|
|
121
|
+
display: grid;
|
|
122
|
+
grid-template-columns: var(--e1681-split-list, minmax(0, 1fr)) minmax(0, 1fr);
|
|
123
|
+
gap: 12px;
|
|
124
|
+
height: min(58vh, 620px);
|
|
125
|
+
}
|
|
126
|
+
.e1681-split.fit { height: auto; max-height: min(58vh, 620px); }
|
|
127
|
+
.e1681-split-list, .e1681-split-detail { min-height: 0; overflow-y: auto; overflow-x: hidden; }
|
|
128
|
+
.e1681-split-list { padding-right: 4px; }
|
|
129
|
+
.e1681-split-detail {
|
|
130
|
+
display: flex;
|
|
131
|
+
flex-direction: column;
|
|
132
|
+
gap: 4px;
|
|
133
|
+
padding: 8px 10px;
|
|
134
|
+
background: var(--e1681-well) padding-box;
|
|
135
|
+
border-style: solid; border-color: var(--e1681-border); border-width: var(--e1681-well-frame-width);
|
|
136
|
+
border-image: var(--e1681-well-frame) var(--e1681-well-frame-slice) / var(--e1681-well-frame-width) stretch;
|
|
137
|
+
}
|
|
138
|
+
.e1681-split-empty { flex: 1; display: flex; align-items: center; justify-content: center; text-align: center; color: var(--e1681-muted); }
|
|
139
|
+
.e1681-split.stack { grid-template-columns: minmax(0, 1fr); }
|
|
140
|
+
.e1681-split.stack.show-list .e1681-split-detail, .e1681-split.stack.show-detail .e1681-split-list { display: none; }
|
|
141
|
+
.e1681-split-back { align-self: flex-start; }
|
|
142
|
+
.e1681-row { display: flex; align-items: center; gap: 8px; padding: 4px 6px; margin-bottom: 4px; border: var(--e1681-border-width) solid transparent; }
|
|
143
|
+
.e1681-pickable { cursor: pointer; }
|
|
144
|
+
.e1681-pickable:hover:not(.picked):not(.disabled) { border-color: var(--e1681-border); }
|
|
145
|
+
.e1681-row.picked { border-color: var(--e1681-accent); color: var(--e1681-accent); }
|
|
146
|
+
.e1681-row.disabled { opacity: 0.55; cursor: default; }
|
|
147
|
+
|
|
148
|
+
/* the select: as wide as its longest label */
|
|
149
|
+
.e1681-select { display: inline-flex; align-items: center; gap: 6px; flex: none; padding: 1px 4px; text-align: left; cursor: pointer; }
|
|
150
|
+
.e1681-select:hover:not(:disabled), .e1681-select.open { color: var(--e1681-accent); }
|
|
151
|
+
.e1681-select:disabled { opacity: 0.6; cursor: default; }
|
|
152
|
+
.e1681-select.grow { flex: 1 1 auto; min-width: 0; }
|
|
153
|
+
.e1681-select.grow .e1681-select-labels { flex: 1 1 auto; min-width: 0; overflow: hidden; }
|
|
154
|
+
.e1681-select.grow .e1681-select-labels > span { overflow: hidden; text-overflow: ellipsis; }
|
|
155
|
+
.e1681-select-labels { display: grid; white-space: nowrap; }
|
|
156
|
+
.e1681-select-labels > span { grid-area: 1 / 1; visibility: hidden; }
|
|
157
|
+
.e1681-select-labels > span.shown { visibility: visible; }
|
|
158
|
+
.e1681-select-list {
|
|
159
|
+
position: fixed;
|
|
160
|
+
z-index: 10000;
|
|
161
|
+
box-sizing: border-box;
|
|
162
|
+
width: max-content;
|
|
163
|
+
padding: 2px;
|
|
164
|
+
overflow-y: auto;
|
|
165
|
+
pointer-events: auto;
|
|
166
|
+
}
|
|
167
|
+
.e1681-select-option { padding: 2px 6px; white-space: nowrap; cursor: pointer; }
|
|
168
|
+
.e1681-select-list.measuring .e1681-select-option { width: max-content; }
|
|
169
|
+
.e1681-select-option.hot { background: var(--e1681-control-bg); }
|
|
170
|
+
.e1681-select-option.picked { color: var(--e1681-accent); }
|
|
171
|
+
|
|
172
|
+
/* tooltips */
|
|
173
|
+
.e1681-tooltip { position: fixed; z-index: 10001; max-width: 360px; padding: 4px 8px; overflow: hidden; pointer-events: none; }
|
|
174
|
+
.e1681-title-tip { white-space: pre-line; }
|
|
175
|
+
|
|
176
|
+
/* slider: a square knob, flat fills */
|
|
177
|
+
.e1681-slider-row { display: flex; align-items: center; gap: 8px; flex: 1; min-width: 0; }
|
|
178
|
+
.e1681-slider { flex: 1; min-width: 0; padding: 6px 7px; cursor: pointer; touch-action: none; user-select: none; pointer-events: auto; }
|
|
179
|
+
.e1681-slider:focus { outline: none; }
|
|
180
|
+
.e1681-slider:focus-visible { outline: 2px solid var(--e1681-accent); outline-offset: 2px; }
|
|
181
|
+
.e1681-slider[aria-disabled='true'] { opacity: 0.55; cursor: default; }
|
|
182
|
+
.e1681-slider-track {
|
|
183
|
+
position: relative;
|
|
184
|
+
height: 6px;
|
|
185
|
+
background: var(--e1681-well) padding-box;
|
|
186
|
+
border-style: solid; border-color: var(--e1681-border); border-width: var(--e1681-well-frame-width);
|
|
187
|
+
border-image: var(--e1681-well-frame) var(--e1681-well-frame-slice) / var(--e1681-well-frame-width) stretch;
|
|
188
|
+
}
|
|
189
|
+
.e1681-slider-fill { position: absolute; left: 0; top: 0; bottom: 0; background: var(--e1681-accent); }
|
|
190
|
+
/* the knob is offset by half its own whole-pixel width with a margin, so it stays on the pixel grid */
|
|
191
|
+
.e1681-slider-knob { position: absolute; top: -6px; width: 10px; height: 14px; margin-left: -5px; background: var(--e1681-text); border: 2px solid var(--e1681-well); box-sizing: border-box; }
|
|
192
|
+
.e1681-slider-value { min-width: 40px; text-align: right; font-variant-numeric: tabular-nums; }
|
|
193
|
+
|
|
194
|
+
/* dialogs */
|
|
195
|
+
.e1681-backdrop { position: fixed; inset: 0; z-index: 9000; background: var(--e1681-backdrop); pointer-events: auto; }
|
|
196
|
+
.e1681-dialog { position: fixed; display: flex; flex-direction: column; overflow: hidden; padding: 8px 10px; }
|
|
197
|
+
.e1681-dialog-body { flex: 1 1 auto; min-height: 0; overflow-y: auto; }
|
|
198
|
+
.e1681-dialog-actions { flex: none; display: flex; flex-wrap: wrap; gap: 8px; justify-content: flex-end; padding-top: 10px; }
|
|
199
|
+
.e1681-confirm-text { white-space: pre-line; }
|
|
200
|
+
.e1681-confirm-qty { display: flex; align-items: center; gap: 6px; margin-top: 10px; }
|
|
201
|
+
.e1681-confirm-qty-input { width: 56px; text-align: right; }
|
|
202
|
+
.e1681-choice-list { margin-top: 8px; }
|
|
203
|
+
.e1681-choice-icon { flex: none; line-height: 0; }
|
|
204
|
+
.e1681-choice-label { flex: 1; min-width: 0; }
|
|
205
|
+
.e1681-choice-note { flex: none; margin-left: auto; color: var(--e1681-muted); }
|
|
206
|
+
|
|
207
|
+
/* sprites at whole multiples */
|
|
208
|
+
.e1681-pixel-image { display: inline-flex; align-items: center; justify-content: center; flex: none; overflow: hidden; }
|
|
209
|
+
.e1681-pixel-image > img { image-rendering: pixelated; flex: none; }
|
|
210
|
+
`, i = "e1681-react-base";
|
|
211
|
+
function a(e = typeof document > "u" ? void 0 : document) {
|
|
212
|
+
if (!e) return null;
|
|
213
|
+
const r = e.getElementById(i);
|
|
214
|
+
if (r) return r;
|
|
215
|
+
const t = e.createElement("style");
|
|
216
|
+
return t.id = i, t.textContent = o, e.head.insertBefore(t, e.head.firstChild), t;
|
|
217
|
+
}
|
|
218
|
+
export {
|
|
219
|
+
o as baseCss,
|
|
220
|
+
a as injectBaseCss
|
|
221
|
+
};
|
|
222
|
+
//# sourceMappingURL=baseCss.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"baseCss.js","sources":["../../src/react/baseCss.ts"],"sourcesContent":["/**\n * The kit's base stylesheet, as a string: `injectBaseCss()` puts it in the page once, or a game copies it into its\n * own CSS. Everything is themed by custom properties a game sets on `:root` (or any ancestor):\n *\n * | Property | What |\n * |---|---|\n * | `--e1681-font`, `--e1681-font-size` | the UI's font |\n * | `--e1681-text`, `--e1681-muted`, `--e1681-accent` | text, quiet text, the picked / lit colour |\n * | `--e1681-bg`, `--e1681-well`, `--e1681-control-bg` | a window's fill, a sunk pane's, a button's or field's |\n * | `--e1681-border`, `--e1681-border-width` | the plain border used while no frame image is given |\n * | `--e1681-frame`, `--e1681-frame-slice`, `--e1681-frame-width` | windows and dialogs: a 9-slice `border-image` (`url(…)`, `16 20 20 16 fill`, `16px 20px 20px 16px`) |\n * | `--e1681-tip-frame`, `-slice`, `-width` | tooltips and the select's list |\n * | `--e1681-control-frame`, `-slice`, `-width` | buttons, the select, text fields |\n * | `--e1681-tab-frame`, `--e1681-tab-active-frame`, `-slice`, `-width` | tabs |\n * | `--e1681-well-frame`, `-slice`, `-width` | the split pane's detail, the slider's track |\n * | `--e1681-backdrop` | behind a dialog |\n *\n * A `-width` may have one to four lengths, like `border-width`. The pixel rules hold here: no `translate(-50%)` centring and no `zoom` (the components place in whole pixels), no\n * blurred shadow, no gradient. A frame's middle shows through only when its slice says `fill`.\n */\nexport const baseCss = `\n:root {\n --e1681-font: inherit;\n --e1681-font-size: 16px;\n --e1681-text: #ece6d6;\n --e1681-muted: #9c968a;\n --e1681-accent: #e8c060;\n --e1681-bg: #1d242e;\n --e1681-well: #131a24;\n --e1681-control-bg: #2a323e;\n --e1681-border: #6a5634;\n --e1681-border-width: 2px;\n --e1681-backdrop: rgba(0, 0, 0, 0.5);\n --e1681-frame: none;\n --e1681-frame-slice: 0;\n --e1681-frame-width: var(--e1681-border-width);\n --e1681-tip-frame: var(--e1681-frame);\n --e1681-tip-frame-slice: var(--e1681-frame-slice);\n --e1681-tip-frame-width: var(--e1681-frame-width);\n --e1681-control-frame: none;\n --e1681-control-frame-slice: 0;\n --e1681-control-frame-width: var(--e1681-border-width);\n --e1681-tab-frame: var(--e1681-control-frame);\n --e1681-tab-active-frame: var(--e1681-tab-frame);\n --e1681-tab-frame-slice: var(--e1681-control-frame-slice);\n --e1681-tab-frame-width: var(--e1681-control-frame-width);\n --e1681-well-frame: none;\n --e1681-well-frame-slice: 0;\n --e1681-well-frame-width: var(--e1681-border-width);\n}\n\n.e1681-frame {\n color: var(--e1681-text);\n font-family: var(--e1681-font);\n font-size: var(--e1681-font-size);\n background: var(--e1681-bg) padding-box;\n border-style: solid; border-color: var(--e1681-border); border-width: var(--e1681-frame-width);\n border-image: var(--e1681-frame) var(--e1681-frame-slice) / var(--e1681-frame-width) stretch;\n box-sizing: border-box;\n}\n.e1681-tip-frame {\n color: var(--e1681-text);\n font-family: var(--e1681-font);\n font-size: var(--e1681-font-size);\n background: var(--e1681-bg) padding-box;\n border-style: solid; border-color: var(--e1681-border); border-width: var(--e1681-tip-frame-width);\n border-image: var(--e1681-tip-frame) var(--e1681-tip-frame-slice) / var(--e1681-tip-frame-width) stretch;\n box-sizing: border-box;\n}\n\n/* windows: placed by useFitToViewport in whole pixels; header kept, body scrolls */\n.e1681-panel {\n position: fixed;\n z-index: 10;\n display: flex;\n flex-direction: column;\n min-width: 0;\n overflow: hidden;\n pointer-events: auto;\n}\n.e1681-panel-header { display: flex; align-items: center; gap: 8px; flex: none; padding: 2px 4px 6px; }\n.e1681-panel-title { flex: 1; min-width: 0; margin: 0; font-size: 1.25em; font-weight: normal; color: var(--e1681-accent); }\n.e1681-panel-body { flex: 1 1 auto; min-height: 0; overflow-y: auto; overflow-x: hidden; padding: 0 4px 4px; }\n.e1681-panel-footer { flex: none; display: flex; flex-wrap: wrap; gap: 6px; justify-content: flex-end; padding: 6px 4px 0; }\n.e1681-close {\n flex: none; padding: 2px; border: 0; background: none; color: var(--e1681-text); cursor: pointer; line-height: 0;\n}\n.e1681-close:hover { color: var(--e1681-accent); }\n/* a touch screen's sheet: the whole screen inside the safe area */\n.e1681-panel.e1681-sheet {\n inset: env(safe-area-inset-top, 0px) env(safe-area-inset-right, 0px) env(safe-area-inset-bottom, 0px) env(safe-area-inset-left, 0px);\n width: auto;\n height: auto;\n}\n.e1681-panel.e1681-sheet .e1681-panel-body { overscroll-behavior: contain; -webkit-overflow-scrolling: touch; }\n\n/* controls */\n.e1681-button, .e1681-input, .e1681-select {\n color: var(--e1681-text);\n font: inherit;\n background: var(--e1681-control-bg) padding-box;\n border-style: solid; border-color: var(--e1681-border); border-width: var(--e1681-control-frame-width);\n border-image: var(--e1681-control-frame) var(--e1681-control-frame-slice) / var(--e1681-control-frame-width) stretch;\n box-shadow: none;\n}\n.e1681-button { padding: 2px 10px; cursor: pointer; min-height: 28px; }\n.e1681-button.small { padding: 0 6px; min-height: 22px; }\n.e1681-button.ghost { background-color: transparent; }\n.e1681-button:hover:not(:disabled) { color: var(--e1681-accent); }\n/* pressed: the same face a pixel lower, never a transform */\n.e1681-button:active:not(:disabled) { padding-top: 3px; padding-bottom: 1px; }\n.e1681-button:disabled { opacity: 0.55; cursor: default; }\n.e1681-input { padding: 2px 6px; min-width: 0; }\n.e1681-glyph { display: inline-block; flex: none; vertical-align: -1px; }\n\n/* tabs: a row that scrolls sideways, or wraps with .wrap */\n.e1681-tabs { display: flex; gap: 2px; align-items: flex-end; overflow-x: auto; overflow-y: hidden; scrollbar-width: none; margin-bottom: 8px; }\n.e1681-tabs::-webkit-scrollbar { display: none; }\n.e1681-tabs.wrap { flex-wrap: wrap; overflow-x: visible; row-gap: 4px; }\n.e1681-tab {\n flex: 0 0 auto;\n padding: 2px 10px;\n color: var(--e1681-muted);\n font: inherit;\n cursor: pointer;\n white-space: nowrap;\n background: var(--e1681-control-bg) padding-box;\n border-style: solid; border-color: var(--e1681-border); border-width: var(--e1681-tab-frame-width);\n border-image: var(--e1681-tab-frame) var(--e1681-tab-frame-slice) / var(--e1681-tab-frame-width) stretch;\n}\n.e1681-tab:hover:not(.active):not(:disabled) { color: var(--e1681-text); }\n.e1681-tab.active { color: var(--e1681-accent); padding-bottom: 6px; border-image-source: var(--e1681-tab-active-frame); }\n.e1681-tab:disabled { opacity: 0.55; cursor: default; }\n.e1681-tab:focus-visible { outline: 2px solid var(--e1681-accent); outline-offset: -4px; }\n.e1681-tabs.small { margin-bottom: 4px; }\n.e1681-tabs.small .e1681-tab { padding: 0 6px; }\n.e1681-tabs.small .e1681-tab.active { padding-bottom: 4px; }\n\n/* list beside detail */\n.e1681-split {\n display: grid;\n grid-template-columns: var(--e1681-split-list, minmax(0, 1fr)) minmax(0, 1fr);\n gap: 12px;\n height: min(58vh, 620px);\n}\n.e1681-split.fit { height: auto; max-height: min(58vh, 620px); }\n.e1681-split-list, .e1681-split-detail { min-height: 0; overflow-y: auto; overflow-x: hidden; }\n.e1681-split-list { padding-right: 4px; }\n.e1681-split-detail {\n display: flex;\n flex-direction: column;\n gap: 4px;\n padding: 8px 10px;\n background: var(--e1681-well) padding-box;\n border-style: solid; border-color: var(--e1681-border); border-width: var(--e1681-well-frame-width);\n border-image: var(--e1681-well-frame) var(--e1681-well-frame-slice) / var(--e1681-well-frame-width) stretch;\n}\n.e1681-split-empty { flex: 1; display: flex; align-items: center; justify-content: center; text-align: center; color: var(--e1681-muted); }\n.e1681-split.stack { grid-template-columns: minmax(0, 1fr); }\n.e1681-split.stack.show-list .e1681-split-detail, .e1681-split.stack.show-detail .e1681-split-list { display: none; }\n.e1681-split-back { align-self: flex-start; }\n.e1681-row { display: flex; align-items: center; gap: 8px; padding: 4px 6px; margin-bottom: 4px; border: var(--e1681-border-width) solid transparent; }\n.e1681-pickable { cursor: pointer; }\n.e1681-pickable:hover:not(.picked):not(.disabled) { border-color: var(--e1681-border); }\n.e1681-row.picked { border-color: var(--e1681-accent); color: var(--e1681-accent); }\n.e1681-row.disabled { opacity: 0.55; cursor: default; }\n\n/* the select: as wide as its longest label */\n.e1681-select { display: inline-flex; align-items: center; gap: 6px; flex: none; padding: 1px 4px; text-align: left; cursor: pointer; }\n.e1681-select:hover:not(:disabled), .e1681-select.open { color: var(--e1681-accent); }\n.e1681-select:disabled { opacity: 0.6; cursor: default; }\n.e1681-select.grow { flex: 1 1 auto; min-width: 0; }\n.e1681-select.grow .e1681-select-labels { flex: 1 1 auto; min-width: 0; overflow: hidden; }\n.e1681-select.grow .e1681-select-labels > span { overflow: hidden; text-overflow: ellipsis; }\n.e1681-select-labels { display: grid; white-space: nowrap; }\n.e1681-select-labels > span { grid-area: 1 / 1; visibility: hidden; }\n.e1681-select-labels > span.shown { visibility: visible; }\n.e1681-select-list {\n position: fixed;\n z-index: 10000;\n box-sizing: border-box;\n width: max-content;\n padding: 2px;\n overflow-y: auto;\n pointer-events: auto;\n}\n.e1681-select-option { padding: 2px 6px; white-space: nowrap; cursor: pointer; }\n.e1681-select-list.measuring .e1681-select-option { width: max-content; }\n.e1681-select-option.hot { background: var(--e1681-control-bg); }\n.e1681-select-option.picked { color: var(--e1681-accent); }\n\n/* tooltips */\n.e1681-tooltip { position: fixed; z-index: 10001; max-width: 360px; padding: 4px 8px; overflow: hidden; pointer-events: none; }\n.e1681-title-tip { white-space: pre-line; }\n\n/* slider: a square knob, flat fills */\n.e1681-slider-row { display: flex; align-items: center; gap: 8px; flex: 1; min-width: 0; }\n.e1681-slider { flex: 1; min-width: 0; padding: 6px 7px; cursor: pointer; touch-action: none; user-select: none; pointer-events: auto; }\n.e1681-slider:focus { outline: none; }\n.e1681-slider:focus-visible { outline: 2px solid var(--e1681-accent); outline-offset: 2px; }\n.e1681-slider[aria-disabled='true'] { opacity: 0.55; cursor: default; }\n.e1681-slider-track {\n position: relative;\n height: 6px;\n background: var(--e1681-well) padding-box;\n border-style: solid; border-color: var(--e1681-border); border-width: var(--e1681-well-frame-width);\n border-image: var(--e1681-well-frame) var(--e1681-well-frame-slice) / var(--e1681-well-frame-width) stretch;\n}\n.e1681-slider-fill { position: absolute; left: 0; top: 0; bottom: 0; background: var(--e1681-accent); }\n/* the knob is offset by half its own whole-pixel width with a margin, so it stays on the pixel grid */\n.e1681-slider-knob { position: absolute; top: -6px; width: 10px; height: 14px; margin-left: -5px; background: var(--e1681-text); border: 2px solid var(--e1681-well); box-sizing: border-box; }\n.e1681-slider-value { min-width: 40px; text-align: right; font-variant-numeric: tabular-nums; }\n\n/* dialogs */\n.e1681-backdrop { position: fixed; inset: 0; z-index: 9000; background: var(--e1681-backdrop); pointer-events: auto; }\n.e1681-dialog { position: fixed; display: flex; flex-direction: column; overflow: hidden; padding: 8px 10px; }\n.e1681-dialog-body { flex: 1 1 auto; min-height: 0; overflow-y: auto; }\n.e1681-dialog-actions { flex: none; display: flex; flex-wrap: wrap; gap: 8px; justify-content: flex-end; padding-top: 10px; }\n.e1681-confirm-text { white-space: pre-line; }\n.e1681-confirm-qty { display: flex; align-items: center; gap: 6px; margin-top: 10px; }\n.e1681-confirm-qty-input { width: 56px; text-align: right; }\n.e1681-choice-list { margin-top: 8px; }\n.e1681-choice-icon { flex: none; line-height: 0; }\n.e1681-choice-label { flex: 1; min-width: 0; }\n.e1681-choice-note { flex: none; margin-left: auto; color: var(--e1681-muted); }\n\n/* sprites at whole multiples */\n.e1681-pixel-image { display: inline-flex; align-items: center; justify-content: center; flex: none; overflow: hidden; }\n.e1681-pixel-image > img { image-rendering: pixelated; flex: none; }\n`;\n\nconst STYLE_ID = 'e1681-react-base';\n\n/**\n * Puts `baseCss` into the page once, first in `<head>` so the game's own rules (and its custom properties) win\n * without needing more specific selectors. Returns the `<style>` element; nothing on a server.\n */\nexport function injectBaseCss(doc: Document | undefined = typeof document === 'undefined' ? undefined : document): HTMLStyleElement | null {\n if (!doc) return null;\n const found = doc.getElementById(STYLE_ID);\n if (found) return found as HTMLStyleElement;\n const style = doc.createElement('style');\n style.id = STYLE_ID;\n style.textContent = baseCss;\n doc.head.insertBefore(style, doc.head.firstChild);\n return style;\n}\n"],"names":["baseCss","STYLE_ID","injectBaseCss","doc","found","style"],"mappings":"AAoBO,MAAMA,IAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAmNjBC,IAAW;AAMV,SAASC,EAAcC,IAA4B,OAAO,WAAa,MAAc,SAAY,UAAmC;AACzI,MAAI,CAACA,EAAK,QAAO;AACjB,QAAMC,IAAQD,EAAI,eAAeF,CAAQ;AACzC,MAAIG,EAAO,QAAOA;AAClB,QAAMC,IAAQF,EAAI,cAAc,OAAO;AACvC,SAAAE,EAAM,KAAKJ,GACXI,EAAM,cAAcL,GACpBG,EAAI,KAAK,aAAaE,GAAOF,EAAI,KAAK,UAAU,GACzCE;AACT;"}
|