@dreamboard-games/sdk 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (369) hide show
  1. package/LICENSE.md +96 -0
  2. package/README.md +12 -0
  3. package/dist/HandView-ncJIVLhN.d.ts +193 -0
  4. package/dist/ResourceCounter-CTREyF73.d.ts +102 -0
  5. package/dist/ThemeProvider-fy0_QzgO.d.ts +99 -0
  6. package/dist/bundle-TIZcw8LB.d.ts +281 -0
  7. package/dist/cards-Sl3b40Mv.d.ts +13 -0
  8. package/dist/chunk-7YAHLYBR.js +481 -0
  9. package/dist/chunk-7YAHLYBR.js.map +1 -0
  10. package/dist/chunk-FDNZTDD6.js +8085 -0
  11. package/dist/chunk-FDNZTDD6.js.map +1 -0
  12. package/dist/chunk-GKKBPPSW.js +598 -0
  13. package/dist/chunk-GKKBPPSW.js.map +1 -0
  14. package/dist/chunk-I46YJSOD.js +1 -0
  15. package/dist/chunk-I46YJSOD.js.map +1 -0
  16. package/dist/chunk-KAELH4KC.js +104 -0
  17. package/dist/chunk-KAELH4KC.js.map +1 -0
  18. package/dist/chunk-PZ5AY32C.js +10 -0
  19. package/dist/chunk-PZ5AY32C.js.map +1 -0
  20. package/dist/chunk-T3ZKNUZ7.js +1 -0
  21. package/dist/chunk-T3ZKNUZ7.js.map +1 -0
  22. package/dist/chunk-T52J5RMF.js +1 -0
  23. package/dist/chunk-T52J5RMF.js.map +1 -0
  24. package/dist/chunk-TDSWKVZ4.js +5401 -0
  25. package/dist/chunk-TDSWKVZ4.js.map +1 -0
  26. package/dist/chunk-U5C6BONG.js +34 -0
  27. package/dist/chunk-U5C6BONG.js.map +1 -0
  28. package/dist/chunk-VDXOF4FW.js +69 -0
  29. package/dist/chunk-VDXOF4FW.js.map +1 -0
  30. package/dist/chunk-VFTAA4WO.js +115 -0
  31. package/dist/chunk-VFTAA4WO.js.map +1 -0
  32. package/dist/chunk-WN74KVNY.js +17 -0
  33. package/dist/chunk-WN74KVNY.js.map +1 -0
  34. package/dist/chunk-WYPQ3GG5.js +10990 -0
  35. package/dist/chunk-WYPQ3GG5.js.map +1 -0
  36. package/dist/components-D5ZRE2Hl.d.ts +1451 -0
  37. package/dist/generated/runtime/primitives.d.ts +12 -0
  38. package/dist/generated/runtime/primitives.js +180 -0
  39. package/dist/generated/runtime/primitives.js.map +1 -0
  40. package/dist/generated/runtime-api.d.ts +3 -0
  41. package/dist/generated/runtime-api.js +2 -0
  42. package/dist/generated/runtime-api.js.map +1 -0
  43. package/dist/generated/runtime.d.ts +14 -0
  44. package/dist/generated/runtime.js +18 -0
  45. package/dist/generated/runtime.js.map +1 -0
  46. package/dist/generated/workspace-contract.d.ts +14 -0
  47. package/dist/generated/workspace-contract.js +14 -0
  48. package/dist/generated/workspace-contract.js.map +1 -0
  49. package/dist/hex-board-view-D_07hO6O.d.ts +933 -0
  50. package/dist/hex-color-MhOyuY-o.d.ts +8 -0
  51. package/dist/index-BwqPQtBu.d.ts +1433 -0
  52. package/dist/index.d.ts +1 -0
  53. package/dist/index.js +12 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/infrastructure/reducer-bundle-abi.d.ts +1083 -0
  56. package/dist/infrastructure/reducer-bundle-abi.js +14 -0
  57. package/dist/infrastructure/reducer-bundle-abi.js.map +1 -0
  58. package/dist/infrastructure/workspace-codegen.d.ts +53 -0
  59. package/dist/infrastructure/workspace-codegen.js +44 -0
  60. package/dist/infrastructure/workspace-codegen.js.map +1 -0
  61. package/dist/manifest-contract-BNHVGFtU.d.ts +9 -0
  62. package/dist/package-set.d.ts +13 -0
  63. package/dist/package-set.js +12 -0
  64. package/dist/package-set.js.map +1 -0
  65. package/dist/primitive-props-DpKs-GCr.d.ts +11 -0
  66. package/dist/reducer.d.ts +3786 -0
  67. package/dist/reducer.js +8131 -0
  68. package/dist/reducer.js.map +1 -0
  69. package/dist/runtime/primitives.d.ts +226 -0
  70. package/dist/runtime/primitives.js +180 -0
  71. package/dist/runtime/primitives.js.map +1 -0
  72. package/dist/runtime/types/runtime-api.d.ts +1 -0
  73. package/dist/runtime/types/runtime-api.js +2 -0
  74. package/dist/runtime/types/runtime-api.js.map +1 -0
  75. package/dist/runtime/workspace-contract.d.ts +172 -0
  76. package/dist/runtime/workspace-contract.js +14 -0
  77. package/dist/runtime/workspace-contract.js.map +1 -0
  78. package/dist/runtime-api-3dshj6kK.d.ts +101 -0
  79. package/dist/runtime-api-DWxvTr-O.d.ts +379 -0
  80. package/dist/runtime.d.ts +58 -0
  81. package/dist/runtime.js +13 -0
  82. package/dist/runtime.js.map +1 -0
  83. package/dist/slots-1GPGihk8.d.ts +8 -0
  84. package/dist/testing.d.ts +149 -0
  85. package/dist/testing.js +513 -0
  86. package/dist/testing.js.map +1 -0
  87. package/dist/types.d.ts +496 -0
  88. package/dist/types.js +28 -0
  89. package/dist/types.js.map +1 -0
  90. package/dist/ui/components.d.ts +16 -0
  91. package/dist/ui/components.js +192 -0
  92. package/dist/ui/components.js.map +1 -0
  93. package/dist/ui/defaults.d.ts +19 -0
  94. package/dist/ui/defaults.js +104 -0
  95. package/dist/ui/defaults.js.map +1 -0
  96. package/dist/ui/plugin-styles.css +250 -0
  97. package/dist/ui/types/player-state.d.ts +365 -0
  98. package/dist/ui/types/player-state.js +1 -0
  99. package/dist/ui/types/player-state.js.map +1 -0
  100. package/dist/ui-contract-iQfTtUSL.d.ts +1161 -0
  101. package/dist/ui.d.ts +320 -0
  102. package/dist/ui.js +253 -0
  103. package/dist/ui.js.map +1 -0
  104. package/package.json +199 -0
  105. package/src/generated/reducer-contract/builders.ts +90 -0
  106. package/src/generated/reducer-contract/version.ts +9 -0
  107. package/src/generated/reducer-contract/wire.ts +100 -0
  108. package/src/generated/reducer-contract/zod.ts +101 -0
  109. package/src/generated/runtime/primitives.ts +2 -0
  110. package/src/generated/runtime-api.ts +5 -0
  111. package/src/generated/runtime.ts +35 -0
  112. package/src/generated/workspace-contract.ts +2 -0
  113. package/src/index.ts +7 -0
  114. package/src/infrastructure/reducer-bundle-abi.ts +8 -0
  115. package/src/infrastructure/reducer-contract/bundle.ts +37 -0
  116. package/src/infrastructure/workspace-codegen/hex-geometry.ts +69 -0
  117. package/src/infrastructure/workspace-codegen/index.ts +64 -0
  118. package/src/infrastructure/workspace-codegen/manifest-contract.ts +6632 -0
  119. package/src/infrastructure/workspace-codegen/manifest-validation.ts +795 -0
  120. package/src/infrastructure/workspace-codegen/ownership.ts +131 -0
  121. package/src/infrastructure/workspace-codegen/preset-card-sets.ts +169 -0
  122. package/src/infrastructure/workspace-codegen/seeds.ts +1705 -0
  123. package/src/infrastructure/workspace-codegen.ts +1 -0
  124. package/src/package-set.ts +19 -0
  125. package/src/reducer/authoring/contract.ts +157 -0
  126. package/src/reducer/authoring/effect.ts +224 -0
  127. package/src/reducer/authoring/game.ts +23 -0
  128. package/src/reducer/authoring/interaction.ts +98 -0
  129. package/src/reducer/authoring/phase.ts +300 -0
  130. package/src/reducer/authoring/types.ts +70 -0
  131. package/src/reducer/authoring/validation.ts +382 -0
  132. package/src/reducer/authoring/view-stage.ts +68 -0
  133. package/src/reducer/authoring.ts +29 -0
  134. package/src/reducer/bundle/ingress-bundle.ts +491 -0
  135. package/src/reducer/bundle/trusted/engine-instruction-resolver.ts +254 -0
  136. package/src/reducer/bundle/trusted/flow-instruction-resolver.ts +73 -0
  137. package/src/reducer/bundle/trusted/instruction-runner.ts +414 -0
  138. package/src/reducer/bundle/trusted/interaction-authorization.ts +137 -0
  139. package/src/reducer/bundle/trusted/interaction-collectors.ts +859 -0
  140. package/src/reducer/bundle/trusted/interaction-decision.ts +747 -0
  141. package/src/reducer/bundle/trusted/interaction-resolver.ts +95 -0
  142. package/src/reducer/bundle/trusted/interaction-types.ts +171 -0
  143. package/src/reducer/bundle/trusted/lifecycle-runner.ts +427 -0
  144. package/src/reducer/bundle/trusted/projection-builder.ts +356 -0
  145. package/src/reducer/bundle/trusted/projection-context.ts +39 -0
  146. package/src/reducer/bundle/trusted/rng-sampler.ts +150 -0
  147. package/src/reducer/bundle/trusted/runtime-registry.ts +120 -0
  148. package/src/reducer/bundle/trusted/runtime-scope.ts +336 -0
  149. package/src/reducer/bundle/trusted/simultaneous-player.ts +97 -0
  150. package/src/reducer/bundle/trusted/stage-resolver.ts +87 -0
  151. package/src/reducer/bundle/trusted/static-projection.ts +116 -0
  152. package/src/reducer/bundle/trusted/trusted-runtime-args.ts +97 -0
  153. package/src/reducer/bundle/trusted/trusted-runtime-result.ts +39 -0
  154. package/src/reducer/bundle/trusted/trusted-setup-profiles.ts +43 -0
  155. package/src/reducer/bundle/trusted/trusted-state-codec.ts +48 -0
  156. package/src/reducer/bundle/trusted-bundle.ts +97 -0
  157. package/src/reducer/bundle/types.ts +171 -0
  158. package/src/reducer/bundle.ts +2 -0
  159. package/src/reducer/client-param-schemas.ts +57 -0
  160. package/src/reducer/compose.ts +34 -0
  161. package/src/reducer/core/runtime-input.ts +30 -0
  162. package/src/reducer/core/runtime-instruction.ts +59 -0
  163. package/src/reducer/core/types.ts +62 -0
  164. package/src/reducer/definition-index.ts +277 -0
  165. package/src/reducer/derived.ts +106 -0
  166. package/src/reducer/effects.ts +92 -0
  167. package/src/reducer/engine/runtime-instruction-engine.ts +155 -0
  168. package/src/reducer/ingress/decode-runtime-input.ts +7 -0
  169. package/src/reducer/ingress/decode-session-state.ts +9 -0
  170. package/src/reducer/ingress/encode-session-state.ts +6 -0
  171. package/src/reducer/ingress/input-codec.ts +18 -0
  172. package/src/reducer/ingress/phase-schemas.ts +62 -0
  173. package/src/reducer/ingress/raw-types.ts +107 -0
  174. package/src/reducer/ingress/runtime-codec.ts +14 -0
  175. package/src/reducer/ingress/runtime-payload.ts +13 -0
  176. package/src/reducer/ingress/session-codec.ts +392 -0
  177. package/src/reducer/ingress/types.ts +6 -0
  178. package/src/reducer/inputs/boardInput.ts +217 -0
  179. package/src/reducer/inputs/boardTarget.ts +190 -0
  180. package/src/reducer/inputs/cardInput.ts +86 -0
  181. package/src/reducer/inputs/cardTarget.ts +101 -0
  182. package/src/reducer/inputs/choiceTarget.ts +104 -0
  183. package/src/reducer/inputs/defineInputs.ts +71 -0
  184. package/src/reducer/inputs/formInput.ts +809 -0
  185. package/src/reducer/inputs/many.ts +120 -0
  186. package/src/reducer/inputs/promptInput.ts +87 -0
  187. package/src/reducer/inputs/rngInput.ts +58 -0
  188. package/src/reducer/inputs/targetRule.ts +123 -0
  189. package/src/reducer/inputs.ts +41 -0
  190. package/src/reducer/model/definition.ts +1072 -0
  191. package/src/reducer/model/extract.ts +745 -0
  192. package/src/reducer/model/manifest.ts +570 -0
  193. package/src/reducer/model/queries.ts +641 -0
  194. package/src/reducer/model/runtime.ts +264 -0
  195. package/src/reducer/model/spec.ts +1386 -0
  196. package/src/reducer/model/table.ts +260 -0
  197. package/src/reducer/model.ts +7 -0
  198. package/src/reducer/ops.ts +1034 -0
  199. package/src/reducer/parse-utils.ts +28 -0
  200. package/src/reducer/per-player.ts +422 -0
  201. package/src/reducer/rng.ts +69 -0
  202. package/src/reducer/schema-helpers.ts +185 -0
  203. package/src/reducer/setup-bootstrap-helpers.ts +171 -0
  204. package/src/reducer/setup-bootstrap.ts +481 -0
  205. package/src/reducer/table-ops.ts +2671 -0
  206. package/src/reducer/table-queries.ts +372 -0
  207. package/src/reducer/transaction.ts +120 -0
  208. package/src/reducer.ts +314 -0
  209. package/src/runtime/primitives.ts +1 -0
  210. package/src/runtime/types/runtime-api.ts +1 -0
  211. package/src/runtime/workspace-contract.ts +32 -0
  212. package/src/runtime-internal/components/InteractionForm.tsx +1309 -0
  213. package/src/runtime-internal/components/PluginRuntime.tsx +103 -0
  214. package/src/runtime-internal/components/board/target-layer.ts +70 -0
  215. package/src/runtime-internal/context/ClientParamSchemaContext.tsx +44 -0
  216. package/src/runtime-internal/context/InteractionDraftContext.tsx +279 -0
  217. package/src/runtime-internal/context/PluginSessionContext.tsx +47 -0
  218. package/src/runtime-internal/context/PluginStateContext.tsx +262 -0
  219. package/src/runtime-internal/context/RuntimeContext.tsx +96 -0
  220. package/src/runtime-internal/defaults/components.tsx +409 -0
  221. package/src/runtime-internal/defaults/index.ts +11 -0
  222. package/src/runtime-internal/errors/ValidationError.ts +29 -0
  223. package/src/runtime-internal/hooks/useActivePlayers.ts +33 -0
  224. package/src/runtime-internal/hooks/useBoardInteractions.ts +665 -0
  225. package/src/runtime-internal/hooks/useGameSelector.ts +105 -0
  226. package/src/runtime-internal/hooks/useGameView.ts +9 -0
  227. package/src/runtime-internal/hooks/useInteractionByKey.ts +354 -0
  228. package/src/runtime-internal/hooks/useInteractionHandle.ts +438 -0
  229. package/src/runtime-internal/hooks/useIsMyTurn.ts +20 -0
  230. package/src/runtime-internal/hooks/useLobby.ts +76 -0
  231. package/src/runtime-internal/hooks/useMe.ts +48 -0
  232. package/src/runtime-internal/hooks/usePlayerInfo.ts +28 -0
  233. package/src/runtime-internal/hooks/usePlayerTurnOrder.ts +23 -0
  234. package/src/runtime-internal/hooks/usePluginRuntime.ts +147 -0
  235. package/src/runtime-internal/hooks/useSeatInbox.ts +61 -0
  236. package/src/runtime-internal/hooks/useSimultaneousPhase.ts +10 -0
  237. package/src/runtime-internal/index.ts +42 -0
  238. package/src/runtime-internal/internal.ts +43 -0
  239. package/src/runtime-internal/plugin-styles.css +250 -0
  240. package/src/runtime-internal/primitives/board.tsx +459 -0
  241. package/src/runtime-internal/primitives/dialog-lifecycle.ts +58 -0
  242. package/src/runtime-internal/primitives/dice.tsx +79 -0
  243. package/src/runtime-internal/primitives/game-ui-provider.tsx +35 -0
  244. package/src/runtime-internal/primitives/game.tsx +387 -0
  245. package/src/runtime-internal/primitives/hand-intent-adapter.ts +147 -0
  246. package/src/runtime-internal/primitives/hand-surface.tsx +594 -0
  247. package/src/runtime-internal/primitives/index.ts +196 -0
  248. package/src/runtime-internal/primitives/interaction-form-binding.tsx +56 -0
  249. package/src/runtime-internal/primitives/interaction-submit.ts +90 -0
  250. package/src/runtime-internal/primitives/interaction.tsx +987 -0
  251. package/src/runtime-internal/primitives/phase.tsx +43 -0
  252. package/src/runtime-internal/primitives/player-roster.tsx +302 -0
  253. package/src/runtime-internal/primitives/primitive-props.tsx +101 -0
  254. package/src/runtime-internal/primitives/prompt.tsx +255 -0
  255. package/src/runtime-internal/primitives/ui.tsx +60 -0
  256. package/src/runtime-internal/primitives/zone.tsx +791 -0
  257. package/src/runtime-internal/reducer.ts +30 -0
  258. package/src/runtime-internal/runtime/createPluginRuntimeAPI.ts +605 -0
  259. package/src/runtime-internal/types/plugin-state.ts +508 -0
  260. package/src/runtime-internal/types/reducer-state.ts +24 -0
  261. package/src/runtime-internal/types/runtime-api.ts +114 -0
  262. package/src/runtime-internal/ui-contract.ts +519 -0
  263. package/src/runtime-internal/utils/card-intent-adapter.ts +546 -0
  264. package/src/runtime-internal/utils/interaction-inputs.ts +492 -0
  265. package/src/runtime-internal/utils/interaction-labels.ts +23 -0
  266. package/src/runtime-internal/utils/interaction-router.ts +273 -0
  267. package/src/runtime-internal/utils/interaction-status.ts +74 -0
  268. package/src/runtime-internal/workspace-contract.ts +1170 -0
  269. package/src/runtime.ts +34 -0
  270. package/src/testing/create-expect-api.ts +352 -0
  271. package/src/testing/create-test-runtime.ts +381 -0
  272. package/src/testing/definitions.ts +127 -0
  273. package/src/testing/index.ts +3 -0
  274. package/src/testing.ts +1 -0
  275. package/src/type-stubs/manifest-contract.d.ts +42 -0
  276. package/src/type-stubs/manifest-contract.js +72 -0
  277. package/src/type-stubs/ui-contract.d.ts +5 -0
  278. package/src/type-stubs/ui-contract.js +1 -0
  279. package/src/types/authoring-card-properties.type-test.ts +266 -0
  280. package/src/types/authoring.ts +1282 -0
  281. package/src/types/cards.ts +19 -0
  282. package/src/types/contracts.ts +1550 -0
  283. package/src/types/generated-helpers.ts +35 -0
  284. package/src/types/index.ts +147 -0
  285. package/src/types/slots.ts +11 -0
  286. package/src/types.ts +1 -0
  287. package/src/ui/components/ActionButton.tsx +97 -0
  288. package/src/ui/components/ActionPanel.tsx +315 -0
  289. package/src/ui/components/Card.tsx +378 -0
  290. package/src/ui/components/CardDragSurface.tsx +1076 -0
  291. package/src/ui/components/ChromeSuppressionContext.tsx +70 -0
  292. package/src/ui/components/CostDisplay.tsx +145 -0
  293. package/src/ui/components/DiceRoller.tsx +581 -0
  294. package/src/ui/components/Drawer.tsx +180 -0
  295. package/src/ui/components/ErrorBoundary.tsx +275 -0
  296. package/src/ui/components/GameEndDisplay.tsx +398 -0
  297. package/src/ui/components/GameSkeleton.tsx +260 -0
  298. package/src/ui/components/Hand.tsx +468 -0
  299. package/src/ui/components/HandDock.tsx +299 -0
  300. package/src/ui/components/HandView.tsx +441 -0
  301. package/src/ui/components/MobileHandTray.tsx +381 -0
  302. package/src/ui/components/MoreActions.tsx +143 -0
  303. package/src/ui/components/PhaseIndicator.tsx +341 -0
  304. package/src/ui/components/PlayArea.tsx +146 -0
  305. package/src/ui/components/PrimaryActionButton.tsx +336 -0
  306. package/src/ui/components/PrimaryButton.tsx +45 -0
  307. package/src/ui/components/ResourceCounter.tsx +270 -0
  308. package/src/ui/components/StagingZone.tsx +134 -0
  309. package/src/ui/components/ThemedButton.tsx +113 -0
  310. package/src/ui/components/Toast.tsx +264 -0
  311. package/src/ui/components/board/HexGrid.tsx +1294 -0
  312. package/src/ui/components/board/NetworkGraph.tsx +476 -0
  313. package/src/ui/components/board/SlotSystem.tsx +388 -0
  314. package/src/ui/components/board/SquareGrid.tsx +1165 -0
  315. package/src/ui/components/board/TrackBoard.tsx +496 -0
  316. package/src/ui/components/board/ZoneMap.tsx +448 -0
  317. package/src/ui/components/board/hex-board-view.ts +123 -0
  318. package/src/ui/components/board/index.ts +142 -0
  319. package/src/ui/components/board/interaction-accessibility.ts +21 -0
  320. package/src/ui/components/board/target-layer.ts +66 -0
  321. package/src/ui/components/card-render-content.type-test.ts +27 -0
  322. package/src/ui/components/hand-layout-math.ts +163 -0
  323. package/src/ui/components/hand-pointer-engine.ts +413 -0
  324. package/src/ui/components/index.ts +245 -0
  325. package/src/ui/components.ts +1 -0
  326. package/src/ui/defaults/components.tsx +106 -0
  327. package/src/ui/defaults/index.ts +8 -0
  328. package/src/ui/defaults.ts +1 -0
  329. package/src/ui/errors/ValidationError.ts +29 -0
  330. package/src/ui/helpers/cards.ts +19 -0
  331. package/src/ui/helpers/track-board.ts +211 -0
  332. package/src/ui/hooks/useBoardTopology.ts +316 -0
  333. package/src/ui/hooks/useCards.ts +10 -0
  334. package/src/ui/hooks/useHandCardPointer.ts +381 -0
  335. package/src/ui/hooks/useHandLayout.ts +378 -0
  336. package/src/ui/hooks/useHandPresentation.ts +121 -0
  337. package/src/ui/hooks/useHexBoard.ts +74 -0
  338. package/src/ui/hooks/useHexGrid.ts +185 -0
  339. package/src/ui/hooks/useIsMobile.ts +35 -0
  340. package/src/ui/hooks/usePanZoom.ts +278 -0
  341. package/src/ui/hooks/useSquareBoard.ts +124 -0
  342. package/src/ui/hooks/useSquareGrid.ts +328 -0
  343. package/src/ui/index.ts +98 -0
  344. package/src/ui/internal/ui/alert.tsx +51 -0
  345. package/src/ui/internal/ui/button.tsx +58 -0
  346. package/src/ui/internal/ui/dialog.tsx +134 -0
  347. package/src/ui/internal/ui/input.tsx +21 -0
  348. package/src/ui/internal/ui/label.tsx +21 -0
  349. package/src/ui/internal/ui/select.tsx +129 -0
  350. package/src/ui/internal/ui/tooltip.tsx +54 -0
  351. package/src/ui/internal/ui/utils.ts +5 -0
  352. package/src/ui/plugin-styles.css +250 -0
  353. package/src/ui/primitives/dialog-lifecycle.ts +58 -0
  354. package/src/ui/primitives/dice.tsx +79 -0
  355. package/src/ui/primitives/primitive-props.tsx +101 -0
  356. package/src/ui/theme/ThemeProvider.tsx +252 -0
  357. package/src/ui/theme/board.ts +61 -0
  358. package/src/ui/theme/css-vars.ts +105 -0
  359. package/src/ui/theme/derive.ts +240 -0
  360. package/src/ui/theme/index.ts +61 -0
  361. package/src/ui/theme/presets/arcade.ts +261 -0
  362. package/src/ui/theme/presets/studio.ts +261 -0
  363. package/src/ui/theme/presets/tabletop.ts +266 -0
  364. package/src/ui/theme/tokens.ts +392 -0
  365. package/src/ui/types/hex-color.ts +20 -0
  366. package/src/ui/types/player-state.ts +463 -0
  367. package/src/ui/types/tiled-board.ts +785 -0
  368. package/src/ui/types/visual-state.ts +137 -0
  369. package/src/ui.ts +1 -0
