@cavegiant/cave-world-r3f 1.0.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 (339) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/LICENSE +21 -0
  3. package/README.md +189 -0
  4. package/dist/core/connector-label/readiness.d.ts +11 -0
  5. package/dist/core/connector-label/readiness.d.ts.map +1 -0
  6. package/dist/core/connector-label/readiness.js +31 -0
  7. package/dist/core/connector-label/readiness.js.map +1 -0
  8. package/dist/core/connector-label/types.d.ts +64 -0
  9. package/dist/core/connector-label/types.d.ts.map +1 -0
  10. package/dist/core/connector-label/types.js +47 -0
  11. package/dist/core/connector-label/types.js.map +1 -0
  12. package/dist/core/context/cave-world-context.d.ts +96 -0
  13. package/dist/core/context/cave-world-context.d.ts.map +1 -0
  14. package/dist/core/context/cave-world-context.js +100 -0
  15. package/dist/core/context/cave-world-context.js.map +1 -0
  16. package/dist/core/errors.d.ts +34 -0
  17. package/dist/core/errors.d.ts.map +1 -0
  18. package/dist/core/errors.js +17 -0
  19. package/dist/core/errors.js.map +1 -0
  20. package/dist/core/events/event-bus.d.ts +122 -0
  21. package/dist/core/events/event-bus.d.ts.map +1 -0
  22. package/dist/core/events/event-bus.js +62 -0
  23. package/dist/core/events/event-bus.js.map +1 -0
  24. package/dist/core/hooks/use-cave-event.d.ts +13 -0
  25. package/dist/core/hooks/use-cave-event.d.ts.map +1 -0
  26. package/dist/core/hooks/use-cave-event.js +12 -0
  27. package/dist/core/hooks/use-cave-event.js.map +1 -0
  28. package/dist/core/i18n/messages.d.ts +82 -0
  29. package/dist/core/i18n/messages.d.ts.map +1 -0
  30. package/dist/core/i18n/messages.js +131 -0
  31. package/dist/core/i18n/messages.js.map +1 -0
  32. package/dist/core/index.d.ts +11 -0
  33. package/dist/core/index.d.ts.map +1 -0
  34. package/dist/core/index.js +47 -0
  35. package/dist/core/index.js.map +1 -0
  36. package/dist/core/logging/logger.d.ts +29 -0
  37. package/dist/core/logging/logger.d.ts.map +1 -0
  38. package/dist/core/logging/logger.js +47 -0
  39. package/dist/core/logging/logger.js.map +1 -0
  40. package/dist/core/registry/component-registry.d.ts +41 -0
  41. package/dist/core/registry/component-registry.d.ts.map +1 -0
  42. package/dist/core/registry/component-registry.js +34 -0
  43. package/dist/core/registry/component-registry.js.map +1 -0
  44. package/dist/core/registry/object-registry.d.ts +38 -0
  45. package/dist/core/registry/object-registry.d.ts.map +1 -0
  46. package/dist/core/registry/object-registry.js +32 -0
  47. package/dist/core/registry/object-registry.js.map +1 -0
  48. package/dist/explore/cave-explore.d.ts +85 -0
  49. package/dist/explore/cave-explore.d.ts.map +1 -0
  50. package/dist/explore/cave-explore.js +204 -0
  51. package/dist/explore/cave-explore.js.map +1 -0
  52. package/dist/explore/cave-orbit-viewer.d.ts +76 -0
  53. package/dist/explore/cave-orbit-viewer.d.ts.map +1 -0
  54. package/dist/explore/cave-orbit-viewer.js +123 -0
  55. package/dist/explore/cave-orbit-viewer.js.map +1 -0
  56. package/dist/explore/characters/character-configs.d.ts +38 -0
  57. package/dist/explore/characters/character-configs.d.ts.map +1 -0
  58. package/dist/explore/characters/character-configs.js +45 -0
  59. package/dist/explore/characters/character-configs.js.map +1 -0
  60. package/dist/explore/characters/character-controls.d.ts +44 -0
  61. package/dist/explore/characters/character-controls.d.ts.map +1 -0
  62. package/dist/explore/characters/character-pose.d.ts +19 -0
  63. package/dist/explore/characters/character-pose.d.ts.map +1 -0
  64. package/dist/explore/characters/character-pose.js +13 -0
  65. package/dist/explore/characters/character-pose.js.map +1 -0
  66. package/dist/explore/characters/local-character-model.d.ts +53 -0
  67. package/dist/explore/characters/local-character-model.d.ts.map +1 -0
  68. package/dist/explore/characters/local-character-model.js +36 -0
  69. package/dist/explore/characters/local-character-model.js.map +1 -0
  70. package/dist/explore/characters/mixamo-style-bone-map.d.ts +9 -0
  71. package/dist/explore/characters/mixamo-style-bone-map.d.ts.map +1 -0
  72. package/dist/explore/characters/mixamo-style-bone-map.js +28 -0
  73. package/dist/explore/characters/mixamo-style-bone-map.js.map +1 -0
  74. package/dist/explore/characters/remote-character-controller.d.ts +38 -0
  75. package/dist/explore/characters/remote-character-controller.d.ts.map +1 -0
  76. package/dist/explore/characters/remote-character-controller.js +135 -0
  77. package/dist/explore/characters/remote-character-controller.js.map +1 -0
  78. package/dist/explore/characters/remote-character.d.ts +19 -0
  79. package/dist/explore/characters/remote-character.d.ts.map +1 -0
  80. package/dist/explore/characters/remote-character.js +63 -0
  81. package/dist/explore/characters/remote-character.js.map +1 -0
  82. package/dist/explore/connected-spaces-renderer.d.ts +16 -0
  83. package/dist/explore/connected-spaces-renderer.d.ts.map +1 -0
  84. package/dist/explore/connected-spaces-renderer.js +103 -0
  85. package/dist/explore/connected-spaces-renderer.js.map +1 -0
  86. package/dist/explore/hooks/use-action-shortcuts.d.ts +16 -0
  87. package/dist/explore/hooks/use-action-shortcuts.d.ts.map +1 -0
  88. package/dist/explore/hooks/use-action-shortcuts.js +23 -0
  89. package/dist/explore/hooks/use-action-shortcuts.js.map +1 -0
  90. package/dist/explore/hooks/use-active-space-notify.d.ts +11 -0
  91. package/dist/explore/hooks/use-active-space-notify.d.ts.map +1 -0
  92. package/dist/explore/hooks/use-active-space-notify.js +17 -0
  93. package/dist/explore/hooks/use-active-space-notify.js.map +1 -0
  94. package/dist/explore/hooks/use-character-sync.d.ts +46 -0
  95. package/dist/explore/hooks/use-character-sync.d.ts.map +1 -0
  96. package/dist/explore/hooks/use-character-sync.js +72 -0
  97. package/dist/explore/hooks/use-character-sync.js.map +1 -0
  98. package/dist/explore/hooks/use-connector-preloader.d.ts +20 -0
  99. package/dist/explore/hooks/use-connector-preloader.d.ts.map +1 -0
  100. package/dist/explore/hooks/use-connector-preloader.js +78 -0
  101. package/dist/explore/hooks/use-connector-preloader.js.map +1 -0
  102. package/dist/explore/hooks/use-connector-transitions.d.ts +31 -0
  103. package/dist/explore/hooks/use-connector-transitions.d.ts.map +1 -0
  104. package/dist/explore/hooks/use-connector-transitions.js +63 -0
  105. package/dist/explore/hooks/use-connector-transitions.js.map +1 -0
  106. package/dist/explore/hooks/use-explore-actions.d.ts +17 -0
  107. package/dist/explore/hooks/use-explore-actions.d.ts.map +1 -0
  108. package/dist/explore/hooks/use-explore-actions.js +134 -0
  109. package/dist/explore/hooks/use-explore-actions.js.map +1 -0
  110. package/dist/explore/hooks/use-load-error-notify.d.ts +11 -0
  111. package/dist/explore/hooks/use-load-error-notify.d.ts.map +1 -0
  112. package/dist/explore/hooks/use-load-error-notify.js +18 -0
  113. package/dist/explore/hooks/use-load-error-notify.js.map +1 -0
  114. package/dist/explore/hooks/use-primary-space-loader.d.ts +24 -0
  115. package/dist/explore/hooks/use-primary-space-loader.d.ts.map +1 -0
  116. package/dist/explore/hooks/use-primary-space-loader.js +29 -0
  117. package/dist/explore/hooks/use-primary-space-loader.js.map +1 -0
  118. package/dist/explore/index.d.ts +37 -0
  119. package/dist/explore/index.d.ts.map +1 -0
  120. package/dist/explore/index.js +107 -0
  121. package/dist/explore/index.js.map +1 -0
  122. package/dist/explore/loaders/cave-loader.d.ts +58 -0
  123. package/dist/explore/loaders/cave-loader.d.ts.map +1 -0
  124. package/dist/explore/loaders/cave-loader.js +79 -0
  125. package/dist/explore/loaders/cave-loader.js.map +1 -0
  126. package/dist/explore/math/space-transforms.d.ts +49 -0
  127. package/dist/explore/math/space-transforms.d.ts.map +1 -0
  128. package/dist/explore/math/space-transforms.js +54 -0
  129. package/dist/explore/math/space-transforms.js.map +1 -0
  130. package/dist/explore/overlays/action-bubble.d.ts +8 -0
  131. package/dist/explore/overlays/action-bubble.d.ts.map +1 -0
  132. package/dist/explore/overlays/action-bubble.js +18 -0
  133. package/dist/explore/overlays/action-bubble.js.map +1 -0
  134. package/dist/explore/overlays/action-panel.d.ts +12 -0
  135. package/dist/explore/overlays/action-panel.d.ts.map +1 -0
  136. package/dist/explore/overlays/action-panel.js +69 -0
  137. package/dist/explore/overlays/action-panel.js.map +1 -0
  138. package/dist/explore/overlays/connector-label-beacon.d.ts +11 -0
  139. package/dist/explore/overlays/connector-label-beacon.d.ts.map +1 -0
  140. package/dist/explore/overlays/connector-label-beacon.js +38 -0
  141. package/dist/explore/overlays/connector-label-beacon.js.map +1 -0
  142. package/dist/explore/overlays/connector-label-tag-shell.d.ts +16 -0
  143. package/dist/explore/overlays/connector-label-tag-shell.d.ts.map +1 -0
  144. package/dist/explore/overlays/connector-label-tag-shell.js +18 -0
  145. package/dist/explore/overlays/connector-label-tag-shell.js.map +1 -0
  146. package/dist/explore/overlays/detail-window.d.ts +9 -0
  147. package/dist/explore/overlays/detail-window.d.ts.map +1 -0
  148. package/dist/explore/overlays/detail-window.js +92 -0
  149. package/dist/explore/overlays/detail-window.js.map +1 -0
  150. package/dist/explore/overlays/explore-helper.d.ts +44 -0
  151. package/dist/explore/overlays/explore-helper.d.ts.map +1 -0
  152. package/dist/explore/overlays/explore-helper.js +57 -0
  153. package/dist/explore/overlays/explore-helper.js.map +1 -0
  154. package/dist/explore/overlays/icons.d.ts +16 -0
  155. package/dist/explore/overlays/icons.d.ts.map +1 -0
  156. package/dist/explore/overlays/icons.js +34 -0
  157. package/dist/explore/overlays/icons.js.map +1 -0
  158. package/dist/explore/overlays/space-load-error-overlay.d.ts +27 -0
  159. package/dist/explore/overlays/space-load-error-overlay.d.ts.map +1 -0
  160. package/dist/explore/overlays/space-load-error-overlay.js +24 -0
  161. package/dist/explore/overlays/space-load-error-overlay.js.map +1 -0
  162. package/dist/explore/services/websocket.service.d.ts +180 -0
  163. package/dist/explore/services/websocket.service.d.ts.map +1 -0
  164. package/dist/explore/services/websocket.service.js +187 -0
  165. package/dist/explore/services/websocket.service.js.map +1 -0
  166. package/dist/explore/simple-character.d.ts +46 -0
  167. package/dist/explore/simple-character.d.ts.map +1 -0
  168. package/dist/explore/simple-character.js +119 -0
  169. package/dist/explore/simple-character.js.map +1 -0
  170. package/dist/explore/stores/action-prompt.store.d.ts +27 -0
  171. package/dist/explore/stores/action-prompt.store.d.ts.map +1 -0
  172. package/dist/explore/stores/action-prompt.store.js +14 -0
  173. package/dist/explore/stores/action-prompt.store.js.map +1 -0
  174. package/dist/explore/stores/cave-explore.store.d.ts +77 -0
  175. package/dist/explore/stores/cave-explore.store.d.ts.map +1 -0
  176. package/dist/explore/stores/cave-explore.store.js +66 -0
  177. package/dist/explore/stores/cave-explore.store.js.map +1 -0
  178. package/dist/explore/stores/explore-context.d.ts +35 -0
  179. package/dist/explore/stores/explore-context.d.ts.map +1 -0
  180. package/dist/explore/stores/explore-context.js +43 -0
  181. package/dist/explore/stores/explore-context.js.map +1 -0
  182. package/dist/explore/styles/cave-world-css.d.ts +10 -0
  183. package/dist/explore/styles/cave-world-css.d.ts.map +1 -0
  184. package/dist/explore/styles/cave-world-css.js +935 -0
  185. package/dist/explore/styles/cave-world-css.js.map +1 -0
  186. package/dist/explore/styles/inject.d.ts +32 -0
  187. package/dist/explore/styles/inject.d.ts.map +1 -0
  188. package/dist/explore/styles/inject.js +40 -0
  189. package/dist/explore/styles/inject.js.map +1 -0
  190. package/dist/explore/utils/schedule-idle.d.ts +12 -0
  191. package/dist/explore/utils/schedule-idle.d.ts.map +1 -0
  192. package/dist/explore/utils/schedule-idle.js +16 -0
  193. package/dist/explore/utils/schedule-idle.js.map +1 -0
  194. package/dist/explore/viewer-shared.d.ts +56 -0
  195. package/dist/explore/viewer-shared.d.ts.map +1 -0
  196. package/dist/index.d.ts +16 -0
  197. package/dist/index.d.ts.map +1 -0
  198. package/dist/index.js +78 -0
  199. package/dist/index.js.map +1 -0
  200. package/dist/space/cave-base-layer.d.ts +42 -0
  201. package/dist/space/cave-base-layer.d.ts.map +1 -0
  202. package/dist/space/cave-base-layer.js +221 -0
  203. package/dist/space/cave-base-layer.js.map +1 -0
  204. package/dist/space/cave-custom-layer.d.ts +12 -0
  205. package/dist/space/cave-custom-layer.d.ts.map +1 -0
  206. package/dist/space/cave-custom-layer.js +17 -0
  207. package/dist/space/cave-custom-layer.js.map +1 -0
  208. package/dist/space/cave-env.d.ts +6 -0
  209. package/dist/space/cave-env.d.ts.map +1 -0
  210. package/dist/space/cave-env.js +23 -0
  211. package/dist/space/cave-env.js.map +1 -0
  212. package/dist/space/cave-space.d.ts +46 -0
  213. package/dist/space/cave-space.d.ts.map +1 -0
  214. package/dist/space/cave-space.js +37 -0
  215. package/dist/space/cave-space.js.map +1 -0
  216. package/dist/space/connector-label-host.d.ts +21 -0
  217. package/dist/space/connector-label-host.d.ts.map +1 -0
  218. package/dist/space/connector-label-host.js +65 -0
  219. package/dist/space/connector-label-host.js.map +1 -0
  220. package/dist/space/index.d.ts +18 -0
  221. package/dist/space/index.d.ts.map +1 -0
  222. package/dist/space/index.js +47 -0
  223. package/dist/space/index.js.map +1 -0
  224. package/dist/space/objects/builtin-registrar.d.ts +17 -0
  225. package/dist/space/objects/builtin-registrar.d.ts.map +1 -0
  226. package/dist/space/objects/builtin-registrar.js +19 -0
  227. package/dist/space/objects/builtin-registrar.js.map +1 -0
  228. package/dist/space/objects/custom-object.d.ts +9 -0
  229. package/dist/space/objects/custom-object.d.ts.map +1 -0
  230. package/dist/space/objects/custom-object.js +56 -0
  231. package/dist/space/objects/custom-object.js.map +1 -0
  232. package/dist/space/objects/image-object.d.ts +7 -0
  233. package/dist/space/objects/image-object.d.ts.map +1 -0
  234. package/dist/space/objects/image-object.js +14 -0
  235. package/dist/space/objects/image-object.js.map +1 -0
  236. package/dist/space/objects/model-object/fbx-object.d.ts +8 -0
  237. package/dist/space/objects/model-object/fbx-object.d.ts.map +1 -0
  238. package/dist/space/objects/model-object/fbx-object.js +26 -0
  239. package/dist/space/objects/model-object/fbx-object.js.map +1 -0
  240. package/dist/space/objects/model-object/gltf-object.d.ts +9 -0
  241. package/dist/space/objects/model-object/gltf-object.d.ts.map +1 -0
  242. package/dist/space/objects/model-object/gltf-object.js +66 -0
  243. package/dist/space/objects/model-object/gltf-object.js.map +1 -0
  244. package/dist/space/objects/model-object/index.d.ts +9 -0
  245. package/dist/space/objects/model-object/index.d.ts.map +1 -0
  246. package/dist/space/objects/model-object/index.js +12 -0
  247. package/dist/space/objects/model-object/index.js.map +1 -0
  248. package/dist/space/objects/model-object/splat-object.d.ts +9 -0
  249. package/dist/space/objects/model-object/splat-object.d.ts.map +1 -0
  250. package/dist/space/objects/model-object/splat-object.js +19 -0
  251. package/dist/space/objects/model-object/splat-object.js.map +1 -0
  252. package/dist/space/objects/object-components/windows/index.d.ts +5 -0
  253. package/dist/space/objects/object-components/windows/index.d.ts.map +1 -0
  254. package/dist/space/objects/object-components/windows/index.js +20 -0
  255. package/dist/space/objects/object-components/windows/index.js.map +1 -0
  256. package/dist/space/objects/placeholder-object.d.ts +7 -0
  257. package/dist/space/objects/placeholder-object.d.ts.map +1 -0
  258. package/dist/space/objects/placeholder-object.js +12 -0
  259. package/dist/space/objects/placeholder-object.js.map +1 -0
  260. package/dist/space/objects/poi-object.d.ts +7 -0
  261. package/dist/space/objects/poi-object.d.ts.map +1 -0
  262. package/dist/space/objects/poi-object.js +38 -0
  263. package/dist/space/objects/poi-object.js.map +1 -0
  264. package/dist/space/objects/portal-object.d.ts +7 -0
  265. package/dist/space/objects/portal-object.d.ts.map +1 -0
  266. package/dist/space/objects/portal-object.js +84 -0
  267. package/dist/space/objects/portal-object.js.map +1 -0
  268. package/dist/space/objects/video-object.d.ts +7 -0
  269. package/dist/space/objects/video-object.d.ts.map +1 -0
  270. package/dist/space/objects/video-object.js +32 -0
  271. package/dist/space/objects/video-object.js.map +1 -0
  272. package/dist/space/polygon-boundary.d.ts +10 -0
  273. package/dist/space/polygon-boundary.d.ts.map +1 -0
  274. package/dist/space/polygon-boundary.js +205 -0
  275. package/dist/space/polygon-boundary.js.map +1 -0
  276. package/dist/space/splats/spark/robust-splat-mesh.d.ts +59 -0
  277. package/dist/space/splats/spark/robust-splat-mesh.d.ts.map +1 -0
  278. package/dist/space/splats/spark/robust-splat-mesh.js +105 -0
  279. package/dist/space/splats/spark/robust-splat-mesh.js.map +1 -0
  280. package/dist/space/splats/spark/splat-mesh.d.ts +5 -0
  281. package/dist/space/splats/spark/splat-mesh.d.ts.map +1 -0
  282. package/dist/space/splats/spark/splat-mesh.js +7 -0
  283. package/dist/space/splats/spark/splat-mesh.js.map +1 -0
  284. package/dist/space/splats/spark/splat-spread-reveal.d.ts +14 -0
  285. package/dist/space/splats/spark/splat-spread-reveal.d.ts.map +1 -0
  286. package/dist/space/splats/spark/splat-spread-reveal.js +45 -0
  287. package/dist/space/splats/spark/splat-spread-reveal.js.map +1 -0
  288. package/dist/space/utils/cave-world-player.d.ts +3 -0
  289. package/dist/space/utils/cave-world-player.d.ts.map +1 -0
  290. package/dist/space/utils/cave-world-player.js +5 -0
  291. package/dist/space/utils/cave-world-player.js.map +1 -0
  292. package/dist/space/utils/configure-canvas.d.ts +20 -0
  293. package/dist/space/utils/configure-canvas.d.ts.map +1 -0
  294. package/dist/space/utils/configure-canvas.js +12 -0
  295. package/dist/space/utils/configure-canvas.js.map +1 -0
  296. package/dist/space/utils/polygon-boundary-geometry.d.ts +8 -0
  297. package/dist/space/utils/polygon-boundary-geometry.d.ts.map +1 -0
  298. package/dist/space/utils/polygon-boundary-geometry.js +20 -0
  299. package/dist/space/utils/polygon-boundary-geometry.js.map +1 -0
  300. package/dist/space/utils/polygon-boundary-segments.d.ts +50 -0
  301. package/dist/space/utils/polygon-boundary-segments.d.ts.map +1 -0
  302. package/dist/space/utils/polygon-boundary-segments.js +64 -0
  303. package/dist/space/utils/polygon-boundary-segments.js.map +1 -0
  304. package/dist/space/utils/rotation-compat.d.ts +4 -0
  305. package/dist/space/utils/rotation-compat.d.ts.map +1 -0
  306. package/dist/space/utils/rotation-compat.js +9 -0
  307. package/dist/space/utils/rotation-compat.js.map +1 -0
  308. package/dist/space/utils/select-splat-level.d.ts +52 -0
  309. package/dist/space/utils/select-splat-level.d.ts.map +1 -0
  310. package/dist/space/utils/select-splat-level.js +43 -0
  311. package/dist/space/utils/select-splat-level.js.map +1 -0
  312. package/dist/space/utils/spark-performance.d.ts +10 -0
  313. package/dist/space/utils/spark-performance.d.ts.map +1 -0
  314. package/dist/space/utils/spark-performance.js +10 -0
  315. package/dist/space/utils/spark-performance.js.map +1 -0
  316. package/dist/space/utils/splat-collider-helper.d.ts +5 -0
  317. package/dist/space/utils/splat-collider-helper.d.ts.map +1 -0
  318. package/dist/space/utils/splat-collider-helper.js +162 -0
  319. package/dist/space/utils/splat-collider-helper.js.map +1 -0
  320. package/dist/space/utils/touch-primary-device.d.ts +16 -0
  321. package/dist/space/utils/touch-primary-device.d.ts.map +1 -0
  322. package/dist/space/utils/touch-primary-device.js +52 -0
  323. package/dist/space/utils/touch-primary-device.js.map +1 -0
  324. package/dist/space/utils/use-visibility-frameloop.d.ts +20 -0
  325. package/dist/space/utils/use-visibility-frameloop.d.ts.map +1 -0
  326. package/dist/space/utils/use-visibility-frameloop.js +18 -0
  327. package/dist/space/utils/use-visibility-frameloop.js.map +1 -0
  328. package/dist/styles.css +930 -0
  329. package/dist/types/index.d.ts +2 -0
  330. package/dist/types/index.d.ts.map +1 -0
  331. package/dist/types/index.js +2 -0
  332. package/dist/types/index.js.map +1 -0
  333. package/dist/types/space-types.d.ts +404 -0
  334. package/dist/types/space-types.d.ts.map +1 -0
  335. package/doc/API.md +617 -0
  336. package/doc/ARCHITECTURE.md +264 -0
  337. package/doc/multiplayer-protocol.md +757 -0
  338. package/doc/scene-json-structure.md +567 -0
  339. package/package.json +131 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cave-world-context.js","sources":["../../../core/context/cave-world-context.tsx"],"sourcesContent":["import { createContext, useContext, useMemo, useState, type ReactNode } from 'react'\nimport { create, useStore, type Mutate, type StoreApi } from 'zustand'\nimport { subscribeWithSelector } from 'zustand/middleware'\nimport type { CaveSpace, CustomObject } from '../../types'\nimport { CaveEventBus } from '../events/event-bus'\nimport { CaveWorldError } from '../errors'\nimport {\n resolveMessages,\n type CaveWorldMessages,\n type PartialCaveWorldMessages\n} from '../i18n/messages'\nimport { ObjectRegistry } from '../registry/object-registry'\nimport { ComponentRegistry } from '../registry/component-registry'\nimport type { ConnectorLabelMode, ConnectorLabelRenderer } from '../connector-label/types'\n\nexport interface CaveWorldInteraction {\n activeObject: CustomObject | undefined\n detailVisible: boolean\n}\n\n/**\n * A terminal (retries-exhausted) failure to load a space's assets. Surfaced so\n * a built-in / custom overlay can prompt the user instead of the page hanging\n * on an infinite loading screen.\n *\n * - `stage: 'config'` — the space JSON (`caveSpaceLoader`) failed.\n * - `stage: 'splat'` — the base-layer 3DGS/splat asset failed to download.\n */\nexport interface SpaceLoadError {\n stage: 'config' | 'splat'\n /** Asset URL that failed (present for the splat stage). */\n url?: string\n /** Space id that failed, when known. */\n spaceId?: string\n error: unknown\n}\n\nexport interface CaveWorldState extends CaveWorldInteraction {\n spaceConfig: CaveSpace | undefined\n\n /** Terminal space/splat load failure, or `undefined` when healthy. */\n spaceLoadError: SpaceLoadError | undefined\n /**\n * Monotonic counter bumped by {@link CaveWorldState.retrySpaceLoad}. Load\n * effects and the robust splat mesh include it in their dependencies so a\n * user-triggered retry forces a fresh config fetch / splat re-download.\n */\n retryToken: number\n\n setSpaceConfig: (config: CaveSpace | undefined) => void\n setActiveObject: (obj: CustomObject | undefined) => void\n setDetailVisible: (visible: boolean) => void\n\n setSpaceLoadError: (error: SpaceLoadError | undefined) => void\n /** Clear the error and bump {@link CaveWorldState.retryToken} to retry. */\n retrySpaceLoad: () => void\n}\n\n/**\n * Store handle including the `subscribeWithSelector` overload, so callers can\n * watch one field instead of re-running on every write.\n */\nexport type CaveWorldStoreApi = Mutate<\n StoreApi<CaveWorldState>,\n [['zustand/subscribeWithSelector', never]]\n>\n\nexport interface CaveWorldServices {\n eventBus: CaveEventBus\n objectRegistry: ObjectRegistry\n componentRegistry: ComponentRegistry\n store: CaveWorldStoreApi\n /** Resolved UI copy for the built-in overlays. */\n messages: CaveWorldMessages\n connectorLabel: ConnectorLabelMode\n connectorLabelRenderer?: ConnectorLabelRenderer\n}\n\nconst CaveWorldContext = createContext<CaveWorldServices | null>(null)\n\nexport function createCaveWorldStore(): CaveWorldStoreApi {\n return create(\n subscribeWithSelector<CaveWorldState>((set) => ({\n spaceConfig: undefined,\n activeObject: undefined,\n detailVisible: false,\n spaceLoadError: undefined,\n retryToken: 0,\n\n setSpaceConfig: (config) => set({ spaceConfig: config }),\n setActiveObject: (obj) => set({ activeObject: obj }),\n setDetailVisible: (visible) => set({ detailVisible: visible }),\n\n setSpaceLoadError: (error) => set({ spaceLoadError: error }),\n retrySpaceLoad: () =>\n set((state) => ({ spaceLoadError: undefined, retryToken: state.retryToken + 1 }))\n }))\n )\n}\n\nexport interface CaveWorldProviderProps {\n children: ReactNode\n /** Reuse an external bus to observe SDK events from outside the tree. */\n eventBus?: CaveEventBus\n /** Pre-populated registry of object renderers. */\n objectRegistry?: ObjectRegistry\n /** Pre-populated registry of behavior components. */\n componentRegistry?: ComponentRegistry\n /** Partial copy overrides, deep-merged over the default locale. */\n messages?: PartialCaveWorldMessages\n /** Global default for connector wayfinding labels. @default 'auto' */\n connectorLabel?: ConnectorLabelMode\n connectorLabelRenderer?: ConnectorLabelRenderer\n}\n\n/**\n * Provides the per-instance services every SDK hook and component reads:\n * event bus, registries, world store, and resolved copy.\n *\n * `CaveExplore` / `CaveOrbitViewer` mount this for you. Mount it yourself only\n * when composing `CaveSpace` into your own canvas.\n */\nexport function CaveWorldProvider({\n children,\n eventBus: externalEventBus,\n objectRegistry: externalObjectRegistry,\n componentRegistry: externalComponentRegistry,\n messages,\n connectorLabel = 'auto',\n connectorLabelRenderer\n}: CaveWorldProviderProps) {\n const [store] = useState(createCaveWorldStore)\n // Own the fallbacks in state so an omitted prop keeps the same instance for\n // the lifetime of the provider; recreating a bus would drop subscriptions.\n const [fallbackEventBus] = useState(() => new CaveEventBus())\n const [fallbackObjectRegistry] = useState(() => new ObjectRegistry())\n const [fallbackComponentRegistry] = useState(() => new ComponentRegistry())\n\n const resolvedMessages = useMemo(() => resolveMessages(messages), [messages])\n\n const services = useMemo<CaveWorldServices>(\n () => ({\n eventBus: externalEventBus ?? fallbackEventBus,\n objectRegistry: externalObjectRegistry ?? fallbackObjectRegistry,\n componentRegistry: externalComponentRegistry ?? fallbackComponentRegistry,\n store,\n messages: resolvedMessages,\n connectorLabel,\n connectorLabelRenderer\n }),\n [\n externalEventBus,\n externalObjectRegistry,\n externalComponentRegistry,\n fallbackEventBus,\n fallbackObjectRegistry,\n fallbackComponentRegistry,\n store,\n resolvedMessages,\n connectorLabel,\n connectorLabelRenderer\n ]\n )\n\n return <CaveWorldContext.Provider value={services}>{children}</CaveWorldContext.Provider>\n}\n\nexport function useCaveWorld(): CaveWorldServices {\n const ctx = useContext(CaveWorldContext)\n if (!ctx) {\n throw new CaveWorldError(\n 'MISSING_PROVIDER',\n 'useCaveWorld must be used within a <CaveWorldProvider>.'\n )\n }\n return ctx\n}\n\n/** Subscribe to a slice of the per-instance world store. */\nexport function useCaveWorldStore<T>(selector: (state: CaveWorldState) => T): T {\n const { store } = useCaveWorld()\n return useStore(store, selector)\n}\n\n/** Imperative handle to the world store (`getState` / `setState` / `subscribe`). */\nexport function useCaveWorldStoreApi(): CaveWorldStoreApi {\n return useCaveWorld().store\n}\n\nexport function useCaveEventBus(): CaveEventBus {\n return useCaveWorld().eventBus\n}\n\nexport function useObjectRegistry(): ObjectRegistry {\n return useCaveWorld().objectRegistry\n}\n\nexport function useComponentRegistry(): ComponentRegistry {\n return useCaveWorld().componentRegistry\n}\n\n/** Resolved UI copy for the current provider. */\nexport function useCaveWorldMessages(): CaveWorldMessages {\n return useCaveWorld().messages\n}\n"],"names":["CaveWorldContext","createContext","createCaveWorldStore","create","subscribeWithSelector","set","config","obj","visible","error","state","CaveWorldProvider","children","externalEventBus","externalObjectRegistry","externalComponentRegistry","messages","connectorLabel","connectorLabelRenderer","store","useState","fallbackEventBus","CaveEventBus","fallbackObjectRegistry","ObjectRegistry","fallbackComponentRegistry","ComponentRegistry","resolvedMessages","useMemo","resolveMessages","services","useCaveWorld","ctx","useContext","CaveWorldError","useCaveWorldStore","selector","useStore","useCaveWorldStoreApi","useCaveEventBus","useObjectRegistry","useComponentRegistry","useCaveWorldMessages"],"mappings":";;;;;;;;;AA8EA,MAAMA,IAAmBC,EAAwC,IAAI;AAE9D,SAASC,IAA0C;AACxD,SAAOC;AAAA,IACLC,EAAsC,CAACC,OAAS;AAAA,MAC9C,aAAa;AAAA,MACb,cAAc;AAAA,MACd,eAAe;AAAA,MACf,gBAAgB;AAAA,MAChB,YAAY;AAAA,MAEZ,gBAAgB,CAACC,MAAWD,EAAI,EAAE,aAAaC,GAAQ;AAAA,MACvD,iBAAiB,CAACC,MAAQF,EAAI,EAAE,cAAcE,GAAK;AAAA,MACnD,kBAAkB,CAACC,MAAYH,EAAI,EAAE,eAAeG,GAAS;AAAA,MAE7D,mBAAmB,CAACC,MAAUJ,EAAI,EAAE,gBAAgBI,GAAO;AAAA,MAC3D,gBAAgB,MACdJ,EAAI,CAACK,OAAW,EAAE,gBAAgB,QAAW,YAAYA,EAAM,aAAa,EAAA,EAAI;AAAA,IAAA,EAClF;AAAA,EAAA;AAEN;AAwBO,SAASC,EAAkB;AAAA,EAChC,UAAAC;AAAA,EACA,UAAUC;AAAA,EACV,gBAAgBC;AAAA,EAChB,mBAAmBC;AAAA,EACnB,UAAAC;AAAA,EACA,gBAAAC,IAAiB;AAAA,EACjB,wBAAAC;AACF,GAA2B;AACzB,QAAM,CAACC,CAAK,IAAIC,EAASlB,CAAoB,GAGvC,CAACmB,CAAgB,IAAID,EAAS,MAAM,IAAIE,GAAc,GACtD,CAACC,CAAsB,IAAIH,EAAS,MAAM,IAAII,GAAgB,GAC9D,CAACC,CAAyB,IAAIL,EAAS,MAAM,IAAIM,GAAmB,GAEpEC,IAAmBC,EAAQ,MAAMC,EAAgBb,CAAQ,GAAG,CAACA,CAAQ,CAAC,GAEtEc,IAAWF;AAAA,IACf,OAAO;AAAA,MACL,UAAUf,KAAoBQ;AAAA,MAC9B,gBAAgBP,KAA0BS;AAAA,MAC1C,mBAAmBR,KAA6BU;AAAA,MAChD,OAAAN;AAAA,MACA,UAAUQ;AAAA,MACV,gBAAAV;AAAA,MACA,wBAAAC;AAAA,IAAA;AAAA,IAEF;AAAA,MACEL;AAAA,MACAC;AAAA,MACAC;AAAA,MACAM;AAAA,MACAE;AAAA,MACAE;AAAA,MACAN;AAAA,MACAQ;AAAA,MACAV;AAAA,MACAC;AAAA,IAAA;AAAA,EACF;AAGF,2BAAQlB,EAAiB,UAAjB,EAA0B,OAAO8B,GAAW,UAAAlB,GAAS;AAC/D;AAEO,SAASmB,IAAkC;AAChD,QAAMC,IAAMC,EAAWjC,CAAgB;AACvC,MAAI,CAACgC;AACH,UAAM,IAAIE;AAAA,MACR;AAAA,MACA;AAAA,IAAA;AAGJ,SAAOF;AACT;AAGO,SAASG,EAAqBC,GAA2C;AAC9E,QAAM,EAAE,OAAAjB,EAAA,IAAUY,EAAA;AAClB,SAAOM,EAASlB,GAAOiB,CAAQ;AACjC;AAGO,SAASE,IAA0C;AACxD,SAAOP,IAAe;AACxB;AAEO,SAASQ,IAAgC;AAC9C,SAAOR,IAAe;AACxB;AAEO,SAASS,IAAoC;AAClD,SAAOT,IAAe;AACxB;AAEO,SAASU,IAA0C;AACxD,SAAOV,IAAe;AACxB;AAGO,SAASW,IAA0C;AACxD,SAAOX,IAAe;AACxB;"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Stable error codes for failures a host may want to branch on.
3
+ *
4
+ * - `SPACE_FETCH_FAILED` — the space JSON request failed or returned non-2xx.
5
+ * - `SPACE_FETCH_TIMEOUT` — the space JSON request exceeded the loader timeout.
6
+ * - `INVALID_SPACE` — the payload parsed but is not a usable `CaveSpace`.
7
+ * - `SPLAT_LOAD_FAILED` — a 3DGS asset failed to download/decode.
8
+ * - `SPLAT_LOAD_TIMEOUT` — a 3DGS asset stalled without resolving or rejecting.
9
+ * - `MISSING_PROVIDER` — an SDK hook was used outside its provider.
10
+ */
11
+ export type CaveWorldErrorCode = 'SPACE_FETCH_FAILED' | 'SPACE_FETCH_TIMEOUT' | 'INVALID_SPACE' | 'SPLAT_LOAD_FAILED' | 'SPLAT_LOAD_TIMEOUT' | 'MISSING_PROVIDER';
12
+ export interface CaveWorldErrorOptions {
13
+ /** Underlying error, kept for stack/telemetry. */
14
+ cause?: unknown;
15
+ /** Space id the failure relates to, when known. */
16
+ spaceId?: string;
17
+ /** Asset or endpoint URL the failure relates to, when known. */
18
+ url?: string;
19
+ /** HTTP status, when the failure came from a response. */
20
+ status?: number;
21
+ }
22
+ /**
23
+ * Error type thrown by the SDK. Always carries a machine-readable
24
+ * {@link CaveWorldErrorCode} so hosts don't have to match on message strings.
25
+ */
26
+ export declare class CaveWorldError extends Error {
27
+ readonly code: CaveWorldErrorCode;
28
+ readonly spaceId?: string;
29
+ readonly url?: string;
30
+ readonly status?: number;
31
+ constructor(code: CaveWorldErrorCode, message: string, options?: CaveWorldErrorOptions);
32
+ }
33
+ export declare function isCaveWorldError(value: unknown): value is CaveWorldError;
34
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../core/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,MAAM,kBAAkB,GAC1B,oBAAoB,GACpB,qBAAqB,GACrB,eAAe,GACf,mBAAmB,GACnB,oBAAoB,GACpB,kBAAkB,CAAA;AAEtB,MAAM,WAAW,qBAAqB;IACpC,kDAAkD;IAClD,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,gEAAgE;IAChE,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,0DAA0D;IAC1D,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;;GAGG;AACH,qBAAa,cAAe,SAAQ,KAAK;IACvC,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAA;IACjC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;gBAEZ,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,qBAA0B;CAQ3F;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,cAAc,CAExE"}
@@ -0,0 +1,17 @@
1
+ class t extends Error {
2
+ code;
3
+ spaceId;
4
+ url;
5
+ status;
6
+ constructor(e, a, r = {}) {
7
+ super(a, r.cause == null ? void 0 : { cause: r.cause }), this.name = "CaveWorldError", this.code = e, this.spaceId = r.spaceId, this.url = r.url, this.status = r.status;
8
+ }
9
+ }
10
+ function u(s) {
11
+ return s instanceof t;
12
+ }
13
+ export {
14
+ t as CaveWorldError,
15
+ u as isCaveWorldError
16
+ };
17
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sources":["../../core/errors.ts"],"sourcesContent":["/**\n * Stable error codes for failures a host may want to branch on.\n *\n * - `SPACE_FETCH_FAILED` — the space JSON request failed or returned non-2xx.\n * - `SPACE_FETCH_TIMEOUT` — the space JSON request exceeded the loader timeout.\n * - `INVALID_SPACE` — the payload parsed but is not a usable `CaveSpace`.\n * - `SPLAT_LOAD_FAILED` — a 3DGS asset failed to download/decode.\n * - `SPLAT_LOAD_TIMEOUT` — a 3DGS asset stalled without resolving or rejecting.\n * - `MISSING_PROVIDER` — an SDK hook was used outside its provider.\n */\nexport type CaveWorldErrorCode =\n | 'SPACE_FETCH_FAILED'\n | 'SPACE_FETCH_TIMEOUT'\n | 'INVALID_SPACE'\n | 'SPLAT_LOAD_FAILED'\n | 'SPLAT_LOAD_TIMEOUT'\n | 'MISSING_PROVIDER'\n\nexport interface CaveWorldErrorOptions {\n /** Underlying error, kept for stack/telemetry. */\n cause?: unknown\n /** Space id the failure relates to, when known. */\n spaceId?: string\n /** Asset or endpoint URL the failure relates to, when known. */\n url?: string\n /** HTTP status, when the failure came from a response. */\n status?: number\n}\n\n/**\n * Error type thrown by the SDK. Always carries a machine-readable\n * {@link CaveWorldErrorCode} so hosts don't have to match on message strings.\n */\nexport class CaveWorldError extends Error {\n readonly code: CaveWorldErrorCode\n readonly spaceId?: string\n readonly url?: string\n readonly status?: number\n\n constructor(code: CaveWorldErrorCode, message: string, options: CaveWorldErrorOptions = {}) {\n super(message, options.cause == null ? undefined : { cause: options.cause })\n this.name = 'CaveWorldError'\n this.code = code\n this.spaceId = options.spaceId\n this.url = options.url\n this.status = options.status\n }\n}\n\nexport function isCaveWorldError(value: unknown): value is CaveWorldError {\n return value instanceof CaveWorldError\n}\n"],"names":["CaveWorldError","code","message","options","isCaveWorldError","value"],"mappings":"AAiCO,MAAMA,UAAuB,MAAM;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAYC,GAA0BC,GAAiBC,IAAiC,CAAA,GAAI;AAC1F,UAAMD,GAASC,EAAQ,SAAS,OAAO,SAAY,EAAE,OAAOA,EAAQ,OAAO,GAC3E,KAAK,OAAO,kBACZ,KAAK,OAAOF,GACZ,KAAK,UAAUE,EAAQ,SACvB,KAAK,MAAMA,EAAQ,KACnB,KAAK,SAASA,EAAQ;AAAA,EACxB;AACF;AAEO,SAASC,EAAiBC,GAAyC;AACxE,SAAOA,aAAiBL;AAC1B;"}
@@ -0,0 +1,122 @@
1
+ import type { CustomObject, ConnectorDef, ConnectorTarget } from '../../types/index.js';
2
+ /**
3
+ * Every event the SDK publishes, keyed by name with its payload type.
4
+ *
5
+ * Third parties do not need to extend this interface: any `custom:`-prefixed
6
+ * name is accepted, so `emit('custom:myGame:score', …)` type-checks as-is.
7
+ */
8
+ export interface CaveEventMap {
9
+ /** An object was clicked. */
10
+ 'object:click': {
11
+ object: CustomObject;
12
+ nativeEvent?: unknown;
13
+ };
14
+ /** The player entered an object's proximity sensor. */
15
+ 'object:enter': {
16
+ object: CustomObject;
17
+ };
18
+ /** The player left an object's proximity sensor. */
19
+ 'object:leave': {
20
+ object: CustomObject;
21
+ };
22
+ /** The player performed an action on an object (e.g. pressed F). */
23
+ 'object:interact': {
24
+ object: CustomObject;
25
+ action: string;
26
+ };
27
+ /** An object became the active interaction target. */
28
+ 'object:active': {
29
+ object: CustomObject;
30
+ };
31
+ /** The detail window was opened for an object. */
32
+ 'detail:open': {
33
+ object: CustomObject;
34
+ };
35
+ /** The detail window was closed. */
36
+ 'detail:close': Record<string, never>;
37
+ /** The player entered a connector's trigger volume. */
38
+ 'connector:enter': {
39
+ connector: ConnectorDef;
40
+ };
41
+ /** The player left a connector's trigger volume. */
42
+ 'connector:leave': {
43
+ connector: ConnectorDef;
44
+ };
45
+ /** A cross-scene transition completed. `from`/`to` are `caveWorldId`s. */
46
+ 'connector:transition': {
47
+ from: string;
48
+ to: string;
49
+ type: 'seamless' | 'portal';
50
+ };
51
+ /** The user picked a portal destination. */
52
+ 'connector:portal:select': {
53
+ connector: ConnectorDef;
54
+ target: ConnectorTarget;
55
+ };
56
+ /** The user clicked a connector's 3D wayfinding label. */
57
+ 'connector:label:click': {
58
+ connector: ConnectorDef;
59
+ };
60
+ /** Scene load progress, 0–1. */
61
+ 'space:loading': {
62
+ progress: number;
63
+ };
64
+ /** The active space's base layer finished loading. */
65
+ 'space:initialized': Record<string, never>;
66
+ /** A connected space's base layer finished loading and can be travelled to. */
67
+ 'space:transfer:ready': {
68
+ spaceId: string;
69
+ };
70
+ /**
71
+ * A space JSON or splat asset failed to load. Fired for each attempt
72
+ * including retries, so it is suitable for telemetry; `willRetry` tells you
73
+ * whether the SDK is going to try again.
74
+ */
75
+ 'space:error': {
76
+ error: unknown;
77
+ willRetry?: boolean;
78
+ spaceId?: string;
79
+ url?: string;
80
+ };
81
+ /** The player is blocked by a polygon boundary fence. */
82
+ 'boundary:contact': {
83
+ boundaryId: string;
84
+ proximity: number;
85
+ };
86
+ /** The player moved away from a boundary contact. */
87
+ 'boundary:release': {
88
+ boundaryId: string;
89
+ };
90
+ /** Host-defined events. Any `custom:`-prefixed name is allowed. */
91
+ [key: `custom:${string}`]: unknown;
92
+ }
93
+ export type CaveEventName = keyof CaveEventMap;
94
+ export type CaveEventHandler<T = unknown> = (payload: T) => void;
95
+ /**
96
+ * Type-safe publish/subscribe bus shared by every SDK module.
97
+ *
98
+ * Guarantees that matter for hosts:
99
+ * - handlers are snapshotted before dispatch, so subscribing or unsubscribing
100
+ * inside a handler cannot skip or double-fire other handlers;
101
+ * - a throwing handler is logged and isolated — it never prevents the remaining
102
+ * handlers from running, which would otherwise break scene loading.
103
+ */
104
+ export declare class CaveEventBus {
105
+ private listeners;
106
+ private onceListeners;
107
+ /** Subscribe. Returns an unsubscribe function. */
108
+ on<K extends CaveEventName>(event: K, handler: CaveEventHandler<CaveEventMap[K]>): () => void;
109
+ /** Subscribe for a single dispatch. Returns an unsubscribe function. */
110
+ once<K extends CaveEventName>(event: K, handler: CaveEventHandler<CaveEventMap[K]>): () => void;
111
+ /** Unsubscribe a handler from both the persistent and one-shot sets. */
112
+ off<K extends CaveEventName>(event: K, handler: CaveEventHandler<CaveEventMap[K]>): void;
113
+ /** Publish an event to all current subscribers. */
114
+ emit<K extends CaveEventName>(event: K, payload: CaveEventMap[K]): void;
115
+ /** Remove all handlers for one event, or for every event when omitted. */
116
+ removeAllListeners(event?: CaveEventName): void;
117
+ /** Number of subscribers for an event (persistent + one-shot). */
118
+ listenerCount(event: CaveEventName): number;
119
+ private add;
120
+ private invoke;
121
+ }
122
+ //# sourceMappingURL=event-bus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-bus.d.ts","sourceRoot":"","sources":["../../../core/events/event-bus.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ import { createLogger as c } from "../logging/logger.js";
2
+ const l = c("events");
3
+ class a {
4
+ listeners = /* @__PURE__ */ new Map();
5
+ onceListeners = /* @__PURE__ */ new Map();
6
+ /** Subscribe. Returns an unsubscribe function. */
7
+ on(e, s) {
8
+ return this.add(this.listeners, e, s);
9
+ }
10
+ /** Subscribe for a single dispatch. Returns an unsubscribe function. */
11
+ once(e, s) {
12
+ return this.add(this.onceListeners, e, s);
13
+ }
14
+ /** Unsubscribe a handler from both the persistent and one-shot sets. */
15
+ off(e, s) {
16
+ this.listeners.get(e)?.delete(s), this.onceListeners.get(e)?.delete(s);
17
+ }
18
+ /** Publish an event to all current subscribers. */
19
+ emit(e, s) {
20
+ const t = e, n = this.listeners.get(t);
21
+ if (n?.size)
22
+ for (const i of [...n])
23
+ this.invoke(t, i, s);
24
+ const r = this.onceListeners.get(t);
25
+ if (r?.size) {
26
+ const i = [...r];
27
+ r.clear();
28
+ for (const o of i)
29
+ this.invoke(t, o, s);
30
+ }
31
+ }
32
+ /** Remove all handlers for one event, or for every event when omitted. */
33
+ removeAllListeners(e) {
34
+ if (e) {
35
+ this.listeners.delete(e), this.onceListeners.delete(e);
36
+ return;
37
+ }
38
+ this.listeners.clear(), this.onceListeners.clear();
39
+ }
40
+ /** Number of subscribers for an event (persistent + one-shot). */
41
+ listenerCount(e) {
42
+ const s = e;
43
+ return (this.listeners.get(s)?.size ?? 0) + (this.onceListeners.get(s)?.size ?? 0);
44
+ }
45
+ add(e, s, t) {
46
+ let n = e.get(s);
47
+ return n || (n = /* @__PURE__ */ new Set(), e.set(s, n)), n.add(t), () => {
48
+ e.get(s)?.delete(t);
49
+ };
50
+ }
51
+ invoke(e, s, t) {
52
+ try {
53
+ s(t);
54
+ } catch (n) {
55
+ l.error(`Handler for "${e}" threw:`, n);
56
+ }
57
+ }
58
+ }
59
+ export {
60
+ a as CaveEventBus
61
+ };
62
+ //# sourceMappingURL=event-bus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-bus.js","sources":["../../../core/events/event-bus.ts"],"sourcesContent":["import type { CustomObject, ConnectorDef, ConnectorTarget } from '../../types'\nimport { createLogger } from '../logging/logger'\n\n/**\n * Every event the SDK publishes, keyed by name with its payload type.\n *\n * Third parties do not need to extend this interface: any `custom:`-prefixed\n * name is accepted, so `emit('custom:myGame:score', …)` type-checks as-is.\n */\nexport interface CaveEventMap {\n /** An object was clicked. */\n 'object:click': { object: CustomObject; nativeEvent?: unknown }\n /** The player entered an object's proximity sensor. */\n 'object:enter': { object: CustomObject }\n /** The player left an object's proximity sensor. */\n 'object:leave': { object: CustomObject }\n /** The player performed an action on an object (e.g. pressed F). */\n 'object:interact': { object: CustomObject; action: string }\n /** An object became the active interaction target. */\n 'object:active': { object: CustomObject }\n /** The detail window was opened for an object. */\n 'detail:open': { object: CustomObject }\n /** The detail window was closed. */\n 'detail:close': Record<string, never>\n /** The player entered a connector's trigger volume. */\n 'connector:enter': { connector: ConnectorDef }\n /** The player left a connector's trigger volume. */\n 'connector:leave': { connector: ConnectorDef }\n /** A cross-scene transition completed. `from`/`to` are `caveWorldId`s. */\n 'connector:transition': { from: string; to: string; type: 'seamless' | 'portal' }\n /** The user picked a portal destination. */\n 'connector:portal:select': { connector: ConnectorDef; target: ConnectorTarget }\n /** The user clicked a connector's 3D wayfinding label. */\n 'connector:label:click': { connector: ConnectorDef }\n /** Scene load progress, 0–1. */\n 'space:loading': { progress: number }\n /** The active space's base layer finished loading. */\n 'space:initialized': Record<string, never>\n /** A connected space's base layer finished loading and can be travelled to. */\n 'space:transfer:ready': { spaceId: string }\n /**\n * A space JSON or splat asset failed to load. Fired for each attempt\n * including retries, so it is suitable for telemetry; `willRetry` tells you\n * whether the SDK is going to try again.\n */\n 'space:error': { error: unknown; willRetry?: boolean; spaceId?: string; url?: string }\n /** The player is blocked by a polygon boundary fence. */\n 'boundary:contact': { boundaryId: string; proximity: number }\n /** The player moved away from a boundary contact. */\n 'boundary:release': { boundaryId: string }\n /** Host-defined events. Any `custom:`-prefixed name is allowed. */\n [key: `custom:${string}`]: unknown\n}\n\nexport type CaveEventName = keyof CaveEventMap\n\nexport type CaveEventHandler<T = unknown> = (payload: T) => void\n\ntype AnyHandler = (payload: never) => void\n\nconst logger = createLogger('events')\n\n/**\n * Type-safe publish/subscribe bus shared by every SDK module.\n *\n * Guarantees that matter for hosts:\n * - handlers are snapshotted before dispatch, so subscribing or unsubscribing\n * inside a handler cannot skip or double-fire other handlers;\n * - a throwing handler is logged and isolated — it never prevents the remaining\n * handlers from running, which would otherwise break scene loading.\n */\nexport class CaveEventBus {\n private listeners = new Map<string, Set<AnyHandler>>()\n private onceListeners = new Map<string, Set<AnyHandler>>()\n\n /** Subscribe. Returns an unsubscribe function. */\n on<K extends CaveEventName>(event: K, handler: CaveEventHandler<CaveEventMap[K]>): () => void {\n return this.add(this.listeners, event as string, handler as AnyHandler)\n }\n\n /** Subscribe for a single dispatch. Returns an unsubscribe function. */\n once<K extends CaveEventName>(event: K, handler: CaveEventHandler<CaveEventMap[K]>): () => void {\n return this.add(this.onceListeners, event as string, handler as AnyHandler)\n }\n\n /** Unsubscribe a handler from both the persistent and one-shot sets. */\n off<K extends CaveEventName>(event: K, handler: CaveEventHandler<CaveEventMap[K]>): void {\n this.listeners.get(event as string)?.delete(handler as AnyHandler)\n this.onceListeners.get(event as string)?.delete(handler as AnyHandler)\n }\n\n /** Publish an event to all current subscribers. */\n emit<K extends CaveEventName>(event: K, payload: CaveEventMap[K]): void {\n const name = event as string\n\n const handlers = this.listeners.get(name)\n if (handlers?.size) {\n for (const handler of [...handlers]) {\n this.invoke(name, handler, payload)\n }\n }\n\n const onceHandlers = this.onceListeners.get(name)\n if (onceHandlers?.size) {\n const snapshot = [...onceHandlers]\n onceHandlers.clear()\n for (const handler of snapshot) {\n this.invoke(name, handler, payload)\n }\n }\n }\n\n /** Remove all handlers for one event, or for every event when omitted. */\n removeAllListeners(event?: CaveEventName): void {\n if (event) {\n this.listeners.delete(event as string)\n this.onceListeners.delete(event as string)\n return\n }\n this.listeners.clear()\n this.onceListeners.clear()\n }\n\n /** Number of subscribers for an event (persistent + one-shot). */\n listenerCount(event: CaveEventName): number {\n const name = event as string\n return (this.listeners.get(name)?.size ?? 0) + (this.onceListeners.get(name)?.size ?? 0)\n }\n\n private add(target: Map<string, Set<AnyHandler>>, name: string, handler: AnyHandler): () => void {\n let handlers = target.get(name)\n if (!handlers) {\n handlers = new Set()\n target.set(name, handlers)\n }\n handlers.add(handler)\n return () => {\n target.get(name)?.delete(handler)\n }\n }\n\n private invoke(name: string, handler: AnyHandler, payload: unknown): void {\n try {\n ;(handler as (value: unknown) => void)(payload)\n } catch (error) {\n logger.error(`Handler for \"${name}\" threw:`, error)\n }\n }\n}\n"],"names":["logger","createLogger","CaveEventBus","event","handler","payload","name","handlers","onceHandlers","snapshot","target","error"],"mappings":";AA4DA,MAAMA,IAASC,EAAa,QAAQ;AAW7B,MAAMC,EAAa;AAAA,EAChB,gCAAgB,IAAA;AAAA,EAChB,oCAAoB,IAAA;AAAA;AAAA,EAG5B,GAA4BC,GAAUC,GAAwD;AAC5F,WAAO,KAAK,IAAI,KAAK,WAAWD,GAAiBC,CAAqB;AAAA,EACxE;AAAA;AAAA,EAGA,KAA8BD,GAAUC,GAAwD;AAC9F,WAAO,KAAK,IAAI,KAAK,eAAeD,GAAiBC,CAAqB;AAAA,EAC5E;AAAA;AAAA,EAGA,IAA6BD,GAAUC,GAAkD;AACvF,SAAK,UAAU,IAAID,CAAe,GAAG,OAAOC,CAAqB,GACjE,KAAK,cAAc,IAAID,CAAe,GAAG,OAAOC,CAAqB;AAAA,EACvE;AAAA;AAAA,EAGA,KAA8BD,GAAUE,GAAgC;AACtE,UAAMC,IAAOH,GAEPI,IAAW,KAAK,UAAU,IAAID,CAAI;AACxC,QAAIC,GAAU;AACZ,iBAAWH,KAAW,CAAC,GAAGG,CAAQ;AAChC,aAAK,OAAOD,GAAMF,GAASC,CAAO;AAItC,UAAMG,IAAe,KAAK,cAAc,IAAIF,CAAI;AAChD,QAAIE,GAAc,MAAM;AACtB,YAAMC,IAAW,CAAC,GAAGD,CAAY;AACjC,MAAAA,EAAa,MAAA;AACb,iBAAWJ,KAAWK;AACpB,aAAK,OAAOH,GAAMF,GAASC,CAAO;AAAA,IAEtC;AAAA,EACF;AAAA;AAAA,EAGA,mBAAmBF,GAA6B;AAC9C,QAAIA,GAAO;AACT,WAAK,UAAU,OAAOA,CAAe,GACrC,KAAK,cAAc,OAAOA,CAAe;AACzC;AAAA,IACF;AACA,SAAK,UAAU,MAAA,GACf,KAAK,cAAc,MAAA;AAAA,EACrB;AAAA;AAAA,EAGA,cAAcA,GAA8B;AAC1C,UAAMG,IAAOH;AACb,YAAQ,KAAK,UAAU,IAAIG,CAAI,GAAG,QAAQ,MAAM,KAAK,cAAc,IAAIA,CAAI,GAAG,QAAQ;AAAA,EACxF;AAAA,EAEQ,IAAII,GAAsCJ,GAAcF,GAAiC;AAC/F,QAAIG,IAAWG,EAAO,IAAIJ,CAAI;AAC9B,WAAKC,MACHA,wBAAe,IAAA,GACfG,EAAO,IAAIJ,GAAMC,CAAQ,IAE3BA,EAAS,IAAIH,CAAO,GACb,MAAM;AACX,MAAAM,EAAO,IAAIJ,CAAI,GAAG,OAAOF,CAAO;AAAA,IAClC;AAAA,EACF;AAAA,EAEQ,OAAOE,GAAcF,GAAqBC,GAAwB;AACxE,QAAI;AACA,MAAAD,EAAqCC,CAAO;AAAA,IAChD,SAASM,GAAO;AACd,MAAAX,EAAO,MAAM,gBAAgBM,CAAI,YAAYK,CAAK;AAAA,IACpD;AAAA,EACF;AACF;"}
@@ -0,0 +1,13 @@
1
+ import type { CaveEventMap, CaveEventHandler, CaveEventName } from '../events/event-bus.js';
2
+ /**
3
+ * Subscribe to an SDK event for the lifetime of the component.
4
+ *
5
+ * The handler is kept in a ref, so it always sees the latest props/state
6
+ * without re-subscribing. That matters here: re-subscribing on every render
7
+ * would churn the bus during scene preloads, and a stale closure would read
8
+ * outdated scene state during a transition.
9
+ *
10
+ * Must be used inside a `<CaveWorldProvider>` (the viewers mount one).
11
+ */
12
+ export declare function useCaveEvent<K extends CaveEventName>(event: K, handler: CaveEventHandler<CaveEventMap[K]>): void;
13
+ //# sourceMappingURL=use-cave-event.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-cave-event.d.ts","sourceRoot":"","sources":["../../../core/hooks/use-cave-event.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAGxF;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,aAAa,EAClD,KAAK,EAAE,CAAC,EACR,OAAO,EAAE,gBAAgB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,GACzC,IAAI,CAWN"}
@@ -0,0 +1,12 @@
1
+ import { useRef as s, useEffect as n } from "react";
2
+ import { useCaveEventBus as f } from "../context/cave-world-context.js";
3
+ function v(t, e) {
4
+ const r = f(), u = s(e);
5
+ n(() => {
6
+ u.current = e;
7
+ }, [e]), n(() => r.on(t, (o) => u.current(o)), [r, t]);
8
+ }
9
+ export {
10
+ v as useCaveEvent
11
+ };
12
+ //# sourceMappingURL=use-cave-event.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-cave-event.js","sources":["../../../core/hooks/use-cave-event.ts"],"sourcesContent":["import { useEffect, useRef } from 'react'\nimport type { CaveEventMap, CaveEventHandler, CaveEventName } from '../events/event-bus'\nimport { useCaveEventBus } from '../context/cave-world-context'\n\n/**\n * Subscribe to an SDK event for the lifetime of the component.\n *\n * The handler is kept in a ref, so it always sees the latest props/state\n * without re-subscribing. That matters here: re-subscribing on every render\n * would churn the bus during scene preloads, and a stale closure would read\n * outdated scene state during a transition.\n *\n * Must be used inside a `<CaveWorldProvider>` (the viewers mount one).\n */\nexport function useCaveEvent<K extends CaveEventName>(\n event: K,\n handler: CaveEventHandler<CaveEventMap[K]>\n): void {\n const eventBus = useCaveEventBus()\n const handlerRef = useRef(handler)\n\n useEffect(() => {\n handlerRef.current = handler\n }, [handler])\n\n useEffect(() => {\n return eventBus.on(event, (payload) => handlerRef.current(payload))\n }, [eventBus, event])\n}\n"],"names":["useCaveEvent","event","handler","eventBus","useCaveEventBus","handlerRef","useRef","useEffect","payload"],"mappings":";;AAcO,SAASA,EACdC,GACAC,GACM;AACN,QAAMC,IAAWC,EAAA,GACXC,IAAaC,EAAOJ,CAAO;AAEjC,EAAAK,EAAU,MAAM;AACd,IAAAF,EAAW,UAAUH;AAAA,EACvB,GAAG,CAACA,CAAO,CAAC,GAEZK,EAAU,MACDJ,EAAS,GAAGF,GAAO,CAACO,MAAYH,EAAW,QAAQG,CAAO,CAAC,GACjE,CAACL,GAAUF,CAAK,CAAC;AACtB;"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * All user-visible copy in the built-in overlays.
3
+ *
4
+ * Every string the SDK renders lives here so a host can translate the default
5
+ * UI without replacing it via `render*` props. Pass a partial object to
6
+ * `messages` on the viewer components; it is deep-merged over the default
7
+ * locale, so overriding one string keeps the rest intact.
8
+ */
9
+ export interface CaveWorldMessages {
10
+ actionPanel: {
11
+ /** Small label above the destination list. */
12
+ eyebrow: string;
13
+ title: string;
14
+ /** Per-row sub-label for a selectable destination. */
15
+ itemEnter: string;
16
+ /** Per-row sub-label while a destination is still preloading. */
17
+ itemLoading: string;
18
+ /** Row label fallback when a destination has no resolvable name. */
19
+ unknownDestination: string;
20
+ footerAllLoading: string;
21
+ footerTapToSelect: string;
22
+ footerTapToConfirm: string;
23
+ footerKeyToConfirm: string;
24
+ footerKeysOrTap: string;
25
+ };
26
+ actions: {
27
+ viewDetail: string;
28
+ enterPortal: string;
29
+ };
30
+ connector: {
31
+ /** Panel row shown while the target scene is still downloading. */
32
+ loadingPanelLabel: string;
33
+ /** Destination row label while that specific target is loading. `{name}` is substituted. */
34
+ targetLoading: string;
35
+ /** Label text when no target metadata is available yet. */
36
+ fallbackLabel: string;
37
+ /** Wayfinding tag text while the target scene is preloading. */
38
+ labelPending: string;
39
+ };
40
+ detail: {
41
+ close: string;
42
+ untitled: string;
43
+ };
44
+ poi: {
45
+ /** Fallback billboard text when a POI has no `text.content`. */
46
+ defaultLabel: string;
47
+ };
48
+ loadError: {
49
+ configTitle: string;
50
+ splatTitle: string;
51
+ description: string;
52
+ retry: string;
53
+ exit: string;
54
+ };
55
+ helper: {
56
+ close: string;
57
+ keyboard: {
58
+ move: string;
59
+ look: string;
60
+ jump: string;
61
+ interact: string;
62
+ };
63
+ touch: {
64
+ move: string;
65
+ look: string;
66
+ interact: string;
67
+ };
68
+ };
69
+ }
70
+ export type PartialCaveWorldMessages = {
71
+ [K in keyof CaveWorldMessages]?: Partial<{
72
+ [P in keyof CaveWorldMessages[K]]: CaveWorldMessages[K][P] extends string ? string : Partial<CaveWorldMessages[K][P]>;
73
+ }>;
74
+ };
75
+ export declare const zhCN: CaveWorldMessages;
76
+ export declare const en: CaveWorldMessages;
77
+ export declare const DEFAULT_MESSAGES: CaveWorldMessages;
78
+ /** Deep-merge a partial override over the default locale (two levels deep). */
79
+ export declare function resolveMessages(overrides?: PartialCaveWorldMessages): CaveWorldMessages;
80
+ /** Substitute `{name}`-style placeholders in a message template. */
81
+ export declare function formatMessage(template: string, values: Record<string, string>): string;
82
+ //# sourceMappingURL=messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../../core/i18n/messages.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE;QACX,8CAA8C;QAC9C,OAAO,EAAE,MAAM,CAAA;QACf,KAAK,EAAE,MAAM,CAAA;QACb,sDAAsD;QACtD,SAAS,EAAE,MAAM,CAAA;QACjB,iEAAiE;QACjE,WAAW,EAAE,MAAM,CAAA;QACnB,oEAAoE;QACpE,kBAAkB,EAAE,MAAM,CAAA;QAC1B,gBAAgB,EAAE,MAAM,CAAA;QACxB,iBAAiB,EAAE,MAAM,CAAA;QACzB,kBAAkB,EAAE,MAAM,CAAA;QAC1B,kBAAkB,EAAE,MAAM,CAAA;QAC1B,eAAe,EAAE,MAAM,CAAA;KACxB,CAAA;IACD,OAAO,EAAE;QACP,UAAU,EAAE,MAAM,CAAA;QAClB,WAAW,EAAE,MAAM,CAAA;KACpB,CAAA;IACD,SAAS,EAAE;QACT,mEAAmE;QACnE,iBAAiB,EAAE,MAAM,CAAA;QACzB,4FAA4F;QAC5F,aAAa,EAAE,MAAM,CAAA;QACrB,2DAA2D;QAC3D,aAAa,EAAE,MAAM,CAAA;QACrB,gEAAgE;QAChE,YAAY,EAAE,MAAM,CAAA;KACrB,CAAA;IACD,MAAM,EAAE;QACN,KAAK,EAAE,MAAM,CAAA;QACb,QAAQ,EAAE,MAAM,CAAA;KACjB,CAAA;IACD,GAAG,EAAE;QACH,gEAAgE;QAChE,YAAY,EAAE,MAAM,CAAA;KACrB,CAAA;IACD,SAAS,EAAE;QACT,WAAW,EAAE,MAAM,CAAA;QACnB,UAAU,EAAE,MAAM,CAAA;QAClB,WAAW,EAAE,MAAM,CAAA;QACnB,KAAK,EAAE,MAAM,CAAA;QACb,IAAI,EAAE,MAAM,CAAA;KACb,CAAA;IACD,MAAM,EAAE;QACN,KAAK,EAAE,MAAM,CAAA;QACb,QAAQ,EAAE;YACR,IAAI,EAAE,MAAM,CAAA;YACZ,IAAI,EAAE,MAAM,CAAA;YACZ,IAAI,EAAE,MAAM,CAAA;YACZ,QAAQ,EAAE,MAAM,CAAA;SACjB,CAAA;QACD,KAAK,EAAE;YACL,IAAI,EAAE,MAAM,CAAA;YACZ,IAAI,EAAE,MAAM,CAAA;YACZ,QAAQ,EAAE,MAAM,CAAA;SACjB,CAAA;KACF,CAAA;CACF;AAED,MAAM,MAAM,wBAAwB,GAAG;KACpC,CAAC,IAAI,MAAM,iBAAiB,CAAC,CAAC,EAAE,OAAO,CAAC;SACtC,CAAC,IAAI,MAAM,iBAAiB,CAAC,CAAC,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,MAAM,GACrE,MAAM,GACN,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;KACrC,CAAC;CACH,CAAA;AAED,eAAO,MAAM,IAAI,EAAE,iBAmDlB,CAAA;AAED,eAAO,MAAM,EAAE,EAAE,iBAmDhB,CAAA;AAED,eAAO,MAAM,gBAAgB,mBAAO,CAAA;AAEpC,+EAA+E;AAC/E,wBAAgB,eAAe,CAAC,SAAS,CAAC,EAAE,wBAAwB,GAAG,iBAAiB,CAQvF;AAgBD,oEAAoE;AACpE,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAEtF"}
@@ -0,0 +1,131 @@
1
+ const l = {
2
+ actionPanel: {
3
+ eyebrow: "场景传送",
4
+ title: "选择目的地",
5
+ itemEnter: "进入",
6
+ itemLoading: "加载中",
7
+ unknownDestination: "未知场景",
8
+ footerAllLoading: "请等待场景加载",
9
+ footerTapToSelect: "点击选择",
10
+ footerTapToConfirm: "点击确认",
11
+ footerKeyToConfirm: "按 F 确认",
12
+ footerKeysOrTap: "数字键 / 点击"
13
+ },
14
+ actions: {
15
+ viewDetail: "查看详情",
16
+ enterPortal: "进入"
17
+ },
18
+ connector: {
19
+ loadingPanelLabel: "场景加载中…",
20
+ targetLoading: "{name}(加载中)",
21
+ fallbackLabel: "前方场景",
22
+ labelPending: "加载中"
23
+ },
24
+ detail: {
25
+ close: "关闭",
26
+ untitled: "-"
27
+ },
28
+ poi: {
29
+ defaultLabel: "标注"
30
+ },
31
+ loadError: {
32
+ configTitle: "场景数据加载失败",
33
+ splatTitle: "场景模型加载失败",
34
+ description: "网络似乎出了点问题,请检查网络后重试。",
35
+ retry: "重试",
36
+ exit: "返回"
37
+ },
38
+ helper: {
39
+ close: "关闭",
40
+ keyboard: {
41
+ move: "移动",
42
+ look: "视角",
43
+ jump: "跳跃",
44
+ interact: "交互"
45
+ },
46
+ touch: {
47
+ move: "拖动摇杆移动",
48
+ look: "滑动屏幕环顾",
49
+ interact: "点击标签交互"
50
+ }
51
+ }
52
+ }, s = {
53
+ actionPanel: {
54
+ eyebrow: "Travel",
55
+ title: "Choose a destination",
56
+ itemEnter: "Enter",
57
+ itemLoading: "Loading",
58
+ unknownDestination: "Unknown scene",
59
+ footerAllLoading: "Waiting for scenes to load",
60
+ footerTapToSelect: "Tap to select",
61
+ footerTapToConfirm: "Tap to confirm",
62
+ footerKeyToConfirm: "Press F to confirm",
63
+ footerKeysOrTap: "Number keys / tap"
64
+ },
65
+ actions: {
66
+ viewDetail: "View details",
67
+ enterPortal: "Enter"
68
+ },
69
+ connector: {
70
+ loadingPanelLabel: "Loading scene…",
71
+ targetLoading: "{name} (loading)",
72
+ fallbackLabel: "Scene ahead",
73
+ labelPending: "Loading"
74
+ },
75
+ detail: {
76
+ close: "Close",
77
+ untitled: "-"
78
+ },
79
+ poi: {
80
+ defaultLabel: "POI"
81
+ },
82
+ loadError: {
83
+ configTitle: "Failed to load scene data",
84
+ splatTitle: "Failed to load scene model",
85
+ description: "Something went wrong with the network. Check your connection and retry.",
86
+ retry: "Retry",
87
+ exit: "Back"
88
+ },
89
+ helper: {
90
+ close: "Close",
91
+ keyboard: {
92
+ move: "Move",
93
+ look: "Look",
94
+ jump: "Jump",
95
+ interact: "Interact"
96
+ },
97
+ touch: {
98
+ move: "Drag the joystick to move",
99
+ look: "Swipe to look around",
100
+ interact: "Tap a label to interact"
101
+ }
102
+ }
103
+ }, i = l;
104
+ function d(o) {
105
+ if (!o) return i;
106
+ const t = {};
107
+ for (const e of Object.keys(i))
108
+ t[e] = c(i[e], o[e]);
109
+ return t;
110
+ }
111
+ function c(o, t) {
112
+ if (!t) return o;
113
+ const e = { ...o };
114
+ for (const [n, a] of Object.entries(t)) {
115
+ if (a == null) continue;
116
+ const r = e[n];
117
+ e[n] = typeof a == "object" && typeof r == "object" && r != null ? { ...r, ...a } : a;
118
+ }
119
+ return e;
120
+ }
121
+ function f(o, t) {
122
+ return o.replace(/\{(\w+)\}/g, (e, n) => t[n] ?? e);
123
+ }
124
+ export {
125
+ i as DEFAULT_MESSAGES,
126
+ s as en,
127
+ f as formatMessage,
128
+ d as resolveMessages,
129
+ l as zhCN
130
+ };
131
+ //# sourceMappingURL=messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.js","sources":["../../../core/i18n/messages.ts"],"sourcesContent":["/**\n * All user-visible copy in the built-in overlays.\n *\n * Every string the SDK renders lives here so a host can translate the default\n * UI without replacing it via `render*` props. Pass a partial object to\n * `messages` on the viewer components; it is deep-merged over the default\n * locale, so overriding one string keeps the rest intact.\n */\nexport interface CaveWorldMessages {\n actionPanel: {\n /** Small label above the destination list. */\n eyebrow: string\n title: string\n /** Per-row sub-label for a selectable destination. */\n itemEnter: string\n /** Per-row sub-label while a destination is still preloading. */\n itemLoading: string\n /** Row label fallback when a destination has no resolvable name. */\n unknownDestination: string\n footerAllLoading: string\n footerTapToSelect: string\n footerTapToConfirm: string\n footerKeyToConfirm: string\n footerKeysOrTap: string\n }\n actions: {\n viewDetail: string\n enterPortal: string\n }\n connector: {\n /** Panel row shown while the target scene is still downloading. */\n loadingPanelLabel: string\n /** Destination row label while that specific target is loading. `{name}` is substituted. */\n targetLoading: string\n /** Label text when no target metadata is available yet. */\n fallbackLabel: string\n /** Wayfinding tag text while the target scene is preloading. */\n labelPending: string\n }\n detail: {\n close: string\n untitled: string\n }\n poi: {\n /** Fallback billboard text when a POI has no `text.content`. */\n defaultLabel: string\n }\n loadError: {\n configTitle: string\n splatTitle: string\n description: string\n retry: string\n exit: string\n }\n helper: {\n close: string\n keyboard: {\n move: string\n look: string\n jump: string\n interact: string\n }\n touch: {\n move: string\n look: string\n interact: string\n }\n }\n}\n\nexport type PartialCaveWorldMessages = {\n [K in keyof CaveWorldMessages]?: Partial<{\n [P in keyof CaveWorldMessages[K]]: CaveWorldMessages[K][P] extends string\n ? string\n : Partial<CaveWorldMessages[K][P]>\n }>\n}\n\nexport const zhCN: CaveWorldMessages = {\n actionPanel: {\n eyebrow: '场景传送',\n title: '选择目的地',\n itemEnter: '进入',\n itemLoading: '加载中',\n unknownDestination: '未知场景',\n footerAllLoading: '请等待场景加载',\n footerTapToSelect: '点击选择',\n footerTapToConfirm: '点击确认',\n footerKeyToConfirm: '按 F 确认',\n footerKeysOrTap: '数字键 / 点击'\n },\n actions: {\n viewDetail: '查看详情',\n enterPortal: '进入'\n },\n connector: {\n loadingPanelLabel: '场景加载中…',\n targetLoading: '{name}(加载中)',\n fallbackLabel: '前方场景',\n labelPending: '加载中'\n },\n detail: {\n close: '关闭',\n untitled: '-'\n },\n poi: {\n defaultLabel: '标注'\n },\n loadError: {\n configTitle: '场景数据加载失败',\n splatTitle: '场景模型加载失败',\n description: '网络似乎出了点问题,请检查网络后重试。',\n retry: '重试',\n exit: '返回'\n },\n helper: {\n close: '关闭',\n keyboard: {\n move: '移动',\n look: '视角',\n jump: '跳跃',\n interact: '交互'\n },\n touch: {\n move: '拖动摇杆移动',\n look: '滑动屏幕环顾',\n interact: '点击标签交互'\n }\n }\n}\n\nexport const en: CaveWorldMessages = {\n actionPanel: {\n eyebrow: 'Travel',\n title: 'Choose a destination',\n itemEnter: 'Enter',\n itemLoading: 'Loading',\n unknownDestination: 'Unknown scene',\n footerAllLoading: 'Waiting for scenes to load',\n footerTapToSelect: 'Tap to select',\n footerTapToConfirm: 'Tap to confirm',\n footerKeyToConfirm: 'Press F to confirm',\n footerKeysOrTap: 'Number keys / tap'\n },\n actions: {\n viewDetail: 'View details',\n enterPortal: 'Enter'\n },\n connector: {\n loadingPanelLabel: 'Loading scene…',\n targetLoading: '{name} (loading)',\n fallbackLabel: 'Scene ahead',\n labelPending: 'Loading'\n },\n detail: {\n close: 'Close',\n untitled: '-'\n },\n poi: {\n defaultLabel: 'POI'\n },\n loadError: {\n configTitle: 'Failed to load scene data',\n splatTitle: 'Failed to load scene model',\n description: 'Something went wrong with the network. Check your connection and retry.',\n retry: 'Retry',\n exit: 'Back'\n },\n helper: {\n close: 'Close',\n keyboard: {\n move: 'Move',\n look: 'Look',\n jump: 'Jump',\n interact: 'Interact'\n },\n touch: {\n move: 'Drag the joystick to move',\n look: 'Swipe to look around',\n interact: 'Tap a label to interact'\n }\n }\n}\n\nexport const DEFAULT_MESSAGES = zhCN\n\n/** Deep-merge a partial override over the default locale (two levels deep). */\nexport function resolveMessages(overrides?: PartialCaveWorldMessages): CaveWorldMessages {\n if (!overrides) return DEFAULT_MESSAGES\n\n const result = {} as CaveWorldMessages\n for (const key of Object.keys(DEFAULT_MESSAGES) as Array<keyof CaveWorldMessages>) {\n result[key] = mergeGroup(DEFAULT_MESSAGES[key], overrides[key]) as never\n }\n return result\n}\n\nfunction mergeGroup(base: object, override: object | undefined): object {\n if (!override) return base\n const merged: Record<string, unknown> = { ...base }\n for (const [key, value] of Object.entries(override)) {\n if (value == null) continue\n const baseValue = merged[key]\n merged[key] =\n typeof value === 'object' && typeof baseValue === 'object' && baseValue != null\n ? { ...baseValue, ...value }\n : value\n }\n return merged\n}\n\n/** Substitute `{name}`-style placeholders in a message template. */\nexport function formatMessage(template: string, values: Record<string, string>): string {\n return template.replace(/\\{(\\w+)\\}/g, (match, key: string) => values[key] ?? match)\n}\n"],"names":["zhCN","en","DEFAULT_MESSAGES","resolveMessages","overrides","result","key","mergeGroup","base","override","merged","value","baseValue","formatMessage","template","values","match"],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export { CaveEventBus, type CaveEventMap, type CaveEventName, type CaveEventHandler } from './events/event-bus.js';
2
+ export { ObjectRegistry, type ObjectRenderer, type ObjectRendererProps } from './registry/object-registry.js';
3
+ export { ComponentRegistry, type ObjectComponent, type ObjectComponentProps, type ComponentRegistryEntry, type ComponentRegistryOptions } from './registry/component-registry.js';
4
+ export { CaveWorldProvider, createCaveWorldStore, useCaveWorld, useCaveWorldStore, useCaveWorldStoreApi, useCaveWorldMessages, useCaveEventBus, useObjectRegistry, useComponentRegistry, type CaveWorldProviderProps, type CaveWorldServices, type CaveWorldState, type CaveWorldStoreApi, type CaveWorldInteraction, type SpaceLoadError } from './context/cave-world-context.js';
5
+ export { useCaveEvent } from './hooks/use-cave-event.js';
6
+ export { createLogger, setCaveWorldLogLevel, setCaveWorldLogSink, type CaveWorldLogLevel, type CaveWorldLogSink, type CaveWorldLogger } from './logging/logger.js';
7
+ export { CaveWorldError, isCaveWorldError, type CaveWorldErrorCode, type CaveWorldErrorOptions } from './errors.js';
8
+ export { DEFAULT_MESSAGES, zhCN as messagesZhCN, en as messagesEn, resolveMessages, formatMessage, type CaveWorldMessages, type PartialCaveWorldMessages } from './i18n/messages.js';
9
+ export { FALLBACK_LABEL_TEXT, type ConnectorLabelMode, type ConnectorLabelRenderer, type ConnectorLabelRendererProps, type ResolvedConnectorLabel, shouldShowConnectorLabel, resolveConnectorLabel, getPortalTargetsWithSpaces, computeLabelVisibility } from './connector-label/types.js';
10
+ export { isSpaceTransferReady, isConnectorPortalNavigable, resolveConnectorTransferStatus, getReadyPortalTargets, getConnectorPortalTargets, isPortalTargetReady } from './connector-label/readiness.js';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../core/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,YAAY,EACZ,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACtB,MAAM,oBAAoB,CAAA;AAG3B,OAAO,EACL,cAAc,EACd,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACzB,MAAM,4BAA4B,CAAA;AACnC,OAAO,EACL,iBAAiB,EACjB,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,EAC3B,KAAK,wBAAwB,EAC9B,MAAM,+BAA+B,CAAA;AAGtC,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,YAAY,EACZ,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACpB,eAAe,EACf,iBAAiB,EACjB,oBAAoB,EACpB,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EACzB,KAAK,cAAc,EACpB,MAAM,8BAA8B,CAAA;AAErC,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AAGrD,OAAO,EACL,YAAY,EACZ,oBAAoB,EACpB,mBAAmB,EACnB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACrB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAC3B,MAAM,UAAU,CAAA;AAGjB,OAAO,EACL,gBAAgB,EAChB,IAAI,IAAI,YAAY,EACpB,EAAE,IAAI,UAAU,EAChB,eAAe,EACf,aAAa,EACb,KAAK,iBAAiB,EACtB,KAAK,wBAAwB,EAC9B,MAAM,iBAAiB,CAAA;AAGxB,OAAO,EACL,mBAAmB,EACnB,KAAK,kBAAkB,EACvB,KAAK,sBAAsB,EAC3B,KAAK,2BAA2B,EAChC,KAAK,sBAAsB,EAC3B,wBAAwB,EACxB,qBAAqB,EACrB,0BAA0B,EAC1B,sBAAsB,EACvB,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EACL,oBAAoB,EACpB,0BAA0B,EAC1B,8BAA8B,EAC9B,qBAAqB,EACrB,yBAAyB,EACzB,mBAAmB,EACpB,MAAM,6BAA6B,CAAA"}