@dreamboard-games/sdk 0.4.0-alpha.11 → 0.4.0-alpha.13

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 (43) hide show
  1. package/REFERENCE.md +444 -9
  2. package/dist/authoring/index.js +3 -3
  3. package/dist/authoring-compiler.js +4 -4
  4. package/dist/authoring-materialize-cli.js +4 -4
  5. package/dist/{chunk-THTFQZZ3.js → chunk-42HQLHVA.js} +3 -3
  6. package/dist/{chunk-RP6QDQGI.js → chunk-7JBPOJOF.js} +46 -1
  7. package/dist/chunk-7JBPOJOF.js.map +1 -0
  8. package/dist/{chunk-SACZWUA6.js → chunk-HIH6Y4FA.js} +86 -1224
  9. package/dist/{chunk-SACZWUA6.js.map → chunk-HIH6Y4FA.js.map} +1 -1
  10. package/dist/{chunk-RU3Z5J6V.js → chunk-KZFHTUI5.js} +4 -4
  11. package/dist/{chunk-HRWI2DIJ.js → chunk-MLFHVYF7.js} +2 -2
  12. package/dist/{chunk-3OY46H7D.js → chunk-OFIDC7DJ.js} +3 -3
  13. package/dist/{chunk-CP3BF3B2.js → chunk-THWT4V3Z.js} +2 -2
  14. package/dist/{chunk-CP3BF3B2.js.map → chunk-THWT4V3Z.js.map} +1 -1
  15. package/dist/{chunk-4IIY742N.js → chunk-UTSBXZAM.js} +2 -2
  16. package/dist/chunk-VWTKGIYF.js +90 -0
  17. package/dist/chunk-VWTKGIYF.js.map +1 -0
  18. package/dist/codegen.js +1 -1
  19. package/dist/{index-CRfZ21dM.d.ts → index-CR69MyWr.d.ts} +1 -1
  20. package/dist/index.js +2 -2
  21. package/dist/package-set.d.ts +2 -2
  22. package/dist/package-set.js +2 -2
  23. package/dist/reducer/advanced.js +7 -82
  24. package/dist/reducer/advanced.js.map +1 -1
  25. package/dist/reducer-contract.js +1 -1
  26. package/dist/reference-game-compiler.js +2 -2
  27. package/dist/reference-game-source-manifest-cli.js +2 -2
  28. package/dist/runtime/workspace-contract.d.ts +342 -10
  29. package/dist/runtime/workspace-contract.js +7 -1
  30. package/dist/runtime.d.ts +1 -1
  31. package/dist/runtime.js +7 -3
  32. package/dist/runtime.js.map +1 -1
  33. package/dist/testing-runtime.js +2 -2
  34. package/dist/testing.d.ts +84 -20
  35. package/dist/testing.js +167 -23
  36. package/dist/testing.js.map +1 -1
  37. package/package.json +1 -1
  38. package/dist/chunk-RP6QDQGI.js.map +0 -1
  39. /package/dist/{chunk-THTFQZZ3.js.map → chunk-42HQLHVA.js.map} +0 -0
  40. /package/dist/{chunk-RU3Z5J6V.js.map → chunk-KZFHTUI5.js.map} +0 -0
  41. /package/dist/{chunk-HRWI2DIJ.js.map → chunk-MLFHVYF7.js.map} +0 -0
  42. /package/dist/{chunk-3OY46H7D.js.map → chunk-OFIDC7DJ.js.map} +0 -0
  43. /package/dist/{chunk-4IIY742N.js.map → chunk-UTSBXZAM.js.map} +0 -0
