@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,64 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * Disclosure that hides a list of low-salience actions behind a single
4
+ * "More" toggle. Sized and styled by the active theme so it looks
5
+ * consistent with neighbouring `<DefaultInteractionButton>` rows.
6
+ *
7
+ * Why not a popover or dropdown? Two reasons:
8
+ *
9
+ * 1. **Layout safety.** The default panel surface lives directly above
10
+ * the hand strip; a floating popover would be obscured by the
11
+ * hand's `overflow-x: auto` clipping. An inline expansion stays
12
+ * inside the panel container and pushes neighbouring rows down.
13
+ * 2. **Discoverability.** Players miss menus that hide behind triple
14
+ * dots / chevrons. An expanded inline list still looks like a row
15
+ * of buttons (Jakob — same affordance as the always-visible row).
16
+ *
17
+ * The toggle reports its open state via `aria-expanded` and labels
18
+ * the disclosed region via `aria-controls` so screen readers announce
19
+ * "Expanded — More actions, region containing 3 buttons" naturally.
20
+ */
21
+ import { useId, useState } from "react";
22
+ import { ChevronDown, MoreHorizontal } from "lucide-react";
23
+ import { useTheme } from "../theme/ThemeProvider.js";
24
+ import { ThemedButton } from "./ThemedButton.js";
25
+ export function MoreActions({ children, label = "More", count, defaultOpen = false, style, }) {
26
+ const theme = useTheme();
27
+ const [open, setOpen] = useState(defaultOpen);
28
+ // `useId` keeps the aria pairing stable across re-renders even when
29
+ // many `<MoreActions>` exist on screen (rare, but easy to break).
30
+ const regionId = `more-actions-${useId().replace(/:/g, "")}`;
31
+ const showCount = typeof count === "number" && count > 0;
32
+ return (_jsxs("div", { "data-shell-slot": "more-actions", "data-more-actions-open": open ? "true" : "false", style: {
33
+ display: "flex",
34
+ flexDirection: "column",
35
+ gap: theme.space[2],
36
+ alignItems: "stretch",
37
+ // The disclosure is its own block so wrap behaviour upstream
38
+ // doesn't interleave the toggle and the disclosed items.
39
+ flex: "1 1 100%",
40
+ minWidth: 0,
41
+ }, children: [_jsxs(ThemedButton, { type: "button", variant: "secondary", size: "md", "aria-expanded": open, "aria-controls": regionId, onClick: () => setOpen((value) => !value), style: {
42
+ display: "inline-flex",
43
+ alignItems: "center",
44
+ gap: theme.space[1],
45
+ ...style,
46
+ }, children: [_jsx(MoreHorizontal, { size: 16, "aria-hidden": true }), _jsx("span", { children: label }), showCount ? (_jsxs("span", { "aria-hidden": true, style: {
47
+ fontVariantNumeric: "tabular-nums",
48
+ opacity: 0.78,
49
+ }, children: ["(", count, ")"] })) : null, _jsx(ChevronDown, { size: 14, "aria-hidden": true, style: {
50
+ transform: open ? "rotate(180deg)" : "rotate(0deg)",
51
+ transition: `transform ${theme.motion.duration.fast} ${theme.motion.easing.out}`,
52
+ } })] }), open ? (_jsx("div", { id: regionId, role: "region", "aria-label": label, style: {
53
+ display: "flex",
54
+ flexDirection: "row",
55
+ flexWrap: "wrap",
56
+ gap: theme.space[2],
57
+ // Inset visually so the disclosed cluster reads as a
58
+ // sub-region rather than a continuation of the main panel.
59
+ paddingInline: theme.space[3],
60
+ paddingBlock: theme.space[2],
61
+ background: theme.semantic.surface.inset,
62
+ borderRadius: theme.radius.lg,
63
+ }, children: children })) : null] }));
64
+ }
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Surfaces the dominant turn-state question — "is this me?" / "who am I
3
+ * waiting for?" — as a single headline, with the phase label demoted to
4
+ * secondary copy underneath.
5
+ *
6
+ * The previous design rendered three peer chips (`Waiting`, `Roll dice`,
7
+ * `Player 3`) which fragmented one piece of information across three
8
+ * UI atoms. The redesign collapses them into a single status line:
9
+ *
10
+ * ◐ Waiting for Player 3…
11
+ * Roll dice
12
+ *
13
+ * ● Your turn
14
+ * Build, trade, or end your turn.
15
+ *
16
+ * Both states get a leading status indicator that animates so the eye
17
+ * picks up the "live" cue immediately. Animations are skipped when the
18
+ * theme reports `motion.reducedMotion === "true"`.
19
+ *
20
+ * Prop API is unchanged so existing callers (Catan, Things-in-Rings,
21
+ * tests) keep working without edits. The `variant` knob still toggles
22
+ * surface treatment (`badge` is layout-only, `bar` wraps the headline
23
+ * in an inset HUD strip, `minimal` collapses to a single underlined
24
+ * label for tight HUDs).
25
+ */
26
+ export interface PhaseIndicatorProps {
27
+ currentPhase: string;
28
+ phaseLabels?: Record<string, string>;
29
+ isMyTurn?: boolean;
30
+ activePlayerNames?: string[];
31
+ variant?: "badge" | "bar" | "minimal";
32
+ className?: string;
33
+ }
34
+ export declare function PhaseIndicator({ currentPhase, phaseLabels, isMyTurn, activePlayerNames, variant, className, }: PhaseIndicatorProps): import("react/jsx-runtime").JSX.Element;
35
+ //# sourceMappingURL=PhaseIndicator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PhaseIndicator.d.ts","sourceRoot":"","sources":["../../src/components/PhaseIndicator.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAQH,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,OAAO,CAAC,EAAE,OAAO,GAAG,KAAK,GAAG,SAAS,CAAC;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,cAAc,CAAC,EAC7B,YAAY,EACZ,WAAW,EACX,QAAQ,EACR,iBAAiB,EACjB,OAAiB,EACjB,SAAS,GACV,EAAE,mBAAmB,2CAyErB"}
@@ -0,0 +1,212 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * Surfaces the dominant turn-state question — "is this me?" / "who am I
4
+ * waiting for?" — as a single headline, with the phase label demoted to
5
+ * secondary copy underneath.
6
+ *
7
+ * The previous design rendered three peer chips (`Waiting`, `Roll dice`,
8
+ * `Player 3`) which fragmented one piece of information across three
9
+ * UI atoms. The redesign collapses them into a single status line:
10
+ *
11
+ * ◐ Waiting for Player 3…
12
+ * Roll dice
13
+ *
14
+ * ● Your turn
15
+ * Build, trade, or end your turn.
16
+ *
17
+ * Both states get a leading status indicator that animates so the eye
18
+ * picks up the "live" cue immediately. Animations are skipped when the
19
+ * theme reports `motion.reducedMotion === "true"`.
20
+ *
21
+ * Prop API is unchanged so existing callers (Catan, Things-in-Rings,
22
+ * tests) keep working without edits. The `variant` knob still toggles
23
+ * surface treatment (`badge` is layout-only, `bar` wraps the headline
24
+ * in an inset HUD strip, `minimal` collapses to a single underlined
25
+ * label for tight HUDs).
26
+ */
27
+ import { motion } from "framer-motion";
28
+ import { clsx } from "clsx";
29
+ import { useTheme } from "../theme/ThemeProvider.js";
30
+ import { surfaceStyle } from "../theme/derive.js";
31
+ export function PhaseIndicator({ currentPhase, phaseLabels, isMyTurn, activePlayerNames, variant = "badge", className, }) {
32
+ const theme = useTheme();
33
+ const reducedMotion = theme.motion.reducedMotion === "true";
34
+ const label = phaseLabels?.[currentPhase] ?? formatPhase(currentPhase);
35
+ if (variant === "minimal") {
36
+ return (_jsx("span", { className: className, style: {
37
+ fontFamily: theme.typography.fontFamily.body,
38
+ fontSize: theme.typography.fontSize.sm,
39
+ fontWeight: theme.typography.fontWeight.bold,
40
+ color: theme.semantic.text.muted,
41
+ textDecoration: "underline",
42
+ textDecorationStyle: "wavy",
43
+ textDecorationColor: theme.semantic.border.subtle,
44
+ textUnderlineOffset: "4px",
45
+ }, role: "status", "aria-label": `Current phase: ${label}`, children: label }));
46
+ }
47
+ // Decide which state we're in. Only one is active at a time so the
48
+ // headline is unambiguous.
49
+ const state = isMyTurn === true
50
+ ? "your-turn"
51
+ : isMyTurn === false && activePlayerNames && activePlayerNames.length > 0
52
+ ? "waiting"
53
+ : "phase-only";
54
+ const containerStyle = variant === "bar"
55
+ ? {
56
+ ...surfaceStyle(theme, { tone: "inset", radius: "hud" }),
57
+ padding: theme.space[3],
58
+ boxShadow: theme.elevation.inset,
59
+ fontFamily: theme.typography.fontFamily.body,
60
+ }
61
+ : { fontFamily: theme.typography.fontFamily.body };
62
+ const headline = renderHeadline({
63
+ state,
64
+ activePlayerNames,
65
+ label,
66
+ theme,
67
+ reducedMotion,
68
+ });
69
+ const ariaLabel = state === "your-turn"
70
+ ? `Your turn — ${label}`
71
+ : state === "waiting"
72
+ ? `Waiting for ${formatPlayerList(activePlayerNames ?? [])} — ${label}`
73
+ : label;
74
+ return (_jsx("div", { className: clsx("flex items-center gap-3 flex-wrap", className), style: containerStyle, role: "status", "aria-live": "polite", "aria-atomic": "true", "aria-label": ariaLabel, children: headline }));
75
+ }
76
+ function formatPhase(phase) {
77
+ const formatted = phase
78
+ .replace(/([A-Z])/g, " $1")
79
+ .replace(/_/g, " ")
80
+ .trim()
81
+ .replace(/^\w/, (c) => c.toUpperCase());
82
+ return formatted === "Player Turn" ? "Turn" : formatted;
83
+ }
84
+ function formatPlayerList(names) {
85
+ if (names.length === 0)
86
+ return "";
87
+ if (names.length === 1)
88
+ return names[0];
89
+ if (names.length === 2)
90
+ return `${names[0]} and ${names[1]}`;
91
+ return `${names.slice(0, -1).join(", ")}, and ${names[names.length - 1]}`;
92
+ }
93
+ function renderHeadline({ state, activePlayerNames, label, theme, reducedMotion, }) {
94
+ if (state === "phase-only") {
95
+ return (_jsx("div", { style: textBlockStyle(theme), children: _jsx("span", { style: titleTextStyle(theme), children: label }) }));
96
+ }
97
+ const isYourTurn = state === "your-turn";
98
+ const intent = isYourTurn
99
+ ? theme.semantic.intent.success
100
+ : theme.semantic.intent.info;
101
+ const titleText = isYourTurn
102
+ ? "Your turn"
103
+ : `Waiting for ${formatPlayerList(activePlayerNames ?? [])}…`;
104
+ return (_jsxs(motion.div, { initial: reducedMotion ? { opacity: 0 } : { opacity: 0, y: -4 }, animate: reducedMotion ? { opacity: 1 } : { opacity: 1, y: 0 }, style: {
105
+ display: "flex",
106
+ alignItems: "center",
107
+ gap: theme.space[3],
108
+ }, children: [_jsx(StatusIndicator, { intent: intent, kind: isYourTurn ? "pulse" : "spinner", reducedMotion: reducedMotion }), _jsxs("div", { style: textBlockStyle(theme), children: [_jsx("span", { style: titleTextStyle(theme), children: titleText }), _jsx("span", { style: subtitleTextStyle(theme), children: label })] })] }));
109
+ }
110
+ function textBlockStyle(theme) {
111
+ return {
112
+ display: "flex",
113
+ flexDirection: "column",
114
+ alignItems: "flex-start",
115
+ gap: theme.space[0.5],
116
+ minWidth: 0,
117
+ };
118
+ }
119
+ function titleTextStyle(theme) {
120
+ return {
121
+ fontFamily: theme.typography.fontFamily.body,
122
+ fontSize: theme.typography.fontSize.lg,
123
+ fontWeight: theme.typography.fontWeight.bold,
124
+ letterSpacing: theme.typography.letterSpacing.tight,
125
+ lineHeight: theme.typography.lineHeight.tight,
126
+ color: theme.semantic.text.primary,
127
+ };
128
+ }
129
+ function subtitleTextStyle(theme) {
130
+ return {
131
+ fontFamily: theme.typography.fontFamily.body,
132
+ fontSize: theme.typography.fontSize.xs,
133
+ fontWeight: theme.typography.fontWeight.medium,
134
+ letterSpacing: theme.typography.letterSpacing.caps,
135
+ textTransform: "uppercase",
136
+ color: theme.semantic.text.muted,
137
+ };
138
+ }
139
+ /**
140
+ * Animated status indicator sized to sit next to a body-font headline.
141
+ *
142
+ * Kept intentionally chip-less so it shares the chrome strip's
143
+ * understated treatment (the rest of the chrome uses bare typography
144
+ * and lets intent colour live in chips, dots, and borders — not in
145
+ * full-saturation surfaces). The colour comes from one
146
+ * {@link Theme}-supplied intent ramp so swapping themes keeps the
147
+ * indicator consistent with chips, toasts, and buttons that use the
148
+ * same intent.
149
+ *
150
+ * - `pulse` — soft halo radiating outward from a solid centre dot.
151
+ * Used for the player's own active turn.
152
+ * - `spinner` — thin partial ring rotating around a soft-filled
153
+ * centre. Reads as the standard "in flight / live" affordance.
154
+ */
155
+ function StatusIndicator({ intent, kind, reducedMotion, }) {
156
+ const size = 16;
157
+ if (kind === "pulse") {
158
+ return (_jsxs("span", { "aria-hidden": "true", style: {
159
+ position: "relative",
160
+ display: "inline-flex",
161
+ alignItems: "center",
162
+ justifyContent: "center",
163
+ width: size,
164
+ height: size,
165
+ flexShrink: 0,
166
+ }, children: [_jsx(motion.span, { style: {
167
+ position: "absolute",
168
+ inset: 2,
169
+ borderRadius: "9999px",
170
+ background: intent.soft,
171
+ }, animate: reducedMotion
172
+ ? undefined
173
+ : { scale: [1, 1.6, 1], opacity: [0.7, 0, 0.7] }, transition: {
174
+ repeat: reducedMotion ? 0 : Infinity,
175
+ duration: 1.6,
176
+ ease: "easeOut",
177
+ } }), _jsx("span", { style: {
178
+ position: "relative",
179
+ display: "inline-block",
180
+ width: 8,
181
+ height: 8,
182
+ borderRadius: "9999px",
183
+ background: intent.solid,
184
+ } })] }));
185
+ }
186
+ // "spinner" — partial ring rotating around an inset soft fill.
187
+ return (_jsxs("span", { "aria-hidden": "true", style: {
188
+ position: "relative",
189
+ display: "inline-flex",
190
+ alignItems: "center",
191
+ justifyContent: "center",
192
+ width: size,
193
+ height: size,
194
+ flexShrink: 0,
195
+ }, children: [_jsx("span", { style: {
196
+ position: "absolute",
197
+ inset: 4,
198
+ borderRadius: "9999px",
199
+ background: intent.soft,
200
+ } }), _jsx(motion.span, { style: {
201
+ position: "absolute",
202
+ inset: 0,
203
+ borderRadius: "9999px",
204
+ border: "2px solid transparent",
205
+ borderTopColor: intent.solid,
206
+ borderRightColor: intent.solid,
207
+ }, animate: reducedMotion ? undefined : { rotate: 360 }, transition: {
208
+ repeat: reducedMotion ? 0 : Infinity,
209
+ duration: 1.2,
210
+ ease: "linear",
211
+ } })] }));
212
+ }
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Central game board area for active game components (tricks, played
3
+ * cards, zones, etc.).
4
+ *
5
+ * Visual chrome (frame, empty placeholder, card entrance/exit) is
6
+ * sourced from the active {@link useTheme} so the play area re-skins
7
+ * with the rest of the shell.
8
+ */
9
+ import { type CardProps, type ViewCard } from "./Card.js";
10
+ export interface PlayAreaProps<CardData extends ViewCard = ViewCard> {
11
+ cards: readonly CardData[];
12
+ filter?: (card: CardData) => boolean;
13
+ cardSize?: CardProps["size"];
14
+ renderCard?: CardProps<CardData>["renderContent"];
15
+ layout?: "grid" | "row";
16
+ interactive?: boolean;
17
+ onCardClick?: (cardId: string) => void;
18
+ "aria-label"?: string;
19
+ className?: string;
20
+ }
21
+ /**
22
+ * @example
23
+ * ```tsx
24
+ * <PlayArea cards={trickCards} layout="row" renderCard={(card) => <PlayingCard card={card} />} />
25
+ * ```
26
+ */
27
+ export declare function PlayArea<CardData extends ViewCard = ViewCard>({ cards, filter, cardSize, renderCard, layout, interactive, onCardClick, "aria-label": ariaLabel, className, }: PlayAreaProps<CardData>): import("react/jsx-runtime").JSX.Element;
28
+ //# sourceMappingURL=PlayArea.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlayArea.d.ts","sourceRoot":"","sources":["../../src/components/PlayArea.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAAQ,KAAK,SAAS,EAAE,KAAK,QAAQ,EAAE,MAAM,WAAW,CAAC;AAIhE,MAAM,WAAW,aAAa,CAAC,QAAQ,SAAS,QAAQ,GAAG,QAAQ;IACjE,KAAK,EAAE,SAAS,QAAQ,EAAE,CAAC;IAC3B,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,OAAO,CAAC;IACrC,QAAQ,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IAC7B,UAAU,CAAC,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC,eAAe,CAAC,CAAC;IAClD,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,SAAS,QAAQ,GAAG,QAAQ,EAAE,EAC7D,KAAK,EACL,MAAM,EACN,QAAe,EACf,UAAU,EACV,MAAc,EACd,WAAmB,EACnB,WAAW,EACX,YAAY,EAAE,SAAuB,EACrC,SAAS,GACV,EAAE,aAAa,CAAC,QAAQ,CAAC,2CAiFzB"}
@@ -0,0 +1,48 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /**
3
+ * Central game board area for active game components (tricks, played
4
+ * cards, zones, etc.).
5
+ *
6
+ * Visual chrome (frame, empty placeholder, card entrance/exit) is
7
+ * sourced from the active {@link useTheme} so the play area re-skins
8
+ * with the rest of the shell.
9
+ */
10
+ import { motion, AnimatePresence } from "framer-motion";
11
+ import { clsx } from "clsx";
12
+ import { Card } from "./Card.js";
13
+ import { useTheme } from "../theme/ThemeProvider.js";
14
+ import { chipStyle } from "../theme/derive.js";
15
+ /**
16
+ * @example
17
+ * ```tsx
18
+ * <PlayArea cards={trickCards} layout="row" renderCard={(card) => <PlayingCard card={card} />} />
19
+ * ```
20
+ */
21
+ export function PlayArea({ cards, filter, cardSize = "md", renderCard, layout = "row", interactive = false, onCardClick, "aria-label": ariaLabel = "Play area", className, }) {
22
+ const theme = useTheme();
23
+ const reducedMotion = theme.motion.reducedMotion === "true";
24
+ const visibleCards = filter ? cards.filter(filter) : cards;
25
+ const layoutClasses = {
26
+ grid: "grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 gap-3 sm:gap-6",
27
+ row: "flex flex-wrap items-center justify-center gap-3 sm:gap-6",
28
+ };
29
+ return (_jsx("div", { className: clsx("relative w-full min-h-[200px] sm:min-h-[300px] p-6 sm:p-8", className), style: {
30
+ background: theme.semantic.surface.inset,
31
+ border: `2px dashed ${theme.semantic.border.default}`,
32
+ borderRadius: theme.radius.hud,
33
+ fontFamily: theme.typography.fontFamily.body,
34
+ color: theme.semantic.text.primary,
35
+ }, role: "region", "aria-label": `${ariaLabel} - ${visibleCards.length} item${visibleCards.length !== 1 ? "s" : ""}`, children: _jsx(AnimatePresence, { mode: "popLayout", children: visibleCards.length === 0 ? (_jsx(motion.div, { className: "flex items-center justify-center h-full absolute inset-0 pointer-events-none", initial: { opacity: 0 }, animate: { opacity: 1 }, exit: { opacity: 0 }, role: "status", "aria-live": "polite", children: _jsx("div", { style: {
36
+ ...chipStyle(theme, { variant: "warning", size: "md" }),
37
+ fontSize: theme.typography.fontSize.md,
38
+ paddingBlock: theme.space[2],
39
+ paddingInline: theme.space[4],
40
+ }, children: "No cards in play" }) })) : (_jsx("div", { className: layoutClasses[layout], children: visibleCards.map((card, index) => (_jsx(motion.div, { layout: !reducedMotion, initial: reducedMotion
41
+ ? { opacity: 0, scale: 1 }
42
+ : { opacity: 0, scale: 0.8 }, animate: { opacity: 1, scale: 1 }, exit: { opacity: 0, scale: 0.8 }, transition: {
43
+ type: "spring",
44
+ stiffness: 260,
45
+ damping: 20,
46
+ delay: reducedMotion ? 0 : index * 0.05,
47
+ }, children: _jsx(Card, { card: card, size: cardSize, renderContent: renderCard, disabled: !interactive, onCardClick: interactive ? onCardClick : undefined }) }, card.id))) })) }) }));
48
+ }
@@ -0,0 +1,37 @@
1
+ import React from "react";
2
+ export interface PluginRuntimeProps {
3
+ /** Child components to render after state sync has started */
4
+ children: React.ReactNode;
5
+ /**
6
+ * Timeout in milliseconds to wait for the first state-sync snapshot.
7
+ * @default 10000 (10 seconds)
8
+ */
9
+ timeout?: number;
10
+ /** Custom loading component to show while waiting for state sync */
11
+ loadingComponent?: React.ReactNode;
12
+ /** Custom error component to show when initialization fails */
13
+ errorComponent?: (error: string) => React.ReactNode;
14
+ }
15
+ /**
16
+ * PluginRuntime provides the RuntimeContext for plugin components.
17
+ *
18
+ * This component:
19
+ * - Creates a RuntimeAPI instance using the SDK-provided implementation
20
+ * - Waits for the first reducer-native state-sync snapshot before rendering children
21
+ * - Provides RuntimeAPI and session state to all child components
22
+ *
23
+ * @example
24
+ * ```tsx
25
+ * // In your plugin's index.tsx
26
+ * import { PluginRuntime } from "./components/dreamboard";
27
+ * import App from './App';
28
+ *
29
+ * ReactDOM.createRoot(document.getElementById('root')!).render(
30
+ * <PluginRuntime>
31
+ * <App />
32
+ * </PluginRuntime>
33
+ * );
34
+ * ```
35
+ */
36
+ export declare function PluginRuntime({ children, timeout, loadingComponent, errorComponent, }: PluginRuntimeProps): import("react/jsx-runtime").JSX.Element;
37
+ //# sourceMappingURL=PluginRuntime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PluginRuntime.d.ts","sourceRoot":"","sources":["../../src/components/PluginRuntime.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAO1B,MAAM,WAAW,kBAAkB;IACjC,8DAA8D;IAC9D,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oEAAoE;IACpE,gBAAgB,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACnC,+DAA+D;IAC/D,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,KAAK,CAAC,SAAS,CAAC;CACrD;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,aAAa,CAAC,EAC5B,QAAQ,EACR,OAAe,EACf,gBAAgB,EAChB,cAAc,GACf,EAAE,kBAAkB,2CA+BpB"}
@@ -0,0 +1,47 @@
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { InteractionUiProvider } from "../context/InteractionDraftContext.js";
3
+ import { RuntimeProvider } from "../context/RuntimeContext.js";
4
+ import { usePluginSession } from "../context/PluginSessionContext.js";
5
+ import { usePluginRuntime } from "../hooks/usePluginRuntime.js";
6
+ import { GameSkeleton } from "./GameSkeleton.js";
7
+ /**
8
+ * PluginRuntime provides the RuntimeContext for plugin components.
9
+ *
10
+ * This component:
11
+ * - Creates a RuntimeAPI instance using the SDK-provided implementation
12
+ * - Waits for the first reducer-native state-sync snapshot before rendering children
13
+ * - Provides RuntimeAPI and session state to all child components
14
+ *
15
+ * @example
16
+ * ```tsx
17
+ * // In your plugin's index.tsx
18
+ * import { PluginRuntime } from "./components/dreamboard";
19
+ * import App from './App';
20
+ *
21
+ * ReactDOM.createRoot(document.getElementById('root')!).render(
22
+ * <PluginRuntime>
23
+ * <App />
24
+ * </PluginRuntime>
25
+ * );
26
+ * ```
27
+ */
28
+ export function PluginRuntime({ children, timeout = 10000, loadingComponent, errorComponent, }) {
29
+ const { runtime, isReady, error } = usePluginRuntime({ timeout });
30
+ if (error) {
31
+ if (errorComponent) {
32
+ return _jsx(_Fragment, { children: errorComponent(error) });
33
+ }
34
+ return (_jsx("div", { className: "flex h-full w-full items-center justify-center bg-gray-50", children: _jsxs("div", { className: "text-center p-6", children: [_jsx("p", { className: "text-red-600 font-medium mb-2", children: "Failed to load game" }), _jsx("p", { className: "text-gray-600 text-sm", children: error })] }) }));
35
+ }
36
+ if (!isReady) {
37
+ if (loadingComponent) {
38
+ return _jsx(_Fragment, { children: loadingComponent });
39
+ }
40
+ return _jsx(GameSkeleton, { message: "Waiting for game state..." });
41
+ }
42
+ return (_jsx(RuntimeProvider, { runtime: runtime, children: _jsx(SessionScopedInteractionUiProvider, { children: children }) }));
43
+ }
44
+ function SessionScopedInteractionUiProvider({ children, }) {
45
+ const { controllingPlayerId } = usePluginSession();
46
+ return (_jsx(InteractionUiProvider, { children: children }, controllingPlayerId ?? "__no_player__"));
47
+ }
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Theme-aware primary CTA button — the dominant call-to-action on
3
+ * the screen at any given moment ("Roll dice", "End turn", "Confirm
4
+ * trade", "Place settlement").
5
+ *
6
+ * The shell's `chrome.primaryAction` slot accepts either a
7
+ * pre-rendered React node *or* an {@link InteractionHandle}. When a
8
+ * handle is supplied, the shell wraps it in this component so the
9
+ * call site collapses from ~10 lines to one. Authors who need a
10
+ * fully bespoke CTA can still pass any node.
11
+ *
12
+ * Visual contract (Laws of UX cross-references):
13
+ *
14
+ * - **Fitts** — defaults to `lg` size (min 56px tall, generous
15
+ * horizontal padding) so the dock target is easy to land on.
16
+ * Authors can opt down to `md`.
17
+ * - **Von Restorff (isolation)** — uses `intent.primary.solid` with
18
+ * `elevation.lifted` and an animated halo when `attention="auto"`
19
+ * and the descriptor is available, so the button outranks every
20
+ * other element in its peripheral neighbourhood.
21
+ * - **Peak-end** — when the action becomes available (handle flips
22
+ * from disabled → enabled), the halo pulses for one breath cycle
23
+ * so the eye finds the change without re-scanning the screen.
24
+ * - **Doherty / responsiveness** — clicks set an internal `pending`
25
+ * flag the moment submit fires so the button visibly absorbs the
26
+ * tap, even on slow networks. Throwing submitters are swallowed
27
+ * here for the same reason `<DefaultInteractionButton>` does:
28
+ * descriptor availability is authoritative.
29
+ * - **Accessibility** — minimum 56×56 hit area satisfies WCAG 2.5.5.
30
+ * `prefers-reduced-motion` zeroes out the halo and press
31
+ * transitions through the theme's `motion.reducedMotion` token.
32
+ */
33
+ import { type CSSProperties, type ReactNode } from "react";
34
+ import { type ButtonSize, type ButtonVariant } from "../theme/derive.js";
35
+ import type { InteractionHandle, InteractionParamsShape } from "../hooks/useInteractionHandle.js";
36
+ import type { SubmittedActionConfig } from "./surfaces/internal/DefaultInteractionButton.js";
37
+ /** Attention-pulse policy for the trailing halo. */
38
+ export type PrimaryActionAttention = "auto" | "always" | "off";
39
+ export interface PrimaryActionButtonProps<Params extends InteractionParamsShape = InteractionParamsShape> {
40
+ /**
41
+ * Bound interaction handle (typically from `useInteractionByKey`).
42
+ * The button mirrors `descriptor.label`, disables itself when the
43
+ * descriptor is unavailable, surfaces `unavailableReason` as a
44
+ * tooltip, and submits explicit `params` or the current draft on click.
45
+ */
46
+ handle: InteractionHandle<Params>;
47
+ /**
48
+ * Override the visual variant. Defaults to `primary` (which maps
49
+ * to `intent.primary` regardless of the descriptor's `emphasis`
50
+ * hint — the shell's primary slot is, by definition, primary).
51
+ */
52
+ variant?: ButtonVariant;
53
+ /**
54
+ * Sizing. Defaults to `lg` so the dock target is comfortable on
55
+ * touch and visually outranks panel buttons sized `md`.
56
+ */
57
+ size?: ButtonSize;
58
+ /**
59
+ * Override the label inferred from `descriptor.label`. Use only
60
+ * when the descriptor's label needs phase-specific copy that the
61
+ * authoring layer can't express.
62
+ */
63
+ label?: ReactNode;
64
+ /** Client-side draft readiness. Reducer availability remains authoritative. */
65
+ ready?: boolean;
66
+ /** Copy and visual overrides once this interaction has been submitted. */
67
+ whenSubmitted?: SubmittedActionConfig;
68
+ /**
69
+ * Optional leading icon override. When omitted, falls back to
70
+ * `descriptor.icon` (an emoji glyph from the authoring spec).
71
+ */
72
+ icon?: ReactNode;
73
+ /**
74
+ * Submit params forwarded to `handle.submit`. When omitted, the button
75
+ * submits the handle's current draft via `handle.submitDraft()`.
76
+ */
77
+ params?: Record<string, unknown>;
78
+ /**
79
+ * Attention-halo policy. `auto` (default) pulses the halo for one
80
+ * breath when the button transitions from disabled → enabled (so
81
+ * the user sees the moment the action becomes available), then
82
+ * settles into a slow ambient breath while the action remains
83
+ * available. `always` keeps the breath running unconditionally.
84
+ * `off` suppresses the halo entirely.
85
+ *
86
+ * Ignored when `theme.motion.reducedMotion === "true"`.
87
+ */
88
+ attention?: PrimaryActionAttention;
89
+ /** Additional inline style merged after the resolved button style. */
90
+ style?: CSSProperties;
91
+ /** Optional className for downstream styling hooks. */
92
+ className?: string;
93
+ }
94
+ /**
95
+ * @see PrimaryActionButtonProps
96
+ */
97
+ export declare function PrimaryActionButton<Params extends InteractionParamsShape = InteractionParamsShape>({ handle, variant, size, label, ready, whenSubmitted, icon, params, attention, style, className, }: PrimaryActionButtonProps<Params>): import("react/jsx-runtime").JSX.Element;
98
+ //# sourceMappingURL=PrimaryActionButton.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PrimaryActionButton.d.ts","sourceRoot":"","sources":["../../src/components/PrimaryActionButton.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,EAIL,KAAK,aAAa,EAClB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAGf,OAAO,EAEL,KAAK,UAAU,EACf,KAAK,aAAa,EACnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EACV,iBAAiB,EACjB,sBAAsB,EACvB,MAAM,kCAAkC,CAAC;AAG1C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iDAAiD,CAAC;AAE7F,oDAAoD;AACpD,MAAM,MAAM,sBAAsB,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;AAE/D,MAAM,WAAW,wBAAwB,CACvC,MAAM,SAAS,sBAAsB,GAAG,sBAAsB;IAE9D;;;;;OAKG;IACH,MAAM,EAAE,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAClC;;;;OAIG;IACH,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB;;;OAGG;IACH,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB;;;;OAIG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,+EAA+E;IAC/E,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,0EAA0E;IAC1E,aAAa,CAAC,EAAE,qBAAqB,CAAC;IACtC;;;OAGG;IACH,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC;;;;;;;;;OASG;IACH,SAAS,CAAC,EAAE,sBAAsB,CAAC;IACnC,sEAAsE;IACtE,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,SAAS,sBAAsB,GAAG,sBAAsB,EAC9D,EACA,MAAM,EACN,OAAmB,EACnB,IAAW,EACX,KAAK,EACL,KAAY,EACZ,aAAa,EACb,IAAI,EACJ,MAAM,EACN,SAAkB,EAClB,KAAK,EACL,SAAS,GACV,EAAE,wBAAwB,CAAC,MAAM,CAAC,2CA+KlC"}