@dreamboard-games/sdk 0.4.0-alpha.1 → 0.4.0-alpha.3

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 (79) hide show
  1. package/REFERENCE.md +1318 -201
  2. package/dist/{ResourceCounter-BTXklCEZ.d.ts → ResourceCounter-BuiNstXs.d.ts} +5 -1
  3. package/dist/{ThemeProvider-DvMl17Ny.d.ts → ThemeProvider-B1sIoBlX.d.ts} +1 -1
  4. package/dist/{attributes-BrZtP9az.d.ts → attributes-DbvyMbXw.d.ts} +17 -2
  5. package/dist/authoring/index.d.ts +66 -0
  6. package/dist/authoring/index.js +560 -0
  7. package/dist/authoring/index.js.map +1 -0
  8. package/dist/browser-interaction.d.ts +205 -5
  9. package/dist/browser-interaction.js +14 -2
  10. package/dist/{chunk-7W6TQO3X.js → chunk-45FI6XII.js} +613 -366
  11. package/dist/chunk-45FI6XII.js.map +1 -0
  12. package/dist/{chunk-3K362ZKR.js → chunk-6JQFGSLD.js} +202 -38
  13. package/dist/chunk-6JQFGSLD.js.map +1 -0
  14. package/dist/{chunk-IUGKW2GS.js → chunk-BKD7XAWB.js} +6 -2
  15. package/dist/chunk-BKD7XAWB.js.map +1 -0
  16. package/dist/{chunk-XXBSIPJX.js → chunk-CP35NPPY.js} +131 -59
  17. package/dist/chunk-CP35NPPY.js.map +1 -0
  18. package/dist/chunk-DQ7GCD6C.js +12 -0
  19. package/dist/chunk-DQ7GCD6C.js.map +1 -0
  20. package/dist/{chunk-XJYUSD5F.js → chunk-FWVV2X74.js} +2 -2
  21. package/dist/chunk-K5ZRJTZZ.js +328 -0
  22. package/dist/chunk-K5ZRJTZZ.js.map +1 -0
  23. package/dist/{chunk-7LZZEI25.js → chunk-N6ZDIMRB.js} +1 -1
  24. package/dist/chunk-N6ZDIMRB.js.map +1 -0
  25. package/dist/chunk-O6M6PN4E.js +1225 -0
  26. package/dist/chunk-O6M6PN4E.js.map +1 -0
  27. package/dist/{chunk-AEUXCFGM.js → chunk-PF7L4BMG.js} +1 -8
  28. package/dist/{chunk-AEUXCFGM.js.map → chunk-PF7L4BMG.js.map} +1 -1
  29. package/dist/{chunk-CZMFAS3E.js → chunk-WOWFONLZ.js} +517 -1274
  30. package/dist/chunk-WOWFONLZ.js.map +1 -0
  31. package/dist/{chunk-MALRKLRR.js → chunk-WUIVY2KE.js} +301 -12
  32. package/dist/chunk-WUIVY2KE.js.map +1 -0
  33. package/dist/codegen.d.ts +11 -3
  34. package/dist/codegen.js +1 -1
  35. package/dist/{components-Dqr_LuZJ.d.ts → components-BbWPnZCF.d.ts} +37 -6
  36. package/dist/{hex-board-view-UCUjMALd.d.ts → hex-board-view-Kz9Q_zsv.d.ts} +1 -1
  37. package/dist/index-BLwlj7mO.d.ts +191 -0
  38. package/dist/index.js +2 -1
  39. package/dist/package-set.d.ts +2 -2
  40. package/dist/package-set.js +2 -1
  41. package/dist/player-state-Cqpyeql0.d.ts +371 -0
  42. package/dist/protocol-BP193lva.d.ts +267 -0
  43. package/dist/reducer/advanced.js +1 -1
  44. package/dist/reducer-contract.js +1 -1
  45. package/dist/reducer.js +2 -2
  46. package/dist/reducer.js.map +1 -1
  47. package/dist/runtime/primitives.d.ts +10 -10
  48. package/dist/runtime/primitives.js +9 -7
  49. package/dist/runtime/runtime-api.d.ts +2 -2
  50. package/dist/runtime/workspace-contract.d.ts +21 -167
  51. package/dist/runtime/workspace-contract.js +7 -6
  52. package/dist/runtime-api-BJharVaj.d.ts +198 -0
  53. package/dist/runtime-api-C6aWo9c0.d.ts +95 -0
  54. package/dist/runtime.d.ts +36 -32
  55. package/dist/runtime.js +87 -797
  56. package/dist/runtime.js.map +1 -1
  57. package/dist/testing.d.ts +254 -140
  58. package/dist/testing.js +964 -149
  59. package/dist/testing.js.map +1 -1
  60. package/dist/types-CYeN0wLK.d.ts +29 -0
  61. package/dist/{types-BqzHkNMA.d.ts → types-DJj5MJkl.d.ts} +32 -5
  62. package/dist/types.d.ts +13 -8
  63. package/dist/ui/components.d.ts +4 -5
  64. package/dist/ui/components.js +19 -1
  65. package/dist/ui/player-state.d.ts +2 -365
  66. package/dist/{ui-contract-W2-kxObe.d.ts → ui-contract-CY7cxsCC.d.ts} +16 -26
  67. package/dist/ui.d.ts +7 -8
  68. package/dist/ui.js +20 -2
  69. package/package.json +25 -19
  70. package/dist/chunk-3K362ZKR.js.map +0 -1
  71. package/dist/chunk-7LZZEI25.js.map +0 -1
  72. package/dist/chunk-7W6TQO3X.js.map +0 -1
  73. package/dist/chunk-CZMFAS3E.js.map +0 -1
  74. package/dist/chunk-IUGKW2GS.js.map +0 -1
  75. package/dist/chunk-MALRKLRR.js.map +0 -1
  76. package/dist/chunk-XXBSIPJX.js.map +0 -1
  77. package/dist/hex-color-MhOyuY-o.d.ts +0 -8
  78. package/dist/runtime-api-BXd70c2e.d.ts +0 -490
  79. /package/dist/{chunk-XJYUSD5F.js.map → chunk-FWVV2X74.js.map} +0 -0
@@ -1,14 +1,14 @@
1
1
  import * as react from 'react';
2
2
  import { CSSProperties, ReactNode, HTMLAttributes, ButtonHTMLAttributes, InputHTMLAttributes, ReactElement } from 'react';
3
3
  import * as react_jsx_runtime from 'react/jsx-runtime';
4
- import { $ as Theme, a1 as ThemeOverride, L as InteractiveTargetState$1, A as AnyHexBoardInput, d as BoardSpaceIdOf, u as HexGridBoardProps, r as HexBoardView } from './hex-board-view-UCUjMALd.js';
5
- import { a as ThemePresetId } from './ThemeProvider-DvMl17Ny.js';
6
- import { a as InteractionDescriptor, Z as ZoneHandlesSnapshot, c as PluginSessionState, P as PlayerId, I as InputDomain, b as InteractionInputDescriptor } from './runtime-api-BXd70c2e.js';
4
+ import { $ as Theme, a1 as ThemeOverride, L as InteractiveTargetState$1, A as AnyHexBoardInput, d as BoardSpaceIdOf, u as HexGridBoardProps, r as HexBoardView } from './hex-board-view-Kz9Q_zsv.js';
5
+ import { a as ThemePresetId } from './ThemeProvider-B1sIoBlX.js';
6
+ import { a as InteractionDescriptor, Z as ZoneHandlesSnapshot, I as InputDomain, b as InteractionInputDescriptor } from './runtime-api-BJharVaj.js';
7
7
  import { ViewCard } from './types.js';
8
8
  import { P as PrimitiveCommonProps } from './primitive-props-BNHDkgd7.js';
9
- import { a as BrowserInteractionAttributeMap } from './attributes-BrZtP9az.js';
10
- import { Player } from './ui/player-state.js';
11
- import { H as HexColor } from './hex-color-MhOyuY-o.js';
9
+ import { a as BrowserInteractionAttributeMap } from './attributes-DbvyMbXw.js';
10
+ import { a as PluginSessionState, P as PlayerId } from './runtime-api-C6aWo9c0.js';
11
+ import { t as Player, j as HexColor } from './player-state-Cqpyeql0.js';
12
12
 
