@thunderclap-engine/engine 0.0.0-stage → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (566) hide show
  1. package/CHANGELOG.md +390 -0
  2. package/LICENSE +21 -0
  3. package/README.md +333 -2
  4. package/dist/analytics/analytics.d.ts +80 -0
  5. package/dist/analytics/analytics.js +129 -0
  6. package/dist/analytics/index.d.ts +1 -0
  7. package/dist/analytics/index.js +1 -0
  8. package/dist/anim/aim.d.ts +43 -0
  9. package/dist/anim/aim.js +157 -0
  10. package/dist/anim/clip.d.ts +98 -0
  11. package/dist/anim/clip.js +282 -0
  12. package/dist/anim/compress.d.ts +65 -0
  13. package/dist/anim/compress.js +339 -0
  14. package/dist/anim/foot-ik.d.ts +74 -0
  15. package/dist/anim/foot-ik.js +241 -0
  16. package/dist/anim/graph.d.ts +153 -0
  17. package/dist/anim/graph.js +532 -0
  18. package/dist/anim/ik.d.ts +105 -0
  19. package/dist/anim/ik.js +435 -0
  20. package/dist/anim/index.d.ts +36 -0
  21. package/dist/anim/index.js +21 -0
  22. package/dist/anim/match.d.ts +66 -0
  23. package/dist/anim/match.js +153 -0
  24. package/dist/anim/mixer.d.ts +113 -0
  25. package/dist/anim/mixer.js +314 -0
  26. package/dist/anim/morph.d.ts +41 -0
  27. package/dist/anim/morph.js +94 -0
  28. package/dist/anim/pose.d.ts +74 -0
  29. package/dist/anim/pose.js +254 -0
  30. package/dist/anim/quat.d.ts +44 -0
  31. package/dist/anim/quat.js +187 -0
  32. package/dist/anim/retarget.d.ts +97 -0
  33. package/dist/anim/retarget.js +366 -0
  34. package/dist/anim/root-motion.d.ts +44 -0
  35. package/dist/anim/root-motion.js +224 -0
  36. package/dist/anim/skin-pose.d.ts +39 -0
  37. package/dist/anim/skin-pose.js +53 -0
  38. package/dist/anim/socket.d.ts +47 -0
  39. package/dist/anim/socket.js +84 -0
  40. package/dist/anim/spring-chain.d.ts +73 -0
  41. package/dist/anim/spring-chain.js +294 -0
  42. package/dist/assets/atlas.d.ts +90 -0
  43. package/dist/assets/atlas.js +212 -0
  44. package/dist/assets/baked.d.ts +33 -0
  45. package/dist/assets/baked.js +38 -0
  46. package/dist/assets/bundle.d.ts +88 -0
  47. package/dist/assets/bundle.js +464 -0
  48. package/dist/assets/cache.d.ts +56 -0
  49. package/dist/assets/cache.js +123 -0
  50. package/dist/assets/gltf-load.d.ts +252 -0
  51. package/dist/assets/gltf-load.js +661 -0
  52. package/dist/assets/gltf-skin.d.ts +36 -0
  53. package/dist/assets/gltf-skin.js +109 -0
  54. package/dist/assets/gltf.d.ts +706 -0
  55. package/dist/assets/gltf.js +1376 -0
  56. package/dist/assets/index.d.ts +20 -0
  57. package/dist/assets/index.js +10 -0
  58. package/dist/assets/ktx2.d.ts +71 -0
  59. package/dist/assets/ktx2.js +213 -0
  60. package/dist/assets/manifest.d.ts +79 -0
  61. package/dist/assets/manifest.js +7 -0
  62. package/dist/assets/meshopt.d.ts +23 -0
  63. package/dist/assets/meshopt.js +403 -0
  64. package/dist/audio/audio.d.ts +733 -0
  65. package/dist/audio/audio.js +2013 -0
  66. package/dist/audio/dsp.d.ts +61 -0
  67. package/dist/audio/dsp.js +159 -0
  68. package/dist/audio/duck.d.ts +44 -0
  69. package/dist/audio/duck.js +101 -0
  70. package/dist/audio/envelope.d.ts +53 -0
  71. package/dist/audio/envelope.js +106 -0
  72. package/dist/audio/index.d.ts +13 -0
  73. package/dist/audio/index.js +14 -0
  74. package/dist/audio/music.d.ts +113 -0
  75. package/dist/audio/music.js +548 -0
  76. package/dist/audio/occlusion.d.ts +55 -0
  77. package/dist/audio/occlusion.js +61 -0
  78. package/dist/audio/persist.d.ts +23 -0
  79. package/dist/audio/persist.js +27 -0
  80. package/dist/audio/recipes.d.ts +55 -0
  81. package/dist/audio/recipes.js +227 -0
  82. package/dist/audio/send.d.ts +41 -0
  83. package/dist/audio/send.js +118 -0
  84. package/dist/audio/sprites.d.ts +59 -0
  85. package/dist/audio/sprites.js +43 -0
  86. package/dist/audio/synth.d.ts +103 -0
  87. package/dist/audio/synth.js +197 -0
  88. package/dist/audio/variations.d.ts +25 -0
  89. package/dist/audio/variations.js +55 -0
  90. package/dist/audio/zones.d.ts +100 -0
  91. package/dist/audio/zones.js +167 -0
  92. package/dist/core/detached-surface.d.ts +44 -0
  93. package/dist/core/detached-surface.js +104 -0
  94. package/dist/core/events.d.ts +24 -0
  95. package/dist/core/events.js +43 -0
  96. package/dist/core/game.d.ts +409 -0
  97. package/dist/core/game.js +530 -0
  98. package/dist/core/hash.d.ts +24 -0
  99. package/dist/core/hash.js +49 -0
  100. package/dist/core/index.d.ts +17 -0
  101. package/dist/core/index.js +9 -0
  102. package/dist/core/loop.d.ts +113 -0
  103. package/dist/core/loop.js +185 -0
  104. package/dist/core/math.d.ts +58 -0
  105. package/dist/core/math.js +210 -0
  106. package/dist/core/noise.d.ts +40 -0
  107. package/dist/core/noise.js +247 -0
  108. package/dist/core/pool.d.ts +42 -0
  109. package/dist/core/pool.js +85 -0
  110. package/dist/core/random.d.ts +61 -0
  111. package/dist/core/random.js +199 -0
  112. package/dist/core/scene.d.ts +79 -0
  113. package/dist/core/scene.js +195 -0
  114. package/dist/core/timer.d.ts +66 -0
  115. package/dist/core/timer.js +286 -0
  116. package/dist/fx/billboard-wgsl.d.ts +29 -0
  117. package/dist/fx/billboard-wgsl.js +158 -0
  118. package/dist/fx/billboard.d.ts +249 -0
  119. package/dist/fx/billboard.js +702 -0
  120. package/dist/fx/debug-draw.d.ts +127 -0
  121. package/dist/fx/debug-draw.js +523 -0
  122. package/dist/fx/debug-wgsl.d.ts +7 -0
  123. package/dist/fx/debug-wgsl.js +32 -0
  124. package/dist/fx/decals-wgsl.d.ts +15 -0
  125. package/dist/fx/decals-wgsl.js +173 -0
  126. package/dist/fx/decals.d.ts +216 -0
  127. package/dist/fx/decals.js +607 -0
  128. package/dist/fx/effect.d.ts +129 -0
  129. package/dist/fx/effect.js +349 -0
  130. package/dist/fx/effects/hit-spark.json +48 -0
  131. package/dist/fx/effects/index.d.ts +8 -0
  132. package/dist/fx/effects/index.js +9 -0
  133. package/dist/fx/effects/magic-aura.json +47 -0
  134. package/dist/fx/effects/smoke-puff.json +34 -0
  135. package/dist/fx/emit-surface.d.ts +40 -0
  136. package/dist/fx/emit-surface.js +124 -0
  137. package/dist/fx/flicker.d.ts +30 -0
  138. package/dist/fx/flicker.js +42 -0
  139. package/dist/fx/index.d.ts +31 -0
  140. package/dist/fx/index.js +20 -0
  141. package/dist/fx/particles-wgsl.d.ts +57 -0
  142. package/dist/fx/particles-wgsl.js +828 -0
  143. package/dist/fx/particles.d.ts +566 -0
  144. package/dist/fx/particles.js +1533 -0
  145. package/dist/fx/random.d.ts +15 -0
  146. package/dist/fx/random.js +20 -0
  147. package/dist/fx/sky-wgsl.d.ts +23 -0
  148. package/dist/fx/sky-wgsl.js +127 -0
  149. package/dist/fx/sky.d.ts +96 -0
  150. package/dist/fx/sky.js +175 -0
  151. package/dist/fx/text-atlas.d.ts +143 -0
  152. package/dist/fx/text-atlas.js +327 -0
  153. package/dist/fx/trail-wgsl.d.ts +11 -0
  154. package/dist/fx/trail-wgsl.js +42 -0
  155. package/dist/fx/trail.d.ts +194 -0
  156. package/dist/fx/trail.js +555 -0
  157. package/dist/fx/water-wgsl.d.ts +34 -0
  158. package/dist/fx/water-wgsl.js +197 -0
  159. package/dist/fx/water.d.ts +176 -0
  160. package/dist/fx/water.js +371 -0
  161. package/dist/geom/collide/bvh.d.ts +151 -0
  162. package/dist/geom/collide/bvh.js +493 -0
  163. package/dist/geom/collide/debug.d.ts +14 -0
  164. package/dist/geom/collide/debug.js +74 -0
  165. package/dist/geom/collide/grid.d.ts +26 -0
  166. package/dist/geom/collide/grid.js +91 -0
  167. package/dist/geom/collide/index.d.ts +8 -0
  168. package/dist/geom/collide/index.js +8 -0
  169. package/dist/geom/collide/queries.d.ts +70 -0
  170. package/dist/geom/collide/queries.js +583 -0
  171. package/dist/geom/collide/serialize.d.ts +14 -0
  172. package/dist/geom/collide/serialize.js +145 -0
  173. package/dist/geom/collide/shapes.d.ts +161 -0
  174. package/dist/geom/collide/shapes.js +686 -0
  175. package/dist/geom/collide/slide.d.ts +66 -0
  176. package/dist/geom/collide/slide.js +375 -0
  177. package/dist/geom/collide/tile-slide.d.ts +88 -0
  178. package/dist/geom/collide/tile-slide.js +255 -0
  179. package/dist/geom/geometry.d.ts +95 -0
  180. package/dist/geom/geometry.js +322 -0
  181. package/dist/geom/heightfield.d.ts +72 -0
  182. package/dist/geom/heightfield.js +295 -0
  183. package/dist/geom/hull.d.ts +27 -0
  184. package/dist/geom/hull.js +279 -0
  185. package/dist/geom/index.d.ts +35 -0
  186. package/dist/geom/index.js +23 -0
  187. package/dist/geom/iso.d.ts +74 -0
  188. package/dist/geom/iso.js +89 -0
  189. package/dist/geom/lod.d.ts +29 -0
  190. package/dist/geom/lod.js +27 -0
  191. package/dist/geom/ops.d.ts +47 -0
  192. package/dist/geom/ops.js +285 -0
  193. package/dist/geom/primitives.d.ts +97 -0
  194. package/dist/geom/primitives.js +359 -0
  195. package/dist/geom/shapes.d.ts +43 -0
  196. package/dist/geom/shapes.js +88 -0
  197. package/dist/geom/simplify.d.ts +38 -0
  198. package/dist/geom/simplify.js +519 -0
  199. package/dist/geom/split.d.ts +37 -0
  200. package/dist/geom/split.js +413 -0
  201. package/dist/geom/sweep.d.ts +83 -0
  202. package/dist/geom/sweep.js +534 -0
  203. package/dist/geom/tangents.d.ts +16 -0
  204. package/dist/geom/tangents.js +124 -0
  205. package/dist/geom/triangulate.d.ts +19 -0
  206. package/dist/geom/triangulate.js +147 -0
  207. package/dist/host/default.d.ts +10 -0
  208. package/dist/host/default.js +10 -0
  209. package/dist/host/index.d.ts +4 -0
  210. package/dist/host/index.js +3 -0
  211. package/dist/host/types.d.ts +144 -0
  212. package/dist/host/types.js +1 -0
  213. package/dist/host/web-links.d.ts +38 -0
  214. package/dist/host/web-links.js +110 -0
  215. package/dist/host/web.d.ts +30 -0
  216. package/dist/host/web.js +216 -0
  217. package/dist/host/xr.d.ts +24 -0
  218. package/dist/host/xr.js +59 -0
  219. package/dist/i18n/i18n.d.ts +59 -0
  220. package/dist/i18n/i18n.js +241 -0
  221. package/dist/i18n/index.d.ts +3 -0
  222. package/dist/i18n/index.js +3 -0
  223. package/dist/i18n/message.d.ts +72 -0
  224. package/dist/i18n/message.js +369 -0
  225. package/dist/i18n/negotiate.d.ts +17 -0
  226. package/dist/i18n/negotiate.js +58 -0
  227. package/dist/index.d.ts +7 -0
  228. package/dist/index.js +1 -0
  229. package/dist/input/bindings.d.ts +31 -0
  230. package/dist/input/bindings.js +141 -0
  231. package/dist/input/clock.d.ts +44 -0
  232. package/dist/input/clock.js +49 -0
  233. package/dist/input/follow.d.ts +133 -0
  234. package/dist/input/follow.js +218 -0
  235. package/dist/input/gestures.d.ts +281 -0
  236. package/dist/input/gestures.js +662 -0
  237. package/dist/input/glyphs.d.ts +35 -0
  238. package/dist/input/glyphs.js +216 -0
  239. package/dist/input/gyro.d.ts +85 -0
  240. package/dist/input/gyro.js +140 -0
  241. package/dist/input/index.d.ts +19 -0
  242. package/dist/input/index.js +16 -0
  243. package/dist/input/input.d.ts +543 -0
  244. package/dist/input/input.js +1492 -0
  245. package/dist/input/look.d.ts +327 -0
  246. package/dist/input/look.js +681 -0
  247. package/dist/input/magnify.d.ts +177 -0
  248. package/dist/input/magnify.js +131 -0
  249. package/dist/input/pointer-dispatch.d.ts +138 -0
  250. package/dist/input/pointer-dispatch.js +180 -0
  251. package/dist/input/pointer-router.d.ts +204 -0
  252. package/dist/input/pointer-router.js +533 -0
  253. package/dist/input/pointer-sources.d.ts +164 -0
  254. package/dist/input/pointer-sources.js +306 -0
  255. package/dist/input/rays.d.ts +138 -0
  256. package/dist/input/rays.js +615 -0
  257. package/dist/input/record.d.ts +209 -0
  258. package/dist/input/record.js +601 -0
  259. package/dist/input/touch-zones.d.ts +147 -0
  260. package/dist/input/touch-zones.js +300 -0
  261. package/dist/input/types.d.ts +158 -0
  262. package/dist/input/types.js +1 -0
  263. package/dist/input/xr-source.d.ts +53 -0
  264. package/dist/input/xr-source.js +164 -0
  265. package/dist/nav/astar.d.ts +45 -0
  266. package/dist/nav/astar.js +182 -0
  267. package/dist/nav/corridor.d.ts +40 -0
  268. package/dist/nav/corridor.js +95 -0
  269. package/dist/nav/crowd.d.ts +94 -0
  270. package/dist/nav/crowd.js +624 -0
  271. package/dist/nav/flow.d.ts +61 -0
  272. package/dist/nav/flow.js +193 -0
  273. package/dist/nav/grid.d.ts +108 -0
  274. package/dist/nav/grid.js +210 -0
  275. package/dist/nav/heap.d.ts +22 -0
  276. package/dist/nav/heap.js +92 -0
  277. package/dist/nav/index.d.ts +37 -0
  278. package/dist/nav/index.js +19 -0
  279. package/dist/nav/mesh/areas.d.ts +44 -0
  280. package/dist/nav/mesh/areas.js +98 -0
  281. package/dist/nav/mesh/bake-options.d.ts +33 -0
  282. package/dist/nav/mesh/bake-options.js +76 -0
  283. package/dist/nav/mesh/contour.d.ts +22 -0
  284. package/dist/nav/mesh/contour.js +323 -0
  285. package/dist/nav/mesh/flow3.d.ts +35 -0
  286. package/dist/nav/mesh/flow3.js +229 -0
  287. package/dist/nav/mesh/links.d.ts +38 -0
  288. package/dist/nav/mesh/links.js +72 -0
  289. package/dist/nav/mesh/mesh-path.d.ts +152 -0
  290. package/dist/nav/mesh/mesh-path.js +643 -0
  291. package/dist/nav/mesh/mesh-reach.d.ts +78 -0
  292. package/dist/nav/mesh/mesh-reach.js +450 -0
  293. package/dist/nav/mesh/navmesh.d.ts +117 -0
  294. package/dist/nav/mesh/navmesh.js +647 -0
  295. package/dist/nav/mesh/polymesh.d.ts +24 -0
  296. package/dist/nav/mesh/polymesh.js +384 -0
  297. package/dist/nav/mesh/regions.d.ts +12 -0
  298. package/dist/nav/mesh/regions.js +367 -0
  299. package/dist/nav/mesh/serialize.d.ts +13 -0
  300. package/dist/nav/mesh/serialize.js +197 -0
  301. package/dist/nav/mesh/voxelize.d.ts +111 -0
  302. package/dist/nav/mesh/voxelize.js +552 -0
  303. package/dist/nav/obstacles.d.ts +75 -0
  304. package/dist/nav/obstacles.js +294 -0
  305. package/dist/nav/path.d.ts +59 -0
  306. package/dist/nav/path.js +177 -0
  307. package/dist/nav/query-queue.d.ts +46 -0
  308. package/dist/nav/query-queue.js +308 -0
  309. package/dist/nav/reach.d.ts +53 -0
  310. package/dist/nav/reach.js +148 -0
  311. package/dist/nav/steer.d.ts +36 -0
  312. package/dist/nav/steer.js +78 -0
  313. package/dist/platform/boot.d.ts +28 -0
  314. package/dist/platform/boot.js +43 -0
  315. package/dist/platform/device-mode.d.ts +40 -0
  316. package/dist/platform/device-mode.js +104 -0
  317. package/dist/platform/device.d.ts +31 -0
  318. package/dist/platform/device.js +91 -0
  319. package/dist/platform/environment.d.ts +42 -0
  320. package/dist/platform/environment.js +82 -0
  321. package/dist/platform/gpu.d.ts +40 -0
  322. package/dist/platform/gpu.js +57 -0
  323. package/dist/platform/index.d.ts +18 -0
  324. package/dist/platform/index.js +10 -0
  325. package/dist/platform/letterbox.d.ts +43 -0
  326. package/dist/platform/letterbox.js +57 -0
  327. package/dist/platform/links.d.ts +20 -0
  328. package/dist/platform/links.js +43 -0
  329. package/dist/platform/screens.d.ts +36 -0
  330. package/dist/platform/screens.js +138 -0
  331. package/dist/platform/surface.d.ts +72 -0
  332. package/dist/platform/surface.js +157 -0
  333. package/dist/platform/xr-fake.d.ts +168 -0
  334. package/dist/platform/xr-fake.js +434 -0
  335. package/dist/platform/xr-surface.d.ts +120 -0
  336. package/dist/platform/xr-surface.js +214 -0
  337. package/dist/platform/xr-types.d.ts +262 -0
  338. package/dist/post/ao.d.ts +12 -0
  339. package/dist/post/ao.js +136 -0
  340. package/dist/post/blend.d.ts +27 -0
  341. package/dist/post/blend.js +129 -0
  342. package/dist/post/depth-pass.d.ts +43 -0
  343. package/dist/post/depth-pass.js +118 -0
  344. package/dist/post/dof.d.ts +1 -0
  345. package/dist/post/dof.js +66 -0
  346. package/dist/post/exposure.d.ts +80 -0
  347. package/dist/post/exposure.js +322 -0
  348. package/dist/post/index.d.ts +12 -0
  349. package/dist/post/index.js +11 -0
  350. package/dist/post/lens-dirt.d.ts +13 -0
  351. package/dist/post/lens-dirt.js +91 -0
  352. package/dist/post/lut.d.ts +19 -0
  353. package/dist/post/lut.js +50 -0
  354. package/dist/post/motion-blur.d.ts +9 -0
  355. package/dist/post/motion-blur.js +78 -0
  356. package/dist/post/post-stack.d.ts +302 -0
  357. package/dist/post/post-stack.js +1137 -0
  358. package/dist/post/settings.d.ts +485 -0
  359. package/dist/post/settings.js +416 -0
  360. package/dist/post/shaders.d.ts +25 -0
  361. package/dist/post/shaders.js +410 -0
  362. package/dist/post/ssr.d.ts +16 -0
  363. package/dist/post/ssr.js +155 -0
  364. package/dist/post/taa.d.ts +74 -0
  365. package/dist/post/taa.js +235 -0
  366. package/dist/post/white-balance.d.ts +25 -0
  367. package/dist/post/white-balance.js +98 -0
  368. package/dist/render/bindings.d.ts +98 -0
  369. package/dist/render/bindings.js +281 -0
  370. package/dist/render/blend.d.ts +13 -0
  371. package/dist/render/blend.js +26 -0
  372. package/dist/render/camera-2d.d.ts +72 -0
  373. package/dist/render/camera-2d.js +92 -0
  374. package/dist/render/camera.d.ts +302 -0
  375. package/dist/render/camera.js +671 -0
  376. package/dist/render/color.d.ts +16 -0
  377. package/dist/render/color.js +41 -0
  378. package/dist/render/compressed.d.ts +104 -0
  379. package/dist/render/compressed.js +248 -0
  380. package/dist/render/diagnostics.d.ts +15 -0
  381. package/dist/render/diagnostics.js +43 -0
  382. package/dist/render/dynamic-resolution.d.ts +70 -0
  383. package/dist/render/dynamic-resolution.js +126 -0
  384. package/dist/render/fake-gpu.d.ts +204 -0
  385. package/dist/render/fake-gpu.js +426 -0
  386. package/dist/render/flipbook.d.ts +56 -0
  387. package/dist/render/flipbook.js +87 -0
  388. package/dist/render/frame.d.ts +278 -0
  389. package/dist/render/frame.js +174 -0
  390. package/dist/render/fullscreen.d.ts +54 -0
  391. package/dist/render/fullscreen.js +91 -0
  392. package/dist/render/gpu-timer.d.ts +73 -0
  393. package/dist/render/gpu-timer.js +186 -0
  394. package/dist/render/index.d.ts +53 -0
  395. package/dist/render/index.js +29 -0
  396. package/dist/render/instance-list.d.ts +185 -0
  397. package/dist/render/instance-list.js +547 -0
  398. package/dist/render/lights.d.ts +181 -0
  399. package/dist/render/lights.js +233 -0
  400. package/dist/render/lod.d.ts +54 -0
  401. package/dist/render/lod.js +52 -0
  402. package/dist/render/material.d.ts +165 -0
  403. package/dist/render/material.js +292 -0
  404. package/dist/render/mesh.d.ts +284 -0
  405. package/dist/render/mesh.js +472 -0
  406. package/dist/render/mipmap.d.ts +16 -0
  407. package/dist/render/mipmap.js +121 -0
  408. package/dist/render/parallax.d.ts +50 -0
  409. package/dist/render/parallax.js +47 -0
  410. package/dist/render/pbr-wgsl.d.ts +31 -0
  411. package/dist/render/pbr-wgsl.js +119 -0
  412. package/dist/render/ping-pong.d.ts +42 -0
  413. package/dist/render/ping-pong.js +74 -0
  414. package/dist/render/renderer.d.ts +741 -0
  415. package/dist/render/renderer.js +2486 -0
  416. package/dist/render/scene-pipelines.d.ts +44 -0
  417. package/dist/render/scene-pipelines.js +92 -0
  418. package/dist/render/scene-target.d.ts +170 -0
  419. package/dist/render/scene-target.js +450 -0
  420. package/dist/render/shadow.d.ts +74 -0
  421. package/dist/render/shadow.js +208 -0
  422. package/dist/render/skin.d.ts +112 -0
  423. package/dist/render/skin.js +240 -0
  424. package/dist/render/snapshot.d.ts +36 -0
  425. package/dist/render/snapshot.js +34 -0
  426. package/dist/render/standard.d.ts +162 -0
  427. package/dist/render/standard.js +263 -0
  428. package/dist/render/texture.d.ts +142 -0
  429. package/dist/render/texture.js +228 -0
  430. package/dist/render/tile-layer.d.ts +110 -0
  431. package/dist/render/tile-layer.js +304 -0
  432. package/dist/render/transform.d.ts +115 -0
  433. package/dist/render/transform.js +318 -0
  434. package/dist/render/wgsl.d.ts +131 -0
  435. package/dist/render/wgsl.js +528 -0
  436. package/dist/save/codec.d.ts +49 -0
  437. package/dist/save/codec.js +169 -0
  438. package/dist/save/index.d.ts +8 -0
  439. package/dist/save/index.js +8 -0
  440. package/dist/save/journal.d.ts +24 -0
  441. package/dist/save/journal.js +102 -0
  442. package/dist/save/migrate.d.ts +15 -0
  443. package/dist/save/migrate.js +37 -0
  444. package/dist/save/schema.d.ts +72 -0
  445. package/dist/save/schema.js +154 -0
  446. package/dist/save/settings.d.ts +28 -0
  447. package/dist/save/settings.js +59 -0
  448. package/dist/save/slots.d.ts +56 -0
  449. package/dist/save/slots.js +200 -0
  450. package/dist/save/storage.d.ts +35 -0
  451. package/dist/save/storage.js +62 -0
  452. package/dist/save/store.d.ts +114 -0
  453. package/dist/save/store.js +269 -0
  454. package/dist/testing/fake-host.d.ts +103 -0
  455. package/dist/testing/fake-host.js +163 -0
  456. package/dist/testing/fixed-clock.d.ts +25 -0
  457. package/dist/testing/fixed-clock.js +30 -0
  458. package/dist/testing/index.d.ts +4 -0
  459. package/dist/testing/index.js +5 -0
  460. package/dist/testing/test-game.d.ts +76 -0
  461. package/dist/testing/test-game.js +92 -0
  462. package/dist/tween/ease.d.ts +77 -0
  463. package/dist/tween/ease.js +192 -0
  464. package/dist/tween/index.d.ts +8 -0
  465. package/dist/tween/index.js +7 -0
  466. package/dist/tween/timeline.d.ts +78 -0
  467. package/dist/tween/timeline.js +269 -0
  468. package/dist/tween/tween.d.ts +168 -0
  469. package/dist/tween/tween.js +320 -0
  470. package/dist/ui/anchor.d.ts +206 -0
  471. package/dist/ui/anchor.js +307 -0
  472. package/dist/ui/caption.d.ts +122 -0
  473. package/dist/ui/caption.js +286 -0
  474. package/dist/ui/cursor.d.ts +105 -0
  475. package/dist/ui/cursor.js +261 -0
  476. package/dist/ui/dom.d.ts +30 -0
  477. package/dist/ui/dom.js +92 -0
  478. package/dist/ui/floats.d.ts +86 -0
  479. package/dist/ui/floats.js +260 -0
  480. package/dist/ui/hud.d.ts +198 -0
  481. package/dist/ui/hud.js +431 -0
  482. package/dist/ui/index.d.ts +37 -0
  483. package/dist/ui/index.js +34 -0
  484. package/dist/ui/inventory-card.d.ts +52 -0
  485. package/dist/ui/inventory-card.js +173 -0
  486. package/dist/ui/inventory-context.d.ts +29 -0
  487. package/dist/ui/inventory-context.js +125 -0
  488. package/dist/ui/inventory-drag.d.ts +63 -0
  489. package/dist/ui/inventory-drag.js +394 -0
  490. package/dist/ui/inventory-grid.d.ts +66 -0
  491. package/dist/ui/inventory-grid.js +625 -0
  492. package/dist/ui/inventory-radial.d.ts +39 -0
  493. package/dist/ui/inventory-radial.js +168 -0
  494. package/dist/ui/inventory.d.ts +128 -0
  495. package/dist/ui/inventory.js +154 -0
  496. package/dist/ui/layout.d.ts +356 -0
  497. package/dist/ui/layout.js +856 -0
  498. package/dist/ui/link.d.ts +64 -0
  499. package/dist/ui/link.js +155 -0
  500. package/dist/ui/loading.d.ts +40 -0
  501. package/dist/ui/loading.js +157 -0
  502. package/dist/ui/loupe.d.ts +74 -0
  503. package/dist/ui/loupe.js +164 -0
  504. package/dist/ui/menu-nav.d.ts +33 -0
  505. package/dist/ui/menu-nav.js +28 -0
  506. package/dist/ui/minimap-canvas.d.ts +145 -0
  507. package/dist/ui/minimap-canvas.js +460 -0
  508. package/dist/ui/notify.d.ts +40 -0
  509. package/dist/ui/notify.js +141 -0
  510. package/dist/ui/orb.d.ts +53 -0
  511. package/dist/ui/orb.js +304 -0
  512. package/dist/ui/overlay.d.ts +213 -0
  513. package/dist/ui/overlay.js +394 -0
  514. package/dist/ui/padnav.d.ts +53 -0
  515. package/dist/ui/padnav.js +146 -0
  516. package/dist/ui/perf.d.ts +130 -0
  517. package/dist/ui/perf.js +329 -0
  518. package/dist/ui/rotate-card.d.ts +54 -0
  519. package/dist/ui/rotate-card.js +97 -0
  520. package/dist/ui/stack.d.ts +128 -0
  521. package/dist/ui/stack.js +312 -0
  522. package/dist/ui/styles.d.ts +13 -0
  523. package/dist/ui/styles.js +200 -0
  524. package/dist/ui/text-scale.d.ts +67 -0
  525. package/dist/ui/text-scale.js +102 -0
  526. package/dist/ui/theme.d.ts +70 -0
  527. package/dist/ui/theme.js +98 -0
  528. package/dist/ui/toast.d.ts +23 -0
  529. package/dist/ui/toast.js +46 -0
  530. package/dist/ui/tooltip.d.ts +89 -0
  531. package/dist/ui/tooltip.js +333 -0
  532. package/dist/ui/widgets-2.d.ts +134 -0
  533. package/dist/ui/widgets-2.js +399 -0
  534. package/dist/ui/widgets-3.d.ts +91 -0
  535. package/dist/ui/widgets-3.js +212 -0
  536. package/dist/ui/widgets.d.ts +34 -0
  537. package/dist/ui/widgets.js +50 -0
  538. package/dist/ui/world-panel/index.d.ts +5 -0
  539. package/dist/ui/world-panel/index.js +5 -0
  540. package/dist/ui/world-panel/layout.d.ts +38 -0
  541. package/dist/ui/world-panel/layout.js +68 -0
  542. package/dist/ui/world-panel/paint.d.ts +96 -0
  543. package/dist/ui/world-panel/paint.js +136 -0
  544. package/dist/ui/world-panel/panel.d.ts +235 -0
  545. package/dist/ui/world-panel/panel.js +762 -0
  546. package/dist/ui/world-panel/wgsl.d.ts +10 -0
  547. package/dist/ui/world-panel/wgsl.js +52 -0
  548. package/dist/ui/world-panel/widgets.d.ts +207 -0
  549. package/dist/ui/world-panel/widgets.js +569 -0
  550. package/dist/voxel/chunks.d.ts +77 -0
  551. package/dist/voxel/chunks.js +149 -0
  552. package/dist/voxel/grid.d.ts +84 -0
  553. package/dist/voxel/grid.js +223 -0
  554. package/dist/voxel/index.d.ts +22 -0
  555. package/dist/voxel/index.js +7 -0
  556. package/dist/voxel/mesher-worker.d.ts +14 -0
  557. package/dist/voxel/mesher-worker.js +47 -0
  558. package/dist/voxel/mesher.d.ts +73 -0
  559. package/dist/voxel/mesher.js +306 -0
  560. package/dist/voxel/ray.d.ts +32 -0
  561. package/dist/voxel/ray.js +73 -0
  562. package/dist/voxel/wgsl.d.ts +16 -0
  563. package/dist/voxel/wgsl.js +28 -0
  564. package/dist/voxel/worker-client.d.ts +79 -0
  565. package/dist/voxel/worker-client.js +122 -0
  566. package/package.json +177 -3
