@dreamboard-games/sdk 0.2.1-alpha.0 → 0.3.0-alpha.1

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 (363) hide show
  1. package/dist/{HandView-ncJIVLhN.d.ts → HandView-PYDmehVD.d.ts} +1 -1
  2. package/dist/{ResourceCounter-CTREyF73.d.ts → ResourceCounter-BTXklCEZ.d.ts} +1 -1
  3. package/dist/{ThemeProvider-fy0_QzgO.d.ts → ThemeProvider-DvMl17Ny.d.ts} +1 -1
  4. package/dist/attributes-BeRyboMS.d.ts +279 -0
  5. package/dist/browser-interaction.d.ts +708 -0
  6. package/dist/browser-interaction.js +106 -0
  7. package/dist/{chunk-KAELH4KC.js → chunk-3RQEICD3.js} +2 -2
  8. package/dist/{chunk-TDSWKVZ4.js → chunk-ADYH6PVT.js} +2457 -1265
  9. package/dist/chunk-ADYH6PVT.js.map +1 -0
  10. package/dist/{chunk-YFY3RL52.js → chunk-P7VMTJ5D.js} +2 -2
  11. package/dist/{chunk-YFY3RL52.js.map → chunk-P7VMTJ5D.js.map} +1 -1
  12. package/dist/chunk-QLG6VEMW.js +1691 -0
  13. package/dist/chunk-QLG6VEMW.js.map +1 -0
  14. package/dist/{chunk-WYPQ3GG5.js → chunk-QZ6X4B5P.js} +1177 -1106
  15. package/dist/chunk-QZ6X4B5P.js.map +1 -0
  16. package/dist/{chunk-GKKBPPSW.js → chunk-TXXLS3OI.js} +405 -309
  17. package/dist/chunk-TXXLS3OI.js.map +1 -0
  18. package/dist/{chunk-FDNZTDD6.js → chunk-W6SGFWXH.js} +48 -44
  19. package/dist/chunk-W6SGFWXH.js.map +1 -0
  20. package/dist/{chunk-MKXPVOUT.js → chunk-Y2AFYBMB.js} +48 -4
  21. package/dist/chunk-Y2AFYBMB.js.map +1 -0
  22. package/dist/{index-BwqPQtBu.d.ts → codegen.d.ts} +57 -565
  23. package/dist/{infrastructure/workspace-codegen.js → codegen.js} +3 -3
  24. package/dist/{components-D5ZRE2Hl.d.ts → components-DaIqi9QM.d.ts} +48 -37
  25. package/dist/{hex-board-view-D_07hO6O.d.ts → hex-board-view-UCUjMALd.d.ts} +3 -2
  26. package/dist/{infrastructure/reducer-bundle-abi.d.ts → index.d-BGqVifr_.d.ts} +289 -10
  27. package/dist/index.js +1 -1
  28. package/dist/package-set.d.ts +2 -2
  29. package/dist/package-set.js +1 -1
  30. package/dist/primitive-props-BNHDkgd7.d.ts +16 -0
  31. package/dist/reducer-contract.d.ts +3 -0
  32. package/dist/{infrastructure/reducer-bundle-abi.js → reducer-contract.js} +4 -4
  33. package/dist/reducer.d.ts +185 -179
  34. package/dist/reducer.js +1637 -1353
  35. package/dist/reducer.js.map +1 -1
  36. package/dist/runtime/primitives.d.ts +10 -9
  37. package/dist/runtime/primitives.js +8 -7
  38. package/dist/runtime/runtime-api.d.ts +2 -0
  39. package/dist/runtime/runtime-api.js +1 -0
  40. package/dist/runtime/workspace-contract.d.ts +63 -17
  41. package/dist/runtime/workspace-contract.js +5 -5
  42. package/dist/{runtime-api-DWxvTr-O.d.ts → runtime-api-tGL3ArsB.d.ts} +109 -4
  43. package/dist/runtime.d.ts +12 -57
  44. package/dist/runtime.js +487 -7
  45. package/dist/runtime.js.map +1 -1
  46. package/dist/testing.d.ts +4 -4
  47. package/dist/testing.js.map +1 -1
  48. package/dist/types.d.ts +1531 -85
  49. package/dist/types.js +1 -3
  50. package/dist/types.js.map +1 -1
  51. package/dist/ui/components.d.ts +7 -8
  52. package/dist/ui/components.js +1 -1
  53. package/dist/ui/defaults.d.ts +1 -1
  54. package/dist/ui/{types/player-state.d.ts → player-state.d.ts} +2 -2
  55. package/dist/{ui-contract-iQfTtUSL.d.ts → ui-contract-SctM4ibF.d.ts} +157 -150
  56. package/dist/ui.d.ts +10 -11
  57. package/dist/ui.js +2 -2
  58. package/package.json +35 -74
  59. package/dist/bundle-CDd5FKeD.d.ts +0 -283
  60. package/dist/cards-Sl3b40Mv.d.ts +0 -13
  61. package/dist/chunk-7YAHLYBR.js +0 -481
  62. package/dist/chunk-7YAHLYBR.js.map +0 -1
  63. package/dist/chunk-FDNZTDD6.js.map +0 -1
  64. package/dist/chunk-GKKBPPSW.js.map +0 -1
  65. package/dist/chunk-I46YJSOD.js +0 -1
  66. package/dist/chunk-MKXPVOUT.js.map +0 -1
  67. package/dist/chunk-T52J5RMF.js +0 -1
  68. package/dist/chunk-TDSWKVZ4.js.map +0 -1
  69. package/dist/chunk-U5C6BONG.js +0 -34
  70. package/dist/chunk-U5C6BONG.js.map +0 -1
  71. package/dist/chunk-WYPQ3GG5.js.map +0 -1
  72. package/dist/generated/runtime/primitives.d.ts +0 -12
  73. package/dist/generated/runtime/primitives.js +0 -180
  74. package/dist/generated/runtime/primitives.js.map +0 -1
  75. package/dist/generated/runtime-api.d.ts +0 -3
  76. package/dist/generated/runtime-api.js +0 -2
  77. package/dist/generated/runtime.d.ts +0 -14
  78. package/dist/generated/runtime.js +0 -18
  79. package/dist/generated/runtime.js.map +0 -1
  80. package/dist/generated/workspace-contract.d.ts +0 -14
  81. package/dist/generated/workspace-contract.js +0 -14
  82. package/dist/generated/workspace-contract.js.map +0 -1
  83. package/dist/infrastructure/reducer-bundle-abi.js.map +0 -1
  84. package/dist/infrastructure/workspace-codegen.d.ts +0 -53
  85. package/dist/infrastructure/workspace-codegen.js.map +0 -1
  86. package/dist/manifest-contract-BNHVGFtU.d.ts +0 -9
  87. package/dist/primitive-props-DpKs-GCr.d.ts +0 -11
  88. package/dist/runtime/types/runtime-api.d.ts +0 -1
  89. package/dist/runtime/types/runtime-api.js +0 -2
  90. package/dist/runtime-api-3dshj6kK.d.ts +0 -101
  91. package/dist/slots-1GPGihk8.d.ts +0 -8
  92. package/src/generated/reducer-contract/builders.ts +0 -90
  93. package/src/generated/reducer-contract/version.ts +0 -9
  94. package/src/generated/reducer-contract/wire.ts +0 -100
  95. package/src/generated/reducer-contract/zod.ts +0 -103
  96. package/src/generated/runtime/primitives.ts +0 -2
  97. package/src/generated/runtime-api.ts +0 -5
  98. package/src/generated/runtime.ts +0 -35
  99. package/src/generated/workspace-contract.ts +0 -2
  100. package/src/index.ts +0 -7
  101. package/src/infrastructure/reducer-bundle-abi.ts +0 -8
  102. package/src/infrastructure/reducer-contract/bundle.ts +0 -37
  103. package/src/infrastructure/workspace-codegen/hex-geometry.ts +0 -69
  104. package/src/infrastructure/workspace-codegen/index.ts +0 -64
  105. package/src/infrastructure/workspace-codegen/manifest-contract.ts +0 -6632
  106. package/src/infrastructure/workspace-codegen/manifest-validation.ts +0 -795
  107. package/src/infrastructure/workspace-codegen/ownership.ts +0 -131
  108. package/src/infrastructure/workspace-codegen/preset-card-sets.ts +0 -169
  109. package/src/infrastructure/workspace-codegen/seeds.ts +0 -1705
  110. package/src/infrastructure/workspace-codegen.ts +0 -1
  111. package/src/package-set.ts +0 -19
  112. package/src/reducer/authoring/contract.ts +0 -157
  113. package/src/reducer/authoring/effect.ts +0 -224
  114. package/src/reducer/authoring/game.ts +0 -23
  115. package/src/reducer/authoring/interaction.ts +0 -98
  116. package/src/reducer/authoring/phase.ts +0 -300
  117. package/src/reducer/authoring/types.ts +0 -70
  118. package/src/reducer/authoring/validation.ts +0 -382
  119. package/src/reducer/authoring/view-stage.ts +0 -68
  120. package/src/reducer/authoring.ts +0 -29
  121. package/src/reducer/bundle/ingress-bundle.ts +0 -491
  122. package/src/reducer/bundle/trusted/engine-instruction-resolver.ts +0 -254
  123. package/src/reducer/bundle/trusted/flow-instruction-resolver.ts +0 -73
  124. package/src/reducer/bundle/trusted/instruction-runner.ts +0 -414
  125. package/src/reducer/bundle/trusted/interaction-authorization.ts +0 -137
  126. package/src/reducer/bundle/trusted/interaction-collectors.ts +0 -859
  127. package/src/reducer/bundle/trusted/interaction-decision.ts +0 -747
  128. package/src/reducer/bundle/trusted/interaction-resolver.ts +0 -95
  129. package/src/reducer/bundle/trusted/interaction-types.ts +0 -171
  130. package/src/reducer/bundle/trusted/lifecycle-runner.ts +0 -427
  131. package/src/reducer/bundle/trusted/projection-builder.ts +0 -356
  132. package/src/reducer/bundle/trusted/projection-context.ts +0 -39
  133. package/src/reducer/bundle/trusted/rng-sampler.ts +0 -150
  134. package/src/reducer/bundle/trusted/runtime-registry.ts +0 -120
  135. package/src/reducer/bundle/trusted/runtime-scope.ts +0 -336
  136. package/src/reducer/bundle/trusted/simultaneous-player.ts +0 -97
  137. package/src/reducer/bundle/trusted/stage-resolver.ts +0 -87
  138. package/src/reducer/bundle/trusted/static-projection.ts +0 -116
  139. package/src/reducer/bundle/trusted/trusted-runtime-args.ts +0 -97
  140. package/src/reducer/bundle/trusted/trusted-runtime-result.ts +0 -39
  141. package/src/reducer/bundle/trusted/trusted-setup-profiles.ts +0 -43
  142. package/src/reducer/bundle/trusted/trusted-state-codec.ts +0 -48
  143. package/src/reducer/bundle/trusted-bundle.ts +0 -97
  144. package/src/reducer/bundle/types.ts +0 -171
  145. package/src/reducer/bundle.ts +0 -2
  146. package/src/reducer/client-param-schemas.ts +0 -57
  147. package/src/reducer/compose.ts +0 -34
  148. package/src/reducer/core/runtime-input.ts +0 -30
  149. package/src/reducer/core/runtime-instruction.ts +0 -59
  150. package/src/reducer/core/types.ts +0 -62
  151. package/src/reducer/definition-index.ts +0 -277
  152. package/src/reducer/derived.ts +0 -106
  153. package/src/reducer/effects.ts +0 -92
  154. package/src/reducer/engine/runtime-instruction-engine.ts +0 -155
  155. package/src/reducer/ingress/decode-runtime-input.ts +0 -7
  156. package/src/reducer/ingress/decode-session-state.ts +0 -9
  157. package/src/reducer/ingress/encode-session-state.ts +0 -6
  158. package/src/reducer/ingress/input-codec.ts +0 -18
  159. package/src/reducer/ingress/phase-schemas.ts +0 -62
  160. package/src/reducer/ingress/raw-types.ts +0 -107
  161. package/src/reducer/ingress/runtime-codec.ts +0 -14
  162. package/src/reducer/ingress/runtime-payload.ts +0 -13
  163. package/src/reducer/ingress/session-codec.ts +0 -392
  164. package/src/reducer/ingress/types.ts +0 -6
  165. package/src/reducer/inputs/boardInput.ts +0 -217
  166. package/src/reducer/inputs/boardTarget.ts +0 -190
  167. package/src/reducer/inputs/cardInput.ts +0 -86
  168. package/src/reducer/inputs/cardTarget.ts +0 -101
  169. package/src/reducer/inputs/choiceTarget.ts +0 -104
  170. package/src/reducer/inputs/defineInputs.ts +0 -71
  171. package/src/reducer/inputs/formInput.ts +0 -809
  172. package/src/reducer/inputs/many.ts +0 -120
  173. package/src/reducer/inputs/promptInput.ts +0 -87
  174. package/src/reducer/inputs/rngInput.ts +0 -58
  175. package/src/reducer/inputs/targetRule.ts +0 -123
  176. package/src/reducer/inputs.ts +0 -41
  177. package/src/reducer/model/definition.ts +0 -1072
  178. package/src/reducer/model/extract.ts +0 -745
  179. package/src/reducer/model/manifest.ts +0 -570
  180. package/src/reducer/model/queries.ts +0 -641
  181. package/src/reducer/model/runtime.ts +0 -264
  182. package/src/reducer/model/spec.ts +0 -1386
  183. package/src/reducer/model/table.ts +0 -260
  184. package/src/reducer/model.ts +0 -7
  185. package/src/reducer/ops.ts +0 -1034
  186. package/src/reducer/parse-utils.ts +0 -28
  187. package/src/reducer/per-player.ts +0 -422
  188. package/src/reducer/rng.ts +0 -69
  189. package/src/reducer/schema-helpers.ts +0 -185
  190. package/src/reducer/setup-bootstrap-helpers.ts +0 -171
  191. package/src/reducer/setup-bootstrap.ts +0 -481
  192. package/src/reducer/table-ops.ts +0 -2671
  193. package/src/reducer/table-queries.ts +0 -372
  194. package/src/reducer/transaction.ts +0 -120
  195. package/src/reducer.ts +0 -314
  196. package/src/runtime/primitives.ts +0 -1
  197. package/src/runtime/types/runtime-api.ts +0 -1
  198. package/src/runtime/workspace-contract.ts +0 -32
  199. package/src/runtime-internal/components/InteractionForm.tsx +0 -1309
  200. package/src/runtime-internal/components/PluginRuntime.tsx +0 -103
  201. package/src/runtime-internal/components/board/target-layer.ts +0 -70
  202. package/src/runtime-internal/context/ClientParamSchemaContext.tsx +0 -44
  203. package/src/runtime-internal/context/InteractionDraftContext.tsx +0 -279
  204. package/src/runtime-internal/context/PluginSessionContext.tsx +0 -47
  205. package/src/runtime-internal/context/PluginStateContext.tsx +0 -262
  206. package/src/runtime-internal/context/RuntimeContext.tsx +0 -96
  207. package/src/runtime-internal/defaults/components.tsx +0 -409
  208. package/src/runtime-internal/defaults/index.ts +0 -11
  209. package/src/runtime-internal/errors/ValidationError.ts +0 -29
  210. package/src/runtime-internal/hooks/useActivePlayers.ts +0 -33
  211. package/src/runtime-internal/hooks/useBoardInteractions.ts +0 -665
  212. package/src/runtime-internal/hooks/useGameSelector.ts +0 -105
  213. package/src/runtime-internal/hooks/useGameView.ts +0 -9
  214. package/src/runtime-internal/hooks/useInteractionByKey.ts +0 -354
  215. package/src/runtime-internal/hooks/useInteractionHandle.ts +0 -438
  216. package/src/runtime-internal/hooks/useIsMyTurn.ts +0 -20
  217. package/src/runtime-internal/hooks/useLobby.ts +0 -76
  218. package/src/runtime-internal/hooks/useMe.ts +0 -48
  219. package/src/runtime-internal/hooks/usePlayerInfo.ts +0 -28
  220. package/src/runtime-internal/hooks/usePlayerTurnOrder.ts +0 -23
  221. package/src/runtime-internal/hooks/usePluginRuntime.ts +0 -147
  222. package/src/runtime-internal/hooks/useSeatInbox.ts +0 -61
  223. package/src/runtime-internal/hooks/useSimultaneousPhase.ts +0 -10
  224. package/src/runtime-internal/index.ts +0 -42
  225. package/src/runtime-internal/internal.ts +0 -43
  226. package/src/runtime-internal/plugin-styles.css +0 -250
  227. package/src/runtime-internal/primitives/board.tsx +0 -459
  228. package/src/runtime-internal/primitives/dialog-lifecycle.ts +0 -58
  229. package/src/runtime-internal/primitives/dice.tsx +0 -79
  230. package/src/runtime-internal/primitives/game-ui-provider.tsx +0 -35
  231. package/src/runtime-internal/primitives/game.tsx +0 -387
  232. package/src/runtime-internal/primitives/hand-intent-adapter.ts +0 -147
  233. package/src/runtime-internal/primitives/hand-surface.tsx +0 -594
  234. package/src/runtime-internal/primitives/index.ts +0 -196
  235. package/src/runtime-internal/primitives/interaction-form-binding.tsx +0 -56
  236. package/src/runtime-internal/primitives/interaction-submit.ts +0 -90
  237. package/src/runtime-internal/primitives/interaction.tsx +0 -987
  238. package/src/runtime-internal/primitives/phase.tsx +0 -43
  239. package/src/runtime-internal/primitives/player-roster.tsx +0 -302
  240. package/src/runtime-internal/primitives/primitive-props.tsx +0 -101
  241. package/src/runtime-internal/primitives/prompt.tsx +0 -255
  242. package/src/runtime-internal/primitives/ui.tsx +0 -60
  243. package/src/runtime-internal/primitives/zone.tsx +0 -791
  244. package/src/runtime-internal/reducer.ts +0 -30
  245. package/src/runtime-internal/runtime/createPluginRuntimeAPI.ts +0 -605
  246. package/src/runtime-internal/types/plugin-state.ts +0 -508
  247. package/src/runtime-internal/types/reducer-state.ts +0 -24
  248. package/src/runtime-internal/types/runtime-api.ts +0 -114
  249. package/src/runtime-internal/ui-contract.ts +0 -519
  250. package/src/runtime-internal/utils/card-intent-adapter.ts +0 -546
  251. package/src/runtime-internal/utils/interaction-inputs.ts +0 -492
  252. package/src/runtime-internal/utils/interaction-labels.ts +0 -23
  253. package/src/runtime-internal/utils/interaction-router.ts +0 -273
  254. package/src/runtime-internal/utils/interaction-status.ts +0 -74
  255. package/src/runtime-internal/workspace-contract.ts +0 -1170
  256. package/src/runtime.ts +0 -34
  257. package/src/testing/create-expect-api.ts +0 -352
  258. package/src/testing/create-test-runtime.ts +0 -381
  259. package/src/testing/definitions.ts +0 -127
  260. package/src/testing/index.ts +0 -3
  261. package/src/testing.ts +0 -1
  262. package/src/type-stubs/manifest-contract.d.ts +0 -42
  263. package/src/type-stubs/manifest-contract.js +0 -72
  264. package/src/type-stubs/ui-contract.d.ts +0 -5
  265. package/src/type-stubs/ui-contract.js +0 -1
  266. package/src/types/authoring-card-properties.type-test.ts +0 -266
  267. package/src/types/authoring.ts +0 -1282
  268. package/src/types/cards.ts +0 -19
  269. package/src/types/contracts.ts +0 -1550
  270. package/src/types/generated-helpers.ts +0 -35
  271. package/src/types/index.ts +0 -147
  272. package/src/types/slots.ts +0 -11
  273. package/src/types.ts +0 -1
  274. package/src/ui/components/ActionButton.tsx +0 -97
  275. package/src/ui/components/ActionPanel.tsx +0 -315
  276. package/src/ui/components/Card.tsx +0 -378
  277. package/src/ui/components/CardDragSurface.tsx +0 -1076
  278. package/src/ui/components/ChromeSuppressionContext.tsx +0 -70
  279. package/src/ui/components/CostDisplay.tsx +0 -145
  280. package/src/ui/components/DiceRoller.tsx +0 -581
  281. package/src/ui/components/Drawer.tsx +0 -180
  282. package/src/ui/components/ErrorBoundary.tsx +0 -275
  283. package/src/ui/components/GameEndDisplay.tsx +0 -398
  284. package/src/ui/components/GameSkeleton.tsx +0 -260
  285. package/src/ui/components/Hand.tsx +0 -468
  286. package/src/ui/components/HandDock.tsx +0 -299
  287. package/src/ui/components/HandView.tsx +0 -441
  288. package/src/ui/components/MobileHandTray.tsx +0 -381
  289. package/src/ui/components/MoreActions.tsx +0 -143
  290. package/src/ui/components/PhaseIndicator.tsx +0 -341
  291. package/src/ui/components/PlayArea.tsx +0 -146
  292. package/src/ui/components/PrimaryActionButton.tsx +0 -336
  293. package/src/ui/components/PrimaryButton.tsx +0 -45
  294. package/src/ui/components/ResourceCounter.tsx +0 -270
  295. package/src/ui/components/StagingZone.tsx +0 -134
  296. package/src/ui/components/ThemedButton.tsx +0 -113
  297. package/src/ui/components/Toast.tsx +0 -264
  298. package/src/ui/components/board/HexGrid.tsx +0 -1294
  299. package/src/ui/components/board/NetworkGraph.tsx +0 -476
  300. package/src/ui/components/board/SlotSystem.tsx +0 -388
  301. package/src/ui/components/board/SquareGrid.tsx +0 -1165
  302. package/src/ui/components/board/TrackBoard.tsx +0 -496
  303. package/src/ui/components/board/ZoneMap.tsx +0 -448
  304. package/src/ui/components/board/hex-board-view.ts +0 -123
  305. package/src/ui/components/board/index.ts +0 -142
  306. package/src/ui/components/board/interaction-accessibility.ts +0 -21
  307. package/src/ui/components/board/target-layer.ts +0 -66
  308. package/src/ui/components/card-render-content.type-test.ts +0 -27
  309. package/src/ui/components/hand-layout-math.ts +0 -163
  310. package/src/ui/components/hand-pointer-engine.ts +0 -413
  311. package/src/ui/components/index.ts +0 -245
  312. package/src/ui/components.ts +0 -1
  313. package/src/ui/defaults/components.tsx +0 -106
  314. package/src/ui/defaults/index.ts +0 -8
  315. package/src/ui/defaults.ts +0 -1
  316. package/src/ui/errors/ValidationError.ts +0 -29
  317. package/src/ui/helpers/cards.ts +0 -19
  318. package/src/ui/helpers/track-board.ts +0 -211
  319. package/src/ui/hooks/useBoardTopology.ts +0 -316
  320. package/src/ui/hooks/useCards.ts +0 -10
  321. package/src/ui/hooks/useHandCardPointer.ts +0 -381
  322. package/src/ui/hooks/useHandLayout.ts +0 -378
  323. package/src/ui/hooks/useHandPresentation.ts +0 -121
  324. package/src/ui/hooks/useHexBoard.ts +0 -74
  325. package/src/ui/hooks/useHexGrid.ts +0 -185
  326. package/src/ui/hooks/useIsMobile.ts +0 -35
  327. package/src/ui/hooks/usePanZoom.ts +0 -278
  328. package/src/ui/hooks/useSquareBoard.ts +0 -124
  329. package/src/ui/hooks/useSquareGrid.ts +0 -328
  330. package/src/ui/index.ts +0 -98
  331. package/src/ui/internal/ui/alert.tsx +0 -51
  332. package/src/ui/internal/ui/button.tsx +0 -58
  333. package/src/ui/internal/ui/dialog.tsx +0 -134
  334. package/src/ui/internal/ui/input.tsx +0 -21
  335. package/src/ui/internal/ui/label.tsx +0 -21
  336. package/src/ui/internal/ui/select.tsx +0 -129
  337. package/src/ui/internal/ui/tooltip.tsx +0 -54
  338. package/src/ui/internal/ui/utils.ts +0 -5
  339. package/src/ui/plugin-styles.css +0 -250
  340. package/src/ui/primitives/dialog-lifecycle.ts +0 -58
  341. package/src/ui/primitives/dice.tsx +0 -79
  342. package/src/ui/primitives/primitive-props.tsx +0 -101
  343. package/src/ui/theme/ThemeProvider.tsx +0 -252
  344. package/src/ui/theme/board.ts +0 -61
  345. package/src/ui/theme/css-vars.ts +0 -105
  346. package/src/ui/theme/derive.ts +0 -240
  347. package/src/ui/theme/index.ts +0 -61
  348. package/src/ui/theme/presets/arcade.ts +0 -261
  349. package/src/ui/theme/presets/studio.ts +0 -261
  350. package/src/ui/theme/presets/tabletop.ts +0 -266
  351. package/src/ui/theme/tokens.ts +0 -392
  352. package/src/ui/types/hex-color.ts +0 -20
  353. package/src/ui/types/player-state.ts +0 -463
  354. package/src/ui/types/tiled-board.ts +0 -785
  355. package/src/ui/types/visual-state.ts +0 -137
  356. package/src/ui.ts +0 -1
  357. /package/dist/{chunk-I46YJSOD.js.map → browser-interaction.js.map} +0 -0
  358. /package/dist/{chunk-KAELH4KC.js.map → chunk-3RQEICD3.js.map} +0 -0
  359. /package/dist/{chunk-T52J5RMF.js.map → codegen.js.map} +0 -0
  360. /package/dist/{generated/runtime-api.js.map → reducer-contract.js.map} +0 -0
  361. /package/dist/runtime/{types/runtime-api.js.map → runtime-api.js.map} +0 -0
  362. /package/dist/ui/{types/player-state.js → player-state.js} +0 -0
  363. /package/dist/ui/{types/player-state.js.map → player-state.js.map} +0 -0