13
13
  interface UIRootProps {
14
14
  /**
@@ -361,12 +361,12 @@ declare const Board: {
361
361
  * Hook to access plugin session metadata.
362
362
  * Returns session initialization status and IDs.
363
363
  *
364
- * @returns Plugin session state with status, sessionId, controllablePlayerIds, and controllingPlayerId
364
+ * @returns Plugin session state with status, sessionId, and controllingPlayerId
365
365
  *
366
366
  * @example
367
367
  * ```tsx
368
368
  * function MyPluginComponent() {
369
- * const { status, sessionId, controllablePlayerIds, controllingPlayerId } = usePluginSession();
369
+ * const { status, sessionId, controllingPlayerId } = usePluginSession();
370
370
  *
371
371
  * if (status === "loading") {
372
372
  * return <div>Initializing...</div>;
@@ -375,8 +375,7 @@ declare const Board: {
375
375
  * return (
376
376
  * <div>
377
377
  * <p>Session: {sessionId}</p>
378
- * <p>Can control: {controllablePlayerIds.join(", ")}</p>
379
- * <p>Currently controlling: {controllingPlayerId}</p>
378
+ * <p>Current perspective: {controllingPlayerId}</p>
380
379
  * </div>
381
380
  * );
382
381
  * }
@@ -391,7 +390,6 @@ type GamePlayerEntry<PlayerIdValue extends string = PlayerId> = GamePlayer<Playe
391
390
  index: number;
392
391
  isActive: boolean;
393
392
  isCurrentPlayer: boolean;
394
- isControllable: boolean;
395
393
  };
396
394
  interface GamePlayersState<PlayerIdValue extends string = PlayerId> {
397
395
  byId: ReadonlyMap<PlayerIdValue, GamePlayer<PlayerIdValue>>;
@@ -403,7 +401,6 @@ interface GamePlayersState<PlayerIdValue extends string = PlayerId> {
403
401
  interface GameMeState<PlayerIdValue extends string = PlayerId> {
404
402
  playerId: PlayerIdValue | null;
405
403
  player: GamePlayer<PlayerIdValue> | null;
406
- controllablePlayerIds: readonly PlayerIdValue[];
407
404
  canAct: boolean;
408
405
  }
409
406
  interface GameTurnState<PlayerIdValue extends string = PlayerId, PhaseValue extends string = string> {
@@ -452,13 +449,18 @@ interface GameRootProps<ViewValue = unknown, PlayerIdValue extends string = Play
452
449
  interface GameChromeProps<ViewValue = unknown, PlayerIdValue extends string = PlayerId, PhaseValue extends string = string, Interaction extends string = string> {
453
450
  children: (state: GameChromeState<ViewValue, PlayerIdValue, PhaseValue, Interaction>) => ReactNode;
454
451
  }
452
+ interface GameViewportProps extends HTMLAttributes<HTMLDivElement> {
453
+ children?: ReactNode;
454
+ }
455
455
  type GameActionErrorHandler = (error: unknown) => void;
456
456
  declare function useGameActionError(): GameActionErrorHandler | null;
457
457
  declare function GameRoot<ViewValue = unknown, PlayerIdValue extends string = PlayerId, PhaseValue extends string = string>({ children, onActionError, }: GameRootProps<ViewValue, PlayerIdValue, PhaseValue>): react_jsx_runtime.JSX.Element;
458
458
  declare function GameChrome<ViewValue = unknown, PlayerIdValue extends string = PlayerId, PhaseValue extends string = string, Interaction extends string = string>({ children, }: GameChromeProps<ViewValue, PlayerIdValue, PhaseValue, Interaction>): react_jsx_runtime.JSX.Element;
459
+ declare function GameViewport({ children, style, ...props }: GameViewportProps): react_jsx_runtime.JSX.Element;
459
460
  declare const Game: {
460
461
  Root: typeof GameRoot;
461
462
  Chrome: typeof GameChrome;
463
+ Viewport: typeof GameViewport;
462
464
  };
463
465
 
464
466
  /**
@@ -844,8 +846,6 @@ interface PlayerRosterEntry {
844
846
  index: number;
845
847
  isActive: boolean;
846
848
  isCurrentPlayer: boolean;
847
- isControllable: boolean;
848
- canSwitchToPlayer: boolean;
849
849
  score?: number;
850
850
  scoreLabel?: string;
851
851
  badges: readonly PlayerRosterBadge[];
@@ -868,11 +868,6 @@ declare function PlayerRosterList({ children, ...props }: PlayerRosterListProps)
868
868
  declare function PlayerRosterEmpty({ children }: {
869
869
  children?: ReactNode;
870
870
  }): react_jsx_runtime.JSX.Element | null;
871
- type PlayerRosterSwitchButtonProps = Omit<PrimitiveCommonProps, "children"> & ButtonHTMLAttributes<HTMLButtonElement> & {
872
- player: PlayerRosterEntry;
873
- children?: ReactNode;
874
- };
875
- declare function PlayerRosterSwitchButton({ player, disabled, onClick, ...props }: PlayerRosterSwitchButtonProps): ReactElement<unknown, string | react.JSXElementConstructor<any>>;
876
871
  type PlayerRosterPartProps = PrimitiveCommonProps & HTMLAttributes<HTMLElement> & {
877
872
  player: PlayerRosterEntry;
878
873
  };
@@ -882,7 +877,6 @@ interface PlayerRosterComponents {
882
877
  Empty(props: {
883
878
  children?: ReactNode;
884
879
  }): ReactElement | null;
885
- SwitchButton(props: PlayerRosterSwitchButtonProps): ReactElement;
886
880
  Name(props: PlayerRosterPartProps): ReactElement;
887
881
  Score(props: PlayerRosterPartProps): ReactElement | null;
888
882
  Badges(props: PlayerRosterPartProps): ReactElement | null;
@@ -1083,13 +1077,9 @@ type TypedPlayerRosterListProps<Player extends string> = Omit<PlayerRosterListPr
1083
1077
  type TypedPlayerRosterPartProps<Player extends string> = Omit<PlayerRosterPartProps, "player"> & {
1084
1078
  player: TypedPlayerRosterEntry<Player>;
1085
1079
  };
1086
- type TypedPlayerRosterSwitchButtonProps<Player extends string> = Omit<PlayerRosterSwitchButtonProps, "player"> & {
1087
- player: TypedPlayerRosterEntry<Player>;
1088
- };
1089
- type TypedPlayerRoster<Contract extends UIContract> = Omit<PlayerRosterComponents, "Root" | "List" | "SwitchButton" | "Name" | "Score" | "Badges"> & {
1080
+ type TypedPlayerRoster<Contract extends UIContract> = Omit<PlayerRosterComponents, "Root" | "List" | "Name" | "Score" | "Badges"> & {
1090
1081
  Root(props: TypedPlayerRosterRootProps<PlayerKey<Contract>>): ReactElement | null;
1091
1082
  List(props: TypedPlayerRosterListProps<PlayerKey<Contract>>): ReactElement;
1092
- SwitchButton(props: TypedPlayerRosterSwitchButtonProps<PlayerKey<Contract>>): ReactElement;
1093
1083
  Name(props: TypedPlayerRosterPartProps<PlayerKey<Contract>>): ReactElement;
1094
1084
  Score(props: TypedPlayerRosterPartProps<PlayerKey<Contract>>): ReactElement | null;
1095
1085
  Badges(props: TypedPlayerRosterPartProps<PlayerKey<Contract>>): ReactElement | null;
@@ -1166,4 +1156,4 @@ interface DreamboardUI<Contract extends UIContract = RegisteredUI> {
1166
1156
  readonly Board: TypedBoard<Contract>;
1167
1157
  }
1168
1158
 
1169
- export { InteractionFormPrimitive as $, type DreamboardUI as A, Board as B, type GameActiveActionState as C, Dice as D, GameChrome as E, type GameChromeProps as F, Game as G, type GameChromeState as H, type GameMeState as I, type GamePendingInputState as J, type GamePlayer as K, type GamePlayerEntry as L, type GamePlayersState as M, type GameRenderState as N, GameRoot as O, type GameRootProps as P, type GameTurnState as Q, Interaction as R, InteractionCardInput as S, type InteractionCardInputProps as T, type InteractionCardInputRenderState as U, InteractionDescription as V, InteractionDialog as W, type InteractionDialogProps as X, type InteractionDialogRenderState as Y, type InteractionDialogState as Z, type InteractionFieldPrimitiveProps as _, BoardEdgeTarget as a, type TypedGame as a$, type InteractionFormPrimitiveProps as a0, InteractionInput as a1, type InteractionInputProps as a2, InteractionLabel as a3, type InteractionPartProps as a4, InteractionRoot as a5, type InteractionRootProps as a6, type InteractionRoute as a7, InteractionRoutes as a8, type InteractionRoutesMap as a9, type PlayerRosterListProps as aA, PlayerRosterName as aB, type PlayerRosterPartProps as aC, PlayerRosterRoot as aD, type PlayerRosterRootProps as aE, PlayerRosterScore as aF, PlayerRosterSwitchButton as aG, type PlayerRosterSwitchButtonProps as aH, Prompt as aI, PromptDialog as aJ, type PromptDialogProps as aK, type PromptDialogRenderState as aL, type PromptDialogState as aM, PromptInbox as aN, PromptInboxEmpty as aO, PromptInboxItems as aP, type PromptInboxItemsProps as aQ, PromptInboxRoot as aR, PromptMessage as aS, PromptOption as aT, type PromptOptionProps as aU, type PromptOptionRenderItem as aV, PromptOptions as aW, type PromptOptionsProps as aX, PromptRoot as aY, type PromptRootProps as aZ, PromptTitle as a_, type InteractionRoutesProps as aa, InteractionState as ab, type InteractionStateProps as ac, type InteractionStateSnapshot as ad, InteractionSubmit as ae, type InteractionSubmitProps as af, InteractionSwitch as ag, type InteractionSwitchProps as ah, type InteractionSwitchRenderState as ai, type InteractionSwitchRouteMap as aj, InteractionTrigger as ak, type InteractionTriggerProps as al, InteractionUnavailableMessage as am, InteractionValidationMessage as an, Phase as ao, type PhaseFallback as ap, type PhaseRouteMap as aq, PhaseSwitch as ar, type PhaseSwitchProps as as, PlayerRoster as at, type PlayerRosterBadge as au, PlayerRosterBadges as av, type PlayerRosterComponents as aw, PlayerRosterEmpty as ax, type PlayerRosterEntry as ay, PlayerRosterList as az, type BoardEdgeTargetProps as b, UI as b0, type UIContract as b1, UIRoot as b2, type UIRootProps as b3, type UseZoneCardsOptions as b4, type UseZoneCardsResult as b5, Zone as b6, ZoneCardAction as b7, type ZoneCardActionExtraInputs as b8, type ZoneCardActionProps as b9, normalizeDiceState as bA, useBoardPrimitiveContext as bB, useDicePrimitiveContext as bC, useGameActionError as bD, useInteractionPrimitiveContext as bE, useOptionalZonePrimitiveContext as bF, useResolvedCardTargetValue as bG, useZoneCardContext as bH, useZoneCards as bI, useZonePileContext as bJ, useZonePrimitiveContext as bK, type ZoneCardActionResult as ba, ZoneCardAt as bb, type ZoneCardAtProps as bc, type ZoneCardRenderItem as bd, ZoneItem as be, type ZoneItemProps as bf, ZoneList as bg, type ZoneListProps as bh, ZonePileCards as bi, type ZonePileCardsProps as bj, type ZonePileContextValue as bk, ZonePileCount as bl, type ZonePileCountProps as bm, ZonePileDescription as bn, type ZonePileDescriptionProps as bo, ZonePileLabel as bp, type ZonePileLabelProps as bq, ZonePileRoot as br, type ZonePileRootProps as bs, ZonePileTrigger as bt, type ZonePileTriggerProps as bu, ZoneRoot as bv, type ZoneRootProps as bw, ZoneTopCard as bx, type ZoneTopCardProps as by, createZoneCardRenderItem as bz, BoardHexGrid as c, type BoardHexGridInteractionFilter as d, type BoardHexGridInteractions as e, type BoardHexGridProps as f, BoardHexView as g, type BoardHexViewProps as h, BoardRoot as i, type BoardRootProps as j, BoardSpaceTarget as k, type BoardSpaceTargetProps as l, BoardState as m, type BoardStateProps as n, BoardTarget as o, type BoardTargetExtraInputs as p, type BoardTargetProps as q, BoardVertexTarget as r, type BoardVertexTargetProps as s, type DiceComponents as t, DiceRoot as u, type DiceRootProps as v, type DiceState as w, type DiceValue as x, DiceValues as y, type DiceValuesProps as z };
1159
+ export { type InteractionDialogState as $, type DreamboardUI as A, Board as B, type GameActiveActionState as C, Dice as D, GameChrome as E, type GameChromeProps as F, Game as G, type GameChromeState as H, type GameMeState as I, type GamePendingInputState as J, type GamePlayer as K, type GamePlayerEntry as L, type GamePlayersState as M, type GameRenderState as N, GameRoot as O, type GameRootProps as P, type GameTurnState as Q, GameViewport as R, type GameViewportProps as S, Interaction as T, InteractionCardInput as U, type InteractionCardInputProps as V, type InteractionCardInputRenderState as W, InteractionDescription as X, InteractionDialog as Y, type InteractionDialogProps as Z, type InteractionDialogRenderState as _, BoardEdgeTarget as a, type TypedGame as a$, type InteractionFieldPrimitiveProps as a0, InteractionFormPrimitive as a1, type InteractionFormPrimitiveProps as a2, InteractionInput as a3, type InteractionInputProps as a4, InteractionLabel as a5, type InteractionPartProps as a6, InteractionRoot as a7, type InteractionRootProps as a8, type InteractionRoute as a9, type PlayerRosterEntry as aA, PlayerRosterList as aB, type PlayerRosterListProps as aC, PlayerRosterName as aD, type PlayerRosterPartProps as aE, PlayerRosterRoot as aF, type PlayerRosterRootProps as aG, PlayerRosterScore as aH, Prompt as aI, PromptDialog as aJ, type PromptDialogProps as aK, type PromptDialogRenderState as aL, type PromptDialogState as aM, PromptInbox as aN, PromptInboxEmpty as aO, PromptInboxItems as aP, type PromptInboxItemsProps as aQ, PromptInboxRoot as aR, PromptMessage as aS, PromptOption as aT, type PromptOptionProps as aU, type PromptOptionRenderItem as aV, PromptOptions as aW, type PromptOptionsProps as aX, PromptRoot as aY, type PromptRootProps as aZ, PromptTitle as a_, InteractionRoutes as aa, type InteractionRoutesMap as ab, type InteractionRoutesProps as ac, InteractionState as ad, type InteractionStateProps as ae, type InteractionStateSnapshot as af, InteractionSubmit as ag, type InteractionSubmitProps as ah, InteractionSwitch as ai, type InteractionSwitchProps as aj, type InteractionSwitchRenderState as ak, type InteractionSwitchRouteMap as al, InteractionTrigger as am, type InteractionTriggerProps as an, InteractionUnavailableMessage as ao, InteractionValidationMessage as ap, Phase as aq, type PhaseFallback as ar, type PhaseRouteMap as as, PhaseSwitch as at, type PhaseSwitchProps as au, PlayerRoster as av, type PlayerRosterBadge as aw, PlayerRosterBadges as ax, type PlayerRosterComponents as ay, PlayerRosterEmpty as az, type BoardEdgeTargetProps as b, UI as b0, type UIContract as b1, UIRoot as b2, type UIRootProps as b3, type UseZoneCardsOptions as b4, type UseZoneCardsResult as b5, Zone as b6, ZoneCardAction as b7, type ZoneCardActionExtraInputs as b8, type ZoneCardActionProps as b9, normalizeDiceState as bA, useBoardPrimitiveContext as bB, useDicePrimitiveContext as bC, useGameActionError as bD, useInteractionPrimitiveContext as bE, useOptionalZonePrimitiveContext as bF, useResolvedCardTargetValue as bG, useZoneCardContext as bH, useZoneCards as bI, useZonePileContext as bJ, useZonePrimitiveContext as bK, type ZoneCardActionResult as ba, ZoneCardAt as bb, type ZoneCardAtProps as bc, type ZoneCardRenderItem as bd, ZoneItem as be, type ZoneItemProps as bf, ZoneList as bg, type ZoneListProps as bh, ZonePileCards as bi, type ZonePileCardsProps as bj, type ZonePileContextValue as bk, ZonePileCount as bl, type ZonePileCountProps as bm, ZonePileDescription as bn, type ZonePileDescriptionProps as bo, ZonePileLabel as bp, type ZonePileLabelProps as bq, ZonePileRoot as br, type ZonePileRootProps as bs, ZonePileTrigger as bt, type ZonePileTriggerProps as bu, ZoneRoot as bv, type ZoneRootProps as bw, ZoneTopCard as bx, type ZoneTopCardProps as by, createZoneCardRenderItem as bz, BoardHexGrid as c, type BoardHexGridInteractionFilter as d, type BoardHexGridInteractions as e, type BoardHexGridProps as f, BoardHexView as g, type BoardHexViewProps as h, BoardRoot as i, type BoardRootProps as j, BoardSpaceTarget as k, type BoardSpaceTargetProps as l, BoardState as m, type BoardStateProps as n, BoardTarget as o, type BoardTargetExtraInputs as p, type BoardTargetProps as q, BoardVertexTarget as r, type BoardVertexTargetProps as s, type DiceComponents as t, DiceRoot as u, type DiceRootProps as v, type DiceState as w, type DiceValue as x, DiceValues as y, type DiceValuesProps as z };
package/dist/ui.d.ts CHANGED
@@ -1,14 +1,13 @@
1
- import { bm as TrackSpace, bl as TrackPiece } from './components-Dqr_LuZJ.js';
2
- export { A as ActionButton, a as ActionButtonProps, b as ActionGroup, c as ActionGroupProps, d as ActionPanel, e as ActionPanelProps, B as ButtonSize, f as ButtonVariant, C as CardDragSurface, g as CardDragSurfaceContextValue, h as CardDragSurfaceController, i as CardDragSurfaceProps, j as CardDropTargetView, k as CardDropTargetViewProps, l as CardFace, m as CardFaceProps, n as CardPositionProps, o as CardSize, p as ChromeSuppressionProvider, q as CostDisplay, r as CostDisplayProps, D as DefaultChessPiece, s as DefaultChessPieceProps, t as DefaultEmptySlot, u as DefaultEmptySlotProps, v as DefaultGridCell, w as DefaultGridCellProps, x as DefaultGridPiece, y as DefaultGridPieceProps, z as DefaultNetworkEdge, E as DefaultNetworkEdgeProps, F as DefaultNetworkNode, G as DefaultNetworkNodeProps, H as DefaultNetworkPiece, I as DefaultNetworkPieceProps, J as DefaultSlotItem, K as DefaultSlotItemProps, L as DefaultSlotOccupant, M as DefaultSlotOccupantProps, N as DefaultTrackConnection, O as DefaultTrackConnectionProps, P as DefaultTrackJump, Q as DefaultTrackJumpProps, R as DefaultTrackPiece, S as DefaultTrackPieceProps, T as DefaultTrackSpace, U as DefaultTrackSpaceProps, V as DefaultZone, W as DefaultZonePiece, X as DefaultZonePieceProps, Y as DefaultZonePieces, Z as DefaultZonePiecesProps, _ as DefaultZoneProps, $ as Dialog, a0 as DialogClose, a1 as DialogContent, a2 as DialogDescription, a3 as DialogFooter, a4 as DialogHeader, a5 as DialogOverlay, a6 as DialogPortal, a7 as DialogTitle, a8 as DialogTrigger, a9 as DiceRoller, aa as DiceRollerProps, ab as DragPhase, ac as Drawer, ad as DrawerClose, ae as DrawerContent, af as DrawerDescription, ag as DrawerFooter, ah as DrawerHeader, ai as DrawerOverlay, aj as DrawerPortal, ak as DrawerTitle, al as DrawerTrigger, am as ErrorBoundary, an as ErrorBoundaryProps, ao as GameEndDisplay, ap as GameEndDisplayProps, aq as GameSkeleton, ar as GameSkeletonProps, as as Hand, at as HandDock, au as HandDockMode, av as HandDockPlacement, aw as HandDockPresentation, ax as HandDockProps, ay as HandDockToggleContext, az as HandLayout, aA as HandProps, aB as Input, aC as InteractiveSquareEdge, aD as InteractiveSquareVertex, aE as Label, aF as MoreActions, aG as MoreActionsProps, aH as NetworkEdge, aI as NetworkGraph, aJ as NetworkGraphProps, aK as NetworkNode, aL as NetworkPiece, aM as PhaseIndicator, aN as PhaseIndicatorProps, aO as PlayArea, aP as PlayAreaProps, aQ as PlayerScore, aR as PrimaryActionAttention, aS as PrimaryActionButton, aT as PrimaryActionButtonProps, aU as PrimaryButton, aV as PrimaryButtonProps, aW as ResourceDefinition, aX as Select, aY as SelectContent, aZ as SelectItem, a_ as SelectTrigger, a$ as SlotDefinition, b0 as SlotOccupant, b1 as SlotSystem, b2 as SlotSystemProps, b3 as SquareEdgePosition, b4 as SquareGrid, b5 as SquareGridBoardProps, b6 as SquareGridProps, b7 as SquareVertexPosition, b8 as StagingZone, b9 as StagingZoneProps, ba as ThemedButton, bb as ThemedButtonProps, bc as Toast, bd as ToastActions, be as ToastActionsProps, bf as ToastActionsValue, bg as ToastNotification, bh as ToastProvider, bi as ToastType, bj as TrackBoard, bk as TrackBoardProps, bn as UseHandLayoutOptions, bo as UseHandLayoutReturn, bp as ZoneDefinition, bq as ZoneHighlightType, br as ZoneMap, bs as ZoneMapProps, bt as ZonePiece, bu as ZoneShape, bv as buttonStyle, bw as chipStyle, bx as intentForVariant, by as motionDuration, bz as playerColor, bA as surfaceStyle, bB as toAlgebraic, bC as toNumeric, bD as useCardDragSurface, bE as useChromeSuppression } from './components-Dqr_LuZJ.js';
3
- import { $ as Theme } from './hex-board-view-UCUjMALd.js';
4
- export { A as AnyHexBoardInput, a as AnySquareBoardInput, b as AuthoredHexBoardInput, c as AuthoredSquareBoardInput, B as BoardEdgeIdOf, d as BoardSpaceIdOf, e as BoardVertexIdOf, C as ColorRamp, f as ComponentTokens, D as DefaultHexEdge, g as DefaultHexEdgeProps, h as DefaultHexTile, i as DefaultHexTileProps, j as DefaultHexVertex, k as DefaultHexVertexProps, E as EdgePosition, l as Elevation, F as FoundationColor, G as GeneratedHexBoardInput, m as GeneratedHexSpaceStateLike, n as GeneratedSquareBoardInput, o as GeneratedSquareSpaceStateLike, p as GeneratedTiledEdgeStateLike, q as GeneratedTiledVertexStateLike, H as HexBoardInput, r as HexBoardView, s as HexBoardViewTile, t as HexGrid, u as HexGridBoardProps, v as HexGridProps, w as HexOrientation, x as HexTileGeometry, I as IntentColor, y as InteractiveHexEdge, z as InteractiveHexVertex, J as InteractiveTargetLayer, K as InteractiveTargetRenderState, M as Motion, N as NormalizedHexBoard, O as NormalizedHexEdgeOf, P as NormalizedHexTileOf, Q as NormalizedHexVertexOf, R as NormalizedSquareBoard, S as NormalizedSquareCellOf, T as NormalizedSquareEdgeOf, U as NormalizedSquarePieceOf, V as NormalizedSquareVertexOf, W as PlayerColor, X as Radius, Y as SemanticColor, Z as Space, _ as SquareBoardInput, a0 as ThemeMeta, a1 as ThemeOverride, a2 as Typography, a3 as createHexBoardView, a4 as hexUtils, a5 as mergeTheme, a6 as normalizeHexBoardInput, a7 as normalizeSquareBoardInput } from './hex-board-view-UCUjMALd.js';
5
- export { T as ThemeContextValue, a as ThemePresetId, b as ThemeProvider, c as ThemeProviderProps, g as getThemePreset, r as resolveTheme, u as useTheme, d as useThemeCssVars } from './ThemeProvider-DvMl17Ny.js';
1
+ import { by as TrackSpace, bx as TrackPiece } from './components-BbWPnZCF.js';
2
+ export { A as ActionButton, a as ActionButtonProps, b as ActionGroup, c as ActionGroupProps, d as ActionPanel, e as ActionPanelProps, B as ButtonSize, f as ButtonVariant, C as CardDragSurface, g as CardDragSurfaceContextValue, h as CardDragSurfaceController, i as CardDragSurfaceProps, j as CardDropTargetView, k as CardDropTargetViewProps, l as CardFace, m as CardFaceProps, n as CardPositionProps, o as CardSize, p as ChromeSuppressionProvider, q as CostDisplay, r as CostDisplayProps, D as DefaultChessPiece, s as DefaultChessPieceProps, t as DefaultEmptySlot, u as DefaultEmptySlotProps, v as DefaultGridCell, w as DefaultGridCellProps, x as DefaultGridPiece, y as DefaultGridPieceProps, z as DefaultNetworkEdge, E as DefaultNetworkEdgeProps, F as DefaultNetworkNode, G as DefaultNetworkNodeProps, H as DefaultNetworkPiece, I as DefaultNetworkPieceProps, J as DefaultSlotItem, K as DefaultSlotItemProps, L as DefaultSlotOccupant, M as DefaultSlotOccupantProps, N as DefaultTrackConnection, O as DefaultTrackConnectionProps, P as DefaultTrackJump, Q as DefaultTrackJumpProps, R as DefaultTrackPiece, S as DefaultTrackPieceProps, T as DefaultTrackSpace, U as DefaultTrackSpaceProps, V as DefaultZone, W as DefaultZonePiece, X as DefaultZonePieceProps, Y as DefaultZonePieces, Z as DefaultZonePiecesProps, _ as DefaultZoneProps, $ as Dialog, a0 as DialogClose, a1 as DialogContent, a2 as DialogDescription, a3 as DialogFooter, a4 as DialogHeader, a5 as DialogOverlay, a6 as DialogPortal, a7 as DialogTitle, a8 as DialogTrigger, a9 as DiceRoller, aa as DiceRollerProps, ab as DragPhase, ac as Drawer, ad as DrawerClose, ae as DrawerContent, af as DrawerDescription, ag as DrawerFooter, ah as DrawerHeader, ai as DrawerOverlay, aj as DrawerPortal, ak as DrawerTitle, al as DrawerTrigger, am as ErrorBoundary, an as ErrorBoundaryProps, ao as GameEndDisplay, ap as GameEndDisplayProps, aq as GameSkeleton, ar as GameSkeletonProps, as as Hand, at as HandDock, au as HandDockMode, av as HandDockPlacement, aw as HandDockPresentation, ax as HandDockProps, ay as HandDockToggleContext, az as HandLayout, aA as HandProps, aB as Input, aC as InteractiveSquareEdge, aD as InteractiveSquareVertex, aE as Label, aF as MoreActions, aG as MoreActionsProps, aH as NetworkEdge, aI as NetworkGraph, aJ as NetworkGraphProps, aK as NetworkNode, aL as NetworkPiece, aM as Panel, aN as PanelActions, aO as PanelBody, aP as PanelDescription, aQ as PanelDescriptionProps, aR as PanelHeader, aS as PanelPartProps, aT as PanelRoot, aU as PanelRootProps, aV as PanelTitle, aW as PanelTitleProps, aX as PanelTone, aY as PhaseIndicator, aZ as PhaseIndicatorProps, a_ as PlayArea, a$ as PlayAreaProps, b0 as PlayerScore, b1 as PrimaryActionAttention, b2 as PrimaryActionButton, b3 as PrimaryActionButtonProps, b4 as PrimaryButton, b5 as PrimaryButtonProps, b6 as ResourceDefinition, b7 as Select, b8 as SelectContent, b9 as SelectItem, ba as SelectTrigger, bb as SlotDefinition, bc as SlotOccupant, bd as SlotSystem, be as SlotSystemProps, bf as SquareEdgePosition, bg as SquareGrid, bh as SquareGridBoardProps, bi as SquareGridProps, bj as SquareVertexPosition, bk as StagingZone, bl as StagingZoneProps, bm as ThemedButton, bn as ThemedButtonProps, bo as Toast, bp as ToastActions, bq as ToastActionsProps, br as ToastActionsValue, bs as ToastNotification, bt as ToastProvider, bu as ToastType, bv as TrackBoard, bw as TrackBoardProps, bz as UseHandLayoutOptions, bA as UseHandLayoutReturn, bB as ZoneDefinition, bC as ZoneHighlightType, bD as ZoneMap, bE as ZoneMapProps, bF as ZonePiece, bG as ZoneShape, bH as buttonStyle, bI as chipStyle, bJ as intentForVariant, bK as motionDuration, bL as playerColor, bM as surfaceStyle, bN as toAlgebraic, bO as toNumeric, bP as useCardDragSurface, bQ as useChromeSuppression } from './components-BbWPnZCF.js';
3
+ import { $ as Theme } from './hex-board-view-Kz9Q_zsv.js';
4
+ export { A as AnyHexBoardInput, a as AnySquareBoardInput, b as AuthoredHexBoardInput, c as AuthoredSquareBoardInput, B as BoardEdgeIdOf, d as BoardSpaceIdOf, e as BoardVertexIdOf, C as ColorRamp, f as ComponentTokens, D as DefaultHexEdge, g as DefaultHexEdgeProps, h as DefaultHexTile, i as DefaultHexTileProps, j as DefaultHexVertex, k as DefaultHexVertexProps, E as EdgePosition, l as Elevation, F as FoundationColor, G as GeneratedHexBoardInput, m as GeneratedHexSpaceStateLike, n as GeneratedSquareBoardInput, o as GeneratedSquareSpaceStateLike, p as GeneratedTiledEdgeStateLike, q as GeneratedTiledVertexStateLike, H as HexBoardInput, r as HexBoardView, s as HexBoardViewTile, t as HexGrid, u as HexGridBoardProps, v as HexGridProps, w as HexOrientation, x as HexTileGeometry, I as IntentColor, y as InteractiveHexEdge, z as InteractiveHexVertex, J as InteractiveTargetLayer, K as InteractiveTargetRenderState, M as Motion, N as NormalizedHexBoard, O as NormalizedHexEdgeOf, P as NormalizedHexTileOf, Q as NormalizedHexVertexOf, R as NormalizedSquareBoard, S as NormalizedSquareCellOf, T as NormalizedSquareEdgeOf, U as NormalizedSquarePieceOf, V as NormalizedSquareVertexOf, W as PlayerColor, X as Radius, Y as SemanticColor, Z as Space, _ as SquareBoardInput, a0 as ThemeMeta, a1 as ThemeOverride, a2 as Typography, a3 as createHexBoardView, a4 as hexUtils, a5 as mergeTheme, a6 as normalizeHexBoardInput, a7 as normalizeSquareBoardInput } from './hex-board-view-Kz9Q_zsv.js';
5
+ export { T as ThemeContextValue, a as ThemePresetId, b as ThemeProvider, c as ThemeProviderProps, g as getThemePreset, r as resolveTheme, u as useTheme, d as useThemeCssVars } from './ThemeProvider-B1sIoBlX.js';
6
6
  import { CSSProperties } from 'react';
7
7
  export { C as CardDropTargetVisualState, a as CardIntent, H as HandInteractionPolicy, b as HandLayoutKind, c as HandLayoutPolicy, d as HandView, e as HandViewProps, I as InteractionVisualState, T as TargetIntent, f as dropTargetVisualStateDataAttributes, v as visualStateDataAttributes } from './HandView-PYDmehVD.js';
8
- export { B as BoundResourceCounterRootProps, H as HandRole, M as MobileHandRegistration, a as MobileHandTrayProvider, R as ResourceCounter, b as ResourceCounterComponents, c as ResourceCounterCount, d as ResourceCounterIcon, e as ResourceCounterItem, f as ResourceCounterItemState, g as ResourceCounterLabel, h as ResourceCounterPartProps, i as ResourceCounterProps, j as ResourceCounterRoot, k as ResourceCounterRootProps, l as ResourceDisplayConfig, m as ResourceIconProps, n as createResourceCounter, u as useMobileHandTrayActive, o as useRegisterMobileHand } from './ResourceCounter-BTXklCEZ.js';
9
- export { BoardBaseId, BoardId, BoardKindStates, BoardRef, BoardStates, CardId, CardIdsByDeckId, CardProperties, DeckId, DiceStates, DieId, DieState, EdgeTypeId, GameState, HexBoardState, HexEdgeState, HexTileState, HexVertexState, NetworkBoardState, NetworkEdgeState, NetworkNodeState, NetworkPieceState, PerPlayer, PerPlayerBoardRef, PieceId, PieceTypeId, Player, PlayerId, SharedBoardRef, SpaceId, SpaceTypeId, SquareBoardState, SquareCellState, SquareEdgeState, SquarePieceState, SquareVertexState, TrackBoardState, TrackPieceState, TrackSpaceState, VertexTypeId } from './ui/player-state.js';
8
+ export { B as BoundResourceCounterRootProps, H as HandRole, M as MobileHandRegistration, a as MobileHandTrayProvider, R as ResourceCounter, b as ResourceCounterComponents, c as ResourceCounterCount, d as ResourceCounterIcon, e as ResourceCounterItem, f as ResourceCounterItemState, g as ResourceCounterLabel, h as ResourceCounterPartProps, i as ResourceCounterProps, j as ResourceCounterRoot, k as ResourceCounterRootProps, l as ResourceDisplayConfig, m as ResourceIconProps, n as createResourceCounter, u as useMobileHandTrayActive, o as useOverlayInsets, p as useRegisterBottomOverlayInset, q as useRegisterMobileHand } from './ResourceCounter-BuiNstXs.js';
9
+ export { B as BoardBaseId, a as BoardId, b as BoardKindStates, c as BoardRef, d as BoardStates, C as CardId, e as CardIdsByDeckId, f as CardProperties, D as DeckId, g as DiceStates, h as DieId, i as DieState, E as EdgeTypeId, G as GameState, H as HexBoardState, j as HexColor, k as HexEdgeState, l as HexTileState, m as HexVertexState, N as NetworkBoardState, n as NetworkEdgeState, o as NetworkNodeState, p as NetworkPieceState, P as PerPlayer, q as PerPlayerBoardRef, r as PieceId, s as PieceTypeId, t as Player, u as PlayerId, S as SharedBoardRef, v as SpaceId, w as SpaceTypeId, x as SquareBoardState, y as SquareCellState, z as SquareEdgeState, A as SquarePieceState, F as SquareVertexState, T as TrackBoardState, I as TrackPieceState, J as TrackSpaceState, V as VertexTypeId, K as hexColor, L as isHexColor, M as parseHexColor } from './player-state-Cqpyeql0.js';
10
10
  export { CardCollection, ViewCard, ViewSlotOccupant } from './types.js';
11
- export { H as HexColor, h as hexColor, i as isHexColor, p as parseHexColor } from './hex-color-MhOyuY-o.js';
12
11
  import 'react/jsx-runtime';
13
12
  import 'framer-motion';
14
13
  import 'vaul';
package/dist/ui.js CHANGED
@@ -5,7 +5,7 @@ import {
5
5
  parseHexColor,
6
6
  toTrackBoardData,
7
7
  useBoardTheme
8
- } from "./chunk-XJYUSD5F.js";
8
+ } from "./chunk-FWVV2X74.js";
9
9
  import {
10
10
  ActionButton,
11
11
  ActionGroup,
@@ -67,6 +67,13 @@ import {
67
67
  MobileHandTrayProvider,
68
68
  MoreActions,
69
69
  NetworkGraph,
70
+ Panel,
71
+ PanelActions,
72
+ PanelBody,
73
+ PanelDescription,
74
+ PanelHeader,
75
+ PanelRoot,
76
+ PanelTitle,
70
77
  PhaseIndicator,
71
78
  PlayArea,
72
79
  PrimaryActionButton,
@@ -119,11 +126,13 @@ import {
119
126
  useChromeSuppression,
120
127
  useIsMobile,
121
128
  useMobileHandTrayActive,
129
+ useOverlayInsets,
130
+ useRegisterBottomOverlayInset,
122
131
  useRegisterMobileHand,
123
132
  useTheme,
124
133
  useThemeCssVars,
125
134
  visualStateDataAttributes
126
- } from "./chunk-7W6TQO3X.js";
135
+ } from "./chunk-45FI6XII.js";
127
136
  import "./chunk-VDXOF4FW.js";
128
137
  import "./chunk-PZ5AY32C.js";
129
138
  export {
@@ -187,6 +196,13 @@ export {
187
196
  MobileHandTrayProvider,
188
197
  MoreActions,
189
198
  NetworkGraph,
199
+ Panel,
200
+ PanelActions,
201
+ PanelBody,
202
+ PanelDescription,
203
+ PanelHeader,
204
+ PanelRoot,
205
+ PanelTitle,
190
206
  PhaseIndicator,
191
207
  PlayArea,
192
208
  PrimaryActionButton,
@@ -245,6 +261,8 @@ export {
245
261
  useChromeSuppression,
246
262
  useIsMobile,
247
263
  useMobileHandTrayActive,
264
+ useOverlayInsets,
265
+ useRegisterBottomOverlayInset,
248
266
  useRegisterMobileHand,
249
267
  useTheme,
250
268
  useThemeCssVars,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dreamboard-games/sdk",
3
- "version": "0.4.0-alpha.1",
3
+ "version": "0.4.0-alpha.3",
4
4
  "description": "Dreamboard SDK package set metadata and public facade",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -79,6 +79,11 @@
79
79
  "import": "./dist/codegen.js",
80
80
  "default": "./dist/codegen.js"
81
81
  },
82
+ "./authoring": {
83
+ "types": "./dist/authoring/index.d.ts",
84
+ "import": "./dist/authoring/index.js",
85
+ "default": "./dist/authoring/index.js"
86
+ },
82
87
  "./reducer-contract": {
83
88
  "types": "./dist/reducer-contract.d.ts",
84
89
  "import": "./dist/reducer-contract.js",
@@ -90,6 +95,7 @@
90
95
  "default": "./dist/testing.js"
91
96
  },
92
97
  "./browser-interaction": {
98
+ "bun": "./src/browser-interaction.ts",
93
99
  "types": "./dist/browser-interaction.d.ts",
94
100
  "import": "./dist/browser-interaction.js",
95
101
  "default": "./dist/browser-interaction.js"
@@ -104,6 +110,17 @@
104
110
  "!.turbo/**",
105
111
  "!tsconfig.tsbuildinfo"
106
112
  ],
113
+ "scripts": {
114
+ "build": "pnpm --dir ../.. --filter @dreamboard-games/plugin-runtime-contract build && pnpm --dir ../.. authoring-metadata:generate && tsup && node ../../scripts/copy-sdk-private-dts.mjs && mkdir -p dist/ui && tailwindcss -i src/ui/plugin-styles.css -o dist/ui/plugin-styles.css --minify",
115
+ "typecheck": "tsc --noEmit",
116
+ "lint": "eslint 'src/**/*.{ts,tsx}'",
117
+ "storybook": "storybook dev -p 6006 --host 127.0.0.1 --no-open",
118
+ "storybook:build": "storybook build -o storybook-static",
119
+ "storybook:test": "concurrently -k -s first -n storybook,test \"http-server storybook-static -p 6006 -s --silent\" \"wait-on tcp:6006 && test-storybook --url http://127.0.0.1:6006\"",
120
+ "storybook:test:visual": "playwright test --config .storybook/visual-runner.config.ts",
121
+ "storybook:test:visual:update": "playwright test --config .storybook/visual-runner.config.ts --update-snapshots",
122
+ "test": "bun test src"
123
+ },
107
124
  "dependencies": {
108
125
  "@radix-ui/react-accordion": "^1.2.12",
109
126
  "@radix-ui/react-dialog": "^1.1.14",
@@ -118,6 +135,10 @@
118
135
  "zustand": "^5.0.4"
119
136
  },
