@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,435 @@
1
+ /**
2
+ * DiceRoller component fixtures
3
+ * Demonstrates dice display with separate roll action handling
4
+ *
5
+ * In authored game UIs, the roll action should come from reducer actions or
6
+ * reducer-projected view state. These fixtures simulate that pattern with local
7
+ * state.
8
+ */
9
+ import React, { useState, useCallback } from "react";
10
+ import { motion } from "framer-motion";
11
+ import { Dice5 } from "lucide-react";
12
+ import { clsx } from "clsx";
13
+ import { DiceRoller, type DiceRollerRenderProps } from "../DiceRoller.js";
14
+
15
+ function Container({ children }: { children: React.ReactNode }) {
16
+ return (
17
+ <div className="min-h-screen bg-gradient-to-br from-slate-800 to-slate-900 p-8">
18
+ <div className="max-w-md mx-auto space-y-6 flex flex-col items-center justify-center">
19
+ {children}
20
+ </div>
21
+ </div>
22
+ );
23
+ }
24
+
25
+ // Default styled dice display
26
+ function DefaultDiceDisplay({
27
+ values,
28
+ sum,
29
+ diceCount,
30
+ allRolled,
31
+ }: DiceRollerRenderProps) {
32
+ const diceToDisplay = values || Array(diceCount).fill(undefined);
33
+
34
+ return (
35
+ <div className="flex flex-col items-center gap-4">
36
+ <div className="flex gap-3" role="list" aria-label="Dice values">
37
+ {diceToDisplay.map((value, i) => (
38
+ <div
39
+ key={i}
40
+ className="w-12 h-12 text-2xl rounded-lg bg-white text-slate-900 font-bold flex items-center justify-center shadow-lg border-2 border-slate-200"
41
+ >
42
+ {value !== undefined ? (
43
+ value
44
+ ) : (
45
+ <span className="text-slate-400">—</span>
46
+ )}
47
+ </div>
48
+ ))}
49
+ </div>
50
+
51
+ {allRolled && sum !== undefined && (
52
+ <motion.div
53
+ initial={{ scale: 0.95, opacity: 0 }}
54
+ animate={{ scale: 1, opacity: 1 }}
55
+ transition={{ type: "spring", stiffness: 500, damping: 20 }}
56
+ className="text-4xl font-bold text-white"
57
+ >
58
+ Total: {sum}
59
+ </motion.div>
60
+ )}
61
+ </div>
62
+ );
63
+ }
64
+
65
+ // Rolling animation display
66
+ function RollingDiceDisplay({ diceCount }: { diceCount: number }) {
67
+ return (
68
+ <div className="flex flex-col items-center gap-4">
69
+ <div className="flex gap-3" role="list" aria-label="Dice values">
70
+ {Array(diceCount)
71
+ .fill(null)
72
+ .map((_, i) => (
73
+ <motion.div
74
+ key={i}
75
+ animate={{
76
+ rotate: 360,
77
+ scale: [1, 1.1, 1],
78
+ }}
79
+ transition={{
80
+ rotate: { duration: 0.4, repeat: Infinity, ease: "linear" },
81
+ scale: { duration: 0.2, repeat: Infinity },
82
+ }}
83
+ className="w-12 h-12 text-2xl rounded-lg bg-white text-slate-900 font-bold flex items-center justify-center shadow-lg border-2 border-slate-200"
84
+ >
85
+ <span className="opacity-70">?</span>
86
+ </motion.div>
87
+ ))}
88
+ </div>
89
+ </div>
90
+ );
91
+ }
92
+
93
+ // Roll button component
94
+ function RollButton({
95
+ onRoll,
96
+ disabled,
97
+ rolling,
98
+ }: {
99
+ onRoll: () => void;
100
+ disabled?: boolean;
101
+ rolling?: boolean;
102
+ }) {
103
+ return (
104
+ <motion.button
105
+ type="button"
106
+ whileHover={!disabled && !rolling ? { scale: 1.05 } : undefined}
107
+ onClick={onRoll}
108
+ disabled={disabled || rolling}
109
+ className={clsx(
110
+ "px-6 py-3 rounded-lg font-bold transition-all flex items-center gap-2",
111
+ !disabled && !rolling
112
+ ? "bg-gradient-to-r from-blue-500 to-purple-500 hover:from-blue-600 hover:to-purple-600 text-white"
113
+ : "bg-slate-700 text-slate-400 cursor-not-allowed",
114
+ )}
115
+ >
116
+ <Dice5 className={clsx("w-5 h-5", rolling && "animate-spin")} />
117
+ {rolling ? "Rolling..." : "Roll Dice"}
118
+ </motion.button>
119
+ );
120
+ }
121
+
122
+ // Simulate reducer-driven dice state for fixtures
123
+ function useSimulatedDice(diceCount: number) {
124
+ const [values, setValues] = useState<Array<number | undefined>>(() =>
125
+ Array(diceCount).fill(undefined),
126
+ );
127
+ const [rolling, setRolling] = useState(false);
128
+
129
+ const roll = useCallback(async () => {
130
+ setRolling(true);
131
+ // Simulate network delay
132
+ await new Promise((resolve) => setTimeout(resolve, 1500));
133
+ setValues(
134
+ Array(diceCount)
135
+ .fill(null)
136
+ .map(() => Math.floor(Math.random() * 6) + 1),
137
+ );
138
+ setRolling(false);
139
+ }, [diceCount]);
140
+
141
+ const allRolled = values.every((v) => v !== undefined);
142
+ const sum = allRolled
143
+ ? values.reduce((a, b) => (a ?? 0) + (b ?? 0), 0)
144
+ : undefined;
145
+
146
+ return { values, rolling, roll, allRolled, sum };
147
+ }
148
+
149
+ // Interactive demo with actual rolling
150
+ function InteractiveDemo() {
151
+ const { values, rolling, roll } = useSimulatedDice(2);
152
+
153
+ return (
154
+ <Container>
155
+ <h2 className="text-xl font-bold text-white mb-4">Interactive Demo</h2>
156
+ <p className="text-slate-400 text-sm mb-4">
157
+ Roll action is separate from display component
158
+ </p>
159
+
160
+ {rolling ? (
161
+ <RollingDiceDisplay diceCount={2} />
162
+ ) : (
163
+ <DiceRoller
164
+ values={values}
165
+ render={(props) => <DefaultDiceDisplay {...props} />}
166
+ />
167
+ )}
168
+
169
+ <RollButton onRoll={roll} rolling={rolling} />
170
+ </Container>
171
+ );
172
+ }
173
+
174
+ // Three dice demo
175
+ function ThreeDiceDemo() {
176
+ const { values, rolling, roll } = useSimulatedDice(3);
177
+
178
+ return (
179
+ <Container>
180
+ <h2 className="text-xl font-bold text-white mb-4">Three Dice</h2>
181
+
182
+ {rolling ? (
183
+ <RollingDiceDisplay diceCount={3} />
184
+ ) : (
185
+ <DiceRoller
186
+ values={values}
187
+ diceCount={3}
188
+ render={(props) => <DefaultDiceDisplay {...props} />}
189
+ />
190
+ )}
191
+
192
+ <RollButton onRoll={roll} rolling={rolling} />
193
+ </Container>
194
+ );
195
+ }
196
+
197
+ // Minimal custom styling demo
198
+ function MinimalStyleDemo() {
199
+ const [values, setValues] = useState<Array<number | undefined>>([4, 3]);
200
+ const [rolling, setRolling] = useState(false);
201
+
202
+ const handleRoll = async () => {
203
+ setRolling(true);
204
+ await new Promise((resolve) => setTimeout(resolve, 1000));
205
+ setValues([
206
+ Math.floor(Math.random() * 6) + 1,
207
+ Math.floor(Math.random() * 6) + 1,
208
+ ]);
209
+ setRolling(false);
210
+ };
211
+
212
+ return (
213
+ <Container>
214
+ <h2 className="text-xl font-bold text-white mb-4">
215
+ Minimal Custom Style
216
+ </h2>
217
+
218
+ <DiceRoller
219
+ values={values}
220
+ render={({ values, sum, allRolled }) => (
221
+ <div className="text-center">
222
+ <div className="flex gap-2 justify-center mb-2">
223
+ {(values || [undefined, undefined]).map((v, i) => (
224
+ <span
225
+ key={i}
226
+ className="w-10 h-10 bg-amber-500 text-black font-mono text-xl flex items-center justify-center rounded"
227
+ >
228
+ {rolling ? "•" : (v ?? "?")}
229
+ </span>
230
+ ))}
231
+ </div>
232
+ {allRolled && !rolling && (
233
+ <span className="text-amber-400 text-2xl font-mono">= {sum}</span>
234
+ )}
235
+ </div>
236
+ )}
237
+ />
238
+
239
+ <button
240
+ onClick={handleRoll}
241
+ disabled={rolling}
242
+ className="px-4 py-2 bg-amber-500 text-black font-bold rounded hover:bg-amber-400 disabled:opacity-50"
243
+ >
244
+ {rolling ? "..." : "🎲 Roll"}
245
+ </button>
246
+ </Container>
247
+ );
248
+ }
249
+
250
+ // Emoji dice demo
251
+ function EmojiDiceDemo() {
252
+ const [values, setValues] = useState<Array<number | undefined>>([5, 2]);
253
+
254
+ const diceEmoji = ["", "⚀", "⚁", "⚂", "⚃", "⚄", "⚅"];
255
+
256
+ const handleRoll = () => {
257
+ setValues([
258
+ Math.floor(Math.random() * 6) + 1,
259
+ Math.floor(Math.random() * 6) + 1,
260
+ ]);
261
+ };
262
+
263
+ return (
264
+ <Container>
265
+ <h2 className="text-xl font-bold text-white mb-4">Emoji Dice</h2>
266
+
267
+ <DiceRoller
268
+ values={values}
269
+ render={({ values, sum }) => (
270
+ <div className="text-center">
271
+ <div className="text-8xl mb-4">
272
+ {values?.map((v, i) => (
273
+ <span key={i}>{v ? diceEmoji[v] : "🎲"}</span>
274
+ )) ?? "🎲🎲"}
275
+ </div>
276
+ {values?.every((v) => v !== undefined) && (
277
+ <div className="text-3xl text-white font-bold">Sum: {sum}</div>
278
+ )}
279
+ </div>
280
+ )}
281
+ />
282
+
283
+ <button
284
+ onClick={handleRoll}
285
+ className="text-4xl hover:scale-110 transition-transform"
286
+ >
287
+ 🎯 Tap to Roll
288
+ </button>
289
+ </Container>
290
+ );
291
+ }
292
+
293
+ // Read-only display (no button)
294
+ function ReadOnlyDemo() {
295
+ return (
296
+ <Container>
297
+ <h2 className="text-xl font-bold text-white mb-4">Read-Only Display</h2>
298
+ <p className="text-slate-400 text-sm mb-4">
299
+ Display only - no roll action needed
300
+ </p>
301
+
302
+ <DiceRoller
303
+ values={[6, 6]}
304
+ render={({ values, sum }) => (
305
+ <div className="text-center">
306
+ <div className="flex gap-4 justify-center mb-4">
307
+ {values?.map((v, i) => (
308
+ <div
309
+ key={i}
310
+ className="w-16 h-16 bg-green-500 text-white text-3xl font-bold flex items-center justify-center rounded-xl shadow-lg"
311
+ >
312
+ {v}
313
+ </div>
314
+ ))}
315
+ </div>
316
+ <div className="text-green-400 text-xl">
317
+ 🎉 Double sixes! Total: {sum}
318
+ </div>
319
+ </div>
320
+ )}
321
+ />
322
+ </Container>
323
+ );
324
+ }
325
+
326
+ export default {
327
+ interactive: <InteractiveDemo />,
328
+
329
+ threeDice: <ThreeDiceDemo />,
330
+
331
+ minimalStyle: <MinimalStyleDemo />,
332
+
333
+ emojiDice: <EmojiDiceDemo />,
334
+
335
+ readOnly: <ReadOnlyDemo />,
336
+
337
+ default: (
338
+ <Container>
339
+ <h2 className="text-xl font-bold text-white mb-4">
340
+ Default (Not Rolled)
341
+ </h2>
342
+ <DiceRoller
343
+ diceCount={2}
344
+ render={(props) => <DefaultDiceDisplay {...props} />}
345
+ />
346
+ <RollButton onRoll={() => console.log("Roll!")} />
347
+ </Container>
348
+ ),
349
+
350
+ withValues: (
351
+ <Container>
352
+ <h2 className="text-xl font-bold text-white mb-4">With Values</h2>
353
+ <DiceRoller
354
+ values={[4, 6]}
355
+ render={(props) => <DefaultDiceDisplay {...props} />}
356
+ />
357
+ </Container>
358
+ ),
359
+
360
+ disabled: (
361
+ <Container>
362
+ <h2 className="text-xl font-bold text-white mb-4">Disabled</h2>
363
+ <DiceRoller
364
+ values={[2, 4]}
365
+ render={(props) => <DefaultDiceDisplay {...props} />}
366
+ />
367
+ <motion.button
368
+ type="button"
369
+ disabled
370
+ className="px-6 py-3 rounded-lg font-bold bg-slate-700 text-slate-400 cursor-not-allowed flex items-center gap-2"
371
+ >
372
+ <Dice5 className="w-5 h-5" />
373
+ Wait for your turn
374
+ </motion.button>
375
+ </Container>
376
+ ),
377
+
378
+ catanStyle: (
379
+ <Container>
380
+ <h2 className="text-xl font-bold text-white mb-4">
381
+ Catan Style (7 = Robber!)
382
+ </h2>
383
+ <DiceRoller
384
+ values={[4, 3]}
385
+ render={({ values, sum }) => (
386
+ <div className="text-center">
387
+ <div className="flex gap-4 justify-center mb-4">
388
+ {values?.map((v, i) => (
389
+ <div
390
+ key={i}
391
+ className="w-16 h-16 bg-white text-slate-900 text-3xl font-bold flex items-center justify-center rounded-xl shadow-lg border-4 border-red-500"
392
+ >
393
+ {v}
394
+ </div>
395
+ ))}
396
+ </div>
397
+ <div className="text-5xl font-bold text-white mb-2">{sum}</div>
398
+ {sum === 7 && (
399
+ <p className="text-red-400 text-lg font-bold">
400
+ 🏴‍☠️ Robber Activates!
401
+ </p>
402
+ )}
403
+ </div>
404
+ )}
405
+ />
406
+ </Container>
407
+ ),
408
+
409
+ /**
410
+ * Example of how to use with reducer-provided dice state (pseudo-code)
411
+ *
412
+ * ```tsx
413
+ * function CatanDicePanel() {
414
+ * const view = useGameView();
415
+ * const inbox = useSeatInbox();
416
+ * const rollDice = inbox.bySurface.panel?.find(
417
+ * (d) => d.interactionId === "rollDice",
418
+ * );
419
+ * const handle = useInteractionHandle(rollDice);
420
+ *
421
+ * return (
422
+ * <div>
423
+ * <DiceRoller
424
+ * values={view.dice.values}
425
+ * render={({ sum }) => <div className="text-4xl">{sum ?? "?"}</div>}
426
+ * />
427
+ * <button onClick={() => handle.submit()} disabled={!handle.isReady}>
428
+ * Roll Dice
429
+ * </button>
430
+ * </div>
431
+ * );
432
+ * }
433
+ * ```
434
+ */
435
+ };
@@ -0,0 +1,113 @@
1
+ /**
2
+ * Drawer component fixtures
3
+ * Demonstrates the mobile-friendly drawer component (based on vaul)
4
+ */
5
+ import React, { useState } from "react";
6
+ import {
7
+ Drawer,
8
+ DrawerContent,
9
+ DrawerHeader,
10
+ DrawerTitle,
11
+ DrawerDescription,
12
+ DrawerFooter,
13
+ DrawerTrigger,
14
+ DrawerClose,
15
+ } from "../Drawer.js";
16
+
17
+ function BasicDrawerDemo() {
18
+ return (
19
+ <div className="min-h-screen bg-slate-100 p-8">
20
+ <h2 className="text-xl font-bold mb-4">Basic Drawer</h2>
21
+ <Drawer>
22
+ <DrawerTrigger asChild>
23
+ <button className="px-4 py-2 bg-blue-500 text-white rounded-lg hover:bg-blue-600">
24
+ Open Drawer
25
+ </button>
26
+ </DrawerTrigger>
27
+ <DrawerContent>
28
+ <DrawerHeader>
29
+ <DrawerTitle>Game Menu</DrawerTitle>
30
+ <DrawerDescription>
31
+ Select an option from the menu below
32
+ </DrawerDescription>
33
+ </DrawerHeader>
34
+ <div className="p-4 space-y-3">
35
+ <button className="w-full p-3 text-left bg-white rounded-lg border hover:bg-slate-50">
36
+ View Rules
37
+ </button>
38
+ <button className="w-full p-3 text-left bg-white rounded-lg border hover:bg-slate-50">
39
+ Game Settings
40
+ </button>
41
+ <button className="w-full p-3 text-left bg-white rounded-lg border hover:bg-slate-50">
42
+ Leave Game
43
+ </button>
44
+ </div>
45
+ <DrawerFooter>
46
+ <DrawerClose asChild>
47
+ <button className="w-full py-2 bg-slate-200 rounded-lg hover:bg-slate-300">
48
+ Close
49
+ </button>
50
+ </DrawerClose>
51
+ </DrawerFooter>
52
+ </DrawerContent>
53
+ </Drawer>
54
+ </div>
55
+ );
56
+ }
57
+
58
+ function ControlledDrawerDemo() {
59
+ const [open, setOpen] = useState(false);
60
+
61
+ return (
62
+ <div className="min-h-screen bg-slate-100 p-8">
63
+ <h2 className="text-xl font-bold mb-4">Controlled Drawer</h2>
64
+ <p className="text-gray-600 mb-4">
65
+ Drawer state: {open ? "Open" : "Closed"}
66
+ </p>
67
+
68
+ <button
69
+ onClick={() => setOpen(true)}
70
+ className="px-4 py-2 bg-green-500 text-white rounded-lg hover:bg-green-600"
71
+ >
72
+ Open Controlled Drawer
73
+ </button>
74
+
75
+ <Drawer open={open} onOpenChange={setOpen}>
76
+ <DrawerContent>
77
+ <DrawerHeader>
78
+ <DrawerTitle>Card Selection</DrawerTitle>
79
+ <DrawerDescription>Select up to 3 cards to pass</DrawerDescription>
80
+ </DrawerHeader>
81
+ <div className="p-4 grid grid-cols-3 gap-3">
82
+ {["♠A", "♥K", "♦Q", "♣J", "♠10", "♥9"].map((card) => (
83
+ <button
84
+ key={card}
85
+ className="p-6 text-2xl bg-white rounded-lg border hover:bg-blue-50 hover:border-blue-300"
86
+ >
87
+ {card}
88
+ </button>
89
+ ))}
90
+ </div>
91
+ <DrawerFooter>
92
+ <button
93
+ onClick={() => setOpen(false)}
94
+ className="w-full py-2 bg-blue-500 text-white rounded-lg hover:bg-blue-600"
95
+ >
96
+ Confirm Selection
97
+ </button>
98
+ <DrawerClose asChild>
99
+ <button className="w-full py-2 bg-slate-200 rounded-lg hover:bg-slate-300">
100
+ Cancel
101
+ </button>
102
+ </DrawerClose>
103
+ </DrawerFooter>
104
+ </DrawerContent>
105
+ </Drawer>
106
+ </div>
107
+ );
108
+ }
109
+
110
+ export default {
111
+ basic: <BasicDrawerDemo />,
112
+ controlled: <ControlledDrawerDemo />,
113
+ };
@@ -0,0 +1,82 @@
1
+ /**
2
+ * ErrorBoundary component fixtures
3
+ * Demonstrates error handling and fallback states
4
+ */
5
+ import React from "react";
6
+ import { ErrorBoundary } from "../ErrorBoundary.js";
7
+
8
+ // Component that throws an error
9
+ function BuggyComponent(): never {
10
+ throw new Error("This is a test error for the ErrorBoundary fixture");
11
+ }
12
+
13
+ // Component that works fine
14
+ function WorkingComponent() {
15
+ return (
16
+ <div className="p-6 bg-green-50 rounded-lg border border-green-200">
17
+ <h3 className="text-green-800 font-semibold">✓ Working Component</h3>
18
+ <p className="text-green-600 mt-2">
19
+ This component renders without errors.
20
+ </p>
21
+ </div>
22
+ );
23
+ }
24
+
25
+ function Container({ children }: { children: React.ReactNode }) {
26
+ return <div className="min-h-screen bg-slate-100 p-8">{children}</div>;
27
+ }
28
+
29
+ export default {
30
+ withError: (
31
+ <Container>
32
+ <h2 className="text-xl font-bold mb-4">ErrorBoundary with Error</h2>
33
+ <ErrorBoundary
34
+ onError={(error, errorInfo) => {
35
+ console.log("[Fixture] Error caught:", error.message);
36
+ console.log("[Fixture] Error info:", errorInfo);
37
+ }}
38
+ >
39
+ <BuggyComponent />
40
+ </ErrorBoundary>
41
+ </Container>
42
+ ),
43
+
44
+ withWorkingChild: (
45
+ <Container>
46
+ <h2 className="text-xl font-bold mb-4">
47
+ ErrorBoundary with Working Child
48
+ </h2>
49
+ <ErrorBoundary>
50
+ <WorkingComponent />
51
+ </ErrorBoundary>
52
+ </Container>
53
+ ),
54
+
55
+ customFallback: (
56
+ <Container>
57
+ <h2 className="text-xl font-bold mb-4">
58
+ ErrorBoundary with Custom Fallback
59
+ </h2>
60
+ <ErrorBoundary
61
+ fallback={
62
+ <div className="p-6 bg-purple-50 rounded-lg border border-purple-200">
63
+ <h3 className="text-purple-800 font-semibold">
64
+ 🎮 Custom Error UI
65
+ </h3>
66
+ <p className="text-purple-600 mt-2">
67
+ Something went wrong in the game. Please refresh to try again.
68
+ </p>
69
+ <button
70
+ onClick={() => window.location.reload()}
71
+ className="mt-4 px-4 py-2 bg-purple-500 text-white rounded-lg hover:bg-purple-600"
72
+ >
73
+ Refresh Game
74
+ </button>
75
+ </div>
76
+ }
77
+ >
78
+ <BuggyComponent />
79
+ </ErrorBoundary>
80
+ </Container>
81
+ ),
82
+ };