@dreamboard-games/ui-sdk 0.0.41

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 (533) hide show
  1. package/LICENSE +89 -0
  2. package/NOTICE +1 -0
  3. package/README.md +154 -0
  4. package/dist/components/ActionButton.d.ts +13 -0
  5. package/dist/components/ActionButton.d.ts.map +1 -0
  6. package/dist/components/ActionButton.js +14 -0
  7. package/dist/components/ActionPanel.d.ts +33 -0
  8. package/dist/components/ActionPanel.d.ts.map +1 -0
  9. package/dist/components/ActionPanel.js +148 -0
  10. package/dist/components/Card.d.ts +29 -0
  11. package/dist/components/Card.d.ts.map +1 -0
  12. package/dist/components/Card.js +220 -0
  13. package/dist/components/ChromeSuppressionContext.d.ts +7 -0
  14. package/dist/components/ChromeSuppressionContext.d.ts.map +1 -0
  15. package/dist/components/ChromeSuppressionContext.js +34 -0
  16. package/dist/components/CostDisplay.d.ts +22 -0
  17. package/dist/components/CostDisplay.d.ts.map +1 -0
  18. package/dist/components/CostDisplay.js +41 -0
  19. package/dist/components/DiceRoller.d.ts +30 -0
  20. package/dist/components/DiceRoller.d.ts.map +1 -0
  21. package/dist/components/DiceRoller.js +319 -0
  22. package/dist/components/Drawer.d.ts +19 -0
  23. package/dist/components/Drawer.d.ts.map +1 -0
  24. package/dist/components/Drawer.js +55 -0
  25. package/dist/components/ErrorBoundary.d.ts +24 -0
  26. package/dist/components/ErrorBoundary.d.ts.map +1 -0
  27. package/dist/components/ErrorBoundary.js +37 -0
  28. package/dist/components/GameEndDisplay.d.ts +27 -0
  29. package/dist/components/GameEndDisplay.d.ts.map +1 -0
  30. package/dist/components/GameEndDisplay.js +185 -0
  31. package/dist/components/GameSkeleton.d.ts +12 -0
  32. package/dist/components/GameSkeleton.d.ts.map +1 -0
  33. package/dist/components/GameSkeleton.js +54 -0
  34. package/dist/components/Hand.d.ts +99 -0
  35. package/dist/components/Hand.d.ts.map +1 -0
  36. package/dist/components/Hand.js +162 -0
  37. package/dist/components/HandDock.d.ts +35 -0
  38. package/dist/components/HandDock.d.ts.map +1 -0
  39. package/dist/components/HandDock.js +124 -0
  40. package/dist/components/InteractionForm.d.ts +50 -0
  41. package/dist/components/InteractionForm.d.ts.map +1 -0
  42. package/dist/components/InteractionForm.js +402 -0
  43. package/dist/components/MoreActions.d.ts +49 -0
  44. package/dist/components/MoreActions.d.ts.map +1 -0
  45. package/dist/components/MoreActions.js +64 -0
  46. package/dist/components/PhaseIndicator.d.ts +35 -0
  47. package/dist/components/PhaseIndicator.d.ts.map +1 -0
  48. package/dist/components/PhaseIndicator.js +212 -0
  49. package/dist/components/PlayArea.d.ts +28 -0
  50. package/dist/components/PlayArea.d.ts.map +1 -0
  51. package/dist/components/PlayArea.js +48 -0
  52. package/dist/components/PluginRuntime.d.ts +37 -0
  53. package/dist/components/PluginRuntime.d.ts.map +1 -0
  54. package/dist/components/PluginRuntime.js +47 -0
  55. package/dist/components/PrimaryActionButton.d.ts +98 -0
  56. package/dist/components/PrimaryActionButton.d.ts.map +1 -0
  57. package/dist/components/PrimaryActionButton.js +183 -0
  58. package/dist/components/PrimaryButton.d.ts +20 -0
  59. package/dist/components/PrimaryButton.d.ts.map +1 -0
  60. package/dist/components/PrimaryButton.js +5 -0
  61. package/dist/components/PromptDialogHost.d.ts +15 -0
  62. package/dist/components/PromptDialogHost.d.ts.map +1 -0
  63. package/dist/components/PromptDialogHost.js +22 -0
  64. package/dist/components/ResourceCounter.d.ts +38 -0
  65. package/dist/components/ResourceCounter.d.ts.map +1 -0
  66. package/dist/components/ResourceCounter.js +118 -0
  67. package/dist/components/ThemedButton.d.ts +12 -0
  68. package/dist/components/ThemedButton.d.ts.map +1 -0
  69. package/dist/components/ThemedButton.js +38 -0
  70. package/dist/components/Toast.d.ts +35 -0
  71. package/dist/components/Toast.d.ts.map +1 -0
  72. package/dist/components/Toast.js +116 -0
  73. package/dist/components/board/HexGrid.d.ts +344 -0
  74. package/dist/components/board/HexGrid.d.ts.map +1 -0
  75. package/dist/components/board/HexGrid.js +340 -0
  76. package/dist/components/board/NetworkGraph.d.ts +100 -0
  77. package/dist/components/board/NetworkGraph.d.ts.map +1 -0
  78. package/dist/components/board/NetworkGraph.js +123 -0
  79. package/dist/components/board/SlotSystem.d.ts +71 -0
  80. package/dist/components/board/SlotSystem.d.ts.map +1 -0
  81. package/dist/components/board/SlotSystem.js +87 -0
  82. package/dist/components/board/SquareGrid.d.ts +188 -0
  83. package/dist/components/board/SquareGrid.d.ts.map +1 -0
  84. package/dist/components/board/SquareGrid.js +328 -0
  85. package/dist/components/board/TrackBoard.d.ts +113 -0
  86. package/dist/components/board/TrackBoard.d.ts.map +1 -0
  87. package/dist/components/board/TrackBoard.js +135 -0
  88. package/dist/components/board/ZoneMap.d.ts +88 -0
  89. package/dist/components/board/ZoneMap.d.ts.map +1 -0
  90. package/dist/components/board/ZoneMap.js +133 -0
  91. package/dist/components/board/hex-board-view.d.ts +69 -0
  92. package/dist/components/board/hex-board-view.d.ts.map +1 -0
  93. package/dist/components/board/hex-board-view.js +60 -0
  94. package/dist/components/board/index.d.ts +23 -0
  95. package/dist/components/board/index.d.ts.map +1 -0
  96. package/dist/components/board/index.js +40 -0
  97. package/dist/components/board/interaction-accessibility.d.ts +5 -0
  98. package/dist/components/board/interaction-accessibility.d.ts.map +1 -0
  99. package/dist/components/board/interaction-accessibility.js +13 -0
  100. package/dist/components/board/target-layer.d.ts +13 -0
  101. package/dist/components/board/target-layer.d.ts.map +1 -0
  102. package/dist/components/board/target-layer.js +10 -0
  103. package/dist/components/card-render-content.type-test.d.ts +2 -0
  104. package/dist/components/card-render-content.type-test.d.ts.map +1 -0
  105. package/dist/components/card-render-content.type-test.js +1 -0
  106. package/dist/components/index.d.ts +34 -0
  107. package/dist/components/index.d.ts.map +1 -0
  108. package/dist/components/index.js +35 -0
  109. package/dist/components/interaction-dialog-behavior.d.ts +15 -0
  110. package/dist/components/interaction-dialog-behavior.d.ts.map +1 -0
  111. package/dist/components/interaction-dialog-behavior.js +9 -0
  112. package/dist/components/surfaces/BlockerSurface.d.ts +27 -0
  113. package/dist/components/surfaces/BlockerSurface.d.ts.map +1 -0
  114. package/dist/components/surfaces/BlockerSurface.js +38 -0
  115. package/dist/components/surfaces/BoardSurface.d.ts +77 -0
  116. package/dist/components/surfaces/BoardSurface.d.ts.map +1 -0
  117. package/dist/components/surfaces/BoardSurface.js +180 -0
  118. package/dist/components/surfaces/ChromeSurface.d.ts +29 -0
  119. package/dist/components/surfaces/ChromeSurface.d.ts.map +1 -0
  120. package/dist/components/surfaces/ChromeSurface.js +34 -0
  121. package/dist/components/surfaces/ExhaustivenessAudit.d.ts +32 -0
  122. package/dist/components/surfaces/ExhaustivenessAudit.d.ts.map +1 -0
  123. package/dist/components/surfaces/ExhaustivenessAudit.js +65 -0
  124. package/dist/components/surfaces/InboxSurface.d.ts +40 -0
  125. package/dist/components/surfaces/InboxSurface.d.ts.map +1 -0
  126. package/dist/components/surfaces/InboxSurface.js +99 -0
  127. package/dist/components/surfaces/MarketSurface.d.ts +62 -0
  128. package/dist/components/surfaces/MarketSurface.d.ts.map +1 -0
  129. package/dist/components/surfaces/MarketSurface.js +242 -0
  130. package/dist/components/surfaces/PanelSurface.d.ts +111 -0
  131. package/dist/components/surfaces/PanelSurface.d.ts.map +1 -0
  132. package/dist/components/surfaces/PanelSurface.js +180 -0
  133. package/dist/components/surfaces/PlayerCardsSurface.d.ts +104 -0
  134. package/dist/components/surfaces/PlayerCardsSurface.d.ts.map +1 -0
  135. package/dist/components/surfaces/PlayerCardsSurface.js +178 -0
  136. package/dist/components/surfaces/internal/CardZoneFollowUpForm.d.ts +7 -0
  137. package/dist/components/surfaces/internal/CardZoneFollowUpForm.d.ts.map +1 -0
  138. package/dist/components/surfaces/internal/CardZoneFollowUpForm.js +9 -0
  139. package/dist/components/surfaces/internal/DefaultInteractionButton.d.ts +71 -0
  140. package/dist/components/surfaces/internal/DefaultInteractionButton.d.ts.map +1 -0
  141. package/dist/components/surfaces/internal/DefaultInteractionButton.js +82 -0
  142. package/dist/components/surfaces/internal/useCardZoneInteractions.d.ts +21 -0
  143. package/dist/components/surfaces/internal/useCardZoneInteractions.d.ts.map +1 -0
  144. package/dist/components/surfaces/internal/useCardZoneInteractions.js +202 -0
  145. package/dist/components/surfaces/types.d.ts +59 -0
  146. package/dist/components/surfaces/types.d.ts.map +1 -0
  147. package/dist/components/surfaces/types.js +1 -0
  148. package/dist/context/ClientParamSchemaContext.d.ts +21 -0
  149. package/dist/context/ClientParamSchemaContext.d.ts.map +1 -0
  150. package/dist/context/ClientParamSchemaContext.js +12 -0
  151. package/dist/context/InteractionDraftContext.d.ts +69 -0
  152. package/dist/context/InteractionDraftContext.d.ts.map +1 -0
  153. package/dist/context/InteractionDraftContext.js +145 -0
  154. package/dist/context/PluginSessionContext.d.ts +33 -0
  155. package/dist/context/PluginSessionContext.d.ts.map +1 -0
  156. package/dist/context/PluginSessionContext.js +38 -0
  157. package/dist/context/PluginStateContext.d.ts +116 -0
  158. package/dist/context/PluginStateContext.d.ts.map +1 -0
  159. package/dist/context/PluginStateContext.js +186 -0
  160. package/dist/context/RuntimeContext.d.ts +49 -0
  161. package/dist/context/RuntimeContext.d.ts.map +1 -0
  162. package/dist/context/RuntimeContext.js +67 -0
  163. package/dist/defaults/components.d.ts +52 -0
  164. package/dist/defaults/components.d.ts.map +1 -0
  165. package/dist/defaults/components.js +159 -0
  166. package/dist/defaults/index.d.ts +2 -0
  167. package/dist/defaults/index.d.ts.map +1 -0
  168. package/dist/defaults/index.js +1 -0
  169. package/dist/errors/ValidationError.d.ts +10 -0
  170. package/dist/errors/ValidationError.d.ts.map +1 -0
  171. package/dist/errors/ValidationError.js +23 -0
  172. package/dist/helpers/cards.d.ts +3 -0
  173. package/dist/helpers/cards.d.ts.map +1 -0
  174. package/dist/helpers/cards.js +11 -0
  175. package/dist/helpers/track-board.d.ts +79 -0
  176. package/dist/helpers/track-board.d.ts.map +1 -0
  177. package/dist/helpers/track-board.js +56 -0
  178. package/dist/hooks/useActivePlayers.d.ts +16 -0
  179. package/dist/hooks/useActivePlayers.d.ts.map +1 -0
  180. package/dist/hooks/useActivePlayers.js +17 -0
  181. package/dist/hooks/useBoardInteractions.d.ts +110 -0
  182. package/dist/hooks/useBoardInteractions.d.ts.map +1 -0
  183. package/dist/hooks/useBoardInteractions.js +248 -0
  184. package/dist/hooks/useBoardTopology.d.ts +23 -0
  185. package/dist/hooks/useBoardTopology.d.ts.map +1 -0
  186. package/dist/hooks/useBoardTopology.js +128 -0
  187. package/dist/hooks/useCards.d.ts +3 -0
  188. package/dist/hooks/useCards.d.ts.map +1 -0
  189. package/dist/hooks/useCards.js +5 -0
  190. package/dist/hooks/useGameSelector.d.ts +13 -0
  191. package/dist/hooks/useGameSelector.d.ts.map +1 -0
  192. package/dist/hooks/useGameSelector.js +67 -0
  193. package/dist/hooks/useGameView.d.ts +6 -0
  194. package/dist/hooks/useGameView.d.ts.map +1 -0
  195. package/dist/hooks/useGameView.js +7 -0
  196. package/dist/hooks/useHandLayout.d.ts +120 -0
  197. package/dist/hooks/useHandLayout.d.ts.map +1 -0
  198. package/dist/hooks/useHandLayout.js +235 -0
  199. package/dist/hooks/useHexBoard.d.ts +19 -0
  200. package/dist/hooks/useHexBoard.d.ts.map +1 -0
  201. package/dist/hooks/useHexBoard.js +28 -0
  202. package/dist/hooks/useHexGrid.d.ts +56 -0
  203. package/dist/hooks/useHexGrid.d.ts.map +1 -0
  204. package/dist/hooks/useHexGrid.js +112 -0
  205. package/dist/hooks/useInteractionByKey.d.ts +29 -0
  206. package/dist/hooks/useInteractionByKey.d.ts.map +1 -0
  207. package/dist/hooks/useInteractionByKey.js +263 -0
  208. package/dist/hooks/useInteractionHandle.d.ts +103 -0
  209. package/dist/hooks/useInteractionHandle.d.ts.map +1 -0
  210. package/dist/hooks/useInteractionHandle.js +254 -0
  211. package/dist/hooks/useIsMobile.d.ts +7 -0
  212. package/dist/hooks/useIsMobile.d.ts.map +1 -0
  213. package/dist/hooks/useIsMobile.js +29 -0
  214. package/dist/hooks/useIsMyTurn.d.ts +6 -0
  215. package/dist/hooks/useIsMyTurn.d.ts.map +1 -0
  216. package/dist/hooks/useIsMyTurn.js +11 -0
  217. package/dist/hooks/useLobby.d.ts +28 -0
  218. package/dist/hooks/useLobby.d.ts.map +1 -0
  219. package/dist/hooks/useLobby.js +60 -0
  220. package/dist/hooks/useMe.d.ts +11 -0
  221. package/dist/hooks/useMe.d.ts.map +1 -0
  222. package/dist/hooks/useMe.js +32 -0
  223. package/dist/hooks/usePanZoom.d.ts +113 -0
  224. package/dist/hooks/usePanZoom.d.ts.map +1 -0
  225. package/dist/hooks/usePanZoom.js +165 -0
  226. package/dist/hooks/usePlayerInfo.d.ts +4 -0
  227. package/dist/hooks/usePlayerInfo.d.ts.map +1 -0
  228. package/dist/hooks/usePlayerInfo.js +21 -0
  229. package/dist/hooks/usePlayerTurnOrder.d.ts +15 -0
  230. package/dist/hooks/usePlayerTurnOrder.d.ts.map +1 -0
  231. package/dist/hooks/usePlayerTurnOrder.js +22 -0
  232. package/dist/hooks/usePluginRuntime.d.ts +45 -0
  233. package/dist/hooks/usePluginRuntime.d.ts.map +1 -0
  234. package/dist/hooks/usePluginRuntime.js +92 -0
  235. package/dist/hooks/useSeatInbox.d.ts +22 -0
  236. package/dist/hooks/useSeatInbox.d.ts.map +1 -0
  237. package/dist/hooks/useSeatInbox.js +43 -0
  238. package/dist/hooks/useSimultaneousPhase.d.ts +7 -0
  239. package/dist/hooks/useSimultaneousPhase.d.ts.map +1 -0
  240. package/dist/hooks/useSimultaneousPhase.js +8 -0
  241. package/dist/hooks/useSquareBoard.d.ts +21 -0
  242. package/dist/hooks/useSquareBoard.d.ts.map +1 -0
  243. package/dist/hooks/useSquareBoard.js +67 -0
  244. package/dist/hooks/useSquareGrid.d.ts +96 -0
  245. package/dist/hooks/useSquareGrid.d.ts.map +1 -0
  246. package/dist/hooks/useSquareGrid.js +152 -0
  247. package/dist/index.d.ts +30 -0
  248. package/dist/index.d.ts.map +1 -0
  249. package/dist/index.js +20 -0
  250. package/dist/internal/ui/alert.d.ts +8 -0
  251. package/dist/internal/ui/alert.d.ts.map +1 -0
  252. package/dist/internal/ui/alert.js +11 -0
  253. package/dist/internal/ui/button.d.ts +10 -0
  254. package/dist/internal/ui/button.d.ts.map +1 -0
  255. package/dist/internal/ui/button.js +21 -0
  256. package/dist/internal/ui/dialog.d.ts +16 -0
  257. package/dist/internal/ui/dialog.d.ts.map +1 -0
  258. package/dist/internal/ui/dialog.js +35 -0
  259. package/dist/internal/ui/input.d.ts +3 -0
  260. package/dist/internal/ui/input.d.ts.map +1 -0
  261. package/dist/internal/ui/input.js +5 -0
  262. package/dist/internal/ui/label.d.ts +4 -0
  263. package/dist/internal/ui/label.d.ts.map +1 -0
  264. package/dist/internal/ui/label.js +7 -0
  265. package/dist/internal/ui/select.d.ts +9 -0
  266. package/dist/internal/ui/select.d.ts.map +1 -0
  267. package/dist/internal/ui/select.js +23 -0
  268. package/dist/internal/ui/tooltip.d.ts +7 -0
  269. package/dist/internal/ui/tooltip.d.ts.map +1 -0
  270. package/dist/internal/ui/tooltip.js +16 -0
  271. package/dist/internal/ui/utils.d.ts +3 -0
  272. package/dist/internal/ui/utils.d.ts.map +1 -0
  273. package/dist/internal/ui/utils.js +4 -0
  274. package/dist/internal.d.ts +7 -0
  275. package/dist/internal.d.ts.map +1 -0
  276. package/dist/internal.js +4 -0
  277. package/dist/plugin-styles.css +246 -0
  278. package/dist/primitives/board.d.ts +29 -0
  279. package/dist/primitives/board.d.ts.map +1 -0
  280. package/dist/primitives/board.js +163 -0
  281. package/dist/primitives/game-ui-provider.d.ts +12 -0
  282. package/dist/primitives/game-ui-provider.d.ts.map +1 -0
  283. package/dist/primitives/game-ui-provider.js +7 -0
  284. package/dist/primitives/index.d.ts +8 -0
  285. package/dist/primitives/index.d.ts.map +1 -0
  286. package/dist/primitives/index.js +7 -0
  287. package/dist/primitives/interaction.d.ts +52 -0
  288. package/dist/primitives/interaction.d.ts.map +1 -0
  289. package/dist/primitives/interaction.js +250 -0
  290. package/dist/primitives/phase.d.ts +15 -0
  291. package/dist/primitives/phase.d.ts.map +1 -0
  292. package/dist/primitives/phase.js +18 -0
  293. package/dist/primitives/player-roster.d.ts +64 -0
  294. package/dist/primitives/player-roster.d.ts.map +1 -0
  295. package/dist/primitives/player-roster.js +149 -0
  296. package/dist/primitives/primitive-props.d.ts +15 -0
  297. package/dist/primitives/primitive-props.d.ts.map +1 -0
  298. package/dist/primitives/primitive-props.js +39 -0
  299. package/dist/primitives/prompt.d.ts +44 -0
  300. package/dist/primitives/prompt.d.ts.map +1 -0
  301. package/dist/primitives/prompt.js +101 -0
  302. package/dist/primitives/zone.d.ts +31 -0
  303. package/dist/primitives/zone.d.ts.map +1 -0
  304. package/dist/primitives/zone.js +58 -0
  305. package/dist/reducer.d.ts +21 -0
  306. package/dist/reducer.d.ts.map +1 -0
  307. package/dist/reducer.js +14 -0
  308. package/dist/runtime/createPluginRuntimeAPI.d.ts +67 -0
  309. package/dist/runtime/createPluginRuntimeAPI.d.ts.map +1 -0
  310. package/dist/runtime/createPluginRuntimeAPI.js +419 -0
  311. package/dist/theme/ThemeProvider.d.ts +98 -0
  312. package/dist/theme/ThemeProvider.d.ts.map +1 -0
  313. package/dist/theme/ThemeProvider.js +148 -0
  314. package/dist/theme/board.d.ts +42 -0
  315. package/dist/theme/board.d.ts.map +1 -0
  316. package/dist/theme/board.js +34 -0
  317. package/dist/theme/css-vars.d.ts +31 -0
  318. package/dist/theme/css-vars.d.ts.map +1 -0
  319. package/dist/theme/css-vars.js +88 -0
  320. package/dist/theme/derive.d.ts +66 -0
  321. package/dist/theme/derive.d.ts.map +1 -0
  322. package/dist/theme/derive.js +161 -0
  323. package/dist/theme/index.d.ts +22 -0
  324. package/dist/theme/index.d.ts.map +1 -0
  325. package/dist/theme/index.js +20 -0
  326. package/dist/theme/presets/arcade.d.ts +10 -0
  327. package/dist/theme/presets/arcade.d.ts.map +1 -0
  328. package/dist/theme/presets/arcade.js +257 -0
  329. package/dist/theme/presets/studio.d.ts +10 -0
  330. package/dist/theme/presets/studio.d.ts.map +1 -0
  331. package/dist/theme/presets/studio.js +257 -0
  332. package/dist/theme/presets/tabletop.d.ts +15 -0
  333. package/dist/theme/presets/tabletop.d.ts.map +1 -0
  334. package/dist/theme/presets/tabletop.js +262 -0
  335. package/dist/theme/tokens.d.ts +345 -0
  336. package/dist/theme/tokens.d.ts.map +1 -0
  337. package/dist/theme/tokens.js +57 -0
  338. package/dist/types/player-state.d.ts +337 -0
  339. package/dist/types/player-state.d.ts.map +1 -0
  340. package/dist/types/player-state.js +1 -0
  341. package/dist/types/plugin-state.d.ts +324 -0
  342. package/dist/types/plugin-state.d.ts.map +1 -0
  343. package/dist/types/plugin-state.js +1 -0
  344. package/dist/types/reducer-state.d.ts +10 -0
  345. package/dist/types/reducer-state.d.ts.map +1 -0
  346. package/dist/types/reducer-state.js +1 -0
  347. package/dist/types/runtime-api.d.ts +99 -0
  348. package/dist/types/runtime-api.d.ts.map +1 -0
  349. package/dist/types/runtime-api.js +1 -0
  350. package/dist/types/tiled-board.d.ts +187 -0
  351. package/dist/types/tiled-board.d.ts.map +1 -0
  352. package/dist/types/tiled-board.js +226 -0
  353. package/dist/ui-contract.d.ts +78 -0
  354. package/dist/ui-contract.d.ts.map +1 -0
  355. package/dist/ui-contract.js +15 -0
  356. package/dist/ui-sdk.d.ts +3409 -0
  357. package/dist/utils/interaction-inputs.d.ts +22 -0
  358. package/dist/utils/interaction-inputs.d.ts.map +1 -0
  359. package/dist/utils/interaction-inputs.js +219 -0
  360. package/dist/utils/interaction-labels.d.ts +4 -0
  361. package/dist/utils/interaction-labels.d.ts.map +1 -0
  362. package/dist/utils/interaction-labels.js +18 -0
  363. package/dist/utils/interaction-status.d.ts +15 -0
  364. package/dist/utils/interaction-status.d.ts.map +1 -0
  365. package/dist/utils/interaction-status.js +31 -0
  366. package/package.json +101 -0
  367. package/src/components/ActionButton.tsx +48 -0
  368. package/src/components/ActionPanel.tsx +310 -0
  369. package/src/components/Card.tsx +385 -0
  370. package/src/components/ChromeSuppressionContext.tsx +70 -0
  371. package/src/components/CostDisplay.test.tsx +23 -0
  372. package/src/components/CostDisplay.tsx +145 -0
  373. package/src/components/DiceRoller.tsx +601 -0
  374. package/src/components/Drawer.tsx +179 -0
  375. package/src/components/ErrorBoundary.tsx +119 -0
  376. package/src/components/GameEndDisplay.test.tsx +19 -0
  377. package/src/components/GameEndDisplay.tsx +398 -0
  378. package/src/components/GameSkeleton.tsx +260 -0
  379. package/src/components/Hand.tsx +387 -0
  380. package/src/components/HandDock.tsx +257 -0
  381. package/src/components/InteractionForm.test.tsx +303 -0
  382. package/src/components/InteractionForm.tsx +1029 -0
  383. package/src/components/MoreActions.test.tsx +93 -0
  384. package/src/components/MoreActions.tsx +143 -0
  385. package/src/components/PhaseIndicator.tsx +341 -0
  386. package/src/components/PlayArea.tsx +125 -0
  387. package/src/components/PluginRuntime.tsx +92 -0
  388. package/src/components/PrimaryActionButton.test.tsx +138 -0
  389. package/src/components/PrimaryActionButton.tsx +351 -0
  390. package/src/components/PrimaryButton.tsx +44 -0
  391. package/src/components/PromptDialogHost.tsx +92 -0
  392. package/src/components/ResourceCounter.test.tsx +29 -0
  393. package/src/components/ResourceCounter.tsx +275 -0
  394. package/src/components/ThemedButton.tsx +78 -0
  395. package/src/components/Toast.tsx +251 -0
  396. package/src/components/__fixtures__/ActionButton.fixture.tsx +234 -0
  397. package/src/components/__fixtures__/ActionPanel.fixture.tsx +298 -0
  398. package/src/components/__fixtures__/Card.fixture.tsx +185 -0
  399. package/src/components/__fixtures__/CostDisplay.fixture.tsx +156 -0
  400. package/src/components/__fixtures__/DiceRoller.fixture.tsx +435 -0
  401. package/src/components/__fixtures__/Drawer.fixture.tsx +113 -0
  402. package/src/components/__fixtures__/ErrorBoundary.fixture.tsx +82 -0
  403. package/src/components/__fixtures__/GameEndDisplay.fixture.tsx +188 -0
  404. package/src/components/__fixtures__/GameSkeleton.fixture.tsx +46 -0
  405. package/src/components/__fixtures__/Hand.fixture.tsx +522 -0
  406. package/src/components/__fixtures__/HexGrid.fixture.tsx +1181 -0
  407. package/src/components/__fixtures__/NetworkGraph.fixture.tsx +599 -0
  408. package/src/components/__fixtures__/PhaseIndicator.fixture.tsx +181 -0
  409. package/src/components/__fixtures__/PlayArea.fixture.tsx +221 -0
  410. package/src/components/__fixtures__/ResourceCounter.fixture.tsx +227 -0
  411. package/src/components/__fixtures__/SlotSystem.fixture.tsx +824 -0
  412. package/src/components/__fixtures__/SquareGrid.fixture.tsx +764 -0
  413. package/src/components/__fixtures__/Toast.fixture.tsx +97 -0
  414. package/src/components/__fixtures__/TrackBoard.fixture.tsx +685 -0
  415. package/src/components/__fixtures__/ZoneMap.fixture.tsx +754 -0
  416. package/src/components/board/HexGrid.tsx +1294 -0
  417. package/src/components/board/NetworkGraph.tsx +476 -0
  418. package/src/components/board/SlotSystem.tsx +339 -0
  419. package/src/components/board/SquareGrid.tsx +1165 -0
  420. package/src/components/board/TrackBoard.tsx +496 -0
  421. package/src/components/board/ZoneMap.tsx +448 -0
  422. package/src/components/board/hex-board-view.test.tsx +114 -0
  423. package/src/components/board/hex-board-view.ts +123 -0
  424. package/src/components/board/index.ts +142 -0
  425. package/src/components/board/interaction-accessibility.ts +21 -0
  426. package/src/components/board/target-layer-grids.test.tsx +420 -0
  427. package/src/components/board/target-layer.ts +30 -0
  428. package/src/components/card-render-content.type-test.ts +27 -0
  429. package/src/components/index.ts +208 -0
  430. package/src/components/interaction-dialog-behavior.test.ts +23 -0
  431. package/src/components/interaction-dialog-behavior.ts +22 -0
  432. package/src/components/surfaces/BlockerSurface.test.tsx +158 -0
  433. package/src/components/surfaces/BlockerSurface.tsx +127 -0
  434. package/src/components/surfaces/BoardSurface.tsx +340 -0
  435. package/src/components/surfaces/ChromeSurface.tsx +123 -0
  436. package/src/components/surfaces/ExhaustivenessAudit.tsx +91 -0
  437. package/src/components/surfaces/InboxSurface.test.tsx +149 -0
  438. package/src/components/surfaces/InboxSurface.tsx +245 -0
  439. package/src/components/surfaces/MarketSurface.tsx +544 -0
  440. package/src/components/surfaces/PanelSurface.test.tsx +496 -0
  441. package/src/components/surfaces/PanelSurface.tsx +458 -0
  442. package/src/components/surfaces/PlayerCardsSurface.tsx +525 -0
  443. package/src/components/surfaces/internal/CardZoneFollowUpForm.tsx +35 -0
  444. package/src/components/surfaces/internal/DefaultInteractionButton.tsx +219 -0
  445. package/src/components/surfaces/internal/useCardZoneInteractions.ts +311 -0
  446. package/src/components/surfaces/types.ts +100 -0
  447. package/src/context/ClientParamSchemaContext.tsx +44 -0
  448. package/src/context/InteractionDraftContext.tsx +204 -0
  449. package/src/context/PluginSessionContext.tsx +47 -0
  450. package/src/context/PluginStateContext.tsx +254 -0
  451. package/src/context/RuntimeContext.tsx +96 -0
  452. package/src/defaults/components.tsx +442 -0
  453. package/src/defaults/defaults.test.tsx +230 -0
  454. package/src/defaults/index.ts +1 -0
  455. package/src/errors/ValidationError.ts +29 -0
  456. package/src/helpers/cards.ts +19 -0
  457. package/src/helpers/track-board.ts +211 -0
  458. package/src/hooks/useActivePlayers.ts +19 -0
  459. package/src/hooks/useBoardInteractions.test.tsx +622 -0
  460. package/src/hooks/useBoardInteractions.ts +434 -0
  461. package/src/hooks/useBoardTopology.ts +316 -0
  462. package/src/hooks/useCards.test.tsx +129 -0
  463. package/src/hooks/useCards.ts +10 -0
  464. package/src/hooks/useGameSelector.ts +105 -0
  465. package/src/hooks/useGameView.ts +9 -0
  466. package/src/hooks/useHandLayout.ts +349 -0
  467. package/src/hooks/useHexBoard.ts +74 -0
  468. package/src/hooks/useHexGrid.ts +185 -0
  469. package/src/hooks/useInteractionByKey.ts +349 -0
  470. package/src/hooks/useInteractionHandle.ts +437 -0
  471. package/src/hooks/useIsMobile.ts +35 -0
  472. package/src/hooks/useIsMyTurn.test.tsx +99 -0
  473. package/src/hooks/useIsMyTurn.ts +15 -0
  474. package/src/hooks/useLobby.ts +76 -0
  475. package/src/hooks/useMe.ts +48 -0
  476. package/src/hooks/usePanZoom.ts +278 -0
  477. package/src/hooks/usePlayerInfo.ts +28 -0
  478. package/src/hooks/usePlayerTurnOrder.ts +23 -0
  479. package/src/hooks/usePluginRuntime.test.tsx +102 -0
  480. package/src/hooks/usePluginRuntime.ts +130 -0
  481. package/src/hooks/useSeatInbox.ts +61 -0
  482. package/src/hooks/useSimultaneousPhase.ts +10 -0
  483. package/src/hooks/useSquareBoard.ts +124 -0
  484. package/src/hooks/useSquareGrid.ts +328 -0
  485. package/src/index.test.ts +474 -0
  486. package/src/index.ts +148 -0
  487. package/src/internal/ui/alert.tsx +51 -0
  488. package/src/internal/ui/button.tsx +58 -0
  489. package/src/internal/ui/dialog.tsx +134 -0
  490. package/src/internal/ui/input.tsx +21 -0
  491. package/src/internal/ui/label.tsx +21 -0
  492. package/src/internal/ui/select.tsx +129 -0
  493. package/src/internal/ui/tooltip.tsx +54 -0
  494. package/src/internal/ui/utils.ts +5 -0
  495. package/src/internal.ts +18 -0
  496. package/src/plugin-styles.css +246 -0
  497. package/src/primitives/board.test.tsx +139 -0
  498. package/src/primitives/board.tsx +267 -0
  499. package/src/primitives/game-ui-provider.tsx +35 -0
  500. package/src/primitives/index.ts +83 -0
  501. package/src/primitives/interaction.test.tsx +420 -0
  502. package/src/primitives/interaction.tsx +405 -0
  503. package/src/primitives/phase.test.tsx +82 -0
  504. package/src/primitives/phase.tsx +43 -0
  505. package/src/primitives/player-roster.test.tsx +168 -0
  506. package/src/primitives/player-roster.tsx +301 -0
  507. package/src/primitives/primitive-props.tsx +82 -0
  508. package/src/primitives/prompt.test.tsx +159 -0
  509. package/src/primitives/prompt.tsx +203 -0
  510. package/src/primitives/zone.tsx +113 -0
  511. package/src/reducer.ts +42 -0
  512. package/src/runtime/createPluginRuntimeAPI.ts +605 -0
  513. package/src/theme/ThemeProvider.test.tsx +36 -0
  514. package/src/theme/ThemeProvider.tsx +252 -0
  515. package/src/theme/board.ts +61 -0
  516. package/src/theme/css-vars.ts +105 -0
  517. package/src/theme/derive.ts +240 -0
  518. package/src/theme/index.ts +61 -0
  519. package/src/theme/presets/arcade.ts +261 -0
  520. package/src/theme/presets/studio.ts +261 -0
  521. package/src/theme/presets/tabletop.ts +266 -0
  522. package/src/theme/theme.test.ts +258 -0
  523. package/src/theme/tokens.ts +392 -0
  524. package/src/types/player-state.ts +445 -0
  525. package/src/types/plugin-state.ts +407 -0
  526. package/src/types/reducer-state.ts +24 -0
  527. package/src/types/runtime-api.ts +114 -0
  528. package/src/types/tiled-board.ts +785 -0
  529. package/src/ui-contract.ts +168 -0
  530. package/src/utils/interaction-inputs.test.ts +109 -0
  531. package/src/utils/interaction-inputs.ts +331 -0
  532. package/src/utils/interaction-labels.ts +23 -0
  533. package/src/utils/interaction-status.ts +59 -0