120
137
  "devDependencies": {
138
+ "@dreamboard-games/reducer-contract": "workspace:*",
139
+ "@dreamboard-games/plugin-runtime-contract": "workspace:*",
140
+ "@dreamboard-games/sdk-types": "workspace:*",
141
+ "@dreamboard-games/workspace-codegen": "workspace:*",
121
142
  "@happy-dom/global-registrator": "^20.9.0",
122
143
  "@playwright/test": "1.60.0",
123
144
  "@storybook/addon-a11y": "^10.4.1",
@@ -134,7 +155,6 @@
134
155
  "eslint": "^9.39.0",
135
156
  "framer-motion": "^11.15.0",
136
157
  "http-server": "^14.1.1",
137
- "playwright": "1.60.0",
138
158
  "react": "^19.2.0",
139
159
  "react-dom": "^19.2.0",
140
160
  "storybook": "^10.4.1",
@@ -143,10 +163,7 @@
143
163
  "typescript": "^5.9.2",
144
164
  "vite": "^5.4.10",
145
165
  "wait-on": "^8.0.1",
146
- "zod": "4.4.3",
147
- "@dreamboard-games/reducer-contract": "0.2.1",
148
- "@dreamboard-games/workspace-codegen": "0.3.0-alpha.0",
149
- "@dreamboard-games/sdk-types": "0.2.0"
166
+ "zod": "4.4.3"
150
167
  },
