@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":"action-prompt.store.js","sources":["../../../explore/stores/action-prompt.store.ts"],"sourcesContent":["import { createStore, type StoreApi } from 'zustand'\nimport type { Vector3 } from '../../types'\n\n/** One selectable action offered to the player (detail, portal entry, …). */\nexport interface ActionDef {\n /** Stable identity, used as the React key. */\n id: string\n label: string\n /** Single key that triggers `onAction`, e.g. `'F'` or `'1'`. */\n shortcut?: string\n /** Shown but not selectable (e.g. destination still preloading). */\n disabled?: boolean\n onAction: () => void\n}\n\n/** `bubble` anchors in 3D next to the object; `panel` is a screen-space list. */\nexport type ActionPromptStyle = 'bubble' | 'panel'\n\nexport interface ActionPromptState {\n actions: ActionDef[]\n /** World position for `bubble` style; `null` selects the screen panel. */\n anchor: Vector3 | null\n style: ActionPromptStyle\n\n showActions: (actions: ActionDef[], anchor: Vector3 | null, style?: ActionPromptStyle) => void\n clearActions: () => void\n}\n\nexport type ActionPromptStoreApi = StoreApi<ActionPromptState>\n\n/** Create an action-prompt store. One per `CaveExploreProvider`. */\nexport function createActionPromptStore(): ActionPromptStoreApi {\n return createStore<ActionPromptState>((set) => ({\n actions: [],\n anchor: null,\n style: 'bubble',\n\n showActions: (actions, anchor, style = anchor ? 'bubble' : 'panel') =>\n set({ actions, anchor, style }),\n clearActions: () =>\n set((state) => (state.actions.length === 0 ? state : { actions: [], anchor: null }))\n }))\n}\n"],"names":["createActionPromptStore","createStore","set","actions","anchor","style","state"],"mappings":";AA+BO,SAASA,IAAgD;AAC9D,SAAOC,EAA+B,CAACC,OAAS;AAAA,IAC9C,SAAS,CAAA;AAAA,IACT,QAAQ;AAAA,IACR,OAAO;AAAA,IAEP,aAAa,CAACC,GAASC,GAAQC,IAAQD,IAAS,WAAW,YACzDF,EAAI,EAAE,SAAAC,GAAS,QAAAC,GAAQ,OAAAC,GAAO;AAAA,IAChC,cAAc,MACZH,EAAI,CAACI,MAAWA,EAAM,QAAQ,WAAW,IAAIA,IAAQ,EAAE,SAAS,CAAA,GAAI,QAAQ,MAAO;AAAA,EAAA,EACrF;AACJ;"}
@@ -0,0 +1,77 @@
1
+ import { type Mutate, type StoreApi } from 'zustand';
2
+ import type { CaveSpace, ConnectorDef, Matrix16 } from '../../types/index.js';
3
+ export type ViewMode = 'first-person' | 'third-person';
4
+ export interface RoomInfo {
5
+ roomId: string;
6
+ roomName: string;
7
+ players: {
8
+ playerId: string;
9
+ playerName: string;
10
+ isMe: boolean;
11
+ }[];
12
+ }
13
+ export interface CaveExploreState {
14
+ viewMode: ViewMode;
15
+ roomInfo?: RoomInfo;
16
+ showHelper: boolean;
17
+ /** Space the player is currently in (changes on every transition). */
18
+ activeSpaceId: string | undefined;
19
+ /** Loaded scene JSON per space id — includes the primary and its neighbors. */
20
+ connectedSpaces: Record<string, CaveSpace>;
21
+ /** World-space group matrix per space id, for seamless-aligned neighbors. */
22
+ spaceTransforms: Record<string, Matrix16>;
23
+ /** Connector the player is currently standing inside, if any. */
24
+ activeConnector: ConnectorDef | undefined;
25
+ /** Space ids whose base layer (splat + colliders) has reported ready. */
26
+ readySpaceIds: Record<string, true>;
27
+ /**
28
+ * `performance.now()`-relative timestamp before which all `connector:enter`
29
+ * events should be ignored. Set after a seamless transition to suppress the
30
+ * "ghost" enter fired by the target scene's matching connector (which the
31
+ * character is still standing inside).
32
+ */
33
+ connectorEnterSuppressUntil: number;
34
+ setViewMode: (viewMode: ViewMode) => void;
35
+ setRoomInfo: (modify: (roomInfo?: RoomInfo) => RoomInfo | undefined) => void;
36
+ setShowHelper: (visible: boolean) => void;
37
+ setActiveSpaceId: (id: string | undefined) => void;
38
+ setConnectedSpace: (id: string, space: CaveSpace) => void;
39
+ setSpaceTransform: (id: string, matrix: Matrix16) => void;
40
+ setActiveConnector: (connector: ConnectorDef | undefined) => void;
41
+ markSpaceReady: (id: string) => void;
42
+ setConnectorEnterSuppressUntil: (timestamp: number) => void;
43
+ /** Remove all spaces and transforms whose ids are NOT in `keepIds`. */
44
+ pruneConnectedSpaces: (keepIds: Set<string>) => void;
45
+ clearConnectedSpaces: () => void;
46
+ }
47
+ /**
48
+ * Store handle including the `subscribeWithSelector` overload, so callers can
49
+ * watch a single field (`subscribe(s => s.activeSpaceId, fn)`) instead of every
50
+ * write.
51
+ */
52
+ export type CaveExploreStoreApi = Mutate<StoreApi<CaveExploreState>, [
53
+ ['zustand/subscribeWithSelector', never]
54
+ ]>;
55
+ /**
56
+ * Create an exploration store.
57
+ *
58
+ * One store per `CaveExploreProvider`, never a module singleton: two viewers on
59
+ * the same page (or a remount) would otherwise share active-space and connector
60
+ * state and desync each other.
61
+ */
62
+ export declare function createCaveExploreStore(initial?: {
63
+ viewMode?: ViewMode;
64
+ }): CaveExploreStoreApi;
65
+ /**
66
+ * Whether `connector` belongs to the currently active space.
67
+ *
68
+ * Connector sensors only mount for the active scene, but during a transition
69
+ * the previous scene's sensors can still be mounted for a frame and fire
70
+ * spurious `connector:enter` / `connector:leave` events at the teleported
71
+ * character position. Event handlers use this (reference identity against the
72
+ * active space's connector list) to ignore connectors that aren't part of the
73
+ * active space — otherwise a portal teleport could show a stale previous-scene
74
+ * neighbor's name in the prompt panel.
75
+ */
76
+ export declare function isConnectorInActiveSpace(state: CaveExploreState, connector: ConnectorDef): boolean;
77
+ //# sourceMappingURL=cave-explore.store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cave-explore.store.d.ts","sourceRoot":"","sources":["../../../explore/stores/cave-explore.store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,MAAM,EAAE,KAAK,QAAQ,EAAE,MAAM,SAAS,CAAA;AAEjE,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAEpE,MAAM,MAAM,QAAQ,GAAG,cAAc,GAAG,cAAc,CAAA;AAEtD,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,EAAE,CAAA;CACnE;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,QAAQ,CAAA;IAClB,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,UAAU,EAAE,OAAO,CAAA;IAEnB,sEAAsE;IACtE,aAAa,EAAE,MAAM,GAAG,SAAS,CAAA;IACjC,+EAA+E;IAC/E,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IAC1C,6EAA6E;IAC7E,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;IACzC,iEAAiE;IACjE,eAAe,EAAE,YAAY,GAAG,SAAS,CAAA;IACzC,yEAAyE;IACzE,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;IAEnC;;;;;OAKG;IACH,2BAA2B,EAAE,MAAM,CAAA;IAEnC,WAAW,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,IAAI,CAAA;IACzC,WAAW,EAAE,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,QAAQ,KAAK,QAAQ,GAAG,SAAS,KAAK,IAAI,CAAA;IAC5E,aAAa,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;IAEzC,gBAAgB,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAA;IAClD,iBAAiB,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,KAAK,IAAI,CAAA;IACzD,iBAAiB,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,KAAK,IAAI,CAAA;IACzD,kBAAkB,EAAE,CAAC,SAAS,EAAE,YAAY,GAAG,SAAS,KAAK,IAAI,CAAA;IACjE,cAAc,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;IACpC,8BAA8B,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAA;IAC3D,uEAAuE;IACvE,oBAAoB,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,CAAA;IACpD,oBAAoB,EAAE,MAAM,IAAI,CAAA;CACjC;AAED;;;;GAIG;AACH,MAAM,MAAM,mBAAmB,GAAG,MAAM,CACtC,QAAQ,CAAC,gBAAgB,CAAC,EAC1B;IAAC,CAAC,+BAA+B,EAAE,KAAK,CAAC;CAAC,CAC3C,CAAA;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,QAAQ,CAAA;CAAO,GAAG,mBAAmB,CAoEjG;AAgBD;;;;;;;;;;GAUG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,gBAAgB,EACvB,SAAS,EAAE,YAAY,GACtB,OAAO,CAIT"}
@@ -0,0 +1,66 @@
1
+ import { createStore as S } from "zustand";
2
+ import { subscribeWithSelector as i } from "zustand/middleware";
3
+ function m(a = {}) {
4
+ return S(
5
+ i((n, o) => ({
6
+ viewMode: a.viewMode ?? "third-person",
7
+ roomInfo: void 0,
8
+ showHelper: !1,
9
+ activeSpaceId: void 0,
10
+ connectedSpaces: {},
11
+ spaceTransforms: {},
12
+ activeConnector: void 0,
13
+ readySpaceIds: {},
14
+ connectorEnterSuppressUntil: 0,
15
+ setViewMode: (e) => n({ viewMode: e }),
16
+ setRoomInfo: (e) => n({ roomInfo: e(o().roomInfo) }),
17
+ setShowHelper: (e) => n({ showHelper: e }),
18
+ setActiveSpaceId: (e) => n({ activeSpaceId: e }),
19
+ setConnectedSpace: (e, c) => n(
20
+ (r) => r.connectedSpaces[e] === c ? r : { connectedSpaces: { ...r.connectedSpaces, [e]: c } }
21
+ ),
22
+ setSpaceTransform: (e, c) => n((r) => {
23
+ const s = r.spaceTransforms[e];
24
+ return s && s.every((p, d) => p === c[d]) ? r : { spaceTransforms: { ...r.spaceTransforms, [e]: c } };
25
+ }),
26
+ setActiveConnector: (e) => n(
27
+ (c) => c.activeConnector === e ? c : { activeConnector: e }
28
+ ),
29
+ markSpaceReady: (e) => n(
30
+ (c) => c.readySpaceIds[e] ? c : { readySpaceIds: { ...c.readySpaceIds, [e]: !0 } }
31
+ ),
32
+ setConnectorEnterSuppressUntil: (e) => n({ connectorEnterSuppressUntil: e }),
33
+ pruneConnectedSpaces: (e) => n((c) => {
34
+ const r = t(c.connectedSpaces, e), s = t(c.spaceTransforms, e), p = t(c.readySpaceIds, e);
35
+ return !r && !s && !p ? c : {
36
+ connectedSpaces: r ?? c.connectedSpaces,
37
+ spaceTransforms: s ?? c.spaceTransforms,
38
+ readySpaceIds: p ?? c.readySpaceIds
39
+ };
40
+ }),
41
+ clearConnectedSpaces: () => n({
42
+ connectedSpaces: {},
43
+ spaceTransforms: {},
44
+ readySpaceIds: {},
45
+ activeConnector: void 0
46
+ })
47
+ }))
48
+ );
49
+ }
50
+ function t(a, n) {
51
+ const o = Object.keys(a);
52
+ if (o.every((c) => n.has(c))) return;
53
+ const e = {};
54
+ for (const c of o)
55
+ n.has(c) && (e[c] = a[c]);
56
+ return e;
57
+ }
58
+ function u(a, n) {
59
+ const { activeSpaceId: o, connectedSpaces: e } = a;
60
+ return o ? e[o]?.baseLayer?.connectors?.includes(n) ?? !1 : !1;
61
+ }
62
+ export {
63
+ m as createCaveExploreStore,
64
+ u as isConnectorInActiveSpace
65
+ };
66
+ //# sourceMappingURL=cave-explore.store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cave-explore.store.js","sources":["../../../explore/stores/cave-explore.store.ts"],"sourcesContent":["import { createStore, type Mutate, type StoreApi } from 'zustand'\nimport { subscribeWithSelector } from 'zustand/middleware'\nimport type { CaveSpace, ConnectorDef, Matrix16 } from '../../types'\n\nexport type ViewMode = 'first-person' | 'third-person'\n\nexport interface RoomInfo {\n roomId: string\n roomName: string\n players: { playerId: string; playerName: string; isMe: boolean }[]\n}\n\nexport interface CaveExploreState {\n viewMode: ViewMode\n roomInfo?: RoomInfo\n showHelper: boolean\n\n /** Space the player is currently in (changes on every transition). */\n activeSpaceId: string | undefined\n /** Loaded scene JSON per space id — includes the primary and its neighbors. */\n connectedSpaces: Record<string, CaveSpace>\n /** World-space group matrix per space id, for seamless-aligned neighbors. */\n spaceTransforms: Record<string, Matrix16>\n /** Connector the player is currently standing inside, if any. */\n activeConnector: ConnectorDef | undefined\n /** Space ids whose base layer (splat + colliders) has reported ready. */\n readySpaceIds: Record<string, true>\n\n /**\n * `performance.now()`-relative timestamp before which all `connector:enter`\n * events should be ignored. Set after a seamless transition to suppress the\n * \"ghost\" enter fired by the target scene's matching connector (which the\n * character is still standing inside).\n */\n connectorEnterSuppressUntil: number\n\n setViewMode: (viewMode: ViewMode) => void\n setRoomInfo: (modify: (roomInfo?: RoomInfo) => RoomInfo | undefined) => void\n setShowHelper: (visible: boolean) => void\n\n setActiveSpaceId: (id: string | undefined) => void\n setConnectedSpace: (id: string, space: CaveSpace) => void\n setSpaceTransform: (id: string, matrix: Matrix16) => void\n setActiveConnector: (connector: ConnectorDef | undefined) => void\n markSpaceReady: (id: string) => void\n setConnectorEnterSuppressUntil: (timestamp: number) => void\n /** Remove all spaces and transforms whose ids are NOT in `keepIds`. */\n pruneConnectedSpaces: (keepIds: Set<string>) => void\n clearConnectedSpaces: () => void\n}\n\n/**\n * Store handle including the `subscribeWithSelector` overload, so callers can\n * watch a single field (`subscribe(s => s.activeSpaceId, fn)`) instead of every\n * write.\n */\nexport type CaveExploreStoreApi = Mutate<\n StoreApi<CaveExploreState>,\n [['zustand/subscribeWithSelector', never]]\n>\n\n/**\n * Create an exploration store.\n *\n * One store per `CaveExploreProvider`, never a module singleton: two viewers on\n * the same page (or a remount) would otherwise share active-space and connector\n * state and desync each other.\n */\nexport function createCaveExploreStore(initial: { viewMode?: ViewMode } = {}): CaveExploreStoreApi {\n return createStore(\n subscribeWithSelector<CaveExploreState>((set, get) => ({\n viewMode: initial.viewMode ?? 'third-person',\n roomInfo: undefined,\n showHelper: false,\n\n activeSpaceId: undefined,\n connectedSpaces: {},\n spaceTransforms: {},\n activeConnector: undefined,\n readySpaceIds: {},\n connectorEnterSuppressUntil: 0,\n\n setViewMode: (viewMode) => set({ viewMode }),\n setRoomInfo: (modify) => set({ roomInfo: modify(get().roomInfo) }),\n setShowHelper: (visible) => set({ showHelper: visible }),\n\n setActiveSpaceId: (id) => set({ activeSpaceId: id }),\n setConnectedSpace: (id, space) =>\n set((state) =>\n state.connectedSpaces[id] === space\n ? state\n : { connectedSpaces: { ...state.connectedSpaces, [id]: space } }\n ),\n setSpaceTransform: (id, matrix) =>\n set((state) => {\n // Bail when the recomputed matrix is identical to the stored one.\n // The seamless-matrix effect re-runs on every neighbor load and would\n // otherwise replace the array reference each time, churning\n // spaceTransforms (and every downstream re-render) for no change.\n const prev = state.spaceTransforms[id]\n if (prev && prev.every((v, i) => v === matrix[i])) return state\n return { spaceTransforms: { ...state.spaceTransforms, [id]: matrix } }\n }),\n setActiveConnector: (connector) =>\n set((state) =>\n state.activeConnector === connector ? state : { activeConnector: connector }\n ),\n markSpaceReady: (id) =>\n set((state) =>\n state.readySpaceIds[id]\n ? state\n : { readySpaceIds: { ...state.readySpaceIds, [id]: true } }\n ),\n setConnectorEnterSuppressUntil: (timestamp) =>\n set({ connectorEnterSuppressUntil: timestamp }),\n pruneConnectedSpaces: (keepIds) =>\n set((state) => {\n const spaces = pick(state.connectedSpaces, keepIds)\n const transforms = pick(state.spaceTransforms, keepIds)\n const ready = pick(state.readySpaceIds, keepIds)\n if (!spaces && !transforms && !ready) return state\n return {\n connectedSpaces: spaces ?? state.connectedSpaces,\n spaceTransforms: transforms ?? state.spaceTransforms,\n readySpaceIds: ready ?? state.readySpaceIds\n }\n }),\n clearConnectedSpaces: () =>\n set({\n connectedSpaces: {},\n spaceTransforms: {},\n readySpaceIds: {},\n activeConnector: undefined\n })\n }))\n )\n}\n\n/**\n * Filter a record down to `keepIds`, returning `undefined` when nothing was\n * dropped so callers can keep the previous reference (and avoid re-renders).\n */\nfunction pick<T>(source: Record<string, T>, keepIds: Set<string>): Record<string, T> | undefined {\n const keys = Object.keys(source)\n if (keys.every((key) => keepIds.has(key))) return undefined\n const next: Record<string, T> = {}\n for (const key of keys) {\n if (keepIds.has(key)) next[key] = source[key]\n }\n return next\n}\n\n/**\n * Whether `connector` belongs to the currently active space.\n *\n * Connector sensors only mount for the active scene, but during a transition\n * the previous scene's sensors can still be mounted for a frame and fire\n * spurious `connector:enter` / `connector:leave` events at the teleported\n * character position. Event handlers use this (reference identity against the\n * active space's connector list) to ignore connectors that aren't part of the\n * active space — otherwise a portal teleport could show a stale previous-scene\n * neighbor's name in the prompt panel.\n */\nexport function isConnectorInActiveSpace(\n state: CaveExploreState,\n connector: ConnectorDef\n): boolean {\n const { activeSpaceId, connectedSpaces } = state\n if (!activeSpaceId) return false\n return connectedSpaces[activeSpaceId]?.baseLayer?.connectors?.includes(connector) ?? false\n}\n"],"names":["createCaveExploreStore","initial","createStore","subscribeWithSelector","set","get","viewMode","modify","visible","id","space","state","matrix","prev","v","i","connector","timestamp","keepIds","spaces","pick","transforms","ready","source","keys","key","next","isConnectorInActiveSpace","activeSpaceId","connectedSpaces"],"mappings":";;AAoEO,SAASA,EAAuBC,IAAmC,IAAyB;AACjG,SAAOC;AAAA,IACLC,EAAwC,CAACC,GAAKC,OAAS;AAAA,MACrD,UAAUJ,EAAQ,YAAY;AAAA,MAC9B,UAAU;AAAA,MACV,YAAY;AAAA,MAEZ,eAAe;AAAA,MACf,iBAAiB,CAAA;AAAA,MACjB,iBAAiB,CAAA;AAAA,MACjB,iBAAiB;AAAA,MACjB,eAAe,CAAA;AAAA,MACf,6BAA6B;AAAA,MAE7B,aAAa,CAACK,MAAaF,EAAI,EAAE,UAAAE,GAAU;AAAA,MAC3C,aAAa,CAACC,MAAWH,EAAI,EAAE,UAAUG,EAAOF,EAAA,EAAM,QAAQ,GAAG;AAAA,MACjE,eAAe,CAACG,MAAYJ,EAAI,EAAE,YAAYI,GAAS;AAAA,MAEvD,kBAAkB,CAACC,MAAOL,EAAI,EAAE,eAAeK,GAAI;AAAA,MACnD,mBAAmB,CAACA,GAAIC,MACtBN;AAAA,QAAI,CAACO,MACHA,EAAM,gBAAgBF,CAAE,MAAMC,IAC1BC,IACA,EAAE,iBAAiB,EAAE,GAAGA,EAAM,iBAAiB,CAACF,CAAE,GAAGC,IAAM;AAAA,MAAE;AAAA,MAErE,mBAAmB,CAACD,GAAIG,MACtBR,EAAI,CAACO,MAAU;AAKb,cAAME,IAAOF,EAAM,gBAAgBF,CAAE;AACrC,eAAII,KAAQA,EAAK,MAAM,CAACC,GAAGC,MAAMD,MAAMF,EAAOG,CAAC,CAAC,IAAUJ,IACnD,EAAE,iBAAiB,EAAE,GAAGA,EAAM,iBAAiB,CAACF,CAAE,GAAGG,IAAO;AAAA,MACrE,CAAC;AAAA,MACH,oBAAoB,CAACI,MACnBZ;AAAA,QAAI,CAACO,MACHA,EAAM,oBAAoBK,IAAYL,IAAQ,EAAE,iBAAiBK,EAAA;AAAA,MAAU;AAAA,MAE/E,gBAAgB,CAACP,MACfL;AAAA,QAAI,CAACO,MACHA,EAAM,cAAcF,CAAE,IAClBE,IACA,EAAE,eAAe,EAAE,GAAGA,EAAM,eAAe,CAACF,CAAE,GAAG,KAAK;AAAA,MAAE;AAAA,MAEhE,gCAAgC,CAACQ,MAC/Bb,EAAI,EAAE,6BAA6Ba,GAAW;AAAA,MAChD,sBAAsB,CAACC,MACrBd,EAAI,CAACO,MAAU;AACb,cAAMQ,IAASC,EAAKT,EAAM,iBAAiBO,CAAO,GAC5CG,IAAaD,EAAKT,EAAM,iBAAiBO,CAAO,GAChDI,IAAQF,EAAKT,EAAM,eAAeO,CAAO;AAC/C,eAAI,CAACC,KAAU,CAACE,KAAc,CAACC,IAAcX,IACtC;AAAA,UACL,iBAAiBQ,KAAUR,EAAM;AAAA,UACjC,iBAAiBU,KAAcV,EAAM;AAAA,UACrC,eAAeW,KAASX,EAAM;AAAA,QAAA;AAAA,MAElC,CAAC;AAAA,MACH,sBAAsB,MACpBP,EAAI;AAAA,QACF,iBAAiB,CAAA;AAAA,QACjB,iBAAiB,CAAA;AAAA,QACjB,eAAe,CAAA;AAAA,QACf,iBAAiB;AAAA,MAAA,CAClB;AAAA,IAAA,EACH;AAAA,EAAA;AAEN;AAMA,SAASgB,EAAQG,GAA2BL,GAAqD;AAC/F,QAAMM,IAAO,OAAO,KAAKD,CAAM;AAC/B,MAAIC,EAAK,MAAM,CAACC,MAAQP,EAAQ,IAAIO,CAAG,CAAC,EAAG;AAC3C,QAAMC,IAA0B,CAAA;AAChC,aAAWD,KAAOD;AAChB,IAAIN,EAAQ,IAAIO,CAAG,QAAQA,CAAG,IAAIF,EAAOE,CAAG;AAE9C,SAAOC;AACT;AAaO,SAASC,EACdhB,GACAK,GACS;AACT,QAAM,EAAE,eAAAY,GAAe,iBAAAC,EAAA,IAAoBlB;AAC3C,SAAKiB,IACEC,EAAgBD,CAAa,GAAG,WAAW,YAAY,SAASZ,CAAS,KAAK,KAD1D;AAE7B;"}
@@ -0,0 +1,35 @@
1
+ import { type ReactNode } from 'react';
2
+ import { type ActionPromptState, type ActionPromptStoreApi } from './action-prompt.store.js';
3
+ import { type CaveExploreState, type CaveExploreStoreApi, type ViewMode } from './cave-explore.store.js';
4
+ export interface CaveExploreStores {
5
+ exploreStore: CaveExploreStoreApi;
6
+ actionPromptStore: ActionPromptStoreApi;
7
+ }
8
+ export interface CaveExploreProviderProps {
9
+ children: ReactNode;
10
+ /** Initial camera mode for the local player. */
11
+ viewMode?: ViewMode;
12
+ /** Reuse stores created outside the tree (advanced / testing). */
13
+ stores?: CaveExploreStores;
14
+ }
15
+ /**
16
+ * Provides the exploration-scoped stores (active space, connectors, action
17
+ * prompts). Mounted by `CaveExplore`; mount it yourself only when composing the
18
+ * exploration pieces manually.
19
+ */
20
+ export declare function CaveExploreProvider({ children, viewMode, stores }: CaveExploreProviderProps): import("react").JSX.Element;
21
+ /** Subscribe to a slice of the exploration store. */
22
+ export declare function useCaveExplore<T>(selector: (state: CaveExploreState) => T): T;
23
+ /**
24
+ * Imperative handle to the exploration store.
25
+ *
26
+ * Prefer this over {@link useCaveExplore} inside `useFrame` loops and event
27
+ * handlers: reading through `getState()` avoids re-rendering the caller on
28
+ * every active-space or connector change.
29
+ */
30
+ export declare function useCaveExploreStore(): CaveExploreStoreApi;
31
+ /** Subscribe to a slice of the action-prompt store. */
32
+ export declare function useActionPrompt<T>(selector: (state: ActionPromptState) => T): T;
33
+ /** Imperative handle to the action-prompt store. */
34
+ export declare function useActionPromptStore(): ActionPromptStoreApi;
35
+ //# sourceMappingURL=explore-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explore-context.d.ts","sourceRoot":"","sources":["../../../explore/stores/explore-context.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAgD,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAGpF,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EAC1B,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACxB,KAAK,QAAQ,EACd,MAAM,sBAAsB,CAAA;AAE7B,MAAM,WAAW,iBAAiB;IAChC,YAAY,EAAE,mBAAmB,CAAA;IACjC,iBAAiB,EAAE,oBAAoB,CAAA;CACxC;AAID,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,SAAS,CAAA;IACnB,gDAAgD;IAChD,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,kEAAkE;IAClE,MAAM,CAAC,EAAE,iBAAiB,CAAA;CAC3B;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,wBAAwB,+BAS3F;AAaD,qDAAqD;AACrD,wBAAgB,cAAc,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,CAAC,GAAG,CAAC,CAE7E;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,IAAI,mBAAmB,CAEzD;AAED,uDAAuD;AACvD,wBAAgB,eAAe,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,CAAC,GAAG,CAAC,CAE/E;AAED,oDAAoD;AACpD,wBAAgB,oBAAoB,IAAI,oBAAoB,CAE3D"}
@@ -0,0 +1,43 @@
1
+ import { jsx as m } from "react/jsx-runtime";
2
+ import { useState as c, useMemo as a, useContext as s, createContext as x } from "react";
3
+ import { useStore as n } from "zustand";
4
+ import { CaveWorldError as S } from "../../core/errors.js";
5
+ import { createActionPromptStore as l } from "./action-prompt.store.js";
6
+ import { createCaveExploreStore as f } from "./cave-explore.store.js";
7
+ const u = x(null);
8
+ function h({ children: o, viewMode: i, stores: r }) {
9
+ const [t] = c(() => ({
10
+ exploreStore: f({ viewMode: i }),
11
+ actionPromptStore: l()
12
+ })), p = a(() => r ?? t, [r, t]);
13
+ return /* @__PURE__ */ m(u.Provider, { value: p, children: o });
14
+ }
15
+ function e() {
16
+ const o = s(u);
17
+ if (!o)
18
+ throw new S(
19
+ "MISSING_PROVIDER",
20
+ "Exploration hooks must be used within a <CaveExploreProvider> (mounted by <CaveExplore>)."
21
+ );
22
+ return o;
23
+ }
24
+ function A(o) {
25
+ return n(e().exploreStore, o);
26
+ }
27
+ function I() {
28
+ return e().exploreStore;
29
+ }
30
+ function b(o) {
31
+ return n(e().actionPromptStore, o);
32
+ }
33
+ function M() {
34
+ return e().actionPromptStore;
35
+ }
36
+ export {
37
+ h as CaveExploreProvider,
38
+ b as useActionPrompt,
39
+ M as useActionPromptStore,
40
+ A as useCaveExplore,
41
+ I as useCaveExploreStore
42
+ };
43
+ //# sourceMappingURL=explore-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explore-context.js","sources":["../../../explore/stores/explore-context.tsx"],"sourcesContent":["import { createContext, useContext, useMemo, useState, type ReactNode } from 'react'\nimport { useStore } from 'zustand'\nimport { CaveWorldError } from '../../core'\nimport {\n createActionPromptStore,\n type ActionPromptState,\n type ActionPromptStoreApi\n} from './action-prompt.store'\nimport {\n createCaveExploreStore,\n type CaveExploreState,\n type CaveExploreStoreApi,\n type ViewMode\n} from './cave-explore.store'\n\nexport interface CaveExploreStores {\n exploreStore: CaveExploreStoreApi\n actionPromptStore: ActionPromptStoreApi\n}\n\nconst CaveExploreContext = createContext<CaveExploreStores | null>(null)\n\nexport interface CaveExploreProviderProps {\n children: ReactNode\n /** Initial camera mode for the local player. */\n viewMode?: ViewMode\n /** Reuse stores created outside the tree (advanced / testing). */\n stores?: CaveExploreStores\n}\n\n/**\n * Provides the exploration-scoped stores (active space, connectors, action\n * prompts). Mounted by `CaveExplore`; mount it yourself only when composing the\n * exploration pieces manually.\n */\nexport function CaveExploreProvider({ children, viewMode, stores }: CaveExploreProviderProps) {\n const [ownStores] = useState<CaveExploreStores>(() => ({\n exploreStore: createCaveExploreStore({ viewMode }),\n actionPromptStore: createActionPromptStore()\n }))\n\n const value = useMemo(() => stores ?? ownStores, [stores, ownStores])\n\n return <CaveExploreContext.Provider value={value}>{children}</CaveExploreContext.Provider>\n}\n\nfunction useStores(): CaveExploreStores {\n const ctx = useContext(CaveExploreContext)\n if (!ctx) {\n throw new CaveWorldError(\n 'MISSING_PROVIDER',\n 'Exploration hooks must be used within a <CaveExploreProvider> (mounted by <CaveExplore>).'\n )\n }\n return ctx\n}\n\n/** Subscribe to a slice of the exploration store. */\nexport function useCaveExplore<T>(selector: (state: CaveExploreState) => T): T {\n return useStore(useStores().exploreStore, selector)\n}\n\n/**\n * Imperative handle to the exploration store.\n *\n * Prefer this over {@link useCaveExplore} inside `useFrame` loops and event\n * handlers: reading through `getState()` avoids re-rendering the caller on\n * every active-space or connector change.\n */\nexport function useCaveExploreStore(): CaveExploreStoreApi {\n return useStores().exploreStore\n}\n\n/** Subscribe to a slice of the action-prompt store. */\nexport function useActionPrompt<T>(selector: (state: ActionPromptState) => T): T {\n return useStore(useStores().actionPromptStore, selector)\n}\n\n/** Imperative handle to the action-prompt store. */\nexport function useActionPromptStore(): ActionPromptStoreApi {\n return useStores().actionPromptStore\n}\n"],"names":["CaveExploreContext","createContext","CaveExploreProvider","children","viewMode","stores","ownStores","useState","createCaveExploreStore","createActionPromptStore","value","useMemo","jsx","useStores","ctx","useContext","CaveWorldError","useCaveExplore","selector","useStore","useCaveExploreStore","useActionPrompt","useActionPromptStore"],"mappings":";;;;;;AAoBA,MAAMA,IAAqBC,EAAwC,IAAI;AAehE,SAASC,EAAoB,EAAE,UAAAC,GAAU,UAAAC,GAAU,QAAAC,KAAoC;AAC5F,QAAM,CAACC,CAAS,IAAIC,EAA4B,OAAO;AAAA,IACrD,cAAcC,EAAuB,EAAE,UAAAJ,GAAU;AAAA,IACjD,mBAAmBK,EAAA;AAAA,EAAwB,EAC3C,GAEIC,IAAQC,EAAQ,MAAMN,KAAUC,GAAW,CAACD,GAAQC,CAAS,CAAC;AAEpE,SAAO,gBAAAM,EAACZ,EAAmB,UAAnB,EAA4B,OAAAU,GAAe,UAAAP,EAAA,CAAS;AAC9D;AAEA,SAASU,IAA+B;AACtC,QAAMC,IAAMC,EAAWf,CAAkB;AACzC,MAAI,CAACc;AACH,UAAM,IAAIE;AAAA,MACR;AAAA,MACA;AAAA,IAAA;AAGJ,SAAOF;AACT;AAGO,SAASG,EAAkBC,GAA6C;AAC7E,SAAOC,EAASN,IAAY,cAAcK,CAAQ;AACpD;AASO,SAASE,IAA2C;AACzD,SAAOP,IAAY;AACrB;AAGO,SAASQ,EAAmBH,GAA8C;AAC/E,SAAOC,EAASN,IAAY,mBAAmBK,CAAQ;AACzD;AAGO,SAASI,IAA6C;AAC3D,SAAOT,IAAY;AACrB;"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Single source of truth for the default overlay stylesheet.
3
+ *
4
+ * Kept as a TypeScript string rather than a .css import so the SDK stays
5
+ * bundler-agnostic (no ?raw / css-loader requirement), and so the runtime
6
+ * injector and the published dist/styles.css can never drift apart — the Vite
7
+ * build writes that file from this constant.
8
+ */
9
+ export declare const CAVE_WORLD_CSS = "/**\n * @cavegiant/cave-world-r3f default UI theme.\n *\n * Every rule is namespaced under '.cw-*' so it cannot collide with host styles,\n * and every visual value is a '--cw-*' custom property so hosts can re-theme the\n * built-in overlays without replacing them.\n *\n * The defaults are declared on ':root' rather than on '.cw-root' on purpose: a\n * declaration on the element itself would shadow anything a host sets on an\n * ancestor, which would make theming silently do nothing.\n *\n * Load it either by importing '@cavegiant/cave-world-r3f/styles.css' or by letting\n * the SDK inject it at runtime (default; see 'injectStyles' on the viewers).\n */\n\n:root {\n --cw-font-sans:\n ui-sans-serif, system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial,\n 'PingFang SC', 'Microsoft YaHei', sans-serif;\n --cw-font-mono: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n\n /* Palette \u2014 warm gold primary, mint secondary, over cool dark glass. */\n --cw-color-text: #f5efe6;\n --cw-color-text-bright: #fffaf0;\n --cw-color-text-muted: rgb(245 239 230 / 45%);\n --cw-color-accent: #d4b87a;\n --cw-color-accent-soft: #e8d4a8;\n --cw-color-accent-warm: #d2a380;\n --cw-color-accent-mint: #78c8b0;\n --cw-color-key-text: #f5e6c0;\n --cw-color-shortcut: #ffd700;\n\n --cw-color-surface: rgb(22 24 34 / 82%);\n --cw-color-surface-solid: rgb(31 28 23 / 95%);\n --cw-color-scrim: rgb(0 0 0 / 50%);\n --cw-color-border: rgb(212 184 122 / 22%);\n --cw-color-border-strong: rgb(212 184 122 / 45%);\n --cw-color-border-hover: rgb(120 200 176 / 42%);\n --cw-color-label-surface: rgb(141 134 102 / 75%);\n --cw-color-label-border: rgb(210 163 128 / 80%);\n --cw-color-bubble-surface: rgb(0 0 0 / 70%);\n --cw-color-bubble-border: rgb(255 255 255 / 50%);\n\n /* Panel HUD decoration. */\n --cw-panel-fill: linear-gradient(\n 168deg,\n rgb(32 34 44 / 30%) 0%,\n rgb(22 24 34 / 34%) 50%,\n rgb(14 16 24 / 38%) 100%\n );\n --cw-panel-rim: conic-gradient(\n from 135deg at 50% 50%,\n rgb(212 184 122 / 52%) 0deg,\n rgb(120 200 180 / 26%) 90deg,\n rgb(212 184 122 / 46%) 200deg,\n rgb(120 200 180 / 16%) 300deg,\n rgb(212 184 122 / 52%) 360deg\n );\n /* Chamfered HUD silhouette. */\n --cw-panel-clip: polygon(\n 12px 0,\n calc(100% - 12px) 0,\n 100% 12px,\n 100% calc(100% - 12px),\n calc(100% - 12px) 100%,\n 12px 100%,\n 0 calc(100% - 12px),\n 0 12px\n );\n --cw-panel-grain: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 160 160' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.4'/%3E%3C/svg%3E\");\n\n --cw-radius-sm: 4px;\n --cw-radius-md: 8px;\n --cw-radius-lg: 16px;\n --cw-radius-pill: 999px;\n\n --cw-blur: 12px;\n --cw-blur-sm: 4px;\n --cw-shadow-panel:\n 0 8px 28px rgb(0 0 0 / 18%), 0 0 1px rgb(212 184 122 / 30%),\n inset 0 1px 0 rgb(255 248 230 / 14%), inset 0 -1px 0 rgb(0 0 0 / 12%);\n --cw-shadow-dialog: 0 12px 36px rgb(0 0 0 / 45%);\n --cw-shadow-tag: 0 2px 12px rgb(0 0 0 / 25%);\n --cw-text-shadow: 0 1px 6px rgb(0 0 0 / 80%);\n\n --cw-z-bubble: 4;\n --cw-z-panel: 5;\n --cw-z-detail: 6;\n --cw-z-helper: 7;\n --cw-z-error: 2147483000;\n}\n\n/* \u2500\u2500 Primitives \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n/*\n * '.cw-overlay-root' must stay layout-neutral: it is also applied to drei\n * 'Html' wrappers, which drei positions with inline styles. A width/height here\n * would stretch that wrapper to the canvas size and throw its\n * 'translate(-50%, -50%)' anchoring half a viewport off.\n */\n.cw-root,\n.cw-overlay-root {\n font-family: var(--cw-font-sans);\n color: var(--cw-color-text);\n}\n\n.cw-root {\n position: relative;\n width: 100%;\n height: 100%;\n}\n\n.cw-surface {\n background: var(--cw-color-surface);\n border: 1px solid var(--cw-color-border);\n border-radius: var(--cw-radius-md);\n box-shadow: var(--cw-shadow-panel);\n backdrop-filter: blur(var(--cw-blur));\n -webkit-backdrop-filter: blur(var(--cw-blur));\n}\n\n.cw-key {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 1.75rem;\n height: 1.75rem;\n padding: 0 0.375rem;\n font-family: var(--cw-font-mono);\n font-size: 0.6875rem;\n font-weight: 700;\n font-variant-numeric: tabular-nums;\n color: var(--cw-color-key-text);\n background: rgb(28 26 22 / 32%);\n border: 1px solid rgb(212 184 122 / 32%);\n border-radius: var(--cw-radius-sm);\n box-shadow:\n 0 1px 0 rgb(0 0 0 / 30%),\n inset 0 1px 0 rgb(255 248 230 / 12%);\n backdrop-filter: blur(var(--cw-blur-sm));\n -webkit-backdrop-filter: blur(var(--cw-blur-sm));\n}\n\n.cw-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 0.375rem;\n min-height: 2.5rem;\n padding: 0 1rem;\n font: inherit;\n font-size: 0.8125rem;\n font-weight: 500;\n color: rgb(255 255 255 / 80%);\n cursor: pointer;\n background: none;\n border: 1px solid rgb(255 255 255 / 25%);\n border-radius: var(--cw-radius-pill);\n transition:\n background-color 150ms ease,\n border-color 150ms ease,\n transform 100ms ease;\n}\n\n.cw-button:hover:not(:disabled) {\n border-color: rgb(255 255 255 / 45%);\n}\n\n.cw-button:active:not(:disabled) {\n transform: scale(0.95);\n}\n\n.cw-button:disabled {\n cursor: not-allowed;\n opacity: 0.55;\n}\n\n.cw-button--primary {\n font-weight: 500;\n color: #2a1c10;\n background: var(--cw-color-accent-warm);\n border-color: transparent;\n}\n\n.cw-button--primary:hover:not(:disabled) {\n background: color-mix(in srgb, var(--cw-color-accent-warm) 88%, white);\n border-color: transparent;\n}\n\n.cw-icon-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 1.75rem;\n height: 1.75rem;\n padding: 0;\n color: rgb(255 255 255 / 70%);\n cursor: pointer;\n background: none;\n border: 0;\n border-radius: var(--cw-radius-sm);\n}\n\n.cw-icon-button:hover {\n color: var(--cw-color-text-bright);\n background: rgb(255 255 255 / 8%);\n}\n\n.cw-spinner {\n display: inline-block;\n flex-shrink: 0;\n width: 0.875rem;\n height: 0.875rem;\n border: 2px solid rgb(255 255 255 / 25%);\n border-top-color: rgb(255 255 255 / 90%);\n border-radius: 50%;\n animation: cw-spin 0.8s linear infinite;\n}\n\n@keyframes cw-spin {\n to {\n transform: rotate(360deg);\n }\n}\n\n@keyframes cw-fade-in {\n from {\n opacity: 0;\n }\n}\n\n@keyframes cw-rise-in {\n from {\n opacity: 0;\n transform: translateY(4px);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .cw-spinner {\n animation-duration: 2s;\n }\n\n .cw-panel,\n .cw-panel__row {\n animation: none;\n }\n}\n\n/* \u2500\u2500 Action bubble (3D anchored single hint) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.cw-bubble-layer {\n display: flex;\n gap: 6px;\n white-space: nowrap;\n pointer-events: none;\n}\n\n.cw-bubble {\n padding: 2px 5px;\n font-size: 12px;\n color: #fff;\n background: var(--cw-color-bubble-surface);\n border: 1px solid var(--cw-color-bubble-border);\n border-radius: 5px;\n box-shadow: 0 4px 10px rgb(0 0 0 / 50%);\n}\n\n.cw-bubble__key {\n margin-right: 0.3em;\n font-weight: 600;\n color: var(--cw-color-shortcut);\n}\n\n/* \u2500\u2500 Action panel (screen-space destination picker) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.cw-panel-layer {\n position: absolute;\n inset: 0;\n z-index: var(--cw-z-panel);\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 1rem;\n pointer-events: none;\n}\n\n@media (min-width: 640px) {\n .cw-panel-layer {\n padding: 2rem;\n }\n}\n\n.cw-panel {\n position: relative;\n width: 100%;\n max-width: 17rem;\n pointer-events: auto;\n animation: cw-fade-in 200ms ease-out backwards;\n}\n\n/* Iridescent rim, revealed by the 1px inset of the chamfered frame above it. */\n.cw-panel__rim {\n position: absolute;\n inset: -1px;\n background: var(--cw-panel-rim);\n clip-path: var(--cw-panel-clip);\n opacity: 0.7;\n}\n\n.cw-panel__frame {\n position: relative;\n overflow: hidden;\n clip-path: var(--cw-panel-clip);\n backdrop-filter: blur(var(--cw-blur));\n -webkit-backdrop-filter: blur(var(--cw-blur));\n}\n\n.cw-panel__body {\n position: relative;\n padding: 1rem 1rem 0.875rem;\n background: var(--cw-panel-fill);\n border: 1px solid var(--cw-color-border);\n box-shadow: var(--cw-shadow-panel);\n}\n\n.cw-panel__grain {\n position: absolute;\n inset: 0;\n background-image: var(--cw-panel-grain);\n background-size: 160px 160px;\n opacity: 0.03;\n mix-blend-mode: overlay;\n pointer-events: none;\n}\n\n.cw-panel__hairline {\n position: absolute;\n inset-inline: 0;\n top: 0;\n height: 1px;\n background: linear-gradient(\n 90deg,\n transparent 0%,\n rgb(120 200 180 / 28%) 18%,\n rgb(245 220 160 / 70%) 50%,\n rgb(120 200 180 / 28%) 82%,\n transparent 100%\n );\n pointer-events: none;\n}\n\n/* Crosshair registration marks in each corner. */\n.cw-panel__mark {\n position: absolute;\n width: 10px;\n height: 10px;\n pointer-events: none;\n}\n\n.cw-panel__mark::before,\n.cw-panel__mark::after {\n position: absolute;\n background: rgb(212 184 122 / 70%);\n content: '';\n}\n\n.cw-panel__mark::before {\n inset-inline: 0;\n top: 50%;\n height: 1px;\n transform: translateY(-50%);\n}\n\n.cw-panel__mark::after {\n inset-block: 0;\n left: 50%;\n width: 1px;\n transform: translateX(-50%);\n}\n\n.cw-panel__mark--tl {\n top: 8px;\n left: 8px;\n}\n\n.cw-panel__mark--tr {\n top: 8px;\n right: 8px;\n}\n\n.cw-panel__mark--bl {\n bottom: 8px;\n left: 8px;\n}\n\n.cw-panel__mark--br {\n right: 8px;\n bottom: 8px;\n}\n\n.cw-panel__header {\n position: relative;\n margin-bottom: 0.75rem;\n padding-left: 0.125rem;\n}\n\n.cw-panel__eyebrow-row {\n display: flex;\n gap: 0.375rem;\n align-items: center;\n margin-bottom: 0.25rem;\n}\n\n.cw-panel__dot {\n width: 4px;\n height: 4px;\n background: var(--cw-color-accent-mint);\n border-radius: 50%;\n box-shadow: 0 0 5px rgb(120 200 176 / 50%);\n}\n\n.cw-panel__eyebrow {\n margin: 0;\n font-size: 0.5625rem;\n font-weight: 600;\n letter-spacing: 0.28em;\n text-transform: uppercase;\n color: var(--cw-color-accent-soft);\n text-shadow: 0 1px 4px rgb(0 0 0 / 80%);\n}\n\n.cw-panel__title {\n margin: 0;\n font-size: 1.0625rem;\n font-weight: 600;\n line-height: 1.2;\n letter-spacing: -0.01em;\n color: var(--cw-color-text);\n text-shadow: 0 1px 8px rgb(0 0 0 / 85%);\n}\n\n.cw-panel__divider {\n margin-top: 0.625rem;\n height: 1px;\n background: linear-gradient(\n 90deg,\n rgb(212 184 122 / 45%) 0%,\n rgb(120 200 180 / 22%) 45%,\n transparent 100%\n );\n}\n\n.cw-panel__list {\n position: relative;\n display: flex;\n flex-direction: column;\n gap: 0.375rem;\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.cw-panel__row {\n animation: cw-rise-in 200ms ease-out backwards;\n}\n\n.cw-panel__item {\n position: relative;\n display: flex;\n align-items: center;\n gap: 0.625rem;\n width: 100%;\n padding: 0.5rem 0.625rem;\n overflow: hidden;\n font: inherit;\n color: inherit;\n text-align: left;\n cursor: pointer;\n background: rgb(255 255 255 / 2%);\n border: 1px solid rgb(212 184 122 / 16%);\n border-radius: var(--cw-radius-sm);\n box-shadow: inset 0 1px 0 rgb(255 248 230 / 6%);\n transition:\n background-color 200ms ease,\n border-color 200ms ease;\n}\n\n.cw-panel__item:hover:not(:disabled),\n.cw-panel__item:focus-visible:not(:disabled) {\n background: rgb(120 200 176 / 10%);\n border-color: var(--cw-color-border-hover);\n outline: none;\n}\n\n.cw-panel__item:disabled {\n cursor: not-allowed;\n background: rgb(255 255 255 / 1%);\n border-color: rgb(212 184 122 / 10%);\n opacity: 0.55;\n}\n\n/* Accent bar that wipes in on hover. */\n.cw-panel__item-bar {\n position: absolute;\n inset-block: 0.25rem;\n left: 0;\n width: 2px;\n background: linear-gradient(180deg, var(--cw-color-accent-mint) 0%, var(--cw-color-accent) 100%);\n opacity: 0;\n transition: opacity 200ms ease;\n pointer-events: none;\n}\n\n.cw-panel__item:hover:not(:disabled) .cw-panel__item-bar,\n.cw-panel__item:focus-visible:not(:disabled) .cw-panel__item-bar {\n opacity: 1;\n}\n\n.cw-panel__item:hover:not(:disabled) .cw-key,\n.cw-panel__item:focus-visible:not(:disabled) .cw-key {\n border-color: rgb(120 200 176 / 50%);\n}\n\n.cw-panel__item-icon {\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n width: 1.75rem;\n height: 1.75rem;\n color: rgb(212 184 122 / 65%);\n background: rgb(255 255 255 / 3%);\n border: 1px solid rgb(212 184 122 / 22%);\n border-radius: var(--cw-radius-sm);\n transition:\n color 200ms ease,\n border-color 200ms ease;\n}\n\n.cw-panel__item:hover:not(:disabled) .cw-panel__item-icon {\n color: var(--cw-color-accent-mint);\n border-color: rgb(120 200 176 / 45%);\n}\n\n.cw-panel__item-text {\n position: relative;\n flex: 1 1 auto;\n min-width: 0;\n}\n\n.cw-panel__item-label {\n display: block;\n overflow: hidden;\n font-size: 0.8125rem;\n font-weight: 600;\n line-height: 1.35;\n text-overflow: ellipsis;\n white-space: nowrap;\n text-shadow: var(--cw-text-shadow);\n transition: color 200ms ease;\n}\n\n.cw-panel__item:hover:not(:disabled) .cw-panel__item-label {\n color: var(--cw-color-text-bright);\n}\n\n.cw-panel__item-hint {\n display: block;\n margin-top: 0.125rem;\n font-size: 0.5625rem;\n font-weight: 500;\n letter-spacing: 0.14em;\n text-transform: uppercase;\n color: rgb(212 184 122 / 55%);\n text-shadow: 0 1px 4px rgb(0 0 0 / 70%);\n transition: color 200ms ease;\n}\n\n.cw-panel__item:hover:not(:disabled) .cw-panel__item-hint {\n color: rgb(120 200 176 / 80%);\n}\n\n.cw-panel__item-chevron {\n display: inline-flex;\n flex-shrink: 0;\n color: rgb(212 184 122 / 45%);\n filter: drop-shadow(0 1px 3px rgb(0 0 0 / 60%));\n transition:\n color 200ms ease,\n transform 200ms ease;\n}\n\n.cw-panel__item:hover:not(:disabled) .cw-panel__item-chevron {\n color: var(--cw-color-accent-mint);\n transform: translateX(2px);\n}\n\n.cw-panel__footer {\n position: relative;\n display: flex;\n gap: 0.5rem;\n align-items: center;\n margin-top: 0.625rem;\n}\n\n.cw-panel__footer-rule {\n flex: 1 1 auto;\n height: 1px;\n background: linear-gradient(90deg, transparent, rgb(212 184 122 / 30%));\n}\n\n.cw-panel__footer-rule--end {\n background: linear-gradient(90deg, rgb(120 200 180 / 25%), transparent);\n}\n\n.cw-panel__footer-text {\n margin: 0;\n font-size: 0.5625rem;\n font-weight: 500;\n letter-spacing: 0.16em;\n text-transform: uppercase;\n color: var(--cw-color-text-muted);\n text-shadow: 0 1px 4px rgb(0 0 0 / 75%);\n}\n\n/* \u2500\u2500 Detail window \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.cw-detail {\n position: absolute;\n inset: 0 30% 0 0;\n z-index: var(--cw-z-detail);\n display: flex;\n flex-direction: column;\n background: var(--cw-color-scrim);\n}\n\n.cw-detail__header {\n display: flex;\n gap: 0.5rem;\n align-items: center;\n justify-content: space-between;\n padding: 1.25rem 1.25rem 0;\n font-size: 1rem;\n color: #fff;\n}\n\n.cw-detail__body {\n flex: 1 1 auto;\n padding: 0.75rem 1.25rem;\n overflow: hidden;\n}\n\n.cw-detail__grid {\n display: grid;\n grid-template-columns: repeat(12, minmax(0, 1fr));\n gap: 0.5rem;\n width: 100%;\n height: 100%;\n padding: 0.75rem;\n background: var(--cw-color-scrim);\n border-radius: var(--cw-radius-md);\n}\n\n.cw-detail__cell {\n position: relative;\n overflow: hidden;\n color: #fff;\n border: 1px dashed rgb(255 255 255 / 85%);\n border-radius: var(--cw-radius-sm);\n}\n\n.cw-detail__cell img,\n.cw-detail__cell video,\n.cw-detail__cell iframe {\n display: block;\n width: 100%;\n height: 100%;\n border: 0;\n object-fit: cover;\n}\n\n.cw-detail__text {\n padding: 0.25rem 0.75rem;\n white-space: pre-wrap;\n}\n\n.cw-detail__counter {\n align-self: center;\n margin-bottom: 0.75rem;\n padding: 0.375rem 1.5rem;\n font-size: 0.75rem;\n color: #fff;\n background: var(--cw-color-scrim);\n border-radius: var(--cw-radius-pill);\n}\n\n.cw-detail__thumbs {\n display: flex;\n gap: 0.75rem;\n margin: 0 1.25rem;\n padding-bottom: 0.5rem;\n overflow-x: auto;\n}\n\n.cw-detail__thumb {\n display: grid;\n grid-template-columns: repeat(12, minmax(0, 1fr));\n gap: 0.5rem;\n flex: 0 0 auto;\n width: 13.5rem;\n height: 7.625rem;\n padding: 0.75rem;\n cursor: pointer;\n background: rgb(0 0 0 / 30%);\n border: 1px solid transparent;\n border-radius: var(--cw-radius-md);\n}\n\n.cw-detail__thumb:hover,\n.cw-detail__thumb[aria-current='true'] {\n background: var(--cw-color-scrim);\n border-color: rgb(255 255 255 / 85%);\n}\n\n.cw-detail__thumb-cell {\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 0.75rem;\n color: rgb(255 255 255 / 50%);\n border: 1px dashed rgb(255 255 255 / 85%);\n border-radius: var(--cw-radius-sm);\n}\n\n/* \u2500\u2500 Explore helper (onboarding hints) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.cw-helper {\n position: absolute;\n inset: 0;\n z-index: var(--cw-z-helper);\n background: rgb(0 0 0 / 22%);\n backdrop-filter: blur(2px);\n -webkit-backdrop-filter: blur(2px);\n}\n\n.cw-helper__card {\n position: absolute;\n right: 0;\n bottom: 9rem;\n left: 0;\n display: flex;\n justify-content: center;\n}\n\n.cw-helper__inner {\n display: flex;\n flex-direction: column;\n gap: 1.25rem;\n max-width: 80%;\n padding: 1.25rem;\n}\n\n.cw-helper__hints {\n display: flex;\n flex-wrap: wrap;\n gap: 1.5rem;\n justify-content: center;\n}\n\n.cw-helper__hint {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n align-items: center;\n}\n\n.cw-helper__hint-desc {\n font-size: 0.75rem;\n color: rgb(245 239 230 / 62%);\n}\n\n.cw-helper__actions {\n display: flex;\n justify-content: flex-end;\n}\n\n/* \u2500\u2500 Load-error overlay \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.cw-error-layer {\n position: fixed;\n inset: 0;\n z-index: var(--cw-z-error);\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgb(0 0 0 / 70%);\n backdrop-filter: blur(var(--cw-blur-sm));\n -webkit-backdrop-filter: blur(var(--cw-blur-sm));\n}\n\n.cw-error {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n align-items: center;\n max-width: 20rem;\n margin: 0 1.5rem;\n padding: 1.75rem 1.5rem;\n text-align: center;\n background: var(--cw-color-surface-solid);\n border-radius: var(--cw-radius-lg);\n box-shadow: var(--cw-shadow-dialog);\n}\n\n.cw-error__badge {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 3rem;\n height: 3rem;\n font-size: 1.5rem;\n color: var(--cw-color-accent-warm);\n border: 2px solid var(--cw-color-accent-warm);\n border-radius: 50%;\n}\n\n.cw-error__title {\n margin: 0;\n font-size: 1rem;\n font-weight: 500;\n color: #fff;\n}\n\n.cw-error__message {\n margin: 0.25rem 0 0;\n font-size: 0.75rem;\n line-height: 1.25rem;\n color: rgb(255 255 255 / 60%);\n}\n\n.cw-error__actions {\n display: flex;\n flex-direction: column;\n gap: 0.625rem;\n width: 100%;\n}\n\n.cw-error__actions .cw-button {\n width: 100%;\n}\n\n/* \u2500\u2500 Connector label (3D wayfinding tag) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.cw-label {\n transition: opacity 150ms ease-out;\n pointer-events: none;\n}\n\n.cw-label__hit {\n pointer-events: auto;\n touch-action: manipulation;\n}\n\n.cw-label__tag {\n display: flex;\n align-items: center;\n gap: 0.375rem;\n padding: 0.375rem 0.75rem;\n font-size: 0.75rem;\n color: #fff;\n white-space: nowrap;\n background: var(--cw-color-label-surface);\n border: 1px solid var(--cw-color-label-border);\n border-radius: var(--cw-radius-pill);\n box-shadow: var(--cw-shadow-tag);\n backdrop-filter: blur(var(--cw-blur-sm));\n -webkit-backdrop-filter: blur(var(--cw-blur-sm));\n}\n\n.cw-label__tag--compact {\n justify-content: center;\n width: 2rem;\n height: 2rem;\n padding: 0;\n border-radius: 50%;\n}\n\n.cw-label__tag--interactive {\n cursor: pointer;\n}\n\n.cw-label__tag--pending {\n cursor: not-allowed;\n opacity: 0.55;\n filter: saturate(0.5);\n}\n\n.cw-label__text {\n max-width: 10rem;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n/* \u2500\u2500 Utilities \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n/*\n * Integrity probe. 'verifyCaveWorldStyles()' measures an offscreen element with\n * this class to tell whether this stylesheet is actually in effect: a host reset\n * that outranks single-class selectors (see the troubleshooting note in the\n * README) silently strips padding and borders from every overlay. Keep the two\n * values in sync with 'inject.ts'.\n */\n.cw-style-probe {\n position: absolute;\n top: -9999px;\n left: -9999px;\n padding-top: 7px;\n border-top: 3px solid transparent;\n}\n\n.cw-visually-hidden {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n}\n";
10
+ //# sourceMappingURL=cave-world-css.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cave-world-css.d.ts","sourceRoot":"","sources":["../../../explore/styles/cave-world-css.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,eAAO,MAAM,cAAc,qptBAk6B1B,CAAA"}