@@ -0,0 +1 @@
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","../src/runtime/workspace-contract/game-ui-contract.ts"],"sourcesContent":["import { Fragment, createElement } from \"react\";\nimport type { ComponentType, 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 BoardGridInteractionFilter,\n BoardHexGridProps,\n BoardHexViewProps,\n BoardSquareGridInteractionFilter,\n BoardSquareGridProps,\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\";\nexport type { WorkspaceInteractionFormDialogProps } from \"./forms.js\";\nimport { createSurfaceResolvers } from \"./surfaces.js\";\nimport { createZoneNamespace } from \"./zones.js\";\n\nexport {\n createGameUiContract,\n type CreateGameUiContractOptions,\n type GameUiBoardSurface,\n type GameUiCardCollectionSurface,\n type GameUiContract,\n type GameUiGameRootState,\n type GameUiHandSurface,\n type GameUiInteractionDescriptor,\n type GameUiInteractionFormSurface,\n type GameUiInteractionKey,\n type GameUiInteractionParamsOf,\n type GameUiInteractionRoutes,\n type GameUiManifestTypes,\n type GameUiMe,\n type GameUiPhaseName,\n type GameUiPileSurface,\n type GameUiPlayers,\n type GameUiTurn,\n type GameUiView,\n type GameUiViewName,\n type GameWorkspaceUI,\n} from \"./game-ui-contract.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 interface DefineGameUIConfig<GameState, Surfaces> {\n useSurfaces: () => Surfaces;\n interactionRoutes?: (context: {\n game: GameState;\n surfaces: Surfaces;\n }) => Record<string, { collect: Record<string, unknown> }>;\n phases: Record<\n string,\n (context: { game: GameState; surfaces: Surfaces }) => ReactNode\n >;\n renderInteractions?: (context: {\n game: GameState;\n surfaces: Surfaces;\n }) => ReactNode;\n fallback?: ReactNode | ((phase: string | null) => ReactNode);\n includeUnavailableInteractions?: boolean | null;\n}\n\nexport function createWorkspaceUIContract<\n WorkspaceUI,\n Contract extends UIContract,\n Resource extends string,\n Card,\n HexBoards extends Record<string, unknown>,\n SquareBoards extends Record<string, unknown> = Record<string, unknown>,\n>(\n options: WorkspaceContractOptions<\n Contract,\n Resource,\n Card,\n HexBoards,\n SquareBoards\n >,\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 const runtimeGameRoot = baseUI.Game.Root as ComponentType<{\n children: (game: unknown) => ReactNode;\n }>;\n const runtimePhaseSwitch = baseUI.Phase.Switch as ComponentType<{\n routes: Record<string, () => ReactNode>;\n fallback?: ReactNode | ((phase: string | null) => ReactNode);\n }>;\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 defineGameUI<GameState, Surfaces>({\n useSurfaces,\n interactionRoutes,\n phases,\n renderInteractions,\n fallback,\n includeUnavailableInteractions,\n }: DefineGameUIConfig<GameState, Surfaces>) {\n function DefinedGameUIFrame({ game }: { game: GameState }) {\n const surfaces = useSurfaces();\n const phaseRoutes = Object.fromEntries(\n Object.entries(phases).map(([phase, render]) => [\n phase,\n () => render({ game, surfaces }),\n ]),\n );\n const routeMap = interactionRoutes?.({ game, surfaces });\n return createElement(\n Fragment,\n null,\n routeMap\n ? createElement(runtimeInteraction.Routes, {\n routes: routeMap,\n includeUnavailable: includeUnavailableInteractions,\n })\n : null,\n createElement(runtimePhaseSwitch, {\n routes: phaseRoutes,\n fallback,\n }),\n renderInteractions?.({ game, surfaces }) ?? null,\n );\n }\n\n return function DefinedGameUI(props: Omit<UIRootProps, \"children\">) {\n return createElement(UI.Root, {\n ...props,\n children: createElement(runtimeGameRoot, {\n children: (rawGame: unknown) =>\n createElement(DefinedGameUIFrame, {\n game: rawGame as GameState,\n }),\n }),\n });\n };\n },\n Interaction,\n Board,\n Zone,\n ResourceCounter: resourceCounter,\n };\n\n return UI as WorkspaceUI;\n}\n\nexport type {\n BoardGridInteractionFilter,\n BoardHexGridProps,\n BoardHexViewProps,\n BoardSquareGridInteractionFilter,\n BoardSquareGridProps,\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 BoardSquareGridProps,\n type BoardSquareGridInteractionFilter,\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 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 {\n AnyHexBoardInput,\n AnySquareBoardInput,\n BoardSpaceIdOf,\n} 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\nexport type TypedPlayerRoster<Contract extends UIContract> = Omit<\n PlayerRosterComponents,\n \"Root\" | \"List\" | \"Name\" | \"Score\" | \"Badges\"\n> & {\n Root(\n props: TypedPlayerRosterRootProps<PlayerKey<Contract>>,\n ): ReactElement | null;\n List(props: TypedPlayerRosterListProps<PlayerKey<Contract>>): 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\"\n | \"SpaceTarget\"\n | \"EdgeTarget\"\n | \"VertexTarget\"\n | \"HexGrid\"\n | \"SquareGrid\"\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 SquareGrid<TBoard extends AnySquareBoardInput>(\n props: Omit<BoardSquareGridProps<TBoard>, \"interactions\"> & {\n interactions?:\n | Exclude<BoardSquareGridInteractionFilter, 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 BoardSquareGridProps,\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 SquareGrid({ board: boardId, ...props }: { board: string }) {\n return createElement(\n baseUI.Board.SquareGrid as never,\n {\n ...props,\n board: options.squareStaticBoards?.[boardId],\n } as BoardSquareGridProps<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 {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n} from \"../../ui/components.js\";\nimport type {\n InteractionFormPrimitiveProps,\n InteractionStateProps,\n InteractionSubmitProps,\n InteractionTriggerProps,\n} from \"../primitives/index.js\";\nimport type { InteractionDialogProps } from \"../primitives/interaction/dialog.js\";\nimport { createFormInputSlot } from \"./slots.js\";\nimport type {\n WorkspaceContractContext,\n WorkspaceInteractionFormDescriptor,\n WorkspaceInteractionFormsDescriptor,\n} from \"./types.js\";\n\nexport interface WorkspaceInteractionFormDialogProps extends Omit<\n InteractionDialogProps,\n \"children\"\n> {\n title: ReactNode;\n description?: ReactNode;\n trigger?: ReactNode;\n children: ReactNode;\n contentClassName?: string;\n overlayClassName?: string;\n showCloseButton?: boolean;\n}\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 GeneratedFormDialog({\n title,\n description,\n trigger,\n children,\n contentClassName,\n overlayClassName,\n showCloseButton,\n defaultOpen,\n onStateChange,\n }: WorkspaceInteractionFormDialogProps) {\n return createElement(baseUI.Interaction.Dialog, {\n defaultOpen,\n onStateChange,\n children: (state) =>\n createElement(\n Dialog,\n { open: state.open, onOpenChange: state.setOpen },\n trigger\n ? createElement(DialogTrigger, {\n asChild: true,\n children: trigger,\n })\n : null,\n createElement(\n DialogContent,\n {\n className: contentClassName,\n overlayClassName,\n showCloseButton,\n },\n createElement(\n DialogHeader,\n null,\n createElement(DialogTitle, null, title),\n description\n ? createElement(DialogDescription, null, description)\n : null,\n ),\n children,\n ),\n ),\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: WorkspaceInteractionFormDialogProps) =>\n withInteractionRoot(\n interaction,\n createElement(GeneratedFormDialog, 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 { useAuthoredPluginGameplayFrameSelector } from \"../context/PluginGameplayFrameContext.js\";\nimport { CardFace, type ViewCard } from \"../../ui.js\";\nimport type { InteractionCardInputRenderState } from \"../primitives/index.js\";\nimport type { ZoneListProps } from \"../primitives/zone.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 = useAuthoredPluginGameplayFrameSelector((frame) => {\n const candidates = frame.zones[zone]?.playableByCardId[cardId] ?? [];\n const orderedCandidates = [...candidates].sort((left, right) => {\n const leftAvailable = left.availability.status === \"available\";\n const rightAvailable = right.availability.status === \"available\";\n return leftAvailable === rightAvailable ? 0 : leftAvailable ? -1 : 1;\n });\n for (const descriptor of orderedCandidates) {\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 {\n createHandCardsComponent,\n createStagingComponent,\n HandCardsSlot,\n HandSummarySlot,\n HandActionsSlot,\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 Cards: HandCardsSlot,\n Summary: HandSummarySlot,\n Actions: HandActionsSlot,\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 { Children, createElement, isValidElement, 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 HandCardsSlot({\n children,\n }: {\n children: (card: Card, state: InteractionVisualState) => ReactNode;\n }) {\n void children;\n return createElement(\"template\", { \"data-dreamboard-hand-cards-slot\": \"\" });\n }\n\n function HandSummarySlot({\n children,\n }: {\n children: ReactNode | ((summary: HandSelectionSummary) => ReactNode);\n }) {\n void children;\n return createElement(\"template\", {\n \"data-dreamboard-hand-summary-slot\": \"\",\n });\n }\n\n function HandActionsSlot({\n children,\n }: {\n children: ReactNode | ((summary: HandSelectionSummary) => ReactNode);\n }) {\n void children;\n return createElement(\"template\", {\n \"data-dreamboard-hand-actions-slot\": \"\",\n });\n }\n\n function renderHandSlot(\n slot: ReactNode | ((summary: HandSelectionSummary) => ReactNode),\n summary: HandSelectionSummary,\n ): ReactNode {\n return typeof slot === \"function\" ? slot(summary) : slot;\n }\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 onSelectionSummary,\n ...props\n }: {\n empty?: ReactNode;\n children:\n | ReactNode\n | ((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 onSelectionSummary?: (summary: HandSelectionSummary) => void;\n } & Omit<ZoneListProps, \"children\" | \"empty\">) => {\n const slots = collectHandSlots(children);\n const renderCard =\n typeof children === \"function\" ? children : slots.cards?.children;\n if (!renderCard) {\n throw new Error(\n \"Generated hand surfaces require exactly one <hand.Cards> slot.\",\n );\n }\n const summaryRenderer = slots.summary\n ? (summary: HandSelectionSummary) =>\n renderHandSlot(slots.summary!.children, summary)\n : undefined;\n const actionsRenderer = slots.actions\n ? (summary: HandSelectionSummary) =>\n renderHandSlot(slots.actions!.children, summary)\n : undefined;\n return 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: renderCard,\n layout,\n mobileInteraction,\n cardSize,\n ariaLabel,\n dropTargets,\n renderDropTargets,\n onCardIntent,\n summarySlot: summaryRenderer,\n actionsSlot: actionsRenderer,\n onSelectionSummary,\n }),\n });\n };\n }\n\n function collectHandSlots(\n children:\n | ReactNode\n | ((card: Card, state: InteractionVisualState) => ReactNode),\n ): {\n cards?: {\n children: (card: Card, state: InteractionVisualState) => ReactNode;\n };\n summary?: {\n children: ReactNode | ((summary: HandSelectionSummary) => ReactNode);\n };\n actions?: {\n children: ReactNode | ((summary: HandSelectionSummary) => ReactNode);\n };\n } {\n const slots: {\n cards?: {\n children: (card: Card, state: InteractionVisualState) => ReactNode;\n };\n summary?: {\n children: ReactNode | ((summary: HandSelectionSummary) => ReactNode);\n };\n actions?: {\n children: ReactNode | ((summary: HandSelectionSummary) => ReactNode);\n };\n } = {};\n if (typeof children === \"function\") return slots;\n for (const child of Children.toArray(children)) {\n if (!isValidElement(child)) continue;\n if (child.type === HandCardsSlot) {\n if (slots.cards) {\n throw new Error(\"Only one <hand.Cards> slot may be rendered.\");\n }\n slots.cards = child.props as {\n children: (card: Card, state: InteractionVisualState) => ReactNode;\n };\n } else if (child.type === HandSummarySlot) {\n if (slots.summary) {\n throw new Error(\"Only one <hand.Summary> slot may be rendered.\");\n }\n slots.summary = child.props as {\n children: ReactNode | ((summary: HandSelectionSummary) => ReactNode);\n };\n } else if (child.type === HandActionsSlot) {\n if (slots.actions) {\n throw new Error(\"Only one <hand.Actions> slot may be rendered.\");\n }\n slots.actions = child.props as {\n children: ReactNode | ((summary: HandSelectionSummary) => ReactNode);\n };\n }\n }\n return slots;\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 summarySlot,\n actionsSlot,\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 summarySlot?: (summary: HandSelectionSummary) => ReactNode;\n actionsSlot?: (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 summarySlot,\n actionsSlot,\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 actionsSlot,\n renderDropTargets,\n summarySlot,\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 {\n createHandCardsComponent,\n createStagingComponent,\n HandCardsSlot,\n HandSummarySlot,\n HandActionsSlot,\n };\n}\n","import type { ButtonHTMLAttributes, ReactElement, ReactNode } from \"react\";\nimport {\n createClientParamSchemasByPhase,\n type ClientParamsOfInteractionOfDefinition,\n type DefaultedClientParamKeysOfInteractionOfDefinition,\n type InputKeysWithCollectorKindOfDefinition,\n type InteractionIdOfDefinitionPhase,\n type PhaseNamesOfDefinition,\n type ViewNamesOfDefinition,\n type ViewOfDefinition,\n} from \"../../reducer/advanced.js\";\nimport type { InteractionDescriptor } from \"../types/plugin-state.js\";\nimport { createWorkspaceUIContract, type DefineGameUIConfig } from \"./index.js\";\nimport type { DreamboardUI, TypedGame, UIContract } from \"../ui-contract.js\";\nimport type {\n GameMeState,\n GamePlayersState,\n GameRenderState,\n GameTurnState,\n} from \"../primitives/game.js\";\nimport type { UIRootProps } from \"../primitives/ui.js\";\nimport type {\n AnyHexBoardInput,\n AnySquareBoardInput,\n BoardSpaceIdOf,\n InteractionVisualState,\n ResourceCounterComponents,\n} from \"../../ui.js\";\nimport type {\n WorkspaceBoardSurface,\n WorkspaceBoardSurfaceDescriptor,\n WorkspaceCardCollectionSurfaceDescriptor,\n WorkspaceHandSurfaceDescriptor,\n WorkspaceInteractionFormDescriptor,\n WorkspaceInteractionFormsDescriptor,\n WorkspaceBoardTargetInputSlot,\n WorkspaceFormInputSlot,\n WorkspaceInteractionSlotComponent,\n WorkspacePileSurfaceDescriptor,\n WorkspacePilesSurfaceDescriptor,\n WorkspaceSurfaceSpec,\n} from \"./types.js\";\nimport type { WorkspaceInteractionFormDialogProps } from \"./forms.js\";\nimport type { ZoneCardRenderItem, ZoneListProps } from \"../primitives/zone.js\";\nimport type { ClientParamSchemaMap } from \"../context/ClientParamSchemaContext.js\";\n\nexport interface GameUiManifestTypes {\n readonly PlayerId: string;\n readonly ResourceId: string;\n readonly ZoneId: string;\n readonly CardId: string;\n readonly CardType: string;\n readonly CardProperties: Record<string, unknown>;\n readonly BoardBaseId: string;\n readonly SpaceId: string;\n readonly EdgeId: string;\n readonly VertexId: string;\n readonly PlayerCardZoneId: string;\n readonly CardZoneId: string;\n}\n\nexport type GameUiPhaseName<Game> = PhaseNamesOfDefinition<Game>;\nexport type GameUiViewName<Game> = ViewNamesOfDefinition<Game>;\nexport type GameUiView<Game> =\n Extract<\"player\", GameUiViewName<Game>> extends never\n ? never\n : ViewOfDefinition<Game, Extract<\"player\", GameUiViewName<Game>>>;\n\nexport type GameUiInteractionIdForPhase<\n Game,\n Phase extends GameUiPhaseName<Game>,\n> = InteractionIdOfDefinitionPhase<Game, Phase>;\n\nexport type GameUiInteractionKey<Game> = {\n [Phase in GameUiPhaseName<Game>]: `${Phase}.${GameUiInteractionIdForPhase<Game, Phase>}`;\n}[GameUiPhaseName<Game>];\n\ntype PhaseOfInteractionKey<\n Game,\n Key extends GameUiInteractionKey<Game>,\n> = Key extends `${infer Phase}.${string}`\n ? Extract<Phase, GameUiPhaseName<Game>>\n : never;\n\ntype IdOfInteractionKey<\n Game,\n Key extends GameUiInteractionKey<Game>,\n> = Key extends `${infer Phase}.${infer Id}`\n ? Phase extends GameUiPhaseName<Game>\n ? Extract<Id, GameUiInteractionIdForPhase<Game, Phase>>\n : never\n : never;\n\nexport type GameUiInteractionParamsOf<\n Game,\n Key extends GameUiInteractionKey<Game>,\n> = ClientParamsOfInteractionOfDefinition<\n Game,\n PhaseOfInteractionKey<Game, Key>,\n IdOfInteractionKey<Game, Key>\n>;\n\ntype CollectorKind =\n | \"form\"\n | \"board-vertex\"\n | \"board-edge\"\n | \"board-tile\"\n | \"board-space\"\n | \"card\"\n | \"prompt\";\n\ntype AuthoredInputKeys<Game, Key extends GameUiInteractionKey<Game>> =\n InputKeysWithCollectorKindOfDefinition<\n Game,\n PhaseOfInteractionKey<Game, Key>,\n IdOfInteractionKey<Game, Key>,\n CollectorKind\n > extends infer Input\n ? string extends Input\n ? never\n : Input & string\n : never;\n\nexport type GameUiInteractionInputKeys<\n Game,\n Key extends GameUiInteractionKey<Game>,\n> =\n | (string extends keyof GameUiInteractionParamsOf<Game, Key>\n ? never\n : keyof GameUiInteractionParamsOf<Game, Key> & string)\n | AuthoredInputKeys<Game, Key>\n | (DefaultedClientParamKeysOfInteractionOfDefinition<\n Game,\n PhaseOfInteractionKey<Game, Key>,\n IdOfInteractionKey<Game, Key>\n > &\n string);\n\nexport type GameUiInteractionSlot = {\n readonly Field: WorkspaceInteractionSlotComponent;\n readonly Options: WorkspaceInteractionSlotComponent<{\n children: (option: { value: unknown; label: string }) => ReactNode;\n }>;\n readonly Value: WorkspaceInteractionSlotComponent<{\n children: (value: unknown | undefined) => ReactNode;\n }>;\n readonly Default: WorkspaceInteractionSlotComponent;\n readonly Card: WorkspaceInteractionSlotComponent<{ value: string }>;\n readonly Cards: WorkspaceInteractionSlotComponent<{\n children: (card: { id: string }) => ReactNode;\n }>;\n readonly Target: WorkspaceInteractionSlotComponent<{ value: string }>;\n};\n\ntype GameUiCollectorSlot<\n Game,\n Key extends GameUiInteractionKey<Game>,\n Input extends GameUiInteractionInputKeys<Game, Key>,\n> =\n Input extends InputKeysWithCollectorKindOfDefinition<\n Game,\n PhaseOfInteractionKey<Game, Key>,\n IdOfInteractionKey<Game, Key>,\n \"board-space\"\n >\n ? WorkspaceBoardTargetInputSlot<\"space\", never>\n : Input extends InputKeysWithCollectorKindOfDefinition<\n Game,\n PhaseOfInteractionKey<Game, Key>,\n IdOfInteractionKey<Game, Key>,\n \"board-edge\"\n >\n ? WorkspaceBoardTargetInputSlot<\"edge\", never>\n : Input extends InputKeysWithCollectorKindOfDefinition<\n Game,\n PhaseOfInteractionKey<Game, Key>,\n IdOfInteractionKey<Game, Key>,\n \"board-vertex\"\n >\n ? WorkspaceBoardTargetInputSlot<\"vertex\", never>\n : Input extends InputKeysWithCollectorKindOfDefinition<\n Game,\n PhaseOfInteractionKey<Game, Key>,\n IdOfInteractionKey<Game, Key>,\n \"board-tile\"\n >\n ? WorkspaceBoardTargetInputSlot<\"tile\", never>\n : Input extends InputKeysWithCollectorKindOfDefinition<\n Game,\n PhaseOfInteractionKey<Game, Key>,\n IdOfInteractionKey<Game, Key>,\n \"card\"\n >\n ? GameUiInteractionSlot\n : WorkspaceFormInputSlot<Input>;\n\nexport type GameUiInteractionFormSurface<\n Game,\n Contract extends UIContract,\n Key extends GameUiInteractionKey<Game>,\n> = {\n readonly Root: WorkspaceInteractionSlotComponent;\n readonly Form: DreamboardUI<Contract>[\"Interaction\"][\"Form\"];\n readonly Dialog: (\n props: WorkspaceInteractionFormDialogProps,\n ) => ReactElement | null;\n readonly State: DreamboardUI<Contract>[\"Interaction\"][\"State\"];\n readonly Arm: DreamboardUI<Contract>[\"Interaction\"][\"Trigger\"];\n readonly Submit: DreamboardUI<Contract>[\"Interaction\"][\"Submit\"];\n readonly Field: <Input extends GameUiInteractionInputKeys<Game, Key>>(props: {\n input: Input;\n children?: ReactNode;\n }) => ReactElement | null;\n readonly slot: {\n readonly [Input in GameUiInteractionInputKeys<\n Game,\n Key\n >]: GameUiCollectorSlot<Game, Key, Input>;\n };\n};\n\nexport type GameUiInteractionRoutes<Game> = Partial<{\n [Key in GameUiInteractionKey<Game>]: {\n readonly collect: {\n [Input in GameUiInteractionInputKeys<Game, Key>]: GameUiCollectorSlot<\n Game,\n Key,\n Input\n >;\n };\n };\n}>;\n\nexport type GameUiZoneCard<Manifest extends GameUiManifestTypes> =\n ZoneCardRenderItem<\n Manifest[\"CardId\"],\n Manifest[\"CardType\"],\n Manifest[\"CardProperties\"]\n > extends infer Item\n ? Item extends { zone: string }\n ? Omit<Item, \"zone\"> & { zone: Manifest[\"ZoneId\"] }\n : never\n : never;\n\nexport type GameUiBoardSurface<\n Manifest extends GameUiManifestTypes,\n _Board extends Manifest[\"BoardBaseId\"] = Manifest[\"BoardBaseId\"],\n> = WorkspaceBoardSurface<\n Manifest[\"SpaceId\"],\n Manifest[\"EdgeId\"],\n Manifest[\"VertexId\"],\n Manifest[\"SpaceId\"]\n> & { readonly __board?: _Board };\n\ntype ZoneCardsComponent<Manifest extends GameUiManifestTypes> =\n WorkspaceInteractionSlotComponent<\n Omit<ZoneListProps, \"children\" | \"empty\"> & {\n empty?: ReactNode;\n children: (card: GameUiZoneCard<Manifest>) => ReactNode;\n }\n >;\n\ntype ZoneCardComponent<Manifest extends GameUiManifestTypes> =\n WorkspaceInteractionSlotComponent<\n Omit<ButtonHTMLAttributes<HTMLButtonElement>, \"type\" | \"value\"> & {\n card: GameUiZoneCard<Manifest>;\n }\n >;\n\nexport type GameUiHandCardIntent<Card extends string, Target extends string> =\n | { type: \"activate\"; cardId: Card; source: \"tap\" | \"keyboard\" }\n | { type: \"previewStart\"; cardId: Card }\n | { type: \"previewEnd\"; cardId: Card }\n | {\n type: \"drop\";\n cardId: Card;\n targetId: Target;\n source: \"pointer\" | \"keyboard\";\n };\n\nexport type GameUiHandSelectionSummary<Card extends string> = {\n readonly selectedCount: number;\n readonly selectedIds: readonly Card[];\n readonly hasInvalidSelection: boolean;\n};\n\ntype GameUiHandProps<Manifest extends GameUiManifestTypes> = Omit<\n ZoneListProps,\n \"children\" | \"empty\"\n> & {\n empty?: ReactNode;\n children: (\n card: GameUiZoneCard<Manifest>,\n state: InteractionVisualState,\n ) => ReactNode;\n layout?:\n | \"fan\"\n | \"compressed-fan\"\n | \"tray\"\n | \"strip\"\n | \"stack\"\n | {\n desktop?: \"fan\" | \"compressed-fan\" | \"tray\" | \"strip\" | \"stack\";\n mobile?: \"fan\" | \"compressed-fan\" | \"tray\" | \"strip\" | \"stack\";\n };\n mobileInteraction?: \"direct-activate\" | \"drag-to-target\";\n cardSize?: \"sm\" | \"md\" | \"lg\";\n ariaLabel?: string;\n dropTargets?: ReadonlyArray<{\n target:\n | { readonly kind: \"card\"; readonly card: Manifest[\"CardId\"] }\n | {\n readonly kind: \"space\" | \"tile\";\n readonly target: Manifest[\"SpaceId\"];\n }\n | { readonly kind: \"edge\"; readonly target: Manifest[\"EdgeId\"] }\n | {\n readonly kind: \"vertex\";\n readonly target: Manifest[\"VertexId\"];\n };\n label: string;\n render: (state: unknown) => ReactNode;\n className?: string;\n role?: string;\n order?: number;\n }>;\n renderDropTargets?: (children: ReactNode) => ReactNode;\n onCardIntent?: (\n intent: GameUiHandCardIntent<\n Manifest[\"CardId\"],\n | Manifest[\"CardId\"]\n | Manifest[\"SpaceId\"]\n | Manifest[\"EdgeId\"]\n | Manifest[\"VertexId\"]\n >,\n ) => void;\n onSelectionSummary?: (\n summary: GameUiHandSelectionSummary<Manifest[\"CardId\"]>,\n ) => void;\n};\n\nexport type GameUiHandSurface<\n Manifest extends GameUiManifestTypes,\n Zones extends readonly Manifest[\"ZoneId\"][] = readonly Manifest[\"ZoneId\"][],\n> = {\n readonly Hand: WorkspaceInteractionSlotComponent<\n Omit<GameUiHandProps<Manifest>, \"children\"> & { children: ReactNode }\n >;\n readonly Cards: WorkspaceInteractionSlotComponent<{\n children: (\n card: GameUiZoneCard<Manifest>,\n state: InteractionVisualState,\n ) => ReactNode;\n }>;\n readonly Summary: (props: {\n children?:\n | ReactNode\n | ((\n summary: GameUiHandSelectionSummary<Manifest[\"CardId\"]>,\n ) => ReactNode);\n }) => ReactElement | null;\n readonly Actions: (props: {\n children?:\n | ReactNode\n | ((\n summary: GameUiHandSelectionSummary<Manifest[\"CardId\"]>,\n ) => ReactNode);\n }) => ReactElement | null;\n readonly Card: ZoneCardComponent<Manifest>;\n readonly Staging: WorkspaceInteractionSlotComponent<{\n children: (\n card: Extract<GameUiZoneCard<Manifest>, { hidden: false }>,\n ) => ReactNode;\n label?: ReactNode;\n renderEmptySlot?: (index: number) => ReactNode;\n cardSize?: \"sm\" | \"md\" | \"lg\";\n ariaLabel?: string;\n className?: string;\n }>;\n readonly slot: {\n readonly card: GameUiInteractionSlot & { readonly __zones?: Zones };\n };\n};\n\nexport type GameUiPileSurface<Manifest extends GameUiManifestTypes> = {\n readonly Pile: ZoneCardsComponent<Manifest>;\n readonly Card: ZoneCardComponent<Manifest>;\n};\n\nexport type GameUiCardCollectionSurface<\n Manifest extends GameUiManifestTypes,\n Zones extends readonly Manifest[\"ZoneId\"][] = readonly Manifest[\"ZoneId\"][],\n> = {\n readonly Collection: ZoneCardsComponent<Manifest>;\n readonly Card: ZoneCardComponent<Manifest>;\n readonly slot: {\n readonly card: GameUiInteractionSlot & { readonly __zones?: Zones };\n };\n};\n\ntype UiRegistry<Game, Manifest extends GameUiManifestTypes> = {\n interactions: {\n [Key in GameUiInteractionKey<Game>]: {\n interaction: Key;\n phase: PhaseOfInteractionKey<Game, Key>;\n id: IdOfInteractionKey<Game, Key>;\n };\n };\n inputs: {\n [Key in GameUiInteractionInputKeys<Game, GameUiInteractionKey<Game>>]: {\n input: Key;\n };\n };\n prompts: {\n [Key in GameUiInteractionKey<Game>]: { interaction: Key };\n };\n promptOptions: Record<string, { value: string }>;\n players: { [Key in Manifest[\"PlayerId\"]]: { player: Key } };\n zones: { [Key in Manifest[\"ZoneId\"]]: { zone: Key } };\n cards: { [Key in Manifest[\"CardId\"]]: { card: Key } };\n phases: { [Key in GameUiPhaseName<Game>]: { phase: Key } };\n boardTargets: {\n [Key in Manifest[\"SpaceId\"] | Manifest[\"EdgeId\"] | Manifest[\"VertexId\"]]: {\n target: Key;\n };\n };\n};\n\nexport type GameUiContract<\n Game,\n Manifest extends GameUiManifestTypes,\n> = UiRegistry<Game, Manifest>;\n\ntype SurfaceValue<\n Game,\n Manifest extends GameUiManifestTypes,\n Contract extends UIContract,\n Spec,\n> =\n Spec extends WorkspaceBoardSurfaceDescriptor<\n infer Board extends Manifest[\"BoardBaseId\"]\n >\n ? GameUiBoardSurface<Manifest, Board>\n : Spec extends WorkspaceHandSurfaceDescriptor<\n infer Zone extends Manifest[\"PlayerCardZoneId\"]\n >\n ? GameUiHandSurface<Manifest, readonly [Zone]>\n : Spec extends WorkspacePileSurfaceDescriptor<\n infer Zone extends Manifest[\"CardZoneId\"]\n >\n ? GameUiPileSurface<Manifest> & { readonly __zone?: Zone }\n : Spec extends WorkspacePilesSurfaceDescriptor<\n infer Zones extends readonly Manifest[\"CardZoneId\"][]\n >\n ? { readonly [Zone in Zones[number]]: GameUiPileSurface<Manifest> }\n : Spec extends WorkspaceCardCollectionSurfaceDescriptor<\n infer Zones extends readonly Manifest[\"CardZoneId\"][]\n >\n ? GameUiCardCollectionSurface<Manifest, Zones>\n : Spec extends WorkspaceInteractionFormDescriptor<\n infer Interaction extends GameUiInteractionKey<Game>\n >\n ? GameUiInteractionFormSurface<Game, Contract, Interaction>\n : Spec extends WorkspaceInteractionFormsDescriptor<\n infer Forms extends Readonly<\n Record<string, GameUiInteractionKey<Game>>\n >\n >\n ? {\n readonly [Key in keyof Forms]: GameUiInteractionFormSurface<\n Game,\n Contract,\n Forms[Key]\n >;\n }\n : Spec extends WorkspaceSurfaceSpec\n ? {\n readonly [Key in keyof Spec]: SurfaceValue<\n Game,\n Manifest,\n Contract,\n Spec[Key]\n >;\n }\n : never;\n\ntype GameUiHexBoardId<HexBoards> = keyof HexBoards & string;\ntype GameUiSquareBoardId<SquareBoards> = keyof SquareBoards & string;\ntype GameUiHexBoardTopology<\n HexBoards,\n Id extends GameUiHexBoardId<HexBoards>,\n> = Extract<HexBoards[Id], AnyHexBoardInput>;\ntype GameUiSquareBoardTopology<\n SquareBoards,\n Id extends GameUiSquareBoardId<SquareBoards>,\n> = Extract<SquareBoards[Id], AnySquareBoardInput>;\ntype GameUiHexBoardSpaceId<\n HexBoards,\n Id extends GameUiHexBoardId<HexBoards>,\n> = BoardSpaceIdOf<GameUiHexBoardTopology<HexBoards, Id>>;\n\ntype GameUiBoardNamespace<\n Manifest extends GameUiManifestTypes,\n Contract extends UIContract,\n HexBoards,\n SquareBoards,\n> = Omit<\n DreamboardUI<Contract>[\"Board\"],\n \"HexView\" | \"HexGrid\" | \"SquareGrid\"\n> & {\n surface<const Board extends Manifest[\"BoardBaseId\"]>(\n board: Board,\n ): WorkspaceBoardSurfaceDescriptor<Board>;\n useSurface<const Board extends Manifest[\"BoardBaseId\"]>(\n name: string,\n options?: { board: Board },\n ): GameUiBoardSurface<Manifest, Board>;\n HexView<\n const Id extends GameUiHexBoardId<HexBoards>,\n const SpaceView extends {\n id: GameUiHexBoardSpaceId<HexBoards, Id>;\n },\n >(\n props: Omit<\n import(\"../primitives/board.js\").BoardHexViewProps<\n GameUiHexBoardTopology<HexBoards, Id>,\n SpaceView\n >,\n \"board\"\n > & { board: Id },\n ): ReactElement;\n HexGrid<\n const Id extends GameUiHexBoardId<HexBoards>,\n const SpaceView extends {\n id: GameUiHexBoardSpaceId<HexBoards, Id>;\n },\n >(\n props: Omit<\n import(\"../primitives/board.js\").BoardHexGridProps<\n GameUiHexBoardTopology<HexBoards, Id>,\n SpaceView\n >,\n \"board\" | \"interactions\"\n > & { board: Id },\n ): ReactElement;\n SquareGrid<const Id extends GameUiSquareBoardId<SquareBoards>>(\n props: Omit<\n import(\"../primitives/board.js\").BoardSquareGridProps<\n GameUiSquareBoardTopology<SquareBoards, Id>\n >,\n \"board\" | \"interactions\"\n > & { board: Id },\n ): ReactElement;\n};\n\nexport type GameWorkspaceUI<\n Game,\n Manifest extends GameUiManifestTypes,\n Contract extends GameUiContract<Game, Manifest>,\n HexBoards,\n SquareBoards,\n> = Omit<\n DreamboardUI<Contract>,\n \"Root\" | \"Game\" | \"Interaction\" | \"Board\" | \"Zone\" | \"Prompt\" | \"PromptInbox\"\n> & {\n Root(props: UIRootProps): ReactElement;\n defineSurfaces<const Spec extends WorkspaceSurfaceSpec>(\n spec: Spec,\n ): () => SurfaceValue<Game, Manifest, Contract, Spec>;\n defineGameUI<Surfaces>(\n config: DefineGameUIConfig<\n GameRenderState<\n GameUiView<Game>,\n Manifest[\"PlayerId\"],\n GameUiPhaseName<Game>\n >,\n Surfaces\n > & {\n useSurfaces: () => Surfaces;\n interactionRoutes?: () => GameUiInteractionRoutes<Game>;\n phases: {\n readonly [Phase in GameUiPhaseName<Game>]: (context: {\n game: GameRenderState<\n GameUiView<Game>,\n Manifest[\"PlayerId\"],\n GameUiPhaseName<Game>\n >;\n surfaces: Surfaces;\n }) => ReactNode;\n };\n },\n ): (props: Omit<UIRootProps, \"children\">) => ReactElement;\n readonly Game: TypedGame<\n Contract,\n GameUiView<Game>,\n Manifest[\"PlayerId\"],\n GameUiPhaseName<Game>\n >;\n readonly Interaction: Pick<\n DreamboardUI<Contract>[\"Interaction\"],\n \"State\" | \"Dialog\"\n > & {\n useForm<Key extends GameUiInteractionKey<Game>>(\n interaction: Key,\n ): GameUiInteractionFormSurface<Game, Contract, Key>;\n form<const Interaction extends GameUiInteractionKey<Game>>(\n interaction: Interaction,\n ): WorkspaceInteractionFormDescriptor<Interaction>;\n forms<\n const Interactions extends Readonly<\n Record<string, GameUiInteractionKey<Game>>\n >,\n >(\n interactions: Interactions,\n ): WorkspaceInteractionFormsDescriptor<Interactions>;\n Routes(props: {\n routes: GameUiInteractionRoutes<Game>;\n fallback?: ReactNode;\n includeUnavailable?: boolean | null;\n }): ReactElement;\n };\n readonly Board: GameUiBoardNamespace<\n Manifest,\n Contract,\n HexBoards,\n SquareBoards\n >;\n readonly Zone: {\n hand<const Zone extends Manifest[\"PlayerCardZoneId\"]>(\n zone: Zone,\n options: {\n role: \"primary\" | \"auxiliary\" | \"task\";\n label: string;\n order?: number;\n },\n ): WorkspaceHandSurfaceDescriptor<Zone>;\n pile<const Zone extends Manifest[\"CardZoneId\"]>(\n zone: Zone,\n ): WorkspacePileSurfaceDescriptor<Zone>;\n collection<const Zones extends readonly Manifest[\"CardZoneId\"][]>(\n zones: Zones,\n options?: { mode?: \"all\" | \"top-card\" },\n ): WorkspaceCardCollectionSurfaceDescriptor<Zones>;\n } & DreamboardUI<Contract>[\"Zone\"];\n readonly ResourceCounter: ResourceCounterComponents<Manifest[\"ResourceId\"]>;\n};\n\nexport interface CreateGameUiContractOptions<\n Game,\n Manifest extends GameUiManifestTypes,\n HexBoards extends Record<string, unknown>,\n SquareBoards extends Record<string, unknown>,\n> {\n readonly game: Game;\n readonly resourceIds: readonly Manifest[\"ResourceId\"][];\n readonly resourcePresentationById?: Partial<\n Record<string, { label?: string; icon?: string }>\n >;\n readonly hexStaticBoards: HexBoards;\n readonly squareStaticBoards: SquareBoards;\n}\n\nexport function createGameUiContract<\n Game,\n Manifest extends GameUiManifestTypes,\n HexBoards extends Record<string, unknown>,\n SquareBoards extends Record<string, unknown>,\n>(\n options: CreateGameUiContractOptions<Game, Manifest, HexBoards, SquareBoards>,\n) {\n type Contract = GameUiContract<Game, Manifest>;\n type UI = GameWorkspaceUI<Game, Manifest, Contract, HexBoards, SquareBoards>;\n type Card = GameUiZoneCard<Manifest>;\n\n const uiContract = {\n interactions: {},\n inputs: {},\n prompts: {},\n promptOptions: {},\n players: {},\n zones: {},\n cards: {},\n phases: {},\n boardTargets: {},\n } as Contract;\n const clientParamSchemasByPhase = createClientParamSchemasByPhase(\n options.game as Parameters<typeof createClientParamSchemasByPhase>[0],\n ) as ClientParamSchemaMap;\n\n const formInputKeysForInteraction = (interaction: string) => {\n const [phase, id] = interaction.split(\".\", 2);\n const phaseSpec = phase\n ? (options.game as { phases?: Record<string, unknown> }).phases?.[phase]\n : undefined;\n const phaseRecord = phaseSpec as\n | {\n interactions?: Record<\n string,\n { inputs?: Record<string, { kind?: string }> }\n >;\n cardActions?: Record<\n string,\n { inputs?: Record<string, { kind?: string }> }\n >;\n submit?: { inputs?: Record<string, { kind?: string }> };\n }\n | undefined;\n const spec =\n (id ? phaseRecord?.interactions?.[id] : undefined) ??\n (id ? phaseRecord?.cardActions?.[id] : undefined) ??\n (id === \"submit\" ? phaseRecord?.submit : undefined);\n return new Set(\n Object.entries(spec?.inputs ?? {})\n .filter(\n ([, collector]) =>\n collector.kind === \"form\" || collector.kind === \"prompt\",\n )\n .map(([input]) => input),\n );\n };\n\n const UI = createWorkspaceUIContract<\n UI,\n Contract,\n Manifest[\"ResourceId\"],\n Card,\n HexBoards,\n SquareBoards\n >({\n uiContract,\n clientParamSchemasByPhase,\n formInputKeysForInteraction,\n resourceIds: options.resourceIds,\n resourcePresentationById: options.resourcePresentationById,\n hexStaticBoards: options.hexStaticBoards,\n squareStaticBoards: options.squareStaticBoards,\n cardIdFromZoneCard: (card) => card.id,\n zoneIdFromZoneCard: (card) => card.zone,\n });\n\n return { uiContract, UI, clientParamSchemasByPhase };\n}\n\nexport type GameUiGameRootState<\n Game,\n Manifest extends GameUiManifestTypes,\n> = GameRenderState<\n GameUiView<Game>,\n Manifest[\"PlayerId\"],\n GameUiPhaseName<Game>\n>;\nexport type GameUiPlayers<Manifest extends GameUiManifestTypes> =\n GamePlayersState<Manifest[\"PlayerId\"]>;\nexport type GameUiMe<Manifest extends GameUiManifestTypes> = GameMeState<\n Manifest[\"PlayerId\"]\n>;\nexport type GameUiTurn<\n Game,\n Manifest extends GameUiManifestTypes,\n> = GameTurnState<Manifest[\"PlayerId\"], GameUiPhaseName<Game>>;\nexport type GameUiInteractionDescriptor<\n Game,\n Key extends GameUiInteractionKey<Game>,\n> = InteractionDescriptor<Key>;\n"],"mappings":"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","names":["createElement","createElement","createElement","createElement","createElement","Interaction","Board","Zone","ReactFragment","createElement","clsx","createElement","createElement","createElement","ReactFragment","clsx","UI","createElement","Interaction","Board","Zone","UI"]}