@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,240 @@
1
+ import type { CSSProperties } from "react";
2
+ import type { IntentColor, Theme } from "./tokens.js";
3
+
4
+ /**
5
+ * Helpers that derive component-specific style fragments from a
6
+ * resolved {@link Theme}. They live alongside the theme module (rather
7
+ * than in each component) so that:
8
+ *
9
+ * - There is one canonical mapping of "intent → button style", "intent →
10
+ * chip style", etc.
11
+ * - Component visuals stay aligned automatically when an author tweaks
12
+ * the theme; nobody has to remember to update a bespoke calc inside
13
+ * `<CardFace>` or `<ThemedButton>`.
14
+ *
15
+ * Each helper returns a plain {@link CSSProperties} fragment so the
16
+ * caller can spread it into an inline style (or pass it through to
17
+ * Framer Motion's `style` prop).
18
+ */
19
+
20
+ /** Button visual variants derived from semantic intent slots. */
21
+ export type ButtonVariant =
22
+ | "primary"
23
+ | "secondary"
24
+ | "danger"
25
+ | "submitted"
26
+ | "success"
27
+ | "warning"
28
+ | "info"
29
+ | "ghost";
30
+
31
+ export type ButtonSize = "sm" | "md" | "lg";
32
+
33
+ /**
34
+ * Compute the inline style for a button in `variant`/`size` from the
35
+ * theme. `disabled` and `pressed` are visual-only — they affect colour
36
+ * intensity and elevation but never touch interactivity (the consuming
37
+ * component owns `aria-disabled` and event wiring).
38
+ */
39
+ export function buttonStyle(
40
+ theme: Theme,
41
+ options: {
42
+ variant?: ButtonVariant;
43
+ size?: ButtonSize;
44
+ disabled?: boolean;
45
+ pressed?: boolean;
46
+ } = {},
47
+ ): CSSProperties {
48
+ const { variant = "primary", size = "md", disabled, pressed } = options;
49
+ const intent = intentForVariant(theme, variant);
50
+ const sizing = BUTTON_SIZE[size];
51
+ const visuallyDisabled = disabled && variant !== "submitted";
52
+
53
+ const baseShadow =
54
+ variant === "ghost"
55
+ ? "none"
56
+ : pressed
57
+ ? theme.elevation.rest
58
+ : theme.elevation.hover;
59
+
60
+ return {
61
+ display: "inline-flex",
62
+ alignItems: "center",
63
+ justifyContent: "center",
64
+ gap: theme.space[2],
65
+ minHeight: sizing.minHeight,
66
+ paddingBlock: sizing.paddingBlock,
67
+ paddingInline: sizing.paddingInline,
68
+ borderRadius: theme.radius.md,
69
+ border:
70
+ variant === "ghost"
71
+ ? "1px solid transparent"
72
+ : `1px solid ${visuallyDisabled ? theme.semantic.border.subtle : intent.border}`,
73
+ background:
74
+ variant === "ghost"
75
+ ? "transparent"
76
+ : visuallyDisabled
77
+ ? theme.semantic.surface.inset
78
+ : intent.solid,
79
+ color: visuallyDisabled
80
+ ? theme.semantic.text.disabled
81
+ : variant === "ghost"
82
+ ? theme.semantic.text.primary
83
+ : intent.on,
84
+ fontFamily: theme.typography.fontFamily.body,
85
+ fontSize: sizing.fontSize,
86
+ fontWeight: theme.typography.fontWeight.bold,
87
+ lineHeight: theme.typography.lineHeight.tight,
88
+ letterSpacing: theme.typography.letterSpacing.normal,
89
+ cursor: disabled ? "not-allowed" : "pointer",
90
+ boxShadow: disabled ? "none" : baseShadow,
91
+ transition: `background-color ${theme.motion.duration.fast} ${theme.motion.easing.out}, transform ${theme.motion.duration.fast} ${theme.motion.easing.out}, box-shadow ${theme.motion.duration.normal} ${theme.motion.easing.out}`,
92
+ userSelect: "none",
93
+ WebkitTapHighlightColor: "transparent",
94
+ };
95
+ }
96
+
97
+ const BUTTON_SIZE: Record<
98
+ ButtonSize,
99
+ {
100
+ minHeight: number;
101
+ paddingBlock: string;
102
+ paddingInline: string;
103
+ fontSize: string;
104
+ }
105
+ > = {
106
+ sm: {
107
+ minHeight: 32,
108
+ paddingBlock: "0.25rem",
109
+ paddingInline: "0.625rem",
110
+ fontSize: "0.8125rem",
111
+ },
112
+ md: {
113
+ minHeight: 40,
114
+ paddingBlock: "0.5rem",
115
+ paddingInline: "0.875rem",
116
+ fontSize: "0.9375rem",
117
+ },
118
+ lg: {
119
+ minHeight: 52,
120
+ paddingBlock: "0.75rem",
121
+ paddingInline: "1.125rem",
122
+ fontSize: "1.0625rem",
123
+ },
124
+ };
125
+
126
+ /**
127
+ * Soft-intent chip ("Your turn", "Largest army", "Waiting…"). Reads
128
+ * `intent.<variant>.soft` for background and `.onSoft` for text.
129
+ */
130
+ export function chipStyle(
131
+ theme: Theme,
132
+ options: {
133
+ variant?: Exclude<ButtonVariant, "ghost">;
134
+ size?: "sm" | "md";
135
+ } = {},
136
+ ): CSSProperties {
137
+ const { variant = "secondary", size = "sm" } = options;
138
+ const intent = intentForVariant(theme, variant);
139
+ return {
140
+ display: "inline-flex",
141
+ alignItems: "center",
142
+ gap: theme.space[1],
143
+ paddingBlock: size === "md" ? "0.25rem" : "0.125rem",
144
+ paddingInline: size === "md" ? "0.625rem" : "0.5rem",
145
+ borderRadius: theme.radius.pill,
146
+ border: `1px solid ${intent.border}`,
147
+ background: intent.soft,
148
+ color: intent.onSoft,
149
+ fontFamily: theme.typography.fontFamily.body,
150
+ fontSize:
151
+ size === "md"
152
+ ? theme.typography.fontSize.sm
153
+ : theme.typography.fontSize.xs,
154
+ fontWeight: theme.typography.fontWeight.bold,
155
+ letterSpacing: theme.typography.letterSpacing.wide,
156
+ textTransform: "uppercase",
157
+ whiteSpace: "nowrap",
158
+ };
159
+ }
160
+
161
+ /**
162
+ * Standard surface card (player card, action panel, hand drawer). The
163
+ * `tone` selects which `surface.*` slot to read; `interactive` adds
164
+ * the hover-elevation transition baseline.
165
+ */
166
+ export function surfaceStyle(
167
+ theme: Theme,
168
+ options: {
169
+ tone?: keyof Theme["semantic"]["surface"];
170
+ interactive?: boolean;
171
+ /** Override radius to one of the theme tokens. Defaults to `lg`. */
172
+ radius?: keyof Theme["radius"];
173
+ } = {},
174
+ ): CSSProperties {
175
+ const { tone = "card", interactive, radius = "lg" } = options;
176
+ return {
177
+ background: theme.semantic.surface[tone],
178
+ color: theme.semantic.text.primary,
179
+ border: `1px solid ${theme.semantic.border.subtle}`,
180
+ borderRadius: theme.radius[radius],
181
+ boxShadow: theme.elevation.rest,
182
+ transition: interactive
183
+ ? `box-shadow ${theme.motion.duration.normal} ${theme.motion.easing.out}, transform ${theme.motion.duration.normal} ${theme.motion.easing.out}`
184
+ : undefined,
185
+ };
186
+ }
187
+
188
+ /** Resolve a {@link ButtonVariant} to its underlying {@link IntentColor}. */
189
+ export function intentForVariant(
190
+ theme: Theme,
191
+ variant: ButtonVariant,
192
+ ): IntentColor {
193
+ switch (variant) {
194
+ case "primary":
195
+ return theme.semantic.intent.primary;
196
+ case "secondary":
197
+ return theme.semantic.intent.secondary;
198
+ case "danger":
199
+ return theme.semantic.intent.danger;
200
+ case "submitted":
201
+ return theme.semantic.intent.success;
202
+ case "success":
203
+ return theme.semantic.intent.success;
204
+ case "warning":
205
+ return theme.semantic.intent.warning;
206
+ case "info":
207
+ return theme.semantic.intent.info;
208
+ case "ghost":
209
+ return theme.semantic.intent.secondary;
210
+ }
211
+ }
212
+
213
+ /**
214
+ * Pick a {@link Theme.player} entry by 0-based seat slot, wrapping
215
+ * around when there are more players than palette entries (so a
216
+ * 7-player game cycles back to player 1's palette).
217
+ */
218
+ export function playerColor(theme: Theme, slot: number) {
219
+ const length = theme.player.length;
220
+ const idx = ((slot % length) + length) % length;
221
+ // The {@link Theme.player} contract pins length === 6 at the type
222
+ // level, but indexing by a runtime-computed value widens the result
223
+ // to `PlayerColor | undefined`. Falling back to slot 0 (also typed
224
+ // `PlayerColor`) keeps the return type narrow without a non-null
225
+ // assertion.
226
+ return theme.player[idx] ?? theme.player[0];
227
+ }
228
+
229
+ /**
230
+ * Returns `theme.motion.duration.<key>` zeroed out when the theme has
231
+ * `motion.reducedMotion === "true"`. Use this in any component that
232
+ * starts an animation so `prefers-reduced-motion` is honoured uniformly.
233
+ */
234
+ export function motionDuration(
235
+ theme: Theme,
236
+ key: keyof Theme["motion"]["duration"],
237
+ ): string {
238
+ if (theme.motion.reducedMotion === "true") return "0ms";
239
+ return theme.motion.duration[key];
240
+ }
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Public theme surface for `@dreamboard-games/sdk/ui`.
3
+ *
4
+ * Authors who only consume the SDK never need to import from
5
+ * sub-modules — `<ThemeProvider>`, `useTheme()`, and the preset ids
6
+ * are the entire public API. Type-level exports cover advanced use
7
+ * (custom themes, deep overrides) without leaking internal token shape
8
+ * surfaces (CSS-var serializer, derive helpers) that may move.
9
+ *
10
+ * Module entry order is import-friendly: tokens (types) before
11
+ * presets (values) before provider (consumes both).
12
+ */
13
+
14
+ export type {
15
+ ColorRamp,
16
+ ComponentTokens,
17
+ Elevation,
18
+ FoundationColor,
19
+ IntentColor,
20
+ Motion,
21
+ PlayerColor,
22
+ Radius,
23
+ SemanticColor,
24
+ Space,
25
+ Theme,
26
+ ThemeMeta,
27
+ ThemeOverride,
28
+ Typography,
29
+ } from "./tokens.js";
30
+
31
+ export { mergeTheme } from "./tokens.js";
32
+
33
+ export { tabletopTheme } from "./presets/tabletop.js";
34
+ export { arcadeTheme } from "./presets/arcade.js";
35
+ export { studioTheme } from "./presets/studio.js";
36
+
37
+ export {
38
+ ThemeProvider,
39
+ resolveTheme,
40
+ getThemePreset,
41
+ useTheme,
42
+ useThemeCssVars,
43
+ type ThemeContextValue,
44
+ type ThemePresetId,
45
+ type ThemeProviderProps,
46
+ } from "./ThemeProvider.js";
47
+
48
+ export { themeToCssVars, cssVar, cssVarOr } from "./css-vars.js";
49
+
50
+ export {
51
+ buttonStyle,
52
+ chipStyle,
53
+ surfaceStyle,
54
+ intentForVariant,
55
+ playerColor,
56
+ motionDuration,
57
+ type ButtonSize,
58
+ type ButtonVariant,
59
+ } from "./derive.js";
60
+
61
+ export { useBoardTheme, deriveBoardTheme, type BoardTheme } from "./board.js";
@@ -0,0 +1,261 @@
1
+ import type { Theme } from "../tokens.js";
2
+
3
+ /**
4
+ * `arcade` — high-contrast neon theme for fast/competitive games.
5
+ *
6
+ * Visual identity: deep slate background, electric cyan/magenta
7
+ * intents, square-ish corners, sharp drop shadows. Designed to evoke
8
+ * action games and to keep critical CTAs popping at a glance.
9
+ */
10
+ export const arcadeTheme: Theme = {
11
+ meta: {
12
+ id: "arcade",
13
+ name: "Arcade",
14
+ mode: "dark",
15
+ },
16
+ color: {
17
+ neutral: {
18
+ 50: "#f5f7fb",
19
+ 100: "#d6dde9",
20
+ 200: "#a8b2c4",
21
+ 400: "#5b6478",
22
+ 600: "#2c3344",
23
+ 800: "#161b27",
24
+ 950: "#070912",
25
+ },
26
+ brand: {
27
+ 50: "#e0fbff",
28
+ 100: "#aef1fb",
29
+ 200: "#62e0f0",
30
+ 400: "#1bc4dc",
31
+ 600: "#0d8ea1",
32
+ 800: "#06525e",
33
+ 950: "#03252b",
34
+ },
35
+ accent: {
36
+ 50: "#ffe6f6",
37
+ 100: "#ffb1de",
38
+ 200: "#ff6cbf",
39
+ 400: "#ff2891",
40
+ 600: "#c80862",
41
+ 800: "#73003a",
42
+ 950: "#37001b",
43
+ },
44
+ success: {
45
+ 50: "#dafdf2",
46
+ 100: "#9af2cf",
47
+ 200: "#52e1a3",
48
+ 400: "#0fc171",
49
+ 600: "#067a45",
50
+ 800: "#024226",
51
+ 950: "#001f10",
52
+ },
53
+ warning: {
54
+ 50: "#fff4d8",
55
+ 100: "#ffe198",
56
+ 200: "#fbc739",
57
+ 400: "#dba500",
58
+ 600: "#9b7400",
59
+ 800: "#5a4200",
60
+ 950: "#291e00",
61
+ },
62
+ danger: {
63
+ 50: "#ffdcdc",
64
+ 100: "#ff9c9c",
65
+ 200: "#ff5454",
66
+ 400: "#e41e1e",
67
+ 600: "#960a0a",
68
+ 800: "#5a0202",
69
+ 950: "#290000",
70
+ },
71
+ info: {
72
+ 50: "#dceefe",
73
+ 100: "#9ecdfb",
74
+ 200: "#4f9ff5",
75
+ 400: "#1d6fde",
76
+ 600: "#0a4598",
77
+ 800: "#03234f",
78
+ 950: "#011024",
79
+ },
80
+ },
81
+ semantic: {
82
+ surface: {
83
+ app: "#070912",
84
+ board: "#0a0e1d",
85
+ hud: "#161b27",
86
+ card: "#1f2636",
87
+ sheet: "#161b27",
88
+ overlay: "rgba(7, 9, 18, 0.78)",
89
+ inset: "#0a0e1d",
90
+ },
91
+ text: {
92
+ primary: "#f5f7fb",
93
+ muted: "#a8b2c4",
94
+ onIntent: "#070912",
95
+ accent: "#62e0f0",
96
+ disabled: "#5b6478",
97
+ },
98
+ border: {
99
+ subtle: "#2c3344",
100
+ default: "#5b6478",
101
+ strong: "#a8b2c4",
102
+ focus: "#1bc4dc",
103
+ },
104
+ intent: {
105
+ primary: {
106
+ solid: "#1bc4dc",
107
+ on: "#070912",
108
+ soft: "rgba(27, 196, 220, 0.18)",
109
+ onSoft: "#aef1fb",
110
+ border: "#62e0f0",
111
+ },
112
+ secondary: {
113
+ solid: "#1f2636",
114
+ on: "#f5f7fb",
115
+ soft: "#161b27",
116
+ onSoft: "#a8b2c4",
117
+ border: "#5b6478",
118
+ },
119
+ success: {
120
+ solid: "#0fc171",
121
+ on: "#070912",
122
+ soft: "rgba(15, 193, 113, 0.18)",
123
+ onSoft: "#9af2cf",
124
+ border: "#52e1a3",
125
+ },
126
+ danger: {
127
+ solid: "#e41e1e",
128
+ on: "#ffffff",
129
+ soft: "rgba(228, 30, 30, 0.18)",
130
+ onSoft: "#ff9c9c",
131
+ border: "#ff5454",
132
+ },
133
+ warning: {
134
+ solid: "#fbc739",
135
+ on: "#070912",
136
+ soft: "rgba(251, 199, 57, 0.18)",
137
+ onSoft: "#ffe198",
138
+ border: "#dba500",
139
+ },
140
+ info: {
141
+ solid: "#4f9ff5",
142
+ on: "#070912",
143
+ soft: "rgba(79, 159, 245, 0.18)",
144
+ onSoft: "#9ecdfb",
145
+ border: "#1d6fde",
146
+ },
147
+ },
148
+ },
149
+ radius: {
150
+ none: "0px",
151
+ sm: "2px",
152
+ md: "4px",
153
+ lg: "6px",
154
+ hud: "10px",
155
+ pill: "9999px",
156
+ },
157
+ space: {
158
+ 0: "0",
159
+ 0.5: "0.125rem",
160
+ 1: "0.25rem",
161
+ 1.5: "0.375rem",
162
+ 2: "0.5rem",
163
+ 3: "0.75rem",
164
+ 4: "1rem",
165
+ 6: "1.5rem",
166
+ 8: "2rem",
167
+ 12: "3rem",
168
+ },
169
+ typography: {
170
+ fontFamily: {
171
+ display: '"Space Grotesk", "Inter", system-ui, -apple-system, sans-serif',
172
+ body: '"Inter", "SF Pro Text", system-ui, -apple-system, sans-serif',
173
+ tabular: '"JetBrains Mono", "SF Mono", ui-monospace, monospace',
174
+ mono: '"JetBrains Mono", "SF Mono", ui-monospace, monospace',
175
+ },
176
+ fontSize: {
177
+ xs: "0.6875rem",
178
+ sm: "0.8125rem",
179
+ md: "0.9375rem",
180
+ lg: "1.0625rem",
181
+ xl: "1.25rem",
182
+ "2xl": "1.5rem",
183
+ "3xl": "2rem",
184
+ },
185
+ fontWeight: {
186
+ regular: "400",
187
+ medium: "500",
188
+ bold: "700",
189
+ },
190
+ lineHeight: {
191
+ tight: "1.1",
192
+ normal: "1.35",
193
+ relaxed: "1.55",
194
+ },
195
+ letterSpacing: {
196
+ tight: "-0.01em",
197
+ normal: "0",
198
+ wide: "0.06em",
199
+ caps: "0.18em",
200
+ },
201
+ },
202
+ elevation: {
203
+ rest: "0 1px 0 rgba(0, 0, 0, 0.4), 0 2px 0 rgba(27, 196, 220, 0.15)",
204
+ hover:
205
+ "0 0 0 1px rgba(27, 196, 220, 0.4), 0 6px 16px rgba(27, 196, 220, 0.35)",
206
+ lifted:
207
+ "0 0 0 2px rgba(27, 196, 220, 0.6), 0 14px 28px rgba(27, 196, 220, 0.45)",
208
+ overlay: "0 20px 60px rgba(0, 0, 0, 0.7)",
209
+ inset: "inset 0 0 0 1px rgba(27, 196, 220, 0.18)",
210
+ },
211
+ motion: {
212
+ duration: {
213
+ fast: "60ms",
214
+ normal: "120ms",
215
+ slow: "220ms",
216
+ ambient: "1400ms",
217
+ },
218
+ easing: {
219
+ out: "cubic-bezier(0.22, 1, 0.36, 1)",
220
+ in: "cubic-bezier(0.36, 0, 1, 0.36)",
221
+ inOut: "cubic-bezier(0.7, 0, 0.3, 1)",
222
+ spring: "cubic-bezier(0.32, 1.6, 0.6, 1)",
223
+ },
224
+ reducedMotion: "false",
225
+ },
226
+ player: [
227
+ { solid: "#1bc4dc", soft: "rgba(27, 196, 220, 0.2)", on: "#070912" },
228
+ { solid: "#ff2891", soft: "rgba(255, 40, 145, 0.2)", on: "#ffffff" },
229
+ { solid: "#0fc171", soft: "rgba(15, 193, 113, 0.2)", on: "#070912" },
230
+ { solid: "#fbc739", soft: "rgba(251, 199, 57, 0.2)", on: "#070912" },
231
+ { solid: "#9b59ff", soft: "rgba(155, 89, 255, 0.2)", on: "#ffffff" },
232
+ { solid: "#ff7b3a", soft: "rgba(255, 123, 58, 0.2)", on: "#070912" },
233
+ ],
234
+ component: {
235
+ board: {
236
+ frameBorder: "#1bc4dc",
237
+ frameBackground: "#0a0e1d",
238
+ hoverRing: "#ff2891",
239
+ eligibleHint: "rgba(27, 196, 220, 0.55)",
240
+ },
241
+ card: {
242
+ border: "#1bc4dc",
243
+ backBorder: "#ff2891",
244
+ backBackground: "#161b27",
245
+ selectedRing: "#ff2891",
246
+ },
247
+ playerCard: {
248
+ activeBackground: "rgba(27, 196, 220, 0.18)",
249
+ activeBorder: "#1bc4dc",
250
+ activeGlow: "rgba(27, 196, 220, 0.5)",
251
+ youBadgeBackground: "rgba(27, 196, 220, 0.22)",
252
+ youBadgeForeground: "#aef1fb",
253
+ },
254
+ toast: {
255
+ successBackground: "#0fc171",
256
+ errorBackground: "#e41e1e",
257
+ infoBackground: "#1bc4dc",
258
+ foreground: "#070912",
259
+ },
260
+ },
261
+ };