@@ -0,0 +1,372 @@
1
+ import type {
2
+ BoardContainerIdOfTable,
3
+ BoardIdOfTable,
4
+ BoardTypeIdOfTable,
5
+ CardIdOfTable,
6
+ ComponentDataOfTable,
7
+ ComponentIdOfTable,
8
+ DeckIdOfTable,
9
+ HandIdOfTable,
10
+ HexBoardIdOfTable,
11
+ HexSpaceIdOfTable,
12
+ PlayerIdOfTable,
13
+ RelationTypeIdOfTable,
14
+ RuntimeTableRecord,
15
+ SpaceIdOfTable,
16
+ SpaceTypeIdOfTable,
17
+ SquareBoardIdOfTable,
18
+ SquareSpaceIdOfTable,
19
+ TableQueries,
20
+ TableQueriesOfState,
21
+ TiledBoardIdOfTable,
22
+ TiledEdgeIdOfTable,
23
+ TiledEdgeTypeIdOfTable,
24
+ TiledVertexIdOfTable,
25
+ TiledVertexTypeIdOfTable,
26
+ } from "./model";
27
+ import {
28
+ getAdjacentSpaces,
29
+ getAllPlayerZoneCards,
30
+ getAllSharedZoneCards,
31
+ getBoard,
32
+ getBoardsByTypeId,
33
+ getCard,
34
+ getCardsById,
35
+ getCardOwner,
36
+ getCardVisibility,
37
+ getSlotOccupants,
38
+ getSlotOccupantsByHost,
39
+ getComponentContainerLocation,
40
+ getComponentDeckLocation,
41
+ getComponentEdgeLocation,
42
+ getComponentHandLocation,
43
+ getComponentLocation,
44
+ getComponentSlotLocation,
45
+ getComponentSpaceLocation,
46
+ getComponentVertexLocation,
47
+ getComponentZoneLocation,
48
+ getComponentsInContainer,
49
+ getComponentsOnEdge,
50
+ getComponentsOnSpace,
51
+ getComponentsOnVertex,
52
+ getContainer,
53
+ getEdge,
54
+ getEdgesByTypeId,
55
+ getHexBoard,
56
+ getHexSpace,
57
+ getHexSpaceAt,
58
+ getIncidentEdges,
59
+ getIncidentVertices,
60
+ canAffordResources,
61
+ getMissingResources,
62
+ getNextPlayerInOrder,
63
+ getPlayerOrder,
64
+ getPlayerResourceAmount,
65
+ getPlayerResourceTotal,
66
+ getPlayerResources,
67
+ getPlayerZoneCardCollection,
68
+ getPlayerZoneCards,
69
+ getRelatedSpaces,
70
+ getSharedZoneCardCollection,
71
+ getSharedZoneCards,
72
+ getSpace,
73
+ getSpaceDistance,
74
+ getSpaceEdges,
75
+ getSpacesByTypeId,
76
+ getSpaceVertices,
77
+ getSquareBoard,
78
+ getSquareDistance,
79
+ getSquareNeighbors,
80
+ getSquareSpace,
81
+ getSquareSpaceAt,
82
+ getTiledBoard,
83
+ getVertex,
84
+ getVerticesByTypeId,
85
+ } from "./table-ops";
86
+
87
+ export function createTableQueries<Table extends RuntimeTableRecord>(
88
+ table: Table,
89
+ ): TableQueries<Table> {
90
+ return {
91
+ board: {
92
+ get: <BoardId extends BoardIdOfTable<Table>>(boardId: BoardId) =>
93
+ getBoard(table, boardId),
94
+ hex: <BoardId extends HexBoardIdOfTable<Table>>(boardId: BoardId) =>
95
+ getHexBoard(table, boardId),
96
+ square: <BoardId extends SquareBoardIdOfTable<Table>>(boardId: BoardId) =>
97
+ getSquareBoard(table, boardId),
98
+ tiled: <BoardId extends TiledBoardIdOfTable<Table>>(boardId: BoardId) =>
99
+ getTiledBoard(table, boardId),
100
+ space: <
101
+ BoardId extends BoardIdOfTable<Table>,
102
+ SpaceId extends SpaceIdOfTable<Table, BoardId>,
103
+ >(
104
+ boardId: BoardId,
105
+ spaceId: SpaceId,
106
+ ) => getSpace(table, boardId, spaceId),
107
+ hexSpace: <
108
+ BoardId extends HexBoardIdOfTable<Table>,
109
+ SpaceId extends HexSpaceIdOfTable<Table, BoardId>,
110
+ >(
111
+ boardId: BoardId,
112
+ spaceId: SpaceId,
113
+ ) => getHexSpace(table, boardId, spaceId),
114
+ squareSpace: <
115
+ BoardId extends SquareBoardIdOfTable<Table>,
116
+ SpaceId extends SquareSpaceIdOfTable<Table, BoardId>,
117
+ >(
118
+ boardId: BoardId,
119
+ spaceId: SpaceId,
120
+ ) => getSquareSpace(table, boardId, spaceId),
121
+ container: <
122
+ BoardId extends BoardIdOfTable<Table>,
123
+ ContainerId extends BoardContainerIdOfTable<Table, BoardId>,
124
+ >(
125
+ boardId: BoardId,
126
+ containerId: ContainerId,
127
+ ) => getContainer(table, boardId, containerId),
128
+ edge: <
129
+ BoardId extends TiledBoardIdOfTable<Table>,
130
+ EdgeId extends TiledEdgeIdOfTable<Table, BoardId>,
131
+ >(
132
+ boardId: BoardId,
133
+ edgeId: EdgeId,
134
+ ) => getEdge(table, boardId, edgeId),
135
+ vertex: <
136
+ BoardId extends TiledBoardIdOfTable<Table>,
137
+ VertexId extends TiledVertexIdOfTable<Table, BoardId>,
138
+ >(
139
+ boardId: BoardId,
140
+ vertexId: VertexId,
141
+ ) => getVertex(table, boardId, vertexId),
142
+ byType: <TypeId extends BoardTypeIdOfTable<Table>>(typeId: TypeId) =>
143
+ getBoardsByTypeId(table, typeId),
144
+ spacesByType: <
145
+ BoardId extends BoardIdOfTable<Table>,
146
+ TypeId extends SpaceTypeIdOfTable<Table, BoardId>,
147
+ >(
148
+ boardId: BoardId,
149
+ typeId: TypeId,
150
+ ) => getSpacesByTypeId(table, boardId, typeId),
151
+ edgesByType: <
152
+ BoardId extends TiledBoardIdOfTable<Table>,
153
+ TypeId extends TiledEdgeTypeIdOfTable<Table, BoardId>,
154
+ >(
155
+ boardId: BoardId,
156
+ typeId: TypeId,
157
+ ) => getEdgesByTypeId(table, boardId, typeId),
158
+ verticesByType: <
159
+ BoardId extends TiledBoardIdOfTable<Table>,
160
+ TypeId extends TiledVertexTypeIdOfTable<Table, BoardId>,
161
+ >(
162
+ boardId: BoardId,
163
+ typeId: TypeId,
164
+ ) => getVerticesByTypeId(table, boardId, typeId),
165
+ adjacentSpaces: <
166
+ BoardId extends BoardIdOfTable<Table>,
167
+ SpaceId extends SpaceIdOfTable<Table, BoardId>,
168
+ >(
169
+ boardId: BoardId,
170
+ spaceId: SpaceId,
171
+ ) => getAdjacentSpaces(table, boardId, spaceId),
172
+ relatedSpaces: <
173
+ BoardId extends BoardIdOfTable<Table>,
174
+ SpaceId extends SpaceIdOfTable<Table, BoardId>,
175
+ TypeId extends RelationTypeIdOfTable<Table, BoardId>,
176
+ >(
177
+ boardId: BoardId,
178
+ spaceId: SpaceId,
179
+ relationTypeId: TypeId,
180
+ ) => getRelatedSpaces(table, boardId, spaceId, relationTypeId),
181
+ incidentEdges: <
182
+ BoardId extends TiledBoardIdOfTable<Table>,
183
+ VertexId extends TiledVertexIdOfTable<Table, BoardId>,
184
+ >(
185
+ boardId: BoardId,
186
+ vertexId: VertexId,
187
+ ) => getIncidentEdges(table, boardId, vertexId),
188
+ incidentVertices: <
189
+ BoardId extends TiledBoardIdOfTable<Table>,
190
+ EdgeId extends TiledEdgeIdOfTable<Table, BoardId>,
191
+ >(
192
+ boardId: BoardId,
193
+ edgeId: EdgeId,
194
+ ) => getIncidentVertices(table, boardId, edgeId),
195
+ spaceEdges: <BoardId extends TiledBoardIdOfTable<Table>>(
196
+ boardId: BoardId,
197
+ spaceId: SpaceIdOfTable<Table, BoardId>,
198
+ ) => getSpaceEdges(table, boardId, spaceId),
199
+ spaceVertices: <BoardId extends TiledBoardIdOfTable<Table>>(
200
+ boardId: BoardId,
201
+ spaceId: SpaceIdOfTable<Table, BoardId>,
202
+ ) => getSpaceVertices(table, boardId, spaceId),
203
+ spaceDistance: <
204
+ BoardId extends BoardIdOfTable<Table>,
205
+ SpaceId extends SpaceIdOfTable<Table, BoardId>,
206
+ >(
207
+ boardId: BoardId,
208
+ fromSpaceId: SpaceId,
209
+ toSpaceId: SpaceId,
210
+ ) => getSpaceDistance(table, boardId, fromSpaceId, toSpaceId),
211
+ hexSpaceAt: <BoardId extends HexBoardIdOfTable<Table>>(
212
+ boardId: BoardId,
213
+ q: number,
214
+ r: number,
215
+ ) => getHexSpaceAt(table, boardId, q, r),
216
+ squareSpaceAt: <BoardId extends SquareBoardIdOfTable<Table>>(
217
+ boardId: BoardId,
218
+ row: number,
219
+ col: number,
220
+ ) => getSquareSpaceAt(table, boardId, row, col),
221
+ squareNeighbors: <
222
+ BoardId extends SquareBoardIdOfTable<Table>,
223
+ SpaceId extends SquareSpaceIdOfTable<Table, BoardId>,
224
+ >(
225
+ boardId: BoardId,
226
+ spaceId: SpaceId,
227
+ options?: { mode?: "orthogonal" | "diagonal" | "all" },
228
+ ) => getSquareNeighbors(table, boardId, spaceId, options),
229
+ squareDistance: <
230
+ BoardId extends SquareBoardIdOfTable<Table>,
231
+ SpaceId extends SquareSpaceIdOfTable<Table, BoardId>,
232
+ >(
233
+ boardId: BoardId,
234
+ fromSpaceId: SpaceId,
235
+ toSpaceId: SpaceId,
236
+ options?: { metric?: "manhattan" | "chebyshev" },
237
+ ) => getSquareDistance(table, boardId, fromSpaceId, toSpaceId, options),
238
+ spaceOccupants: <
239
+ BoardId extends BoardIdOfTable<Table>,
240
+ SpaceId extends SpaceIdOfTable<Table, BoardId>,
241
+ >(
242
+ boardId: BoardId,
243
+ spaceId: SpaceId,
244
+ ) => getComponentsOnSpace(table, boardId, spaceId),
245
+ containerOccupants: <
246
+ BoardId extends BoardIdOfTable<Table>,
247
+ ContainerId extends BoardContainerIdOfTable<Table, BoardId>,
248
+ >(
249
+ boardId: BoardId,
250
+ containerId: ContainerId,
251
+ ) => getComponentsInContainer(table, boardId, containerId),
252
+ edgeOccupants: <
253
+ BoardId extends TiledBoardIdOfTable<Table>,
254
+ EdgeId extends TiledEdgeIdOfTable<Table, BoardId>,
255
+ >(
256
+ boardId: BoardId,
257
+ edgeId: EdgeId,
258
+ ) => getComponentsOnEdge(table, boardId, edgeId),
259
+ vertexOccupants: <
260
+ BoardId extends TiledBoardIdOfTable<Table>,
261
+ VertexId extends TiledVertexIdOfTable<Table, BoardId>,
262
+ >(
263
+ boardId: BoardId,
264
+ vertexId: VertexId,
265
+ ) => getComponentsOnVertex(table, boardId, vertexId),
266
+ },
267
+ zone: {
268
+ sharedCards: <ZoneId extends DeckIdOfTable<Table>>(zoneId: ZoneId) =>
269
+ getSharedZoneCards(table, zoneId),
270
+ sharedCardCollection: <ZoneId extends DeckIdOfTable<Table>>(
271
+ zoneId: ZoneId,
272
+ ) => getSharedZoneCardCollection(table, zoneId),
273
+ allSharedCards: () => getAllSharedZoneCards(table),
274
+ playerCards: <
275
+ PlayerId extends PlayerIdOfTable<Table>,
276
+ ZoneId extends HandIdOfTable<Table>,
277
+ >(
278
+ playerId: PlayerId,
279
+ zoneId: ZoneId,
280
+ ) => getPlayerZoneCards(table, playerId, zoneId),
281
+ playerCardCollection: <
282
+ PlayerId extends PlayerIdOfTable<Table>,
283
+ ZoneId extends HandIdOfTable<Table>,
284
+ >(
285
+ playerId: PlayerId,
286
+ zoneId: ZoneId,
287
+ ) => getPlayerZoneCardCollection(table, playerId, zoneId),
288
+ allPlayerCards: <ZoneId extends HandIdOfTable<Table>>(zoneId: ZoneId) =>
289
+ getAllPlayerZoneCards(table, zoneId),
290
+ },
291
+ card: {
292
+ get: <CardId extends CardIdOfTable<Table>>(cardId: CardId) =>
293
+ getCard(table, cardId),
294
+ byIds: <CardIds extends readonly CardIdOfTable<Table>[]>(
295
+ cardIds: CardIds,
296
+ ) => getCardsById(table, cardIds),
297
+ owner: <CardId extends CardIdOfTable<Table>>(cardId: CardId) =>
298
+ getCardOwner(table, cardId),
299
+ visibility: <CardId extends CardIdOfTable<Table>>(cardId: CardId) =>
300
+ getCardVisibility(table, cardId),
301
+ },
302
+ slot: {
303
+ occupants: (host, slotId) => getSlotOccupants(table, host, slotId),
304
+ occupantsByHost: (host) => getSlotOccupantsByHost(table, host),
305
+ pieceOccupants: (hostId, slotId) =>
306
+ getSlotOccupants(table, { kind: "piece", id: hostId }, slotId),
307
+ pieceOccupantsByHost: (hostId) =>
308
+ getSlotOccupantsByHost(table, { kind: "piece", id: hostId }),
309
+ dieOccupants: (hostId, slotId) =>
310
+ getSlotOccupants(table, { kind: "die", id: hostId }, slotId),
311
+ dieOccupantsByHost: (hostId) =>
312
+ getSlotOccupantsByHost(table, { kind: "die", id: hostId }),
313
+ },
314
+ player: {
315
+ order: () => getPlayerOrder(table),
316
+ nextInOrder: (playerId) => getNextPlayerInOrder(table, playerId),
317
+ resources: (playerId) => getPlayerResources(table, playerId),
318
+ resource: (playerId, resourceId) =>
319
+ getPlayerResourceAmount(table, playerId, resourceId),
320
+ resourceTotal: (playerId) => getPlayerResourceTotal(table, playerId),
321
+ canAfford: (playerId, amounts) =>
322
+ canAffordResources(table, playerId, amounts),
323
+ missingResources: (playerId, amounts) =>
324
+ getMissingResources(table, playerId, amounts),
325
+ },
326
+ component: {
327
+ data: <ComponentId extends ComponentIdOfTable<Table>>(
328
+ componentId: ComponentId,
329
+ ) =>
330
+ (table.cards[componentId] ??
331
+ table.pieces[componentId] ??
332
+ table.dice[componentId]) as
333
+ | ComponentDataOfTable<Table, ComponentId>
334
+ | undefined,
335
+ location: <ComponentId extends ComponentIdOfTable<Table>>(
336
+ componentId: ComponentId,
337
+ ) => getComponentLocation(table, componentId),
338
+ deck: <ComponentId extends ComponentIdOfTable<Table>>(
339
+ componentId: ComponentId,
340
+ ) => getComponentDeckLocation(table, componentId),
341
+ hand: <ComponentId extends ComponentIdOfTable<Table>>(
342
+ componentId: ComponentId,
343
+ ) => getComponentHandLocation(table, componentId),
344
+ zone: <ComponentId extends ComponentIdOfTable<Table>>(
345
+ componentId: ComponentId,
346
+ ) => getComponentZoneLocation(table, componentId),
347
+ space: <ComponentId extends ComponentIdOfTable<Table>>(
348
+ componentId: ComponentId,
349
+ ) => getComponentSpaceLocation(table, componentId),
350
+ container: <ComponentId extends ComponentIdOfTable<Table>>(
351
+ componentId: ComponentId,
352
+ ) => getComponentContainerLocation(table, componentId),
353
+ edge: <ComponentId extends ComponentIdOfTable<Table>>(
354
+ componentId: ComponentId,
355
+ ) => getComponentEdgeLocation(table, componentId),
356
+ vertex: <ComponentId extends ComponentIdOfTable<Table>>(
357
+ componentId: ComponentId,
358
+ ) => getComponentVertexLocation(table, componentId),
359
+ slot: <ComponentId extends ComponentIdOfTable<Table>>(
360
+ componentId: ComponentId,
361
+ ) => getComponentSlotLocation(table, componentId),
362
+ },
363
+ };
364
+ }
365
+
366
+ export function createStateQueries<State extends { table: RuntimeTableRecord }>(
367
+ state: State,
368
+ ): TableQueriesOfState<State> {
369
+ return createTableQueries(
370
+ state.table,
371
+ ) as unknown as TableQueriesOfState<State>;
372
+ }
@@ -0,0 +1,120 @@
1
+ import type { Op } from "./compose";
2
+ import type {
3
+ BoardIdOfTable,
4
+ CardIdOfTable,
5
+ ComponentIdOfTable,
6
+ PlayerIdOfTable,
7
+ PlayerZoneIdOfTable,
8
+ RuntimeTableRecord,
9
+ SpaceIdOfTable,
10
+ TableOfState,
11
+ TableQueriesOfState,
12
+ } from "./model";
13
+ import { createReducerOps, type ReducerOps } from "./ops";
14
+ import { createStateQueries } from "./table-queries";
15
+
16
+ export type RotatePlayerZoneArgs<
17
+ State extends { table: RuntimeTableRecord },
18
+ ZoneId extends PlayerZoneIdOfTable<TableOfState<State>> = PlayerZoneIdOfTable<
19
+ TableOfState<State>
20
+ >,
21
+ PlayerId extends PlayerIdOfTable<TableOfState<State>> = PlayerIdOfTable<
22
+ TableOfState<State>
23
+ >,
24
+ > = {
25
+ zoneId: ZoneId;
26
+ direction: "left" | "right";
27
+ players?: readonly PlayerId[];
28
+ cardIdsByPlayer?: Partial<
29
+ Record<PlayerId, readonly CardIdOfTable<TableOfState<State>>[]>
30
+ >;
31
+ position?: "top" | "bottom";
32
+ };
33
+
34
+ type TransactionMethods<State extends { table: RuntimeTableRecord }> = {
35
+ [Key in Exclude<
36
+ keyof ReducerOps<State>,
37
+ "moveComponentToSpace"
38
+ >]: ReducerOps<State>[Key] extends (...args: infer Args) => Op<State>
39
+ ? (...args: Args) => State
40
+ : never;
41
+ } & {
42
+ moveComponentToSpace<
43
+ BoardId extends BoardIdOfTable<TableOfState<State>>,
44
+ SpaceId extends SpaceIdOfTable<TableOfState<State>, BoardId>,
45
+ ComponentId extends ComponentIdOfTable<TableOfState<State>>,
46
+ >(args: {
47
+ componentId: ComponentId;
48
+ boardId: BoardId;
49
+ spaceId: SpaceId;
50
+ }): State;
51
+ };
52
+
53
+ export type ReducerTransaction<State extends { table: RuntimeTableRecord }> =
54
+ TransactionMethods<State> & {
55
+ readonly state: State;
56
+ readonly q: TableQueriesOfState<State>;
57
+ apply(op: Op<State>): State;
58
+ rotatePlayerZone<
59
+ ZoneId extends PlayerZoneIdOfTable<TableOfState<State>>,
60
+ PlayerId extends PlayerIdOfTable<TableOfState<State>>,
61
+ >(
62
+ args: RotatePlayerZoneArgs<State, ZoneId, PlayerId>,
63
+ ): State;
64
+ };
65
+
66
+ export type ReducerEdit<State extends { table: RuntimeTableRecord }> = <
67
+ DraftState extends State,
68
+ >(
69
+ state: DraftState,
70
+ ) => ReducerTransaction<DraftState>;
71
+
72
+ export function createReducerTransaction<
73
+ State extends { table: RuntimeTableRecord },
74
+ >(initialState: State, ops: ReducerOps<State> = createReducerOps<State>()) {
75
+ let currentState = initialState;
76
+ let currentQueries = createStateQueries(currentState);
77
+
78
+ const refresh = (nextState: State): State => {
79
+ currentState = nextState;
80
+ currentQueries = createStateQueries(currentState);
81
+ return currentState;
82
+ };
83
+
84
+ const apply = (op: Op<State>): State => refresh(op(currentState));
85
+
86
+ const base = {
87
+ get state() {
88
+ return currentState;
89
+ },
90
+ get q() {
91
+ return currentQueries;
92
+ },
93
+ apply,
94
+ };
95
+
96
+ return new Proxy(base, {
97
+ get(target, property, receiver) {
98
+ if (property in target) {
99
+ return Reflect.get(target, property, receiver);
100
+ }
101
+ const opFactory = ops[property as keyof ReducerOps<State>];
102
+ if (typeof opFactory !== "function") {
103
+ return undefined;
104
+ }
105
+ return (...args: readonly unknown[]) => {
106
+ const op = (opFactory as (...args: readonly unknown[]) => Op<State>)(
107
+ ...args,
108
+ );
109
+ return apply(op);
110
+ };
111
+ },
112
+ }) as ReducerTransaction<State>;
113
+ }
114
+
115
+ export function createReducerEdit<State extends { table: RuntimeTableRecord }>(
116
+ ops: ReducerOps<State> = createReducerOps<State>(),
117
+ ): ReducerEdit<State> {
118
+ return <DraftState extends State>(state: DraftState) =>
119
+ createReducerTransaction(state, ops as unknown as ReducerOps<DraftState>);
120
+ }