@ankhorage/zora 21.0.23 → 21.1.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 (554) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.md +6 -2
  3. package/dist/features/authoring/allowedChildren.d.ts +5 -2
  4. package/dist/features/authoring/allowedChildren.d.ts.map +1 -1
  5. package/dist/features/authoring/allowedChildren.js +13 -2
  6. package/dist/features/authoring/allowedChildren.js.map +1 -1
  7. package/dist/features/authoring/componentMeta.d.ts.map +1 -1
  8. package/dist/features/authoring/componentMeta.js +21 -0
  9. package/dist/features/authoring/componentMeta.js.map +1 -1
  10. package/dist/features/authoring/constants.d.ts +3 -0
  11. package/dist/features/authoring/constants.d.ts.map +1 -1
  12. package/dist/features/authoring/constants.js +3 -0
  13. package/dist/features/authoring/constants.js.map +1 -1
  14. package/dist/features/card/cardMeta.d.ts +1 -1
  15. package/dist/features/card/cardMeta.d.ts.map +1 -1
  16. package/dist/features/card/cardMeta.js +7 -2
  17. package/dist/features/card/cardMeta.js.map +1 -1
  18. package/dist/features/chess/adapters/inbound/ChessBoard.d.ts +5 -0
  19. package/dist/features/chess/adapters/inbound/ChessBoard.d.ts.map +1 -0
  20. package/dist/features/chess/adapters/inbound/ChessBoard.js +119 -0
  21. package/dist/features/chess/adapters/inbound/ChessBoard.js.map +1 -0
  22. package/dist/features/chess/adapters/inbound/OpeningBook.d.ts +5 -0
  23. package/dist/features/chess/adapters/inbound/OpeningBook.d.ts.map +1 -0
  24. package/dist/features/chess/adapters/inbound/OpeningBook.js +94 -0
  25. package/dist/features/chess/adapters/inbound/OpeningBook.js.map +1 -0
  26. package/dist/features/chess/meta.d.ts +219 -0
  27. package/dist/features/chess/meta.d.ts.map +1 -0
  28. package/dist/features/chess/meta.js +165 -0
  29. package/dist/features/chess/meta.js.map +1 -0
  30. package/dist/features/chess/public.d.ts +12 -0
  31. package/dist/features/chess/public.d.ts.map +1 -0
  32. package/dist/features/chess/public.js +10 -0
  33. package/dist/features/chess/public.js.map +1 -0
  34. package/dist/features/chess/utils/chessSquares.d.ts +4 -0
  35. package/dist/features/chess/utils/chessSquares.d.ts.map +1 -0
  36. package/dist/features/chess/utils/chessSquares.js +3 -0
  37. package/dist/features/chess/utils/chessSquares.js.map +1 -0
  38. package/dist/features/chess/utils/createBoardSquares.d.ts +4 -0
  39. package/dist/features/chess/utils/createBoardSquares.d.ts.map +1 -0
  40. package/dist/features/chess/utils/createBoardSquares.js +9 -0
  41. package/dist/features/chess/utils/createBoardSquares.js.map +1 -0
  42. package/dist/features/chess/utils/createChessBoardColorScheme.d.ts +35 -0
  43. package/dist/features/chess/utils/createChessBoardColorScheme.d.ts.map +1 -0
  44. package/dist/features/chess/utils/createChessBoardColorScheme.js +26 -0
  45. package/dist/features/chess/utils/createChessBoardColorScheme.js.map +1 -0
  46. package/dist/features/chess/utils/createOpeningBookColorScheme.d.ts +11 -0
  47. package/dist/features/chess/utils/createOpeningBookColorScheme.d.ts.map +1 -0
  48. package/dist/features/chess/utils/createOpeningBookColorScheme.js +21 -0
  49. package/dist/features/chess/utils/createOpeningBookColorScheme.js.map +1 -0
  50. package/dist/features/chess/utils/getSquareFile.d.ts +4 -0
  51. package/dist/features/chess/utils/getSquareFile.d.ts.map +1 -0
  52. package/dist/features/chess/utils/getSquareFile.js +5 -0
  53. package/dist/features/chess/utils/getSquareFile.js.map +1 -0
  54. package/dist/features/chess/utils/getSquareRank.d.ts +4 -0
  55. package/dist/features/chess/utils/getSquareRank.d.ts.map +1 -0
  56. package/dist/features/chess/utils/getSquareRank.js +5 -0
  57. package/dist/features/chess/utils/getSquareRank.js.map +1 -0
  58. package/dist/features/chess/utils/isLightSquare.d.ts +4 -0
  59. package/dist/features/chess/utils/isLightSquare.d.ts.map +1 -0
  60. package/dist/features/chess/utils/isLightSquare.js +6 -0
  61. package/dist/features/chess/utils/isLightSquare.js.map +1 -0
  62. package/dist/features/game/adapters/inbound/Game.d.ts +5 -0
  63. package/dist/features/game/adapters/inbound/Game.d.ts.map +1 -0
  64. package/dist/features/game/adapters/inbound/Game.js +24 -0
  65. package/dist/features/game/adapters/inbound/Game.js.map +1 -0
  66. package/dist/features/game/adapters/inbound/GameEntity.d.ts +5 -0
  67. package/dist/features/game/adapters/inbound/GameEntity.d.ts.map +1 -0
  68. package/dist/features/game/adapters/inbound/GameEntity.js +29 -0
  69. package/dist/features/game/adapters/inbound/GameEntity.js.map +1 -0
  70. package/dist/features/game/adapters/inbound/GameField.d.ts +4 -0
  71. package/dist/features/game/adapters/inbound/GameField.d.ts.map +1 -0
  72. package/dist/features/game/adapters/inbound/GameField.js +32 -0
  73. package/dist/features/game/adapters/inbound/GameField.js.map +1 -0
  74. package/dist/features/game/adapters/inbound/GameInputZone.d.ts +4 -0
  75. package/dist/features/game/adapters/inbound/GameInputZone.d.ts.map +1 -0
  76. package/dist/features/game/adapters/inbound/GameInputZone.js +50 -0
  77. package/dist/features/game/adapters/inbound/GameInputZone.js.map +1 -0
  78. package/dist/features/game/adapters/inbound/GameMeasurementProbe.d.ts +4 -0
  79. package/dist/features/game/adapters/inbound/GameMeasurementProbe.d.ts.map +1 -0
  80. package/dist/features/game/adapters/inbound/GameMeasurementProbe.js +54 -0
  81. package/dist/features/game/adapters/inbound/GameMeasurementProbe.js.map +1 -0
  82. package/dist/features/game/adapters/inbound/GameOverlay.d.ts +4 -0
  83. package/dist/features/game/adapters/inbound/GameOverlay.d.ts.map +1 -0
  84. package/dist/features/game/adapters/inbound/GameOverlay.js +39 -0
  85. package/dist/features/game/adapters/inbound/GameOverlay.js.map +1 -0
  86. package/dist/features/game/adapters/inbound/createGameKeyboardEvent.d.ts +16 -0
  87. package/dist/features/game/adapters/inbound/createGameKeyboardEvent.d.ts.map +1 -0
  88. package/dist/features/game/adapters/inbound/createGameKeyboardEvent.js +16 -0
  89. package/dist/features/game/adapters/inbound/createGameKeyboardEvent.js.map +1 -0
  90. package/dist/features/game/adapters/inbound/createGameMeasurementEvent.d.ts +14 -0
  91. package/dist/features/game/adapters/inbound/createGameMeasurementEvent.d.ts.map +1 -0
  92. package/dist/features/game/adapters/inbound/createGameMeasurementEvent.js +25 -0
  93. package/dist/features/game/adapters/inbound/createGameMeasurementEvent.js.map +1 -0
  94. package/dist/features/game/adapters/inbound/createGamePointerEvent.d.ts +17 -0
  95. package/dist/features/game/adapters/inbound/createGamePointerEvent.d.ts.map +1 -0
  96. package/dist/features/game/adapters/inbound/createGamePointerEvent.js +20 -0
  97. package/dist/features/game/adapters/inbound/createGamePointerEvent.js.map +1 -0
  98. package/dist/features/game/adapters/inbound/measureGameEntity.d.ts +5 -0
  99. package/dist/features/game/adapters/inbound/measureGameEntity.d.ts.map +1 -0
  100. package/dist/features/game/adapters/inbound/measureGameEntity.js +22 -0
  101. package/dist/features/game/adapters/inbound/measureGameEntity.js.map +1 -0
  102. package/dist/features/game/adapters/inbound/useGameInputZoneResponder.d.ts +15 -0
  103. package/dist/features/game/adapters/inbound/useGameInputZoneResponder.d.ts.map +1 -0
  104. package/dist/features/game/adapters/inbound/useGameInputZoneResponder.js +67 -0
  105. package/dist/features/game/adapters/inbound/useGameInputZoneResponder.js.map +1 -0
  106. package/dist/features/game/composition/GameRuntimeContext.d.ts +5 -0
  107. package/dist/features/game/composition/GameRuntimeContext.d.ts.map +1 -0
  108. package/dist/features/game/composition/GameRuntimeContext.js +4 -0
  109. package/dist/features/game/composition/GameRuntimeContext.js.map +1 -0
  110. package/dist/features/game/composition/createGameBindingContext.d.ts +4 -0
  111. package/dist/features/game/composition/createGameBindingContext.d.ts.map +1 -0
  112. package/dist/features/game/composition/createGameBindingContext.js +10 -0
  113. package/dist/features/game/composition/createGameBindingContext.js.map +1 -0
  114. package/dist/features/game/composition/createGameMeasurementRegistry.d.ts +4 -0
  115. package/dist/features/game/composition/createGameMeasurementRegistry.d.ts.map +1 -0
  116. package/dist/features/game/composition/createGameMeasurementRegistry.js +15 -0
  117. package/dist/features/game/composition/createGameMeasurementRegistry.js.map +1 -0
  118. package/dist/features/game/composition/useGameRuntime.d.ts +5 -0
  119. package/dist/features/game/composition/useGameRuntime.d.ts.map +1 -0
  120. package/dist/features/game/composition/useGameRuntime.js +117 -0
  121. package/dist/features/game/composition/useGameRuntime.js.map +1 -0
  122. package/dist/features/game/composition/useGameScheduledEffects.d.ts +17 -0
  123. package/dist/features/game/composition/useGameScheduledEffects.d.ts.map +1 -0
  124. package/dist/features/game/composition/useGameScheduledEffects.js +40 -0
  125. package/dist/features/game/composition/useGameScheduledEffects.js.map +1 -0
  126. package/dist/features/game/meta/gameEntityMeta.d.ts +403 -0
  127. package/dist/features/game/meta/gameEntityMeta.d.ts.map +1 -0
  128. package/dist/features/game/meta/gameEntityMeta.js +224 -0
  129. package/dist/features/game/meta/gameEntityMeta.js.map +1 -0
  130. package/dist/features/game/meta/gameFieldMeta.d.ts +61 -0
  131. package/dist/features/game/meta/gameFieldMeta.d.ts.map +1 -0
  132. package/dist/features/game/meta/gameFieldMeta.js +48 -0
  133. package/dist/features/game/meta/gameFieldMeta.js.map +1 -0
  134. package/dist/features/game/meta/gameInputZoneMeta.d.ts +163 -0
  135. package/dist/features/game/meta/gameInputZoneMeta.d.ts.map +1 -0
  136. package/dist/features/game/meta/gameInputZoneMeta.js +138 -0
  137. package/dist/features/game/meta/gameInputZoneMeta.js.map +1 -0
  138. package/dist/features/game/meta/gameMeasurementProbeMeta.d.ts +112 -0
  139. package/dist/features/game/meta/gameMeasurementProbeMeta.d.ts.map +1 -0
  140. package/dist/features/game/meta/gameMeasurementProbeMeta.js +70 -0
  141. package/dist/features/game/meta/gameMeasurementProbeMeta.js.map +1 -0
  142. package/dist/features/game/meta/gameMeta.d.ts +130 -0
  143. package/dist/features/game/meta/gameMeta.d.ts.map +1 -0
  144. package/dist/features/game/meta/gameMeta.js +113 -0
  145. package/dist/features/game/meta/gameMeta.js.map +1 -0
  146. package/dist/features/game/meta/gameOverlayMeta.d.ts +55 -0
  147. package/dist/features/game/meta/gameOverlayMeta.d.ts.map +1 -0
  148. package/dist/features/game/meta/gameOverlayMeta.js +65 -0
  149. package/dist/features/game/meta/gameOverlayMeta.js.map +1 -0
  150. package/dist/features/game/public.d.ts +8 -0
  151. package/dist/features/game/public.d.ts.map +1 -0
  152. package/dist/features/game/public.js +7 -0
  153. package/dist/features/game/public.js.map +1 -0
  154. package/dist/features/game/utils/clampGamePercentage.d.ts +3 -0
  155. package/dist/features/game/utils/clampGamePercentage.d.ts.map +1 -0
  156. package/dist/features/game/utils/clampGamePercentage.js +5 -0
  157. package/dist/features/game/utils/clampGamePercentage.js.map +1 -0
  158. package/dist/features/game/utils/resolveGameEntityMotionPlan.d.ts +15 -0
  159. package/dist/features/game/utils/resolveGameEntityMotionPlan.d.ts.map +1 -0
  160. package/dist/features/game/utils/resolveGameEntityMotionPlan.js +31 -0
  161. package/dist/features/game/utils/resolveGameEntityMotionPlan.js.map +1 -0
  162. package/dist/features/game/utils/toGamePercentage.d.ts +3 -0
  163. package/dist/features/game/utils/toGamePercentage.d.ts.map +1 -0
  164. package/dist/features/game/utils/toGamePercentage.js +6 -0
  165. package/dist/features/game/utils/toGamePercentage.js.map +1 -0
  166. package/dist/features/game/utils/useAnimatedGameEntityValue.d.ts +5 -0
  167. package/dist/features/game/utils/useAnimatedGameEntityValue.d.ts.map +1 -0
  168. package/dist/features/game/utils/useAnimatedGameEntityValue.js +33 -0
  169. package/dist/features/game/utils/useAnimatedGameEntityValue.js.map +1 -0
  170. package/dist/features/game/utils/useGameEntityAnimatedStyle.d.ts +16 -0
  171. package/dist/features/game/utils/useGameEntityAnimatedStyle.d.ts.map +1 -0
  172. package/dist/features/game/utils/useGameEntityAnimatedStyle.js +52 -0
  173. package/dist/features/game/utils/useGameEntityAnimatedStyle.js.map +1 -0
  174. package/dist/features/game/utils/useGameEntityMeasurement.d.ts +5 -0
  175. package/dist/features/game/utils/useGameEntityMeasurement.d.ts.map +1 -0
  176. package/dist/features/game/utils/useGameEntityMeasurement.js +14 -0
  177. package/dist/features/game/utils/useGameEntityMeasurement.js.map +1 -0
  178. package/dist/features/game/utils/useGameEntityMotionProgress.d.ts +5 -0
  179. package/dist/features/game/utils/useGameEntityMotionProgress.d.ts.map +1 -0
  180. package/dist/features/game/utils/useGameEntityMotionProgress.js +87 -0
  181. package/dist/features/game/utils/useGameEntityMotionProgress.js.map +1 -0
  182. package/dist/features/game/utils/useGameReducedMotion.d.ts +3 -0
  183. package/dist/features/game/utils/useGameReducedMotion.d.ts.map +1 -0
  184. package/dist/features/game/utils/useGameReducedMotion.js +13 -0
  185. package/dist/features/game/utils/useGameReducedMotion.js.map +1 -0
  186. package/dist/features/layout/gridMeta.d.ts +1 -1
  187. package/dist/features/layout/gridMeta.d.ts.map +1 -1
  188. package/dist/features/layout/gridMeta.js +7 -2
  189. package/dist/features/layout/gridMeta.js.map +1 -1
  190. package/dist/features/layout/screenMeta.d.ts +1 -1
  191. package/dist/features/layout/viewMeta.d.ts +1 -1
  192. package/dist/features/layout/viewMeta.d.ts.map +1 -1
  193. package/dist/features/layout/viewMeta.js +6 -2
  194. package/dist/features/layout/viewMeta.js.map +1 -1
  195. package/dist/features/registry/ZORA_COMPONENT_REGISTRY.d.ts.map +1 -1
  196. package/dist/features/registry/ZORA_COMPONENT_REGISTRY.js +16 -0
  197. package/dist/features/registry/ZORA_COMPONENT_REGISTRY.js.map +1 -1
  198. package/dist/features/section/screenSectionMeta.d.ts +1 -1
  199. package/dist/features/tabletop/adapters/inbound/CardBack.d.ts +5 -0
  200. package/dist/features/tabletop/adapters/inbound/CardBack.d.ts.map +1 -0
  201. package/dist/features/tabletop/adapters/inbound/CardBack.js +47 -0
  202. package/dist/features/tabletop/adapters/inbound/CardBack.js.map +1 -0
  203. package/dist/features/tabletop/adapters/inbound/CardHand.d.ts +5 -0
  204. package/dist/features/tabletop/adapters/inbound/CardHand.d.ts.map +1 -0
  205. package/dist/features/tabletop/adapters/inbound/CardHand.js +28 -0
  206. package/dist/features/tabletop/adapters/inbound/CardHand.js.map +1 -0
  207. package/dist/features/tabletop/adapters/inbound/PlayingCard.d.ts +5 -0
  208. package/dist/features/tabletop/adapters/inbound/PlayingCard.d.ts.map +1 -0
  209. package/dist/features/tabletop/adapters/inbound/PlayingCard.js +64 -0
  210. package/dist/features/tabletop/adapters/inbound/PlayingCard.js.map +1 -0
  211. package/dist/features/tabletop/adapters/inbound/PokerTrainingTable.d.ts +5 -0
  212. package/dist/features/tabletop/adapters/inbound/PokerTrainingTable.d.ts.map +1 -0
  213. package/dist/features/tabletop/adapters/inbound/PokerTrainingTable.js +12 -0
  214. package/dist/features/tabletop/adapters/inbound/PokerTrainingTable.js.map +1 -0
  215. package/dist/features/tabletop/adapters/inbound/TabletopTable.d.ts +5 -0
  216. package/dist/features/tabletop/adapters/inbound/TabletopTable.d.ts.map +1 -0
  217. package/dist/features/tabletop/adapters/inbound/TabletopTable.js +206 -0
  218. package/dist/features/tabletop/adapters/inbound/TabletopTable.js.map +1 -0
  219. package/dist/features/tabletop/meta.d.ts +353 -0
  220. package/dist/features/tabletop/meta.d.ts.map +1 -0
  221. package/dist/features/tabletop/meta.js +252 -0
  222. package/dist/features/tabletop/meta.js.map +1 -0
  223. package/dist/features/tabletop/public.d.ts +10 -0
  224. package/dist/features/tabletop/public.d.ts.map +1 -0
  225. package/dist/features/tabletop/public.js +9 -0
  226. package/dist/features/tabletop/public.js.map +1 -0
  227. package/dist/features/tabletop/utils/createPokerTrainingTableState.d.ts +13 -0
  228. package/dist/features/tabletop/utils/createPokerTrainingTableState.d.ts.map +1 -0
  229. package/dist/features/tabletop/utils/createPokerTrainingTableState.js +112 -0
  230. package/dist/features/tabletop/utils/createPokerTrainingTableState.js.map +1 -0
  231. package/dist/features/tabletop/utils/createTabletopColorScheme.d.ts +36 -0
  232. package/dist/features/tabletop/utils/createTabletopColorScheme.d.ts.map +1 -0
  233. package/dist/features/tabletop/utils/createTabletopColorScheme.js +144 -0
  234. package/dist/features/tabletop/utils/createTabletopColorScheme.js.map +1 -0
  235. package/dist/features/tabletop/utils/createTabletopGameSeats.d.ts +13 -0
  236. package/dist/features/tabletop/utils/createTabletopGameSeats.d.ts.map +1 -0
  237. package/dist/features/tabletop/utils/createTabletopGameSeats.js +22 -0
  238. package/dist/features/tabletop/utils/createTabletopGameSeats.js.map +1 -0
  239. package/dist/features/tabletop/utils/getPlayingCardLabel.d.ts +4 -0
  240. package/dist/features/tabletop/utils/getPlayingCardLabel.d.ts.map +1 -0
  241. package/dist/features/tabletop/utils/getPlayingCardLabel.js +6 -0
  242. package/dist/features/tabletop/utils/getPlayingCardLabel.js.map +1 -0
  243. package/dist/features/tabletop/utils/getTabletopCardDimensions.d.ts +12 -0
  244. package/dist/features/tabletop/utils/getTabletopCardDimensions.d.ts.map +1 -0
  245. package/dist/features/tabletop/utils/getTabletopCardDimensions.js +35 -0
  246. package/dist/features/tabletop/utils/getTabletopCardDimensions.js.map +1 -0
  247. package/dist/features/tabletop/utils/getTabletopSeatPosition.d.ts +9 -0
  248. package/dist/features/tabletop/utils/getTabletopSeatPosition.d.ts.map +1 -0
  249. package/dist/features/tabletop/utils/getTabletopSeatPosition.js +88 -0
  250. package/dist/features/tabletop/utils/getTabletopSeatPosition.js.map +1 -0
  251. package/dist/index.d.ts +8 -0
  252. package/dist/index.d.ts.map +1 -1
  253. package/dist/index.js +4 -0
  254. package/dist/index.js.map +1 -1
  255. package/dist/types/chess.d.ts +83 -0
  256. package/dist/types/chess.d.ts.map +1 -0
  257. package/dist/types/chess.js +2 -0
  258. package/dist/types/chess.js.map +1 -0
  259. package/dist/types/gamePresentation.d.ts +94 -0
  260. package/dist/types/gamePresentation.d.ts.map +1 -0
  261. package/dist/types/gamePresentation.js +2 -0
  262. package/dist/types/gamePresentation.js.map +1 -0
  263. package/dist/types/gameRuntime.d.ts +29 -0
  264. package/dist/types/gameRuntime.d.ts.map +1 -0
  265. package/dist/types/gameRuntime.js +2 -0
  266. package/dist/types/gameRuntime.js.map +1 -0
  267. package/dist/types/tabletop.d.ts +129 -0
  268. package/dist/types/tabletop.d.ts.map +1 -0
  269. package/dist/types/tabletop.js +2 -0
  270. package/dist/types/tabletop.js.map +1 -0
  271. package/package.json +13 -11
  272. package/src/features/authoring/allowedChildren.ts +15 -2
  273. package/src/features/authoring/componentMeta.test.ts +93 -0
  274. package/src/features/authoring/componentMeta.ts +27 -0
  275. package/src/features/authoring/constants.ts +3 -0
  276. package/src/features/card/cardMeta.ts +12 -2
  277. package/src/features/chess/adapters/inbound/ChessBoard.tsx +169 -0
  278. package/src/features/chess/adapters/inbound/OpeningBook.tsx +131 -0
  279. package/src/features/chess/meta.ts +168 -0
  280. package/src/features/chess/public.test.tsx +165 -0
  281. package/src/features/chess/public.ts +27 -0
  282. package/src/features/chess/utils/chessSquares.ts +6 -0
  283. package/src/features/chess/utils/createBoardSquares.ts +13 -0
  284. package/src/features/chess/utils/createChessBoardColorScheme.ts +55 -0
  285. package/src/features/chess/utils/createOpeningBookColorScheme.ts +26 -0
  286. package/src/features/chess/utils/getSquareFile.ts +6 -0
  287. package/src/features/chess/utils/getSquareRank.ts +6 -0
  288. package/src/features/chess/utils/isLightSquare.ts +8 -0
  289. package/src/features/chessTabletopOwnership.test.ts +71 -0
  290. package/src/features/game/adapters/inbound/Game.tsx +43 -0
  291. package/src/features/game/adapters/inbound/GameEntity.tsx +44 -0
  292. package/src/features/game/adapters/inbound/GameField.tsx +52 -0
  293. package/src/features/game/adapters/inbound/GameInputZone.tsx +99 -0
  294. package/src/features/game/adapters/inbound/GameMeasurementProbe.tsx +83 -0
  295. package/src/features/game/adapters/inbound/GameOverlay.tsx +58 -0
  296. package/src/features/game/adapters/inbound/createGameKeyboardEvent.test.ts +51 -0
  297. package/src/features/game/adapters/inbound/createGameKeyboardEvent.ts +33 -0
  298. package/src/features/game/adapters/inbound/createGameMeasurementEvent.test.ts +56 -0
  299. package/src/features/game/adapters/inbound/createGameMeasurementEvent.ts +38 -0
  300. package/src/features/game/adapters/inbound/createGamePointerEvent.test.ts +56 -0
  301. package/src/features/game/adapters/inbound/createGamePointerEvent.ts +39 -0
  302. package/src/features/game/adapters/inbound/measureGameEntity.ts +28 -0
  303. package/src/features/game/adapters/inbound/useGameInputZoneResponder.ts +85 -0
  304. package/src/features/game/composition/GameRuntimeContext.ts +6 -0
  305. package/src/features/game/composition/createGameBindingContext.test.ts +66 -0
  306. package/src/features/game/composition/createGameBindingContext.ts +11 -0
  307. package/src/features/game/composition/createGameMeasurementRegistry.test.ts +35 -0
  308. package/src/features/game/composition/createGameMeasurementRegistry.ts +16 -0
  309. package/src/features/game/composition/useGameRuntime.test.tsx +173 -0
  310. package/src/features/game/composition/useGameRuntime.ts +200 -0
  311. package/src/features/game/composition/useGameScheduledEffects.ts +85 -0
  312. package/src/features/game/meta/gameEntityMeta.ts +226 -0
  313. package/src/features/game/meta/gameFieldMeta.ts +49 -0
  314. package/src/features/game/meta/gameInputZoneMeta.ts +140 -0
  315. package/src/features/game/meta/gameMeasurementProbeMeta.ts +72 -0
  316. package/src/features/game/meta/gameMeta.ts +115 -0
  317. package/src/features/game/meta/gameOverlayMeta.ts +66 -0
  318. package/src/features/game/public.test.tsx +64 -0
  319. package/src/features/game/public.ts +19 -0
  320. package/src/features/game/utils/clampGamePercentage.ts +4 -0
  321. package/src/features/game/utils/resolveGameEntityMotionPlan.test.ts +63 -0
  322. package/src/features/game/utils/resolveGameEntityMotionPlan.ts +53 -0
  323. package/src/features/game/utils/toGamePercentage.ts +6 -0
  324. package/src/features/game/utils/useAnimatedGameEntityValue.ts +41 -0
  325. package/src/features/game/utils/useGameEntityAnimatedStyle.ts +87 -0
  326. package/src/features/game/utils/useGameEntityMeasurement.ts +19 -0
  327. package/src/features/game/utils/useGameEntityMotionProgress.ts +114 -0
  328. package/src/features/game/utils/useGameReducedMotion.ts +15 -0
  329. package/src/features/layout/gridMeta.ts +12 -2
  330. package/src/features/layout/viewMeta.ts +10 -2
  331. package/src/features/registry/ZORA_COMPONENT_REGISTRY.ts +29 -0
  332. package/src/features/tabletop/adapters/inbound/CardBack.tsx +70 -0
  333. package/src/features/tabletop/adapters/inbound/CardHand.tsx +61 -0
  334. package/src/features/tabletop/adapters/inbound/PlayingCard.tsx +95 -0
  335. package/src/features/tabletop/adapters/inbound/PokerTrainingTable.tsx +34 -0
  336. package/src/features/tabletop/adapters/inbound/TabletopTable.tsx +264 -0
  337. package/src/features/tabletop/meta.ts +254 -0
  338. package/src/features/tabletop/public.test.tsx +127 -0
  339. package/src/features/tabletop/public.ts +32 -0
  340. package/src/features/tabletop/utils/createPokerTrainingTableState.ts +152 -0
  341. package/src/features/tabletop/utils/createTabletopColorScheme.ts +232 -0
  342. package/src/features/tabletop/utils/createTabletopGameSeats.ts +31 -0
  343. package/src/features/tabletop/utils/getPlayingCardLabel.ts +8 -0
  344. package/src/features/tabletop/utils/getTabletopCardDimensions.ts +45 -0
  345. package/src/features/tabletop/utils/getTabletopSeatPosition.ts +100 -0
  346. package/src/index.ts +83 -0
  347. package/src/types/chess.ts +95 -0
  348. package/src/types/gamePresentation.ts +103 -0
  349. package/src/types/gameRuntime.ts +34 -0
  350. package/src/types/tabletop.ts +131 -0
  351. package/web-dist/chunks/{Accordion-paha5aje.js → Accordion-1cgz6f8t.js} +2 -2
  352. package/web-dist/chunks/{Accordion-fjnck2tg.js → Accordion-46jsv73s.js} +6 -6
  353. package/web-dist/chunks/{Accordion-q7c1ryf2.js → Accordion-4aeg9thd.js} +4 -4
  354. package/web-dist/chunks/{Accordion-xshn7k8f.js → Accordion-4p710d7k.js} +4 -4
  355. package/web-dist/chunks/{Accordion-06588rzn.js → Accordion-57akecv2.js} +1 -1
  356. package/web-dist/chunks/Accordion-57mn1j9e.js +830 -0
  357. package/web-dist/chunks/{Accordion-qpwhmqzd.js → Accordion-6aa1argz.js} +13 -13
  358. package/web-dist/chunks/{Accordion-v6ykq9hv.js → Accordion-77j966qb.js} +10 -10
  359. package/web-dist/chunks/{Accordion-49gf1zb8.js → Accordion-7hn324r1.js} +90 -60
  360. package/web-dist/chunks/{Accordion-7ja4mtbz.js → Accordion-7zfskq1s.js} +1 -1
  361. package/web-dist/chunks/Accordion-86z2tvvz.js +321 -0
  362. package/web-dist/chunks/Accordion-8pke1r50.js +1559 -0
  363. package/web-dist/chunks/{Accordion-395r3wra.js → Accordion-8t3hyjre.js} +2 -2
  364. package/web-dist/chunks/{Accordion-s42wwh6m.js → Accordion-94y2x5br.js} +6 -6
  365. package/web-dist/chunks/{Accordion-jzbq36ec.js → Accordion-axewg096.js} +8 -8
  366. package/web-dist/chunks/{Accordion-fmxygyb6.js → Accordion-be000xf6.js} +4 -4
  367. package/web-dist/chunks/{Accordion-0jkm3y3w.js → Accordion-bsy1jrak.js} +1 -1
  368. package/web-dist/chunks/{Accordion-pkqj4g3r.js → Accordion-ctd0h4r8.js} +5 -5
  369. package/web-dist/chunks/{Accordion-ftjkdjqs.js → Accordion-dm99cvz1.js} +3 -3
  370. package/web-dist/chunks/{Accordion-h95wvyn5.js → Accordion-egkpe4d2.js} +2 -2
  371. package/web-dist/chunks/{Accordion-1pp37dtg.js → Accordion-ej3ggc77.js} +4 -4
  372. package/web-dist/chunks/{Accordion-31aeqxak.js → Accordion-eknpf4ac.js} +3 -3
  373. package/web-dist/chunks/{Accordion-f5swy5bs.js → Accordion-epgj2djr.js} +1 -1
  374. package/web-dist/chunks/{Accordion-crx58d5n.js → Accordion-er294z8s.js} +2 -2
  375. package/web-dist/chunks/{Accordion-8kgtg62g.js → Accordion-et2acvzj.js} +6 -6
  376. package/web-dist/chunks/{Accordion-cscmtcn8.js → Accordion-ew71mmkm.js} +1 -1
  377. package/web-dist/chunks/{Accordion-hz4xaqjf.js → Accordion-f77vravp.js} +9 -9
  378. package/web-dist/chunks/{Accordion-ars389m1.js → Accordion-gdxed3b8.js} +3 -3
  379. package/web-dist/chunks/{Accordion-f1h2f05v.js → Accordion-j3fs0yak.js} +5 -5
  380. package/web-dist/chunks/{Accordion-rrpej6sv.js → Accordion-ja4p3a9f.js} +7 -7
  381. package/web-dist/chunks/{Accordion-grfbz6f2.js → Accordion-k3bc4kad.js} +1 -1
  382. package/web-dist/chunks/{Accordion-4a6wj3ez.js → Accordion-kw4dssbm.js} +9 -9
  383. package/web-dist/chunks/{Accordion-x0j8b2by.js → Accordion-m267wpc1.js} +5 -5
  384. package/web-dist/chunks/{Accordion-gbba10rg.js → Accordion-mt5a3fhc.js} +6 -6
  385. package/web-dist/chunks/{Accordion-far6szrp.js → Accordion-nc8fk7hn.js} +5 -5
  386. package/web-dist/chunks/{Accordion-ch67q4t0.js → Accordion-nzqx7f8a.js} +4 -4
  387. package/web-dist/chunks/{Accordion-33rd76r7.js → Accordion-ppv52ctr.js} +8 -8
  388. package/web-dist/chunks/{Accordion-f05a7r28.js → Accordion-pssgp0pq.js} +5 -5
  389. package/web-dist/chunks/{Accordion-1vewf8aa.js → Accordion-st01gxy2.js} +2 -2
  390. package/web-dist/chunks/{Accordion-t3p4ykg7.js → Accordion-szeexyec.js} +8 -8
  391. package/web-dist/chunks/{Accordion-t6sdgmbz.js → Accordion-vq462y0x.js} +1 -1
  392. package/web-dist/chunks/{Accordion-2dws3778.js → Accordion-vr8des0w.js} +4 -4
  393. package/web-dist/chunks/{Accordion-tx78txec.js → Accordion-w3c6g1jx.js} +5 -5
  394. package/web-dist/chunks/{Accordion-0psdn97s.js → Accordion-w6n8e1ff.js} +1 -1
  395. package/web-dist/chunks/{Accordion-sz21xsf4.js → Accordion-wvphg9x4.js} +1 -1
  396. package/web-dist/chunks/{Accordion-3404tth9.js → Accordion-x30jrtfk.js} +7 -7
  397. package/web-dist/chunks/{Accordion-jh7nxehr.js → Accordion-x5ny2aax.js} +1 -1
  398. package/web-dist/chunks/{Accordion-96cqeekv.js → Accordion-ye97yam9.js} +5 -5
  399. package/web-dist/chunks/{Accordion-hxfa71g9.js → Accordion-yjrr96tn.js} +7 -7
  400. package/web-dist/chunks/{Accordion-r4c9k9y7.js → Accordion-z3s5pqdw.js} +2 -2
  401. package/web-dist/components/accordion/Accordion.js +12 -12
  402. package/web-dist/components/accordion-item/AccordionItem.js +12 -12
  403. package/web-dist/components/activity-indicator/ActivityIndicator.js +3 -3
  404. package/web-dist/components/app-bar/AppBar.js +19 -19
  405. package/web-dist/components/app-shell/AppShell.js +6 -6
  406. package/web-dist/components/avatar/Avatar.js +12 -12
  407. package/web-dist/components/avatar-group/AvatarGroup.js +12 -12
  408. package/web-dist/components/badge/Badge.js +7 -7
  409. package/web-dist/components/barcode-scanner-view/BarcodeScannerView.js +20 -20
  410. package/web-dist/components/bottom-sheet/BottomSheet.js +8 -8
  411. package/web-dist/components/bottom-sheet-flat-list/BottomSheetFlatList.js +8 -8
  412. package/web-dist/components/bottom-sheet-scroll-view/BottomSheetScrollView.js +8 -8
  413. package/web-dist/components/bottom-sheet-section-list/BottomSheetSectionList.js +8 -8
  414. package/web-dist/components/bottom-sheet-view/BottomSheetView.js +8 -8
  415. package/web-dist/components/bottom-sheet-virtualized-list/BottomSheetVirtualizedList.js +8 -8
  416. package/web-dist/components/breadcrumbs/Breadcrumbs.js +15 -15
  417. package/web-dist/components/button/Button.js +12 -12
  418. package/web-dist/components/button-group/ButtonGroup.js +12 -12
  419. package/web-dist/components/camera-permission-view/CameraPermissionView.js +20 -20
  420. package/web-dist/components/card/Card.js +19 -19
  421. package/web-dist/components/card-back/CardBack.d.ts +7 -0
  422. package/web-dist/components/card-back/CardBack.js +19 -0
  423. package/web-dist/components/card-back/index.d.ts +1 -0
  424. package/web-dist/components/card-back/index.js +2 -0
  425. package/web-dist/components/card-hand/CardHand.d.ts +7 -0
  426. package/web-dist/components/card-hand/CardHand.js +19 -0
  427. package/web-dist/components/card-hand/index.d.ts +1 -0
  428. package/web-dist/components/card-hand/index.js +2 -0
  429. package/web-dist/components/chat-list-item/ChatListItem.js +16 -16
  430. package/web-dist/components/checkbox/Checkbox.js +12 -12
  431. package/web-dist/components/checkbox-group/CheckboxGroup.js +12 -12
  432. package/web-dist/components/chess-board/ChessBoard.d.ts +4 -0
  433. package/web-dist/components/chess-board/ChessBoard.js +13 -0
  434. package/web-dist/components/chess-board/index.d.ts +1 -0
  435. package/web-dist/components/chess-board/index.js +2 -0
  436. package/web-dist/components/chip/Chip.js +13 -13
  437. package/web-dist/components/chip-group/ChipGroup.js +13 -13
  438. package/web-dist/components/collection-editor/CollectionEditor.js +19 -19
  439. package/web-dist/components/content-rail/ContentRail.js +13 -13
  440. package/web-dist/components/data-table/DataTable.js +26 -26
  441. package/web-dist/components/date-picker/DatePicker.js +17 -17
  442. package/web-dist/components/dialog/Dialog.js +12 -12
  443. package/web-dist/components/divider/Divider.js +6 -6
  444. package/web-dist/components/empty-state/EmptyState.js +20 -20
  445. package/web-dist/components/field/Field.js +12 -12
  446. package/web-dist/components/flat-list/FlatList.js +13 -13
  447. package/web-dist/components/forgot-password-form/ForgotPasswordForm.js +18 -18
  448. package/web-dist/components/form/Form.js +16 -16
  449. package/web-dist/components/form-actions/FormActions.js +16 -16
  450. package/web-dist/components/form-error/FormError.js +16 -16
  451. package/web-dist/components/game/Game.d.ts +8 -0
  452. package/web-dist/components/game/Game.js +25 -0
  453. package/web-dist/components/game/index.d.ts +1 -0
  454. package/web-dist/components/game/index.js +2 -0
  455. package/web-dist/components/game-entity/GameEntity.d.ts +8 -0
  456. package/web-dist/components/game-entity/GameEntity.js +25 -0
  457. package/web-dist/components/game-entity/index.d.ts +1 -0
  458. package/web-dist/components/game-entity/index.js +2 -0
  459. package/web-dist/components/game-field/GameField.d.ts +8 -0
  460. package/web-dist/components/game-field/GameField.js +25 -0
  461. package/web-dist/components/game-field/index.d.ts +1 -0
  462. package/web-dist/components/game-field/index.js +2 -0
  463. package/web-dist/components/game-input-zone/GameInputZone.d.ts +8 -0
  464. package/web-dist/components/game-input-zone/GameInputZone.js +25 -0
  465. package/web-dist/components/game-input-zone/index.d.ts +1 -0
  466. package/web-dist/components/game-input-zone/index.js +2 -0
  467. package/web-dist/components/game-measurement-probe/GameMeasurementProbe.d.ts +8 -0
  468. package/web-dist/components/game-measurement-probe/GameMeasurementProbe.js +25 -0
  469. package/web-dist/components/game-measurement-probe/index.d.ts +1 -0
  470. package/web-dist/components/game-measurement-probe/index.js +2 -0
  471. package/web-dist/components/game-overlay/GameOverlay.d.ts +8 -0
  472. package/web-dist/components/game-overlay/GameOverlay.js +25 -0
  473. package/web-dist/components/game-overlay/index.d.ts +1 -0
  474. package/web-dist/components/game-overlay/index.js +2 -0
  475. package/web-dist/components/gradient/Gradient.js +7 -7
  476. package/web-dist/components/gradient-renderer-provider/GradientRendererProvider.js +7 -7
  477. package/web-dist/components/grid/Grid.js +6 -6
  478. package/web-dist/components/heading/Heading.js +6 -6
  479. package/web-dist/components/hero/Hero.js +19 -19
  480. package/web-dist/components/icon/Icon.js +4 -4
  481. package/web-dist/components/icon-button/IconButton.js +12 -12
  482. package/web-dist/components/image/Image.js +10 -10
  483. package/web-dist/components/keyboard-avoiding-view/KeyboardAvoidingView.js +2 -2
  484. package/web-dist/components/list/List.js +13 -13
  485. package/web-dist/components/list-item/ListItem.js +13 -13
  486. package/web-dist/components/list-section/ListSection.js +13 -13
  487. package/web-dist/components/media-card/MediaCard.js +19 -19
  488. package/web-dist/components/message-bubble/MessageBubble.js +16 -16
  489. package/web-dist/components/metric-card/MetricCard.js +19 -19
  490. package/web-dist/components/missing-element/MissingElement.js +11 -11
  491. package/web-dist/components/o-auth-provider-button/OAuthProviderButton.js +18 -18
  492. package/web-dist/components/o-auth-provider-list/OAuthProviderList.js +18 -18
  493. package/web-dist/components/opening-book/OpeningBook.d.ts +4 -0
  494. package/web-dist/components/opening-book/OpeningBook.js +13 -0
  495. package/web-dist/components/opening-book/index.d.ts +1 -0
  496. package/web-dist/components/opening-book/index.js +2 -0
  497. package/web-dist/components/otp-form/OtpForm.js +18 -18
  498. package/web-dist/components/pagination/Pagination.js +13 -13
  499. package/web-dist/components/palette-item/PaletteItem.js +19 -19
  500. package/web-dist/components/playing-card/PlayingCard.d.ts +7 -0
  501. package/web-dist/components/playing-card/PlayingCard.js +19 -0
  502. package/web-dist/components/playing-card/index.d.ts +1 -0
  503. package/web-dist/components/playing-card/index.js +2 -0
  504. package/web-dist/components/poker-training-table/PokerTrainingTable.d.ts +7 -0
  505. package/web-dist/components/poker-training-table/PokerTrainingTable.js +19 -0
  506. package/web-dist/components/poker-training-table/index.d.ts +1 -0
  507. package/web-dist/components/poker-training-table/index.js +2 -0
  508. package/web-dist/components/popover-menu/PopoverMenu.js +14 -14
  509. package/web-dist/components/post-card/PostCard.js +19 -19
  510. package/web-dist/components/product-card/ProductCard.js +19 -19
  511. package/web-dist/components/progress/Progress.js +10 -10
  512. package/web-dist/components/progress-ring/ProgressRing.js +10 -10
  513. package/web-dist/components/radio/Radio.js +14 -14
  514. package/web-dist/components/radio-group/RadioGroup.js +14 -14
  515. package/web-dist/components/rating/Rating.js +9 -9
  516. package/web-dist/components/reader-surface/ReaderSurface.js +21 -21
  517. package/web-dist/components/scan-overlay/ScanOverlay.js +20 -20
  518. package/web-dist/components/screen/Screen.js +6 -6
  519. package/web-dist/components/screen-section/ScreenSection.js +10 -10
  520. package/web-dist/components/scroll-view/ScrollView.js +6 -6
  521. package/web-dist/components/search-input/SearchInput.js +13 -13
  522. package/web-dist/components/section-header/SectionHeader.js +10 -10
  523. package/web-dist/components/section-list/SectionList.js +13 -13
  524. package/web-dist/components/select/Select.js +16 -16
  525. package/web-dist/components/selectable-item/SelectableItem.js +5 -5
  526. package/web-dist/components/selection-provider/SelectionProvider.js +5 -5
  527. package/web-dist/components/sign-in-form/SignInForm.js +18 -18
  528. package/web-dist/components/sign-up-form/SignUpForm.js +18 -18
  529. package/web-dist/components/skeleton/Skeleton.js +22 -22
  530. package/web-dist/components/skeleton-card/SkeletonCard.js +22 -22
  531. package/web-dist/components/skeleton-list/SkeletonList.js +22 -22
  532. package/web-dist/components/skeleton-text/SkeletonText.js +22 -22
  533. package/web-dist/components/surface/Surface.js +7 -7
  534. package/web-dist/components/switch/Switch.js +7 -7
  535. package/web-dist/components/tab/Tab.js +7 -7
  536. package/web-dist/components/tab-list/TabList.js +7 -7
  537. package/web-dist/components/tab-panel/TabPanel.js +7 -7
  538. package/web-dist/components/tabletop-table/TabletopTable.d.ts +7 -0
  539. package/web-dist/components/tabletop-table/TabletopTable.js +19 -0
  540. package/web-dist/components/tabletop-table/index.d.ts +1 -0
  541. package/web-dist/components/tabletop-table/index.js +2 -0
  542. package/web-dist/components/tabs/Tabs.js +7 -7
  543. package/web-dist/components/text/Text.js +6 -6
  544. package/web-dist/components/text-input/TextInput.js +13 -13
  545. package/web-dist/components/time-picker/TimePicker.js +17 -17
  546. package/web-dist/components/timeline/Timeline.js +11 -11
  547. package/web-dist/components/toast/Toast.js +9 -9
  548. package/web-dist/components/toast-provider/ToastProvider.js +9 -9
  549. package/web-dist/components/toolbar/Toolbar.js +19 -19
  550. package/web-dist/components/tree-item/TreeItem.js +16 -16
  551. package/web-dist/components/uploader/Uploader.js +22 -22
  552. package/web-dist/components/view/View.js +6 -6
  553. package/web-dist/manifest.json +1648 -1377
  554. package/web-dist/runtime/ZoraProvider.js +8 -8
