@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,35 @@
1
+ type RecordInitializer<Id extends string, Value> = Value | ((id: Id) => Value);
2
+
3
+ export function buildTypedRecord<Id extends string, Value>(
4
+ ids: readonly Id[],
5
+ initial: RecordInitializer<Id, Value>,
6
+ ): Record<Id, Value> {
7
+ const createValue =
8
+ typeof initial === "function"
9
+ ? (initial as (id: Id) => Value)
10
+ : () => initial;
11
+
12
+ return Object.fromEntries(ids.map((id) => [id, createValue(id)])) as Record<
13
+ Id,
14
+ Value
15
+ >;
16
+ }
17
+
18
+ export function isTypedId<Id extends string>(
19
+ ids: readonly Id[],
20
+ value: string,
21
+ ): value is Id {
22
+ return (ids as readonly string[]).includes(value);
23
+ }
24
+
25
+ export function expectTypedId<Id extends string>(
26
+ ids: readonly Id[],
27
+ value: string,
28
+ description: string,
29
+ ): Id {
30
+ if (isTypedId(ids, value)) {
31
+ return value;
32
+ }
33
+
34
+ throw new Error(`Unknown ${description} '${value}'.`);
35
+ }
@@ -0,0 +1,147 @@
1
+ import type {
2
+ DieTypeSpec as ApiDieTypeSpec,
3
+ GameTopologyManifest as ApiGameTopologyManifest,
4
+ } from "./contracts.js";
5
+
6
+ export type {
7
+ ActionDefinition,
8
+ ActionInteractionDescriptor,
9
+ ActionParameterDefinition,
10
+ AvailableInteractionAvailability,
11
+ BlockedInteractionAvailability,
12
+ BoardCard,
13
+ BoardContainerHostSpec,
14
+ BoardContainerSpec,
15
+ BoardEdgeRef,
16
+ BoardHostSpec,
17
+ BoardLayout,
18
+ BoardRelationSpec,
19
+ BoardSpaceSpec,
20
+ BoardSpec,
21
+ BoardTargetDomain,
22
+ BoardTemplateSpec,
23
+ BoardVertexRef,
24
+ BoundedNumberDomain,
25
+ CardPropertySchema,
26
+ CardPropertySchemaVariants,
27
+ CardSetDefinition,
28
+ CardSetSourceType,
29
+ CardTargetDomain,
30
+ ChoiceDomain,
31
+ ChoiceDomainOption,
32
+ ChoiceListDomain,
33
+ ComponentHomeSpec,
34
+ ComponentSlotSpec,
35
+ ComponentVisibilitySpec,
36
+ ContainerHomeSpec,
37
+ DetachedHomeSpec,
38
+ DieSeedSpec,
39
+ DieSlotHostRef,
40
+ EagerInputDomainDependencies,
41
+ EdgeHomeSpec,
42
+ GenericBoardSpec,
43
+ GenericBoardTemplateSpec,
44
+ HexBoardSpec,
45
+ HexBoardTemplateSpec,
46
+ HexEdgeRef,
47
+ HexEdgeSpec,
48
+ HexOrientation,
49
+ HexSpaceSpec,
50
+ HexVertexRef,
51
+ HexVertexSpec,
52
+ HistoryEntrySummary,
53
+ HostActionSubmitResponse,
54
+ HostEndedSessionSnapshot,
55
+ HostGameplaySeatView,
56
+ HostGameplaySessionSnapshot,
57
+ HostGameplaySharedView,
58
+ HostLobbySessionSnapshot,
59
+ HostLobbyView,
60
+ HostPlayerGameplayView,
61
+ HostSessionContext,
62
+ HostSessionEventCausation,
63
+ HostSessionGameplayUpdatedEvent,
64
+ HostSessionSnapshot,
65
+ HostSessionStatus,
66
+ InputDomain,
67
+ InputDomainDependencyCase,
68
+ InputDomainResolver,
69
+ InputSelection,
70
+ InsufficientResourcesInteractionAvailability,
71
+ InteractionAvailability,
72
+ InteractionCommitPolicy,
73
+ InteractionContext,
74
+ InteractionContextOption,
75
+ InteractionDescriptor,
76
+ InteractionDescriptorBase,
77
+ InteractionInputDescriptor,
78
+ JsonValue,
79
+ LazyBoardTargetDomain,
80
+ LazyCardTargetDomain,
81
+ LazyInputDomainDependencies,
82
+ ManualCardSetDefinition,
83
+ ManyInputSelection,
84
+ NotYourTurnInteractionAvailability,
85
+ ObjectSchema,
86
+ ParameterType,
87
+ PieceSeedSpec,
88
+ PieceSlotHostRef,
89
+ PieceTypeSpec,
90
+ PlayerId,
91
+ PlayersDefinition,
92
+ PresetCardSetDefinition,
93
+ PromptInteractionDescriptor,
94
+ PropertySchema,
95
+ ResolvedBoardTargetDomain,
96
+ ResolvedCardTargetDomain,
97
+ ResourceDefinition,
98
+ ResourceMapDomain,
99
+ ResourceMapDomainEntry,
100
+ SeatAssignment,
101
+ SessionActor,
102
+ SessionActorAuthUser,
103
+ SessionActorDemoGuest,
104
+ SessionGameSource,
105
+ SessionGameSourceDemoRevision,
106
+ SessionGameSourceUserCompiled,
107
+ SessionSnapshotHistory,
108
+ SessionSnapshotPhase,
109
+ SetupOptionChoiceSpec,
110
+ SetupOptionSpec,
111
+ SetupProfileSpec,
112
+ SimultaneousPhaseSnapshot,
113
+ SingleInputSelection,
114
+ SlotHomeSpec,
115
+ SlotHostRef,
116
+ SpaceHomeSpec,
117
+ SpaceHostSpec,
118
+ SquareBoardSpec,
119
+ SquareBoardTemplateSpec,
120
+ SquareEdgeSpec,
121
+ SquareSpaceSpec,
122
+ SquareVertexSpec,
123
+ TopologyScope,
124
+ VertexHomeSpec,
125
+ ZoneHandles,
126
+ ZoneHomeSpec,
127
+ ZoneSpec,
128
+ ZoneVisibility,
129
+ } from "./contracts.js";
130
+
131
+ export type DieTypeSpec = Omit<ApiDieTypeSpec, "sides"> & {
132
+ sides?: ApiDieTypeSpec["sides"];
133
+ };
134
+
135
+ export type GameTopologyManifest = Omit<ApiGameTopologyManifest, "dieTypes"> & {
136
+ dieTypes?: Array<DieTypeSpec>;
137
+ };
138
+
139
+ export type { CardCollection, ViewCard } from "./cards.js";
140
+ export type { ViewSlotOccupant } from "./slots.js";
141
+ export { defineTopologyManifest } from "./authoring.js";
142
+ export type { TypedTopologyManifest } from "./authoring.js";
143
+ export {
144
+ buildTypedRecord,
145
+ expectTypedId,
146
+ isTypedId,
147
+ } from "./generated-helpers.js";
@@ -0,0 +1,11 @@
1
+ export interface ViewSlotOccupant<
2
+ PieceIdValue extends string = string,
3
+ PlayerIdValue extends string = string,
4
+ SlotIdValue extends string = string,
5
+ Data extends Record<string, unknown> = Record<string, unknown>,
6
+ > {
7
+ pieceId: PieceIdValue;
8
+ playerId: PlayerIdValue | null;
9
+ slotId: SlotIdValue;
10
+ data?: Data;
11
+ }
package/src/types.ts ADDED
@@ -0,0 +1 @@
1
+ export * from "./types/index.js";
@@ -0,0 +1,97 @@
1
+ import type {
2
+ ButtonHTMLAttributes,
3
+ ElementType,
4
+ MouseEvent,
5
+ ReactNode,
6
+ } from "react";
7
+ import type { ButtonSize, ButtonVariant } from "../theme/derive.js";
8
+ import type { InteractionVisualState } from "../types/visual-state.js";
9
+ import { CostDisplay, type ResourceDefinition } from "./CostDisplay.js";
10
+ import { ThemedButton } from "./ThemedButton.js";
11
+
12
+ export interface ActionButtonProps
13
+ extends
14
+ Omit<ButtonHTMLAttributes<HTMLButtonElement>, "children">,
15
+ InteractionVisualState {
16
+ label?: ReactNode;
17
+ description?: ReactNode;
18
+ icon?: ElementType<{ className?: string }>;
19
+ cost?: Record<string, number>;
20
+ currentResources?: Record<string, number>;
21
+ resourceDefs?: ResourceDefinition[];
22
+ available?: boolean;
23
+ disabledReason?: string;
24
+ loading?: boolean;
25
+ variant?: ButtonVariant;
26
+ size?: ButtonSize;
27
+ children?: ReactNode;
28
+ }
29
+
30
+ export function ActionButton({
31
+ label,
32
+ description,
33
+ icon,
34
+ cost,
35
+ currentResources,
36
+ resourceDefs,
37
+ available = true,
38
+ disabledReason,
39
+ loading = false,
40
+ disabled,
41
+ eligible,
42
+ selected,
43
+ invalid,
44
+ submitted,
45
+ previewing,
46
+ intentProgress,
47
+ title,
48
+ variant = "secondary",
49
+ size = "md",
50
+ children,
51
+ onClick,
52
+ ...rest
53
+ }: ActionButtonProps) {
54
+ const isDisabled = disabled || loading || !available;
55
+ const Icon = icon;
56
+ const resolvedTitle = title ?? (!available ? disabledReason : undefined);
57
+
58
+ function handleClick(event: MouseEvent<HTMLButtonElement>) {
59
+ if (isDisabled) return;
60
+ onClick?.(event);
61
+ }
62
+
63
+ return (
64
+ <ThemedButton
65
+ type="button"
66
+ variant={variant}
67
+ size={size}
68
+ disabled={isDisabled}
69
+ eligible={eligible ?? (available && !isDisabled ? undefined : undefined)}
70
+ selected={selected}
71
+ invalid={invalid}
72
+ submitted={submitted}
73
+ previewing={previewing}
74
+ intentProgress={intentProgress}
75
+ loading={loading}
76
+ title={resolvedTitle}
77
+ onClick={handleClick}
78
+ {...rest}
79
+ >
80
+ {Icon ? <Icon className="h-4 w-4" aria-hidden="true" /> : null}
81
+ <span className="inline-flex min-w-0 flex-col items-start gap-0.5">
82
+ <span>{children ?? label ?? "Action"}</span>
83
+ {description ? (
84
+ <span className="text-xs font-normal opacity-75">{description}</span>
85
+ ) : null}
86
+ {cost && resourceDefs ? (
87
+ <CostDisplay
88
+ cost={cost}
89
+ currentResources={currentResources}
90
+ resourceDefs={resourceDefs}
91
+ />
92
+ ) : null}
93
+ </span>
94
+ {loading ? <span aria-hidden="true">...</span> : null}
95
+ </ThemedButton>
96
+ );
97
+ }
@@ -0,0 +1,315 @@
1
+ /**
2
+ * Collapsible panel for grouping game actions with state-based visibility.
3
+ *
4
+ * Visual styling is sourced entirely from the active {@link useTheme}.
5
+ * The previous bespoke "wobbly notebook" treatment (`wobbly-border-lg` /
6
+ * `hard-shadow-lg` / hardcoded `#fff9c4` / `#fdfbf7`) has been retired
7
+ * in favour of `surfaceStyle` + `chipStyle` so the panel re-skins
8
+ * uniformly when authors swap themes.
9
+ */
10
+
11
+ import { useId, useState, type ReactNode } from "react";
12
+ import { motion, AnimatePresence } from "framer-motion";
13
+ import { ChevronUp } from "lucide-react";
14
+ import { useTheme } from "../theme/ThemeProvider.js";
15
+ import {
16
+ chipStyle,
17
+ intentForVariant,
18
+ surfaceStyle,
19
+ type ButtonVariant,
20
+ } from "../theme/derive.js";
21
+
22
+ export interface ActionPanelProps {
23
+ title?: string;
24
+ /** Current game state/phase for context display */
25
+ state?: string;
26
+ /** Human-readable state labels */
27
+ stateLabels?: Record<string, string>;
28
+ collapsible?: boolean;
29
+ defaultExpanded?: boolean;
30
+ children: ReactNode;
31
+ className?: string;
32
+ }
33
+
34
+ export function ActionPanel({
35
+ title = "Actions",
36
+ state,
37
+ stateLabels,
38
+ collapsible = true,
39
+ defaultExpanded = true,
40
+ children,
41
+ className,
42
+ }: ActionPanelProps) {
43
+ const theme = useTheme();
44
+ const reducedMotion = theme.motion.reducedMotion === "true";
45
+ const contentId = useId();
46
+ const [isExpanded, setIsExpanded] = useState(defaultExpanded);
47
+ const [isHovered, setIsHovered] = useState(false);
48
+
49
+ const stateLabel = state
50
+ ? stateLabels?.[state] || state.replace(/([A-Z])/g, " $1").trim()
51
+ : undefined;
52
+
53
+ return (
54
+ <motion.div
55
+ initial={reducedMotion ? { opacity: 0 } : { opacity: 0, y: 20 }}
56
+ animate={reducedMotion ? { opacity: 1 } : { opacity: 1, y: 0 }}
57
+ className={className}
58
+ data-dreamboard-action-panel=""
59
+ data-state={isExpanded ? "open" : "closed"}
60
+ data-collapsible={collapsible ? "true" : undefined}
61
+ style={{
62
+ ...surfaceStyle(theme, { tone: "card", radius: "hud" }),
63
+ boxShadow: theme.elevation.rest,
64
+ overflow: "hidden",
65
+ }}
66
+ role="region"
67
+ aria-label={title}
68
+ >
69
+ <button
70
+ type="button"
71
+ onClick={() => collapsible && setIsExpanded(!isExpanded)}
72
+ onMouseEnter={() => setIsHovered(true)}
73
+ onMouseLeave={() => setIsHovered(false)}
74
+ disabled={!collapsible}
75
+ aria-expanded={isExpanded}
76
+ aria-controls={contentId}
77
+ style={{
78
+ width: "100%",
79
+ padding: `${theme.space[3]} ${theme.space[4]}`,
80
+ display: "flex",
81
+ alignItems: "center",
82
+ justifyContent: "space-between",
83
+ gap: theme.space[3],
84
+ borderBottom: isExpanded
85
+ ? `1px dashed ${theme.semantic.border.subtle}`
86
+ : "1px solid transparent",
87
+ background:
88
+ collapsible && isHovered
89
+ ? theme.semantic.surface.inset
90
+ : theme.semantic.surface.hud,
91
+ color: theme.semantic.text.primary,
92
+ fontFamily: theme.typography.fontFamily.body,
93
+ cursor: collapsible ? "pointer" : "default",
94
+ transition: `background ${theme.motion.duration.fast} ${theme.motion.easing.out}`,
95
+ // Reset native button look.
96
+ border: "none",
97
+ textAlign: "left",
98
+ appearance: "none",
99
+ }}
100
+ >
101
+ <div>
102
+ <h2
103
+ style={{
104
+ margin: 0,
105
+ fontFamily: theme.typography.fontFamily.display,
106
+ fontSize: theme.typography.fontSize.xl,
107
+ fontWeight: theme.typography.fontWeight.bold,
108
+ color: theme.semantic.text.primary,
109
+ lineHeight: theme.typography.lineHeight.tight,
110
+ }}
111
+ >
112
+ {title}
113
+ </h2>
114
+ {stateLabel && (
115
+ <p
116
+ style={{
117
+ margin: 0,
118
+ marginTop: theme.space[1],
119
+ fontSize: theme.typography.fontSize.sm,
120
+ fontWeight: theme.typography.fontWeight.medium,
121
+ color: theme.semantic.text.muted,
122
+ display: "flex",
123
+ alignItems: "center",
124
+ gap: theme.space[2],
125
+ }}
126
+ >
127
+ <span
128
+ style={{
129
+ width: 8,
130
+ height: 8,
131
+ borderRadius: theme.radius.pill,
132
+ background: theme.semantic.intent.primary.solid,
133
+ border: `1px solid ${theme.semantic.intent.primary.border}`,
134
+ display: "inline-block",
135
+ }}
136
+ />
137
+ Phase: {stateLabel}
138
+ </p>
139
+ )}
140
+ </div>
141
+ {collapsible && (
142
+ <motion.div
143
+ animate={
144
+ reducedMotion ? undefined : { rotate: isExpanded ? 0 : 180 }
145
+ }
146
+ transition={{ duration: 0.2 }}
147
+ style={{
148
+ padding: theme.space[1],
149
+ borderRadius: theme.radius.md,
150
+ border: `1px solid ${theme.semantic.border.default}`,
151
+ background: theme.semantic.surface.card,
152
+ color: theme.semantic.text.primary,
153
+ display: "inline-flex",
154
+ }}
155
+ >
156
+ <ChevronUp
157
+ size={20}
158
+ strokeWidth={2.5}
159
+ aria-hidden="true"
160
+ style={{ display: "block" }}
161
+ />
162
+ </motion.div>
163
+ )}
164
+ </button>
165
+
166
+ <AnimatePresence initial={false}>
167
+ {isExpanded && (
168
+ <motion.div
169
+ id={contentId}
170
+ initial={reducedMotion ? { opacity: 0 } : { height: 0, opacity: 0 }}
171
+ animate={
172
+ reducedMotion ? { opacity: 1 } : { height: "auto", opacity: 1 }
173
+ }
174
+ exit={reducedMotion ? { opacity: 0 } : { height: 0, opacity: 0 }}
175
+ transition={{ duration: 0.2, ease: "easeInOut" }}
176
+ style={{
177
+ overflow: "hidden",
178
+ background: theme.semantic.surface.card,
179
+ }}
180
+ >
181
+ <div
182
+ style={{
183
+ padding: theme.space[4],
184
+ display: "flex",
185
+ flexDirection: "column",
186
+ gap: theme.space[6],
187
+ }}
188
+ >
189
+ {children}
190
+ </div>
191
+ </motion.div>
192
+ )}
193
+ </AnimatePresence>
194
+ </motion.div>
195
+ );
196
+ }
197
+
198
+ export interface ActionGroupProps {
199
+ title: string;
200
+ description?: string;
201
+ visible?: boolean;
202
+ /** Highlight style for special phases. Maps directly onto theme intent slots. */
203
+ variant?: "default" | "warning" | "danger" | "success";
204
+ children: ReactNode;
205
+ className?: string;
206
+ }
207
+
208
+ const VARIANT_TO_INTENT: Record<
209
+ ActionGroupProps["variant"] & string,
210
+ ButtonVariant | null
211
+ > = {
212
+ default: null,
213
+ warning: "warning",
214
+ danger: "danger",
215
+ success: "success",
216
+ };
217
+
218
+ export function ActionGroup({
219
+ title,
220
+ description,
221
+ visible = true,
222
+ variant = "default",
223
+ children,
224
+ className,
225
+ }: ActionGroupProps) {
226
+ const theme = useTheme();
227
+ const reducedMotion = theme.motion.reducedMotion === "true";
228
+
229
+ if (!visible) return null;
230
+
231
+ const intentVariant = VARIANT_TO_INTENT[variant];
232
+ const intent = intentVariant ? intentForVariant(theme, intentVariant) : null;
233
+
234
+ const containerStyle: React.CSSProperties = intent
235
+ ? {
236
+ background: intent.soft,
237
+ color: intent.onSoft,
238
+ border: `1px solid ${intent.border}`,
239
+ borderRadius: theme.radius.lg,
240
+ boxShadow: theme.elevation.rest,
241
+ }
242
+ : {
243
+ background: theme.semantic.surface.card,
244
+ color: theme.semantic.text.primary,
245
+ border: `1px solid ${theme.semantic.border.subtle}`,
246
+ borderRadius: theme.radius.lg,
247
+ boxShadow: theme.elevation.rest,
248
+ };
249
+
250
+ return (
251
+ <motion.div
252
+ initial={reducedMotion ? { opacity: 0 } : { opacity: 0, x: -10 }}
253
+ animate={reducedMotion ? { opacity: 1 } : { opacity: 1, x: 0 }}
254
+ className={className}
255
+ data-dreamboard-action-group=""
256
+ data-variant={variant}
257
+ style={{
258
+ position: "relative",
259
+ padding: theme.space[4],
260
+ fontFamily: theme.typography.fontFamily.body,
261
+ ...containerStyle,
262
+ }}
263
+ role="group"
264
+ aria-labelledby={`action-group-${title.toLowerCase().replace(/\s+/g, "-")}`}
265
+ >
266
+ <span
267
+ style={{
268
+ position: "absolute",
269
+ top: -10,
270
+ left: theme.space[3],
271
+ ...chipStyle(theme, { variant: "secondary", size: "sm" }),
272
+ background: theme.semantic.surface.card,
273
+ }}
274
+ >
275
+ Group
276
+ </span>
277
+ <h3
278
+ id={`action-group-${title.toLowerCase().replace(/\s+/g, "-")}`}
279
+ style={{
280
+ margin: 0,
281
+ fontFamily: theme.typography.fontFamily.display,
282
+ fontSize: theme.typography.fontSize.lg,
283
+ fontWeight: theme.typography.fontWeight.bold,
284
+ color: intent?.onSoft ?? theme.semantic.text.primary,
285
+ marginBottom: description ? theme.space[2] : theme.space[3],
286
+ }}
287
+ >
288
+ {title}
289
+ </h3>
290
+ {description && (
291
+ <p
292
+ style={{
293
+ margin: 0,
294
+ marginBottom: theme.space[4],
295
+ fontSize: theme.typography.fontSize.sm,
296
+ fontWeight: theme.typography.fontWeight.medium,
297
+ color: intent?.onSoft ?? theme.semantic.text.muted,
298
+ opacity: 0.85,
299
+ }}
300
+ >
301
+ {description}
302
+ </p>
303
+ )}
304
+ <div
305
+ style={{
306
+ display: "flex",
307
+ flexDirection: "column",
308
+ gap: theme.space[3],
309
+ }}
310
+ >
311
+ {children}
312
+ </div>
313
+ </motion.div>
314
+ );
315
+ }