@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,248 @@
1
+ import { useCallback, useMemo } from "react";
2
+ import { useStore } from "zustand";
3
+ import { useInteractionUiStore } from "../context/InteractionDraftContext.js";
4
+ import { usePluginSession } from "../context/PluginSessionContext.js";
5
+ import { usePluginState } from "../context/PluginStateContext.js";
6
+ import { useRuntimeContext } from "../context/RuntimeContext.js";
7
+ import { validationErrorFromUnknown } from "../errors/ValidationError.js";
8
+ import { eligibleTargetsByBoardKind, eligibleTargetsForInput, hasBoardTargetInput, hasCardTargetInput, hasInteractionFieldErrors, inputByTarget, inputKeyForTarget, isInputValueReady, interactionArmScope, interactionInputKeys, toggleManyValue, validateInteractionInputDomains, } from "../utils/interaction-inputs.js";
9
+ export class BoardInteractionConflictError extends Error {
10
+ constructor({ targetKind, targetId, interactionKeys, }) {
11
+ super(`Ambiguous ${targetKind} target '${targetId}' matched interactions: ${interactionKeys.join(", ")}. Arm one interaction explicitly or route with a narrower board primitive.`);
12
+ this.name = "BoardInteractionConflictError";
13
+ this.targetKind = targetKind;
14
+ this.targetId = targetId;
15
+ this.interactionKeys = interactionKeys;
16
+ }
17
+ }
18
+ /**
19
+ * Board-surface orchestration helper that removes the boilerplate of
20
+ * wiring many `useInteractionById(...)` calls, merging their
21
+ * eligibility sets, and dispatching clicks to the right handle.
22
+ *
23
+ * Use this alongside (or instead of) `<BoardSurface>` when a game
24
+ * keeps multiple board interactions live simultaneously and dispatch
25
+ * is target-driven rather than armed-then-clicked. The typical
26
+ * Catan-class shape:
27
+ *
28
+ * ```tsx
29
+ * const board = useBoardInteractions();
30
+ *
31
+ * return (
32
+ * <HexGrid
33
+ * interactiveVertices={board.targetLayers.vertex()}
34
+ * interactiveEdges={board.targetLayers.edge()}
35
+ * onTileClick={(id) =>
36
+ * board.select.space(id, { stealFromPlayerId: null })
37
+ * }
38
+ * />
39
+ * );
40
+ * ```
41
+ *
42
+ * Eligibility and availability remain authoritative on reducer-projected
43
+ * descriptors. Armed follow-up descriptors beat ambient board descriptors.
44
+ * Multiple unarmed matches are ambiguous and throw
45
+ * {@link BoardInteractionConflictError}.
46
+ */
47
+ export function useBoardInteractions(options = {}) {
48
+ const { targetKinds } = options;
49
+ const runtime = useRuntimeContext();
50
+ const { controllingPlayerId } = usePluginSession();
51
+ const store = useInteractionUiStore();
52
+ const subscribedArmedBySurface = useStore(store, (state) => state.arms);
53
+ const armedBySurface = store.getState().arms ?? subscribedArmedBySurface;
54
+ const descriptors = usePluginState((state) => state.gameplay.availableInteractions ?? []);
55
+ const targetKindSet = useMemo(() => new Set(targetKinds), [targetKinds]);
56
+ const armedIds = useMemo(() => new Set(Object.values(armedBySurface)), [armedBySurface]);
57
+ const interactions = useMemo(() => {
58
+ return descriptors.filter((descriptor) => {
59
+ if (armedIds.has(descriptor.interactionKey))
60
+ return true;
61
+ if (hasCardTargetInput(descriptor))
62
+ return false;
63
+ if (!hasBoardTargetInput(descriptor))
64
+ return false;
65
+ if (!targetKinds || targetKinds.length === 0)
66
+ return true;
67
+ const byKind = eligibleTargetsByBoardKind(descriptor);
68
+ return Object.keys(byKind).some((kind) => targetKindSet.has(kind));
69
+ });
70
+ }, [armedIds, descriptors, targetKindSet, targetKinds]);
71
+ const eligible = useMemo(() => {
72
+ const acc = {
73
+ edge: new Set(),
74
+ vertex: new Set(),
75
+ space: new Set(),
76
+ tile: new Set(),
77
+ };
78
+ for (const descriptor of interactions) {
79
+ if (!descriptor.available)
80
+ continue;
81
+ const targetsByKind = eligibleTargetsByBoardKind(descriptor);
82
+ for (const [targetKind, ids] of Object.entries(targetsByKind)) {
83
+ if (!ids)
84
+ continue;
85
+ const bucket = acc[targetKind];
86
+ for (const id of ids)
87
+ bucket.add(id);
88
+ }
89
+ }
90
+ return acc;
91
+ }, [interactions]);
92
+ const isEligible = useCallback((targetId, targetKind) => {
93
+ if (targetKind !== undefined) {
94
+ return eligible[targetKind].has(targetId);
95
+ }
96
+ for (const bucket of Object.values(eligible)) {
97
+ if (bucket.has(targetId))
98
+ return true;
99
+ }
100
+ return false;
101
+ }, [eligible]);
102
+ const selectByKind = useCallback(async (targetKind, targetId, extraInputs) => {
103
+ if (!controllingPlayerId)
104
+ return null;
105
+ const matches = interactions.flatMap((descriptor) => {
106
+ if (!descriptor.available)
107
+ return [];
108
+ const inputKey = inputKeyForTarget(descriptor, targetKind, targetId);
109
+ if (!inputKey)
110
+ return [];
111
+ const input = inputByTarget(descriptor, targetKind, targetId);
112
+ if (input?.domain.type === "target" &&
113
+ !isTargetSelectable(input, store.getDraft(descriptor.interactionKey), targetId)) {
114
+ return [];
115
+ }
116
+ const targets = eligibleTargetsForInput(descriptor, inputKey);
117
+ if (!targets || !targets.includes(targetId))
118
+ return [];
119
+ return [
120
+ {
121
+ descriptor,
122
+ inputKey,
123
+ armed: armedIds.has(descriptor.interactionKey),
124
+ },
125
+ ];
126
+ });
127
+ const selected = selectDispatchCandidate(matches, targetKind, targetId);
128
+ if (selected) {
129
+ const { descriptor, inputKey } = selected;
130
+ const input = inputByTarget(descriptor, targetKind, targetId);
131
+ const currentDraft = store.getDraft(descriptor.interactionKey);
132
+ const selection = input?.domain.type === "target" ? input.domain.selection : undefined;
133
+ const nextTargetValue = selection?.mode === "many"
134
+ ? toggleManyValue(currentDraft[inputKey], targetId, selection)
135
+ : targetId;
136
+ const params = {
137
+ ...currentDraft,
138
+ ...(extraInputs ?? {}),
139
+ [inputKey]: nextTargetValue,
140
+ };
141
+ for (const [key, value] of Object.entries(extraInputs ?? {})) {
142
+ store.setInput(descriptor.interactionKey, key, value);
143
+ }
144
+ store.setInput(descriptor.interactionKey, inputKey, nextTargetValue);
145
+ if (descriptor.commit.mode !== "autoWhenReady" ||
146
+ (selection?.mode === "many" && !isDraftReady(descriptor, params))) {
147
+ store.arm(interactionArmScope(descriptor), descriptor.interactionKey);
148
+ return descriptor.interactionKey;
149
+ }
150
+ // Fill any remaining required inputs with `null` so the reducer
151
+ // bundle can decide whether to reject (missing) or accept
152
+ // (optional). This matches the Catan "spaceId + null stealee"
153
+ // pattern without forcing callers to memorise each interaction's
154
+ // full input shape.
155
+ for (const required of interactionInputKeys(descriptor)) {
156
+ if (!(required in params))
157
+ params[required] = null;
158
+ }
159
+ try {
160
+ await runtime.submitInteraction(controllingPlayerId, descriptor.interactionId, params);
161
+ store.clearInput(descriptor.interactionKey);
162
+ if (store.getArmed(interactionArmScope(descriptor)) ===
163
+ descriptor.interactionKey) {
164
+ store.arm(interactionArmScope(descriptor), null);
165
+ }
166
+ return descriptor.interactionKey;
167
+ }
168
+ catch (error) {
169
+ throw validationErrorFromUnknown(error);
170
+ }
171
+ }
172
+ return null;
173
+ }, [armedIds, controllingPlayerId, interactions, runtime, store]);
174
+ const select = useMemo(() => ({
175
+ edge: (targetId, extraInputs) => selectByKind("edge", targetId, extraInputs),
176
+ vertex: (targetId, extraInputs) => selectByKind("vertex", targetId, extraInputs),
177
+ space: (targetId, extraInputs) => selectByKind("space", targetId, extraInputs),
178
+ tile: (targetId, extraInputs) => selectByKind("tile", targetId, extraInputs),
179
+ }), [selectByKind]);
180
+ const targetLayers = useMemo(() => {
181
+ const createLayer = (targetKind) => (layerOptions = {}) => {
182
+ const { enabled, extraInputs, onBeforeSelect, onError } = layerOptions;
183
+ const resolveExtraInputs = (targetId) => typeof extraInputs === "function"
184
+ ? extraInputs(targetId)
185
+ : extraInputs;
186
+ return {
187
+ enabled,
188
+ eligible: eligible[targetKind],
189
+ selectTargetId: async (targetId) => {
190
+ if (enabled === false)
191
+ return;
192
+ onBeforeSelect?.();
193
+ try {
194
+ await select[targetKind](targetId, resolveExtraInputs(targetId));
195
+ }
196
+ catch (error) {
197
+ onError?.(error);
198
+ if (!onError)
199
+ throw error;
200
+ }
201
+ },
202
+ };
203
+ };
204
+ return {
205
+ edge: createLayer("edge"),
206
+ vertex: createLayer("vertex"),
207
+ space: createLayer("space"),
208
+ tile: createLayer("tile"),
209
+ };
210
+ }, [eligible, select]);
211
+ return useMemo(() => ({ interactions, eligible, isEligible, select, targetLayers }), [interactions, eligible, isEligible, select, targetLayers]);
212
+ }
213
+ function isTargetSelectable(input, draft, targetId) {
214
+ const selection = input.domain.type === "target" ? input.domain.selection : undefined;
215
+ if (selection?.mode !== "many" || !selection.distinct)
216
+ return true;
217
+ const current = draft[input.key];
218
+ if (!Array.isArray(current))
219
+ return true;
220
+ if (current.map((item) => String(item)).includes(targetId))
221
+ return true;
222
+ return selection.max === undefined || current.length < selection.max;
223
+ }
224
+ function isDraftReady(descriptor, draft) {
225
+ const fieldErrors = validateInteractionInputDomains(descriptor, draft);
226
+ if (hasInteractionFieldErrors(fieldErrors))
227
+ return false;
228
+ return interactionInputKeys(descriptor).every((key) => {
229
+ const input = descriptor.inputs.find((candidate) => candidate.key === key);
230
+ const value = draft[key] ??
231
+ (input && "defaultValue" in input ? input.defaultValue : undefined);
232
+ return input ? isInputValueReady(input, value) : value !== undefined;
233
+ });
234
+ }
235
+ function selectDispatchCandidate(matches, targetKind, targetId) {
236
+ if (matches.length === 0)
237
+ return null;
238
+ const armed = matches.filter((match) => match.armed);
239
+ const candidates = armed.length > 0 ? armed : matches;
240
+ if (candidates.length > 1) {
241
+ throw new BoardInteractionConflictError({
242
+ targetKind,
243
+ targetId,
244
+ interactionKeys: candidates.map((winner) => winner.descriptor.interactionKey),
245
+ });
246
+ }
247
+ return candidates[0] ?? null;
248
+ }
@@ -0,0 +1,23 @@
1
+ import type { AnyHexBoardInput, AnySquareBoardInput, BoardEdgeIdOf, BoardSpaceIdOf, BoardVertexIdOf, NormalizedHexBoard, NormalizedHexEdgeOf, NormalizedHexTileOf, NormalizedHexVertexOf, NormalizedSquareBoard, NormalizedSquareCellOf, NormalizedSquareEdgeOf, NormalizedSquareVertexOf } from "../types/tiled-board.js";
2
+ type BoardTopologyData = AnyHexBoardInput | AnySquareBoardInput;
3
+ type BoardSpaceOf<TBoard extends BoardTopologyData> = TBoard extends AnyHexBoardInput ? NormalizedHexTileOf<TBoard> : TBoard extends AnySquareBoardInput ? NormalizedSquareCellOf<TBoard> : never;
4
+ type BoardEdgeOf<TBoard extends BoardTopologyData> = TBoard extends AnyHexBoardInput ? NormalizedHexEdgeOf<TBoard> : TBoard extends AnySquareBoardInput ? NormalizedSquareEdgeOf<TBoard> : never;
5
+ type BoardVertexOf<TBoard extends BoardTopologyData> = TBoard extends AnyHexBoardInput ? NormalizedHexVertexOf<TBoard> : TBoard extends AnySquareBoardInput ? NormalizedSquareVertexOf<TBoard> : never;
6
+ type NormalizedBoardOf<TBoard extends BoardTopologyData> = TBoard extends AnyHexBoardInput ? NormalizedHexBoard<TBoard> : TBoard extends AnySquareBoardInput ? NormalizedSquareBoard<TBoard> : never;
7
+ type BoardLayoutOf<TBoard extends BoardTopologyData> = TBoard extends AnyHexBoardInput ? "hex" : "square";
8
+ export interface UseBoardTopologyReturn<TBoard extends BoardTopologyData> {
9
+ layout: BoardLayoutOf<TBoard>;
10
+ board: NormalizedBoardOf<TBoard>;
11
+ getSpace: (spaceId: BoardSpaceIdOf<TBoard>) => BoardSpaceOf<TBoard> | undefined;
12
+ getEdge: (edgeId: BoardEdgeIdOf<TBoard>) => BoardEdgeOf<TBoard> | undefined;
13
+ getVertex: (vertexId: BoardVertexIdOf<TBoard>) => BoardVertexOf<TBoard> | undefined;
14
+ getAdjacentSpaces: (spaceId: BoardSpaceIdOf<TBoard>) => Array<BoardSpaceOf<TBoard>>;
15
+ getDistance: (fromSpaceId: BoardSpaceIdOf<TBoard>, toSpaceId: BoardSpaceIdOf<TBoard>) => number;
16
+ getSpaceEdges: (spaceId: BoardSpaceIdOf<TBoard>) => Array<BoardEdgeOf<TBoard>>;
17
+ getSpaceVertices: (spaceId: BoardSpaceIdOf<TBoard>) => Array<BoardVertexOf<TBoard>>;
18
+ getIncidentEdges: (vertexId: BoardVertexIdOf<TBoard>) => Array<BoardEdgeOf<TBoard>>;
19
+ getIncidentVertices: (edgeId: BoardEdgeIdOf<TBoard>) => Array<BoardVertexOf<TBoard>>;
20
+ }
21
+ export declare function useBoardTopology<const TBoard extends BoardTopologyData>(board: TBoard): UseBoardTopologyReturn<TBoard>;
22
+ export {};
23
+ //# sourceMappingURL=useBoardTopology.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useBoardTopology.d.ts","sourceRoot":"","sources":["../../src/hooks/useBoardTopology.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,gBAAgB,EAChB,mBAAmB,EACnB,aAAa,EACb,cAAc,EACd,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,EACrB,sBAAsB,EACtB,sBAAsB,EACtB,wBAAwB,EACzB,MAAM,yBAAyB,CAAC;AAOjC,KAAK,iBAAiB,GAAG,gBAAgB,GAAG,mBAAmB,CAAC;AAEhE,KAAK,YAAY,CAAC,MAAM,SAAS,iBAAiB,IAChD,MAAM,SAAS,gBAAgB,GAC3B,mBAAmB,CAAC,MAAM,CAAC,GAC3B,MAAM,SAAS,mBAAmB,GAChC,sBAAsB,CAAC,MAAM,CAAC,GAC9B,KAAK,CAAC;AAEd,KAAK,WAAW,CAAC,MAAM,SAAS,iBAAiB,IAC/C,MAAM,SAAS,gBAAgB,GAC3B,mBAAmB,CAAC,MAAM,CAAC,GAC3B,MAAM,SAAS,mBAAmB,GAChC,sBAAsB,CAAC,MAAM,CAAC,GAC9B,KAAK,CAAC;AAEd,KAAK,aAAa,CAAC,MAAM,SAAS,iBAAiB,IACjD,MAAM,SAAS,gBAAgB,GAC3B,qBAAqB,CAAC,MAAM,CAAC,GAC7B,MAAM,SAAS,mBAAmB,GAChC,wBAAwB,CAAC,MAAM,CAAC,GAChC,KAAK,CAAC;AAEd,KAAK,iBAAiB,CAAC,MAAM,SAAS,iBAAiB,IACrD,MAAM,SAAS,gBAAgB,GAC3B,kBAAkB,CAAC,MAAM,CAAC,GAC1B,MAAM,SAAS,mBAAmB,GAChC,qBAAqB,CAAC,MAAM,CAAC,GAC7B,KAAK,CAAC;AAEd,KAAK,aAAa,CAAC,MAAM,SAAS,iBAAiB,IACjD,MAAM,SAAS,gBAAgB,GAAG,KAAK,GAAG,QAAQ,CAAC;AAsBrD,MAAM,WAAW,sBAAsB,CAAC,MAAM,SAAS,iBAAiB;IACtE,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC9B,KAAK,EAAE,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACjC,QAAQ,EAAE,CACR,OAAO,EAAE,cAAc,CAAC,MAAM,CAAC,KAC5B,YAAY,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;IACtC,OAAO,EAAE,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,KAAK,WAAW,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;IAC5E,SAAS,EAAE,CACT,QAAQ,EAAE,eAAe,CAAC,MAAM,CAAC,KAC9B,aAAa,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;IACvC,iBAAiB,EAAE,CACjB,OAAO,EAAE,cAAc,CAAC,MAAM,CAAC,KAC5B,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;IACjC,WAAW,EAAE,CACX,WAAW,EAAE,cAAc,CAAC,MAAM,CAAC,EACnC,SAAS,EAAE,cAAc,CAAC,MAAM,CAAC,KAC9B,MAAM,CAAC;IACZ,aAAa,EAAE,CACb,OAAO,EAAE,cAAc,CAAC,MAAM,CAAC,KAC5B,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;IAChC,gBAAgB,EAAE,CAChB,OAAO,EAAE,cAAc,CAAC,MAAM,CAAC,KAC5B,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;IAClC,gBAAgB,EAAE,CAChB,QAAQ,EAAE,eAAe,CAAC,MAAM,CAAC,KAC9B,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;IAChC,mBAAmB,EAAE,CACnB,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,KAC1B,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;CACnC;AAED,wBAAgB,gBAAgB,CAAC,KAAK,CAAC,MAAM,SAAS,iBAAiB,EACrE,KAAK,EAAE,MAAM,GACZ,sBAAsB,CAAC,MAAM,CAAC,CA+MhC"}
@@ -0,0 +1,128 @@
1
+ import { useCallback, useMemo } from "react";
2
+ import { isGeneratedHexBoardInput, normalizeHexBoardInput, normalizeSquareBoardInput, } from "../types/tiled-board.js";
3
+ function toSpaceIds(edge) {
4
+ if ("spaceIds" in edge) {
5
+ return edge.spaceIds;
6
+ }
7
+ return [edge.hex1, edge.hex2];
8
+ }
9
+ function toVertexSpaceIds(vertex) {
10
+ if ("spaceIds" in vertex) {
11
+ return vertex.spaceIds;
12
+ }
13
+ return vertex.hexes;
14
+ }
15
+ export function useBoardTopology(board) {
16
+ const normalizedBoard = useMemo(() => {
17
+ const candidateBoard = board;
18
+ if (isGeneratedHexBoardInput(candidateBoard) || "tiles" in candidateBoard) {
19
+ return normalizeHexBoardInput(candidateBoard);
20
+ }
21
+ return normalizeSquareBoardInput(candidateBoard);
22
+ }, [board]);
23
+ const layout = ("tiles" in normalizedBoard ? "hex" : "square");
24
+ const spaces = useMemo(() => ("tiles" in normalizedBoard
25
+ ? normalizedBoard.tiles
26
+ : normalizedBoard.cells), [normalizedBoard]);
27
+ const edges = useMemo(() => normalizedBoard.edges, [normalizedBoard.edges]);
28
+ const vertices = useMemo(() => normalizedBoard.vertices, [normalizedBoard.vertices]);
29
+ const spaceById = useMemo(() => new Map(spaces.map((space) => [space.id, space])), [spaces]);
30
+ const edgeById = useMemo(() => new Map(edges.map((edge) => [edge.id, edge])), [edges]);
31
+ const vertexById = useMemo(() => new Map(vertices.map((vertex) => [
32
+ vertex.id,
33
+ vertex,
34
+ ])), [vertices]);
35
+ const adjacentSpaceIdsById = useMemo(() => {
36
+ const adjacency = new Map();
37
+ for (const space of spaces) {
38
+ adjacency.set(space.id, []);
39
+ }
40
+ for (const edge of edges) {
41
+ const spaceIds = toSpaceIds(edge);
42
+ if (spaceIds.length !== 2) {
43
+ continue;
44
+ }
45
+ const [leftId, rightId] = spaceIds;
46
+ if (!leftId || !rightId) {
47
+ continue;
48
+ }
49
+ adjacency.set(leftId, [...(adjacency.get(leftId) ?? []), rightId]);
50
+ adjacency.set(rightId, [...(adjacency.get(rightId) ?? []), leftId]);
51
+ }
52
+ return adjacency;
53
+ }, [edges, spaces]);
54
+ const getSpace = useCallback((spaceId) => {
55
+ return spaceById.get(spaceId);
56
+ }, [spaceById]);
57
+ const getEdge = useCallback((edgeId) => {
58
+ return edgeById.get(edgeId);
59
+ }, [edgeById]);
60
+ const getVertex = useCallback((vertexId) => {
61
+ return vertexById.get(vertexId);
62
+ }, [vertexById]);
63
+ const getAdjacentSpaces = useCallback((spaceId) => {
64
+ return (adjacentSpaceIdsById.get(spaceId) ?? [])
65
+ .map((adjacentSpaceId) => spaceById.get(adjacentSpaceId))
66
+ .filter((space) => space !== undefined);
67
+ }, [adjacentSpaceIdsById, spaceById]);
68
+ const getDistance = useCallback((fromSpaceId, toSpaceId) => {
69
+ if (fromSpaceId === toSpaceId) {
70
+ return 0;
71
+ }
72
+ const visited = new Set([fromSpaceId]);
73
+ let frontier = [fromSpaceId];
74
+ let distance = 0;
75
+ while (frontier.length > 0) {
76
+ distance += 1;
77
+ const nextFrontier = [];
78
+ for (const currentSpaceId of frontier) {
79
+ for (const adjacentSpaceId of adjacentSpaceIdsById.get(currentSpaceId) ?? []) {
80
+ if (adjacentSpaceId === toSpaceId) {
81
+ return distance;
82
+ }
83
+ if (!visited.has(adjacentSpaceId)) {
84
+ visited.add(adjacentSpaceId);
85
+ nextFrontier.push(adjacentSpaceId);
86
+ }
87
+ }
88
+ }
89
+ frontier = nextFrontier;
90
+ }
91
+ return Number.POSITIVE_INFINITY;
92
+ }, [adjacentSpaceIdsById]);
93
+ const getSpaceEdges = useCallback((spaceId) => {
94
+ return edges.filter((edge) => toSpaceIds(edge).includes(spaceId));
95
+ }, [edges]);
96
+ const getSpaceVertices = useCallback((spaceId) => {
97
+ return vertices.filter((vertex) => toVertexSpaceIds(vertex).includes(spaceId));
98
+ }, [vertices]);
99
+ const getIncidentEdges = useCallback((vertexId) => {
100
+ const vertex = vertexById.get(vertexId);
101
+ if (!vertex) {
102
+ return [];
103
+ }
104
+ const vertexSpaceIds = new Set(toVertexSpaceIds(vertex));
105
+ return edges.filter((edge) => toSpaceIds(edge).every((spaceId) => vertexSpaceIds.has(spaceId)));
106
+ }, [edges, vertexById]);
107
+ const getIncidentVertices = useCallback((edgeId) => {
108
+ const edge = edgeById.get(edgeId);
109
+ if (!edge) {
110
+ return [];
111
+ }
112
+ const edgeSpaceIds = new Set(toSpaceIds(edge));
113
+ return vertices.filter((vertex) => Array.from(edgeSpaceIds).every((spaceId) => toVertexSpaceIds(vertex).includes(spaceId)));
114
+ }, [edgeById, vertices]);
115
+ return {
116
+ layout,
117
+ board: normalizedBoard,
118
+ getSpace,
119
+ getEdge,
120
+ getVertex,
121
+ getAdjacentSpaces,
122
+ getDistance,
123
+ getSpaceEdges,
124
+ getSpaceVertices,
125
+ getIncidentEdges,
126
+ getIncidentVertices,
127
+ };
128
+ }
@@ -0,0 +1,3 @@
1
+ import type { CardCollection, ViewCard } from "@dreamboard/sdk-types";
2
+ export declare function useCards<CardIdValue extends string, CardValue extends ViewCard<CardIdValue>>(collection: CardCollection<CardIdValue, CardValue>): CardValue[];
3
+ //# sourceMappingURL=useCards.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCards.d.ts","sourceRoot":"","sources":["../../src/hooks/useCards.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAGtE,wBAAgB,QAAQ,CACtB,WAAW,SAAS,MAAM,EAC1B,SAAS,SAAS,QAAQ,CAAC,WAAW,CAAC,EACvC,UAAU,EAAE,cAAc,CAAC,WAAW,EAAE,SAAS,CAAC,eAEnD"}
@@ -0,0 +1,5 @@
1
+ import { useMemo } from "react";
2
+ import { materializeCards } from "../helpers/cards.js";
3
+ export function useCards(collection) {
4
+ return useMemo(() => materializeCards(collection), [collection]);
5
+ }
@@ -0,0 +1,13 @@
1
+ import type { GameView } from "@dreamboard/ui-contract";
2
+ type EqualityFn<T> = (left: T, right: T) => boolean;
3
+ /**
4
+ * Hook to select a derived value from the projected reducer view.
5
+ * Only re-renders when the selected slice changes according to the equalityFn.
6
+ *
7
+ * @param selector - Function to extract data from the projected view
8
+ * @param equalityFn - Optional equality function for selected slice comparison
9
+ * @returns Selected value from the current projected view
10
+ */
11
+ export declare function useGameSelector<T>(selector: (state: GameView) => T, equalityFn?: EqualityFn<T>): T;
12
+ export {};
13
+ //# sourceMappingURL=useGameSelector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useGameSelector.d.ts","sourceRoot":"","sources":["../../src/hooks/useGameSelector.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAIxD,KAAK,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,OAAO,CAAC;AAsBpD;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAC/B,QAAQ,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,CAAC,EAChC,UAAU,GAAE,UAAU,CAAC,CAAC,CAAmB,GAC1C,CAAC,CAiEH"}
@@ -0,0 +1,67 @@
1
+ import { useRef, useSyncExternalStore } from "react";
2
+ import { useRuntimeContext } from "../context/RuntimeContext.js";
3
+ function defaultEquality(left, right) {
4
+ return Object.is(left, right);
5
+ }
6
+ function requireProjectedView(snapshot, message) {
7
+ const view = snapshot?.view;
8
+ if (view === null || typeof view === "undefined") {
9
+ throw new Error(message);
10
+ }
11
+ return view;
12
+ }
13
+ /**
14
+ * Hook to select a derived value from the projected reducer view.
15
+ * Only re-renders when the selected slice changes according to the equalityFn.
16
+ *
17
+ * @param selector - Function to extract data from the projected view
18
+ * @param equalityFn - Optional equality function for selected slice comparison
19
+ * @returns Selected value from the current projected view
20
+ */
21
+ export function useGameSelector(selector, equalityFn = defaultEquality) {
22
+ const runtime = useRuntimeContext();
23
+ const selectorRef = useRef(selector);
24
+ const equalityRef = useRef(equalityFn);
25
+ const cacheRef = useRef(null);
26
+ if (selectorRef.current !== selector || equalityRef.current !== equalityFn) {
27
+ selectorRef.current = selector;
28
+ equalityRef.current = equalityFn;
29
+ cacheRef.current = null;
30
+ }
31
+ const message = "useGameSelector: Projected view not available. Ensure the reducer-native host payload is initialized.";
32
+ const getSelectedFromSnapshot = (snapshot) => {
33
+ const view = requireProjectedView(snapshot, message);
34
+ const cached = cacheRef.current;
35
+ if (cached && cached.rawView === view) {
36
+ return cached.selected;
37
+ }
38
+ const nextSelected = selectorRef.current(view);
39
+ if (cached && equalityRef.current(cached.selected, nextSelected)) {
40
+ cacheRef.current = {
41
+ rawView: view,
42
+ selected: cached.selected,
43
+ };
44
+ return cached.selected;
45
+ }
46
+ cacheRef.current = {
47
+ rawView: view,
48
+ selected: nextSelected,
49
+ };
50
+ return nextSelected;
51
+ };
52
+ const subscribe = (onStoreChange) => {
53
+ if (!runtime.subscribeToState) {
54
+ return () => { };
55
+ }
56
+ return runtime.subscribeToState((snapshot) => {
57
+ const previousCache = cacheRef.current;
58
+ const nextSelected = getSelectedFromSnapshot(snapshot);
59
+ if (!previousCache ||
60
+ !equalityRef.current(previousCache.selected, nextSelected)) {
61
+ onStoreChange();
62
+ }
63
+ });
64
+ };
65
+ const getSnapshot = () => getSelectedFromSnapshot((runtime.getSnapshot?.() ?? null));
66
+ return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
67
+ }
@@ -0,0 +1,6 @@
1
+ import type { GameView } from "@dreamboard/ui-contract";
2
+ /**
3
+ * Hook to access the current seat-projected reducer-native view.
4
+ */
5
+ export declare function useGameView(): GameView;
6
+ //# sourceMappingURL=useGameView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useGameView.d.ts","sourceRoot":"","sources":["../../src/hooks/useGameView.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAGxD;;GAEG;AACH,wBAAgB,WAAW,IAAI,QAAQ,CAEtC"}
@@ -0,0 +1,7 @@
1
+ import { useGameSelector } from "./useGameSelector.js";
2
+ /**
3
+ * Hook to access the current seat-projected reducer-native view.
4
+ */
5
+ export function useGameView() {
6
+ return useGameSelector((view) => view);
7
+ }
@@ -0,0 +1,120 @@
1
+ import type { RefObject } from "react";
2
+ export type CardSize = "sm" | "md" | "lg";
3
+ export type HandLayout = "spread" | "stack" | "overlap";
4
+ export interface CardPositionProps {
5
+ /** X position (left offset) */
6
+ x: number;
7
+ /** Y position (vertical offset for hover/selected) */
8
+ y: number;
9
+ /** Z-index for layering */
10
+ zIndex: number;
11
+ /** CSS transform origin */
12
+ transformOrigin: string;
13
+ }
14
+ export interface UseHandLayoutOptions {
15
+ /** Number of cards in the hand */
16
+ cardCount: number;
17
+ /** Card size variant */
18
+ cardSize?: CardSize;
19
+ /** Layout style */
20
+ layout?: HandLayout;
21
+ /** Padding to subtract from container width */
22
+ containerPadding?: number;
23
+ }
24
+ export interface UseHandLayoutReturn {
25
+ /** Ref to attach to the container element */
26
+ containerRef: RefObject<HTMLDivElement | null>;
27
+ /** Ref to attach to the cards container element (for mouse tracking) */
28
+ cardsContainerRef: RefObject<HTMLDivElement | null>;
29
+ /** Measured container width */
30
+ containerWidth: number;
31
+ /** Calculated offset between cards */
32
+ cardOffset: number;
33
+ /** Total width of all cards */
34
+ totalWidth: number;
35
+ /** Whether drawer mode should be used */
36
+ useDrawerMode: boolean;
37
+ /** Card dimensions for the current size */
38
+ cardDimensions: {
39
+ width: number;
40
+ height: number;
41
+ };
42
+ /** Constants for positioning */
43
+ constants: {
44
+ hoverLift: number;
45
+ selectedLift: number;
46
+ };
47
+ /** Currently hovered card index */
48
+ hoveredIndex: number | null;
49
+ /** Mouse move handler for the cards container */
50
+ handleMouseMove: (e: React.MouseEvent<HTMLDivElement>) => void;
51
+ /** Mouse leave handler for the cards container */
52
+ handleMouseLeave: () => void;
53
+ /** Get position props for a card at the given index */
54
+ getCardPosition: (index: number, isHovered: boolean, isSelected: boolean) => CardPositionProps;
55
+ }
56
+ /**
57
+ * Hook for managing hand layout calculations and interactions.
58
+ *
59
+ * Provides container measurement, overlap calculations, drawer mode detection,
60
+ * and hover state management for card hand displays.
61
+ *
62
+ * @example
63
+ * ```tsx
64
+ * function MyHand({ cards, selectedIds }) {
65
+ * const {
66
+ * containerRef,
67
+ * cardsContainerRef,
68
+ * totalWidth,
69
+ * useDrawerMode,
70
+ * cardDimensions,
71
+ * hoveredIndex,
72
+ * handleMouseMove,
73
+ * handleMouseLeave,
74
+ * getCardPosition,
75
+ * constants,
76
+ * } = useHandLayout({
77
+ * cardCount: cards.length,
78
+ * cardSize: "md",
79
+ * layout: "overlap",
80
+ * });
81
+ *
82
+ * if (useDrawerMode) {
83
+ * return <MyDrawerUI cards={cards} />;
84
+ * }
85
+ *
86
+ * return (
87
+ * <div ref={containerRef}>
88
+ * <div
89
+ * ref={cardsContainerRef}
90
+ * style={{ width: totalWidth, height: cardDimensions.height + constants.hoverLift }}
91
+ * onMouseMove={handleMouseMove}
92
+ * onMouseLeave={handleMouseLeave}
93
+ * >
94
+ * {cards.map((card, index) => {
95
+ * const isHovered = hoveredIndex === index;
96
+ * const isSelected = selectedIds.includes(card.id);
97
+ * const position = getCardPosition(index, isHovered, isSelected);
98
+ *
99
+ * return (
100
+ * <div
101
+ * key={card.id}
102
+ * style={{
103
+ * position: "absolute",
104
+ * left: position.x,
105
+ * transform: `translateY(${position.y}px)`,
106
+ * zIndex: position.zIndex,
107
+ * }}
108
+ * >
109
+ * <MyCard card={card} />
110
+ * </div>
111
+ * );
112
+ * })}
113
+ * </div>
114
+ * </div>
115
+ * );
116
+ * }
117
+ * ```
118
+ */
119
+ export declare function useHandLayout({ cardCount, cardSize, layout, containerPadding, }: UseHandLayoutOptions): UseHandLayoutReturn;
120
+ //# sourceMappingURL=useHandLayout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useHandLayout.d.ts","sourceRoot":"","sources":["../../src/hooks/useHandLayout.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAoBvC,MAAM,MAAM,QAAQ,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAC1C,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC;AAExD,MAAM,WAAW,iBAAiB;IAChC,+BAA+B;IAC/B,CAAC,EAAE,MAAM,CAAC;IACV,sDAAsD;IACtD,CAAC,EAAE,MAAM,CAAC;IACV,2BAA2B;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,2BAA2B;IAC3B,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,oBAAoB;IACnC,kCAAkC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,wBAAwB;IACxB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,mBAAmB;IACnB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,+CAA+C;IAC/C,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,mBAAmB;IAClC,6CAA6C;IAC7C,YAAY,EAAE,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAC/C,wEAAwE;IACxE,iBAAiB,EAAE,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IACpD,+BAA+B;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,sCAAsC;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,+BAA+B;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,yCAAyC;IACzC,aAAa,EAAE,OAAO,CAAC;IACvB,2CAA2C;IAC3C,cAAc,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAClD,gCAAgC;IAChC,SAAS,EAAE;QACT,SAAS,EAAE,MAAM,CAAC;QAClB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,mCAAmC;IACnC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,iDAAiD;IACjD,eAAe,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;IAC/D,kDAAkD;IAClD,gBAAgB,EAAE,MAAM,IAAI,CAAC;IAC7B,uDAAuD;IACvD,eAAe,EAAE,CACf,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,OAAO,EAClB,UAAU,EAAE,OAAO,KAChB,iBAAiB,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8DG;AACH,wBAAgB,aAAa,CAAC,EAC5B,SAAS,EACT,QAAe,EACf,MAAkB,EAClB,gBAAqB,GACtB,EAAE,oBAAoB,GAAG,mBAAmB,CAwM5C"}