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.
Files changed (1014) hide show
  1. package/CHANGELOG.md +304 -0
  2. package/LICENSE +21 -0
  3. package/README.md +164 -2
  4. package/dist/1681-engine.js +417 -0
  5. package/dist/1681-engine.js.map +1 -0
  6. package/dist/ambient/ColorGrade.js +41 -0
  7. package/dist/ambient/ColorGrade.js.map +1 -0
  8. package/dist/ambient/DayClock.js +57 -0
  9. package/dist/ambient/DayClock.js.map +1 -0
  10. package/dist/ambient/WeatherLayer.js +91 -0
  11. package/dist/ambient/WeatherLayer.js.map +1 -0
  12. package/dist/ambient/grade.js +13 -0
  13. package/dist/ambient/grade.js.map +1 -0
  14. package/dist/ambient/weather.js +52 -0
  15. package/dist/ambient/weather.js.map +1 -0
  16. package/dist/anim/AnimStateMachine.js +164 -0
  17. package/dist/anim/AnimStateMachine.js.map +1 -0
  18. package/dist/anim/Animator.js +67 -0
  19. package/dist/anim/Animator.js.map +1 -0
  20. package/dist/anim/animStateCompile.js +113 -0
  21. package/dist/anim/animStateCompile.js.map +1 -0
  22. package/dist/anim/animStateSystem.js +17 -0
  23. package/dist/anim/animStateSystem.js.map +1 -0
  24. package/dist/anim/animationSystem.js +15 -0
  25. package/dist/anim/animationSystem.js.map +1 -0
  26. package/dist/anim/asepriteSlices.js +22 -0
  27. package/dist/anim/asepriteSlices.js.map +1 -0
  28. package/dist/anim/asepriteTags.js +35 -0
  29. package/dist/anim/asepriteTags.js.map +1 -0
  30. package/dist/anim/parseAseprite.js +83 -0
  31. package/dist/anim/parseAseprite.js.map +1 -0
  32. package/dist/assets/AssetLoader.js +104 -0
  33. package/dist/assets/AssetLoader.js.map +1 -0
  34. package/dist/assets/loadAseprite.js +50 -0
  35. package/dist/assets/loadAseprite.js.map +1 -0
  36. package/dist/assets/takeCleanerWorker-DTcI_Jqr.js +31 -0
  37. package/dist/assets/takeCleanerWorker-DTcI_Jqr.js.map +1 -0
  38. package/dist/audio/Footsteps.js +26 -0
  39. package/dist/audio/Footsteps.js.map +1 -0
  40. package/dist/audio/MusicPlayer.js +78 -0
  41. package/dist/audio/MusicPlayer.js.map +1 -0
  42. package/dist/audio/SoundEngine.js +119 -0
  43. package/dist/audio/SoundEngine.js.map +1 -0
  44. package/dist/audio/cleanTake.js +30 -0
  45. package/dist/audio/cleanTake.js.map +1 -0
  46. package/dist/audio/music/ElementVoice.js +35 -0
  47. package/dist/audio/music/ElementVoice.js.map +1 -0
  48. package/dist/audio/music/GraphVoice.js +39 -0
  49. package/dist/audio/music/GraphVoice.js.map +1 -0
  50. package/dist/audio/music/MusicChannel.js +58 -0
  51. package/dist/audio/music/MusicChannel.js.map +1 -0
  52. package/dist/audio/music/musicVoice.js +13 -0
  53. package/dist/audio/music/musicVoice.js.map +1 -0
  54. package/dist/audio/sampleBank.js +82 -0
  55. package/dist/audio/sampleBank.js.map +1 -0
  56. package/dist/audio/soundTable.js +9 -0
  57. package/dist/audio/soundTable.js.map +1 -0
  58. package/dist/audio/synth.js +36 -0
  59. package/dist/audio/synth.js.map +1 -0
  60. package/dist/core/BitmapLabel.js +49 -0
  61. package/dist/core/BitmapLabel.js.map +1 -0
  62. package/dist/core/Camera.js +150 -0
  63. package/dist/core/Camera.js.map +1 -0
  64. package/dist/core/Clock.js +30 -0
  65. package/dist/core/Clock.js.map +1 -0
  66. package/dist/core/Graphics.js +69 -0
  67. package/dist/core/Graphics.js.map +1 -0
  68. package/dist/core/Group.js +29 -0
  69. package/dist/core/Group.js.map +1 -0
  70. package/dist/core/Image.js +51 -0
  71. package/dist/core/Image.js.map +1 -0
  72. package/dist/core/ObjectFactory.js +55 -0
  73. package/dist/core/ObjectFactory.js.map +1 -0
  74. package/dist/core/Pointer.js +58 -0
  75. package/dist/core/Pointer.js.map +1 -0
  76. package/dist/core/Rectangle.js +51 -0
  77. package/dist/core/Rectangle.js.map +1 -0
  78. package/dist/core/Stage.js +86 -0
  79. package/dist/core/Stage.js.map +1 -0
  80. package/dist/core/Text.js +22 -0
  81. package/dist/core/Text.js.map +1 -0
  82. package/dist/core/TextureRegistry.js +111 -0
  83. package/dist/core/TextureRegistry.js.map +1 -0
  84. package/dist/core/Timeline.js +211 -0
  85. package/dist/core/Timeline.js.map +1 -0
  86. package/dist/core/TimelineBuilder.js +73 -0
  87. package/dist/core/TimelineBuilder.js.map +1 -0
  88. package/dist/core/TimelineChild.js +84 -0
  89. package/dist/core/TimelineChild.js.map +1 -0
  90. package/dist/core/Tweener.js +136 -0
  91. package/dist/core/Tweener.js.map +1 -0
  92. package/dist/core/atlas.js +38 -0
  93. package/dist/core/atlas.js.map +1 -0
  94. package/dist/core/atlasPlan.js +22 -0
  95. package/dist/core/atlasPlan.js.map +1 -0
  96. package/dist/core/eases.js +21 -0
  97. package/dist/core/eases.js.map +1 -0
  98. package/dist/core/gameObject.js +115 -0
  99. package/dist/core/gameObject.js.map +1 -0
  100. package/dist/core/pixiPatches.js +18 -0
  101. package/dist/core/pixiPatches.js.map +1 -0
  102. package/dist/core/timelinePlace.js +24 -0
  103. package/dist/core/timelinePlace.js.map +1 -0
  104. package/dist/core/tweenProps.js +12 -0
  105. package/dist/core/tweenProps.js.map +1 -0
  106. package/dist/debug/DebugOverlay.js +94 -0
  107. package/dist/debug/DebugOverlay.js.map +1 -0
  108. package/dist/debug/DrawCallCounter.js +41 -0
  109. package/dist/debug/DrawCallCounter.js.map +1 -0
  110. package/dist/debug/ErrorLog.js +22 -0
  111. package/dist/debug/ErrorLog.js.map +1 -0
  112. package/dist/debug/FrameStats.js +42 -0
  113. package/dist/debug/FrameStats.js.map +1 -0
  114. package/dist/debug/inspectWorld.js +29 -0
  115. package/dist/debug/inspectWorld.js.map +1 -0
  116. package/dist/diagnostics/ErrorDeduper.js +27 -0
  117. package/dist/diagnostics/ErrorDeduper.js.map +1 -0
  118. package/dist/diagnostics/FrameSampler.js +42 -0
  119. package/dist/diagnostics/FrameSampler.js.map +1 -0
  120. package/dist/diagnostics/bootWatch.js +21 -0
  121. package/dist/diagnostics/bootWatch.js.map +1 -0
  122. package/dist/diagnostics/captureErrors.js +27 -0
  123. package/dist/diagnostics/captureErrors.js.map +1 -0
  124. package/dist/diagnostics/contextLoss.js +25 -0
  125. package/dist/diagnostics/contextLoss.js.map +1 -0
  126. package/dist/diagnostics/frameStats.js +31 -0
  127. package/dist/diagnostics/frameStats.js.map +1 -0
  128. package/dist/diagnostics/gpuInfo.js +22 -0
  129. package/dist/diagnostics/gpuInfo.js.map +1 -0
  130. package/dist/diagnostics/renderGuard.js +24 -0
  131. package/dist/diagnostics/renderGuard.js.map +1 -0
  132. package/dist/ecs/SparseSet.js +55 -0
  133. package/dist/ecs/SparseSet.js.map +1 -0
  134. package/dist/ecs/World.js +307 -0
  135. package/dist/ecs/World.js.map +1 -0
  136. package/dist/ecs/fields.js +26 -0
  137. package/dist/ecs/fields.js.map +1 -0
  138. package/dist/engine/Engine.js +82 -0
  139. package/dist/engine/Engine.js.map +1 -0
  140. package/dist/engine/FixedLoop.js +37 -0
  141. package/dist/engine/FixedLoop.js.map +1 -0
  142. package/dist/engine/Scene.js +79 -0
  143. package/dist/engine/Scene.js.map +1 -0
  144. package/dist/engine/SceneManager.js +73 -0
  145. package/dist/engine/SceneManager.js.map +1 -0
  146. package/dist/events/EventBus.js +42 -0
  147. package/dist/events/EventBus.js.map +1 -0
  148. package/dist/fx/FloatingText.js +72 -0
  149. package/dist/fx/FloatingText.js.map +1 -0
  150. package/dist/fx/hitStop.js +28 -0
  151. package/dist/fx/hitStop.js.map +1 -0
  152. package/dist/fx/viewCull.js +10 -0
  153. package/dist/fx/viewCull.js.map +1 -0
  154. package/dist/i18n/Translator.js +72 -0
  155. package/dist/i18n/Translator.js.map +1 -0
  156. package/dist/i18n/extractStrings.js +58 -0
  157. package/dist/i18n/extractStrings.js.map +1 -0
  158. package/dist/i18n/formatMessage.js +19 -0
  159. package/dist/i18n/formatMessage.js.map +1 -0
  160. package/dist/input/Actions.js +131 -0
  161. package/dist/input/Actions.js.map +1 -0
  162. package/dist/input/AimGesture.js +75 -0
  163. package/dist/input/AimGesture.js.map +1 -0
  164. package/dist/input/Keyboard.js +54 -0
  165. package/dist/input/Keyboard.js.map +1 -0
  166. package/dist/input/Keymap.js +171 -0
  167. package/dist/input/Keymap.js.map +1 -0
  168. package/dist/input/TargetLock.js +73 -0
  169. package/dist/input/TargetLock.js.map +1 -0
  170. package/dist/input/aimAxis.js +8 -0
  171. package/dist/input/aimAxis.js.map +1 -0
  172. package/dist/input/keyChord.js +29 -0
  173. package/dist/input/keyChord.js.map +1 -0
  174. package/dist/input/longPress.js +32 -0
  175. package/dist/input/longPress.js.map +1 -0
  176. package/dist/input/stickAxis.js +23 -0
  177. package/dist/input/stickAxis.js.map +1 -0
  178. package/dist/input/touchDetect.js +7 -0
  179. package/dist/input/touchDetect.js.map +1 -0
  180. package/dist/light/LightLayer.js +84 -0
  181. package/dist/light/LightLayer.js.map +1 -0
  182. package/dist/nav/MinHeap.js +39 -0
  183. package/dist/nav/MinHeap.js.map +1 -0
  184. package/dist/nav/findPath.js +78 -0
  185. package/dist/nav/findPath.js.map +1 -0
  186. package/dist/nav/navGrid.js +36 -0
  187. package/dist/nav/navGrid.js.map +1 -0
  188. package/dist/nav/nearestOpen.js +19 -0
  189. package/dist/nav/nearestOpen.js.map +1 -0
  190. package/dist/nav/straightenPath.js +51 -0
  191. package/dist/nav/straightenPath.js.map +1 -0
  192. package/dist/net/Connection.js +84 -0
  193. package/dist/net/Connection.js.map +1 -0
  194. package/dist/net/InterpolationBuffer.js +57 -0
  195. package/dist/net/InterpolationBuffer.js.map +1 -0
  196. package/dist/net/PredictedMover.js +61 -0
  197. package/dist/net/PredictedMover.js.map +1 -0
  198. package/dist/net/Room.js +92 -0
  199. package/dist/net/Room.js.map +1 -0
  200. package/dist/net/RoomHost.js +101 -0
  201. package/dist/net/RoomHost.js.map +1 -0
  202. package/dist/net/cadence.js +22 -0
  203. package/dist/net/cadence.js.map +1 -0
  204. package/dist/net/constants.js +11 -0
  205. package/dist/net/constants.js.map +1 -0
  206. package/dist/net/lobby/LobbyClient.js +124 -0
  207. package/dist/net/lobby/LobbyClient.js.map +1 -0
  208. package/dist/net/lobby/LobbyHost.js +366 -0
  209. package/dist/net/lobby/LobbyHost.js.map +1 -0
  210. package/dist/net/lobby/LobbyRooms.js +66 -0
  211. package/dist/net/lobby/LobbyRooms.js.map +1 -0
  212. package/dist/net/lobby/Matchmaker.js +106 -0
  213. package/dist/net/lobby/Matchmaker.js.map +1 -0
  214. package/dist/net/movement.js +83 -0
  215. package/dist/net/movement.js.map +1 -0
  216. package/dist/net/protocol.js +11 -0
  217. package/dist/net/protocol.js.map +1 -0
  218. package/dist/net/serverClock.js +22 -0
  219. package/dist/net/serverClock.js.map +1 -0
  220. package/dist/net/snapshotCodec.js +92 -0
  221. package/dist/net/snapshotCodec.js.map +1 -0
  222. package/dist/parallax/Parallax.js +32 -0
  223. package/dist/parallax/Parallax.js.map +1 -0
  224. package/dist/parallax/ParallaxLayer.js +70 -0
  225. package/dist/parallax/ParallaxLayer.js.map +1 -0
  226. package/dist/parallax/parallaxMath.js +27 -0
  227. package/dist/parallax/parallaxMath.js.map +1 -0
  228. package/dist/particles/Emitter.js +108 -0
  229. package/dist/particles/Emitter.js.map +1 -0
  230. package/dist/particles/ParticleBudget.js +32 -0
  231. package/dist/particles/ParticleBudget.js.map +1 -0
  232. package/dist/particles/ParticleSim.js +60 -0
  233. package/dist/particles/ParticleSim.js.map +1 -0
  234. package/dist/particles/particleCurves.js +48 -0
  235. package/dist/particles/particleCurves.js.map +1 -0
  236. package/dist/particles/particleSampling.js +30 -0
  237. package/dist/particles/particleSampling.js.map +1 -0
  238. package/dist/physics/Body.js +202 -0
  239. package/dist/physics/Body.js.map +1 -0
  240. package/dist/physics/BroadPhase.js +56 -0
  241. package/dist/physics/BroadPhase.js.map +1 -0
  242. package/dist/physics/Contact.js +76 -0
  243. package/dist/physics/Contact.js.map +1 -0
  244. package/dist/physics/ContactSolver.js +70 -0
  245. package/dist/physics/ContactSolver.js.map +1 -0
  246. package/dist/physics/PhysicsWorld.js +221 -0
  247. package/dist/physics/PhysicsWorld.js.map +1 -0
  248. package/dist/physics/SpatialHash.js +39 -0
  249. package/dist/physics/SpatialHash.js.map +1 -0
  250. package/dist/physics/collide.js +76 -0
  251. package/dist/physics/collide.js.map +1 -0
  252. package/dist/physics/collidePolygon.js +94 -0
  253. package/dist/physics/collidePolygon.js.map +1 -0
  254. package/dist/physics/contactReport.js +14 -0
  255. package/dist/physics/contactReport.js.map +1 -0
  256. package/dist/physics/drawColliders.js +31 -0
  257. package/dist/physics/drawColliders.js.map +1 -0
  258. package/dist/physics/physicsSystem.js +8 -0
  259. package/dist/physics/physicsSystem.js.map +1 -0
  260. package/dist/physics/polygon.js +80 -0
  261. package/dist/physics/polygon.js.map +1 -0
  262. package/dist/physics/raycast.js +62 -0
  263. package/dist/physics/raycast.js.map +1 -0
  264. package/dist/physics/syncToBody.js +19 -0
  265. package/dist/physics/syncToBody.js.map +1 -0
  266. package/dist/physics/tileBodies.js +59 -0
  267. package/dist/physics/tileBodies.js.map +1 -0
  268. package/dist/physics/types.js +8 -0
  269. package/dist/physics/types.js.map +1 -0
  270. package/dist/pixel/Darkness.js +166 -0
  271. package/dist/pixel/Darkness.js.map +1 -0
  272. package/dist/pixel/DitherVignette.js +57 -0
  273. package/dist/pixel/DitherVignette.js.map +1 -0
  274. package/dist/pixel/Evaporation.js +85 -0
  275. package/dist/pixel/Evaporation.js.map +1 -0
  276. package/dist/pixel/NightShade.js +34 -0
  277. package/dist/pixel/NightShade.js.map +1 -0
  278. package/dist/pixel/PixelLayer.js +211 -0
  279. package/dist/pixel/PixelLayer.js.map +1 -0
  280. package/dist/pixel/SwayProp.js +75 -0
  281. package/dist/pixel/SwayProp.js.map +1 -0
  282. package/dist/pixel/lights.js +44 -0
  283. package/dist/pixel/lights.js.map +1 -0
  284. package/dist/pixel/nineSlice.js +62 -0
  285. package/dist/pixel/nineSlice.js.map +1 -0
  286. package/dist/pixel/paintLayer.js +36 -0
  287. package/dist/pixel/paintLayer.js.map +1 -0
  288. package/dist/pixel/palette.js +57 -0
  289. package/dist/pixel/palette.js.map +1 -0
  290. package/dist/pixel/pixel.js +278 -0
  291. package/dist/pixel/pixel.js.map +1 -0
  292. package/dist/pixel/pixelPaint.js +194 -0
  293. package/dist/pixel/pixelPaint.js.map +1 -0
  294. package/dist/pixel/pixelTone.js +164 -0
  295. package/dist/pixel/pixelTone.js.map +1 -0
  296. package/dist/pixel/propKit.js +41 -0
  297. package/dist/pixel/propKit.js.map +1 -0
  298. package/dist/pixel/ramp.js +102 -0
  299. package/dist/pixel/ramp.js.map +1 -0
  300. package/dist/pixel/selout.js +35 -0
  301. package/dist/pixel/selout.js.map +1 -0
  302. package/dist/pixel/spritePixels.js +59 -0
  303. package/dist/pixel/spritePixels.js.map +1 -0
  304. package/dist/pixel/swayRig.js +87 -0
  305. package/dist/pixel/swayRig.js.map +1 -0
  306. package/dist/pixel/vignetteMask.js +24 -0
  307. package/dist/pixel/vignetteMask.js.map +1 -0
  308. package/dist/pixel/weatherArt.js +61 -0
  309. package/dist/pixel/weatherArt.js.map +1 -0
  310. package/dist/pixel.js +90 -0
  311. package/dist/pixel.js.map +1 -0
  312. package/dist/platform/touch.js +33 -0
  313. package/dist/platform/touch.js.map +1 -0
  314. package/dist/postfx/BloomFilter.js +65 -0
  315. package/dist/postfx/BloomFilter.js.map +1 -0
  316. package/dist/postfx/ChromaticAberrationFilter.js +25 -0
  317. package/dist/postfx/ChromaticAberrationFilter.js.map +1 -0
  318. package/dist/postfx/ColorAdjustFilter.js +76 -0
  319. package/dist/postfx/ColorAdjustFilter.js.map +1 -0
  320. package/dist/postfx/CrtFilter.js +42 -0
  321. package/dist/postfx/CrtFilter.js.map +1 -0
  322. package/dist/postfx/PixelateFilter.js +27 -0
  323. package/dist/postfx/PixelateFilter.js.map +1 -0
  324. package/dist/postfx/PostFx.js +123 -0
  325. package/dist/postfx/PostFx.js.map +1 -0
  326. package/dist/postfx/ShockwaveFilter.js +49 -0
  327. package/dist/postfx/ShockwaveFilter.js.map +1 -0
  328. package/dist/postfx/VignetteFilter.js +37 -0
  329. package/dist/postfx/VignetteFilter.js.map +1 -0
  330. package/dist/postfx/fxAnimator.js +38 -0
  331. package/dist/postfx/fxAnimator.js.map +1 -0
  332. package/dist/postfx/fxShader.js +128 -0
  333. package/dist/postfx/fxShader.js.map +1 -0
  334. package/dist/postfx.js +26 -0
  335. package/dist/postfx.js.map +1 -0
  336. package/dist/react/ChoiceDialog.js +51 -0
  337. package/dist/react/ChoiceDialog.js.map +1 -0
  338. package/dist/react/ConfirmDialog.js +53 -0
  339. package/dist/react/ConfirmDialog.js.map +1 -0
  340. package/dist/react/Glyph.js +63 -0
  341. package/dist/react/Glyph.js.map +1 -0
  342. package/dist/react/Modal.js +38 -0
  343. package/dist/react/Modal.js.map +1 -0
  344. package/dist/react/Panel.js +24 -0
  345. package/dist/react/Panel.js.map +1 -0
  346. package/dist/react/PixelImage.js +24 -0
  347. package/dist/react/PixelImage.js.map +1 -0
  348. package/dist/react/Select.js +99 -0
  349. package/dist/react/Select.js.map +1 -0
  350. package/dist/react/Slider.js +62 -0
  351. package/dist/react/Slider.js.map +1 -0
  352. package/dist/react/SplitPane.js +24 -0
  353. package/dist/react/SplitPane.js.map +1 -0
  354. package/dist/react/TabStrip.js +32 -0
  355. package/dist/react/TabStrip.js.map +1 -0
  356. package/dist/react/TitleTips.js +42 -0
  357. package/dist/react/TitleTips.js.map +1 -0
  358. package/dist/react/Tooltip.js +28 -0
  359. package/dist/react/Tooltip.js.map +1 -0
  360. package/dist/react/UiProvider.js +50 -0
  361. package/dist/react/UiProvider.js.map +1 -0
  362. package/dist/react/baseCss.js +222 -0
  363. package/dist/react/baseCss.js.map +1 -0
  364. package/dist/react/choiceStore.js +23 -0
  365. package/dist/react/choiceStore.js.map +1 -0
  366. package/dist/react/classNames.js +19 -0
  367. package/dist/react/classNames.js.map +1 -0
  368. package/dist/react/confirmStore.js +30 -0
  369. package/dist/react/confirmStore.js.map +1 -0
  370. package/dist/react/labels.js +18 -0
  371. package/dist/react/labels.js.map +1 -0
  372. package/dist/react/placement.js +49 -0
  373. package/dist/react/placement.js.map +1 -0
  374. package/dist/react/useFillSheet.js +23 -0
  375. package/dist/react/useFillSheet.js.map +1 -0
  376. package/dist/react/useFitToViewport.js +29 -0
  377. package/dist/react/useFitToViewport.js.map +1 -0
  378. package/dist/react/usePicked.js +13 -0
  379. package/dist/react/usePicked.js.map +1 -0
  380. package/dist/react/useStore.js +9 -0
  381. package/dist/react/useStore.js.map +1 -0
  382. package/dist/react/useViewport.js +17 -0
  383. package/dist/react/useViewport.js.map +1 -0
  384. package/dist/react.js +78 -0
  385. package/dist/react.js.map +1 -0
  386. package/dist/rig/PosePlayer.js +92 -0
  387. package/dist/rig/PosePlayer.js.map +1 -0
  388. package/dist/rig/RigView.js +125 -0
  389. package/dist/rig/RigView.js.map +1 -0
  390. package/dist/rig/Skeleton.js +31 -0
  391. package/dist/rig/Skeleton.js.map +1 -0
  392. package/dist/rig/humanoid.js +6 -0
  393. package/dist/rig/humanoid.js.map +1 -0
  394. package/dist/rig/humanoid.json.js +30 -0
  395. package/dist/rig/humanoid.json.js.map +1 -0
  396. package/dist/rig/humanoidPoses.js +30 -0
  397. package/dist/rig/humanoidPoses.js.map +1 -0
  398. package/dist/rig/poseMath.js +54 -0
  399. package/dist/rig/poseMath.js.map +1 -0
  400. package/dist/rig/poses.json.js +150 -0
  401. package/dist/rig/poses.json.js.map +1 -0
  402. package/dist/save/Autosaver.js +54 -0
  403. package/dist/save/Autosaver.js.map +1 -0
  404. package/dist/save/MemoryBackend.js +19 -0
  405. package/dist/save/MemoryBackend.js.map +1 -0
  406. package/dist/save/SaveStore.js +103 -0
  407. package/dist/save/SaveStore.js.map +1 -0
  408. package/dist/save/WebStorageBackend.js +27 -0
  409. package/dist/save/WebStorageBackend.js.map +1 -0
  410. package/dist/save/checksum.js +10 -0
  411. package/dist/save/checksum.js.map +1 -0
  412. package/dist/save/migrateSave.js +27 -0
  413. package/dist/save/migrateSave.js.map +1 -0
  414. package/dist/settings.js +27 -0
  415. package/dist/settings.js.map +1 -0
  416. package/dist/tilemap/TilemapView.js +69 -0
  417. package/dist/tilemap/TilemapView.js.map +1 -0
  418. package/dist/tilemap/collision.js +25 -0
  419. package/dist/tilemap/collision.js.map +1 -0
  420. package/dist/tilemap/tiled.js +138 -0
  421. package/dist/tilemap/tiled.js.map +1 -0
  422. package/dist/transitions/CrossfadeTransition.js +24 -0
  423. package/dist/transitions/CrossfadeTransition.js.map +1 -0
  424. package/dist/transitions/DitherWipeTransition.js +70 -0
  425. package/dist/transitions/DitherWipeTransition.js.map +1 -0
  426. package/dist/transitions/FadeTransition.js +34 -0
  427. package/dist/transitions/FadeTransition.js.map +1 -0
  428. package/dist/transitions/Letterbox.js +42 -0
  429. package/dist/transitions/Letterbox.js.map +1 -0
  430. package/dist/transitions/ditherMask.js +15 -0
  431. package/dist/transitions/ditherMask.js.map +1 -0
  432. package/dist/transitions/transitionTo.js +28 -0
  433. package/dist/transitions/transitionTo.js.map +1 -0
  434. package/dist/transitions/tweenDone.js +15 -0
  435. package/dist/transitions/tweenDone.js.map +1 -0
  436. package/dist/types/ambient/ColorGrade.d.ts +41 -0
  437. package/dist/types/ambient/ColorGrade.d.ts.map +1 -0
  438. package/dist/types/ambient/DayClock.d.ts +80 -0
  439. package/dist/types/ambient/DayClock.d.ts.map +1 -0
  440. package/dist/types/ambient/WeatherLayer.d.ts +78 -0
  441. package/dist/types/ambient/WeatherLayer.d.ts.map +1 -0
  442. package/dist/types/ambient/grade.d.ts +22 -0
  443. package/dist/types/ambient/grade.d.ts.map +1 -0
  444. package/dist/types/ambient/weather.d.ts +49 -0
  445. package/dist/types/ambient/weather.d.ts.map +1 -0
  446. package/dist/types/anim/AnimStateMachine.d.ts +80 -0
  447. package/dist/types/anim/AnimStateMachine.d.ts.map +1 -0
  448. package/dist/types/anim/Animator.d.ts +50 -0
  449. package/dist/types/anim/Animator.d.ts.map +1 -0
  450. package/dist/types/anim/animStateCompile.d.ts +52 -0
  451. package/dist/types/anim/animStateCompile.d.ts.map +1 -0
  452. package/dist/types/anim/animStateSystem.d.ts +10 -0
  453. package/dist/types/anim/animStateSystem.d.ts.map +1 -0
  454. package/dist/types/anim/animStateTypes.d.ts +50 -0
  455. package/dist/types/anim/animStateTypes.d.ts.map +1 -0
  456. package/dist/types/anim/animationSystem.d.ts +13 -0
  457. package/dist/types/anim/animationSystem.d.ts.map +1 -0
  458. package/dist/types/anim/asepriteSlices.d.ts +19 -0
  459. package/dist/types/anim/asepriteSlices.d.ts.map +1 -0
  460. package/dist/types/anim/asepriteTags.d.ts +16 -0
  461. package/dist/types/anim/asepriteTags.d.ts.map +1 -0
  462. package/dist/types/anim/asepriteTypes.d.ts +159 -0
  463. package/dist/types/anim/asepriteTypes.d.ts.map +1 -0
  464. package/dist/types/anim/parseAseprite.d.ts +21 -0
  465. package/dist/types/anim/parseAseprite.d.ts.map +1 -0
  466. package/dist/types/assets/AssetLoader.d.ts +85 -0
  467. package/dist/types/assets/AssetLoader.d.ts.map +1 -0
  468. package/dist/types/assets/loadAseprite.d.ts +27 -0
  469. package/dist/types/assets/loadAseprite.d.ts.map +1 -0
  470. package/dist/types/audio/Footsteps.d.ts +33 -0
  471. package/dist/types/audio/Footsteps.d.ts.map +1 -0
  472. package/dist/types/audio/MusicPlayer.d.ts +65 -0
  473. package/dist/types/audio/MusicPlayer.d.ts.map +1 -0
  474. package/dist/types/audio/SoundEngine.d.ts +42 -0
  475. package/dist/types/audio/SoundEngine.d.ts.map +1 -0
  476. package/dist/types/audio/cleanTake.d.ts +3 -0
  477. package/dist/types/audio/cleanTake.d.ts.map +1 -0
  478. package/dist/types/audio/music/ElementVoice.d.ts +14 -0
  479. package/dist/types/audio/music/ElementVoice.d.ts.map +1 -0
  480. package/dist/types/audio/music/GraphVoice.d.ts +22 -0
  481. package/dist/types/audio/music/GraphVoice.d.ts.map +1 -0
  482. package/dist/types/audio/music/MusicChannel.d.ts +35 -0
  483. package/dist/types/audio/music/MusicChannel.d.ts.map +1 -0
  484. package/dist/types/audio/music/musicVoice.d.ts +26 -0
  485. package/dist/types/audio/music/musicVoice.d.ts.map +1 -0
  486. package/dist/types/audio/sampleBank.d.ts +27 -0
  487. package/dist/types/audio/sampleBank.d.ts.map +1 -0
  488. package/dist/types/audio/soundTable.d.ts +14 -0
  489. package/dist/types/audio/soundTable.d.ts.map +1 -0
  490. package/dist/types/audio/synth.d.ts +34 -0
  491. package/dist/types/audio/synth.d.ts.map +1 -0
  492. package/dist/types/audio/takeCleanerWorker.d.ts +2 -0
  493. package/dist/types/audio/takeCleanerWorker.d.ts.map +1 -0
  494. package/dist/types/core/BitmapLabel.d.ts +36 -0
  495. package/dist/types/core/BitmapLabel.d.ts.map +1 -0
  496. package/dist/types/core/Camera.d.ts +115 -0
  497. package/dist/types/core/Camera.d.ts.map +1 -0
  498. package/dist/types/core/Clock.d.ts +11 -0
  499. package/dist/types/core/Clock.d.ts.map +1 -0
  500. package/dist/types/core/Graphics.d.ts +37 -0
  501. package/dist/types/core/Graphics.d.ts.map +1 -0
  502. package/dist/types/core/Group.d.ts +15 -0
  503. package/dist/types/core/Group.d.ts.map +1 -0
  504. package/dist/types/core/Image.d.ts +25 -0
  505. package/dist/types/core/Image.d.ts.map +1 -0
  506. package/dist/types/core/ObjectFactory.d.ts +34 -0
  507. package/dist/types/core/ObjectFactory.d.ts.map +1 -0
  508. package/dist/types/core/Pointer.d.ts +27 -0
  509. package/dist/types/core/Pointer.d.ts.map +1 -0
  510. package/dist/types/core/Rectangle.d.ts +26 -0
  511. package/dist/types/core/Rectangle.d.ts.map +1 -0
  512. package/dist/types/core/Stage.d.ts +58 -0
  513. package/dist/types/core/Stage.d.ts.map +1 -0
  514. package/dist/types/core/Text.d.ts +22 -0
  515. package/dist/types/core/Text.d.ts.map +1 -0
  516. package/dist/types/core/TextureRegistry.d.ts +51 -0
  517. package/dist/types/core/TextureRegistry.d.ts.map +1 -0
  518. package/dist/types/core/Timeline.d.ts +115 -0
  519. package/dist/types/core/Timeline.d.ts.map +1 -0
  520. package/dist/types/core/TimelineBuilder.d.ts +53 -0
  521. package/dist/types/core/TimelineBuilder.d.ts.map +1 -0
  522. package/dist/types/core/TimelineChild.d.ts +51 -0
  523. package/dist/types/core/TimelineChild.d.ts.map +1 -0
  524. package/dist/types/core/Tweener.d.ts +70 -0
  525. package/dist/types/core/Tweener.d.ts.map +1 -0
  526. package/dist/types/core/atlas.d.ts +16 -0
  527. package/dist/types/core/atlas.d.ts.map +1 -0
  528. package/dist/types/core/atlasPlan.d.ts +34 -0
  529. package/dist/types/core/atlasPlan.d.ts.map +1 -0
  530. package/dist/types/core/eases.d.ts +3 -0
  531. package/dist/types/core/eases.d.ts.map +1 -0
  532. package/dist/types/core/gameObject.d.ts +42 -0
  533. package/dist/types/core/gameObject.d.ts.map +1 -0
  534. package/dist/types/core/pixiPatches.d.ts +9 -0
  535. package/dist/types/core/pixiPatches.d.ts.map +1 -0
  536. package/dist/types/core/timelinePlace.d.ts +23 -0
  537. package/dist/types/core/timelinePlace.d.ts.map +1 -0
  538. package/dist/types/core/tweenProps.d.ts +8 -0
  539. package/dist/types/core/tweenProps.d.ts.map +1 -0
  540. package/dist/types/core/types.d.ts +4 -0
  541. package/dist/types/core/types.d.ts.map +1 -0
  542. package/dist/types/debug/DebugOverlay.d.ts +63 -0
  543. package/dist/types/debug/DebugOverlay.d.ts.map +1 -0
  544. package/dist/types/debug/DrawCallCounter.d.ts +20 -0
  545. package/dist/types/debug/DrawCallCounter.d.ts.map +1 -0
  546. package/dist/types/debug/ErrorLog.d.ts +20 -0
  547. package/dist/types/debug/ErrorLog.d.ts.map +1 -0
  548. package/dist/types/debug/FrameStats.d.ts +21 -0
  549. package/dist/types/debug/FrameStats.d.ts.map +1 -0
  550. package/dist/types/debug/inspectWorld.d.ts +14 -0
  551. package/dist/types/debug/inspectWorld.d.ts.map +1 -0
  552. package/dist/types/diagnostics/ErrorDeduper.d.ts +17 -0
  553. package/dist/types/diagnostics/ErrorDeduper.d.ts.map +1 -0
  554. package/dist/types/diagnostics/FrameSampler.d.ts +37 -0
  555. package/dist/types/diagnostics/FrameSampler.d.ts.map +1 -0
  556. package/dist/types/diagnostics/bootWatch.d.ts +25 -0
  557. package/dist/types/diagnostics/bootWatch.d.ts.map +1 -0
  558. package/dist/types/diagnostics/captureErrors.d.ts +24 -0
  559. package/dist/types/diagnostics/captureErrors.d.ts.map +1 -0
  560. package/dist/types/diagnostics/contextLoss.d.ts +35 -0
  561. package/dist/types/diagnostics/contextLoss.d.ts.map +1 -0
  562. package/dist/types/diagnostics/frameStats.d.ts +30 -0
  563. package/dist/types/diagnostics/frameStats.d.ts.map +1 -0
  564. package/dist/types/diagnostics/gpuInfo.d.ts +9 -0
  565. package/dist/types/diagnostics/gpuInfo.d.ts.map +1 -0
  566. package/dist/types/diagnostics/renderGuard.d.ts +12 -0
  567. package/dist/types/diagnostics/renderGuard.d.ts.map +1 -0
  568. package/dist/types/ecs/SparseSet.d.ts +25 -0
  569. package/dist/types/ecs/SparseSet.d.ts.map +1 -0
  570. package/dist/types/ecs/World.d.ts +137 -0
  571. package/dist/types/ecs/World.d.ts.map +1 -0
  572. package/dist/types/ecs/fields.d.ts +34 -0
  573. package/dist/types/ecs/fields.d.ts.map +1 -0
  574. package/dist/types/engine/Engine.d.ts +80 -0
  575. package/dist/types/engine/Engine.d.ts.map +1 -0
  576. package/dist/types/engine/FixedLoop.d.ts +32 -0
  577. package/dist/types/engine/FixedLoop.d.ts.map +1 -0
  578. package/dist/types/engine/Scene.d.ts +67 -0
  579. package/dist/types/engine/Scene.d.ts.map +1 -0
  580. package/dist/types/engine/SceneManager.d.ts +36 -0
  581. package/dist/types/engine/SceneManager.d.ts.map +1 -0
  582. package/dist/types/events/EventBus.d.ts +20 -0
  583. package/dist/types/events/EventBus.d.ts.map +1 -0
  584. package/dist/types/fx/FloatingText.d.ts +71 -0
  585. package/dist/types/fx/FloatingText.d.ts.map +1 -0
  586. package/dist/types/fx/hitStop.d.ts +20 -0
  587. package/dist/types/fx/hitStop.d.ts.map +1 -0
  588. package/dist/types/fx/viewCull.d.ts +14 -0
  589. package/dist/types/fx/viewCull.d.ts.map +1 -0
  590. package/dist/types/i18n/Translator.d.ts +52 -0
  591. package/dist/types/i18n/Translator.d.ts.map +1 -0
  592. package/dist/types/i18n/extractStrings.d.ts +25 -0
  593. package/dist/types/i18n/extractStrings.d.ts.map +1 -0
  594. package/dist/types/i18n/formatMessage.d.ts +10 -0
  595. package/dist/types/i18n/formatMessage.d.ts.map +1 -0
  596. package/dist/types/index.d.ts +149 -0
  597. package/dist/types/index.d.ts.map +1 -0
  598. package/dist/types/input/Actions.d.ts +94 -0
  599. package/dist/types/input/Actions.d.ts.map +1 -0
  600. package/dist/types/input/AimGesture.d.ts +106 -0
  601. package/dist/types/input/AimGesture.d.ts.map +1 -0
  602. package/dist/types/input/Keyboard.d.ts +30 -0
  603. package/dist/types/input/Keyboard.d.ts.map +1 -0
  604. package/dist/types/input/Keymap.d.ts +85 -0
  605. package/dist/types/input/Keymap.d.ts.map +1 -0
  606. package/dist/types/input/TargetLock.d.ts +56 -0
  607. package/dist/types/input/TargetLock.d.ts.map +1 -0
  608. package/dist/types/input/aimAxis.d.ts +9 -0
  609. package/dist/types/input/aimAxis.d.ts.map +1 -0
  610. package/dist/types/input/keyChord.d.ts +15 -0
  611. package/dist/types/input/keyChord.d.ts.map +1 -0
  612. package/dist/types/input/longPress.d.ts +21 -0
  613. package/dist/types/input/longPress.d.ts.map +1 -0
  614. package/dist/types/input/stickAxis.d.ts +26 -0
  615. package/dist/types/input/stickAxis.d.ts.map +1 -0
  616. package/dist/types/input/touchDetect.d.ts +18 -0
  617. package/dist/types/input/touchDetect.d.ts.map +1 -0
  618. package/dist/types/light/LightLayer.d.ts +65 -0
  619. package/dist/types/light/LightLayer.d.ts.map +1 -0
  620. package/dist/types/nav/MinHeap.d.ts +15 -0
  621. package/dist/types/nav/MinHeap.d.ts.map +1 -0
  622. package/dist/types/nav/findPath.d.ts +38 -0
  623. package/dist/types/nav/findPath.d.ts.map +1 -0
  624. package/dist/types/nav/navGrid.d.ts +48 -0
  625. package/dist/types/nav/navGrid.d.ts.map +1 -0
  626. package/dist/types/nav/nearestOpen.d.ts +8 -0
  627. package/dist/types/nav/nearestOpen.d.ts.map +1 -0
  628. package/dist/types/nav/straightenPath.d.ts +13 -0
  629. package/dist/types/nav/straightenPath.d.ts.map +1 -0
  630. package/dist/types/net/Connection.d.ts +66 -0
  631. package/dist/types/net/Connection.d.ts.map +1 -0
  632. package/dist/types/net/InterpolationBuffer.d.ts +36 -0
  633. package/dist/types/net/InterpolationBuffer.d.ts.map +1 -0
  634. package/dist/types/net/PredictedMover.d.ts +43 -0
  635. package/dist/types/net/PredictedMover.d.ts.map +1 -0
  636. package/dist/types/net/Room.d.ts +69 -0
  637. package/dist/types/net/Room.d.ts.map +1 -0
  638. package/dist/types/net/RoomHost.d.ts +74 -0
  639. package/dist/types/net/RoomHost.d.ts.map +1 -0
  640. package/dist/types/net/cadence.d.ts +22 -0
  641. package/dist/types/net/cadence.d.ts.map +1 -0
  642. package/dist/types/net/constants.d.ts +24 -0
  643. package/dist/types/net/constants.d.ts.map +1 -0
  644. package/dist/types/net/lobby/LobbyClient.d.ts +107 -0
  645. package/dist/types/net/lobby/LobbyClient.d.ts.map +1 -0
  646. package/dist/types/net/lobby/LobbyHost.d.ts +147 -0
  647. package/dist/types/net/lobby/LobbyHost.d.ts.map +1 -0
  648. package/dist/types/net/lobby/LobbyRooms.d.ts +56 -0
  649. package/dist/types/net/lobby/LobbyRooms.d.ts.map +1 -0
  650. package/dist/types/net/lobby/Matchmaker.d.ts +57 -0
  651. package/dist/types/net/lobby/Matchmaker.d.ts.map +1 -0
  652. package/dist/types/net/lobby/index.d.ts +6 -0
  653. package/dist/types/net/lobby/index.d.ts.map +1 -0
  654. package/dist/types/net/lobby/lobbyProtocol.d.ts +143 -0
  655. package/dist/types/net/lobby/lobbyProtocol.d.ts.map +1 -0
  656. package/dist/types/net/movement.d.ts +50 -0
  657. package/dist/types/net/movement.d.ts.map +1 -0
  658. package/dist/types/net/protocol.d.ts +59 -0
  659. package/dist/types/net/protocol.d.ts.map +1 -0
  660. package/dist/types/net/serverClock.d.ts +14 -0
  661. package/dist/types/net/serverClock.d.ts.map +1 -0
  662. package/dist/types/net/snapshotCodec.d.ts +55 -0
  663. package/dist/types/net/snapshotCodec.d.ts.map +1 -0
  664. package/dist/types/parallax/Parallax.d.ts +37 -0
  665. package/dist/types/parallax/Parallax.d.ts.map +1 -0
  666. package/dist/types/parallax/ParallaxLayer.d.ts +80 -0
  667. package/dist/types/parallax/ParallaxLayer.d.ts.map +1 -0
  668. package/dist/types/parallax/parallaxMath.d.ts +50 -0
  669. package/dist/types/parallax/parallaxMath.d.ts.map +1 -0
  670. package/dist/types/particles/Emitter.d.ts +97 -0
  671. package/dist/types/particles/Emitter.d.ts.map +1 -0
  672. package/dist/types/particles/ParticleBudget.d.ts +28 -0
  673. package/dist/types/particles/ParticleBudget.d.ts.map +1 -0
  674. package/dist/types/particles/ParticleSim.d.ts +38 -0
  675. package/dist/types/particles/ParticleSim.d.ts.map +1 -0
  676. package/dist/types/particles/particleCurves.d.ts +21 -0
  677. package/dist/types/particles/particleCurves.d.ts.map +1 -0
  678. package/dist/types/particles/particleSampling.d.ts +20 -0
  679. package/dist/types/particles/particleSampling.d.ts.map +1 -0
  680. package/dist/types/physics/Body.d.ts +130 -0
  681. package/dist/types/physics/Body.d.ts.map +1 -0
  682. package/dist/types/physics/BroadPhase.d.ts +26 -0
  683. package/dist/types/physics/BroadPhase.d.ts.map +1 -0
  684. package/dist/types/physics/Contact.d.ts +62 -0
  685. package/dist/types/physics/Contact.d.ts.map +1 -0
  686. package/dist/types/physics/ContactSolver.d.ts +29 -0
  687. package/dist/types/physics/ContactSolver.d.ts.map +1 -0
  688. package/dist/types/physics/PhysicsWorld.d.ts +78 -0
  689. package/dist/types/physics/PhysicsWorld.d.ts.map +1 -0
  690. package/dist/types/physics/PhysicsWorldOptions.d.ts +24 -0
  691. package/dist/types/physics/PhysicsWorldOptions.d.ts.map +1 -0
  692. package/dist/types/physics/SpatialHash.d.ts +23 -0
  693. package/dist/types/physics/SpatialHash.d.ts.map +1 -0
  694. package/dist/types/physics/collide.d.ts +27 -0
  695. package/dist/types/physics/collide.d.ts.map +1 -0
  696. package/dist/types/physics/collidePolygon.d.ts +14 -0
  697. package/dist/types/physics/collidePolygon.d.ts.map +1 -0
  698. package/dist/types/physics/contactReport.d.ts +8 -0
  699. package/dist/types/physics/contactReport.d.ts.map +1 -0
  700. package/dist/types/physics/drawColliders.d.ts +43 -0
  701. package/dist/types/physics/drawColliders.d.ts.map +1 -0
  702. package/dist/types/physics/physicsSystem.d.ts +5 -0
  703. package/dist/types/physics/physicsSystem.d.ts.map +1 -0
  704. package/dist/types/physics/polygon.d.ts +28 -0
  705. package/dist/types/physics/polygon.d.ts.map +1 -0
  706. package/dist/types/physics/raycast.d.ts +19 -0
  707. package/dist/types/physics/raycast.d.ts.map +1 -0
  708. package/dist/types/physics/syncToBody.d.ts +16 -0
  709. package/dist/types/physics/syncToBody.d.ts.map +1 -0
  710. package/dist/types/physics/tileBodies.d.ts +36 -0
  711. package/dist/types/physics/tileBodies.d.ts.map +1 -0
  712. package/dist/types/physics/types.d.ts +116 -0
  713. package/dist/types/physics/types.d.ts.map +1 -0
  714. package/dist/types/pixel/Darkness.d.ts +78 -0
  715. package/dist/types/pixel/Darkness.d.ts.map +1 -0
  716. package/dist/types/pixel/DitherVignette.d.ts +35 -0
  717. package/dist/types/pixel/DitherVignette.d.ts.map +1 -0
  718. package/dist/types/pixel/Evaporation.d.ts +30 -0
  719. package/dist/types/pixel/Evaporation.d.ts.map +1 -0
  720. package/dist/types/pixel/NightShade.d.ts +38 -0
  721. package/dist/types/pixel/NightShade.d.ts.map +1 -0
  722. package/dist/types/pixel/PixelLayer.d.ts +85 -0
  723. package/dist/types/pixel/PixelLayer.d.ts.map +1 -0
  724. package/dist/types/pixel/SwayProp.d.ts +52 -0
  725. package/dist/types/pixel/SwayProp.d.ts.map +1 -0
  726. package/dist/types/pixel/index.d.ts +31 -0
  727. package/dist/types/pixel/index.d.ts.map +1 -0
  728. package/dist/types/pixel/lights.d.ts +34 -0
  729. package/dist/types/pixel/lights.d.ts.map +1 -0
  730. package/dist/types/pixel/nineSlice.d.ts +71 -0
  731. package/dist/types/pixel/nineSlice.d.ts.map +1 -0
  732. package/dist/types/pixel/paintLayer.d.ts +35 -0
  733. package/dist/types/pixel/paintLayer.d.ts.map +1 -0
  734. package/dist/types/pixel/palette.d.ts +58 -0
  735. package/dist/types/pixel/palette.d.ts.map +1 -0
  736. package/dist/types/pixel/pixel.d.ts +80 -0
  737. package/dist/types/pixel/pixel.d.ts.map +1 -0
  738. package/dist/types/pixel/pixelPaint.d.ts +43 -0
  739. package/dist/types/pixel/pixelPaint.d.ts.map +1 -0
  740. package/dist/types/pixel/pixelTone.d.ts +51 -0
  741. package/dist/types/pixel/pixelTone.d.ts.map +1 -0
  742. package/dist/types/pixel/propKit.d.ts +26 -0
  743. package/dist/types/pixel/propKit.d.ts.map +1 -0
  744. package/dist/types/pixel/ramp.d.ts +57 -0
  745. package/dist/types/pixel/ramp.d.ts.map +1 -0
  746. package/dist/types/pixel/selout.d.ts +3 -0
  747. package/dist/types/pixel/selout.d.ts.map +1 -0
  748. package/dist/types/pixel/spritePixels.d.ts +29 -0
  749. package/dist/types/pixel/spritePixels.d.ts.map +1 -0
  750. package/dist/types/pixel/swayRig.d.ts +72 -0
  751. package/dist/types/pixel/swayRig.d.ts.map +1 -0
  752. package/dist/types/pixel/vignetteMask.d.ts +16 -0
  753. package/dist/types/pixel/vignetteMask.d.ts.map +1 -0
  754. package/dist/types/pixel/weatherArt.d.ts +29 -0
  755. package/dist/types/pixel/weatherArt.d.ts.map +1 -0
  756. package/dist/types/platform/touch.d.ts +10 -0
  757. package/dist/types/platform/touch.d.ts.map +1 -0
  758. package/dist/types/postfx/BloomFilter.d.ts +33 -0
  759. package/dist/types/postfx/BloomFilter.d.ts.map +1 -0
  760. package/dist/types/postfx/ChromaticAberrationFilter.d.ts +11 -0
  761. package/dist/types/postfx/ChromaticAberrationFilter.d.ts.map +1 -0
  762. package/dist/types/postfx/ColorAdjustFilter.d.ts +32 -0
  763. package/dist/types/postfx/ColorAdjustFilter.d.ts.map +1 -0
  764. package/dist/types/postfx/CrtFilter.d.ts +16 -0
  765. package/dist/types/postfx/CrtFilter.d.ts.map +1 -0
  766. package/dist/types/postfx/PixelateFilter.d.ts +8 -0
  767. package/dist/types/postfx/PixelateFilter.d.ts.map +1 -0
  768. package/dist/types/postfx/PostFx.d.ts +92 -0
  769. package/dist/types/postfx/PostFx.d.ts.map +1 -0
  770. package/dist/types/postfx/ShockwaveFilter.d.ts +20 -0
  771. package/dist/types/postfx/ShockwaveFilter.d.ts.map +1 -0
  772. package/dist/types/postfx/VignetteFilter.d.ts +19 -0
  773. package/dist/types/postfx/VignetteFilter.d.ts.map +1 -0
  774. package/dist/types/postfx/fxAnimator.d.ts +32 -0
  775. package/dist/types/postfx/fxAnimator.d.ts.map +1 -0
  776. package/dist/types/postfx/fxShader.d.ts +49 -0
  777. package/dist/types/postfx/fxShader.d.ts.map +1 -0
  778. package/dist/types/postfx/index.d.ts +11 -0
  779. package/dist/types/postfx/index.d.ts.map +1 -0
  780. package/dist/types/react/ChoiceDialog.d.ts +8 -0
  781. package/dist/types/react/ChoiceDialog.d.ts.map +1 -0
  782. package/dist/types/react/ConfirmDialog.d.ts +9 -0
  783. package/dist/types/react/ConfirmDialog.d.ts.map +1 -0
  784. package/dist/types/react/Glyph.d.ts +54 -0
  785. package/dist/types/react/Glyph.d.ts.map +1 -0
  786. package/dist/types/react/Modal.d.ts +22 -0
  787. package/dist/types/react/Modal.d.ts.map +1 -0
  788. package/dist/types/react/Panel.d.ts +29 -0
  789. package/dist/types/react/Panel.d.ts.map +1 -0
  790. package/dist/types/react/PixelImage.d.ts +19 -0
  791. package/dist/types/react/PixelImage.d.ts.map +1 -0
  792. package/dist/types/react/Select.d.ts +27 -0
  793. package/dist/types/react/Select.d.ts.map +1 -0
  794. package/dist/types/react/Slider.d.ts +24 -0
  795. package/dist/types/react/Slider.d.ts.map +1 -0
  796. package/dist/types/react/SplitPane.d.ts +26 -0
  797. package/dist/types/react/SplitPane.d.ts.map +1 -0
  798. package/dist/types/react/TabStrip.d.ts +31 -0
  799. package/dist/types/react/TabStrip.d.ts.map +1 -0
  800. package/dist/types/react/TitleTips.d.ts +15 -0
  801. package/dist/types/react/TitleTips.d.ts.map +1 -0
  802. package/dist/types/react/Tooltip.d.ts +22 -0
  803. package/dist/types/react/Tooltip.d.ts.map +1 -0
  804. package/dist/types/react/UiProvider.d.ts +52 -0
  805. package/dist/types/react/UiProvider.d.ts.map +1 -0
  806. package/dist/types/react/baseCss.d.ts +27 -0
  807. package/dist/types/react/baseCss.d.ts.map +1 -0
  808. package/dist/types/react/choiceStore.d.ts +34 -0
  809. package/dist/types/react/choiceStore.d.ts.map +1 -0
  810. package/dist/types/react/classNames.d.ts +12 -0
  811. package/dist/types/react/classNames.d.ts.map +1 -0
  812. package/dist/types/react/confirmStore.d.ts +30 -0
  813. package/dist/types/react/confirmStore.d.ts.map +1 -0
  814. package/dist/types/react/index.d.ts +33 -0
  815. package/dist/types/react/index.d.ts.map +1 -0
  816. package/dist/types/react/labels.d.ts +24 -0
  817. package/dist/types/react/labels.d.ts.map +1 -0
  818. package/dist/types/react/placement.d.ts +59 -0
  819. package/dist/types/react/placement.d.ts.map +1 -0
  820. package/dist/types/react/useFillSheet.d.ts +9 -0
  821. package/dist/types/react/useFillSheet.d.ts.map +1 -0
  822. package/dist/types/react/useFitToViewport.d.ts +20 -0
  823. package/dist/types/react/useFitToViewport.d.ts.map +1 -0
  824. package/dist/types/react/usePicked.d.ts +9 -0
  825. package/dist/types/react/usePicked.d.ts.map +1 -0
  826. package/dist/types/react/useStore.d.ts +8 -0
  827. package/dist/types/react/useStore.d.ts.map +1 -0
  828. package/dist/types/react/useViewport.d.ts +4 -0
  829. package/dist/types/react/useViewport.d.ts.map +1 -0
  830. package/dist/types/rig/PosePlayer.d.ts +64 -0
  831. package/dist/types/rig/PosePlayer.d.ts.map +1 -0
  832. package/dist/types/rig/RigView.d.ts +68 -0
  833. package/dist/types/rig/RigView.d.ts.map +1 -0
  834. package/dist/types/rig/Skeleton.d.ts +14 -0
  835. package/dist/types/rig/Skeleton.d.ts.map +1 -0
  836. package/dist/types/rig/humanoid.d.ts +4 -0
  837. package/dist/types/rig/humanoid.d.ts.map +1 -0
  838. package/dist/types/rig/humanoidPoses.d.ts +117 -0
  839. package/dist/types/rig/humanoidPoses.d.ts.map +1 -0
  840. package/dist/types/rig/poseMath.d.ts +14 -0
  841. package/dist/types/rig/poseMath.d.ts.map +1 -0
  842. package/dist/types/rig/rigTypes.d.ts +82 -0
  843. package/dist/types/rig/rigTypes.d.ts.map +1 -0
  844. package/dist/types/save/Autosaver.d.ts +43 -0
  845. package/dist/types/save/Autosaver.d.ts.map +1 -0
  846. package/dist/types/save/MemoryBackend.d.ts +10 -0
  847. package/dist/types/save/MemoryBackend.d.ts.map +1 -0
  848. package/dist/types/save/SaveBackend.d.ts +14 -0
  849. package/dist/types/save/SaveBackend.d.ts.map +1 -0
  850. package/dist/types/save/SaveStore.d.ts +73 -0
  851. package/dist/types/save/SaveStore.d.ts.map +1 -0
  852. package/dist/types/save/WebStorageBackend.d.ts +14 -0
  853. package/dist/types/save/WebStorageBackend.d.ts.map +1 -0
  854. package/dist/types/save/checksum.d.ts +7 -0
  855. package/dist/types/save/checksum.d.ts.map +1 -0
  856. package/dist/types/save/migrateSave.d.ts +17 -0
  857. package/dist/types/save/migrateSave.d.ts.map +1 -0
  858. package/dist/types/settings.d.ts +25 -0
  859. package/dist/types/settings.d.ts.map +1 -0
  860. package/dist/types/tilemap/TilemapView.d.ts +42 -0
  861. package/dist/types/tilemap/TilemapView.d.ts.map +1 -0
  862. package/dist/types/tilemap/collision.d.ts +16 -0
  863. package/dist/types/tilemap/collision.d.ts.map +1 -0
  864. package/dist/types/tilemap/tiled.d.ts +104 -0
  865. package/dist/types/tilemap/tiled.d.ts.map +1 -0
  866. package/dist/types/transitions/CrossfadeTransition.d.ts +20 -0
  867. package/dist/types/transitions/CrossfadeTransition.d.ts.map +1 -0
  868. package/dist/types/transitions/DitherWipeTransition.d.ts +35 -0
  869. package/dist/types/transitions/DitherWipeTransition.d.ts.map +1 -0
  870. package/dist/types/transitions/FadeTransition.d.ts +20 -0
  871. package/dist/types/transitions/FadeTransition.d.ts.map +1 -0
  872. package/dist/types/transitions/Letterbox.d.ts +33 -0
  873. package/dist/types/transitions/Letterbox.d.ts.map +1 -0
  874. package/dist/types/transitions/Transition.d.ts +22 -0
  875. package/dist/types/transitions/Transition.d.ts.map +1 -0
  876. package/dist/types/transitions/ditherMask.d.ts +13 -0
  877. package/dist/types/transitions/ditherMask.d.ts.map +1 -0
  878. package/dist/types/transitions/transitionTo.d.ts +16 -0
  879. package/dist/types/transitions/transitionTo.d.ts.map +1 -0
  880. package/dist/types/transitions/tweenDone.d.ts +5 -0
  881. package/dist/types/transitions/tweenDone.d.ts.map +1 -0
  882. package/dist/types/ui/Bar.d.ts +41 -0
  883. package/dist/types/ui/Bar.d.ts.map +1 -0
  884. package/dist/types/ui/Button.d.ts +47 -0
  885. package/dist/types/ui/Button.d.ts.map +1 -0
  886. package/dist/types/ui/Dialog.d.ts +47 -0
  887. package/dist/types/ui/Dialog.d.ts.map +1 -0
  888. package/dist/types/ui/FocusManager.d.ts +53 -0
  889. package/dist/types/ui/FocusManager.d.ts.map +1 -0
  890. package/dist/types/ui/Label.d.ts +24 -0
  891. package/dist/types/ui/Label.d.ts.map +1 -0
  892. package/dist/types/ui/List.d.ts +23 -0
  893. package/dist/types/ui/List.d.ts.map +1 -0
  894. package/dist/types/ui/Panel.d.ts +38 -0
  895. package/dist/types/ui/Panel.d.ts.map +1 -0
  896. package/dist/types/ui/ScrollView.d.ts +56 -0
  897. package/dist/types/ui/ScrollView.d.ts.map +1 -0
  898. package/dist/types/ui/Slider.d.ts +47 -0
  899. package/dist/types/ui/Slider.d.ts.map +1 -0
  900. package/dist/types/ui/Stack.d.ts +16 -0
  901. package/dist/types/ui/Stack.d.ts.map +1 -0
  902. package/dist/types/ui/Toggle.d.ts +31 -0
  903. package/dist/types/ui/Toggle.d.ts.map +1 -0
  904. package/dist/types/ui/UiHost.d.ts +18 -0
  905. package/dist/types/ui/UiHost.d.ts.map +1 -0
  906. package/dist/types/ui/UiPointerGate.d.ts +17 -0
  907. package/dist/types/ui/UiPointerGate.d.ts.map +1 -0
  908. package/dist/types/ui/UiRoot.d.ts +73 -0
  909. package/dist/types/ui/UiRoot.d.ts.map +1 -0
  910. package/dist/types/ui/Widget.d.ts +56 -0
  911. package/dist/types/ui/Widget.d.ts.map +1 -0
  912. package/dist/types/ui/dom/DomOverlay.d.ts +52 -0
  913. package/dist/types/ui/dom/DomOverlay.d.ts.map +1 -0
  914. package/dist/types/ui/dom/DomWorldAnchors.d.ts +50 -0
  915. package/dist/types/ui/dom/DomWorldAnchors.d.ts.map +1 -0
  916. package/dist/types/ui/dom/InputShield.d.ts +20 -0
  917. package/dist/types/ui/dom/InputShield.d.ts.map +1 -0
  918. package/dist/types/ui/dom/createStore.d.ts +22 -0
  919. package/dist/types/ui/dom/createStore.d.ts.map +1 -0
  920. package/dist/types/ui/dom/shieldDecision.d.ts +34 -0
  921. package/dist/types/ui/dom/shieldDecision.d.ts.map +1 -0
  922. package/dist/types/ui/dom/worldToScreen.d.ts +24 -0
  923. package/dist/types/ui/dom/worldToScreen.d.ts.map +1 -0
  924. package/dist/types/ui/index.d.ts +38 -0
  925. package/dist/types/ui/index.d.ts.map +1 -0
  926. package/dist/types/ui/layout/anchor.d.ts +9 -0
  927. package/dist/types/ui/layout/anchor.d.ts.map +1 -0
  928. package/dist/types/ui/layout/barDrain.d.ts +25 -0
  929. package/dist/types/ui/layout/barDrain.d.ts.map +1 -0
  930. package/dist/types/ui/layout/fitToViewport.d.ts +32 -0
  931. package/dist/types/ui/layout/fitToViewport.d.ts.map +1 -0
  932. package/dist/types/ui/layout/focusNav.d.ts +13 -0
  933. package/dist/types/ui/layout/focusNav.d.ts.map +1 -0
  934. package/dist/types/ui/layout/geometry.d.ts +35 -0
  935. package/dist/types/ui/layout/geometry.d.ts.map +1 -0
  936. package/dist/types/ui/layout/listWidth.d.ts +13 -0
  937. package/dist/types/ui/layout/listWidth.d.ts.map +1 -0
  938. package/dist/types/ui/layout/placeTooltip.d.ts +23 -0
  939. package/dist/types/ui/layout/placeTooltip.d.ts.map +1 -0
  940. package/dist/types/ui/layout/scroll.d.ts +17 -0
  941. package/dist/types/ui/layout/scroll.d.ts.map +1 -0
  942. package/dist/types/ui/layout/slider.d.ts +7 -0
  943. package/dist/types/ui/layout/slider.d.ts.map +1 -0
  944. package/dist/types/ui/layout/stack.d.ts +26 -0
  945. package/dist/types/ui/layout/stack.d.ts.map +1 -0
  946. package/dist/types/ui/layout/wrapRow.d.ts +6 -0
  947. package/dist/types/ui/layout/wrapRow.d.ts.map +1 -0
  948. package/dist/ui/Bar.js +54 -0
  949. package/dist/ui/Bar.js.map +1 -0
  950. package/dist/ui/Button.js +58 -0
  951. package/dist/ui/Button.js.map +1 -0
  952. package/dist/ui/Dialog.js +56 -0
  953. package/dist/ui/Dialog.js.map +1 -0
  954. package/dist/ui/FocusManager.js +97 -0
  955. package/dist/ui/FocusManager.js.map +1 -0
  956. package/dist/ui/Label.js +36 -0
  957. package/dist/ui/Label.js.map +1 -0
  958. package/dist/ui/List.js +45 -0
  959. package/dist/ui/List.js.map +1 -0
  960. package/dist/ui/Panel.js +38 -0
  961. package/dist/ui/Panel.js.map +1 -0
  962. package/dist/ui/ScrollView.js +96 -0
  963. package/dist/ui/ScrollView.js.map +1 -0
  964. package/dist/ui/Slider.js +55 -0
  965. package/dist/ui/Slider.js.map +1 -0
  966. package/dist/ui/Stack.js +28 -0
  967. package/dist/ui/Stack.js.map +1 -0
  968. package/dist/ui/Toggle.js +37 -0
  969. package/dist/ui/Toggle.js.map +1 -0
  970. package/dist/ui/UiHost.js +9 -0
  971. package/dist/ui/UiHost.js.map +1 -0
  972. package/dist/ui/UiPointerGate.js +25 -0
  973. package/dist/ui/UiPointerGate.js.map +1 -0
  974. package/dist/ui/UiRoot.js +93 -0
  975. package/dist/ui/UiRoot.js.map +1 -0
  976. package/dist/ui/Widget.js +90 -0
  977. package/dist/ui/Widget.js.map +1 -0
  978. package/dist/ui/dom/DomOverlay.js +59 -0
  979. package/dist/ui/dom/DomOverlay.js.map +1 -0
  980. package/dist/ui/dom/DomWorldAnchors.js +59 -0
  981. package/dist/ui/dom/DomWorldAnchors.js.map +1 -0
  982. package/dist/ui/dom/InputShield.js +27 -0
  983. package/dist/ui/dom/InputShield.js.map +1 -0
  984. package/dist/ui/dom/createStore.js +42 -0
  985. package/dist/ui/dom/createStore.js.map +1 -0
  986. package/dist/ui/dom/shieldDecision.js +36 -0
  987. package/dist/ui/dom/shieldDecision.js.map +1 -0
  988. package/dist/ui/dom/worldToScreen.js +11 -0
  989. package/dist/ui/dom/worldToScreen.js.map +1 -0
  990. package/dist/ui/layout/anchor.js +20 -0
  991. package/dist/ui/layout/anchor.js.map +1 -0
  992. package/dist/ui/layout/barDrain.js +25 -0
  993. package/dist/ui/layout/barDrain.js.map +1 -0
  994. package/dist/ui/layout/fitToViewport.js +17 -0
  995. package/dist/ui/layout/fitToViewport.js.map +1 -0
  996. package/dist/ui/layout/focusNav.js +42 -0
  997. package/dist/ui/layout/focusNav.js.map +1 -0
  998. package/dist/ui/layout/geometry.js +21 -0
  999. package/dist/ui/layout/geometry.js.map +1 -0
  1000. package/dist/ui/layout/listWidth.js +10 -0
  1001. package/dist/ui/layout/listWidth.js.map +1 -0
  1002. package/dist/ui/layout/placeTooltip.js +28 -0
  1003. package/dist/ui/layout/placeTooltip.js.map +1 -0
  1004. package/dist/ui/layout/scroll.js +24 -0
  1005. package/dist/ui/layout/scroll.js.map +1 -0
  1006. package/dist/ui/layout/slider.js +20 -0
  1007. package/dist/ui/layout/slider.js.map +1 -0
  1008. package/dist/ui/layout/stack.js +27 -0
  1009. package/dist/ui/layout/stack.js.map +1 -0
  1010. package/dist/ui/layout/wrapRow.js +13 -0
  1011. package/dist/ui/layout/wrapRow.js.map +1 -0
  1012. package/dist/ui.js +85 -0
  1013. package/dist/ui.js.map +1 -0
  1014. 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;"}