@@ -0,0 +1,232 @@
1
+ import {
2
+ getReadableForeground,
3
+ parseHexColor as parseCanonicalHexColor,
4
+ } from '@ankhorage/color-theory';
5
+
6
+ import type { TabletopColorOverrides, TabletopColorScheme } from '../../../types/tabletop';
7
+
8
+ interface TabletopColorThemeShape {
9
+ semantics: {
10
+ action: {
11
+ primary: {
12
+ base: string;
13
+ softBg: string;
14
+ };
15
+ };
16
+ content: {
17
+ default: string;
18
+ muted: string;
19
+ };
20
+ neutral: {
21
+ border: string;
22
+ divider: string;
23
+ surface: string;
24
+ surfaceHover: string;
25
+ };
26
+ warning: {
27
+ base: string;
28
+ softBg: string;
29
+ };
30
+ };
31
+ }
32
+
33
+ interface RgbColor {
34
+ readonly red: number;
35
+ readonly green: number;
36
+ readonly blue: number;
37
+ }
38
+
39
+ const MINIMUM_READABLE_CONTRAST = 4.5;
40
+
41
+ /***
42
+ * Creates the theme-derived color palette used by tabletop primitives.
43
+ *
44
+ * Use `createTabletopColorScheme` when custom components need to align with the
45
+ * same card, table, seat, token, and contrast-aware foreground colors as the
46
+ * built-in tabletop components.
47
+ *
48
+ */
49
+ export function createTabletopColorScheme(
50
+ theme: TabletopColorThemeShape,
51
+ overrides: TabletopColorOverrides = {},
52
+ ): TabletopColorScheme {
53
+ const cardSurface = overrides.cardSurface ?? theme.semantics.neutral.surface;
54
+ const seatSurface = overrides.seatSurface ?? theme.semantics.neutral.surface;
55
+ const tableFelt = overrides.tableFelt ?? theme.semantics.action.primary.softBg;
56
+ const tokenSurface = overrides.tokenSurface ?? theme.semantics.warning.softBg;
57
+
58
+ const cardText =
59
+ overrides.cardText ??
60
+ resolveReadableTextColor(
61
+ cardSurface,
62
+ theme.semantics.content.default,
63
+ theme.semantics.content.muted,
64
+ );
65
+ const seatText =
66
+ overrides.seatText ??
67
+ resolveReadableTextColor(
68
+ seatSurface,
69
+ theme.semantics.content.default,
70
+ theme.semantics.content.muted,
71
+ );
72
+ const tableText =
73
+ overrides.tableText ??
74
+ resolveReadableTextColor(
75
+ tableFelt,
76
+ theme.semantics.content.default,
77
+ theme.semantics.content.muted,
78
+ );
79
+ const tokenText =
80
+ overrides.tokenText ??
81
+ resolveReadableTextColor(
82
+ tokenSurface,
83
+ theme.semantics.content.default,
84
+ theme.semantics.content.muted,
85
+ );
86
+
87
+ return {
88
+ cardBack: overrides.cardBack ?? theme.semantics.warning.base,
89
+ cardBackBorder: overrides.cardBackBorder ?? theme.semantics.neutral.border,
90
+ cardBorder: overrides.cardBorder ?? theme.semantics.neutral.border,
91
+ cardSurface,
92
+ cardText,
93
+ mutedText:
94
+ overrides.mutedText ??
95
+ resolveReadableTextColor(cardSurface, theme.semantics.content.muted, cardText),
96
+ redSuitText:
97
+ overrides.redSuitText ??
98
+ resolveReadableTextColor(cardSurface, theme.semantics.warning.base, cardText),
99
+ seatBorder: overrides.seatBorder ?? theme.semantics.neutral.divider,
100
+ seatMutedText:
101
+ overrides.seatMutedText ??
102
+ resolveReadableTextColor(seatSurface, theme.semantics.content.muted, seatText),
103
+ seatSelectedBorder: overrides.seatSelectedBorder ?? theme.semantics.action.primary.base,
104
+ seatSurface,
105
+ seatText,
106
+ tableBorder: overrides.tableBorder ?? theme.semantics.warning.base,
107
+ tableFelt,
108
+ tableInnerBorder: overrides.tableInnerBorder ?? theme.semantics.neutral.divider,
109
+ tableMutedText:
110
+ overrides.tableMutedText ??
111
+ resolveReadableTextColor(tableFelt, theme.semantics.content.muted, tableText),
112
+ tableText,
113
+ tokenSurface,
114
+ tokenText,
115
+ };
116
+ }
117
+
118
+ /*** Chooses the most legible supplied foreground for a themed surface. */
119
+ function resolveReadableTextColor(background: string, preferred: string, fallback: string): string {
120
+ const preferredContrast = getContrastRatio(background, preferred);
121
+ if (preferredContrast !== null && preferredContrast >= MINIMUM_READABLE_CONTRAST) {
122
+ return preferred;
123
+ }
124
+
125
+ const parsedBackground = parseHexColor(background);
126
+ const normalizedBackground =
127
+ parsedBackground === null ? null : parseCanonicalHexColor(toHexColor(parsedBackground));
128
+ const strongestForeground =
129
+ normalizedBackground === null
130
+ ? undefined
131
+ : getReadableForeground(normalizedBackground).foreground;
132
+ const candidates = uniqueColors([
133
+ preferred,
134
+ fallback,
135
+ ...(strongestForeground === undefined ? [] : [strongestForeground]),
136
+ ]);
137
+ const [readableCandidate] = candidates
138
+ .map((candidate) => ({ candidate, contrast: getContrastRatio(background, candidate) }))
139
+ .filter(
140
+ (entry): entry is { readonly candidate: string; readonly contrast: number } =>
141
+ entry.contrast !== null,
142
+ )
143
+ .sort((left, right) => right.contrast - left.contrast);
144
+
145
+ return readableCandidate?.candidate ?? preferred;
146
+ }
147
+
148
+ /*** Converts a parsed color to Color Theory's canonical six-digit input. */
149
+ function toHexColor(color: RgbColor): string {
150
+ return `#${[color.red, color.green, color.blue].map((channel) => channel.toString(16).padStart(2, '0')).join('')}`;
151
+ }
152
+
153
+ /*** Removes duplicate contrast candidates without changing their order. */
154
+ function uniqueColors(colors: readonly string[]): string[] {
155
+ return [...new Set(colors)];
156
+ }
157
+
158
+ /*** Measures contrast when both colors can be parsed as hex. */
159
+ function getContrastRatio(background: string, foreground: string): number | null {
160
+ const backgroundColor = parseHexColor(background);
161
+ const foregroundColor = parseHexColor(foreground);
162
+
163
+ if (backgroundColor === null || foregroundColor === null) return null;
164
+
165
+ const backgroundLuminance = getRelativeLuminance(backgroundColor);
166
+ const foregroundLuminance = getRelativeLuminance(foregroundColor);
167
+ const lighter = Math.max(backgroundLuminance, foregroundLuminance);
168
+ const darker = Math.min(backgroundLuminance, foregroundLuminance);
169
+
170
+ return (lighter + 0.05) / (darker + 0.05);
171
+ }
172
+
173
+ /*** Parses the hex colors supported by the tabletop palette. */
174
+ function parseHexColor(color: string): RgbColor | null {
175
+ const value = color.trim();
176
+ const hex = value.startsWith('#') ? value.slice(1) : '';
177
+ if (!isSupportedHexLength(hex) || !isHexColorValue(hex)) return null;
178
+
179
+ if (hex.length === 3) {
180
+ const red = hex.slice(0, 1);
181
+ const green = hex.slice(1, 2);
182
+ const blue = hex.slice(2, 3);
183
+
184
+ return {
185
+ red: parseInt(red + red, 16),
186
+ green: parseInt(green + green, 16),
187
+ blue: parseInt(blue + blue, 16),
188
+ };
189
+ }
190
+
191
+ return {
192
+ red: parseInt(hex.slice(0, 2), 16),
193
+ green: parseInt(hex.slice(2, 4), 16),
194
+ blue: parseInt(hex.slice(4, 6), 16),
195
+ };
196
+ }
197
+
198
+ /*** Checks the supported short, full, and alpha hex lengths. */
199
+ function isSupportedHexLength(hex: string): boolean {
200
+ return hex.length === 3 || hex.length === 6 || hex.length === 8;
201
+ }
202
+
203
+ /*** Rejects non-hexadecimal color digits. */
204
+ function isHexColorValue(hex: string): boolean {
205
+ return [...hex].every((character) => isHexCharacter(character));
206
+ }
207
+
208
+ /*** Checks whether a character is a hexadecimal digit. */
209
+ function isHexCharacter(character: string): boolean {
210
+ const code = character.charCodeAt(0);
211
+ const isDigit = code >= 48 && code <= 57;
212
+ const isUpperHex = code >= 65 && code <= 70;
213
+ const isLowerHex = code >= 97 && code <= 102;
214
+
215
+ return isDigit || isUpperHex || isLowerHex;
216
+ }
217
+
218
+ /*** Computes relative luminance for one RGB color. */
219
+ function getRelativeLuminance(color: RgbColor): number {
220
+ const red = normalizeColorChannel(color.red);
221
+ const green = normalizeColorChannel(color.green);
222
+ const blue = normalizeColorChannel(color.blue);
223
+
224
+ return 0.2126 * red + 0.7152 * green + 0.0722 * blue;
225
+ }
226
+
227
+ /*** Converts an RGB channel into linear light. */
228
+ function normalizeColorChannel(value: number): number {
229
+ const normalized = value / 255;
230
+ if (normalized <= 0.03928) return normalized / 12.92;
231
+ return ((normalized + 0.055) / 1.055) ** 2.4;
232
+ }
@@ -0,0 +1,31 @@
1
+ import type { CreateTabletopGameSeatsInput, TabletopSeatState } from '../../../types/tabletop';
2
+
3
+ /***
4
+ * Joins an ordered game layout with the participant states currently present in a scene.
5
+ *
6
+ * Missing participants retain their seat definition and receive the configured fallback state,
7
+ * which lets card games represent folded, eliminated, disconnected, or otherwise inactive seats
8
+ * without embedding those game rules in the tabletop renderer.
9
+ *
10
+ * Accepts ordered seats, participant overrides, and the fallback for missing participants, then
11
+ * returns normalized tabletop seats in the same order as the supplied seat definitions.
12
+ */
13
+ export function createTabletopGameSeats({
14
+ seats,
15
+ participants,
16
+ missingParticipantState = { disabled: true, muted: true },
17
+ }: CreateTabletopGameSeatsInput): readonly TabletopSeatState[] {
18
+ const participantsBySeat = new Map(
19
+ participants.map((participant) => [participant.seatId, participant] as const),
20
+ );
21
+
22
+ return seats.map((seat) => {
23
+ const participant = participantsBySeat.get(seat.id);
24
+
25
+ return {
26
+ id: seat.id,
27
+ ...seat.defaultState,
28
+ ...(participant === undefined ? missingParticipantState : participant.state),
29
+ };
30
+ });
31
+ }
@@ -0,0 +1,8 @@
1
+ import type { PlayingCardValue } from '../../../types/tabletop';
2
+
3
+ const rankLabels: Readonly<Record<string, string>> = { A: 'ace', J: 'jack', K: 'king', Q: 'queen' };
4
+
5
+ /*** Gives a face-up card a spoken rank and suit. */
6
+ export function getPlayingCardLabel(card: PlayingCardValue): string {
7
+ return `${rankLabels[card.rank] ?? card.rank} of ${card.suit}`;
8
+ }
@@ -0,0 +1,45 @@
1
+ import type { TabletopCardSize } from '../../../types/tabletop';
2
+
3
+ interface TabletopCardDimensions {
4
+ readonly width: number;
5
+ readonly height: number;
6
+ readonly radius: number;
7
+ readonly rankFontSize: number;
8
+ readonly suitFontSize: number;
9
+ }
10
+
11
+ const cardDimensions: Readonly<Record<TabletopCardSize, TabletopCardDimensions>> = {
12
+ large: {
13
+ width: 56,
14
+ height: 80,
15
+ radius: 8,
16
+ rankFontSize: 20,
17
+ suitFontSize: 16,
18
+ },
19
+ medium: {
20
+ width: 40,
21
+ height: 56,
22
+ radius: 6,
23
+ rankFontSize: 15,
24
+ suitFontSize: 12,
25
+ },
26
+ small: {
27
+ width: 28,
28
+ height: 40,
29
+ radius: 5,
30
+ rankFontSize: 11,
31
+ suitFontSize: 9,
32
+ },
33
+ };
34
+
35
+ /*** Returns the published dimensions for a tabletop card size. */
36
+ export function getTabletopCardDimensions(size: TabletopCardSize): TabletopCardDimensions {
37
+ switch (size) {
38
+ case 'small':
39
+ return cardDimensions.small;
40
+ case 'large':
41
+ return cardDimensions.large;
42
+ case 'medium':
43
+ return cardDimensions.medium;
44
+ }
45
+ }
@@ -0,0 +1,100 @@
1
+ import type { TabletopSeatCount } from '../../../types/tabletop';
2
+
3
+ type TabletopSeatPositionValue = `${number}%`;
4
+
5
+ interface TabletopSeatPosition {
6
+ readonly top: TabletopSeatPositionValue;
7
+ readonly left: TabletopSeatPositionValue;
8
+ }
9
+
10
+ const fallbackSeatPosition: TabletopSeatPosition = { top: '82%', left: '50%' };
11
+
12
+ const seatPositions: Readonly<Record<TabletopSeatCount, readonly TabletopSeatPosition[]>> = {
13
+ 2: [fallbackSeatPosition, { top: '18%', left: '50%' }],
14
+ 3: [fallbackSeatPosition, { top: '28%', left: '18%' }, { top: '28%', left: '82%' }],
15
+ 4: [
16
+ fallbackSeatPosition,
17
+ { top: '50%', left: '12%' },
18
+ { top: '18%', left: '50%' },
19
+ { top: '50%', left: '88%' },
20
+ ],
21
+ 5: [
22
+ { top: '84%', left: '50%' },
23
+ { top: '62%', left: '12%' },
24
+ { top: '18%', left: '24%' },
25
+ { top: '18%', left: '76%' },
26
+ { top: '62%', left: '88%' },
27
+ ],
28
+ 6: [
29
+ { top: '84%', left: '50%' },
30
+ { top: '68%', left: '16%' },
31
+ { top: '26%', left: '16%' },
32
+ { top: '16%', left: '50%' },
33
+ { top: '26%', left: '84%' },
34
+ { top: '68%', left: '84%' },
35
+ ],
36
+ 7: [
37
+ { top: '86%', left: '50%' },
38
+ { top: '70%', left: '14%' },
39
+ { top: '34%', left: '10%' },
40
+ { top: '14%', left: '34%' },
41
+ { top: '14%', left: '66%' },
42
+ { top: '34%', left: '90%' },
43
+ { top: '70%', left: '86%' },
44
+ ],
45
+ 8: [
46
+ { top: '86%', left: '50%' },
47
+ { top: '72%', left: '16%' },
48
+ { top: '50%', left: '8%' },
49
+ { top: '20%', left: '20%' },
50
+ { top: '14%', left: '50%' },
51
+ { top: '20%', left: '80%' },
52
+ { top: '50%', left: '92%' },
53
+ { top: '72%', left: '84%' },
54
+ ],
55
+ 9: [
56
+ { top: '88%', left: '50%' },
57
+ { top: '78%', left: '12%' },
58
+ { top: '50%', left: '4%' },
59
+ { top: '18%', left: '10%' },
60
+ { top: '8%', left: '28%' },
61
+ { top: '8%', left: '50%' },
62
+ { top: '8%', left: '72%' },
63
+ { top: '18%', left: '90%' },
64
+ { top: '50%', left: '96%' },
65
+ ],
66
+ 10: [
67
+ { top: '88%', left: '50%' },
68
+ { top: '80%', left: '20%' },
69
+ { top: '58%', left: '6%' },
70
+ { top: '30%', left: '8%' },
71
+ { top: '10%', left: '30%' },
72
+ { top: '8%', left: '50%' },
73
+ { top: '10%', left: '70%' },
74
+ { top: '30%', left: '92%' },
75
+ { top: '58%', left: '94%' },
76
+ { top: '80%', left: '80%' },
77
+ ],
78
+ };
79
+
80
+ /*** Clamps the requested tabletop seat count to a supported ring. */
81
+ function normalizeTabletopSeatCount(count: number): TabletopSeatCount {
82
+ const rounded = Math.round(count);
83
+ if (rounded <= 2) return 2;
84
+ if (rounded >= 10) return 10;
85
+
86
+ return rounded as TabletopSeatCount;
87
+ }
88
+
89
+ /*** Returns the canonical seat positions for a ring size. */
90
+ function getTabletopSeatPositions(count: number): readonly TabletopSeatPosition[] {
91
+ return seatPositions[normalizeTabletopSeatCount(count)];
92
+ }
93
+
94
+ /*** Returns a seat's canonical position with the hero at the bottom. */
95
+ export function getTabletopSeatPosition(index: number, count: number): TabletopSeatPosition {
96
+ const positions = getTabletopSeatPositions(count);
97
+ const position = positions[index % positions.length];
98
+
99
+ return position ?? fallbackSeatPosition;
100
+ }
package/src/index.ts CHANGED
@@ -125,6 +125,34 @@ export type {
125
125
  MessageBubbleStatus,
126
126
  } from './features/chat/public';