@@ -1,341 +0,0 @@
1
- /**
2
- * Surfaces the dominant turn-state question — "is this me?" / "who am I
3
- * waiting for?" — as a single headline, with the phase label demoted to
4
- * secondary copy underneath.
5
- *
6
- * The previous design rendered three peer chips (`Waiting`, `Roll dice`,
7
- * `Player 3`) which fragmented one piece of information across three
8
- * UI atoms. The redesign collapses them into a single status line:
9
- *
10
- * ◐ Waiting for Player 3…
11
- * Roll dice
12
- *
13
- * ● Your turn
14
- * Build, trade, or end your turn.
15
- *
16
- * Both states get a leading status indicator that animates so the eye
17
- * picks up the "live" cue immediately. Animations are skipped when the
18
- * theme reports `motion.reducedMotion === "true"`.
19
- *
20
- * Prop API is unchanged so existing callers (Catan, Things-in-Rings,
21
- * tests) keep working without edits. The `variant` knob still toggles
22
- * surface treatment (`badge` is layout-only, `bar` wraps the headline
23
- * in an inset HUD strip, `minimal` collapses to a single underlined
24
- * label for tight HUDs).
25
- */
26
-
27
- import { motion } from "framer-motion";
28
- import { clsx } from "clsx";
29
- import { useTheme } from "../theme/ThemeProvider.js";
30
- import { surfaceStyle } from "../theme/derive.js";
31
- import type { Theme } from "../theme/tokens.js";
32
-
33
- export interface PhaseIndicatorProps {
34
- currentPhase: string;
35
- phaseLabels?: Record<string, string>;
36
- isMyTurn?: boolean;
37
- activePlayerNames?: string[];
38
- variant?: "badge" | "bar" | "minimal";
39
- className?: string;
40
- }
41
-
42
- export function PhaseIndicator({
43
- currentPhase,
44
- phaseLabels,
45
- isMyTurn,
46
- activePlayerNames,
47
- variant = "badge",
48
- className,
49
- }: PhaseIndicatorProps) {
50
- const theme = useTheme();
51
- const reducedMotion = theme.motion.reducedMotion === "true";
52
-
53
- const label = phaseLabels?.[currentPhase] ?? formatPhase(currentPhase);
54
-
55
- if (variant === "minimal") {
56
- return (
57
- <span
58
- className={className}
59
- style={{
60
- fontFamily: theme.typography.fontFamily.body,
61
- fontSize: theme.typography.fontSize.sm,
62
- fontWeight: theme.typography.fontWeight.bold,
63
- color: theme.semantic.text.muted,
64
- textDecoration: "underline",
65
- textDecorationStyle: "wavy",
66
- textDecorationColor: theme.semantic.border.subtle,
67
- textUnderlineOffset: "4px",
68
- }}
69
- role="status"
70
- aria-label={`Current phase: ${label}`}
71
- >
72
- {label}
73
- </span>
74
- );
75
- }
76
-
77
- // Decide which state we're in. Only one is active at a time so the
78
- // headline is unambiguous.
79
- const state: "your-turn" | "waiting" | "phase-only" =
80
- isMyTurn === true
81
- ? "your-turn"
82
- : isMyTurn === false && activePlayerNames && activePlayerNames.length > 0
83
- ? "waiting"
84
- : "phase-only";
85
-
86
- const containerStyle: React.CSSProperties =
87
- variant === "bar"
88
- ? {
89
- ...surfaceStyle(theme, { tone: "inset", radius: "hud" }),
90
- padding: theme.space[3],
91
- boxShadow: theme.elevation.inset,
92
- fontFamily: theme.typography.fontFamily.body,
93
- }
94
- : { fontFamily: theme.typography.fontFamily.body };
95
-
96
- const headline = renderHeadline({
97
- state,
98
- activePlayerNames,
99
- label,
100
- theme,
101
- reducedMotion,
102
- });
103
- const ariaLabel =
104
- state === "your-turn"
105
- ? `Your turn — ${label}`
106
- : state === "waiting"
107
- ? `Waiting for ${formatPlayerList(activePlayerNames ?? [])} — ${label}`
108
- : label;
109
-
110
- return (
111
- <div
112
- className={clsx("flex items-center gap-3 flex-wrap", className)}
113
- style={containerStyle}
114
- role="status"
115
- aria-live="polite"
116
- aria-atomic="true"
117
- aria-label={ariaLabel}
118
- >
119
- {headline}
120
- </div>
121
- );
122
- }
123
-
124
- function formatPhase(phase: string): string {
125
- const formatted = phase
126
- .replace(/([A-Z])/g, " $1")
127
- .replace(/_/g, " ")
128
- .trim()
129
- .replace(/^\w/, (c) => c.toUpperCase());
130
- return formatted === "Player Turn" ? "Turn" : formatted;
131
- }
132
-
133
- function formatPlayerList(names: readonly string[]): string {
134
- if (names.length === 0) return "";
135
- if (names.length === 1) return names[0]!;
136
- if (names.length === 2) return `${names[0]} and ${names[1]}`;
137
- return `${names.slice(0, -1).join(", ")}, and ${names[names.length - 1]}`;
138
- }
139
-
140
- interface HeadlineArgs {
141
- state: "your-turn" | "waiting" | "phase-only";
142
- activePlayerNames: readonly string[] | undefined;
143
- label: string;
144
- theme: Theme;
145
- reducedMotion: boolean;
146
- }
147
-
148
- function renderHeadline({
149
- state,
150
- activePlayerNames,
151
- label,
152
- theme,
153
- reducedMotion,
154
- }: HeadlineArgs) {
155
- if (state === "phase-only") {
156
- return (
157
- <div style={textBlockStyle(theme)}>
158
- <span style={titleTextStyle(theme)}>{label}</span>
159
- </div>
160
- );
161
- }
162
-
163
- const isYourTurn = state === "your-turn";
164
- const intent = isYourTurn
165
- ? theme.semantic.intent.success
166
- : theme.semantic.intent.info;
167
- const titleText = isYourTurn
168
- ? "Your turn"
169
- : `Waiting for ${formatPlayerList(activePlayerNames ?? [])}…`;
170
-
171
- return (
172
- <motion.div
173
- initial={reducedMotion ? { opacity: 0 } : { opacity: 0, y: -4 }}
174
- animate={reducedMotion ? { opacity: 1 } : { opacity: 1, y: 0 }}
175
- style={{
176
- display: "flex",
177
- alignItems: "center",
178
- gap: theme.space[3],
179
- }}
180
- >
181
- <StatusIndicator
182
- intent={intent}
183
- kind={isYourTurn ? "pulse" : "spinner"}
184
- reducedMotion={reducedMotion}
185
- />
186
- <div style={textBlockStyle(theme)}>
187
- <span style={titleTextStyle(theme)}>{titleText}</span>
188
- <span style={subtitleTextStyle(theme)}>{label}</span>
189
- </div>
190
- </motion.div>
191
- );
192
- }
193
-
194
- function textBlockStyle(theme: Theme): React.CSSProperties {
195
- return {
196
- display: "flex",
197
- flexDirection: "column",
198
- alignItems: "flex-start",
199
- gap: theme.space[0.5],
200
- minWidth: 0,
201
- };
202
- }
203
-
204
- function titleTextStyle(theme: Theme): React.CSSProperties {
205
- return {
206
- fontFamily: theme.typography.fontFamily.body,
207
- fontSize: theme.typography.fontSize.lg,
208
- fontWeight: theme.typography.fontWeight.bold,
209
- letterSpacing: theme.typography.letterSpacing.tight,
210
- lineHeight: theme.typography.lineHeight.tight,
211
- color: theme.semantic.text.primary,
212
- };
213
- }
214
-
215
- function subtitleTextStyle(theme: Theme): React.CSSProperties {
216
- return {
217
- fontFamily: theme.typography.fontFamily.body,
218
- fontSize: theme.typography.fontSize.xs,
219
- fontWeight: theme.typography.fontWeight.medium,
220
- letterSpacing: theme.typography.letterSpacing.caps,
221
- textTransform: "uppercase",
222
- color: theme.semantic.text.muted,
223
- };
224
- }
225
-
226
- interface StatusIndicatorProps {
227
- intent: Theme["semantic"]["intent"]["success"];
228
- kind: "pulse" | "spinner";
229
- reducedMotion: boolean;
230
- }
231
-
232
- /**
233
- * Animated status indicator sized to sit next to a body-font headline.
234
- *
235
- * Kept intentionally chip-less so it shares the chrome strip's
236
- * understated treatment (the rest of the chrome uses bare typography
237
- * and lets intent colour live in chips, dots, and borders — not in
238
- * full-saturation surfaces). The colour comes from one
239
- * {@link Theme}-supplied intent ramp so swapping themes keeps the
240
- * indicator consistent with chips, toasts, and buttons that use the
241
- * same intent.
242
- *
243
- * - `pulse` — soft halo radiating outward from a solid centre dot.
244
- * Used for the player's own active turn.
245
- * - `spinner` — thin partial ring rotating around a soft-filled
246
- * centre. Reads as the standard "in flight / live" affordance.
247
- */
248
- function StatusIndicator({
249
- intent,
250
- kind,
251
- reducedMotion,
252
- }: StatusIndicatorProps) {
253
- const size = 16;
254
-
255
- if (kind === "pulse") {
256
- return (
257
- <span
258
- aria-hidden="true"
259
- style={{
260
- position: "relative",
261
- display: "inline-flex",
262
- alignItems: "center",
263
- justifyContent: "center",
264
- width: size,
265
- height: size,
266
- flexShrink: 0,
267
- }}
268
- >
269
- <motion.span
270
- style={{
271
- position: "absolute",
272
- inset: 2,
273
- borderRadius: "9999px",
274
- background: intent.soft,
275
- }}
276
- animate={
277
- reducedMotion
278
- ? undefined
279
- : { scale: [1, 1.6, 1], opacity: [0.7, 0, 0.7] }
280
- }
281
- transition={{
282
- repeat: reducedMotion ? 0 : Infinity,
283
- duration: 1.6,
284
- ease: "easeOut",
285
- }}
286
- />
287
- <span
288
- style={{
289
- position: "relative",
290
- display: "inline-block",
291
- width: 8,
292
- height: 8,
293
- borderRadius: "9999px",
294
- background: intent.solid,
295
- }}
296
- />
297
- </span>
298
- );
299
- }
300
-
301
- // "spinner" — partial ring rotating around an inset soft fill.
302
- return (
303
- <span
304
- aria-hidden="true"
305
- style={{
306
- position: "relative",
307
- display: "inline-flex",
308
- alignItems: "center",
309
- justifyContent: "center",
310
- width: size,
311
- height: size,
312
- flexShrink: 0,
313
- }}
314
- >
315
- <span
316
- style={{
317
- position: "absolute",
318
- inset: 4,
319
- borderRadius: "9999px",
320
- background: intent.soft,
321
- }}
322
- />
323
- <motion.span
324
- style={{
325
- position: "absolute",
326
- inset: 0,
327
- borderRadius: "9999px",
328
- border: "2px solid transparent",
329
- borderTopColor: intent.solid,
330
- borderRightColor: intent.solid,
331
- }}
332
- animate={reducedMotion ? undefined : { rotate: 360 }}
333
- transition={{
334
- repeat: reducedMotion ? 0 : Infinity,
335
- duration: 1.2,
336
- ease: "linear",
337
- }}
338
- />
339
- </span>
340
- );
341
- }
@@ -1,146 +0,0 @@
1
- /**
2
- * Central game board area for active game components (tricks, played
3
- * cards, zones, etc.).
4
- *
5
- * Visual chrome (frame, empty placeholder, card entrance/exit) is
6
- * sourced from the active {@link useTheme} so the play area re-skins
7
- * with the rest of the shell.
8
- */
9
-
10
- import { motion, AnimatePresence } from "framer-motion";
11
- import { clsx } from "clsx";
12
- import { CardFace, type CardFaceProps, type ViewCard } from "./Card.js";
13
- import { useTheme } from "../theme/ThemeProvider.js";
14
- import { chipStyle } from "../theme/derive.js";
15
-
16
- export interface PlayAreaProps<CardData extends ViewCard = ViewCard> {
17
- cards: readonly CardData[];
18
- filter?: (card: CardData) => boolean;
19
- cardSize?: CardFaceProps["size"];
20
- renderCard?: CardFaceProps<CardData>["renderContent"];
21
- layout?: "grid" | "row";
22
- interactive?: boolean;
23
- onCardClick?: (cardId: string) => void;
24
- "aria-label"?: string;
25
- className?: string;
26
- }
27
-
28
- /**
29
- * @example
30
- * ```tsx
31
- * <PlayArea cards={trickCards} layout="row" renderCard={(card) => <PlayingCard card={card} />} />
32
- * ```
33
- */
34
- export function PlayArea<CardData extends ViewCard = ViewCard>({
35
- cards,
36
- filter,
37
- cardSize = "md",
38
- renderCard,
39
- layout = "row",
40
- interactive = false,
41
- onCardClick,
42
- "aria-label": ariaLabel = "Play area",
43
- className,
44
- }: PlayAreaProps<CardData>) {
45
- const theme = useTheme();
46
- const reducedMotion = theme.motion.reducedMotion === "true";
47
- const visibleCards = filter ? cards.filter(filter) : cards;
48
-
49
- const layoutClasses = {
50
- grid: "grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 gap-3 sm:gap-6",
51
- row: "flex flex-wrap items-center justify-center gap-3 sm:gap-6",
52
- };
53
-
54
- return (
55
- <div
56
- className={clsx(
57
- "relative w-full min-h-[200px] sm:min-h-[300px] p-6 sm:p-8",
58
- className,
59
- )}
60
- style={{
61
- background: theme.semantic.surface.inset,
62
- border: `2px dashed ${theme.semantic.border.default}`,
63
- borderRadius: theme.radius.hud,
64
- fontFamily: theme.typography.fontFamily.body,
65
- color: theme.semantic.text.primary,
66
- }}
67
- role="region"
68
- aria-label={`${ariaLabel} - ${visibleCards.length} item${visibleCards.length !== 1 ? "s" : ""}`}
69
- >
70
- <AnimatePresence mode="popLayout">
71
- {visibleCards.length === 0 ? (
72
- <motion.div
73
- className="flex items-center justify-center h-full absolute inset-0 pointer-events-none"
74
- initial={{ opacity: 0 }}
75
- animate={{ opacity: 1 }}
76
- exit={{ opacity: 0 }}
77
- role="status"
78
- aria-live="polite"
79
- >
80
- <div
81
- style={{
82
- ...chipStyle(theme, { variant: "warning", size: "md" }),
83
- fontSize: theme.typography.fontSize.md,
84
- paddingBlock: theme.space[2],
85
- paddingInline: theme.space[4],
86
- }}
87
- >
88
- No cards in play
89
- </div>
90
- </motion.div>
91
- ) : (
92
- <div className={layoutClasses[layout]}>
93
- {visibleCards.map((card, index) => (
94
- <motion.div
95
- key={card.id}
96
- layout={!reducedMotion}
97
- initial={
98
- reducedMotion
99
- ? { opacity: 0, scale: 1 }
100
- : { opacity: 0, scale: 0.8 }
101
- }
102
- animate={{ opacity: 1, scale: 1 }}
103
- exit={{ opacity: 0, scale: 0.8 }}
104
- transition={{
105
- type: "spring",
106
- stiffness: 260,
107
- damping: 20,
108
- delay: reducedMotion ? 0 : index * 0.05,
109
- }}
110
- >
111
- {interactive && onCardClick ? (
112
- <button
113
- type="button"
114
- aria-label={card.name ?? `Card ${card.id}`}
115
- onClick={() => onCardClick(card.id)}
116
- onKeyDown={(event) => {
117
- if (event.key === "Enter" || event.key === " ") {
118
- event.preventDefault();
119
- onCardClick(card.id);
120
- }
121
- }}
122
- className="border-0 bg-transparent p-0 cursor-pointer focus-visible:outline-none"
123
- style={{ all: "unset", cursor: "pointer" }}
124
- >
125
- <CardFace
126
- card={card}
127
- size={cardSize}
128
- renderContent={renderCard}
129
- />
130
- </button>
131
- ) : (
132
- <CardFace
133
- card={card}
134
- size={cardSize}
135
- renderContent={renderCard}
136
- disabled={!interactive}
137
- />
138
- )}
139
- </motion.div>
140
- ))}
141
- </div>
142
- )}
143
- </AnimatePresence>
144
- </div>
145
- );
146
- }