151
168
  "peerDependencies": {
152
169
  "framer-motion": "^11.0.0 || ^12.0.0",
@@ -171,16 +188,5 @@
171
188
  "sdk",
172
189
  "package-set"
173
190
  ],
174
- "license": "SEE LICENSE IN LICENSE.md",
175
- "scripts": {
176
- "build": "tsup && mkdir -p dist/ui && tailwindcss -i src/ui/plugin-styles.css -o dist/ui/plugin-styles.css --minify",
177
- "typecheck": "tsc --noEmit",
178
- "lint": "eslint 'src/**/*.{ts,tsx}'",
179
- "storybook": "storybook dev -p 6006 --host 127.0.0.1 --no-open",
180
- "storybook:build": "storybook build -o storybook-static",
181
- "storybook:test": "concurrently -k -s first -n storybook,test \"http-server storybook-static -p 6006 -s --silent\" \"wait-on tcp:6006 && test-storybook --url http://127.0.0.1:6006\"",
182
- "storybook:test:visual": "playwright test --config .storybook/visual-runner.config.ts",
183
- "storybook:test:visual:update": "playwright test --config .storybook/visual-runner.config.ts --update-snapshots",
184
- "test": "bun test src"
185
- }
186
- }
191
+ "license": "SEE LICENSE IN LICENSE.md"
192
+ }
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/runtime/workspace-contract/index.ts","../src/runtime/ui-contract.ts","../src/runtime/workspace-contract/board.ts","../src/runtime/workspace-contract/slots.ts","../src/runtime/workspace-contract/forms.ts","../src/runtime/workspace-contract/surfaces.ts","../src/runtime/workspace-contract/zones.ts","../src/runtime/workspace-contract/hand.ts"],"sourcesContent":["import { createElement } from \"react\";\nimport type { ReactNode } from \"react\";\nimport {\n ClientParamSchemaProvider,\n type ClientParamSchemaMap,\n} from \"../context/ClientParamSchemaContext.js\";\nimport {\n createResourceCounter,\n type ResourceCounterComponents,\n type ResourceDisplayConfig,\n} from \"../../ui.js\";\nimport { MobileHandTrayProvider } from \"../../ui/components.js\";\nimport { ToastProvider } from \"../../ui.js\";\nimport {\n createDreamboardUI,\n type DreamboardUI,\n type TypedGame,\n type UIContract,\n} from \"../ui-contract.js\";\nimport type {\n BoardHexGridProps,\n BoardHexViewProps,\n InteractionDialogProps,\n InteractionFormPrimitiveProps,\n InteractionStateProps,\n InteractionSubmitProps,\n InteractionTriggerProps,\n GameMeState,\n GamePlayersState,\n GameRenderState,\n GameTurnState,\n UIRootProps,\n ZoneCardRenderItem,\n} from \"../primitives/index.js\";\nimport type { ZoneListProps } from \"../primitives/zone.js\";\nimport type {\n RuntimeBoard,\n RuntimeInteraction,\n RuntimeZone,\n WorkspaceContractContext,\n WorkspaceContractOptions,\n} from \"./types.js\";\nimport { createBoardNamespace } from \"./board.js\";\nimport { createInteractionForms } from \"./forms.js\";\nimport { createSurfaceResolvers } from \"./surfaces.js\";\nimport { createZoneNamespace } from \"./zones.js\";\n\nexport type { BoardSpaceTargetProps } from \"../primitives/board.js\";\nexport type { HandRole } from \"../../ui/components.js\";\nexport type {\n WorkspaceInteractionSlotComponent,\n WorkspaceFormInputSlot,\n WorkspaceCardInputSlot,\n WorkspaceBoardTargetInputSlot,\n WorkspaceBoardSurface,\n WorkspaceZoneCardsComponent,\n WorkspaceZoneCardComponent,\n WorkspaceZoneStagingComponent,\n WorkspaceHandSurface,\n WorkspaceHandOptions,\n WorkspacePileSurface,\n WorkspaceCardCollectionSurface,\n WorkspaceBoardSurfaceDescriptor,\n WorkspaceHandSurfaceDescriptor,\n WorkspacePileSurfaceDescriptor,\n WorkspacePilesSurfaceDescriptor,\n WorkspaceCardCollectionSurfaceDescriptor,\n WorkspaceInteractionFormsDescriptor,\n WorkspaceInteractionFormDescriptor,\n WorkspaceSurfaceDescriptor,\n WorkspaceSurfaceSpec,\n WorkspaceContractOptions,\n} from \"./types.js\";\n\nexport function createWorkspaceUIContract<\n WorkspaceUI,\n Contract extends UIContract,\n Resource extends string,\n Card,\n HexBoards extends Record<string, unknown>,\n>(\n options: WorkspaceContractOptions<Contract, Resource, Card, HexBoards>,\n): WorkspaceUI {\n const baseUI = createDreamboardUI(options.uiContract);\n const runtimeInteraction = baseUI.Interaction as RuntimeInteraction;\n const runtimeBoard = baseUI.Board as RuntimeBoard;\n const runtimeZone = baseUI.Zone as RuntimeZone<Card>;\n\n const ctx: WorkspaceContractContext<Card> = {\n options,\n // The context carries the contract-erased view of the UI: every consumer\n // already neutralizes key genericity (`as never` inputs/zones), exactly as\n // the original single-file factory did with its `Runtime*` casts.\n baseUI: baseUI as unknown as DreamboardUI,\n runtimeInteraction,\n runtimeBoard,\n runtimeZone,\n withInteractionRoot: (interaction: string, children: ReactNode) =>\n createElement(runtimeInteraction.Root, {\n interaction,\n children,\n }),\n };\n\n const resourceDisplayConfig = options.resourceIds.map((resource) => {\n const presentation = options.resourcePresentationById?.[resource];\n return {\n type: resource,\n label: presentation?.label ?? resource,\n icon: presentation?.icon ?? resource,\n };\n }) satisfies ReadonlyArray<ResourceDisplayConfig<Resource>>;\n const resourceCounter = createResourceCounter<Resource>(\n resourceDisplayConfig,\n );\n\n const { Interaction, useInteractionFormSurface } =\n createInteractionForms(ctx);\n const Board = createBoardNamespace(ctx);\n const Zone = createZoneNamespace(ctx);\n const { defineSurfaces } = createSurfaceResolvers({\n Board,\n Zone,\n useInteractionFormSurface,\n });\n\n const UI = {\n ...baseUI,\n Root: ({ children, ...props }: UIRootProps) =>\n createElement(ClientParamSchemaProvider, {\n schemas: options.clientParamSchemasByPhase,\n children: createElement(ToastProvider, {\n children: createElement(MobileHandTrayProvider, {\n children: createElement(baseUI.Root, { ...props, children }),\n }),\n }),\n }),\n defineSurfaces,\n Interaction,\n Board,\n Zone,\n ResourceCounter: resourceCounter,\n };\n\n return UI as WorkspaceUI;\n}\n\nexport type {\n BoardHexGridProps,\n BoardHexViewProps,\n ClientParamSchemaMap,\n DreamboardUI,\n GameMeState,\n GamePlayersState,\n GameRenderState,\n GameTurnState,\n InteractionDialogProps,\n InteractionFormPrimitiveProps,\n InteractionStateProps,\n InteractionSubmitProps,\n InteractionTriggerProps,\n ResourceCounterComponents,\n TypedGame,\n UIContract,\n UIRootProps,\n ZoneCardRenderItem,\n ZoneListProps,\n};\n","import type {\n ButtonHTMLAttributes,\n ComponentType,\n ReactElement,\n ReactNode,\n} from \"react\";\nimport {\n Board as BoardPrimitive,\n Dice as DicePrimitive,\n Game as GamePrimitive,\n Interaction as InteractionPrimitive,\n Phase as PhasePrimitive,\n PlayerRoster as PlayerRosterPrimitive,\n Prompt as PromptPrimitive,\n PromptInbox as PromptInboxPrimitive,\n UI as UIPrimitive,\n Zone as ZonePrimitive,\n type BoardHexGridProps,\n type BoardHexGridInteractionFilter,\n type BoardTargetProps,\n type BoardSpaceTargetProps,\n type BoardEdgeTargetProps,\n type BoardVertexTargetProps,\n type GameChromeProps,\n type DiceComponents,\n type GameRootProps,\n type InteractionCardInputProps,\n type InteractionDialogProps,\n type InteractionFieldPrimitiveProps,\n type InteractionFormPrimitiveProps,\n type InteractionRoutesMap,\n type InteractionRoutesProps,\n type InteractionRootProps,\n type InteractionSwitchRouteMap,\n type InteractionSwitchProps,\n type PhaseSwitchProps,\n type PlayerRosterComponents,\n type PlayerRosterBadge,\n type PlayerRosterEntry,\n type PlayerRosterListProps,\n type PlayerRosterPartProps,\n type PlayerRosterRootProps,\n type PlayerRosterSwitchButtonProps,\n type PromptDialogProps,\n type PromptInboxItemsProps,\n type PromptOptionRenderItem,\n type PromptOptionProps,\n type PromptOptionsProps,\n type PromptRootProps,\n type UIRootProps,\n type ZoneItemProps,\n type ZoneCardAtProps,\n type ZoneCardActionProps,\n type ZoneCardRenderItem,\n type ZoneListProps,\n type ZonePileCardsProps,\n type ZonePileRootProps,\n type ZoneRootProps,\n} from \"./primitives/index.js\";\nimport type { InteractionDescriptor } from \"./types/plugin-state.js\";\nimport type { AnyHexBoardInput, BoardSpaceIdOf } from \"../ui.js\";\n\n/**\n * Workspace-aware UI typing extension point.\n *\n * Generated workspaces will augment this interface with their concrete UI\n * contract. The unregistered SDK keeps all public keys string-compatible so\n * package-local tests and generic consumers can still import ui-sdk directly.\n */\nexport interface DreamboardUIRegister {\n readonly __dreamboardUIRegister?: never;\n}\n\nexport type UIContractBucket = Record<string, unknown>;\n\nexport interface UIContract {\n interactions?: UIContractBucket;\n inputs?: UIContractBucket;\n prompts?: UIContractBucket;\n promptOptions?: UIContractBucket;\n players?: UIContractBucket;\n zones?: UIContractBucket;\n cards?: UIContractBucket;\n phases?: UIContractBucket;\n boardTargets?: UIContractBucket;\n}\n\ntype RegisteredUIContract = DreamboardUIRegister extends {\n ui: infer Registered extends UIContract;\n}\n ? Registered\n : UIContract;\n\ntype BucketOf<Contract extends UIContract, Key extends keyof UIContract> =\n NonNullable<Contract[Key]> extends UIContractBucket\n ? NonNullable<Contract[Key]>\n : UIContractBucket;\n\ntype StringKeyOf<Bucket extends UIContractBucket> = Extract<\n keyof Bucket,\n string\n>;\n\ntype StringKeysOrFallback<Bucket extends UIContractBucket> = [\n StringKeyOf<Bucket>,\n] extends [never]\n ? string\n : string extends StringKeyOf<Bucket>\n ? string\n : StringKeyOf<Bucket>;\n\nexport type RegisteredUI = RegisteredUIContract;\n\nexport type InteractionKey<Contract extends UIContract = RegisteredUI> =\n StringKeysOrFallback<BucketOf<Contract, \"interactions\">>;\n\nexport type InteractionInputKey<Contract extends UIContract = RegisteredUI> =\n StringKeysOrFallback<BucketOf<Contract, \"inputs\">>;\n\nexport type PromptKey<Contract extends UIContract = RegisteredUI> =\n StringKeysOrFallback<BucketOf<Contract, \"prompts\">>;\n\nexport type PromptOptionKey<Contract extends UIContract = RegisteredUI> =\n StringKeysOrFallback<BucketOf<Contract, \"promptOptions\">>;\n\nexport type PlayerKey<Contract extends UIContract = RegisteredUI> =\n StringKeysOrFallback<BucketOf<Contract, \"players\">>;\n\nexport type ZoneKey<Contract extends UIContract = RegisteredUI> =\n StringKeysOrFallback<BucketOf<Contract, \"zones\">>;\n\nexport type CardKey<Contract extends UIContract = RegisteredUI> =\n StringKeysOrFallback<BucketOf<Contract, \"cards\">>;\n\nexport type PhaseKey<Contract extends UIContract = RegisteredUI> =\n StringKeysOrFallback<BucketOf<Contract, \"phases\">>;\n\nexport type BoardTargetKey<Contract extends UIContract = RegisteredUI> =\n StringKeysOrFallback<BucketOf<Contract, \"boardTargets\">>;\n\ntype TypedZoneCardRenderItem<Contract extends UIContract> =\n ZoneCardRenderItem<CardKey<Contract> & string> extends infer Item\n ? Item extends { id: string; zone: string }\n ? Omit<Item, \"id\" | \"zone\"> & {\n id: CardKey<Contract>;\n zone: ZoneKey<Contract>;\n }\n : never\n : never;\n\nexport type TypedInteraction<Contract extends UIContract> = Omit<\n typeof InteractionPrimitive,\n \"Root\" | \"CardInput\" | \"Dialog\" | \"Field\" | \"Form\" | \"Switch\"\n> & {\n Root<Interaction extends InteractionKey<Contract>>(\n props: InteractionRootProps<Interaction>,\n ): ReactElement | null;\n Switch(\n props: Omit<InteractionSwitchProps<InteractionKey<Contract>>, \"routes\"> & {\n routes: InteractionSwitchRouteMap<InteractionKey<Contract>>;\n },\n ): ReactElement;\n Routes(\n props: Omit<InteractionRoutesProps<InteractionKey<Contract>>, \"routes\"> & {\n routes: InteractionRoutesMap<InteractionKey<Contract>>;\n },\n ): ReactElement;\n CardInput<Input extends InteractionInputKey<Contract>>(\n props: Omit<InteractionCardInputProps, \"input\" | \"unsafeCardId\"> & {\n input: Input;\n unsafeCardId?: CardKey<Contract>;\n },\n ): ReactElement;\n Dialog<Interaction extends InteractionKey<Contract>>(\n props: InteractionDialogProps<Interaction>,\n ): ReactElement;\n Field<Input extends InteractionInputKey<Contract>>(\n props: Omit<InteractionFieldPrimitiveProps, \"input\"> & { input: Input },\n ): ReactElement | null;\n Form(props: InteractionFormPrimitiveProps): ReactElement | null;\n};\n\nexport type InteractionSlotComponent<Props = object> = ComponentType<\n Props extends { children: unknown } ? Props : Props & { children?: ReactNode }\n>;\n\nexport interface InteractionDefaultInputSlot {\n readonly Default: InteractionSlotComponent;\n}\n\nexport interface InteractionValueInputSlot<Value = unknown> {\n readonly Value: InteractionSlotComponent<{\n children: (value: Value | undefined) => ReactNode;\n }>;\n}\n\nexport interface InteractionChoiceInputSlot<Value = unknown> {\n readonly Field: InteractionSlotComponent;\n readonly Options: InteractionSlotComponent<{\n children: (option: { value: Value; label: string }) => ReactNode;\n }>;\n}\n\nexport interface InteractionChoiceListInputSlot<Value = unknown> {\n readonly Field: InteractionSlotComponent;\n readonly Options: InteractionSlotComponent<{\n children: (option: { value: Value; label: string }) => ReactNode;\n }>;\n}\n\nexport interface InteractionNumberInputSlot {\n readonly Field: InteractionSlotComponent;\n}\n\nexport interface InteractionResourceMapInputSlot<\n Resource extends string = string,\n> {\n readonly Field: InteractionSlotComponent;\n readonly Resource: InteractionSlotComponent<{ value: Resource }>;\n}\n\nexport type InteractionFormInputSlot<Value = unknown> =\n | InteractionChoiceInputSlot<Value>\n | InteractionChoiceListInputSlot<Value>\n | InteractionNumberInputSlot\n | InteractionResourceMapInputSlot;\n\nexport interface InteractionCardTargetInputSlot<Card extends string = string> {\n readonly Card: InteractionSlotComponent<\n { value: Card } & Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n | \"children\"\n | \"disabled\"\n | \"aria-disabled\"\n | \"aria-pressed\"\n | \"onClick\"\n | \"type\"\n | \"value\"\n >\n >;\n readonly Cards: InteractionSlotComponent<{\n children: (card: { id: Card }) => ReactNode;\n }>;\n}\n\nexport interface InteractionBoardTargetInputSlot<\n Target extends string = string,\n> {\n readonly Target: InteractionSlotComponent<\n { value: Target } & Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n | \"children\"\n | \"disabled\"\n | \"aria-disabled\"\n | \"aria-pressed\"\n | \"onClick\"\n | \"type\"\n | \"value\"\n >\n >;\n}\n\nexport type InteractionBoardSpaceTargetInputSlot<\n Space extends string = string,\n> = InteractionBoardTargetInputSlot<Space>;\n\nexport type InteractionBoardEdgeTargetInputSlot<Edge extends string = string> =\n InteractionBoardTargetInputSlot<Edge>;\n\nexport type InteractionBoardVertexTargetInputSlot<\n Vertex extends string = string,\n> = InteractionBoardTargetInputSlot<Vertex>;\n\nexport type InteractionBoardTileTargetInputSlot<Tile extends string = string> =\n InteractionBoardTargetInputSlot<Tile>;\n\nexport interface InteractionSubmitSlot {\n readonly Button: InteractionSlotComponent<\n Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n \"children\" | \"disabled\" | \"type\" | \"value\"\n >\n >;\n}\n\nexport type TypedPrompt<Contract extends UIContract> = Omit<\n typeof PromptPrimitive,\n \"Root\" | \"Option\" | \"Options\" | \"Dialog\"\n> & {\n Root<Prompt extends PromptKey<Contract>>(\n props: PromptRootProps<Prompt>,\n ): ReactElement | null;\n Option<Option extends PromptOptionKey<Contract>>(\n props: Omit<PromptOptionProps, \"value\"> & { value: Option },\n ): ReactElement;\n Options(\n props: Omit<PromptOptionsProps, \"children\"> & {\n children: (\n option: Omit<PromptOptionRenderItem, \"id\"> & {\n id: PromptOptionKey<Contract>;\n },\n ) => ReactNode;\n },\n ): ReactElement;\n Dialog<Prompt extends PromptKey<Contract>>(\n props: PromptDialogProps<Prompt>,\n ): ReactElement;\n};\n\nexport type TypedPromptInbox<Contract extends UIContract> = Omit<\n typeof PromptInboxPrimitive,\n \"Items\"\n> & {\n Items(\n props: Omit<PromptInboxItemsProps, \"children\"> & {\n children: (\n prompt: Omit<InteractionDescriptor, \"interactionKey\"> & {\n interactionKey: PromptKey<Contract>;\n },\n ) => ReactNode;\n },\n ): ReactElement;\n};\n\ntype TypedPlayerRosterEntry<Player extends string> = Omit<\n PlayerRosterEntry,\n \"playerId\"\n> & {\n playerId: Player;\n};\n\ntype TypedPlayerRosterRootProps<Player extends string> = Omit<\n PlayerRosterRootProps,\n \"score\" | \"scoreLabel\" | \"badges\" | \"metadata\"\n> & {\n score?: (playerId: Player) => number | undefined;\n scoreLabel?: string | ((playerId: Player) => string | undefined);\n badges?: (\n playerId: Player,\n ) => ReadonlyArray<PlayerRosterBadge | null | false | undefined>;\n metadata?: (playerId: Player) => Record<string, unknown> | undefined;\n};\n\ntype TypedPlayerRosterListProps<Player extends string> = Omit<\n PlayerRosterListProps,\n \"children\"\n> & {\n children?: (player: TypedPlayerRosterEntry<Player>) => ReactNode;\n};\n\ntype TypedPlayerRosterPartProps<Player extends string> = Omit<\n PlayerRosterPartProps,\n \"player\"\n> & {\n player: TypedPlayerRosterEntry<Player>;\n};\n\ntype TypedPlayerRosterSwitchButtonProps<Player extends string> = Omit<\n PlayerRosterSwitchButtonProps,\n \"player\"\n> & {\n player: TypedPlayerRosterEntry<Player>;\n};\n\nexport type TypedPlayerRoster<Contract extends UIContract> = Omit<\n PlayerRosterComponents,\n \"Root\" | \"List\" | \"SwitchButton\" | \"Name\" | \"Score\" | \"Badges\"\n> & {\n Root(\n props: TypedPlayerRosterRootProps<PlayerKey<Contract>>,\n ): ReactElement | null;\n List(props: TypedPlayerRosterListProps<PlayerKey<Contract>>): ReactElement;\n SwitchButton(\n props: TypedPlayerRosterSwitchButtonProps<PlayerKey<Contract>>,\n ): ReactElement;\n Name(props: TypedPlayerRosterPartProps<PlayerKey<Contract>>): ReactElement;\n Score(\n props: TypedPlayerRosterPartProps<PlayerKey<Contract>>,\n ): ReactElement | null;\n Badges(\n props: TypedPlayerRosterPartProps<PlayerKey<Contract>>,\n ): ReactElement | null;\n};\n\nexport type TypedPhase<Contract extends UIContract> = Omit<\n typeof PhasePrimitive,\n \"Switch\"\n> & {\n Switch(props: PhaseSwitchProps<PhaseKey<Contract>>): ReactElement | null;\n};\n\nexport type TypedZone<Contract extends UIContract> = Omit<\n typeof ZonePrimitive,\n | \"Root\"\n | \"Item\"\n | \"CardAt\"\n | \"TopCard\"\n | \"CardAction\"\n | \"List\"\n | \"PileRoot\"\n | \"PileCards\"\n> & {\n Root<Zone extends ZoneKey<Contract>>(\n props: Omit<ZoneRootProps, \"zone\"> & { zone: Zone },\n ): ReactElement;\n Item<Card extends CardKey<Contract>>(\n props: Omit<ZoneItemProps, \"card\"> & { card: Card },\n ): ReactElement;\n CardAction<Card extends CardKey<Contract>>(\n props: Omit<ZoneCardActionProps, \"card\"> & { card?: Card },\n ): ReactElement;\n CardAt<Zone extends ZoneKey<Contract>>(\n props: Omit<ZoneCardAtProps<Zone>, \"zone\" | \"children\"> & {\n zone?: Zone;\n children?:\n | ReactNode\n | ((card: TypedZoneCardRenderItem<Contract>) => ReactNode);\n },\n ): ReactElement | null;\n TopCard<Zone extends ZoneKey<Contract>>(\n props: Omit<ZoneCardAtProps<Zone>, \"zone\" | \"index\" | \"children\"> & {\n zone?: Zone;\n children?:\n | ReactNode\n | ((card: TypedZoneCardRenderItem<Contract>) => ReactNode);\n },\n ): ReactElement | null;\n List(\n props: Omit<ZoneListProps, \"children\"> & {\n children?:\n | ReactNode\n | ((card: TypedZoneCardRenderItem<Contract>) => ReactNode);\n },\n ): ReactElement;\n PileRoot<Zone extends ZoneKey<Contract>>(\n props: Omit<ZonePileRootProps<Zone>, \"zone\"> & {\n zone: Zone;\n },\n ): ReactElement;\n PileCards(\n props: Omit<ZonePileCardsProps, \"renderCard\"> & {\n renderCard: (card: TypedZoneCardRenderItem<Contract>) => ReactNode;\n },\n ): ReactElement | null;\n};\n\nexport type TypedBoard<Contract extends UIContract> = Omit<\n typeof BoardPrimitive,\n \"Target\" | \"SpaceTarget\" | \"EdgeTarget\" | \"VertexTarget\" | \"HexGrid\"\n> & {\n Target<Target extends BoardTargetKey<Contract>>(\n props: Omit<BoardTargetProps, \"value\"> & { value: Target },\n ): ReactElement;\n SpaceTarget<Target extends BoardTargetKey<Contract>>(\n props: Omit<BoardSpaceTargetProps, \"value\"> & { value: Target },\n ): ReactElement;\n EdgeTarget<Target extends BoardTargetKey<Contract>>(\n props: Omit<BoardEdgeTargetProps, \"value\"> & { value: Target },\n ): ReactElement;\n VertexTarget<Target extends BoardTargetKey<Contract>>(\n props: Omit<BoardVertexTargetProps, \"value\"> & { value: Target },\n ): ReactElement;\n HexGrid<\n TBoard extends AnyHexBoardInput,\n TSpaceView extends { id: BoardSpaceIdOf<TBoard> },\n >(\n props: Omit<BoardHexGridProps<TBoard, TSpaceView>, \"interactions\"> & {\n interactions?:\n | Exclude<BoardHexGridInteractionFilter, object>\n | {\n edge?: ReadonlyArray<InteractionKey<Contract>>;\n vertex?: ReadonlyArray<InteractionKey<Contract>>;\n space?: ReadonlyArray<InteractionKey<Contract>>;\n };\n },\n ): ReactElement;\n};\n\nexport type TypedGame<\n _Contract extends UIContract,\n View = unknown,\n Player extends string = PlayerKey<_Contract>,\n Phase extends string = PhaseKey<_Contract>,\n> = Omit<typeof GamePrimitive, \"Root\"> & {\n Root(props: GameRootProps<View, Player, Phase>): ReactElement;\n Chrome(\n props: GameChromeProps<View, Player, Phase, InteractionKey<_Contract>>,\n ): ReactElement;\n};\n\nexport interface DreamboardUI<Contract extends UIContract = RegisteredUI> {\n readonly contract: Contract;\n Root(props: UIRootProps): ReactElement;\n readonly Game: TypedGame<Contract>;\n readonly Interaction: TypedInteraction<Contract>;\n readonly Prompt: TypedPrompt<Contract>;\n readonly PromptInbox: TypedPromptInbox<Contract>;\n readonly PlayerRoster: TypedPlayerRoster<Contract>;\n readonly Dice: DiceComponents;\n readonly Phase: TypedPhase<Contract>;\n readonly Zone: TypedZone<Contract>;\n readonly Board: TypedBoard<Contract>;\n}\n\nexport function createDreamboardUI<const Contract extends UIContract>(\n contract: Contract,\n): DreamboardUI<Contract> {\n return {\n contract,\n Root: UIPrimitive.Root,\n Game: GamePrimitive,\n Interaction: InteractionPrimitive,\n Prompt: PromptPrimitive,\n PromptInbox: PromptInboxPrimitive,\n PlayerRoster: PlayerRosterPrimitive,\n Dice: DicePrimitive,\n Phase: PhasePrimitive,\n Zone: ZonePrimitive,\n Board: BoardPrimitive,\n } as DreamboardUI<Contract>;\n}\n","import type { ReactElement, ReactNode } from \"react\";\nimport { createElement } from \"react\";\nimport type {\n BoardHexGridProps,\n BoardHexViewProps,\n} from \"../primitives/index.js\";\nimport type { BoardSpaceTargetProps } from \"../primitives/board.js\";\nimport { createBoardTargetInputSlot } from \"./slots.js\";\nimport type {\n WorkspaceBoardSurfaceDescriptor,\n WorkspaceContractContext,\n} from \"./types.js\";\n\nexport function createUseBoardSurface<Card>(\n ctx: WorkspaceContractContext<Card>,\n) {\n const { baseUI, runtimeBoard } = ctx;\n return function useBoardSurface() {\n return {\n Root: ({ children }: { children?: ReactNode }) =>\n createElement(baseUI.Board.Root, { children }),\n Space: (props: BoardSpaceTargetProps<string>) =>\n createElement(runtimeBoard.SpaceTarget, props),\n slot: {\n space: createBoardTargetInputSlot(ctx, \"space\"),\n playerSpace: createBoardTargetInputSlot(ctx, \"space\"),\n edge: createBoardTargetInputSlot(ctx, \"edge\"),\n vertex: createBoardTargetInputSlot(ctx, \"vertex\"),\n tile: createBoardTargetInputSlot(ctx, \"tile\"),\n },\n };\n };\n}\n\n/**\n * Assembles the `Board` namespace for one workspace contract. Called once per\n * `createWorkspaceUIContract` invocation so `HexView`/`HexGrid` keep stable\n * component identities.\n */\nexport function createBoardNamespace<Card>(\n ctx: WorkspaceContractContext<Card>,\n) {\n const { options, baseUI } = ctx;\n const useBoardSurface = createUseBoardSurface(ctx);\n\n return {\n surface<Board extends string>(\n board: Board,\n ): WorkspaceBoardSurfaceDescriptor<Board> {\n return { kind: \"board\", board };\n },\n useSurface: useBoardSurface,\n HexView({ board: boardId, ...props }: { board: string }) {\n return createElement(\n baseUI.Board.HexView as never,\n {\n ...props,\n board: options.hexStaticBoards[boardId],\n } as BoardHexViewProps<never, never>,\n ) as ReactElement;\n },\n HexGrid({ board: boardId, ...props }: { board: string }) {\n return createElement(\n baseUI.Board.HexGrid as never,\n {\n ...props,\n board: options.hexStaticBoards[boardId],\n } as BoardHexGridProps<never, never>,\n ) as ReactElement;\n },\n };\n}\n","import type { ReactElement, ReactNode } from \"react\";\nimport { Fragment as ReactFragment, createElement } from \"react\";\nimport { useResolvedCardTargetValue } from \"../primitives/index.js\";\nimport type {\n WorkspaceBoardTargetInputSlot,\n WorkspaceCardInputSlot,\n WorkspaceContractContext,\n WorkspaceFormInputSlot,\n} from \"./types.js\";\n\n/**\n * Render-prop body for the card surface `slot.card.Value`. Surfaces the live\n * draft value for the active interaction's card-target input — the selected\n * card-id array for `selection: \"many\"` collectors, or the single id for\n * `selection: \"one\"`. Renders nothing meaningful (`undefined`) outside an\n * `<Interaction.Root>`.\n */\nfunction CardSlotValue({\n children,\n}: {\n children: (value: unknown | undefined) => ReactNode;\n}): ReactElement {\n const value = useResolvedCardTargetValue();\n return createElement(ReactFragment, null, children(value));\n}\n\nexport function createFormInputSlot<Card>(\n ctx: WorkspaceContractContext<Card>,\n input: string,\n interaction?: string,\n): WorkspaceFormInputSlot {\n const { baseUI, withInteractionRoot } = ctx;\n return {\n Field: (props: { children?: ReactNode }) => {\n const field = createElement(baseUI.Interaction.Field, {\n ...props,\n input: input as never,\n });\n return interaction ? withInteractionRoot(interaction, field) : field;\n },\n Options: () => null,\n Value: ({\n children,\n }: {\n children: (value: unknown | undefined) => ReactNode;\n }) => createElement(ReactFragment, null, children(undefined)),\n Default: ({ children }: { children?: ReactNode }) =>\n createElement(ReactFragment, null, children),\n };\n}\n\nexport function createCardInputSlot<Card>(\n ctx: WorkspaceContractContext<Card>,\n): WorkspaceCardInputSlot {\n const { runtimeInteraction } = ctx;\n return {\n Card: ({ value, ...props }: { value: string; children?: ReactNode }) =>\n createElement(runtimeInteraction.CardInput, {\n ...props,\n input: \"cardId\",\n unsafeCardId: value,\n }),\n Cards: () => null,\n Value: ({\n children,\n }: {\n children: (value: unknown | undefined) => ReactNode;\n }) => createElement(CardSlotValue, { children }),\n Default: ({ children }: { children?: ReactNode }) =>\n createElement(ReactFragment, null, children),\n };\n}\n\nexport function createBoardTargetInputSlot<Card>(\n ctx: WorkspaceContractContext<Card>,\n kind: \"space\" | \"edge\" | \"vertex\" | \"tile\",\n): WorkspaceBoardTargetInputSlot<typeof kind> {\n const { runtimeBoard } = ctx;\n const Target = ({\n value,\n ...props\n }: {\n value: string;\n children?: ReactNode;\n }) => {\n if (kind === \"edge\") {\n return createElement(runtimeBoard.EdgeTarget, { ...props, value });\n }\n if (kind === \"vertex\") {\n return createElement(runtimeBoard.VertexTarget, { ...props, value });\n }\n return createElement(runtimeBoard.SpaceTarget, { ...props, value });\n };\n return {\n Target,\n Value: ({\n children,\n }: {\n children: (value: unknown | undefined) => ReactNode;\n }) => createElement(ReactFragment, null, children(undefined)),\n Default: ({ children }: { children?: ReactNode }) =>\n createElement(ReactFragment, null, children),\n };\n}\n","import type { ReactElement, ReactNode } from \"react\";\nimport { createElement } from \"react\";\nimport type {\n InteractionDialogProps,\n InteractionFormPrimitiveProps,\n InteractionStateProps,\n InteractionSubmitProps,\n InteractionTriggerProps,\n} from \"../primitives/index.js\";\nimport { createFormInputSlot } from \"./slots.js\";\nimport type {\n WorkspaceContractContext,\n WorkspaceInteractionFormDescriptor,\n WorkspaceInteractionFormsDescriptor,\n} from \"./types.js\";\n\n/**\n * Builds the interaction-form surface pieces and the `Interaction` namespace\n * for one workspace contract. Called once per `createWorkspaceUIContract`\n * invocation so `InteractionRoutes` keeps a stable component identity.\n */\nexport function createInteractionForms<Card>(\n ctx: WorkspaceContractContext<Card>,\n) {\n const { options, baseUI, runtimeInteraction, withInteractionRoot } = ctx;\n\n function InteractionRoutes({\n routes,\n fallback,\n includeUnavailable,\n }: {\n routes: Record<\n string,\n {\n collect: Record<string, unknown>;\n }\n >;\n fallback?: ReactNode;\n includeUnavailable?: boolean | null;\n }): ReactElement {\n return createElement(runtimeInteraction.Routes, {\n routes,\n fallback,\n includeUnavailable,\n });\n }\n\n function useInteractionFormSurface(interaction: string) {\n const validInputs = options.formInputKeysForInteraction(interaction);\n const slot = Object.fromEntries(\n [...validInputs].map((input) => [\n input,\n createFormInputSlot(ctx, input, interaction),\n ]),\n );\n return {\n Root: ({ children }: { children?: ReactNode }) =>\n withInteractionRoot(interaction, children),\n Form: (props: InteractionFormPrimitiveProps) =>\n withInteractionRoot(\n interaction,\n createElement(baseUI.Interaction.Form, props),\n ),\n Dialog: (props: InteractionDialogProps) =>\n withInteractionRoot(\n interaction,\n createElement(baseUI.Interaction.Dialog, props),\n ),\n State: (props: InteractionStateProps) =>\n withInteractionRoot(\n interaction,\n createElement(baseUI.Interaction.State, props),\n ),\n Arm: (props: InteractionTriggerProps) =>\n withInteractionRoot(\n interaction,\n createElement(baseUI.Interaction.Trigger, props),\n ),\n Submit: (props: InteractionSubmitProps) =>\n withInteractionRoot(\n interaction,\n createElement(baseUI.Interaction.Submit, props),\n ),\n Field: ({ input, ...props }: { input: string; children?: ReactNode }) =>\n withInteractionRoot(\n interaction,\n createElement(baseUI.Interaction.Field, {\n ...props,\n input: input as never,\n }),\n ),\n slot,\n };\n }\n\n const Interaction = {\n State: baseUI.Interaction.State,\n Dialog: baseUI.Interaction.Dialog,\n useForm: useInteractionFormSurface,\n form<const Interaction extends string>(\n interaction: Interaction,\n ): WorkspaceInteractionFormDescriptor<Interaction> {\n return { kind: \"form\", interaction };\n },\n forms<const Interactions extends Readonly<Record<string, string>>>(\n interactions: Interactions,\n ): WorkspaceInteractionFormsDescriptor<Interactions> {\n return { kind: \"forms\", interactions };\n },\n Routes: InteractionRoutes,\n };\n\n return { Interaction, useInteractionFormSurface };\n}\n","import type {\n WorkspaceHandOptions,\n WorkspaceSurfaceDescriptor,\n WorkspaceSurfaceSpec,\n} from \"./types.js\";\n\ninterface SurfaceResolverDeps {\n readonly Board: {\n useSurface(name: string): unknown;\n };\n readonly Zone: {\n useHand(name: string, zoneOptions: WorkspaceHandOptions): unknown;\n usePile(name: string, zoneOptions: { zone: string }): unknown;\n useCardCollection(\n name: string,\n zoneOptions: { zones: readonly string[]; mode?: \"all\" | \"top-card\" },\n ): unknown;\n };\n readonly useInteractionFormSurface: (interaction: string) => unknown;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction isSurfaceDescriptor(\n value: unknown,\n): value is WorkspaceSurfaceDescriptor {\n return (\n isPlainObject(value) &&\n typeof (value as { kind?: unknown }).kind === \"string\"\n );\n}\n\n/**\n * Builds the surface-spec resolvers for one workspace contract.\n */\nexport function createSurfaceResolvers({\n Board,\n Zone,\n useInteractionFormSurface,\n}: SurfaceResolverDeps) {\n const boardSurface = Board.useSurface;\n const zoneHandSurface = Zone.useHand;\n const zonePileSurface = Zone.usePile;\n const zoneCardCollectionSurface = Zone.useCardCollection;\n const interactionFormSurface = useInteractionFormSurface;\n\n function resolveSurfaceDescriptor(\n name: string,\n descriptor: WorkspaceSurfaceDescriptor,\n ): unknown {\n switch (descriptor.kind) {\n case \"board\":\n return boardSurface(name);\n case \"hand\":\n return zoneHandSurface(name, {\n zone: descriptor.zone,\n role: descriptor.role,\n label: descriptor.label,\n order: descriptor.order,\n });\n case \"pile\":\n return zonePileSurface(name, { zone: descriptor.zone });\n case \"piles\":\n return Object.fromEntries(\n descriptor.zones.map((zone) => [\n zone,\n zonePileSurface(String(zone), { zone }),\n ]),\n );\n case \"cardCollection\":\n return zoneCardCollectionSurface(name, {\n zones: descriptor.zones,\n mode: descriptor.mode,\n });\n case \"form\":\n return interactionFormSurface(descriptor.interaction);\n case \"forms\":\n return Object.fromEntries(\n Object.entries(descriptor.interactions).map(([key, interaction]) => [\n key,\n interactionFormSurface(interaction),\n ]),\n );\n }\n }\n\n function resolveSurfaceSpec(spec: WorkspaceSurfaceSpec): unknown {\n return Object.fromEntries(\n Object.entries(spec).map(([key, value]) => [\n key,\n isSurfaceDescriptor(value)\n ? resolveSurfaceDescriptor(key, value)\n : resolveSurfaceSpec(value as WorkspaceSurfaceSpec),\n ]),\n );\n }\n\n function defineSurfaces<const Spec extends WorkspaceSurfaceSpec>(spec: Spec) {\n return function useDefinedSurfaces() {\n return resolveSurfaceSpec(spec);\n };\n }\n\n return { defineSurfaces, resolveSurfaceSpec, resolveSurfaceDescriptor };\n}\n","import type { ButtonHTMLAttributes, ReactNode } from \"react\";\nimport { Fragment as ReactFragment, createElement } from \"react\";\nimport { clsx } from \"clsx\";\nimport { usePluginState } from \"../context/PluginStateContext.js\";\nimport { CardFace, type ViewCard } from \"../../ui.js\";\nimport type { InteractionCardInputRenderState } from \"../primitives/index.js\";\nimport type { ZoneListProps } from \"../primitives/zone.js\";\nimport type { PluginStateSnapshot } from \"../types/plugin-state.js\";\nimport { createHandPieces } from \"./hand.js\";\nimport { createCardInputSlot } from \"./slots.js\";\nimport type {\n WorkspaceCardCollectionSurfaceDescriptor,\n WorkspaceContractContext,\n WorkspaceHandOptions,\n WorkspaceHandSurfaceDescriptor,\n WorkspacePileSurfaceDescriptor,\n WorkspacePilesSurfaceDescriptor,\n} from \"./types.js\";\n\nconst DEFAULT_ZONE_CARD_CLASS =\n \"group relative border-0 bg-transparent p-0 transition-transform enabled:cursor-pointer enabled:hover:-translate-y-2 data-[selected=true]:-translate-y-3 disabled:cursor-not-allowed data-[eligible=false]:opacity-45 data-[eligible=false]:grayscale data-[eligible=false]:hover:translate-y-0 data-[card-available=false]:opacity-45 data-[card-available=false]:grayscale\";\n\nfunction cardRenderItemToViewCard(card: unknown, cardId: string): ViewCard {\n if (\n card &&\n typeof card === \"object\" &&\n \"hidden\" in card &&\n (card as { hidden?: unknown }).hidden === false\n ) {\n return card as unknown as ViewCard;\n }\n return {\n id: cardId,\n cardType: \"hidden\",\n name: \"Hidden card\",\n properties: {},\n };\n}\n\nexport function createZoneCardsComponent<Card>(\n ctx: WorkspaceContractContext<Card>,\n zones: readonly string[],\n) {\n const { baseUI, runtimeZone } = ctx;\n return ({\n empty,\n children,\n ...props\n }: {\n empty?: ReactNode;\n children: (card: Card) => ReactNode;\n } & Omit<ZoneListProps, \"children\" | \"empty\">) =>\n createElement(\n ReactFragment,\n null,\n ...zones.map((zone) =>\n createElement(baseUI.Zone.Root, {\n key: zone,\n zone: zone as never,\n children: createElement(runtimeZone.List, {\n ...props,\n empty,\n children,\n }),\n }),\n ),\n );\n}\n\nexport function createZoneCardComponent<Card>(\n ctx: WorkspaceContractContext<Card>,\n) {\n const { options, baseUI, runtimeInteraction } = ctx;\n return ({\n card,\n children,\n className,\n ...props\n }: {\n card: Card;\n children?: ReactNode;\n } & Omit<ButtonHTMLAttributes<HTMLButtonElement>, \"type\" | \"value\">) => {\n const cardId = options.cardIdFromZoneCard(card);\n const zone = options.zoneIdFromZoneCard(card);\n const viewCard = cardRenderItemToViewCard(card, cardId);\n const faceDown =\n !!card &&\n typeof card === \"object\" &&\n \"hidden\" in card &&\n (card as { hidden?: unknown }).hidden === true;\n const renderCardFace = (state: InteractionCardInputRenderState) =>\n createElement(CardFace, {\n card: viewCard,\n selected: state.selected,\n disabled: state.disabled || !state.eligible,\n faceDown,\n size: \"sm\",\n children,\n });\n const match = usePluginState((state: PluginStateSnapshot) => {\n const candidates =\n state.gameplay.zones[zone]?.playableByCardId[cardId] ?? [];\n for (const descriptor of candidates) {\n const input = descriptor.inputs.find(\n (candidateInput) =>\n candidateInput.domain.type === \"cardTarget\" &&\n candidateInput.domain.projection === \"resolved\" &&\n candidateInput.domain.eligibleTargets.includes(cardId),\n );\n if (input) return { descriptor, input };\n }\n return null;\n });\n if (!match) {\n return createElement(\n \"div\",\n {\n ...props,\n className: clsx(\"relative inline-flex\", className),\n \"data-dreamboard-zone-card\": \"\",\n \"data-card-id\": cardId,\n \"data-zone\": zone,\n \"data-interactive\": false,\n },\n createElement(CardFace, {\n card: viewCard,\n faceDown,\n size: \"sm\",\n children,\n }),\n );\n }\n return createElement(baseUI.Zone.Root, {\n zone: zone as never,\n children: createElement(runtimeInteraction.Root, {\n interaction: match.descriptor.interactionKey,\n children: createElement(runtimeInteraction.CardInput, {\n ...props,\n className: clsx(DEFAULT_ZONE_CARD_CLASS, className),\n input: match.input.key,\n unsafeCardId: cardId,\n children: renderCardFace,\n }),\n }),\n });\n };\n}\n\n/**\n * Assembles the `Zone` namespace for one workspace contract. Called once per\n * `createWorkspaceUIContract` invocation.\n */\nexport function createZoneNamespace<Card>(ctx: WorkspaceContractContext<Card>) {\n const { createHandCardsComponent, createStagingComponent } =\n createHandPieces(ctx);\n\n return {\n hand<Zone extends string>(\n zone: Zone,\n options: Omit<WorkspaceHandSurfaceDescriptor<Zone>, \"kind\" | \"zone\">,\n ): WorkspaceHandSurfaceDescriptor<Zone> {\n return { kind: \"hand\", zone, ...options };\n },\n pile<Zone extends string>(\n zone: Zone,\n ): WorkspacePileSurfaceDescriptor<Zone> {\n return { kind: \"pile\", zone };\n },\n piles<const Zones extends readonly string[]>(\n zones: Zones,\n ): WorkspacePilesSurfaceDescriptor<Zones> {\n return { kind: \"piles\", zones };\n },\n collection<const Zones extends readonly string[]>(\n zones: Zones,\n options: { mode?: \"all\" | \"top-card\" } = {},\n ): WorkspaceCardCollectionSurfaceDescriptor<Zones> {\n return { kind: \"cardCollection\", zones, mode: options.mode };\n },\n useHand(_name: string, zoneOptions: WorkspaceHandOptions) {\n const handComponentOptions = {\n name: _name,\n zone: zoneOptions.zone,\n role: zoneOptions.role,\n label: zoneOptions.label,\n order: zoneOptions.order,\n };\n return {\n Hand: createHandCardsComponent(handComponentOptions),\n Card: createZoneCardComponent(ctx),\n Staging: createStagingComponent(handComponentOptions),\n slot: { card: createCardInputSlot(ctx) },\n };\n },\n usePile(_name: string, zoneOptions: { zone: string }) {\n return {\n Pile: createZoneCardsComponent(ctx, [zoneOptions.zone]),\n Card: createZoneCardComponent(ctx),\n };\n },\n useCardCollection(\n _name: string,\n zoneOptions: { zones: readonly string[]; mode?: \"all\" | \"top-card\" },\n ) {\n void zoneOptions.mode;\n return {\n Collection: createZoneCardsComponent(ctx, zoneOptions.zones),\n Card: createZoneCardComponent(ctx),\n slot: { card: createCardInputSlot(ctx) },\n };\n },\n };\n}\n","import type { ReactNode } from \"react\";\nimport { createElement, useMemo } from \"react\";\nimport { clsx } from \"clsx\";\nimport { useIsMobile } from \"../../ui.js\";\nimport { useRegisterMobileHand } from \"../../ui/components.js\";\nimport { useZoneCards } from \"../primitives/index.js\";\nimport {\n HandSurfaceView,\n HandStagingView,\n dropTargetIdFor,\n type HandSelectionSummary,\n type HandSurfaceViewProps,\n type RuntimeDropTarget,\n} from \"../primitives/hand-surface.js\";\nimport type { AuthoredCardIntent } from \"../primitives/hand-intent-adapter.js\";\nimport type {\n CardDropTargetVisualState,\n HandInteractionPolicy,\n HandLayoutKind,\n HandLayoutPolicy,\n InteractionVisualState,\n} from \"../../ui.js\";\nimport type { ZoneListProps } from \"../primitives/zone.js\";\nimport { isInteractionAvailable } from \"../utils/interaction-status.js\";\nimport type {\n WorkspaceContractContext,\n WorkspaceHandComponentOptions,\n} from \"./types.js\";\n\n/**\n * Builds the hand-surface pieces for one workspace contract. Called once per\n * `createWorkspaceUIContract` invocation so `GeneratedHandCards` keeps a\n * single stable component identity per contract (its `useRegisterMobileHand`\n * registration depends on this).\n */\nexport function createHandPieces<Card>(ctx: WorkspaceContractContext<Card>) {\n const { baseUI } = ctx;\n\n function createHandCardsComponent(options: WorkspaceHandComponentOptions) {\n return ({\n empty,\n children,\n className,\n layout,\n mobileInteraction,\n cardSize,\n ariaLabel,\n dropTargets,\n renderDropTargets,\n onCardIntent,\n renderSummary,\n renderActions,\n onSelectionSummary,\n ...props\n }: {\n empty?: ReactNode;\n children: (card: Card, state: InteractionVisualState) => ReactNode;\n className?: string;\n layout?: HandLayoutKind | HandLayoutPolicy;\n mobileInteraction?: HandInteractionPolicy;\n cardSize?: \"sm\" | \"md\" | \"lg\";\n ariaLabel?: string;\n dropTargets?: ReadonlyArray<{\n target:\n | { kind: \"card\"; card: string }\n | { kind: \"space\"; target: string }\n | { kind: \"edge\"; target: string }\n | { kind: \"vertex\"; target: string }\n | { kind: \"tile\"; target: string };\n label: string;\n render: (state: CardDropTargetVisualState) => ReactNode;\n className?: string;\n role?: string;\n order?: number;\n }>;\n renderDropTargets?: (children: ReactNode) => ReactNode;\n onCardIntent?: (intent: AuthoredCardIntent) => void;\n renderSummary?: (summary: HandSelectionSummary) => ReactNode;\n renderActions?: (summary: HandSelectionSummary) => ReactNode;\n onSelectionSummary?: (summary: HandSelectionSummary) => void;\n } & Omit<ZoneListProps, \"children\" | \"empty\">) =>\n createElement(baseUI.Zone.Root, {\n zone: options.zone as never,\n // Fill the author's container instead of shrink-wrapping to the fan's\n // own measured width. Without a definite width here, a centering parent\n // sizes to the cards row, the hand measures that, recomputes a new fan\n // width, and the layout chases itself (a ResizeObserver loop). `w-full`\n // pins the outermost hand element to the available width and breaks the\n // cycle for every author layout.\n className: \"w-full min-w-0\",\n children: createElement(GeneratedHandCards, {\n ...props,\n hand: options,\n className,\n empty,\n children,\n layout,\n mobileInteraction,\n cardSize,\n ariaLabel,\n dropTargets,\n renderDropTargets,\n onCardIntent,\n renderSummary,\n renderActions,\n onSelectionSummary,\n }),\n });\n }\n\n function GeneratedHandCards({\n hand,\n empty,\n children,\n className,\n sort,\n layout,\n mobileInteraction,\n cardSize,\n ariaLabel,\n dropTargets,\n renderDropTargets,\n onCardIntent,\n renderSummary,\n renderActions,\n onSelectionSummary,\n }: {\n hand: WorkspaceHandComponentOptions;\n empty?: ReactNode;\n children: (card: Card, state: InteractionVisualState) => ReactNode;\n className?: string;\n layout?: HandLayoutKind | HandLayoutPolicy;\n mobileInteraction?: HandInteractionPolicy;\n cardSize?: \"sm\" | \"md\" | \"lg\";\n ariaLabel?: string;\n dropTargets?: ReadonlyArray<{\n target:\n | { kind: \"card\"; card: string }\n | { kind: \"space\"; target: string }\n | { kind: \"edge\"; target: string }\n | { kind: \"vertex\"; target: string }\n | { kind: \"tile\"; target: string };\n label: string;\n render: (state: CardDropTargetVisualState) => ReactNode;\n className?: string;\n role?: string;\n order?: number;\n }>;\n renderDropTargets?: (children: ReactNode) => ReactNode;\n onCardIntent?: (intent: AuthoredCardIntent) => void;\n renderSummary?: (summary: HandSelectionSummary) => ReactNode;\n renderActions?: (summary: HandSelectionSummary) => ReactNode;\n onSelectionSummary?: (summary: HandSelectionSummary) => void;\n } & Omit<ZoneListProps, \"children\" | \"empty\">) {\n const isMobile = useIsMobile();\n const { items, count } = useZoneCards({ sort });\n // One predictable presentation for every hand: the projected surface\n // (fan on desktop, tray on mobile by default). Authors choose other shapes\n // explicitly with `layout` (e.g. layout=\"strip\"). We no longer fall back to\n // a bare scroll strip when no interaction props are passed, so the layout —\n // and the eligible/selected projection — stays consistent across phases.\n const handClassName = clsx(\"min-h-[112px]\", className);\n const resolvedDropTargets = useMemo<RuntimeDropTarget[] | undefined>(() => {\n if (!dropTargets || dropTargets.length === 0) return undefined;\n return dropTargets.map((dt) => {\n const value =\n dt.target.kind === \"card\" ? dt.target.card : dt.target.target;\n return {\n targetId: dropTargetIdFor(dt.target.kind, value),\n label: dt.label,\n render: dt.render,\n className: dt.className,\n role: dt.role,\n order: dt.order,\n };\n });\n }, [dropTargets]);\n const content = useMemo(\n () =>\n createElement(HandSurfaceView, {\n zone: hand.zone,\n cards: items,\n renderCard: (card, state) => children(card as Card, state),\n layout,\n mobileInteraction,\n dropTargets: resolvedDropTargets,\n renderDropTargets,\n cardSize,\n renderEmpty: empty !== undefined ? () => empty : undefined,\n ariaLabel,\n onIntentRouted: onCardIntent\n ? (intent) => onCardIntent(intent)\n : undefined,\n renderSummary,\n renderActions,\n onSelectionSummary,\n className: handClassName,\n } satisfies HandSurfaceViewProps<(typeof items)[number]>),\n [\n ariaLabel,\n cardSize,\n children,\n empty,\n hand.zone,\n handClassName,\n items,\n layout,\n mobileInteraction,\n onCardIntent,\n onSelectionSummary,\n renderActions,\n renderDropTargets,\n renderSummary,\n resolvedDropTargets,\n ],\n );\n const active = items.some(\n (item) =>\n !item.hidden &&\n item.interactions.some((descriptor) =>\n isInteractionAvailable(descriptor),\n ),\n );\n const autoOpen = items.some(\n (item) =>\n !item.hidden &&\n item.interactions.some(\n (descriptor) =>\n isInteractionAvailable(descriptor) &&\n descriptor.inputs.some(\n (input) =>\n input.domain.type === \"cardTarget\" &&\n input.domain.selection?.mode === \"many\",\n ),\n ),\n );\n const version = items\n .map((item) =>\n item.hidden\n ? `${item.id}:hidden`\n : `${item.id}:${item.cardType}:${JSON.stringify(item.properties)}`,\n )\n .join(\"|\");\n const registration = useMemo(\n () => ({\n id: `${hand.name}:${hand.zone}`,\n zone: hand.zone,\n label: hand.label,\n role: hand.role,\n order: hand.order,\n version,\n count,\n active,\n autoOpen,\n content: createElement(baseUI.Zone.Root, {\n zone: hand.zone as never,\n children: content,\n }),\n }),\n [\n active,\n autoOpen,\n content,\n count,\n hand.label,\n hand.name,\n hand.order,\n hand.role,\n hand.zone,\n version,\n ],\n );\n useRegisterMobileHand(registration);\n\n return isMobile ? null : content;\n }\n\n function createStagingComponent(options: WorkspaceHandComponentOptions) {\n return ({\n children,\n label,\n renderEmptySlot,\n cardSize,\n ariaLabel,\n className,\n }: {\n children: (card: Card) => ReactNode;\n label?: ReactNode;\n renderEmptySlot?: (index: number) => ReactNode;\n cardSize?: \"sm\" | \"md\" | \"lg\";\n ariaLabel?: string;\n className?: string;\n }) =>\n createElement(HandStagingView, {\n zone: options.zone,\n renderCard: (card) => children(card as Card),\n renderEmptySlot,\n label,\n cardSize,\n ariaLabel,\n className,\n });\n }\n\n return { createHandCardsComponent, createStagingComponent };\n}\n"],"mappings":"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","names":["createElement","createElement","createElement","createElement","createElement","Interaction","Board","Zone","ReactFragment","createElement","clsx","createElement","createElement","createElement","ReactFragment","clsx","createElement","Interaction","Board","Zone","UI"]}