package/dist/ui/hud.js ADDED
@@ -0,0 +1,431 @@
1
+ /**
2
+ * HUD widgets for a first- or third-person game (ws/ui-hud): a reticle at the centre of the
3
+ * frame, a meter, a strip of slots and a sliding heading indicator. Built on the overlay's
4
+ * layers, regions and theme tokens; noun-free (a meter is a meter, a strip is a strip).
5
+ *
6
+ * Lengths are **theme px**: `n` theme px is `n * var(--tc-space-1) / 4`, which is `n` design px
7
+ * of the frame on the `hud` layer, `n` CSS px in a region in `frame` units and `n / 2` CSS px in
8
+ * `css` units (phones), the same way the theme's own sizes follow `ui.units`.
9
+ *
10
+ * The reticle lives in `layers.hud` and hides itself while a modal panel is open (the layer is
11
+ * also `inert` then). Meters, slots and the heading go through `ui.layout` like other widgets,
12
+ * so they follow the regions and the modal rule the layout already applies.
13
+ */
14
+ import { h } from './dom.js';
15
+ import { createOrbMeter, meterClock, meterPlace, meterReducedMotion, readoutText, rearmTrail, TrailClock, trailTimings, } from './orb.js';
16
+ /** `n` theme px (see the module comment). */
17
+ export function themePx(n) {
18
+ return `calc(${n} * var(--tc-space-1) / 4)`;
19
+ }
20
+ const STYLE_ID = 'tc-ui-hud';
21
+ /**
22
+ * The HUD stylesheet, under `.tc-overlay` and in `--tc-*` tokens only. Injected once per document
23
+ * by the first HUD widget (`ensureHudStyles`), next to the overlay's base sheet.
24
+ */
25
+ export const HUD_CSS = `
26
+ .tc-overlay .tc-reticle { position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%);
27
+ width: var(--tc-reticle-size); height: var(--tc-reticle-size); color: var(--tc-reticle-color, var(--tc-color-text));
28
+ pointer-events: none; filter: drop-shadow(0 0 1px rgba(0, 0, 0, 0.7)); }
29
+ .tc-overlay .tc-reticle[hidden], .tc-overlay .tc-reticle[data-modal] { display: none; }
30
+ .tc-overlay .tc-reticle::before, .tc-overlay .tc-reticle::after { content: ''; position: absolute; background: currentColor; }
31
+ .tc-overlay .tc-reticle[data-style="dot"]::before { inset: 25%; border-radius: 50%; }
32
+ .tc-overlay .tc-reticle[data-style="dot"]::after { display: none; }
33
+ .tc-overlay .tc-reticle[data-style="circle"]::before { inset: 0; border-radius: 50%; background: none;
34
+ border: var(--tc-reticle-stroke) solid currentColor; }
35
+ .tc-overlay .tc-reticle[data-style="circle"]::after { left: 50%; top: 50%; width: var(--tc-reticle-stroke); height: var(--tc-reticle-stroke);
36
+ transform: translate(-50%, -50%); border-radius: 50%; }
37
+ .tc-overlay .tc-reticle[data-style="cross"]::before { left: 0; right: 0; top: 50%; height: var(--tc-reticle-stroke); transform: translateY(-50%);
38
+ -webkit-mask: linear-gradient(90deg, #000 calc(50% - var(--tc-reticle-gap) / 2), transparent calc(50% - var(--tc-reticle-gap) / 2), transparent calc(50% + var(--tc-reticle-gap) / 2), #000 calc(50% + var(--tc-reticle-gap) / 2));
39
+ mask: linear-gradient(90deg, #000 calc(50% - var(--tc-reticle-gap) / 2), transparent calc(50% - var(--tc-reticle-gap) / 2), transparent calc(50% + var(--tc-reticle-gap) / 2), #000 calc(50% + var(--tc-reticle-gap) / 2)); }
40
+ .tc-overlay .tc-reticle[data-style="cross"]::after { top: 0; bottom: 0; left: 50%; width: var(--tc-reticle-stroke); transform: translateX(-50%);
41
+ -webkit-mask: linear-gradient(180deg, #000 calc(50% - var(--tc-reticle-gap) / 2), transparent calc(50% - var(--tc-reticle-gap) / 2), transparent calc(50% + var(--tc-reticle-gap) / 2), #000 calc(50% + var(--tc-reticle-gap) / 2));
42
+ mask: linear-gradient(180deg, #000 calc(50% - var(--tc-reticle-gap) / 2), transparent calc(50% - var(--tc-reticle-gap) / 2), transparent calc(50% + var(--tc-reticle-gap) / 2), #000 calc(50% + var(--tc-reticle-gap) / 2)); }
43
+ .tc-overlay .tc-reticle.tc-reticle-pulse { animation: tc-reticle-pulse var(--tc-duration-normal) var(--tc-easing); }
44
+ @keyframes tc-reticle-pulse { 50% { transform: translate(-50%, -50%) scale(1.5); color: var(--tc-color-accent); } }
45
+
46
+ .tc-overlay .tc-meter { display: flex; flex-direction: column; gap: var(--tc-space-1); width: var(--tc-meter-width, ${themePx(240)});
47
+ font-family: var(--tc-font-ui); font-size: var(--tc-font-size-s); color: var(--tc-color-text); pointer-events: none; }
48
+ .tc-overlay .tc-meter-label { display: flex; justify-content: space-between; gap: var(--tc-space-2); line-height: 1.2;
49
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); }
50
+ .tc-overlay .tc-meter-label:empty { display: none; }
51
+ .tc-overlay .tc-meter-track { position: relative; height: var(--tc-space-3); overflow: hidden; border-radius: var(--tc-radius-s);
52
+ background: var(--tc-color-surface); border: var(--tc-border-width) solid var(--tc-color-border); }
53
+ .tc-overlay .tc-meter-fill { position: absolute; inset: 0; transform-origin: left center; transform: scaleX(var(--tc-meter-value, 1));
54
+ background: var(--tc-color-accent); transition: transform var(--tc-duration-fast) var(--tc-easing); }
55
+ .tc-overlay .tc-meter[data-tone="info"] .tc-meter-fill { background: var(--tc-color-info); }
56
+ .tc-overlay .tc-meter[data-tone="success"] .tc-meter-fill { background: var(--tc-color-success); }
57
+ .tc-overlay .tc-meter[data-tone="warn"] .tc-meter-fill { background: var(--tc-color-warn); }
58
+ .tc-overlay .tc-meter[data-tone="danger"] .tc-meter-fill { background: var(--tc-color-danger); }
59
+ .tc-overlay .tc-meter-trail { position: absolute; inset: 0; transform-origin: left center; transform: scaleX(var(--tc-meter-trail, 1));
60
+ background: var(--tc-color-meter-trail); transition: transform var(--tc-meter-trail-duration, 600ms) linear var(--tc-meter-trail-delay, 400ms); }
61
+ .tc-overlay .tc-meter[data-color] .tc-meter-fill { background: var(--tc-meter-color); }
62
+ .tc-overlay .tc-meter[data-reduced] .tc-meter-fill { transition: none; }
63
+ @media (prefers-reduced-motion: reduce) { .tc-overlay .tc-meter-trail { display: none; } }
64
+
65
+ .tc-overlay .tc-slots { display: flex; gap: var(--tc-space-2); pointer-events: none; font-family: var(--tc-font-ui); }
66
+ .tc-overlay .tc-slot { position: relative; display: grid; place-items: center; width: var(--tc-slot-size, ${themePx(72)}); height: var(--tc-slot-size, ${themePx(72)});
67
+ border-radius: var(--tc-radius-m); background: var(--tc-color-surface); border: var(--tc-border-width) solid var(--tc-color-border);
68
+ color: var(--tc-color-text); font-size: var(--tc-font-size-s); overflow: hidden;
69
+ transition: border-color var(--tc-duration-fast), transform var(--tc-duration-fast), box-shadow var(--tc-duration-fast); }
70
+ .tc-overlay .tc-slot[data-selected] { border-color: var(--tc-color-accent); box-shadow: 0 0 0 var(--tc-focus-ring) var(--tc-color-accent);
71
+ transform: translateY(calc(-1 * var(--tc-space-1))); }
72
+ .tc-overlay .tc-slot-content { display: grid; place-items: center; width: 100%; height: 100%; text-align: center; line-height: 1.1; }
73
+ .tc-overlay .tc-slot-content > canvas, .tc-overlay .tc-slot-content > img { max-width: 100%; max-height: 100%; }
74
+ .tc-overlay .tc-slot-hint { position: absolute; left: var(--tc-space-1); top: var(--tc-space-1); padding: 0 var(--tc-space-1);
75
+ border-radius: var(--tc-radius-s); background: var(--tc-color-surface-alt); color: var(--tc-color-text-muted);
76
+ font-size: calc(var(--tc-font-size-s) * 0.7); line-height: 1.4; }
77
+ .tc-overlay .tc-slot-hint:empty { display: none; }
78
+
79
+ .tc-overlay .tc-heading { position: relative; width: var(--tc-heading-width, ${themePx(480)}); height: var(--tc-space-6); overflow: hidden;
80
+ pointer-events: none; font-family: var(--tc-font-ui); font-size: var(--tc-font-size-s); color: var(--tc-color-text);
81
+ -webkit-mask: linear-gradient(90deg, transparent, #000 15%, #000 85%, transparent);
82
+ mask: linear-gradient(90deg, transparent, #000 15%, #000 85%, transparent); text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); }
83
+ .tc-overlay .tc-heading-strip { position: absolute; left: 0; top: 0; height: 100%; will-change: transform; }
84
+ .tc-overlay .tc-heading-tick { position: absolute; bottom: 0; width: var(--tc-border-width); height: var(--tc-space-2);
85
+ background: var(--tc-color-text-muted); transform: translateX(-50%); }
86
+ .tc-overlay .tc-heading-tick[data-major] { height: var(--tc-space-3); background: var(--tc-color-text); }
87
+ .tc-overlay .tc-heading-label { position: absolute; top: 0; transform: translateX(-50%); line-height: 1.2; font-weight: 600; letter-spacing: 0.08em; }
88
+ .tc-overlay .tc-heading-mark { position: absolute; left: 50%; top: 0; bottom: 0; width: var(--tc-border-width); transform: translateX(-50%);
89
+ background: var(--tc-color-accent); }
90
+ `;
91
+ /** Add the HUD stylesheet to `doc` once. */
92
+ export function ensureHudStyles(doc) {
93
+ if (doc.getElementById(STYLE_ID))
94
+ return;
95
+ const style = doc.createElement('style');
96
+ style.id = STYLE_ID;
97
+ style.textContent = HUD_CSS;
98
+ doc.head.appendChild(style);
99
+ }
100
+ const PULSE_CLASS = 'tc-reticle-pulse';
101
+ const PULSE_FALLBACK_MS = 400;
102
+ /** A reticle centred on the frame, on the `hud` layer; hidden while a modal panel is open. */
103
+ export function createReticle(host, opts = {}) {
104
+ const doc = host.layers.hud.ownerDocument;
105
+ ensureHudStyles(doc);
106
+ const size = opts.size ?? 24;
107
+ const el = h('div', {
108
+ class: 'tc-reticle',
109
+ 'aria-hidden': 'true',
110
+ dataset: { style: opts.style ?? 'dot' },
111
+ style: {
112
+ '--tc-reticle-size': themePx(size),
113
+ '--tc-reticle-gap': themePx(opts.gap ?? 6),
114
+ '--tc-reticle-stroke': themePx(Math.max(2, Math.round(size / 12))),
115
+ ...(opts.color ? { '--tc-reticle-color': opts.color } : {}),
116
+ },
117
+ });
118
+ host.layers.hud.append(el);
119
+ const modal = () => el.toggleAttribute('data-modal', host.stack.hasModal);
120
+ modal();
121
+ const unwatch = host.stack.onChange(modal);
122
+ let pulseTimer = null;
123
+ const endPulse = () => {
124
+ if (pulseTimer)
125
+ clearTimeout(pulseTimer);
126
+ pulseTimer = null;
127
+ el.classList.remove(PULSE_CLASS);
128
+ };
129
+ el.addEventListener('animationend', endPulse);
130
+ return {
131
+ el,
132
+ get visible() {
133
+ return !el.hidden;
134
+ },
135
+ get style() {
136
+ return el.dataset.style;
137
+ },
138
+ show() {
139
+ el.hidden = false;
140
+ },
141
+ hide() {
142
+ el.hidden = true;
143
+ },
144
+ pulse() {
145
+ // Restart: drop the class, reflow, add it again.
146
+ endPulse();
147
+ void el.offsetWidth;
148
+ el.classList.add(PULSE_CLASS);
149
+ // Reduced motion (or a test DOM) fires no animationend: time it out.
150
+ pulseTimer = setTimeout(endPulse, PULSE_FALLBACK_MS);
151
+ },
152
+ setStyle(style) {
153
+ el.dataset.style = style;
154
+ },
155
+ remove() {
156
+ endPulse();
157
+ unwatch();
158
+ el.remove();
159
+ },
160
+ };
161
+ }
162
+ /** A labelled bar with `role="meter"`, in a layout region. */
163
+ export function createMeter(host, opts = {}) {
164
+ if (opts.shape === 'orb')
165
+ return createOrbMeter(host, opts);
166
+ ensureHudStyles(host.layers.hud.ownerDocument);
167
+ let max = opts.max ?? 1;
168
+ let value = Math.min(max, Math.max(0, opts.value ?? max));
169
+ const reduced = opts.trail || opts.reducedMotion ? meterReducedMotion(host, opts) : false;
170
+ const timings = trailTimings(opts, reduced);
171
+ const clock = timings ? new TrailClock(timings.delay, timings.duration, meterClock(opts)) : null;
172
+ const label = h('span', null, opts.label ?? '');
173
+ const readout = h('span', { class: 'tc-meter-readout' });
174
+ const fill = h('div', { class: 'tc-meter-fill' });
175
+ const trailEl = clock ? h('div', { class: 'tc-meter-trail' }) : null;
176
+ const style = {};
177
+ if (opts.width !== undefined)
178
+ style['--tc-meter-width'] = themePx(opts.width);
179
+ if (opts.color)
180
+ style['--tc-meter-color'] = opts.color;
181
+ if (timings) {
182
+ style['--tc-meter-trail-delay'] = `${timings.delay}ms`;
183
+ style['--tc-meter-trail-duration'] = `${timings.duration}ms`;
184
+ }
185
+ const el = h('div', {
186
+ class: 'tc-meter',
187
+ role: 'meter',
188
+ 'aria-label': opts.label,
189
+ 'aria-valuemin': '0',
190
+ dataset: {
191
+ tone: opts.tone ?? 'accent',
192
+ ...(reduced ? { reduced: '' } : {}),
193
+ ...(opts.color ? { color: '' } : {}),
194
+ },
195
+ style: Object.keys(style).length > 0 ? style : undefined,
196
+ }, h('div', { class: 'tc-meter-label' }, label, readout), h('div', { class: 'tc-meter-track' }, trailEl, fill));
197
+ const frac = () => (max > 0 ? value / max : 0);
198
+ /** The band's timings were rewritten by a re-arm after a move (ws/ui-11). */
199
+ let rearmed = false;
200
+ if (clock && trailEl) {
201
+ clock.reset(frac());
202
+ trailEl.style.setProperty('--tc-meter-trail', String(frac()));
203
+ }
204
+ const write = () => {
205
+ el.setAttribute('aria-valuenow', String(value));
206
+ el.setAttribute('aria-valuemax', String(max));
207
+ fill.style.setProperty('--tc-meter-value', String(frac()));
208
+ if (opts.format) {
209
+ const text = opts.format(value, max);
210
+ el.setAttribute('aria-valuetext', text);
211
+ readout.textContent = text;
212
+ }
213
+ else if (opts.readout && opts.readout !== 'none') {
214
+ const text = readoutText(opts.readout, value, max);
215
+ if (opts.readout === 'percent')
216
+ el.setAttribute('aria-valuetext', text);
217
+ readout.textContent = text;
218
+ }
219
+ if (clock && trailEl && timings) {
220
+ if (rearmed) {
221
+ rearmed = false;
222
+ el.style.setProperty('--tc-meter-trail-delay', `${timings.delay}ms`);
223
+ el.style.setProperty('--tc-meter-trail-duration', `${timings.duration}ms`);
224
+ }
225
+ clock.retarget(frac());
226
+ trailEl.style.setProperty('--tc-meter-trail', String(frac()));
227
+ }
228
+ };
229
+ write();
230
+ const handle = host.layout.add(el, {
231
+ place: meterPlace(opts.place, opts.region),
232
+ order: opts.order,
233
+ // A move cancels the band's transition: run the rest of it from where the model is.
234
+ onMove: () => {
235
+ if (clock && trailEl && rearmTrail(clock, trailEl, 'meter', trailEl, el))
236
+ rearmed = true;
237
+ },
238
+ });
239
+ return {
240
+ el,
241
+ shape: 'bar',
242
+ get value() {
243
+ return value;
244
+ },
245
+ get max() {
246
+ return max;
247
+ },
248
+ get trail() {
249
+ return clock ? Math.max(value, clock.at() * max) : value;
250
+ },
251
+ size: undefined,
252
+ get region() {
253
+ return handle.region;
254
+ },
255
+ set(v, m) {
256
+ if (m !== undefined)
257
+ max = Math.max(0, m);
258
+ const next = Math.min(max, Math.max(0, v));
259
+ if (next === value && m === undefined)
260
+ return;
261
+ value = next;
262
+ write();
263
+ },
264
+ setTone(tone) {
265
+ el.dataset.tone = tone;
266
+ },
267
+ setColor(color) {
268
+ if (color)
269
+ el.style.setProperty('--tc-meter-color', color);
270
+ else
271
+ el.style.removeProperty('--tc-meter-color');
272
+ el.toggleAttribute('data-color', !!color);
273
+ },
274
+ setSize() { },
275
+ setPlace(place) {
276
+ handle.setPlace(meterPlace(place, undefined));
277
+ },
278
+ remove() {
279
+ handle.remove();
280
+ el.remove();
281
+ },
282
+ };
283
+ }
284
+ /** A strip of equal slots with key-hint badges and one selected highlight. */
285
+ export function createSlots(host, opts) {
286
+ ensureHudStyles(host.layers.hud.ownerDocument);
287
+ const count = Math.max(0, Math.floor(opts.count));
288
+ const items = [];
289
+ const contents = [];
290
+ const hints = [];
291
+ for (let i = 0; i < count; i++) {
292
+ const hint = h('span', { class: 'tc-slot-hint', 'aria-hidden': 'true' }, opts.hints?.[i] ?? '');
293
+ const content = h('div', { class: 'tc-slot-content' });
294
+ const item = h('div', { class: 'tc-slot', role: 'option', 'aria-selected': 'false', dataset: { index: String(i) } }, hint, content);
295
+ items.push(item);
296
+ contents.push(content);
297
+ hints.push(hint);
298
+ }
299
+ const el = h('div', {
300
+ class: 'tc-slots',
301
+ role: 'listbox',
302
+ 'aria-label': opts.label ?? 'Slots',
303
+ style: opts.size !== undefined ? { '--tc-slot-size': themePx(opts.size) } : undefined,
304
+ }, ...items);
305
+ let selected = -1;
306
+ const wrap = (i) => (count === 0 ? -1 : ((Math.trunc(i) % count) + count) % count);
307
+ const select = (i) => {
308
+ const next = wrap(i);
309
+ if (next === selected)
310
+ return;
311
+ const prev = items[selected];
312
+ if (prev) {
313
+ prev.removeAttribute('data-selected');
314
+ prev.setAttribute('aria-selected', 'false');
315
+ }
316
+ selected = next;
317
+ const cur = items[selected];
318
+ if (cur) {
319
+ cur.setAttribute('data-selected', '');
320
+ cur.setAttribute('aria-selected', 'true');
321
+ }
322
+ };
323
+ select(opts.selected ?? 0);
324
+ const handle = host.layout.add(el, {
325
+ place: { default: opts.region ?? 'bottom' },
326
+ order: opts.order,
327
+ });
328
+ return {
329
+ el,
330
+ count,
331
+ get selected() {
332
+ return selected;
333
+ },
334
+ select,
335
+ setContent(i, content) {
336
+ const c = contents[i];
337
+ if (!c)
338
+ return;
339
+ if (content === '')
340
+ c.replaceChildren();
341
+ else
342
+ c.replaceChildren(content);
343
+ },
344
+ setHint(i, hint) {
345
+ const hEl = hints[i];
346
+ if (hEl)
347
+ hEl.textContent = hint;
348
+ },
349
+ remove() {
350
+ handle.remove();
351
+ el.remove();
352
+ },
353
+ };
354
+ }
355
+ /** Degrees in `[0, 360)`. */
356
+ export function wrapDegrees(deg) {
357
+ const d = deg % 360;
358
+ return d < 0 ? d + 360 : d;
359
+ }
360
+ /** The strip offset (theme px) for a yaw, given the visible width and span. */
361
+ export function headingOffset(yawRadians, width, span) {
362
+ const deg = wrapDegrees((yawRadians * 180) / Math.PI);
363
+ return width / 2 - deg * (width / span);
364
+ }
365
+ /**
366
+ * A sliding cardinal strip: the four labels and ticks at every `tickEvery` degrees, drawn over
367
+ * two turns (−180° to 540°) so the strip never jumps at north. The centre mark shows the yaw.
368
+ */
369
+ export function createHeading(host, opts = {}) {
370
+ ensureHudStyles(host.layers.hud.ownerDocument);
371
+ const width = opts.width ?? 480;
372
+ const span = opts.span ?? 90;
373
+ const tickEvery = opts.tickEvery ?? 15;
374
+ const labels = opts.labels ?? ['N', 'E', 'S', 'W'];
375
+ const ppd = width / span;
376
+ const strip = h('div', { class: 'tc-heading-strip', 'aria-hidden': 'true' });
377
+ for (let deg = -180; deg <= 540; deg += tickEvery) {
378
+ const major = deg % 90 === 0;
379
+ strip.append(h('span', {
380
+ class: 'tc-heading-tick',
381
+ 'data-major': major,
382
+ style: { left: themePx(deg * ppd) },
383
+ }));
384
+ if (major) {
385
+ const label = labels[wrapDegrees(deg) / 90] ?? '';
386
+ strip.append(h('span', { class: 'tc-heading-label', style: { left: themePx(deg * ppd) } }, label));
387
+ }
388
+ }
389
+ const el = h('div', {
390
+ class: 'tc-heading',
391
+ role: 'img',
392
+ 'aria-label': 'Heading',
393
+ style: { '--tc-heading-width': themePx(width) },
394
+ }, strip, h('span', { class: 'tc-heading-mark', 'aria-hidden': 'true' }));
395
+ let yaw = Number.NaN;
396
+ let offset = Number.NaN;
397
+ let lastDeg = -1;
398
+ const setYaw = (radians) => {
399
+ yaw = radians;
400
+ const next = headingOffset(radians, width, span);
401
+ if (next === offset)
402
+ return;
403
+ offset = next;
404
+ strip.style.transform = `translate3d(${themePx(offset)}, 0, 0)`;
405
+ const deg = Math.round(wrapDegrees((radians * 180) / Math.PI));
406
+ if (deg !== lastDeg) {
407
+ lastDeg = deg;
408
+ el.setAttribute('aria-label', `Heading ${deg}°`);
409
+ }
410
+ };
411
+ setYaw(0);
412
+ const handle = host.layout.add(el, {
413
+ place: { default: opts.region ?? 'top' },
414
+ order: opts.order,
415
+ });
416
+ return {
417
+ el,
418
+ strip,
419
+ get yaw() {
420
+ return yaw;
421
+ },
422
+ get offset() {
423
+ return offset;
424
+ },
425
+ setYaw,
426
+ remove() {
427
+ handle.remove();
428
+ el.remove();
429
+ },
430
+ };
431
+ }
@@ -0,0 +1,37 @@
1
+ export type { AnchorFrame } from './anchor.js';
2
+ export { type AnchorCamera, type AnchorHandle, type AnchorOptions, type AnchorRect, type AnchorSurface, Anchors, type AnchorsOptions, } from './anchor.js';
3
+ export { CaptionCard, type CaptionOptions, type Corner, cornerOrder, overlapArea, type ReadingTimeOptions, readingTimeMs, revealDelayMs, type SayOptions, } from './caption.js';
4
+ export { type CursorHost, type CursorOptions, type CursorRepeat, createCursor, ensureCursorStyles, pickTarget, type WorldCursor, type WorldTarget, } from './cursor.js';
5
+ export { append, type Child, focusableWithin, h } from './dom.js';
6
+ export { createFloats, ensureFloatsStyles, type Floats, type FloatsHost, type FloatsOptions, type FloatTextOptions, } from './floats.js';
7
+ export { createHeading, createMeter, createReticle, createSlots, ensureHudStyles, type Heading, type HeadingOptions, type HudHost, headingOffset, type Meter, type MeterOptions, type MeterReadout, type MeterShape, type MeterTone, type MeterTrailOptions, type Reticle, type ReticleOptions, type ReticleStyle, type Slots, type SlotsOptions, themePx, wrapDegrees, } from './hud.js';
8
+ export { type CellItem, type CellRef, type DragLink, type DragPick, type DropSpot, type DropTarget, defaultInventoryLabels, ensureInventoryStyles, type GridCell, type InventoryHost, type InventoryLabels, iconNode, } from './inventory.js';
9
+ export { type Card, type CardOptions, type CardPlacement, type CardRow, type CardSide, card, placeCard, } from './inventory-card.js';
10
+ export { type ContextItem, type ContextList, type ContextListOptions, contextList, } from './inventory-context.js';
11
+ export { createDragContext, type DragContext, type DragContextOptions, type SlotsTarget, type SlotsTargetOptions, slotsTarget, } from './inventory-drag.js';
12
+ export { type Grid, type GridEntry, type GridOptions, grid, type PadAction, } from './inventory-grid.js';
13
+ export { type Radial, type RadialItem, type RadialOptions, radial } from './inventory-radial.js';
14
+ export { type BarName, type BarSize, type ClassifyInput, classifyFormFactor, defaultForms, effectiveInsets, FORM_FACTORS, type FormFactor, type FormSize, type FormSizes, type FormSpec, type FreePlacement, followSafeArea, formSize, formSpec, type Insets, type Layout, type LayoutHost, type LayoutOverflow, type LayoutSpec, type LayoutState, NO_INSETS, PHONE_MAX_SHORT_SIDE, PHONE_MAX_VIEW_SHORT, type Placement, parseAreas, placementFor, REGIONS, type RegionName, readSafeArea, resolveLayout, resolveTracks, type SafeAreaSource, type Track, type Units, type WidgetHandle, type WidgetOptions, } from './layout.js';
15
+ export { activateLink, type ExternalLink, type ExternalLinkLabels, type ExternalLinkOptions, externalLink, } from './link.js';
16
+ export { createLoading, ensureLoadingStyles, type LoadingHost, type LoadingOptions, type LoadingScreen, } from './loading.js';
17
+ export { Loupe, type LoupeOptions, type LoupeView, loupeLeader } from './loupe.js';
18
+ export { type MenuNavActions, type MenuNavInput, type MenuNavResult, menuNav, } from './menu-nav.js';
19
+ export { type CanvasMinimap, type CanvasMinimapHost, type CanvasMinimapOptions, createCanvasMinimap, ensureCanvasMinimapStyles, type MinimapBackground, type MinimapKindStyle, type MinimapMarker, type MinimapMarkerPlace, type MinimapMarkerShape, type MinimapRotate, type MinimapShape, type MinimapWorld, } from './minimap-canvas.js';
20
+ export { createNotifier, ensureNotifyStyles, type Notification, type Notifier, type NotifyAction, type NotifyOptions, type NotifyTone, } from './notify.js';
21
+ export { createOrbMeter, ensureOrbStyles } from './orb.js';
22
+ export { CONTROL_ID_ATTR, CONTROL_PAGE_ATTR, controlId, createOverlay, type Overlay, type OverlayOptions, type Rect, } from './overlay.js';
23
+ export { defaultPads, type PadControl, type PadDir, type PadLike, PadNav, type PadNavOptions, readPad, } from './padnav.js';
24
+ export { createPerfMonitor, createPerfOverlay, type PerfCorner, type PerfFrameStats, type PerfGpuStats, type PerfMonitor, type PerfMonitorOptions, type PerfOverlay, type PerfOverlayOptions, type PerfSample, type PerfSource, } from './perf.js';
25
+ export { createRotateCard, type RotateCard, type RotateCardColors, type RotateCardOptions, } from './rotate-card.js';
26
+ export type { ArrowNav, PadOwner } from './stack.js';
27
+ export { type CloseReason, NO_RESTORE_FOCUS_ATTR, type PanelHandle, type PanelOptions, PanelStack, type PanelStackFocusOptions, } from './stack.js';
28
+ export { ensureStyles, prefersReducedMotionIn } from './styles.js';
29
+ export { applyTextScale, CSS_FONT_PX, DESIGN_FONT_PX, scaledPx, scaleFontSizes, scalePxCss, TEXT_MIN_VAR, TEXT_SCALE_VAR, textScaleTokens, toFrameUnits, UNIT_VAR, } from './text-scale.js';
30
+ export { applyTheme, cssPxTheme, cssVar, defaultTheme, type ThemeOverrides, type ThemeTokens, themeToCss, tokenVar, } from './theme.js';
31
+ export { Toaster, type ToastHandle, type ToastOptions, type ToastTone } from './toast.js';
32
+ export { createTooltips, ensureTooltipStyles, placeTooltip, type Tooltip, type TooltipHost, type TooltipOptions, type TooltipPlace, type TooltipPlacement, type TooltipSide, type Tooltips, type TooltipTarget, } from './tooltip.js';
33
+ export { type ButtonOptions, button, type SliderOptions, slider, toggle } from './widgets.js';
34
+ export { type Bar, type BarOptions, bar, type ChoiceOption, cooldown, ensureWidgets2Styles, type KeyPrompt, type KeyPromptOptions, keyPrompt, reticle, type Segmented, type Select, type Stepper, type StepperOptions, segmented, select, stepper, type WidgetCooldown, type WidgetCooldownOptions, type WidgetReticle, type WidgetReticleOptions, type WidgetTone, } from './widgets-2.js';
35
+ export { bearingOffset, type Compass, type CompassMarker, type CompassOptions, createCompass, createRing, ensureWidgets3Styles, type Ring, type RingOptions, type Widgets3Host, } from './widgets-3.js';
36
+ export type { WorldPanelInput } from './world-panel/index.js';
37
+ export { createWorldPanel, type FlowItem, type FlowOptions, flowLayout, makePanelCanvas, Painter, type PanelCanvas, type PanelContext2D, type PanelKeyEvent, type PanelRect, type PanelTheme, resolvePanelTheme, WorldButton, type WorldButtonOptions, WorldLabel, type WorldLabelOptions, WorldList, type WorldListOptions, WorldPanel, type WorldPanelHit, type WorldPanelOptions, type WorldPanelStats, WorldProgress, type WorldProgressOptions, WorldSlider, type WorldSliderOptions, WorldToggle, type WorldToggleOptions, WorldWidget, type WorldWidgetAlign, type WorldWidgetHost, type WorldWidgetSize, type WorldWidgetTone, worldButton, worldLabel, worldList, worldPanelTarget, worldProgress, worldSlider, worldToggle, } from './world-panel/index.js';
@@ -0,0 +1,34 @@
1
+ export { Anchors, } from './anchor.js';
2
+ export { CaptionCard, cornerOrder, overlapArea, readingTimeMs, revealDelayMs, } from './caption.js';
3
+ export { createCursor, ensureCursorStyles, pickTarget, } from './cursor.js';
4
+ export { append, focusableWithin, h } from './dom.js';
5
+ export { createFloats, ensureFloatsStyles, } from './floats.js';
6
+ export { createHeading, createMeter, createReticle, createSlots, ensureHudStyles, headingOffset, themePx, wrapDegrees, } from './hud.js';
7
+ export { defaultInventoryLabels, ensureInventoryStyles, iconNode, } from './inventory.js';
8
+ export { card, placeCard, } from './inventory-card.js';
9
+ export { contextList, } from './inventory-context.js';
10
+ export { createDragContext, slotsTarget, } from './inventory-drag.js';
11
+ export { grid, } from './inventory-grid.js';
12
+ export { radial } from './inventory-radial.js';
13
+ export { classifyFormFactor, defaultForms, effectiveInsets, FORM_FACTORS, followSafeArea, formSize, formSpec, NO_INSETS, PHONE_MAX_SHORT_SIDE, PHONE_MAX_VIEW_SHORT, parseAreas, placementFor, REGIONS, readSafeArea, resolveLayout, resolveTracks, } from './layout.js';
14
+ export { activateLink, externalLink, } from './link.js';
15
+ export { createLoading, ensureLoadingStyles, } from './loading.js';
16
+ export { Loupe, loupeLeader } from './loupe.js';
17
+ export { menuNav, } from './menu-nav.js';
18
+ export { createCanvasMinimap, ensureCanvasMinimapStyles, } from './minimap-canvas.js';
19
+ export { createNotifier, ensureNotifyStyles, } from './notify.js';
20
+ export { createOrbMeter, ensureOrbStyles } from './orb.js';
21
+ export { CONTROL_ID_ATTR, CONTROL_PAGE_ATTR, controlId, createOverlay, } from './overlay.js';
22
+ export { defaultPads, PadNav, readPad, } from './padnav.js';
23
+ export { createPerfMonitor, createPerfOverlay, } from './perf.js';
24
+ export { createRotateCard, } from './rotate-card.js';
25
+ export { NO_RESTORE_FOCUS_ATTR, PanelStack, } from './stack.js';
26
+ export { ensureStyles, prefersReducedMotionIn } from './styles.js';
27
+ export { applyTextScale, CSS_FONT_PX, DESIGN_FONT_PX, scaledPx, scaleFontSizes, scalePxCss, TEXT_MIN_VAR, TEXT_SCALE_VAR, textScaleTokens, toFrameUnits, UNIT_VAR, } from './text-scale.js';
28
+ export { applyTheme, cssPxTheme, cssVar, defaultTheme, themeToCss, tokenVar, } from './theme.js';
29
+ export { Toaster } from './toast.js';
30
+ export { createTooltips, ensureTooltipStyles, placeTooltip, } from './tooltip.js';
31
+ export { button, slider, toggle } from './widgets.js';
32
+ export { bar, cooldown, ensureWidgets2Styles, keyPrompt, reticle, segmented, select, stepper, } from './widgets-2.js';
33
+ export { bearingOffset, createCompass, createRing, ensureWidgets3Styles, } from './widgets-3.js';
34
+ export { createWorldPanel, flowLayout, makePanelCanvas, Painter, resolvePanelTheme, WorldButton, WorldLabel, WorldList, WorldPanel, WorldProgress, WorldSlider, WorldToggle, WorldWidget, worldButton, worldLabel, worldList, worldPanelTarget, worldProgress, worldSlider, worldToggle, } from './world-panel/index.js';
@@ -0,0 +1,52 @@
1
+ import { type InventoryHost } from './inventory.js';
2
+ import type { Rect } from './overlay.js';
3
+ import type { WidgetTone } from './widgets-2.js';
4
+ export interface CardRow {
5
+ label: string;
6
+ value: string;
7
+ tone?: WidgetTone;
8
+ /** An arrow after the value: better, worse or the same as what the player has. */
9
+ compare?: 'up' | 'down' | 'same';
10
+ }
11
+ export interface CardOptions {
12
+ title: string;
13
+ subtitle?: string;
14
+ tone?: WidgetTone;
15
+ rows: CardRow[];
16
+ footer?: string;
17
+ /** Width, theme px. Default 280. */
18
+ width?: number;
19
+ }
20
+ export type CardPlacement = 'auto' | 'right' | 'left' | 'above' | 'below';
21
+ export type CardSide = Exclude<CardPlacement, 'auto'>;
22
+ export interface Card {
23
+ readonly element: HTMLElement;
24
+ /** Rewrite the content (DOM writes only where a field changed). */
25
+ set(opts: CardOptions): void;
26
+ /**
27
+ * Show beside `anchor` (an element, or a rect in the host's `hud`-layer CSS px), placed by
28
+ * `placeCard`. An element anchor gets `aria-describedby` while the card is visible.
29
+ */
30
+ show(anchor: HTMLElement | Rect, placement?: CardPlacement): void;
31
+ hide(): void;
32
+ readonly visible: boolean;
33
+ /** Where it landed last (`placeCard`'s choice), or null while hidden. */
34
+ readonly placement: CardSide | null;
35
+ remove(): void;
36
+ }
37
+ /**
38
+ * Where a card of `size` goes beside `anchor` inside `frame` (all in the same units). `auto`
39
+ * tries right, left, below, above and takes the first that fits, else the side with the most
40
+ * room; a named side flips to its opposite when it does not fit and the opposite does. The
41
+ * result is clamped into the frame on both axes. `gap` separates card and anchor.
42
+ */
43
+ export declare function placeCard(anchor: Rect, size: {
44
+ width: number;
45
+ height: number;
46
+ }, frame: Rect, placement?: CardPlacement, gap?: number): {
47
+ x: number;
48
+ y: number;
49
+ placement: CardSide;
50
+ };
51
+ /** An item card on the host's `hud` layer. See the module comment. */
52
+ export declare function card(host: InventoryHost, opts: CardOptions): Card;