@dreamboard-games/ui-sdk 0.0.43 → 0.0.45

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 (166) hide show
  1. package/dist/components/ActionButton.d.ts.map +1 -1
  2. package/dist/components/ActionButton.js +2 -1
  3. package/dist/components/Card.d.ts +1 -1
  4. package/dist/components/Card.d.ts.map +1 -1
  5. package/dist/components/DiceRoller.d.ts +3 -2
  6. package/dist/components/DiceRoller.d.ts.map +1 -1
  7. package/dist/components/DiceRoller.js +4 -13
  8. package/dist/components/ErrorBoundary.d.ts.map +1 -1
  9. package/dist/components/ErrorBoundary.js +94 -2
  10. package/dist/components/InteractionForm.d.ts +1 -1
  11. package/dist/components/InteractionForm.d.ts.map +1 -1
  12. package/dist/components/InteractionForm.js +29 -15
  13. package/dist/components/PrimaryActionButton.d.ts.map +1 -1
  14. package/dist/components/PrimaryActionButton.js +7 -6
  15. package/dist/components/ResourceCounter.d.ts +59 -25
  16. package/dist/components/ResourceCounter.d.ts.map +1 -1
  17. package/dist/components/ResourceCounter.js +106 -115
  18. package/dist/components/Toast.d.ts +13 -6
  19. package/dist/components/Toast.d.ts.map +1 -1
  20. package/dist/components/Toast.js +10 -5
  21. package/dist/components/board/HexGrid.js +6 -6
  22. package/dist/components/board/target-layer.d.ts +18 -2
  23. package/dist/components/board/target-layer.d.ts.map +1 -1
  24. package/dist/components/board/target-layer.js +20 -3
  25. package/dist/components/index.d.ts +3 -4
  26. package/dist/components/index.d.ts.map +1 -1
  27. package/dist/components/index.js +3 -4
  28. package/dist/components/surfaces/InboxSurface.d.ts.map +1 -1
  29. package/dist/components/surfaces/InboxSurface.js +2 -6
  30. package/dist/components/surfaces/PlayerCardsSurface.js +2 -2
  31. package/dist/components/surfaces/internal/CardZoneRoutedForm.d.ts +7 -0
  32. package/dist/components/surfaces/internal/CardZoneRoutedForm.d.ts.map +1 -0
  33. package/dist/components/surfaces/internal/CardZoneRoutedForm.js +9 -0
  34. package/dist/components/surfaces/internal/DefaultInteractionButton.d.ts.map +1 -1
  35. package/dist/components/surfaces/internal/DefaultInteractionButton.js +5 -8
  36. package/dist/components/surfaces/internal/useCardZoneInteractions.d.ts +2 -2
  37. package/dist/components/surfaces/internal/useCardZoneInteractions.d.ts.map +1 -1
  38. package/dist/components/surfaces/internal/useCardZoneInteractions.js +19 -43
  39. package/dist/context/InteractionDraftContext.d.ts +11 -2
  40. package/dist/context/InteractionDraftContext.d.ts.map +1 -1
  41. package/dist/context/InteractionDraftContext.js +41 -4
  42. package/dist/defaults/components.d.ts +0 -5
  43. package/dist/defaults/components.d.ts.map +1 -1
  44. package/dist/defaults/components.js +7 -11
  45. package/dist/hooks/useBoardInteractions.d.ts +35 -12
  46. package/dist/hooks/useBoardInteractions.d.ts.map +1 -1
  47. package/dist/hooks/useBoardInteractions.js +186 -82
  48. package/dist/hooks/useInteractionHandle.d.ts +1 -1
  49. package/dist/hooks/useInteractionHandle.d.ts.map +1 -1
  50. package/dist/hooks/useInteractionHandle.js +12 -27
  51. package/dist/index.d.ts +11 -17
  52. package/dist/index.d.ts.map +1 -1
  53. package/dist/index.js +5 -14
  54. package/dist/primitives/board.d.ts +53 -3
  55. package/dist/primitives/board.d.ts.map +1 -1
  56. package/dist/primitives/board.js +65 -41
  57. package/dist/primitives/dialog-lifecycle.d.ts +17 -0
  58. package/dist/primitives/dialog-lifecycle.d.ts.map +1 -0
  59. package/dist/primitives/dialog-lifecycle.js +24 -0
  60. package/dist/primitives/dice.d.ts +31 -0
  61. package/dist/primitives/dice.d.ts.map +1 -0
  62. package/dist/primitives/dice.js +33 -0
  63. package/dist/primitives/game.d.ts +55 -0
  64. package/dist/primitives/game.d.ts.map +1 -0
  65. package/dist/primitives/game.js +101 -0
  66. package/dist/primitives/index.d.ts +7 -4
  67. package/dist/primitives/index.d.ts.map +1 -1
  68. package/dist/primitives/index.js +7 -4
  69. package/dist/primitives/interaction-form-binding.d.ts +12 -0
  70. package/dist/primitives/interaction-form-binding.d.ts.map +1 -0
  71. package/dist/primitives/interaction-form-binding.js +14 -0
  72. package/dist/primitives/interaction-submit.d.ts +23 -0
  73. package/dist/primitives/interaction-submit.d.ts.map +1 -0
  74. package/dist/primitives/interaction-submit.js +41 -0
  75. package/dist/primitives/interaction.d.ts +76 -6
  76. package/dist/primitives/interaction.d.ts.map +1 -1
  77. package/dist/primitives/interaction.js +210 -26
  78. package/dist/primitives/player-roster.d.ts +2 -1
  79. package/dist/primitives/player-roster.d.ts.map +1 -1
  80. package/dist/primitives/prompt.d.ts +36 -11
  81. package/dist/primitives/prompt.d.ts.map +1 -1
  82. package/dist/primitives/prompt.js +29 -17
  83. package/dist/primitives/ui.d.ts +9 -0
  84. package/dist/primitives/ui.d.ts.map +1 -0
  85. package/dist/primitives/ui.js +7 -0
  86. package/dist/primitives/zone.d.ts +111 -5
  87. package/dist/primitives/zone.d.ts.map +1 -1
  88. package/dist/primitives/zone.js +349 -9
  89. package/dist/reducer.d.ts +2 -14
  90. package/dist/reducer.d.ts.map +1 -1
  91. package/dist/reducer.js +1 -14
  92. package/dist/runtime/createPluginRuntimeAPI.js +1 -1
  93. package/dist/types/hex-color.d.ts +7 -0
  94. package/dist/types/hex-color.d.ts.map +1 -0
  95. package/dist/types/hex-color.js +13 -0
  96. package/dist/types/player-state.d.ts +28 -14
  97. package/dist/types/player-state.d.ts.map +1 -1
  98. package/dist/types/plugin-state.d.ts +9 -3
  99. package/dist/types/plugin-state.d.ts.map +1 -1
  100. package/dist/ui-contract.d.ts +119 -14
  101. package/dist/ui-contract.d.ts.map +1 -1
  102. package/dist/ui-contract.js +4 -3
  103. package/dist/ui-sdk.d.ts +1637 -1245
  104. package/dist/utils/interaction-inputs.d.ts +8 -5
  105. package/dist/utils/interaction-inputs.d.ts.map +1 -1
  106. package/dist/utils/interaction-inputs.js +82 -14
  107. package/dist/utils/interaction-router.d.ts +31 -0
  108. package/dist/utils/interaction-router.d.ts.map +1 -0
  109. package/dist/utils/interaction-router.js +114 -0
  110. package/package.json +1 -1
  111. package/src/components/ActionButton.tsx +2 -1
  112. package/src/components/Card.tsx +1 -1
  113. package/src/components/DiceRoller.tsx +13 -22
  114. package/src/components/ErrorBoundary.test.tsx +19 -0
  115. package/src/components/ErrorBoundary.tsx +113 -24
  116. package/src/components/InteractionForm.test.tsx +24 -0
  117. package/src/components/InteractionForm.tsx +48 -23
  118. package/src/components/PrimaryActionButton.tsx +19 -5
  119. package/src/components/ResourceCounter.test.tsx +13 -13
  120. package/src/components/ResourceCounter.tsx +238 -244
  121. package/src/components/Toast.tsx +23 -10
  122. package/src/components/__fixtures__/ResourceCounter.fixture.tsx +70 -169
  123. package/src/components/board/HexGrid.tsx +6 -6
  124. package/src/components/board/target-layer.ts +44 -5
  125. package/src/components/index.ts +17 -10
  126. package/src/components/surfaces/InboxSurface.tsx +7 -5
  127. package/src/components/surfaces/PlayerCardsSurface.tsx +6 -6
  128. package/src/components/surfaces/internal/CardZoneRoutedForm.tsx +35 -0
  129. package/src/components/surfaces/internal/DefaultInteractionButton.tsx +17 -7
  130. package/src/components/surfaces/internal/useCardZoneInteractions.ts +25 -67
  131. package/src/context/InteractionDraftContext.tsx +51 -5
  132. package/src/defaults/components.tsx +12 -50
  133. package/src/defaults/defaults.test.tsx +1 -50
  134. package/src/hooks/useBoardInteractions.test.tsx +240 -17
  135. package/src/hooks/useBoardInteractions.ts +330 -105
  136. package/src/hooks/useInteractionHandle.ts +23 -28
  137. package/src/index.test.ts +60 -40
  138. package/src/index.ts +30 -36
  139. package/src/primitives/board.test.tsx +73 -0
  140. package/src/primitives/board.tsx +191 -40
  141. package/src/primitives/dialog-lifecycle.ts +58 -0
  142. package/src/primitives/dice.test.tsx +47 -0
  143. package/src/primitives/dice.tsx +79 -0
  144. package/src/primitives/game.test.tsx +98 -0
  145. package/src/primitives/game.tsx +213 -0
  146. package/src/primitives/index.ts +84 -0
  147. package/src/primitives/interaction-form-binding.tsx +56 -0
  148. package/src/primitives/interaction-submit.ts +90 -0
  149. package/src/primitives/interaction.test.tsx +396 -0
  150. package/src/primitives/interaction.tsx +451 -31
  151. package/src/primitives/player-roster.tsx +2 -1
  152. package/src/primitives/prompt.test.tsx +94 -3
  153. package/src/primitives/prompt.tsx +87 -48
  154. package/src/primitives/ui.test.tsx +131 -0
  155. package/src/primitives/ui.tsx +13 -0
  156. package/src/primitives/zone.test.tsx +305 -0
  157. package/src/primitives/zone.tsx +660 -12
  158. package/src/reducer.ts +7 -20
  159. package/src/runtime/createPluginRuntimeAPI.ts +1 -1
  160. package/src/types/hex-color.ts +20 -0
  161. package/src/types/player-state.ts +36 -18
  162. package/src/types/plugin-state.ts +10 -3
  163. package/src/ui-contract.ts +253 -21
  164. package/src/utils/interaction-inputs.test.ts +400 -0
  165. package/src/utils/interaction-inputs.ts +113 -11
  166. package/src/utils/interaction-router.ts +200 -0