127
127
  export { ChatListItem, MessageBubble } from './features/chat/public';
128
+ export type {
129
+ ChessBoardColorOverrides,
130
+ ChessBoardColorScheme,
131
+ ChessBoardOrientation,
132
+ ChessBoardProps,
133
+ ChessMoveAttempt,
134
+ ChessPieceCode,
135
+ ChessPieceRenderContext,
136
+ ChessPieceRenderer,
137
+ ChessPieceState,
138
+ ChessPromotionPiece,
139
+ ChessSquareId,
140
+ OpeningBookColorOverrides,
141
+ OpeningBookColorScheme,
142
+ OpeningBookMove,
143
+ OpeningBookProps,
144
+ } from './features/chess/public';
145
+ export type { ChessColorThemeShape } from './features/chess/public';
146
+ export { ChessBoard, OpeningBook } from './features/chess/public';
147
+ export {
148
+ chessSquares,
149
+ createBoardSquares,
150
+ createChessBoardColorScheme,
151
+ createOpeningBookColorScheme,
152
+ getSquareFile,
153
+ getSquareRank,
154
+ isLightSquare,
155
+ } from './features/chess/public';
128
156
  export type { ChipProps } from './features/chip/public';
129
157
  export type { ChipGroupItem, ChipGroupProps } from './features/chip/public';