@@ -0,0 +1,235 @@
1
+ import { useState, useRef, useEffect, useMemo, useCallback } from "react";
2
+ // Card dimensions used for fan offset and total-width calculations.
3
+ // These must match the rendered widths from `Card.tsx`'s `sizeClasses`
4
+ // at the `sm` Tailwind breakpoint (≥640px), since that's the size
5
+ // player decks render at on virtually all gameplay viewports. Older
6
+ // values here were ~30% smaller than what `Card` actually paints,
7
+ // which caused cards to overlap by 30+ pixels even when there was
8
+ // plenty of horizontal room in the hand container.
9
+ const CARD_DIMENSIONS = {
10
+ sm: { width: 80, height: 112 },
11
+ md: { width: 96, height: 144 },
12
+ lg: { width: 128, height: 192 },
13
+ };
14
+ const MIN_VISIBLE_PORTION = 16; // minimum visible pixels per card when overlapping
15
+ const HOVER_LIFT = 20; // pixels to lift on hover
16
+ const SELECTED_LIFT = 8; // pixels to lift when selected
17
+ const DRAWER_THRESHOLD_RATIO = 0.3; // if overlap is less than 30% of card width, use drawer
18
+ /**
19
+ * Hook for managing hand layout calculations and interactions.
20
+ *
21
+ * Provides container measurement, overlap calculations, drawer mode detection,
22
+ * and hover state management for card hand displays.
23
+ *
24
+ * @example
25
+ * ```tsx
26
+ * function MyHand({ cards, selectedIds }) {
27
+ * const {
28
+ * containerRef,
29
+ * cardsContainerRef,
30
+ * totalWidth,
31
+ * useDrawerMode,
32
+ * cardDimensions,
33
+ * hoveredIndex,
34
+ * handleMouseMove,
35
+ * handleMouseLeave,
36
+ * getCardPosition,
37
+ * constants,
38
+ * } = useHandLayout({
39
+ * cardCount: cards.length,
40
+ * cardSize: "md",
41
+ * layout: "overlap",
42
+ * });
43
+ *
44
+ * if (useDrawerMode) {
45
+ * return <MyDrawerUI cards={cards} />;
46
+ * }
47
+ *
48
+ * return (
49
+ * <div ref={containerRef}>
50
+ * <div
51
+ * ref={cardsContainerRef}
52
+ * style={{ width: totalWidth, height: cardDimensions.height + constants.hoverLift }}
53
+ * onMouseMove={handleMouseMove}
54
+ * onMouseLeave={handleMouseLeave}
55
+ * >
56
+ * {cards.map((card, index) => {
57
+ * const isHovered = hoveredIndex === index;
58
+ * const isSelected = selectedIds.includes(card.id);
59
+ * const position = getCardPosition(index, isHovered, isSelected);
60
+ *
61
+ * return (
62
+ * <div
63
+ * key={card.id}
64
+ * style={{
65
+ * position: "absolute",
66
+ * left: position.x,
67
+ * transform: `translateY(${position.y}px)`,
68
+ * zIndex: position.zIndex,
69
+ * }}
70
+ * >
71
+ * <MyCard card={card} />
72
+ * </div>
73
+ * );
74
+ * })}
75
+ * </div>
76
+ * </div>
77
+ * );
78
+ * }
79
+ * ```
80
+ */
81
+ export function useHandLayout({ cardCount, cardSize = "md", layout = "overlap", containerPadding = 32, }) {
82
+ const containerRef = useRef(null);
83
+ const cardsContainerRef = useRef(null);
84
+ const [containerWidth, setContainerWidth] = useState(0);
85
+ const [hoveredIndex, setHoveredIndex] = useState(null);
86
+ const cardDimensions = CARD_DIMENSIONS[cardSize];
87
+ // Measure container width with ResizeObserver
88
+ useEffect(() => {
89
+ const updateWidth = () => {
90
+ if (containerRef.current) {
91
+ setContainerWidth(containerRef.current.clientWidth - containerPadding);
92
+ }
93
+ };
94
+ updateWidth();
95
+ const observer = new ResizeObserver(updateWidth);
96
+ if (containerRef.current) {
97
+ observer.observe(containerRef.current);
98
+ }
99
+ return () => observer.disconnect();
100
+ }, [containerPadding]);
101
+ // Calculate adaptive overlap based on container width and card count
102
+ const { cardOffset, totalWidth, useDrawerMode } = useMemo(() => {
103
+ if (layout !== "overlap") {
104
+ return {
105
+ cardOffset: cardDimensions.width,
106
+ totalWidth: 0,
107
+ useDrawerMode: false,
108
+ };
109
+ }
110
+ if (cardCount === 0) {
111
+ return { cardOffset: 0, totalWidth: 0, useDrawerMode: false };
112
+ }
113
+ if (cardCount === 1) {
114
+ return {
115
+ cardOffset: cardDimensions.width,
116
+ totalWidth: cardDimensions.width,
117
+ useDrawerMode: false,
118
+ };
119
+ }
120
+ // Available width for overlap distribution
121
+ const availableWidth = containerWidth;
122
+ if (availableWidth <= 0) {
123
+ return {
124
+ cardOffset: cardDimensions.width,
125
+ totalWidth: cardDimensions.width * cardCount,
126
+ useDrawerMode: false,
127
+ };
128
+ }
129
+ // Calculate the offset needed to fit all cards
130
+ // Total width = cardWidth + (cardCount - 1) * offset
131
+ // So offset = (availableWidth - cardWidth) / (cardCount - 1)
132
+ const idealOffset = (availableWidth - cardDimensions.width) / (cardCount - 1);
133
+ // Clamp offset between minimum visible portion and full card width
134
+ const clampedOffset = Math.max(MIN_VISIBLE_PORTION, Math.min(cardDimensions.width, idealOffset));
135
+ // Calculate total width with this offset
136
+ const width = cardDimensions.width + (cardCount - 1) * clampedOffset;
137
+ // Determine if we should use drawer mode
138
+ // Use drawer if cards are overlapping too much (less than threshold of card visible)
139
+ const visiblePortion = clampedOffset / cardDimensions.width;
140
+ const shouldUseDrawer = visiblePortion < DRAWER_THRESHOLD_RATIO && cardCount > 2;
141
+ return {
142
+ cardOffset: clampedOffset,
143
+ totalWidth: width,
144
+ useDrawerMode: shouldUseDrawer,
145
+ };
146
+ }, [cardCount, containerWidth, layout, cardDimensions.width]);
147
+ // Calculate hovered card index based on mouse X position
148
+ // This allows hovering on adjacent cards even when one is popped up
149
+ const handleMouseMove = useCallback((e) => {
150
+ if (!cardsContainerRef.current ||
151
+ cardCount === 0 ||
152
+ layout === "spread" ||
153
+ layout === "stack") {
154
+ return;
155
+ }
156
+ const rect = cardsContainerRef.current.getBoundingClientRect();
157
+ const mouseX = e.clientX - rect.left;
158
+ let newHoveredIndex = null;
159
+ // Find which card the mouse is over based on X position
160
+ for (let i = cardCount - 1; i >= 0; i--) {
161
+ const cardLeft = i * cardOffset;
162
+ const cardRight = i === cardCount - 1
163
+ ? cardLeft + cardDimensions.width
164
+ : (i + 1) * cardOffset;
165
+ if (mouseX >= cardLeft && mouseX < cardRight) {
166
+ newHoveredIndex = i;
167
+ break;
168
+ }
169
+ }
170
+ // Check if mouse is in the rightmost card's full area
171
+ if (newHoveredIndex === null && mouseX >= 0 && mouseX < totalWidth) {
172
+ const lastCardLeft = (cardCount - 1) * cardOffset;
173
+ if (mouseX >= lastCardLeft) {
174
+ newHoveredIndex = cardCount - 1;
175
+ }
176
+ }
177
+ setHoveredIndex(newHoveredIndex);
178
+ }, [cardCount, cardOffset, totalWidth, layout, cardDimensions.width]);
179
+ const handleMouseLeave = useCallback(() => {
180
+ setHoveredIndex(null);
181
+ }, []);
182
+ // Calculate z-index: hovered > selected > position
183
+ const getZIndex = useCallback((index, isHovered, isSelected) => {
184
+ if (isHovered)
185
+ return 200;
186
+ if (isSelected)
187
+ return 100 + index;
188
+ return index;
189
+ }, []);
190
+ // Get card position props for different layouts
191
+ const getCardPosition = useCallback((index, isHovered, isSelected) => {
192
+ const zIndex = getZIndex(index, isHovered, isSelected);
193
+ if (layout === "stack") {
194
+ return {
195
+ x: index * 4,
196
+ y: 0,
197
+ zIndex,
198
+ transformOrigin: "bottom center",
199
+ };
200
+ }
201
+ if (layout === "spread") {
202
+ return {
203
+ x: 0,
204
+ y: 0,
205
+ zIndex,
206
+ transformOrigin: "bottom center",
207
+ };
208
+ }
209
+ // Overlap layout (default) - simple horizontal overlap with lift on hover/select
210
+ const yOffset = isHovered ? -HOVER_LIFT : isSelected ? -SELECTED_LIFT : 0;
211
+ return {
212
+ x: index * cardOffset,
213
+ y: yOffset,
214
+ zIndex,
215
+ transformOrigin: "bottom center",
216
+ };
217
+ }, [layout, cardOffset, getZIndex]);
218
+ return {
219
+ containerRef,
220
+ cardsContainerRef,
221
+ containerWidth,
222
+ cardOffset,
223
+ totalWidth,
224
+ useDrawerMode,
225
+ cardDimensions,
226
+ constants: {
227
+ hoverLift: HOVER_LIFT,
228
+ selectedLift: SELECTED_LIFT,
229
+ },
230
+ hoveredIndex,
231
+ handleMouseMove,
232
+ handleMouseLeave,
233
+ getCardPosition,
234
+ };
235
+ }
@@ -0,0 +1,19 @@
1
+ import type { AnyHexBoardInput, BoardSpaceIdOf, NormalizedHexBoard, NormalizedHexTileOf } from "../types/tiled-board.js";
2
+ export declare function useHexBoard<const TBoard extends AnyHexBoardInput>(board: TBoard): {
3
+ board: NormalizedHexBoard<TBoard>;
4
+ getTile: (tileId: BoardSpaceIdOf<TBoard>) => NormalizedHexTileOf<TBoard> | undefined;
5
+ getTileAt: (q: number, r: number) => NormalizedHexTileOf<TBoard> | undefined;
6
+ getNeighbors: (tileId: BoardSpaceIdOf<TBoard>) => Array<NormalizedHexTileOf<TBoard>>;
7
+ getTilesInRange: (centerTileId: BoardSpaceIdOf<TBoard>, range: number) => Array<NormalizedHexTileOf<TBoard>>;
8
+ layout: TBoard extends AnyHexBoardInput ? "hex" : "square";
9
+ getSpace: (spaceId: BoardSpaceIdOf<TBoard>) => (TBoard extends AnyHexBoardInput ? NormalizedHexTileOf<TBoard> : TBoard extends import("../index.js").AnySquareBoardInput ? import("../index.js").NormalizedSquareCellOf<TBoard> : never) | undefined;
10
+ getEdge: (edgeId: import("../index.js").BoardEdgeIdOf<TBoard>) => (TBoard extends AnyHexBoardInput ? import("../index.js").NormalizedHexEdgeOf<TBoard> : TBoard extends import("../index.js").AnySquareBoardInput ? import("../index.js").NormalizedSquareEdgeOf<TBoard> : never) | undefined;
11
+ getVertex: (vertexId: import("../index.js").BoardVertexIdOf<TBoard>) => (TBoard extends AnyHexBoardInput ? import("../index.js").NormalizedHexVertexOf<TBoard> : TBoard extends import("../index.js").AnySquareBoardInput ? import("../index.js").NormalizedSquareVertexOf<TBoard> : never) | undefined;
12
+ getAdjacentSpaces: (spaceId: BoardSpaceIdOf<TBoard>) => (TBoard extends AnyHexBoardInput ? NormalizedHexTileOf<TBoard> : TBoard extends import("../index.js").AnySquareBoardInput ? import("../index.js").NormalizedSquareCellOf<TBoard> : never)[];
13
+ getDistance: (fromSpaceId: BoardSpaceIdOf<TBoard>, toSpaceId: BoardSpaceIdOf<TBoard>) => number;
14
+ getSpaceEdges: (spaceId: BoardSpaceIdOf<TBoard>) => (TBoard extends AnyHexBoardInput ? import("../index.js").NormalizedHexEdgeOf<TBoard> : TBoard extends import("../index.js").AnySquareBoardInput ? import("../index.js").NormalizedSquareEdgeOf<TBoard> : never)[];
15
+ getSpaceVertices: (spaceId: BoardSpaceIdOf<TBoard>) => (TBoard extends AnyHexBoardInput ? import("../index.js").NormalizedHexVertexOf<TBoard> : TBoard extends import("../index.js").AnySquareBoardInput ? import("../index.js").NormalizedSquareVertexOf<TBoard> : never)[];
16
+ getIncidentEdges: (vertexId: import("../index.js").BoardVertexIdOf<TBoard>) => (TBoard extends AnyHexBoardInput ? import("../index.js").NormalizedHexEdgeOf<TBoard> : TBoard extends import("../index.js").AnySquareBoardInput ? import("../index.js").NormalizedSquareEdgeOf<TBoard> : never)[];
17
+ getIncidentVertices: (edgeId: import("../index.js").BoardEdgeIdOf<TBoard>) => (TBoard extends AnyHexBoardInput ? import("../index.js").NormalizedHexVertexOf<TBoard> : TBoard extends import("../index.js").AnySquareBoardInput ? import("../index.js").NormalizedSquareVertexOf<TBoard> : never)[];
18
+ };
19
+ //# sourceMappingURL=useHexBoard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useHexBoard.d.ts","sourceRoot":"","sources":["../../src/hooks/useHexBoard.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,gBAAgB,EAChB,cAAc,EACd,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,yBAAyB,CAAC;AAIjC,wBAAgB,WAAW,CAAC,KAAK,CAAC,MAAM,SAAS,gBAAgB,EAC/D,KAAK,EAAE,MAAM;;sBAmBF,cAAc,CAAC,MAAM,CAAC,KAEzB,mBAAmB,CAAC,MAAM,CAAC,GAC3B,SAAS;mBAMX,MAAM,KAAK,MAAM,KAEf,mBAAmB,CAAC,MAAM,CAAC,GAC3B,SAAS;2BAMN,cAAc,CAAC,MAAM,CAAC,KACgB,KAAK,CAChD,mBAAmB,CAAC,MAAM,CAAC,CAC5B;oCAMY,cAAc,CAAC,MAAM,CAAC,SAAS,MAAM,KAG7C,KAAK,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;;;;;;;;;;;EAa5C"}
@@ -0,0 +1,28 @@
1
+ import { useCallback, useMemo } from "react";
2
+ import { normalizeHexBoardInput } from "../types/tiled-board.js";
3
+ import { useBoardTopology } from "./useBoardTopology.js";
4
+ export function useHexBoard(board) {
5
+ const normalizedBoard = useMemo(() => normalizeHexBoardInput(board), [board]);
6
+ const topology = useBoardTopology(board);
7
+ const tileByCoordinate = useMemo(() => new Map(normalizedBoard.tiles.map((tile) => [`${tile.q},${tile.r}`, tile])), [normalizedBoard.tiles]);
8
+ const getTile = useCallback((tileId) => {
9
+ return topology.getSpace(tileId);
10
+ }, [topology]);
11
+ const getTileAt = useCallback((q, r) => {
12
+ return tileByCoordinate.get(`${q},${r}`);
13
+ }, [tileByCoordinate]);
14
+ const getNeighbors = useCallback((tileId) => {
15
+ return topology.getAdjacentSpaces(tileId);
16
+ }, [topology]);
17
+ const getTilesInRange = useCallback((centerTileId, range) => {
18
+ return normalizedBoard.tiles.filter((tile) => topology.getDistance(centerTileId, tile.id) <= range);
19
+ }, [normalizedBoard.tiles, topology]);
20
+ return {
21
+ ...topology,
22
+ board: normalizedBoard,
23
+ getTile,
24
+ getTileAt,
25
+ getNeighbors,
26
+ getTilesInRange,
27
+ };
28
+ }
@@ -0,0 +1,56 @@
1
+ /**
2
+ * useHexGrid hook - Headless logic for hex grid games
3
+ *
4
+ * Provides utilities for:
5
+ * - Coordinate conversion and neighbor finding
6
+ * - Distance calculations
7
+ * - Tile lookups
8
+ *
9
+ * @example
10
+ * ```tsx
11
+ * const { getNeighbors, getDistance, getTile } = useHexGrid(tiles);
12
+ *
13
+ * // Find all adjacent tiles
14
+ * const neighbors = getNeighbors('center');
15
+ *
16
+ * // Check if two tiles are adjacent
17
+ * const isAdjacent = getDistance('tile1', 'tile2') === 1;
18
+ * ```
19
+ */
20
+ export interface HexTileData {
21
+ /** Unique tile identifier */
22
+ id: string;
23
+ /** Axial coordinate Q */
24
+ q: number;
25
+ /** Axial coordinate R */
26
+ r: number;
27
+ /** Tile type */
28
+ type?: string;
29
+ /** Additional data */
30
+ data?: Record<string, unknown>;
31
+ }
32
+ export interface UseHexGridReturn {
33
+ /** Get a tile by ID */
34
+ getTile: (tileId: string) => HexTileData | undefined;
35
+ /** Get a tile by coordinates */
36
+ getTileAt: (q: number, r: number) => HexTileData | undefined;
37
+ /** Get neighboring tiles */
38
+ getNeighbors: (tileId: string) => HexTileData[];
39
+ /** Get distance between two tiles */
40
+ getDistance: (fromId: string, toId: string) => number;
41
+ /** Get all tiles within a range */
42
+ getHexesInRange: (centerId: string, range: number) => HexTileData[];
43
+ /** Convert axial to cube coordinates */
44
+ axialToCube: (q: number, r: number) => {
45
+ x: number;
46
+ y: number;
47
+ z: number;
48
+ };
49
+ /** Convert cube to axial coordinates */
50
+ cubeToAxial: (x: number, y: number, z: number) => {
51
+ q: number;
52
+ r: number;
53
+ };
54
+ }
55
+ export declare function useHexGrid(tiles: HexTileData[]): UseHexGridReturn;
56
+ //# sourceMappingURL=useHexGrid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useHexGrid.d.ts","sourceRoot":"","sources":["../../src/hooks/useHexGrid.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAQH,MAAM,WAAW,WAAW;IAC1B,6BAA6B;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,yBAAyB;IACzB,CAAC,EAAE,MAAM,CAAC;IACV,yBAAyB;IACzB,CAAC,EAAE,MAAM,CAAC;IACV,gBAAgB;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sBAAsB;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,gBAAgB;IAC/B,uBAAuB;IACvB,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,WAAW,GAAG,SAAS,CAAC;IACrD,gCAAgC;IAChC,SAAS,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,WAAW,GAAG,SAAS,CAAC;IAC7D,4BAA4B;IAC5B,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,WAAW,EAAE,CAAC;IAChD,qCAAqC;IACrC,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IACtD,mCAAmC;IACnC,eAAe,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,WAAW,EAAE,CAAC;IACpE,wCAAwC;IACxC,WAAW,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3E,wCAAwC;IACxC,WAAW,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5E;AAmBD,wBAAgB,UAAU,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,gBAAgB,CA+GjE"}
@@ -0,0 +1,112 @@
1
+ /**
2
+ * useHexGrid hook - Headless logic for hex grid games
3
+ *
4
+ * Provides utilities for:
5
+ * - Coordinate conversion and neighbor finding
6
+ * - Distance calculations
7
+ * - Tile lookups
8
+ *
9
+ * @example
10
+ * ```tsx
11
+ * const { getNeighbors, getDistance, getTile } = useHexGrid(tiles);
12
+ *
13
+ * // Find all adjacent tiles
14
+ * const neighbors = getNeighbors('center');
15
+ *
16
+ * // Check if two tiles are adjacent
17
+ * const isAdjacent = getDistance('tile1', 'tile2') === 1;
18
+ * ```
19
+ */
20
+ import { useMemo, useCallback } from "react";
21
+ // ============================================================================
22
+ // Axial direction vectors
23
+ // ============================================================================
24
+ const AXIAL_DIRECTIONS = [
25
+ { q: 1, r: 0 },
26
+ { q: 1, r: -1 },
27
+ { q: 0, r: -1 },
28
+ { q: -1, r: 0 },
29
+ { q: -1, r: 1 },
30
+ { q: 0, r: 1 },
31
+ ];
32
+ // ============================================================================
33
+ // Hook Implementation
34
+ // ============================================================================
35
+ export function useHexGrid(tiles) {
36
+ // Create lookup maps
37
+ const tileById = useMemo(() => {
38
+ return new Map(tiles.map((t) => [t.id, t]));
39
+ }, [tiles]);
40
+ const tileByCoord = useMemo(() => {
41
+ return new Map(tiles.map((t) => [`${t.q},${t.r}`, t]));
42
+ }, [tiles]);
43
+ // Get tile by ID
44
+ const getTile = useCallback((tileId) => {
45
+ return tileById.get(tileId);
46
+ }, [tileById]);
47
+ // Get tile by coordinates
48
+ const getTileAt = useCallback((q, r) => {
49
+ return tileByCoord.get(`${q},${r}`);
50
+ }, [tileByCoord]);
51
+ // Get neighboring tiles
52
+ const getNeighbors = useCallback((tileId) => {
53
+ const tile = tileById.get(tileId);
54
+ if (!tile)
55
+ return [];
56
+ const neighbors = [];
57
+ for (const dir of AXIAL_DIRECTIONS) {
58
+ const neighbor = tileByCoord.get(`${tile.q + dir.q},${tile.r + dir.r}`);
59
+ if (neighbor) {
60
+ neighbors.push(neighbor);
61
+ }
62
+ }
63
+ return neighbors;
64
+ }, [tileById, tileByCoord]);
65
+ // Calculate distance between two tiles
66
+ const getDistance = useCallback((fromId, toId) => {
67
+ const from = tileById.get(fromId);
68
+ const to = tileById.get(toId);
69
+ if (!from || !to)
70
+ return Infinity;
71
+ // Hex distance formula using axial coordinates
72
+ return ((Math.abs(from.q - to.q) +
73
+ Math.abs(from.q + from.r - to.q - to.r) +
74
+ Math.abs(from.r - to.r)) /
75
+ 2);
76
+ }, [tileById]);
77
+ // Get all tiles within range
78
+ const getHexesInRange = useCallback((centerId, range) => {
79
+ const center = tileById.get(centerId);
80
+ if (!center)
81
+ return [];
82
+ const results = [];
83
+ for (let dq = -range; dq <= range; dq++) {
84
+ const minR = Math.max(-range, -dq - range);
85
+ const maxR = Math.min(range, -dq + range);
86
+ for (let dr = minR; dr <= maxR; dr++) {
87
+ const tile = tileByCoord.get(`${center.q + dq},${center.r + dr}`);
88
+ if (tile) {
89
+ results.push(tile);
90
+ }
91
+ }
92
+ }
93
+ return results;
94
+ }, [tileById, tileByCoord]);
95
+ // Convert axial to cube coordinates
96
+ const axialToCube = useCallback((q, r) => {
97
+ return { x: q, z: r, y: -q - r };
98
+ }, []);
99
+ // Convert cube to axial coordinates
100
+ const cubeToAxial = useCallback((x, _y, z) => {
101
+ return { q: x, r: z };
102
+ }, []);
103
+ return {
104
+ getTile,
105
+ getTileAt,
106
+ getNeighbors,
107
+ getDistance,
108
+ getHexesInRange,
109
+ axialToCube,
110
+ cubeToAxial,
111
+ };
112
+ }
@@ -0,0 +1,29 @@
1
+ import type { InteractionHandle, InteractionParamsShape } from "./useInteractionHandle.js";
2
+ /**
3
+ * Look up an interaction descriptor by phase-qualified key on the controlling seat's
4
+ * inbox and return a bound {@link InteractionHandle}. Returns `null`
5
+ * when no matching descriptor is currently projected.
6
+ *
7
+ * Prefer this over manual `inbox.bySurface.panel?.find(...)` + sentinel
8
+ * descriptor patterns — it keeps hook-call order stable and guarantees
9
+ * the handle reflects the freshest descriptor.
10
+ *
11
+ * Types:
12
+ * - `Key` narrows the key literal. When called from the workspace-local
13
+ * `useInteractionByKey` re-export generated in `ui-contract.ts`, `Key` is
14
+ * constrained to the generated `InteractionKey` union so typos become
15
+ * compile errors.
16
+ * - `Params` is the params shape (`InteractionParamsOf<Key>` in the
17
+ * generated re-export). It flows through to `draft`, `submit`,
18
+ * `validate`, and `setInput` for compile-time safety.
19
+ *
20
+ * ```tsx
21
+ * // from the generated workspace re-export
22
+ * const handle = useInteractionByKey("play.placeThingCard");
23
+ * if (!handle) return <Waiting/>;
24
+ * handle.setInput("cardId", card.id); // typed to ThingsDeckCardId
25
+ * await handle.submit();
26
+ * ```
27
+ */
28
+ export declare function useInteractionByKey<Key extends string = string, Params extends InteractionParamsShape = InteractionParamsShape, DefaultedKeys extends keyof Params & string = never>(interactionKey: Key | null | undefined): InteractionHandle<Params, DefaultedKeys> | null;
29
+ //# sourceMappingURL=useInteractionByKey.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useInteractionByKey.d.ts","sourceRoot":"","sources":["../../src/hooks/useInteractionByKey.ts"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAEV,iBAAiB,EAEjB,sBAAsB,EACvB,MAAM,2BAA2B,CAAC;AAEnC;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,SAAS,MAAM,GAAG,MAAM,EAC3B,MAAM,SAAS,sBAAsB,GAAG,sBAAsB,EAC9D,aAAa,SAAS,MAAM,MAAM,GAAG,MAAM,GAAG,KAAK,EAEnD,cAAc,EAAE,GAAG,GAAG,IAAI,GAAG,SAAS,GACrC,iBAAiB,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,IAAI,CA2RjD"}