@@ -1 +1 @@
1
- {"version":3,"file":"ActionButton.d.ts","sourceRoot":"","sources":["../../src/components/ActionButton.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAC7D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAI1E,MAAM,WAAW,iBACf,SAAQ,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,SAAS,CAAC;IAChE,MAAM,EAAE,iBAAiB,CAAC;IAC1B,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,wBAAgB,YAAY,CAAC,EAC3B,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,KAAK,EACL,GAAG,IAAI,EACR,EAAE,iBAAiB,2CAenB"}
1
+ {"version":3,"file":"ActionButton.d.ts","sourceRoot":"","sources":["../../src/components/ActionButton.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAC7D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAK1E,MAAM,WAAW,iBACf,SAAQ,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,SAAS,CAAC;IAChE,MAAM,EAAE,iBAAiB,CAAC;IAC1B,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,wBAAgB,YAAY,CAAC,EAC3B,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,KAAK,EACL,GAAG,IAAI,EACR,EAAE,iBAAiB,2CAenB"}
@@ -1,9 +1,10 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { submitInteraction } from "../primitives/interaction-submit.js";
2
3
  import { interactionLabel } from "../utils/interaction-labels.js";
3
4
  import { ThemedButton } from "./ThemedButton.js";
4
5
  export function ActionButton({ handle, children, disabled, title, ...rest }) {
5
6
  return (_jsx(ThemedButton, { type: "button", variant: "secondary", disabled: disabled || !handle.available, title: title ?? formatUnavailableReason(handle.unavailableReason), onClick: () => {
6
- void handle.submit();
7
+ void submitInteraction(handle);
7
8
  }, ...rest, children: children ?? interactionLabel(handle.descriptor) }));
8
9
  }
9
10
  function formatUnavailableReason(reason) {
@@ -15,7 +15,7 @@ export interface CardProps<CardData extends ViewCard = ViewCard> extends Omit<HT
15
15
  size?: "sm" | "md" | "lg";
16
16
  faceDown?: boolean;
17
17
  renderContent?: (card: CardData) => React.ReactNode;
18
- onCardClick?: (cardId: string) => void;
18
+ onCardClick?: (cardId: CardData["id"]) => void;
19
19
  "aria-label"?: string;
20
20
  }
21
21
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"Card.d.ts","sourceRoot":"","sources":["../../src/components/Card.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAU,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AAE7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAItD,MAAM,WAAW,SAAS,CAAC,QAAQ,SAAS,QAAQ,GAAG,QAAQ,CAC7D,SAAQ,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAC;IACnD,IAAI,EAAE,QAAQ,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,KAAK,CAAC,SAAS,CAAC;IACpD,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAyLD;;;;;GAKG;AACH,wBAAgB,IAAI,CAAC,QAAQ,SAAS,QAAQ,GAAG,QAAQ,EAAE,EACzD,IAAI,EACJ,QAAgB,EAChB,QAAgB,EAChB,IAAW,EACX,QAAgB,EAChB,aAAa,EACb,WAAW,EACX,SAAS,EACT,YAAY,EAAE,SAAS,EACvB,GAAG,WAAW,EACf,EAAE,SAAS,CAAC,QAAQ,CAAC,2CA2JrB;AAED,YAAY,EAAE,QAAQ,EAAE,CAAC"}
1
+ {"version":3,"file":"Card.d.ts","sourceRoot":"","sources":["../../src/components/Card.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAU,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AAE7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAItD,MAAM,WAAW,SAAS,CAAC,QAAQ,SAAS,QAAQ,GAAG,QAAQ,CAC7D,SAAQ,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAC;IACnD,IAAI,EAAE,QAAQ,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,KAAK,CAAC,SAAS,CAAC;IACpD,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC;IAC/C,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAyLD;;;;;GAKG;AACH,wBAAgB,IAAI,CAAC,QAAQ,SAAS,QAAQ,GAAG,QAAQ,EAAE,EACzD,IAAI,EACJ,QAAgB,EAChB,QAAgB,EAChB,IAAW,EACX,QAAgB,EAChB,aAAa,EACb,WAAW,EACX,SAAS,EACT,YAAY,EAAE,SAAS,EACvB,GAAG,WAAW,EACf,EAAE,SAAS,CAAC,QAAQ,CAAC,2CA2JrB;AAED,YAAY,EAAE,QAAQ,EAAE,CAAC"}
@@ -1,7 +1,8 @@
1
1
  import { type ReactNode } from "react";
2
2
  import type { InteractionHandle, InteractionParamsShape } from "../hooks/useInteractionHandle.js";
3
+ import { type DiceValue } from "../primitives/index.js";
3
4
  export interface DiceRollerRenderProps {
4
- values: Array<number | undefined> | undefined;
5
+ values: ReadonlyArray<number | undefined> | undefined;
5
6
  /** Undefined if any die hasn't been rolled */
6
7
  sum: number | undefined;
7
8
  diceCount: number;
@@ -18,7 +19,7 @@ export interface DiceRollerRollAction<Params extends InteractionParamsShape = In
18
19
  revealHoldMs?: number;
19
20
  }
20
21
  export interface DiceRollerProps<Params extends InteractionParamsShape = InteractionParamsShape> {
21
- values?: Array<number | undefined>;
22
+ values?: readonly DiceValue[] | null;
22
23
  /** Used when values not provided */
23
24
  diceCount?: number;
24
25
  render?: (props: DiceRollerRenderProps) => ReactNode;
@@ -1 +1 @@
1
- {"version":3,"file":"DiceRoller.d.ts","sourceRoot":"","sources":["../../src/components/DiceRoller.tsx"],"names":[],"mappings":"AAEA,OAAO,EAML,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAUf,OAAO,KAAK,EACV,iBAAiB,EACjB,sBAAsB,EACvB,MAAM,kCAAkC,CAAC;AAI1C,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,GAAG,SAAS,CAAC;IAC9C,8CAA8C;IAC9C,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB,CACnC,MAAM,SAAS,sBAAsB,GAAG,sBAAsB;IAE9D,2EAA2E;IAC3E,MAAM,EAAE,iBAAiB,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;IACzC,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,eAAe,CAC9B,MAAM,SAAS,sBAAsB,GAAG,sBAAsB;IAE9D,MAAM,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACnC,oCAAoC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,qBAAqB,KAAK,SAAS,CAAC;IACrD,0EAA0E;IAC1E,UAAU,CAAC,EAAE,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAQD,wBAAgB,UAAU,CACxB,MAAM,SAAS,sBAAsB,GAAG,sBAAsB,EAC9D,EACA,MAAM,EACN,SAAa,EACb,MAAM,EACN,UAAU,EACV,SAAS,GACV,EAAE,eAAe,CAAC,MAAM,CAAC,2CAuCzB"}
1
+ {"version":3,"file":"DiceRoller.d.ts","sourceRoot":"","sources":["../../src/components/DiceRoller.tsx"],"names":[],"mappings":"AAEA,OAAO,EAML,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAUf,OAAO,KAAK,EACV,iBAAiB,EACjB,sBAAsB,EACvB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAsB,KAAK,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAI5E,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,aAAa,CAAC,MAAM,GAAG,SAAS,CAAC,GAAG,SAAS,CAAC;IACtD,8CAA8C;IAC9C,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB,CACnC,MAAM,SAAS,sBAAsB,GAAG,sBAAsB;IAE9D,2EAA2E;IAC3E,MAAM,EAAE,iBAAiB,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;IACzC,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,eAAe,CAC9B,MAAM,SAAS,sBAAsB,GAAG,sBAAsB;IAE9D,MAAM,CAAC,EAAE,SAAS,SAAS,EAAE,GAAG,IAAI,CAAC;IACrC,oCAAoC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,qBAAqB,KAAK,SAAS,CAAC;IACrD,0EAA0E;IAC1E,UAAU,CAAC,EAAE,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAQD,wBAAgB,UAAU,CACxB,MAAM,SAAS,sBAAsB,GAAG,sBAAsB,EAC9D,EACA,MAAM,EACN,SAAa,EACb,MAAM,EACN,UAAU,EACV,SAAS,GACV,EAAE,eAAe,CAAC,MAAM,CAAC,2CA2BzB"}
@@ -5,25 +5,16 @@ import { useCallback, useEffect, useRef, useState, } from "react";
5
5
  import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, } from "../internal/ui/dialog.js";
6
6
  import { surfaceStyle } from "../theme/derive.js";
7
7
  import { useTheme, useThemeCssVars } from "../theme/ThemeProvider.js";
8
+ import { normalizeDiceState } from "../primitives/index.js";
8
9
  import { interactionLabel } from "../utils/interaction-labels.js";
9
10
  import { ThemedButton } from "./ThemedButton.js";
10
11
  const DEFAULT_MIN_SPIN_MS = 1200;
11
12
  const DEFAULT_REVEAL_HOLD_MS = 1400;
12
13
  const FACE_SEQUENCE = [1, 2, 3, 4, 5, 6];
13
14
  export function DiceRoller({ values, diceCount = 2, render, rollAction, className, }) {
14
- const allRolled = values?.every((v) => v !== null && v !== undefined) ?? false;
15
- const sum = allRolled
16
- ? values?.reduce((a, b) => (a ?? 0) + (b ?? 0), 0)
17
- : undefined;
18
- const displayCount = values?.length ?? diceCount;
19
- const renderProps = {
20
- values,
21
- sum,
22
- diceCount: displayCount,
23
- allRolled,
24
- };
25
- return (_jsxs("div", { className: clsx("flex flex-col items-center gap-4", className), role: "region", "aria-label": "Dice roller", children: [render ? render(renderProps) : _jsx(DefaultDiceReadout, { ...renderProps }), rollAction ? (_jsx(DiceRollDialog, { action: rollAction, values: values, diceCount: displayCount })) : null, _jsx("div", { className: "sr-only", "aria-live": "polite", children: allRolled && values
26
- ? `Rolled ${values.join(", ")}. Total: ${sum}`
15
+ const renderProps = normalizeDiceState({ values, count: diceCount });
16
+ return (_jsxs("div", { className: clsx("flex flex-col items-center gap-4", className), role: "region", "aria-label": "Dice roller", children: [render ? render(renderProps) : _jsx(DefaultDiceReadout, { ...renderProps }), rollAction ? (_jsx(DiceRollDialog, { action: rollAction, values: renderProps.values, diceCount: renderProps.diceCount })) : null, _jsx("div", { className: "sr-only", "aria-live": "polite", children: renderProps.allRolled && renderProps.values
17
+ ? `Rolled ${renderProps.values.join(", ")}. Total: ${renderProps.sum}`
27
18
  : "Dice not rolled yet" })] }));
28
19
  }
29
20
  function DefaultDiceReadout({ values, sum, diceCount, allRolled, }) {
@@ -1 +1 @@
1
- {"version":3,"file":"ErrorBoundary.d.ts","sourceRoot":"","sources":["../../src/components/ErrorBoundary.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAGlE,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,SAAS,CAAC;IACpB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,IAAI,KAAK,SAAS,CAAC;IAC1D,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,KAAK,IAAI,CAAC;CACxD;AAED,UAAU,kBAAkB;IAC1B,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;CACrB;AAED,qBAAa,aAAc,SAAQ,SAAS,CAC1C,kBAAkB,EAClB,kBAAkB,CACnB;gBACa,KAAK,EAAE,kBAAkB;IAKrC,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,KAAK,GAAG,kBAAkB;IAIjE,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI;IAM3D,WAAW,QAAO,IAAI,CAEpB;IAEF,MAAM,IAAI,SAAS;CAgBpB"}
1
+ {"version":3,"file":"ErrorBoundary.d.ts","sourceRoot":"","sources":["../../src/components/ErrorBoundary.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,SAAS,EAET,KAAK,SAAS,EACd,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAGf,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,SAAS,CAAC;IACpB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,IAAI,KAAK,SAAS,CAAC;IAC1D,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,KAAK,IAAI,CAAC;CACxD;AAED,UAAU,kBAAkB;IAC1B,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;CACrB;AAED,qBAAa,aAAc,SAAQ,SAAS,CAC1C,kBAAkB,EAClB,kBAAkB,CACnB;gBACa,KAAK,EAAE,kBAAkB;IAKrC,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,KAAK,GAAG,kBAAkB;IAIjE,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI;IAM3D,WAAW,QAAO,IAAI,CAEpB;IAEF,MAAM,IAAI,SAAS;CAgBpB"}
@@ -4,7 +4,7 @@ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-run
4
4
  *
5
5
  * Catches React errors and displays a fallback UI
6
6
  */
7
- import { Component } from "react";
7
+ import { Component, } from "react";
8
8
  import { AlertTriangle, RefreshCw } from "lucide-react";
9
9
  export class ErrorBoundary extends Component {
10
10
  constructor(props) {
@@ -33,5 +33,97 @@ export class ErrorBoundary extends Component {
33
33
  }
34
34
  }
35
35
  function DefaultErrorFallback({ error, onReset, }) {
36
- return (_jsx("div", { className: "min-h-screen flex items-center justify-center p-4 sm:p-8 bg-gradient-to-br from-red-50 to-orange-50", role: "alert", "aria-live": "assertive", children: _jsxs("div", { className: "max-w-md w-full bg-white rounded-2xl shadow-xl p-6 sm:p-8", children: [_jsx("div", { className: "flex items-center justify-center w-16 h-16 mx-auto mb-4 bg-red-100 rounded-full", children: _jsx(AlertTriangle, { size: 32, className: "text-red-600", "aria-hidden": "true" }) }), _jsx("h1", { className: "text-xl sm:text-2xl font-bold text-center text-slate-900 mb-2", children: "Something went wrong" }), _jsx("p", { className: "text-sm sm:text-base text-slate-600 text-center mb-6", children: "The game encountered an error and couldn't continue. You can try reloading to start fresh." }), _jsxs("details", { className: "mb-6", children: [_jsx("summary", { className: "cursor-pointer text-sm text-slate-500 hover:text-slate-700 mb-2", children: "Technical details" }), _jsxs("pre", { className: "text-xs bg-slate-50 text-slate-700 p-3 rounded-lg overflow-auto max-h-40 border border-slate-200", children: [error.message, error.stack && (_jsxs(_Fragment, { children: ["\n\n", error.stack] }))] })] }), _jsxs("button", { type: "button", onClick: onReset, className: "w-full flex items-center justify-center gap-2 px-4 py-3 bg-blue-600 hover:bg-blue-700 active:bg-blue-800 text-white font-medium rounded-lg transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-500 focus-visible:ring-offset-2", children: [_jsx(RefreshCw, { size: 18, "aria-hidden": "true" }), "Try again"] })] }) }));
36
+ const styles = {
37
+ shell: {
38
+ alignItems: "center",
39
+ background: "#fdfbf7",
40
+ boxSizing: "border-box",
41
+ color: "#0f172a",
42
+ display: "flex",
43
+ justifyContent: "center",
44
+ minHeight: "100vh",
45
+ padding: "24px",
46
+ },
47
+ panel: {
48
+ background: "#fff",
49
+ border: "2px solid #0f172a",
50
+ borderRadius: "12px",
51
+ boxShadow: "6px 6px 0 #111827",
52
+ boxSizing: "border-box",
53
+ maxWidth: "520px",
54
+ padding: "28px",
55
+ width: "100%",
56
+ },
57
+ iconWrap: {
58
+ alignItems: "center",
59
+ background: "#fee2e2",
60
+ border: "2px solid #991b1b",
61
+ borderRadius: "999px",
62
+ display: "flex",
63
+ height: "56px",
64
+ justifyContent: "center",
65
+ marginBottom: "18px",
66
+ width: "56px",
67
+ },
68
+ eyebrow: {
69
+ color: "#991b1b",
70
+ fontSize: "12px",
71
+ fontWeight: 800,
72
+ letterSpacing: "0.08em",
73
+ margin: "0 0 8px",
74
+ textTransform: "uppercase",
75
+ },
76
+ title: {
77
+ fontSize: "28px",
78
+ fontWeight: 900,
79
+ lineHeight: 1.1,
80
+ margin: "0 0 12px",
81
+ },
82
+ body: {
83
+ color: "#475569",
84
+ fontSize: "15px",
85
+ lineHeight: 1.5,
86
+ margin: "0 0 20px",
87
+ },
88
+ details: {
89
+ marginBottom: "22px",
90
+ },
91
+ summary: {
92
+ color: "#334155",
93
+ cursor: "pointer",
94
+ fontSize: "14px",
95
+ fontWeight: 700,
96
+ marginBottom: "8px",
97
+ },
98
+ pre: {
99
+ background: "#f8fafc",
100
+ border: "1px solid #cbd5e1",
101
+ borderRadius: "8px",
102
+ color: "#334155",
103
+ fontSize: "12px",
104
+ lineHeight: 1.45,
105
+ margin: 0,
106
+ maxHeight: "180px",
107
+ overflow: "auto",
108
+ padding: "12px",
109
+ whiteSpace: "pre-wrap",
110
+ },
111
+ button: {
112
+ alignItems: "center",
113
+ background: "#0f172a",
114
+ border: "2px solid #0f172a",
115
+ borderRadius: "8px",
116
+ boxShadow: "3px 3px 0 #111827",
117
+ color: "#fff",
118
+ cursor: "pointer",
119
+ display: "inline-flex",
120
+ fontSize: "15px",
121
+ fontWeight: 800,
122
+ gap: "8px",
123
+ justifyContent: "center",
124
+ padding: "12px 16px",
125
+ width: "100%",
126
+ },
127
+ };
128
+ return (_jsx("div", { style: styles.shell, role: "alert", "aria-live": "assertive", children: _jsxs("div", { style: styles.panel, children: [_jsx("div", { style: styles.iconWrap, children: _jsx(AlertTriangle, { size: 28, color: "#991b1b", strokeWidth: 2.5, "aria-hidden": "true" }) }), _jsx("p", { style: styles.eyebrow, children: "Runtime error" }), _jsx("h1", { style: styles.title, children: "Game failed to start" }), _jsx("p", { style: styles.body, children: "The game encountered an error and couldn't continue. You can try reloading to start fresh." }), _jsxs("details", { style: styles.details, children: [_jsx("summary", { style: styles.summary, children: "Technical details" }), _jsxs("pre", { style: styles.pre, children: [error.message, error.stack && (_jsxs(_Fragment, { children: ["\n\n", error.stack] }))] })] }), _jsxs("button", { type: "button", onClick: onReset, style: styles.button, children: [_jsx(RefreshCw, { size: 18, "aria-hidden": "true" }), "Try again"] })] }) }));
37
129
  }
@@ -46,5 +46,5 @@ export interface InteractionFormProps<Params extends InteractionParamsShape = In
46
46
  export declare function InteractionForm<Params extends InteractionParamsShape = InteractionParamsShape, DefaultedKeys extends keyof Params & string = never>({ descriptor, handle, fields, hiddenFields, renderFields, title, description, submitLabel, cancelLabel, onCancel, onSubmitSuccess, disabled, accordion, defaultOpen, style, }: InteractionFormProps<Params, DefaultedKeys>): import("react/jsx-runtime").JSX.Element;
47
47
  export declare function InteractionField<Params extends InteractionParamsShape = InteractionParamsShape, Key extends keyof Params & string = keyof Params & string>({ descriptor, inputKey, handle, errors, missing, disabled, render, }: InteractionFieldProps<Params, Key>): import("react/jsx-runtime").JSX.Element | null;
48
48
  export declare function hasDefaultInteractionFormFields(descriptor: Pick<InteractionDescriptor, "inputs">): boolean;
49
- export declare function defaultFormInputs(descriptor: Pick<InteractionDescriptor, "inputs">): InteractionInputDescriptor[];
49
+ export declare function defaultFormInputs(descriptor: Pick<InteractionDescriptor, "inputs">, values?: Readonly<Record<string, unknown>>): InteractionInputDescriptor[];
50
50
  //# sourceMappingURL=InteractionForm.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"InteractionForm.d.ts","sourceRoot":"","sources":["../../src/components/InteractionForm.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"InteractionForm.d.ts","sourceRoot":"","sources":["../../src/components/InteractionForm.tsx"],"names":[],"mappings":"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"}
@@ -7,6 +7,7 @@ import { Select, SelectContent, SelectItem, SelectTrigger, } from "../internal/u
7
7
  import { surfaceStyle } from "../theme/derive.js";
8
8
  import { useTheme, useThemeCssVars } from "../theme/ThemeProvider.js";
9
9
  import { interactionLabel } from "../utils/interaction-labels.js";
10
+ import { resolveInputDomain, resolveInteractionInputs, } from "../utils/interaction-inputs.js";
10
11
  import { useChromeSuppression } from "./ChromeSuppressionContext.js";
11
12
  import { ThemedButton } from "./ThemedButton.js";
12
13
  const EMPTY_FIELD_ERRORS = [];
@@ -22,13 +23,13 @@ export function InteractionForm({ descriptor, handle, fields, hiddenFields, rend
22
23
  const hidden = useMemo(() => new Set(hiddenFields ?? []), [hiddenFields]);
23
24
  const visibleInputs = useMemo(() => {
24
25
  const allowed = fields ? new Set(fields) : null;
25
- return defaultFormInputs(descriptor).filter((input) => {
26
+ return defaultFormInputs(descriptor, handle.values).filter((input) => {
26
27
  const key = input.key;
27
28
  if (allowed && !allowed.has(key))
28
29
  return false;
29
30
  return !hidden.has(key);
30
31
  });
31
- }, [descriptor, fields, hidden]);
32
+ }, [descriptor, fields, hidden, handle.values]);
32
33
  const currentValidation = validation;
33
34
  const fieldErrors = (currentValidation?.fieldErrors ?? {});
34
35
  const missing = new Set(currentValidation?.missing ?? []);
@@ -94,10 +95,10 @@ export function InteractionForm({ descriptor, handle, fields, hiddenFields, rend
94
95
  }, children: visibleInputs.map((input) => {
95
96
  const key = input.key;
96
97
  return (_jsx(InteractionField, { descriptor: descriptor, inputKey: key, handle: handle, errors: fieldErrors[key] ?? [], missing: missing.has(key), disabled: isDisabled, render: renderFields?.[key] }, input.key));
97
- }) })) : (_jsx("span", { style: {
98
- fontSize: theme.typography.fontSize.sm,
99
- color: theme.semantic.text.muted,
100
- }, children: "No visible fields are required. Board or card selection may complete this interaction." }));
98
+ }) })) : null;
99
+ if (visibleInputs.length === 0 && !handle.isReady) {
100
+ throw new Error(`InteractionForm '${descriptor.interactionKey}' has required inputs that cannot be rendered by the default form. Provide renderFields, select on a surface, or use a default-renderable input domain.`);
101
+ }
101
102
  const formErrorContent = formErrors.length > 0 ? (_jsx("div", { role: "alert", style: {
102
103
  display: "flex",
103
104
  flexDirection: "column",
@@ -140,7 +141,7 @@ export function InteractionField({ descriptor, inputKey, handle, errors = EMPTY_
140
141
  const input = descriptor.inputs.find((candidate) => candidate.key === inputKey);
141
142
  if (!input)
142
143
  return null;
143
- const typedInput = input;
144
+ const typedInput = resolveInputDomain(input, handle.values);
144
145
  const value = handle.values[inputKey];
145
146
  const props = {
146
147
  descriptor,
@@ -160,8 +161,8 @@ export function InteractionField({ descriptor, inputKey, handle, errors = EMPTY_
160
161
  export function hasDefaultInteractionFormFields(descriptor) {
161
162
  return defaultFormInputs(descriptor).length > 0;
162
163
  }
163
- export function defaultFormInputs(descriptor) {
164
- return descriptor.inputs.filter((input) => {
164
+ export function defaultFormInputs(descriptor, values = {}) {
165
+ return resolveInteractionInputs(descriptor, values).filter((input) => {
165
166
  switch (input.domain.type) {
166
167
  case "choice":
167
168
  case "choiceList":
@@ -252,12 +253,24 @@ function ChoiceDescription({ choice }) {
252
253
  fontSize: theme.typography.fontSize.xs,
253
254
  }, children: message }));
254
255
  }
256
+ const NULL_CHOICE_SELECT_VALUE = "__dreamboard_null_choice__";
257
+ function choiceRenderKey(choice) {
258
+ return choice.value === null ? NULL_CHOICE_SELECT_VALUE : choice.value;
259
+ }
260
+ function encodeChoiceSelectValue(value) {
261
+ if (value === null)
262
+ return NULL_CHOICE_SELECT_VALUE;
263
+ return typeof value === "string" ? value : undefined;
264
+ }
265
+ function decodeChoiceSelectValue(value) {
266
+ return value === NULL_CHOICE_SELECT_VALUE ? null : value;
267
+ }
255
268
  function ChoiceField({ input, value, setValue, errors, missing, disabled, domain, }) {
256
269
  const theme = useTheme();
257
270
  const themeCssVars = useThemeCssVars();
258
271
  const choices = domain.choices ?? [];
259
272
  const controlId = useId();
260
- const selectedChoice = typeof value === "string"
273
+ const selectedChoice = typeof value === "string" || value === null
261
274
  ? choices.find((choice) => choice.value === value)
262
275
  : undefined;
263
276
  if (choices.length > 0 && choices.length <= 3) {
@@ -267,13 +280,13 @@ function ChoiceField({ input, value, setValue, errors, missing, disabled, domain
267
280
  gap: theme.space[1],
268
281
  }, children: choices.map((choice) => {
269
282
  const selected = value === choice.value;
270
- return (_jsx(ThemedButton, { type: "button", variant: selected ? "primary" : "secondary", size: "sm", disabled: disabled || choice.disabled, "aria-pressed": selected, title: choice.disabledReason ?? choice.description, onClick: () => setValue(choice.value), className: "h-8 px-3 text-sm", children: _jsx(ChoiceOptionLabel, { choice: choice }) }, choice.value));
283
+ return (_jsx(ThemedButton, { type: "button", variant: selected ? "primary" : "secondary", size: "sm", disabled: disabled || choice.disabled, "aria-pressed": selected, title: choice.disabledReason ?? choice.description, onClick: () => setValue(choice.value), className: "h-8 px-3 text-sm", children: _jsx(ChoiceOptionLabel, { choice: choice }) }, choiceRenderKey(choice)));
271
284
  }) }) }));
272
285
  }
273
- return (_jsxs(FieldFrame, { label: labelForInput(input), controlId: controlId, errors: errors, missing: missing, children: [_jsxs(Select, { disabled: disabled, value: typeof value === "string" ? value : undefined, onValueChange: (next) => setValue(next), children: [_jsx(SelectTrigger, { id: controlId, size: "sm", className: "w-full bg-white", children: _jsx("span", { "data-slot": "select-value", children: selectedChoice ? (_jsx(ChoiceOptionLabel, { choice: selectedChoice })) : (_jsx("span", { style: { color: theme.semantic.text.muted }, children: "Choose..." })) }) }), _jsx(SelectContent, { style: {
286
+ return (_jsxs(FieldFrame, { label: labelForInput(input), controlId: controlId, errors: errors, missing: missing, children: [_jsxs(Select, { disabled: disabled, value: encodeChoiceSelectValue(value), onValueChange: (next) => setValue(decodeChoiceSelectValue(next)), children: [_jsx(SelectTrigger, { id: controlId, size: "sm", className: "w-full bg-white", children: _jsx("span", { "data-slot": "select-value", children: selectedChoice ? (_jsx(ChoiceOptionLabel, { choice: selectedChoice })) : (_jsx("span", { style: { color: theme.semantic.text.muted }, children: "Choose..." })) }) }), _jsx(SelectContent, { style: {
274
287
  ...themeCssVars,
275
288
  fontFamily: theme.typography.fontFamily.body,
276
- }, children: choices.map((choice) => (_jsx(SelectItem, { value: choice.value, textValue: choice.label, disabled: choice.disabled, children: _jsx(ChoiceOptionLabel, { choice: choice }) }, choice.value))) })] }), _jsx(ChoiceDescription, { choice: selectedChoice })] }));
289
+ }, children: choices.map((choice) => (_jsx(SelectItem, { value: choiceRenderKey(choice), textValue: choice.label, disabled: choice.disabled, children: _jsx(ChoiceOptionLabel, { choice: choice }) }, choiceRenderKey(choice)))) })] }), _jsx(ChoiceDescription, { choice: selectedChoice })] }));
277
290
  }
278
291
  function ChoiceListField({ input, value, setValue, errors, missing, disabled, domain, }) {
279
292
  const theme = useTheme();
@@ -300,10 +313,11 @@ function ChoiceListField({ input, value, setValue, errors, missing, disabled, do
300
313
  justifyContent: "space-between",
301
314
  gap: theme.space[2],
302
315
  }, children: [_jsx("span", { children: labelForInput(input) }), meta ? (_jsx("span", { style: { color: theme.semantic.text.muted }, children: meta })) : null] }), errors: errors, missing: missing, children: _jsx("span", { style: { display: "flex", flexWrap: "wrap", gap: theme.space[1] }, children: (domain.choices ?? []).map((choice) => {
303
- const checked = selected.has(choice.value);
316
+ const value = choice.value;
317
+ const checked = selected.has(value);
304
318
  return (_jsx(ThemedButton, { type: "button", variant: checked ? "primary" : "secondary", size: "sm", disabled: disabled ||
305
319
  choice.disabled ||
306
- (!checked && selected.size >= max), "aria-pressed": checked, title: choice.disabledReason ?? choice.description, onClick: () => toggle(choice.value), className: "h-8 px-3 text-sm", children: _jsx(ChoiceOptionLabel, { choice: choice }) }, choice.value));
320
+ (!checked && selected.size >= max), "aria-pressed": checked, title: choice.disabledReason ?? choice.description, onClick: () => toggle(value), className: "h-8 px-3 text-sm", children: _jsx(ChoiceOptionLabel, { choice: choice }) }, value));
307
321
  }) }) }));
308
322
  }
309
323
  function ResourceMapField({ input, value, setValue, errors, missing, disabled, domain, }) {
@@ -1 +1 @@
1
- {"version":3,"file":"PrimaryActionButton.d.ts","sourceRoot":"","sources":["../../src/components/PrimaryActionButton.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,EAIL,KAAK,aAAa,EAClB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAGf,OAAO,EAEL,KAAK,UAAU,EACf,KAAK,aAAa,EACnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EACV,iBAAiB,EACjB,sBAAsB,EACvB,MAAM,kCAAkC,CAAC;AAG1C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iDAAiD,CAAC;AAE7F,oDAAoD;AACpD,MAAM,MAAM,sBAAsB,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;AAE/D,MAAM,WAAW,wBAAwB,CACvC,MAAM,SAAS,sBAAsB,GAAG,sBAAsB;IAE9D;;;;;OAKG;IACH,MAAM,EAAE,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAClC;;;;OAIG;IACH,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB;;;OAGG;IACH,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB;;;;OAIG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,+EAA+E;IAC/E,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,0EAA0E;IAC1E,aAAa,CAAC,EAAE,qBAAqB,CAAC;IACtC;;;OAGG;IACH,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC;;;;;;;;;OASG;IACH,SAAS,CAAC,EAAE,sBAAsB,CAAC;IACnC,sEAAsE;IACtE,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,SAAS,sBAAsB,GAAG,sBAAsB,EAC9D,EACA,MAAM,EACN,OAAmB,EACnB,IAAW,EACX,KAAK,EACL,KAAY,EACZ,aAAa,EACb,IAAI,EACJ,MAAM,EACN,SAAkB,EAClB,KAAK,EACL,SAAS,GACV,EAAE,wBAAwB,CAAC,MAAM,CAAC,2CA+KlC"}
1
+ {"version":3,"file":"PrimaryActionButton.d.ts","sourceRoot":"","sources":["../../src/components/PrimaryActionButton.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,EAIL,KAAK,aAAa,EAClB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAGf,OAAO,EAEL,KAAK,UAAU,EACf,KAAK,aAAa,EACnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EACV,iBAAiB,EACjB,sBAAsB,EACvB,MAAM,kCAAkC,CAAC;AAO1C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iDAAiD,CAAC;AAE7F,oDAAoD;AACpD,MAAM,MAAM,sBAAsB,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;AAE/D,MAAM,WAAW,wBAAwB,CACvC,MAAM,SAAS,sBAAsB,GAAG,sBAAsB;IAE9D;;;;;OAKG;IACH,MAAM,EAAE,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAClC;;;;OAIG;IACH,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB;;;OAGG;IACH,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB;;;;OAIG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,+EAA+E;IAC/E,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,0EAA0E;IAC1E,aAAa,CAAC,EAAE,qBAAqB,CAAC;IACtC;;;OAGG;IACH,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC;;;;;;;;;OASG;IACH,SAAS,CAAC,EAAE,sBAAsB,CAAC;IACnC,sEAAsE;IACtE,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,SAAS,sBAAsB,GAAG,sBAAsB,EAC9D,EACA,MAAM,EACN,OAAmB,EACnB,IAAW,EACX,KAAK,EACL,KAAY,EACZ,aAAa,EACb,IAAI,EACJ,MAAM,EACN,SAAkB,EAClB,KAAK,EACL,SAAS,GACV,EAAE,wBAAwB,CAAC,MAAM,CAAC,2CAyLlC"}
@@ -36,6 +36,7 @@ import { motion } from "framer-motion";
36
36
  import { useTheme } from "../theme/ThemeProvider.js";
37
37
  import { intentForVariant, } from "../theme/derive.js";
38
38
  import { interactionLabel } from "../utils/interaction-labels.js";
39
+ import { submitInteractionDraft, submitInteractionParams, } from "../primitives/interaction-submit.js";
39
40
  import { ThemedButton } from "./ThemedButton.js";
40
41
  /**
41
42
  * @see PrimaryActionButtonProps
@@ -128,16 +129,16 @@ export function PrimaryActionButton({ handle, variant = "primary", size = "lg",
128
129
  setPending(true);
129
130
  try {
130
131
  if (params !== undefined) {
131
- await handle.submit(params);
132
+ await submitInteractionParams(handle, params, {}, {
133
+ unhandledError: "ignore",
134
+ });
132
135
  }
133
136
  else {
134
- await handle.submitDraft();
137
+ await submitInteractionDraft(handle, {}, {
138
+ unhandledError: "ignore",
139
+ });
135
140
  }
136
141
  }
137
- catch {
138
- // Descriptor availability is authoritative; submit errors
139
- // surface via the runtime's error channel.
140
- }
141
142
  finally {
142
143
  setPending(false);
143
144
  }
@@ -1,38 +1,72 @@
1
- /**
2
- * Displays resource counts with icons and animated updates.
3
- *
4
- * The chip frame (border, fill, shadow, padding, gap) is sourced from
5
- * the active {@link useTheme}. Authors can still override per-chip
6
- * colours via {@link ResourceDisplayConfig.bgColor} /
7
- * {@link ResourceDisplayConfig.iconColor} / {@link ResourceDisplayConfig.textColor}
8
- * (Tailwind class names) — those win over the theme defaults so existing
9
- * callers that pass game-specific palettes (Catan: wheat/wood/brick…)
10
- * keep their look.
11
- */
12
- import { type ComponentType, type ReactNode } from "react";
1
+ import { type ComponentType, type HTMLAttributes, type ReactElement, type ReactNode } from "react";
13
2
  import type { ResourceId } from "@dreamboard/manifest-contract";
14
- export interface ResourceDisplayConfig {
15
- type: ResourceId;
3
+ import { type PrimitiveCommonProps } from "../primitives/index.js";
4
+ export interface ResourceDisplayConfig<Resource extends string = ResourceId> {
5
+ type: Resource;
16
6
  label: string;
17
7
  icon: ReactNode | ComponentType<{
18
8
  className?: string;
19
9
  strokeWidth?: number;
20
- "aria-hidden"?: string;
10
+ "aria-hidden"?: boolean | "true" | "false";
21
11
  }>;
22
12
  iconColor?: string;
23
13
  bgColor?: string;
24
14
  textColor?: string;
25
15
  }
26
- export interface ResourceCounterProps {
27
- resources: ResourceDisplayConfig[];
28
- counts: Record<ResourceId, number>;
29
- layout?: "row" | "grid" | "compact";
30
- /** Number of columns for grid layout */
31
- columns?: number;
32
- showZero?: boolean;
33
- size?: "sm" | "md" | "lg";
34
- onResourceClick?: (resourceType: ResourceId) => void;
16
+ export interface ResourceCounterItemState<Resource extends string = ResourceId> {
17
+ type: Resource;
18
+ label: string;
19
+ icon: ResourceDisplayConfig<Resource>["icon"];
20
+ iconColor?: string;
21
+ bgColor?: string;
22
+ textColor?: string;
23
+ count: number;
24
+ isZero: boolean;
25
+ interactive: boolean;
26
+ select: () => void;
27
+ renderIcon: (props?: ResourceIconProps) => ReactNode;
28
+ dataAttributes: {
29
+ "data-resource-id": Resource;
30
+ "data-resource-count": number;
31
+ "data-resource-zero": boolean | undefined;
32
+ "data-interactive": boolean | undefined;
33
+ };
34
+ }
35
+ export interface ResourceIconProps {
35
36
  className?: string;
37
+ strokeWidth?: number;
38
+ "aria-hidden"?: boolean | "true" | "false";
39
+ }
40
+ export type ResourceCounterRootProps<Resource extends string = ResourceId> = Omit<PrimitiveCommonProps, "children"> & Omit<HTMLAttributes<HTMLElement>, "children"> & {
41
+ resources: ReadonlyArray<ResourceDisplayConfig<Resource>>;
42
+ counts: Partial<Record<Resource, number>>;
43
+ zero?: "show" | "hide";
44
+ onResourceClick?: (resourceType: Resource) => void;
45
+ children: ReactNode;
46
+ };
47
+ export type BoundResourceCounterRootProps<Resource extends string = ResourceId> = Omit<ResourceCounterRootProps<Resource>, "resources">;
48
+ export type ResourceCounterProps<Resource extends string = ResourceId> = ResourceCounterRootProps<Resource>;
49
+ export type ResourceCounterPartProps<Resource extends string = ResourceId> = Omit<PrimitiveCommonProps, "children"> & Omit<HTMLAttributes<HTMLElement>, "children"> & {
50
+ children?: ReactNode | ((resource: ResourceCounterItemState<Resource>) => ReactNode);
51
+ };
52
+ export declare function ResourceCounterRoot<Resource extends string = ResourceId>({ resources, counts, zero, onResourceClick, children, "aria-label": ariaLabel, ...props }: ResourceCounterRootProps<Resource>): ReactElement<unknown, string | import("react").JSXElementConstructor<any>>;
53
+ export declare function ResourceCounterItem<Resource extends string = ResourceId>({ children, onClick, "aria-label": ariaLabel, ...props }: ResourceCounterPartProps<Resource>): ReactElement<unknown, string | import("react").JSXElementConstructor<any>>;
54
+ export declare function ResourceCounterIcon<Resource extends string = ResourceId>({ className, strokeWidth, "aria-hidden": ariaHidden, }: ResourceIconProps): ReactNode;
55
+ export declare function ResourceCounterCount<Resource extends string = ResourceId>({ children, ...props }: ResourceCounterPartProps<Resource>): ReactElement<unknown, string | import("react").JSXElementConstructor<any>>;
56
+ export declare function ResourceCounterLabel<Resource extends string = ResourceId>({ children, ...props }: ResourceCounterPartProps<Resource>): ReactElement<unknown, string | import("react").JSXElementConstructor<any>>;
57
+ export interface ResourceCounterComponents<Resource extends string = ResourceId> {
58
+ Root(props: BoundResourceCounterRootProps<Resource>): ReactElement;
59
+ Item(props: ResourceCounterPartProps<Resource>): ReactElement;
60
+ Icon(props: ResourceIconProps): ReactNode;
61
+ Count(props: ResourceCounterPartProps<Resource>): ReactElement;
62
+ Label(props: ResourceCounterPartProps<Resource>): ReactElement;
36
63
  }
37
- export declare function ResourceCounter({ resources, counts, layout, columns, showZero, size, onResourceClick, className, }: ResourceCounterProps): import("react/jsx-runtime").JSX.Element;
64
+ export declare function createResourceCounter<Resource extends string>(resources: ReadonlyArray<ResourceDisplayConfig<Resource>>): ResourceCounterComponents<Resource>;
65
+ export declare const ResourceCounter: {
66
+ Root: typeof ResourceCounterRoot;
67
+ Item: typeof ResourceCounterItem;
68
+ Icon: typeof ResourceCounterIcon;
69
+ Count: typeof ResourceCounterCount;
70
+ Label: typeof ResourceCounterLabel;
71
+ };
38
72
  //# sourceMappingURL=ResourceCounter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ResourceCounter.d.ts","sourceRoot":"","sources":["../../src/components/ResourceCounter.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,EAAiB,KAAK,aAAa,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAC1E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAahE,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EACA,SAAS,GACT,aAAa,CAAC;QACZ,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,CAAC,CAAC;IACP,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,qBAAqB,EAAE,CAAC;IACnC,MAAM,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACnC,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,SAAS,CAAC;IACpC,wCAAwC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,eAAe,CAAC,EAAE,CAAC,YAAY,EAAE,UAAU,KAAK,IAAI,CAAC;IACrD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,eAAe,CAAC,EAC9B,SAAS,EACT,MAAM,EACN,MAAc,EACd,OAAW,EACX,QAAe,EACf,IAAW,EACX,eAAe,EACf,SAAS,GACV,EAAE,oBAAoB,2CAkNtB"}
1
+ {"version":3,"file":"ResourceCounter.d.ts","sourceRoot":"","sources":["../../src/components/ResourceCounter.tsx"],"names":[],"mappings":"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"}