@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
@@ -0,0 +1,168 @@
1
+ /**
2
+ * The radial menu (ws/ui-inventory): four to eight sectors on a ring on the `hud` layer, centred
3
+ * where it is opened (the frame's centre by default). `aim(x, y)` from a stick or a drag picks the
4
+ * sector (nothing inside the dead zone), `pick()` fires `onPick`; the keyboard rotates the
5
+ * highlight with the arrows, Enter picks, Escape cancels. `role="menu"` of `menuitem`s; hidden
6
+ * under a modal like the reticle (`data-modal` from `stack.onChange`).
7
+ *
8
+ * Sector 0 is east and the sectors go clockwise (screen y down): `aim(1, 0)` highlights sector 0
9
+ * and `aim(0, 1)` the one a quarter turn on.
10
+ */
11
+ import { h } from './dom.js';
12
+ import { themePx } from './hud.js';
13
+ import { ensureInventoryStyles, iconNode } from './inventory.js';
14
+ /** A radial menu on the host's `hud` layer. See the module comment. */
15
+ export function radial(host, opts) {
16
+ const layer = host.layers.hud;
17
+ const doc = layer.ownerDocument;
18
+ ensureInventoryStyles(doc);
19
+ const items = opts.items.slice(0, 8);
20
+ const n = Math.max(1, items.length);
21
+ const step = 360 / n;
22
+ const deadzone = opts.deadzone ?? 0.35;
23
+ const buttons = items.map((it, i) => h('button', {
24
+ type: 'button',
25
+ class: 'tc-radial-item',
26
+ role: 'menuitem',
27
+ tabindex: '-1',
28
+ 'aria-label': it.label,
29
+ 'aria-disabled': it.disabled ? 'true' : undefined,
30
+ dataset: { index: String(i), id: it.id },
31
+ style: { '--tc-radial-angle': `${i * step}deg` },
32
+ }, iconNode(it.icon, doc)));
33
+ const sector = h('div', { class: 'tc-radial-sector' });
34
+ const label = h('div', { class: 'tc-radial-label', 'aria-live': 'polite' });
35
+ const element = h('div', {
36
+ class: 'tc-radial',
37
+ role: 'menu',
38
+ tabindex: '-1',
39
+ 'aria-label': opts.label ?? 'Radial menu',
40
+ hidden: true,
41
+ style: {
42
+ '--tc-radial-radius': themePx(opts.radius ?? 110),
43
+ '--tc-radial-sweep': `${step}deg`,
44
+ },
45
+ }, h('div', { class: 'tc-radial-ring' }), sector, ...buttons, label);
46
+ layer.append(element);
47
+ let highlighted = -1;
48
+ let opener = null;
49
+ function highlight(i) {
50
+ if (i === highlighted)
51
+ return;
52
+ if (highlighted >= 0)
53
+ buttons[highlighted]?.removeAttribute('data-active');
54
+ highlighted = i;
55
+ if (i >= 0) {
56
+ buttons[i].setAttribute('data-active', '');
57
+ element.setAttribute('data-active', '');
58
+ // The sector is centred on the item: conic gradients start at 12 o'clock, so east is +90°.
59
+ element.style.setProperty('--tc-radial-from', `${90 + i * step - step / 2}deg`);
60
+ label.textContent = items[i].label;
61
+ }
62
+ else {
63
+ element.removeAttribute('data-active');
64
+ label.textContent = '';
65
+ }
66
+ }
67
+ function aim(x, y) {
68
+ if (Math.hypot(x, y) < deadzone) {
69
+ highlight(-1);
70
+ return;
71
+ }
72
+ const deg = ((Math.atan2(y, x) * 180) / Math.PI + 360) % 360;
73
+ highlight(Math.round(deg / step) % n);
74
+ }
75
+ function pick() {
76
+ if (highlighted < 0 || items[highlighted]?.disabled)
77
+ return false;
78
+ const id = items[highlighted].id;
79
+ close();
80
+ opts.onPick(id);
81
+ return true;
82
+ }
83
+ function open(at) {
84
+ if (at) {
85
+ const r = layer.getBoundingClientRect();
86
+ element.style.left = `${at.x - r.left}px`;
87
+ element.style.top = `${at.y - r.top}px`;
88
+ }
89
+ else {
90
+ element.style.removeProperty('left');
91
+ element.style.removeProperty('top');
92
+ }
93
+ if (!element.hidden)
94
+ return;
95
+ opener = doc.activeElement;
96
+ element.hidden = false;
97
+ highlight(-1);
98
+ element.focus({ preventScroll: true });
99
+ }
100
+ function close() {
101
+ if (element.hidden)
102
+ return;
103
+ element.hidden = true;
104
+ highlight(-1);
105
+ if (opener?.isConnected && doc.activeElement === element)
106
+ opener.focus({ preventScroll: true });
107
+ opener = null;
108
+ }
109
+ element.addEventListener('keydown', (e) => {
110
+ switch (e.key) {
111
+ case 'ArrowRight':
112
+ case 'ArrowDown':
113
+ highlight(highlighted < 0 ? 0 : (highlighted + 1) % n);
114
+ break;
115
+ case 'ArrowLeft':
116
+ case 'ArrowUp':
117
+ highlight(highlighted < 0 ? n - 1 : (highlighted - 1 + n) % n);
118
+ break;
119
+ case 'Enter':
120
+ case ' ':
121
+ pick();
122
+ break;
123
+ case 'Escape':
124
+ close();
125
+ opts.onCancel?.();
126
+ break;
127
+ default:
128
+ return;
129
+ }
130
+ e.preventDefault();
131
+ e.stopPropagation();
132
+ });
133
+ element.addEventListener('pointermove', (e) => {
134
+ const r = element.getBoundingClientRect();
135
+ const rad = r.width / 2;
136
+ if (rad <= 0)
137
+ return;
138
+ aim((e.clientX - r.left - rad) / rad, (e.clientY - r.top - rad) / rad);
139
+ });
140
+ element.addEventListener('click', (e) => {
141
+ const b = e.target.closest('.tc-radial-item');
142
+ if (!b)
143
+ return;
144
+ highlight(Number(b.dataset.index));
145
+ pick();
146
+ });
147
+ const offStack = host.stack?.onChange((s) => element.toggleAttribute('data-modal', s.hasModal));
148
+ if (host.stack?.hasModal)
149
+ element.setAttribute('data-modal', '');
150
+ return {
151
+ element,
152
+ open,
153
+ close,
154
+ aim,
155
+ get highlighted() {
156
+ return highlighted;
157
+ },
158
+ pick,
159
+ get visible() {
160
+ return !element.hidden && !element.hasAttribute('data-modal');
161
+ },
162
+ remove() {
163
+ close();
164
+ offStack?.();
165
+ element.remove();
166
+ },
167
+ };
168
+ }
@@ -0,0 +1,128 @@
1
+ /**
2
+ * Inventory widgets (ws/ui-inventory): the shared types, the stylesheet and the contract between
3
+ * a drag context and what it drags over. The widgets themselves are `grid` (inventory-grid.ts),
4
+ * `createDragContext` and `slotsTarget` (inventory-drag.ts), `card` and `placeCard`
5
+ * (inventory-card.ts), `radial` (inventory-radial.ts) and `contextList` (inventory-context.ts).
6
+ *
7
+ * Noun-free: the game supplies the data (`CellItem`: an id, an icon, a count, a span) and the
8
+ * rules (`canDrop`); the engine draws, moves focus, animates and announces. Lengths are theme px
9
+ * (`themePx`, ui/hud.ts), so they follow `ui.units`; colours, radii, fonts and timings are the
10
+ * `--tc-*` tokens. `INVENTORY_CSS` is injected once per document by `createOverlay`
11
+ * (`ensureInventoryStyles`, `#tc-ui-inventory`).
12
+ */
13
+ import type { Grid } from './inventory-grid.js';
14
+ import type { PanelStack } from './stack.js';
15
+ import type { WidgetTone } from './widgets-2.js';
16
+ /** What the inventory factories need from the overlay (an `Overlay` fits). */
17
+ export interface InventoryHost {
18
+ readonly layers: {
19
+ hud: HTMLElement;
20
+ toasts?: HTMLElement;
21
+ };
22
+ /** Radials hide under a modal when the host has a stack. */
23
+ readonly stack?: PanelStack;
24
+ }
25
+ /** A cell address in a grid: column and row, 0-based. */
26
+ export interface GridCell {
27
+ col: number;
28
+ row: number;
29
+ }
30
+ /** A cell of a particular grid: what `canDrop` and `onMove` get for both ends of a move. */
31
+ export interface CellRef extends GridCell {
32
+ grid: Grid;
33
+ }
34
+ /** What a grid cell holds. The game's data; the engine never mutates it. */
35
+ export interface CellItem {
36
+ id: string;
37
+ /** Text (a glyph), or an element the cell adopts (an `<img>`, a canvas). */
38
+ icon: string | HTMLElement | HTMLCanvasElement;
39
+ /** Accessible name; default `id`. */
40
+ label?: string;
41
+ /** Stack size; a count over 1 shows the `.tc-cell-count` badge. */
42
+ count?: number;
43
+ /** Cells covered, anchor at the top-left. Default 1×1. */
44
+ span?: {
45
+ w: number;
46
+ h: number;
47
+ };
48
+ tone?: WidgetTone;
49
+ /** Cannot be picked up or dragged. */
50
+ locked?: boolean;
51
+ }
52
+ /** One place a drag can land: a grid cell or a slot. `el` carries `data-over` / `data-reject`. */
53
+ export interface DropSpot {
54
+ readonly el: HTMLElement;
55
+ readonly col: number;
56
+ readonly row: number;
57
+ }
58
+ /** An item in flight: what was picked up, where from, and the target it came from. */
59
+ export interface DragPick {
60
+ readonly item: CellItem;
61
+ readonly from: CellRef;
62
+ readonly source: DropTarget;
63
+ }
64
+ /**
65
+ * Something a drag context can drop onto (and, for grids, pick up from). `grid()` returns one;
66
+ * `slotsTarget()` adapts a `ui.slots` strip. A context sets `link` on `register`.
67
+ */
68
+ export interface DropTarget {
69
+ readonly element: HTMLElement;
70
+ /** The grid behind this target, when it is one (a drop into it is a move; into a strip, a copy). */
71
+ readonly grid?: Grid;
72
+ /** Set by the drag context on `register`, cleared on `unregister`. */
73
+ link: DragLink | null;
74
+ /** The spot under client coordinates, or null. Returns a stored object: no allocation. */
75
+ spotAt(clientX: number, clientY: number): DropSpot | null;
76
+ /** Every spot in reading order (the pad walk). */
77
+ spots(): readonly DropSpot[];
78
+ /** Whether `pick` may land on `spot` (the structural rule and the game's `canDrop`). */
79
+ canDrop(spot: DropSpot, pick: DragPick): boolean;
80
+ /** Land `pick` on `spot`: place it and tell the game (`onMove` / `onAssign`). */
81
+ drop(spot: DropSpot, pick: DragPick): void;
82
+ /** The source end of a move into another target: take the item out and tell the game. */
83
+ release?(pick: DragPick, to: CellRef): void;
84
+ /** Show `spot` as hovered (`data-over`, plus `data-reject` when rejected); null clears. */
85
+ hover(spot: DropSpot | null, reject: boolean): void;
86
+ /** What a pointer at client coordinates could pick up, or null (grids only). */
87
+ pickAt?(clientX: number, clientY: number): DragPick | null;
88
+ /** A held item walks in from `side` with the pad or the keyboard: take focus and show it. */
89
+ carryIn?(pick: DragPick, side: 'left' | 'right'): void;
90
+ /** The carry this target showed (as source or as the walked-into target) ended. */
91
+ carryEnd?(): void;
92
+ }
93
+ /** What a registered target can ask its drag context for. */
94
+ export interface DragLink {
95
+ /** A pointer went down on a pickable item: start a pointer drag (touch waits for the long-press). */
96
+ pointerStart(pick: DragPick, e: PointerEvent): void;
97
+ /** A keyboard or pad pick-up began in `pick.source`. */
98
+ carryStart(pick: DragPick): void;
99
+ /** The held item reached `from`'s edge: walk to the next target in reading order. True if it moved. */
100
+ cross(from: DropTarget, dir: 'left' | 'right', pick: DragPick): boolean;
101
+ /** Drop the held item on `spot` of `target`: both ends are told. False when rejected. */
102
+ commit(target: DropTarget, spot: DropSpot, pick: DragPick): boolean;
103
+ /** Cancel the held item (Escape, pad `back`). */
104
+ cancelCarry(): void;
105
+ /** True while a pointer drag runs, and through the click that ends it. */
106
+ pointerActive(): boolean;
107
+ }
108
+ /** How `aria-label`s and announcements are worded. Overridable per grid. */
109
+ export interface InventoryLabels {
110
+ /** `({ label, count }) => "Potion, 3"`. */
111
+ cell?: (label: string, count: number | undefined) => string;
112
+ empty?: string;
113
+ pickedUp?: (label: string) => string;
114
+ dropped?: (label: string) => string;
115
+ rejected?: (label: string) => string;
116
+ cancelled?: (label: string) => string;
117
+ }
118
+ export declare const defaultInventoryLabels: Required<InventoryLabels>;
119
+ /**
120
+ * The inventory stylesheet, under `.tc-overlay`, in `--tc-*` tokens only; the few px literals are
121
+ * design px (`toFrameUnits`). Sizes the game chooses (`cellSize`, `width`, `radius`) arrive as
122
+ * theme px in custom properties on the element.
123
+ */
124
+ export declare const INVENTORY_CSS: string;
125
+ /** Add `INVENTORY_CSS` to `doc` once (`createOverlay` calls it beside `ensureStyles`). */
126
+ export declare function ensureInventoryStyles(doc?: Document): void;
127
+ /** The icon of a `CellItem` (or a radial item) as a node the widget adopts; a string becomes a span. */
128
+ export declare function iconNode(icon: string | HTMLElement | HTMLCanvasElement, doc: Document): Node;
@@ -0,0 +1,154 @@
1
+ /**
2
+ * Inventory widgets (ws/ui-inventory): the shared types, the stylesheet and the contract between
3
+ * a drag context and what it drags over. The widgets themselves are `grid` (inventory-grid.ts),
4
+ * `createDragContext` and `slotsTarget` (inventory-drag.ts), `card` and `placeCard`
5
+ * (inventory-card.ts), `radial` (inventory-radial.ts) and `contextList` (inventory-context.ts).
6
+ *
7
+ * Noun-free: the game supplies the data (`CellItem`: an id, an icon, a count, a span) and the
8
+ * rules (`canDrop`); the engine draws, moves focus, animates and announces. Lengths are theme px
9
+ * (`themePx`, ui/hud.ts), so they follow `ui.units`; colours, radii, fonts and timings are the
10
+ * `--tc-*` tokens. `INVENTORY_CSS` is injected once per document by `createOverlay`
11
+ * (`ensureInventoryStyles`, `#tc-ui-inventory`).
12
+ */
13
+ import { toFrameUnits } from './text-scale.js';
14
+ export const defaultInventoryLabels = {
15
+ cell: (label, count) => (count !== undefined && count > 1 ? `${label}, ${count}` : label),
16
+ empty: 'Empty',
17
+ pickedUp: (label) => `Picked up ${label}`,
18
+ dropped: (label) => `Dropped ${label}`,
19
+ rejected: (label) => `Cannot drop ${label} there`,
20
+ cancelled: (label) => `Put back ${label}`,
21
+ };
22
+ const STYLE_ID = 'tc-ui-inventory';
23
+ /**
24
+ * The inventory stylesheet, under `.tc-overlay`, in `--tc-*` tokens only; the few px literals are
25
+ * design px (`toFrameUnits`). Sizes the game chooses (`cellSize`, `width`, `radius`) arrive as
26
+ * theme px in custom properties on the element.
27
+ */
28
+ export const INVENTORY_CSS = toFrameUnits(`
29
+ .tc-overlay .tc-grid { display: flex; flex-direction: column; gap: var(--tc-cell-gap); pointer-events: auto;
30
+ font-family: var(--tc-font-ui); color: var(--tc-color-text); outline: none; width: max-content; }
31
+ .tc-overlay .tc-grid-row { display: flex; gap: var(--tc-cell-gap); }
32
+ .tc-overlay .tc-cell { position: relative; width: var(--tc-cell-size); height: var(--tc-cell-size);
33
+ border-radius: var(--tc-radius-s); background: var(--tc-color-surface);
34
+ border: var(--tc-border-width) solid var(--tc-color-border); cursor: default; }
35
+ .tc-overlay .tc-cell:focus-visible { outline-offset: 1px; z-index: 2; }
36
+ .tc-overlay .tc-cell[data-covered] { background: var(--tc-color-surface-alt); border-style: dashed; }
37
+ .tc-overlay .tc-cell[data-over] { border-color: var(--tc-color-accent); box-shadow: 0 0 0 var(--tc-focus-ring) var(--tc-color-accent); z-index: 1; }
38
+ .tc-overlay .tc-cell[data-over][data-reject] { border-color: var(--tc-color-danger); box-shadow: 0 0 0 var(--tc-focus-ring) var(--tc-color-danger); }
39
+ .tc-overlay .tc-cell[aria-grabbed="true"] .tc-cell-item { opacity: 0.35; }
40
+ .tc-overlay .tc-cell-item { position: absolute; left: calc(-1 * var(--tc-border-width)); top: calc(-1 * var(--tc-border-width));
41
+ width: calc(var(--tc-span-w, 1) * var(--tc-cell-size) + (var(--tc-span-w, 1) - 1) * var(--tc-cell-gap));
42
+ height: calc(var(--tc-span-h, 1) * var(--tc-cell-size) + (var(--tc-span-h, 1) - 1) * var(--tc-cell-gap));
43
+ display: grid; place-items: center; border-radius: var(--tc-radius-s); z-index: 1; overflow: hidden;
44
+ border: var(--tc-border-width) solid var(--tc-cell-tone, transparent); font-size: var(--tc-font-size-l); line-height: 1; }
45
+ .tc-overlay .tc-cell-item[data-tone="accent"] { --tc-cell-tone: var(--tc-color-accent); }
46
+ .tc-overlay .tc-cell-item[data-tone="info"] { --tc-cell-tone: var(--tc-color-info); }
47
+ .tc-overlay .tc-cell-item[data-tone="success"] { --tc-cell-tone: var(--tc-color-success); }
48
+ .tc-overlay .tc-cell-item[data-tone="warn"] { --tc-cell-tone: var(--tc-color-warn); }
49
+ .tc-overlay .tc-cell-item[data-tone="danger"] { --tc-cell-tone: var(--tc-color-danger); }
50
+ .tc-overlay .tc-cell-item[data-locked]::after { content: ''; position: absolute; inset: 0; background: var(--tc-color-backdrop); }
51
+ .tc-overlay .tc-cell-item > canvas, .tc-overlay .tc-cell-item > img { max-width: 100%; max-height: 100%; }
52
+ .tc-overlay .tc-cell-count { position: absolute; right: var(--tc-space-1); bottom: var(--tc-space-1); padding: 0 var(--tc-space-1);
53
+ border-radius: var(--tc-radius-s); background: var(--tc-color-backdrop); color: var(--tc-color-text);
54
+ font-family: var(--tc-font-mono); font-size: var(--tc-font-size-s); line-height: 1.4; }
55
+
56
+ .tc-overlay .tc-drag-ghost { position: absolute; left: 0; top: 0; pointer-events: none; z-index: 10; opacity: 0.9;
57
+ will-change: transform; filter: drop-shadow(0 4px 8px rgba(0, 0, 0, 0.5)); }
58
+ .tc-overlay .tc-drag-ghost > .tc-cell-item { position: static; width: 100%; height: 100%; background: var(--tc-color-surface); }
59
+ .tc-overlay .tc-drag-ghost[data-return] { transition: transform var(--tc-duration-fast) var(--tc-easing); }
60
+ .tc-overlay .tc-slot[data-over] { border-color: var(--tc-color-accent); box-shadow: 0 0 0 var(--tc-focus-ring) var(--tc-color-accent); }
61
+ .tc-overlay .tc-slot[data-over][data-reject] { border-color: var(--tc-color-danger); box-shadow: 0 0 0 var(--tc-focus-ring) var(--tc-color-danger); }
62
+
63
+ .tc-overlay .tc-inv-card { position: absolute; left: 0; top: 0; width: var(--tc-inv-card-width); pointer-events: none; z-index: 20;
64
+ background: var(--tc-color-surface); color: var(--tc-color-text); border: var(--tc-border-width) solid var(--tc-color-border);
65
+ border-radius: var(--tc-radius-m); box-shadow: var(--tc-shadow); padding: var(--tc-space-3);
66
+ font-family: var(--tc-font-ui); font-size: var(--tc-font-size-s); line-height: 1.3; will-change: transform; }
67
+ .tc-overlay .tc-inv-card[hidden] { display: none; }
68
+ .tc-overlay .tc-inv-card[data-tone] { border-color: var(--tc-inv-card-tone); }
69
+ .tc-overlay .tc-inv-card[data-tone="accent"] { --tc-inv-card-tone: var(--tc-color-accent); }
70
+ .tc-overlay .tc-inv-card[data-tone="info"] { --tc-inv-card-tone: var(--tc-color-info); }
71
+ .tc-overlay .tc-inv-card[data-tone="success"] { --tc-inv-card-tone: var(--tc-color-success); }
72
+ .tc-overlay .tc-inv-card[data-tone="warn"] { --tc-inv-card-tone: var(--tc-color-warn); }
73
+ .tc-overlay .tc-inv-card[data-tone="danger"] { --tc-inv-card-tone: var(--tc-color-danger); }
74
+ .tc-overlay .tc-inv-card-title { font-family: var(--tc-font-display); font-size: var(--tc-font-size-m); font-weight: 600; color: var(--tc-inv-card-tone, var(--tc-color-text)); }
75
+ .tc-overlay .tc-inv-card-subtitle { opacity: 0.75; margin-bottom: var(--tc-space-2); }
76
+ .tc-overlay .tc-inv-card-subtitle:empty { display: none; }
77
+ .tc-overlay .tc-inv-card-rows { display: grid; grid-template-columns: 1fr auto; gap: var(--tc-space-1) var(--tc-space-3); margin: var(--tc-space-2) 0 0; }
78
+ .tc-overlay .tc-inv-card-rows:empty { display: none; }
79
+ .tc-overlay .tc-inv-card-rows > dt { opacity: 0.75; }
80
+ .tc-overlay .tc-inv-card-rows > dd { margin: 0; font-family: var(--tc-font-mono); text-align: right; display: flex; align-items: center; justify-content: flex-end; gap: var(--tc-space-1); }
81
+ .tc-overlay .tc-inv-card-rows > dd[data-tone="info"] { color: var(--tc-color-info); }
82
+ .tc-overlay .tc-inv-card-rows > dd[data-tone="success"] { color: var(--tc-color-success); }
83
+ .tc-overlay .tc-inv-card-rows > dd[data-tone="warn"] { color: var(--tc-color-warn); }
84
+ .tc-overlay .tc-inv-card-rows > dd[data-tone="danger"] { color: var(--tc-color-danger); }
85
+ .tc-overlay .tc-inv-card-rows > dd[data-tone="accent"] { color: var(--tc-color-accent); }
86
+ .tc-overlay .tc-inv-card-rows > dd[data-compare]::after { content: ''; display: inline-block; width: 0; height: 0;
87
+ border-left: 5px solid transparent; border-right: 5px solid transparent; }
88
+ .tc-overlay .tc-inv-card-rows > dd[data-compare="up"]::after { border-bottom: 7px solid var(--tc-color-success); }
89
+ .tc-overlay .tc-inv-card-rows > dd[data-compare="down"]::after { border-top: 7px solid var(--tc-color-danger); }
90
+ .tc-overlay .tc-inv-card-rows > dd[data-compare="same"]::after { width: 10px; height: 2px; border: 0; background: currentColor; opacity: 0.6; }
91
+ .tc-overlay .tc-inv-card-footer { margin-top: var(--tc-space-2); padding-top: var(--tc-space-2); border-top: var(--tc-border-width) solid var(--tc-color-border); opacity: 0.85; }
92
+ .tc-overlay .tc-inv-card-footer:empty { display: none; }
93
+
94
+ .tc-overlay .tc-radial { position: absolute; left: 50%; top: 50%; width: calc(2 * var(--tc-radial-radius)); height: calc(2 * var(--tc-radial-radius));
95
+ margin: calc(-1 * var(--tc-radial-radius)); pointer-events: auto; outline: none; font-family: var(--tc-font-ui); color: var(--tc-color-text);
96
+ --tc-radial-item: calc(var(--tc-radial-radius) * 0.6); }
97
+ .tc-overlay .tc-radial[hidden], .tc-overlay .tc-radial[data-modal] { display: none; }
98
+ .tc-overlay .tc-radial-ring { position: absolute; inset: 0; border-radius: 50%; background: var(--tc-color-surface); opacity: 0.85;
99
+ border: var(--tc-border-width) solid var(--tc-color-border);
100
+ -webkit-mask: radial-gradient(circle, transparent calc(var(--tc-radial-radius) * 0.38), #000 calc(var(--tc-radial-radius) * 0.38 + 1px));
101
+ mask: radial-gradient(circle, transparent calc(var(--tc-radial-radius) * 0.38), #000 calc(var(--tc-radial-radius) * 0.38 + 1px)); }
102
+ .tc-overlay .tc-radial-sector { position: absolute; inset: 0; border-radius: 50%; opacity: 0;
103
+ background: conic-gradient(from var(--tc-radial-from, 0deg), var(--tc-color-accent) var(--tc-radial-sweep, 90deg), transparent 0);
104
+ -webkit-mask: radial-gradient(circle, transparent calc(var(--tc-radial-radius) * 0.38), #000 calc(var(--tc-radial-radius) * 0.38 + 1px));
105
+ mask: radial-gradient(circle, transparent calc(var(--tc-radial-radius) * 0.38), #000 calc(var(--tc-radial-radius) * 0.38 + 1px));
106
+ transition: opacity var(--tc-duration-fast); }
107
+ .tc-overlay .tc-radial[data-active] .tc-radial-sector { opacity: 0.35; }
108
+ .tc-overlay .tc-radial-item { position: absolute; left: 50%; top: 50%; width: var(--tc-radial-item); height: var(--tc-radial-item);
109
+ margin: calc(-1 * var(--tc-radial-item) / 2); display: grid; place-items: center; padding: 0; cursor: pointer;
110
+ border-radius: 50%; background: var(--tc-color-surface-alt); border: var(--tc-border-width) solid var(--tc-color-border);
111
+ color: var(--tc-color-text); font: inherit; font-size: var(--tc-font-size-l); line-height: 1;
112
+ transform: rotate(var(--tc-radial-angle)) translate(calc(var(--tc-radial-radius) * 0.69)) rotate(calc(-1 * var(--tc-radial-angle)));
113
+ transition: border-color var(--tc-duration-fast), background var(--tc-duration-fast); }
114
+ .tc-overlay .tc-radial-item[data-active] { border-color: var(--tc-color-accent); background: var(--tc-color-surface); }
115
+ .tc-overlay .tc-radial-item[aria-disabled="true"] { opacity: 0.4; cursor: default; }
116
+ .tc-overlay .tc-radial-item > canvas, .tc-overlay .tc-radial-item > img { max-width: 70%; max-height: 70%; }
117
+ .tc-overlay .tc-radial-label { position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); width: calc(var(--tc-radial-radius) * 0.7);
118
+ text-align: center; font-size: var(--tc-font-size-s); pointer-events: none; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); }
119
+
120
+ .tc-overlay .tc-context { position: absolute; left: 0; top: 0; min-width: var(--tc-context-width, ${themePxCss(180)}); pointer-events: auto; z-index: 30;
121
+ display: flex; flex-direction: column; padding: var(--tc-space-1); background: var(--tc-color-surface); color: var(--tc-color-text);
122
+ border: var(--tc-border-width) solid var(--tc-color-border); border-radius: var(--tc-radius-m); box-shadow: var(--tc-shadow);
123
+ font-family: var(--tc-font-ui); font-size: var(--tc-font-size-s); outline: none; }
124
+ .tc-overlay .tc-context-item { display: flex; justify-content: space-between; gap: var(--tc-space-3); align-items: center; text-align: left;
125
+ padding: var(--tc-space-2) var(--tc-space-3); border: 0; border-radius: var(--tc-radius-s); background: none; color: inherit; font: inherit;
126
+ cursor: pointer; min-height: var(--tc-tap-min, 0); }
127
+ .tc-overlay .tc-context-item:hover, .tc-overlay .tc-context-item:focus-visible { background: var(--tc-color-surface-alt); outline-offset: -2px; }
128
+ .tc-overlay .tc-context-item[aria-disabled="true"] { opacity: 0.45; cursor: default; }
129
+ .tc-overlay .tc-context-item[data-danger] { color: var(--tc-color-danger); }
130
+ .tc-overlay .tc-context-hint { opacity: 0.6; font-family: var(--tc-font-mono); }
131
+ `);
132
+ /** `n` theme px as CSS (the same formula as `themePx` in ui/hud.ts; repeated so this sheet has no runtime import from it). */
133
+ function themePxCss(n) {
134
+ return `calc(${n} * var(--tc-space-1) / 4)`;
135
+ }
136
+ /** Add `INVENTORY_CSS` to `doc` once (`createOverlay` calls it beside `ensureStyles`). */
137
+ export function ensureInventoryStyles(doc = document) {
138
+ if (doc.getElementById(STYLE_ID))
139
+ return;
140
+ const style = doc.createElement('style');
141
+ style.id = STYLE_ID;
142
+ style.textContent = INVENTORY_CSS;
143
+ doc.head.appendChild(style);
144
+ }
145
+ /** The icon of a `CellItem` (or a radial item) as a node the widget adopts; a string becomes a span. */
146
+ export function iconNode(icon, doc) {
147
+ if (typeof icon === 'string') {
148
+ const span = doc.createElement('span');
149
+ span.className = 'tc-inv-icon';
150
+ span.textContent = icon;
151
+ return span;
152
+ }
153
+ return icon;
154
+ }