130
158
  export { Chip } from './features/chip/public';
@@ -214,6 +242,27 @@ export {
214
242
  type TextInputProps,
215
243
  type TextInputTrailingAction,
216
244
  } from './features/form/text-input/public';
245
+ export type {
246
+ GameEntityEasing,
247
+ GameEntityMotionProps,
248
+ GameEntityProps,
249
+ GameFieldProps,
250
+ GameInputZoneProps,
251
+ GameKeyboardBinding,
252
+ GameMeasurementProbeProps,
253
+ GameOverlayPlacement,
254
+ GameOverlayProps,
255
+ GamePointerEvents,
256
+ GameProps,
257
+ } from './features/game/public';
258
+ export {
259
+ Game,
260
+ GameEntity,
261
+ GameField,
262
+ GameInputZone,
263
+ GameMeasurementProbe,
264
+ GameOverlay,
265
+ } from './features/game/public';
217
266
  export type {
218
267
  GradientColor,
219
268
  GradientColors,
@@ -342,6 +391,40 @@ export {
342
391
  } from './features/skeleton/public';
343
392
  export type { SurfaceProps, SurfaceVariant } from './features/surface/public';
344
393
  export { Surface } from './features/surface/public';
394
+ export type {
395
+ CardBackProps,
396
+ CardHandProps,
397
+ CreatePokerTrainingTableStateOptions,
398
+ CreateTabletopGameSeatsInput,
399
+ PlayingCardProps,
400
+ PlayingCardSuit,
401
+ PlayingCardValue,
402
+ PokerTrainingPlayer,
403
+ PokerTrainingTableProps,
404
+ PokerTrainingTableSize,
405
+ PokerTrainingTableState,
406
+ PokerTrainingTaskTableData,
407
+ TabletopCardSize,
408
+ TabletopColorOverrides,
409
+ TabletopColorScheme,
410
+ TabletopGameParticipantState,
411
+ TabletopGameSeatDefinition,
412
+ TabletopGameSeatPresentation,
413
+ TabletopSeatCount,
414
+ TabletopSeatState,
415
+ TabletopShape,
416
+ TabletopTableProps,
417
+ } from './features/tabletop/public';
418
+ export {
419
+ CardBack,
420
+ CardHand,
421
+ createPokerTrainingTableState,
422
+ createTabletopColorScheme,
423
+ createTabletopGameSeats,
424
+ PlayingCard,
425
+ PokerTrainingTable,
426
+ TabletopTable,
427
+ } from './features/tabletop/public';
345
428
  export {
346
429
  Tab,
347
430
  TabList,
@@ -0,0 +1,95 @@
1
+ import type React from 'react';
2
+
3
+ import type { ZoraBaseProps } from './base';
4
+
5
+ export type ChessBoardOrientation = 'white' | 'black';
6
+ export type ChessPieceCode = string;
7
+ export type ChessSquareId =
8
+ `${'a' | 'b' | 'c' | 'd' | 'e' | 'f' | 'g' | 'h'}${1 | 2 | 3 | 4 | 5 | 6 | 7 | 8}`;
9
+ export type ChessPromotionPiece = 'q' | 'r' | 'b' | 'n';
10
+
11
+ export interface ChessMoveAttempt {
12
+ readonly from: ChessSquareId;
13
+ readonly to: ChessSquareId;
14
+ readonly promotion?: ChessPromotionPiece;
15
+ }
16
+
17
+ export interface ChessPieceState {
18
+ readonly color: 'black' | 'white';
19
+ readonly piece: ChessPieceCode;
20
+ readonly square: ChessSquareId;
21
+ }
22
+
23
+ export interface ChessPieceRenderContext {
24
+ readonly color: string;
25
+ readonly piece: ChessPieceCode;
26
+ readonly square: ChessSquareId;
27
+ }
28
+
29
+ export type ChessPieceRenderer = (context: ChessPieceRenderContext) => React.ReactNode;
30
+
31
+ export interface ChessBoardColorScheme {
32
+ readonly lightSquare: string;
33
+ readonly darkSquare: string;
34
+ readonly lightSquareText: string;
35
+ readonly darkSquareText: string;
36
+ readonly selectedSquare: string;
37
+ readonly legalTarget: string;
38
+ readonly lastMoveFrom: string;
39
+ readonly lastMoveTo: string;
40
+ readonly border: string;
41
+ readonly coordinateText: string;
42
+ readonly lightPiece: string;
43
+ readonly darkPiece: string;
44
+ }
45
+
46
+ export type ChessBoardColorOverrides = Partial<ChessBoardColorScheme>;
47
+
48
+ export interface OpeningBookColorScheme {
49
+ readonly border: string;
50
+ readonly surface: string;
51
+ readonly surfaceHover: string;
52
+ readonly selectedSurface: string;
53
+ readonly titleText: string;
54
+ readonly primaryText: string;
55
+ readonly secondaryText: string;
56
+ readonly metricSurface: string;
57
+ }
58
+ export type OpeningBookColorOverrides = Partial<OpeningBookColorScheme>;
59
+
60
+ export interface ChessBoardProps extends ZoraBaseProps {
61
+ readonly pieces?: readonly ChessPieceState[];
62
+ readonly orientation?: ChessBoardOrientation;
63
+ readonly selectedSquare?: ChessSquareId | null;
64
+ readonly legalTargets?: readonly ChessSquareId[];
65
+ readonly lastMove?: ChessMoveAttempt | null;
66
+ readonly disabled?: boolean;
67
+ readonly showCoordinates?: boolean;
68
+ readonly colorScheme?: ChessBoardColorOverrides;
69
+ readonly onSquarePress?: (square: ChessSquareId) => void;
70
+ readonly onMoveAttempt?: (move: ChessMoveAttempt) => void;
71
+ readonly renderPiece?: ChessPieceRenderer;
72
+ }
73
+
74
+ export interface OpeningBookMove {
75
+ readonly san: string;
76
+ readonly uci?: string;
77
+ readonly fen?: string;
78
+ readonly name?: string;
79
+ readonly eco?: string;
80
+ readonly games?: number;
81
+ readonly whiteWinRate?: number;
82
+ readonly drawRate?: number;
83
+ readonly blackWinRate?: number;
84
+ }
85
+
86
+ export interface OpeningBookProps extends ZoraBaseProps {
87
+ readonly moves?: readonly OpeningBookMove[];
88
+ readonly title?: string;
89
+ readonly loading?: boolean;
90
+ readonly errorText?: string;
91
+ readonly emptyText?: string;
92
+ readonly selectedMove?: string | null;
93
+ readonly colorScheme?: OpeningBookColorOverrides;
94
+ readonly onMovePress?: (move: OpeningBookMove) => void;
95
+ }