@dreamboard-games/sdk 0.2.0 → 0.2.1-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{ThemeProvider-fy0_QzgO.d.ts → ThemeProvider-BBMVT3KG.d.ts} +1 -1
- package/dist/attributes-BeRyboMS.d.ts +279 -0
- package/dist/browser-interaction.d.ts +708 -0
- package/dist/browser-interaction.js +106 -0
- package/dist/browser-interaction.js.map +1 -0
- package/dist/{bundle-TIZcw8LB.d.ts → bundle-CDd5FKeD.d.ts} +3 -1
- package/dist/{chunk-U5C6BONG.js → chunk-326PGVAA.js} +2 -2
- package/dist/{chunk-VFTAA4WO.js → chunk-MKXPVOUT.js} +4 -2
- package/dist/chunk-MKXPVOUT.js.map +1 -0
- package/dist/{chunk-GKKBPPSW.js → chunk-MZNVHMJ5.js} +4 -4
- package/dist/{chunk-KAELH4KC.js → chunk-NKCRKGR2.js} +2 -2
- package/dist/{chunk-WN74KVNY.js → chunk-PEI3FIL2.js} +2 -2
- package/dist/chunk-PEI3FIL2.js.map +1 -0
- package/dist/chunk-QLG6VEMW.js +1691 -0
- package/dist/chunk-QLG6VEMW.js.map +1 -0
- package/dist/{chunk-WYPQ3GG5.js → chunk-WG4JQL3S.js} +4 -1
- package/dist/{chunk-WYPQ3GG5.js.map → chunk-WG4JQL3S.js.map} +1 -1
- package/dist/{chunk-7YAHLYBR.js → chunk-XV6D3ET4.js} +8 -4
- package/dist/{chunk-7YAHLYBR.js.map → chunk-XV6D3ET4.js.map} +1 -1
- package/dist/{chunk-TDSWKVZ4.js → chunk-ZABVH7AO.js} +1236 -17
- package/dist/chunk-ZABVH7AO.js.map +1 -0
- package/dist/{components-D5ZRE2Hl.d.ts → components-BoiVSYqx.d.ts} +1 -1
- package/dist/generated/runtime/primitives.d.ts +5 -4
- package/dist/generated/runtime/primitives.js +4 -3
- package/dist/generated/runtime-api.d.ts +1 -1
- package/dist/generated/runtime.d.ts +5 -4
- package/dist/generated/runtime.js +7 -6
- package/dist/generated/workspace-contract.d.ts +5 -4
- package/dist/generated/workspace-contract.js +6 -5
- package/dist/{hex-board-view-D_07hO6O.d.ts → hex-board-view-1iAyJRFn.d.ts} +1 -0
- package/dist/index.js +1 -1
- package/dist/infrastructure/reducer-bundle-abi.d.ts +113 -113
- package/dist/infrastructure/reducer-bundle-abi.js +1 -1
- package/dist/package-set.d.ts +2 -2
- package/dist/package-set.js +1 -1
- package/dist/reducer.d.ts +1 -1
- package/dist/reducer.js +305 -12
- package/dist/reducer.js.map +1 -1
- package/dist/runtime/primitives.d.ts +6 -5
- package/dist/runtime/primitives.js +4 -3
- package/dist/runtime/workspace-contract.d.ts +6 -5
- package/dist/runtime/workspace-contract.js +6 -5
- package/dist/{runtime-api-DWxvTr-O.d.ts → runtime-api-CPLm_XDG.d.ts} +6 -0
- package/dist/runtime.d.ts +5 -4
- package/dist/runtime.js +6 -5
- package/dist/testing.d.ts +2 -2
- package/dist/ui/components.d.ts +2 -2
- package/dist/ui/components.js +1 -1
- package/dist/{ui-contract-iQfTtUSL.d.ts → ui-contract-rzKBwOLC.d.ts} +5 -3
- package/dist/ui.d.ts +5 -5
- package/dist/ui.js +2 -2
- package/package.json +15 -9
- package/src/browser-interaction/attributes.ts +211 -0
- package/src/browser-interaction/canonical.ts +77 -0
- package/src/browser-interaction/constants.ts +77 -0
- package/src/browser-interaction/effects.ts +176 -0
- package/src/browser-interaction/index.ts +111 -0
- package/src/browser-interaction/normalize.ts +997 -0
- package/src/browser-interaction/registry.ts +70 -0
- package/src/browser-interaction/resolve.ts +596 -0
- package/src/browser-interaction/schemas.ts +152 -0
- package/src/browser-interaction/types.ts +304 -0
- package/src/browser-interaction.ts +1 -0
- package/src/generated/reducer-contract/wire.ts +1 -1
- package/src/generated/reducer-contract/zod.ts +3 -1
- package/src/package-set.ts +1 -1
- package/src/reducer/bundle/ingress-bundle.ts +1 -1
- package/src/reducer/bundle/trusted/interaction-types.ts +3 -0
- package/src/reducer/bundle/trusted/projection-builder.ts +337 -13
- package/src/reducer/ingress/input-codec.ts +1 -1
- package/src/reducer/ingress/session-codec.ts +1 -1
- package/src/runtime-internal/components/InteractionForm.tsx +345 -7
- package/src/runtime-internal/components/PluginRuntime.tsx +2 -0
- package/src/runtime-internal/components/board/target-layer.ts +2 -0
- package/src/runtime-internal/context/PluginStateContext.tsx +41 -0
- package/src/runtime-internal/hooks/useBoardInteractions.ts +73 -11
- package/src/runtime-internal/primitives/board.tsx +71 -0
- package/src/runtime-internal/primitives/interaction.tsx +160 -1
- package/src/runtime-internal/types/plugin-state.ts +6 -0
- package/src/runtime-internal/utils/browser-interaction-effects.ts +240 -0
- package/src/runtime-internal/utils/interaction-draft-digest.ts +252 -0
- package/src/runtime-internal/utils/semantic-projection-digest.ts +407 -0
- package/src/ui/components/board/HexGrid.tsx +3 -0
- package/src/ui/components/board/target-layer.ts +1 -0
- package/dist/chunk-TDSWKVZ4.js.map +0 -1
- package/dist/chunk-VFTAA4WO.js.map +0 -1
- package/dist/chunk-WN74KVNY.js.map +0 -1
- /package/dist/{chunk-U5C6BONG.js.map → chunk-326PGVAA.js.map} +0 -0
- /package/dist/{chunk-GKKBPPSW.js.map → chunk-MZNVHMJ5.js.map} +0 -0
- /package/dist/{chunk-KAELH4KC.js.map → chunk-NKCRKGR2.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/runtime-internal/primitives/ui.tsx","../src/runtime-internal/primitives/hand-intent-adapter.ts","../src/runtime-internal/context/InteractionDraftContext.tsx","../src/runtime-internal/context/PluginSessionContext.tsx","../src/runtime-internal/context/PluginStateContext.tsx","../src/runtime-internal/context/RuntimeContext.tsx","../src/runtime-internal/utils/interaction-inputs.ts","../src/runtime-internal/utils/interaction-router.ts","../src/runtime-internal/utils/interaction-status.ts","../src/runtime-internal/utils/card-intent-adapter.ts","../src/runtime-internal/primitives/game.tsx","../src/runtime-internal/hooks/useActivePlayers.ts","../src/runtime-internal/hooks/useGameSelector.ts","../src/runtime-internal/hooks/useGameView.ts","../src/runtime-internal/hooks/usePlayerInfo.ts","../src/runtime-internal/hooks/useLobby.ts","../src/runtime-internal/hooks/usePlayerTurnOrder.ts","../src/runtime-internal/utils/interaction-labels.ts","../src/runtime-internal/primitives/primitive-props.tsx","../src/runtime-internal/primitives/zone.tsx","../src/runtime-internal/primitives/interaction-submit.ts","../src/runtime-internal/primitives/hand-surface.tsx","../src/runtime-internal/primitives/board.tsx","../src/runtime-internal/hooks/useBoardInteractions.ts","../src/runtime-internal/errors/ValidationError.ts","../src/runtime-internal/primitives/interaction.tsx","../src/runtime-internal/hooks/useInteractionHandle.ts","../src/runtime-internal/context/ClientParamSchemaContext.tsx","../src/runtime-internal/components/InteractionForm.tsx","../src/runtime-internal/primitives/interaction-form-binding.tsx","../src/runtime-internal/primitives/dialog-lifecycle.ts","../src/runtime-internal/primitives/phase.tsx","../src/runtime-internal/primitives/player-roster.tsx","../src/runtime-internal/primitives/prompt.tsx","../src/runtime-internal/hooks/useSeatInbox.ts","../src/runtime-internal/primitives/dice.tsx"],"sourcesContent":["import type { CSSProperties, ReactNode } from \"react\";\nimport {\n ThemeProvider,\n type Theme,\n type ThemeOverride,\n type ThemePresetId,\n} from \"../../ui.js\";\n\nexport interface UIRootProps {\n /**\n * Preset id, a full Theme, or omitted to defer to the host-mounted theme.\n * When omitted, no provider is mounted and existing parent themes apply.\n */\n theme?: ThemePresetId | Theme;\n /** Deep-partial overrides forwarded to the SDK ThemeProvider. */\n themeOverride?: ThemeOverride;\n /** Forwarded to the SDK ThemeProvider. */\n reducedMotion?: \"auto\" | \"force\" | \"ignore\";\n /** Forwarded to the SDK ThemeProvider wrapper. */\n className?: string;\n /** Forwarded to the SDK ThemeProvider wrapper style. */\n style?: CSSProperties;\n children: ReactNode;\n}\n\n/**\n * Root provider for generated UI contracts.\n *\n * Composes the SDK `ThemeProvider` so authors can write\n * `<UI.Root theme=\"tabletop\">` and have presentation tokens applied without\n * importing `@dreamboard-games/sdk/ui` themselves. The runtime workspace contract\n * stacks plugin-state, toast and mobile-hand providers around this.\n */\nexport function UIRoot({\n theme,\n themeOverride,\n reducedMotion,\n className,\n style,\n children,\n}: UIRootProps) {\n if (theme === undefined && themeOverride === undefined) {\n return <>{children}</>;\n }\n return (\n <ThemeProvider\n theme={theme}\n override={themeOverride}\n reducedMotion={reducedMotion}\n className={className}\n style={style}\n >\n {children}\n </ThemeProvider>\n );\n}\n\nexport const UI = {\n Root: UIRoot,\n};\n","import { useCallback } from \"react\";\nimport type { CardIntent } from \"../../ui.js\";\nimport { useInteractionUiStore } from \"../context/InteractionDraftContext.js\";\nimport { usePluginSession } from \"../context/PluginSessionContext.js\";\nimport { usePluginState } from \"../context/PluginStateContext.js\";\nimport { useRuntimeContext } from \"../context/RuntimeContext.js\";\nimport {\n applyCardIntent,\n decodeRuntimeDropTargetId,\n type CardIntentResult,\n} from \"../utils/card-intent-adapter.js\";\n\nexport type RuntimeCardIntentResult = CardIntentResult;\n\n/**\n * Author-facing card intent. Mirrors the SDK shape, but for `drop` intents\n * `targetId` is the manifest id (e.g. `\"hex-a\"`) — the runtime adapter\n * decodes the opaque SDK target id before invoking author callbacks. This\n * matches the type the generated `hand.Hand` facade declares.\n */\nexport type AuthoredCardIntent =\n | { type: \"activate\"; cardId: string; source: \"tap\" | \"keyboard\" }\n | { type: \"previewStart\"; cardId: string }\n | { type: \"previewEnd\"; cardId: string }\n | {\n type: \"drop\";\n cardId: string;\n targetId: string;\n source: \"pointer\" | \"keyboard\";\n };\n\n/**\n * Translate a raw SDK `CardIntent` into the author-facing\n * `AuthoredCardIntent` shape. For drop intents the opaque encoded\n * `targetId` is decoded into its manifest value; non-decodable target\n * ids fall through unchanged so authors can detect and ignore them.\n */\nexport function decodeAuthoredCardIntent(\n intent: CardIntent,\n): AuthoredCardIntent {\n if (intent.type !== \"drop\") {\n return intent;\n }\n const decoded = decodeRuntimeDropTargetId(String(intent.targetId));\n return {\n type: \"drop\",\n cardId: String(intent.cardId),\n source: intent.source,\n targetId: decoded ? decoded.value : String(intent.targetId),\n };\n}\n\nexport interface UseCardIntentAdapterOptions {\n /** Zone the hand is rendering. Used for snapshot lookup. */\n zone: string;\n /**\n * Optional hook for the host to react to the runtime classification of an\n * intent. Useful for confirmation animations or analytics. The intent is\n * already routed by the time this fires. Receives the decoded\n * authored-shape intent so `targetId` is the manifest id, not the SDK\n * opaque encoding.\n */\n onResult?: (\n intent: AuthoredCardIntent,\n result: RuntimeCardIntentResult,\n ) => void;\n}\n\n/**\n * Bind SDK card intent emission to the canonical runtime collector pipeline.\n *\n * The returned callback accepts the SDK `CardIntent` shape unchanged. The\n * adapter looks up the descriptor for the originating card, atomically\n * applies the card and any decoded drop-target inputs, and routes\n * pending/submitting/submitted classifications through the runtime API.\n *\n * Preview intents are forwarded to the optional `onResult` callback as\n * `ignored` results so authors can attach analytics without owning the\n * routing logic themselves.\n */\nexport function useCardIntentAdapter({\n zone,\n onResult,\n}: UseCardIntentAdapterOptions) {\n const store = useInteractionUiStore();\n const { controllingPlayerId } = usePluginSession();\n const runtime = useRuntimeContext();\n const zoneSnapshot = usePluginState(\n (state) => state.gameplay.zones[zone] ?? null,\n );\n const availableInteractions = usePluginState(\n (state) => state.gameplay.availableInteractions,\n );\n\n return useCallback(\n async (intent: CardIntent): Promise<RuntimeCardIntentResult> => {\n const authored = decodeAuthoredCardIntent(intent);\n if (intent.type === \"previewStart\" || intent.type === \"previewEnd\") {\n const result: RuntimeCardIntentResult = {\n status: \"ignored\",\n reason: \"no-descriptor\",\n };\n onResult?.(authored, result);\n return result;\n }\n if (!controllingPlayerId) {\n const result: RuntimeCardIntentResult = {\n status: \"ignored\",\n reason: \"interaction-unavailable\",\n };\n onResult?.(authored, result);\n return result;\n }\n const result = await applyCardIntent(\n {\n store,\n availableInteractions,\n zoneSnapshot,\n submit: async (descriptor, params) => {\n await runtime.submitInteraction(\n controllingPlayerId,\n descriptor.interactionId,\n params,\n );\n },\n },\n intent.type === \"drop\"\n ? {\n type: \"drop\",\n cardId: String(intent.cardId),\n targetId: String(intent.targetId),\n }\n : { type: \"activate\", cardId: String(intent.cardId) },\n );\n onResult?.(authored, result);\n return result;\n },\n [\n availableInteractions,\n controllingPlayerId,\n onResult,\n runtime,\n store,\n zoneSnapshot,\n ],\n );\n}\n","import { createContext, useContext, useMemo, type ReactNode } from \"react\";\nimport { useStore } from \"zustand\";\nimport { createStore, type StoreApi } from \"zustand/vanilla\";\nimport { useShallow } from \"zustand/shallow\";\n\ntype Draft = Readonly<Record<string, unknown>>;\n\nconst EMPTY_DRAFT: Draft = Object.freeze({});\n\ninterface DraftState {\n drafts: Readonly<Record<string, Draft>>;\n arms: Readonly<Record<string, string>>;\n submitting: Readonly<Record<string, true>>;\n pendingInteractionKey: string | null;\n pendingInteractionRevision: number;\n}\n\n/**\n * Imperative API exposed to interaction primitives.\n * Intentionally small; the vanilla zustand store underneath powers\n * fine-grained subscriptions via {@link useDraft} and {@link useArmed}.\n */\nexport interface InteractionUiStore {\n /** Read the current draft for an interaction id. Never undefined. */\n getDraft(interactionId: string): Draft;\n /** Merge a single input key into the draft. Creates the draft if needed. */\n setInput(interactionId: string, key: string, value: unknown): void;\n /** Clear a single input, or the whole draft if `key` is omitted. */\n clearInput(interactionId: string, key?: string): void;\n /** Clear every draft and arming state. */\n clearAll(): void;\n /** Which interaction (if any) is currently armed on the given surface. */\n getArmed(surface: string): string | null;\n /** Arm a specific interaction on a surface. Pass `null` to disarm. */\n arm(surface: string, interactionId: string | null): void;\n /** Which interaction draft currently needs route-owned remaining input UI. */\n getPendingInteraction(): string | null;\n /** Mark the interaction draft currently waiting for remaining input. */\n setPendingInteraction(interactionId: string | null): void;\n /** Monotonic revision bumped whenever a pending interaction is routed. */\n getPendingInteractionRevision(): number;\n /** True while a local submission is in flight before the host echo arrives. */\n isSubmitting(interactionId: string): boolean;\n /** Atomically mark a submission in flight. Returns false if already busy. */\n claimSubmitting(interactionId: string): boolean;\n /** Mark or clear a local submission in flight. */\n setSubmitting(interactionId: string, submitting: boolean): void;\n}\n\n/** Vanilla zustand store implementing {@link InteractionUiStore}. */\nexport type InteractionUiStoreApi = StoreApi<DraftState> & InteractionUiStore;\n\nexport function createInteractionUiStore(): InteractionUiStoreApi {\n const store = createStore<DraftState>()(() => ({\n drafts: {},\n arms: {},\n submitting: {},\n pendingInteractionKey: null,\n pendingInteractionRevision: 0,\n }));\n\n const api: InteractionUiStore = {\n getDraft(interactionId) {\n return store.getState().drafts[interactionId] ?? EMPTY_DRAFT;\n },\n setInput(interactionId, key, value) {\n store.setState((prev) => {\n const current = prev.drafts[interactionId];\n if (current && current[key] === value) return prev;\n return {\n ...prev,\n drafts: {\n ...prev.drafts,\n [interactionId]: { ...(current ?? {}), [key]: value },\n },\n };\n });\n },\n clearInput(interactionId, key) {\n store.setState((prev) => {\n const current = prev.drafts[interactionId];\n if (!current) return prev;\n if (key === undefined) {\n const { [interactionId]: _omit, ...rest } = prev.drafts;\n return { ...prev, drafts: rest };\n }\n if (!(key in current)) return prev;\n const { [key]: _omitKey, ...remainingKeys } = current;\n if (Object.keys(remainingKeys).length === 0) {\n const { [interactionId]: _omit, ...rest } = prev.drafts;\n return { ...prev, drafts: rest };\n }\n return {\n ...prev,\n drafts: { ...prev.drafts, [interactionId]: remainingKeys },\n };\n });\n },\n clearAll() {\n store.setState((prev) => {\n if (\n Object.keys(prev.drafts).length === 0 &&\n Object.keys(prev.arms).length === 0 &&\n Object.keys(prev.submitting).length === 0 &&\n prev.pendingInteractionKey === null\n ) {\n return prev;\n }\n return {\n drafts: {},\n arms: {},\n submitting: {},\n pendingInteractionKey: null,\n pendingInteractionRevision: prev.pendingInteractionRevision + 1,\n };\n });\n },\n getArmed(surface) {\n return store.getState().arms[surface] ?? null;\n },\n arm(surface, interactionId) {\n store.setState((prev) => {\n const current = prev.arms[surface] ?? null;\n if (current === interactionId) return prev;\n if (interactionId === null) {\n const { [surface]: _omit, ...rest } = prev.arms;\n return { ...prev, arms: rest };\n }\n return { ...prev, arms: { ...prev.arms, [surface]: interactionId } };\n });\n },\n getPendingInteraction() {\n return store.getState().pendingInteractionKey;\n },\n setPendingInteraction(interactionId) {\n store.setState((prev) => {\n if (prev.pendingInteractionKey === interactionId) {\n return interactionId === null\n ? prev\n : {\n ...prev,\n pendingInteractionRevision: prev.pendingInteractionRevision + 1,\n };\n }\n return {\n ...prev,\n pendingInteractionKey: interactionId,\n pendingInteractionRevision: prev.pendingInteractionRevision + 1,\n };\n });\n },\n getPendingInteractionRevision() {\n return store.getState().pendingInteractionRevision;\n },\n isSubmitting(interactionId) {\n return store.getState().submitting[interactionId] === true;\n },\n claimSubmitting(interactionId) {\n let claimed = false;\n store.setState((prev) => {\n if (prev.submitting[interactionId] === true) return prev;\n claimed = true;\n return {\n ...prev,\n submitting: { ...prev.submitting, [interactionId]: true },\n };\n });\n return claimed;\n },\n setSubmitting(interactionId, submitting) {\n store.setState((prev) => {\n const current = prev.submitting[interactionId] === true;\n if (current === submitting) return prev;\n if (!submitting) {\n const { [interactionId]: _omit, ...rest } = prev.submitting;\n return { ...prev, submitting: rest };\n }\n return {\n ...prev,\n submitting: { ...prev.submitting, [interactionId]: true },\n };\n });\n },\n };\n\n return Object.assign(store, api);\n}\n\nconst InteractionUiCtx = createContext<InteractionUiStoreApi | null>(null);\n\n/**\n * React provider that holds draft input state shared across every surface\n * inside the tree. Auto-installed by `<PluginRuntime>`; authors rarely\n * mount it directly. Mount manually when rendering surface components in\n * isolation (e.g., Storybook, snapshot tests).\n *\n * ```tsx\n * <InteractionUiProvider>\n * <PanelSurface />\n * <Board.Root>{...}</Board.Root>\n * </InteractionUiProvider>\n * ```\n */\nexport function InteractionUiProvider({\n children,\n store,\n}: {\n children: ReactNode;\n store?: InteractionUiStoreApi;\n}) {\n const ownedStore = useMemo(() => createInteractionUiStore(), []);\n return (\n <InteractionUiCtx.Provider value={store ?? ownedStore}>\n {children}\n </InteractionUiCtx.Provider>\n );\n}\n\n/**\n * Access the active draft store. Falls back to an inert in-memory store\n * when no provider is mounted, so surface hooks remain callable in bare\n * test harnesses without crashing — draft state simply isn't shared\n * across components in that case.\n */\nexport function useInteractionUiStore(): InteractionUiStoreApi {\n const ctx = useContext(InteractionUiCtx);\n const fallback = useMemo(() => createInteractionUiStore(), []);\n return ctx ?? fallback;\n}\n\n/**\n * Subscribe to the draft for a single interaction id with per-slice\n * re-renders. Returns a stable empty object when the draft is unset.\n */\nexport function useInteractionDraft(interactionId: string): Draft {\n const store = useInteractionUiStore();\n useStore(\n store,\n useShallow(\n (state: DraftState) => state.drafts[interactionId] ?? EMPTY_DRAFT,\n ),\n );\n return store.getDraft(interactionId);\n}\n\n/** Subscribe to the armed interaction id on a given surface. */\nexport function useArmedInteraction(surface: string): string | null {\n const store = useInteractionUiStore();\n return useStore(store, (state: DraftState) => state.arms[surface] ?? null);\n}\n\n/** Subscribe to the interaction draft currently waiting for pending input. */\nexport function usePendingInteractionKey(): string | null {\n const store = useInteractionUiStore();\n const subscribed = useStore(\n store,\n (state: DraftState) => state.pendingInteractionKey ?? null,\n );\n return store.getPendingInteraction() ?? subscribed;\n}\n\n/** Subscribe to pending interaction route attempts. */\nexport function usePendingInteractionRevision(): number {\n const store = useInteractionUiStore();\n const subscribed = useStore(\n store,\n (state: DraftState) => state.pendingInteractionRevision,\n );\n return Math.max(store.getPendingInteractionRevision(), subscribed);\n}\n\n/** Subscribe to local submitting status for a single interaction key. */\nexport function useInteractionSubmitting(interactionId: string): boolean {\n const store = useInteractionUiStore();\n return useStore(\n store,\n (state: DraftState) => state.submitting[interactionId] === true,\n );\n}\n","import { createContext, useContext } from \"react\";\nimport type { PluginSessionState } from \"../types/runtime-api\";\n\n/**\n * Context for plugin session metadata.\n * This context is provided by the RuntimeContext after receiving init message from parent.\n */\nexport const PluginSessionContext = createContext<PluginSessionState | null>(\n null,\n);\n\n/**\n * Hook to access plugin session metadata.\n * Returns session initialization status and IDs.\n *\n * @returns Plugin session state with status, sessionId, controllablePlayerIds, and controllingPlayerId\n *\n * @example\n * ```tsx\n * function MyPluginComponent() {\n * const { status, sessionId, controllablePlayerIds, controllingPlayerId } = usePluginSession();\n *\n * if (status === \"loading\") {\n * return <div>Initializing...</div>;\n * }\n *\n * return (\n * <div>\n * <p>Session: {sessionId}</p>\n * <p>Can control: {controllablePlayerIds.join(\", \")}</p>\n * <p>Currently controlling: {controllingPlayerId}</p>\n * </div>\n * );\n * }\n * ```\n */\nexport function usePluginSession(): PluginSessionState {\n const context = useContext(PluginSessionContext);\n\n if (context === null) {\n throw new Error(\n \"usePluginSession must be used within a PluginSessionContext.Provider (provided by RuntimeContext)\",\n );\n }\n\n return context;\n}\n","import {\n default as React,\n createContext,\n useContext,\n useState,\n useEffect,\n useMemo,\n useSyncExternalStore,\n} from \"react\";\nimport type { PluginStateSnapshot } from \"../types/plugin-state.js\";\nimport { useRuntimeContext } from \"./RuntimeContext.js\";\nimport type { PluginRuntimeAPI } from \"../runtime/createPluginRuntimeAPI.js\";\n\n/**\n * React Context for providing plugin state from state-sync messages.\n * This is the new architecture where the host app maintains state and syncs to plugin.\n */\nconst PluginStateContext = createContext<PluginStateSnapshot | null>(null);\n\n/**\n * Loading component shown while waiting for initial state\n */\nfunction DefaultLoadingScreen() {\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: \"100%\",\n width: \"100%\",\n color: \"#666\",\n }}\n >\n <div style={{ textAlign: \"center\" }}>\n <div\n style={{\n width: \"40px\",\n height: \"40px\",\n border: \"3px solid #e0e0e0\",\n borderTopColor: \"#666\",\n borderRadius: \"50%\",\n animation: \"spin 1s linear infinite\",\n margin: \"0 auto 12px\",\n }}\n />\n <style>{`@keyframes spin { to { transform: rotate(360deg); } }`}</style>\n <p>Loading game view...</p>\n </div>\n </div>\n );\n}\n\nexport interface PluginStateProviderProps {\n children: React.ReactNode;\n /**\n * Custom loading component to show while waiting for state\n * @default DefaultLoadingScreen\n */\n loadingComponent?: React.ReactNode;\n}\n\n/**\n * PluginStateProvider subscribes to state-sync messages from the host\n * and provides the state to child components via context.\n *\n * In the new architecture:\n * - Host only renders authored game UI after state-sync begins\n * - Plugin receives complete state in first state-sync message\n * - No buffering or waiting needed - state is immediately available\n *\n * This replaces the complex usePluginRuntime hook which had:\n * - waitForGameStart() promise handling\n * - finishSetup() coordination with queueMicrotask\n * - Error timeout handling\n *\n * @example\n * ```tsx\n * function PluginRoot() {\n * return (\n * <RuntimeProvider runtime={runtime}>\n * <PluginStateProvider>\n * <App />\n * </PluginStateProvider>\n * </RuntimeProvider>\n * );\n * }\n * ```\n */\nexport function PluginStateProvider({\n children,\n loadingComponent = <DefaultLoadingScreen />,\n}: PluginStateProviderProps) {\n const runtime = useRuntimeContext() as PluginRuntimeAPI;\n const [state, setState] = useState<PluginStateSnapshot | null>(\n () => runtime.getSnapshot?.() ?? null,\n );\n\n useEffect(() => {\n // Get initial state if available\n const initialState = runtime.getSnapshot?.();\n if (initialState) {\n setState(initialState);\n }\n\n // Subscribe to state changes\n if (runtime.subscribeToState) {\n return runtime.subscribeToState((newState) => {\n setState(newState);\n });\n }\n\n return () => {};\n }, [runtime]);\n\n // Don't render children until state is available\n // In the new architecture, host guarantees state exists before rendering plugin\n if (!state) {\n return <>{loadingComponent}</>;\n }\n\n return (\n <PluginStateContext.Provider value={state}>\n {children}\n </PluginStateContext.Provider>\n );\n}\n\n/**\n * Hook to access the full plugin state snapshot.\n *\n * @throws Error if used outside of PluginStateProvider\n * @returns Current plugin state snapshot\n *\n * @example\n * ```typescript\n * function MyComponent() {\n * const state = usePluginStateSnapshot();\n * console.log('Current phase:', state.gameplay.currentPhase);\n * }\n * ```\n */\nexport function usePluginStateSnapshot(): PluginStateSnapshot {\n const state = useContext(PluginStateContext);\n\n if (!state) {\n throw new Error(\n \"usePluginStateSnapshot must be used within PluginStateProvider. \" +\n \"Make sure you have wrapped your app with <PluginStateProvider>.\",\n );\n }\n\n return state;\n}\n\n/**\n * Hook to select a specific part of the plugin state.\n * Uses useSyncExternalStore for optimal performance - only re-renders\n * when the selected value changes (using reference equality).\n *\n * @param selector - Function to select a part of the state\n * @returns Selected value from state\n *\n * @example\n * ```typescript\n * // Only re-renders when gameplay.currentPhase changes\n * function CurrentStateDisplay() {\n * const currentState = usePluginState((s) => s.gameplay.currentPhase);\n * return <div>State: {currentState}</div>;\n * }\n * ```\n */\nexport function usePluginState<T>(\n selector: (state: PluginStateSnapshot) => T,\n): T {\n const runtime = useRuntimeContext() as PluginRuntimeAPI;\n\n const subscribe = (onStoreChange: () => void) => {\n if (!runtime.subscribeToState) {\n return () => {};\n }\n return runtime.subscribeToState(() => {\n onStoreChange();\n });\n };\n\n const getSnapshot = () => {\n const state = runtime.getSnapshot?.();\n if (!state) {\n throw new Error(\n \"usePluginState: No state available. \" +\n \"Make sure you have wrapped your app with <PluginStateProvider>.\",\n );\n }\n return state;\n };\n\n const state = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n return useMemo(() => selector(state), [selector, state]);\n}\n\n/**\n * Hook to access plugin actions (like marking notifications read).\n *\n * @returns Object with action functions\n *\n * @example\n * ```typescript\n * function NotificationsList() {\n * const notifications = usePluginState((s) => s.notifications);\n * const { markNotificationRead, switchPlayer } = usePluginActions();\n *\n * return (\n * <ul>\n * {notifications.map((n) => (\n * <li key={n.id} onClick={() => markNotificationRead(n.id)}>\n * {n.type}\n * </li>\n * ))}\n * </ul>\n * );\n * }\n * ```\n */\nexport function usePluginActions(): {\n markNotificationRead: (notificationId: string) => void;\n switchPlayer: (playerId: string) => void;\n submitInteraction: (\n playerId: string,\n interactionId: string,\n params: unknown,\n ) => Promise<void>;\n} {\n const runtime = useRuntimeContext() as PluginRuntimeAPI;\n\n return {\n /**\n * Mark a notification as read.\n * Sends message to host which updates the notification in GameSessionStore.\n */\n markNotificationRead: (notificationId: string) => {\n window.parent.postMessage(\n { type: \"mark-notification-read\", notificationId },\n \"*\",\n );\n },\n\n /**\n * Switch to a different player (for users controlling multiple seats).\n */\n switchPlayer: (playerId: string) => {\n runtime.switchPlayer?.(playerId);\n },\n\n /**\n * Submit a player interaction (action or prompt response).\n */\n submitInteraction: runtime.submitInteraction,\n };\n}\n\nexport { PluginStateContext };\n","import React, { createContext, useContext, useState, useEffect } from \"react\";\nimport type { RuntimeAPI, PluginSessionState } from \"../types/runtime-api.js\";\nimport { PluginSessionContext } from \"./PluginSessionContext.js\";\n\n/**\n * React Context for providing RuntimeAPI to plugin components.\n * This context must be provided by the plugin wrapper, not by the plugin code itself.\n */\nexport const RuntimeContext = createContext<RuntimeAPI | null>(null);\n\n/**\n * Hook to access the RuntimeAPI from context.\n *\n * @throws Error if used outside of RuntimeContext.Provider\n * @returns RuntimeAPI instance\n *\n * @example\n * ```typescript\n * function MyPluginComponent() {\n * const runtime = useRuntimeContext();\n * return (\n * <button onClick={() => runtime.submitInteraction(\"player-1\", \"pass\", {})}>\n * Pass\n * </button>\n * );\n * }\n * ```\n */\nexport function useRuntimeContext(): RuntimeAPI {\n const context = useContext(RuntimeContext);\n\n if (!context) {\n throw new Error(\n \"useRuntimeContext must be used within a RuntimeContext.Provider\",\n );\n }\n\n return context;\n}\n\n/**\n * RuntimeProvider component that provides both RuntimeAPI and PluginSessionContext.\n * This component subscribes to session state changes from the RuntimeAPI and provides\n * them through PluginSessionContext.\n *\n * @example\n * ```tsx\n * function PluginRoot() {\n * const runtime = createPluginRuntimeAPI();\n *\n * return (\n * <RuntimeProvider runtime={runtime}>\n * <App />\n * </RuntimeProvider>\n * );\n * }\n * ```\n */\nexport function RuntimeProvider({\n runtime,\n children,\n}: {\n runtime: RuntimeAPI;\n children: React.ReactNode;\n}) {\n // Subscribe to session state changes\n const [sessionState, setSessionState] = useState<PluginSessionState>(() =>\n runtime.getSessionState(),\n );\n\n useEffect(() => {\n // Subscribe to session state changes via internal API\n const runtimeWithInternal = runtime as RuntimeAPI & {\n _subscribeToSessionState?: (\n listener: (state: PluginSessionState) => void,\n ) => () => void;\n };\n\n if (runtimeWithInternal._subscribeToSessionState) {\n return runtimeWithInternal._subscribeToSessionState((state) => {\n setSessionState(state);\n });\n }\n\n // Fallback: no session state subscription available\n return () => {};\n }, [runtime]);\n\n return (\n <RuntimeContext.Provider value={runtime}>\n <PluginSessionContext.Provider value={sessionState}>\n {children}\n </PluginSessionContext.Provider>\n </RuntimeContext.Provider>\n );\n}\n","import type {\n InteractionDescriptor,\n InteractionInputDescriptor,\n InputDomain,\n InputSelection,\n} from \"../types/plugin-state.js\";\n\nexport type BoardTargetKind = \"edge\" | \"vertex\" | \"space\" | \"tile\";\n\nexport function interactionInputKeys(\n descriptor: Pick<InteractionDescriptor, \"inputs\">,\n): string[] {\n return descriptor.inputs.map((input) => input.key);\n}\n\nexport function applyInteractionInputDefaults<\n Params extends Record<string, unknown>,\n>(\n descriptor: Pick<InteractionDescriptor, \"inputs\">,\n params: Readonly<Partial<Params>>,\n): Partial<Params> {\n const next: Record<string, unknown> = { ...params };\n for (const input of descriptor.inputs) {\n if (next[input.key] !== undefined) continue;\n if (!(\"defaultValue\" in input)) continue;\n next[input.key] = input.defaultValue;\n }\n return next as Partial<Params>;\n}\n\nexport function resolveInputDomain(\n input: InteractionInputDescriptor,\n params: Readonly<Record<string, unknown>>,\n): InteractionInputDescriptor {\n const dependencies = input.domain.dependencies;\n if (dependencies?.mode !== \"eager\") return input;\n const dependencyKeys = inputDependencyKeys(input);\n if (dependencyKeys.length === 0) return input;\n const caseMatch = dependencies.dependentCases.find((candidate) =>\n dependencyKeys.every(\n (key) =>\n params[key] !== undefined &&\n params[key] !== null &&\n String(params[key]) === candidate.when[key],\n ),\n );\n if (!caseMatch) return input;\n return {\n ...input,\n domain: caseMatch.domain,\n };\n}\n\nexport function resolveInteractionInputs(\n descriptor: Pick<InteractionDescriptor, \"inputs\">,\n params: Readonly<Record<string, unknown>>,\n): InteractionInputDescriptor[] {\n return descriptor.inputs.map((input) => resolveInputDomain(input, params));\n}\n\nexport function dependentInputKeys(\n descriptor: Pick<InteractionDescriptor, \"inputs\">,\n changedKey: string,\n): string[] {\n const dependentsByKey = new Map<string, string[]>();\n for (const input of descriptor.inputs) {\n for (const dependency of inputDependencyKeys(input)) {\n dependentsByKey.set(dependency, [\n ...(dependentsByKey.get(dependency) ?? []),\n input.key,\n ]);\n }\n }\n const result: string[] = [];\n const queue = [...(dependentsByKey.get(changedKey) ?? [])];\n while (queue.length > 0) {\n const key = queue.shift();\n if (!key || result.includes(key)) continue;\n result.push(key);\n queue.push(...(dependentsByKey.get(key) ?? []));\n }\n return result;\n}\n\nexport function validateInteractionInputDomains(\n descriptor: Pick<InteractionDescriptor, \"inputs\">,\n params: Readonly<Record<string, unknown>>,\n): Partial<Record<string, readonly string[]>> {\n const fieldErrors: Record<string, string[]> = {};\n\n for (const rawInput of descriptor.inputs) {\n const input = resolveInputDomain(rawInput, params);\n const value = params[input.key];\n if (value === undefined || value === null) continue;\n\n const selectionErrors = validateInputSelection(input, value);\n for (const error of selectionErrors) {\n pushFieldError(fieldErrors, input.key, error);\n }\n\n if (input.domain.type === \"choiceList\") {\n if (!Array.isArray(value)) {\n pushFieldError(fieldErrors, input.key, \"Expected a list of choices.\");\n continue;\n }\n\n const min = input.domain.min ?? 0;\n const max =\n input.domain.max ??\n input.domain.choices?.length ??\n Number.POSITIVE_INFINITY;\n if (value.length < min) {\n pushFieldError(\n fieldErrors,\n input.key,\n `Choose at least ${min} ${pluralize(\"option\", min)}.`,\n );\n }\n if (value.length > max) {\n pushFieldError(\n fieldErrors,\n input.key,\n `Choose at most ${max} ${pluralize(\"option\", max)}.`,\n );\n }\n const allowed = new Set(\n input.domain.choices?.map((choice) => choice.value),\n );\n if (\n allowed.size > 0 &&\n value.some((item) => !allowed.has(String(item)))\n ) {\n pushFieldError(\n fieldErrors,\n input.key,\n \"Selected choice is not eligible.\",\n );\n }\n }\n\n if (input.domain.type === \"choice\") {\n const allowed = new Set(\n input.domain.choices?.map((choice) => choice.value),\n );\n if (allowed.size > 0 && !allowed.has(value as string | null)) {\n pushFieldError(\n fieldErrors,\n input.key,\n \"Selected choice is not eligible.\",\n );\n }\n }\n\n if (isResolvedTargetDomain(input.domain)) {\n const values = valuesForSelection(input.domain.selection, value);\n for (const item of values) {\n if (!input.domain.eligibleTargets.includes(String(item))) {\n pushFieldError(\n fieldErrors,\n input.key,\n \"Selected target is not eligible.\",\n );\n break;\n }\n }\n }\n }\n\n return fieldErrors;\n}\n\nexport function isInputValueReady(\n input: InteractionInputDescriptor,\n value: unknown,\n): boolean {\n if (value === undefined || value === null) return false;\n const selection = inputSelection(input);\n if (selection?.mode !== \"many\") return true;\n return Array.isArray(value) && value.length >= selection.min;\n}\n\nexport function isManyInput(input: InteractionInputDescriptor): boolean {\n return inputSelection(input)?.mode === \"many\";\n}\n\nexport function maxSelectedForInput(\n input: InteractionInputDescriptor,\n): number | undefined {\n const selection = inputSelection(input);\n return selection?.mode === \"many\" ? selection.max : undefined;\n}\n\nexport function toggleManyValue(\n current: unknown,\n value: string,\n selection: InputSelection,\n): string[] {\n if (selection.mode !== \"many\") return [value];\n const previous = Array.isArray(current)\n ? current.map((item) => String(item))\n : [];\n const existing = previous.indexOf(value);\n if (existing >= 0) {\n return previous.filter((item) => item !== value);\n }\n if (selection.max !== undefined && previous.length >= selection.max) {\n return previous;\n }\n return [...previous, value];\n}\n\nexport function isManyTargetSelectable(\n input: InteractionInputDescriptor,\n current: unknown,\n targetId: string,\n): boolean {\n const selection = inputSelection(input);\n if (selection?.mode !== \"many\") return true;\n const currentValues = Array.isArray(current)\n ? current.map((item) => String(item))\n : [];\n if (currentValues.includes(targetId)) return true;\n if (selection.distinct && currentValues.includes(targetId)) return false;\n return selection.max === undefined || currentValues.length < selection.max;\n}\n\nexport function mergeInteractionFieldErrors(\n ...sources: Array<Partial<Record<string, readonly string[]>>>\n): Partial<Record<string, readonly string[]>> {\n const merged: Record<string, string[]> = {};\n for (const source of sources) {\n for (const [key, messages] of Object.entries(source)) {\n if (!messages || messages.length === 0) continue;\n merged[key] = [...(merged[key] ?? []), ...messages];\n }\n }\n return merged;\n}\n\nexport function hasInteractionFieldErrors(\n fieldErrors: Partial<Record<string, readonly string[]>>,\n): boolean {\n return Object.values(fieldErrors).some(\n (messages) => (messages?.length ?? 0) > 0,\n );\n}\n\nexport function inputByKey(\n descriptor: Pick<InteractionDescriptor, \"inputs\">,\n key: string,\n): InteractionInputDescriptor | undefined {\n return descriptor.inputs.find((input) => input.key === key);\n}\n\nexport function inputByTarget(\n descriptor: Pick<InteractionDescriptor, \"inputs\">,\n targetKind: BoardTargetKind | \"card\",\n targetId: string,\n params: Readonly<Record<string, unknown>> = {},\n): InteractionInputDescriptor | null {\n for (const rawInput of descriptor.inputs) {\n const input = resolveInputDomain(rawInput, params);\n if (!isResolvedTargetDomain(input.domain)) continue;\n if (inputTargetKind(input.domain) !== targetKind) continue;\n if (input.domain.eligibleTargets.includes(targetId)) return input;\n }\n return null;\n}\n\nexport function eligibleTargetsForInput(\n descriptor: Pick<InteractionDescriptor, \"inputs\">,\n key: string,\n params: Readonly<Record<string, unknown>> = {},\n): readonly string[] | undefined {\n const rawInput = inputByKey(descriptor, key);\n const domain = rawInput ? resolveInputDomain(rawInput, params).domain : null;\n return domain && isResolvedTargetDomain(domain)\n ? domain.eligibleTargets\n : undefined;\n}\n\nexport function eligibleTargetsByInput(\n descriptor: Pick<InteractionDescriptor, \"inputs\">,\n params: Readonly<Record<string, unknown>> = {},\n): Record<string, readonly string[]> {\n return Object.fromEntries(\n descriptor.inputs.flatMap((rawInput) => {\n const input = resolveInputDomain(rawInput, params);\n const targets = isResolvedTargetDomain(input.domain)\n ? input.domain.eligibleTargets\n : undefined;\n return targets ? [[input.key, targets]] : [];\n }),\n );\n}\n\nexport function eligibleTargetsByBoardKind(\n descriptor: Pick<InteractionDescriptor, \"inputs\">,\n params: Readonly<Record<string, unknown>> = {},\n): Partial<Record<BoardTargetKind, readonly string[]>> {\n const result: Record<BoardTargetKind, Set<string>> = {\n edge: new Set<string>(),\n vertex: new Set<string>(),\n space: new Set<string>(),\n tile: new Set<string>(),\n };\n for (const rawInput of descriptor.inputs) {\n const input = resolveInputDomain(rawInput, params);\n if (\n input.domain.type !== \"boardTarget\" ||\n input.domain.projection !== \"resolved\"\n ) {\n continue;\n }\n const targetKind = input.domain.targetKind;\n if (!isBoardTargetKind(targetKind)) continue;\n for (const targetId of input.domain.eligibleTargets) {\n result[targetKind].add(targetId);\n }\n }\n return Object.fromEntries(\n Object.entries(result).flatMap(([kind, ids]) =>\n ids.size > 0 ? [[kind, [...ids]]] : [],\n ),\n ) as Partial<Record<BoardTargetKind, readonly string[]>>;\n}\n\nexport function hasBoardTargetInput(\n descriptor: Pick<InteractionDescriptor, \"inputs\">,\n): boolean {\n return boardTargetKindsOf(descriptor).length > 0;\n}\n\nexport function hasCardTargetInput(\n descriptor: Pick<InteractionDescriptor, \"inputs\">,\n): boolean {\n return descriptor.inputs.some((input) => input.domain.type === \"cardTarget\");\n}\n\nexport function interactionArmScope(\n descriptor: Pick<\n InteractionDescriptor,\n \"inputs\" | \"interactionKey\" | \"zoneId\"\n >,\n): string {\n const boardKinds = boardTargetKindsOf(descriptor);\n if (boardKinds.length === 1) return `board:${boardKinds[0]}`;\n if (boardKinds.length > 1) return \"board\";\n if (descriptor.zoneId) return `zone:${descriptor.zoneId}`;\n return `interaction:${descriptor.interactionKey}`;\n}\n\nexport function inputKeyForTarget(\n descriptor: Pick<InteractionDescriptor, \"inputs\">,\n targetKind: BoardTargetKind | \"card\",\n targetId: string,\n params: Readonly<Record<string, unknown>> = {},\n): string | null {\n return inputByTarget(descriptor, targetKind, targetId, params)?.key ?? null;\n}\n\nexport function inputDependencyKeys(\n input: InteractionInputDescriptor,\n): readonly string[] {\n const dependencies = input.domain.dependencies;\n if (!dependencies) return [];\n if (dependencies.mode === \"lazy\") return dependencies.dependsOn;\n const keys = new Set<string>();\n for (const candidate of dependencies.dependentCases) {\n for (const key of Object.keys(candidate.when)) {\n keys.add(key);\n }\n }\n return [...keys];\n}\n\nexport function isTargetDomain(\n domain: InputDomain | undefined,\n): domain is Extract<InputDomain, { type: \"cardTarget\" | \"boardTarget\" }> {\n if (!domain) return false;\n return domain.type === \"cardTarget\" || domain.type === \"boardTarget\";\n}\n\nexport function isResolvedTargetDomain(\n domain: InputDomain,\n): domain is Extract<InputDomain, { projection: \"resolved\" }> {\n return (\n (domain.type === \"cardTarget\" || domain.type === \"boardTarget\") &&\n domain.projection === \"resolved\"\n );\n}\n\nexport function isCardTargetDomain(\n domain: InputDomain | undefined,\n): domain is Extract<InputDomain, { type: \"cardTarget\" }> {\n if (!domain) return false;\n return domain.type === \"cardTarget\";\n}\n\nexport function isBoardTargetDomain(\n domain: InputDomain | undefined,\n): domain is Extract<InputDomain, { type: \"boardTarget\" }> {\n if (!domain) return false;\n return domain.type === \"boardTarget\";\n}\n\nexport function inputTargetKind(\n domain: InputDomain,\n): BoardTargetKind | \"card\" | string | undefined {\n if (domain.type === \"cardTarget\") return \"card\";\n if (domain.type === \"boardTarget\") return domain.targetKind;\n return undefined;\n}\n\nfunction boardTargetKindsOf(\n descriptor: Pick<InteractionDescriptor, \"inputs\">,\n): BoardTargetKind[] {\n const kinds = new Set<BoardTargetKind>();\n for (const input of descriptor.inputs) {\n if (input.domain.type !== \"boardTarget\") continue;\n if (isBoardTargetKind(input.domain.targetKind)) {\n kinds.add(input.domain.targetKind);\n }\n }\n return [...kinds];\n}\n\nfunction validateInputSelection(\n input: InteractionInputDescriptor,\n value: unknown,\n): string[] {\n const selection = inputSelection(input);\n if (selection?.mode !== \"many\") return [];\n if (!Array.isArray(value)) return [\"Expected a list of values.\"];\n const errors: string[] = [];\n const min = selection.min;\n if (value.length < min) {\n errors.push(`Choose at least ${min} ${pluralize(\"value\", min)}.`);\n }\n if (selection.max !== undefined && value.length > selection.max) {\n errors.push(\n `Choose at most ${selection.max} ${pluralize(\"value\", selection.max)}.`,\n );\n }\n if (selection.distinct) {\n const seen = new Set<string>();\n for (const item of value) {\n const key = String(item);\n if (seen.has(key)) {\n errors.push(\"Choose each value only once.\");\n break;\n }\n seen.add(key);\n }\n }\n return errors;\n}\n\nfunction valuesForSelection(\n selection: InputSelection | undefined,\n value: unknown,\n): readonly unknown[] {\n if (selection?.mode === \"many\") return Array.isArray(value) ? value : [];\n return [value];\n}\n\nfunction inputSelection(\n input: InteractionInputDescriptor,\n): InputSelection | undefined {\n return \"selection\" in input.domain ? input.domain.selection : undefined;\n}\n\nfunction isBoardTargetKind(value: unknown): value is BoardTargetKind {\n return (\n value === \"edge\" ||\n value === \"vertex\" ||\n value === \"space\" ||\n value === \"tile\"\n );\n}\n\nfunction pushFieldError(\n fieldErrors: Record<string, string[]>,\n key: string,\n message: string,\n): void {\n fieldErrors[key] = [...(fieldErrors[key] ?? []), message];\n}\n\nfunction pluralize(word: string, count: number): string {\n return count === 1 ? word : `${word}s`;\n}\n","import type { InteractionUiStore } from \"../context/InteractionDraftContext.js\";\nimport type { InteractionDescriptor } from \"../types/plugin-state.js\";\nimport {\n applyInteractionInputDefaults,\n dependentInputKeys,\n hasInteractionFieldErrors,\n inputByKey,\n inputDependencyKeys,\n interactionArmScope,\n interactionInputKeys,\n isManyInput,\n isInputValueReady,\n isTargetDomain,\n resolveInputDomain,\n toggleManyValue,\n validateInteractionInputDomains,\n} from \"./interaction-inputs.js\";\n\nexport interface InteractionDraftMutation {\n key: string;\n value: unknown;\n}\n\nexport interface InteractionDraftReadiness {\n values: Record<string, unknown>;\n missingInputs: readonly string[];\n readyFrontier: readonly string[];\n blockedInputs: readonly string[];\n fieldErrors: Partial<Record<string, readonly string[]>>;\n ready: boolean;\n}\n\nexport interface RoutedInteractionTarget {\n inputKey: string;\n value: string;\n extraInputs?: Record<string, unknown>;\n}\n\nexport interface RoutedCardInputIntent {\n cardInputKey: string;\n cardId: string;\n dropTarget?: {\n inputKey: string;\n value: string;\n };\n}\n\nexport interface RoutedInteractionTargetResult {\n params: Record<string, unknown>;\n readiness: InteractionDraftReadiness;\n}\n\nexport function applyInteractionDraftMutation(\n store: Pick<InteractionUiStore, \"getDraft\" | \"setInput\" | \"clearInput\">,\n descriptor: InteractionDescriptor,\n mutations: readonly InteractionDraftMutation[],\n): Record<string, unknown> {\n const originalDraft: Record<string, unknown> = {\n ...store.getDraft(descriptor.interactionKey),\n };\n const nextDraft: Record<string, unknown> = {\n ...originalDraft,\n };\n const mutatedKeys = new Set(mutations.map((mutation) => mutation.key));\n const changedKeys = new Set(\n mutations\n .filter((mutation) => originalDraft[mutation.key] !== mutation.value)\n .map((mutation) => mutation.key),\n );\n\n for (const { key, value } of mutations) {\n nextDraft[key] = value;\n }\n\n for (const { key } of mutations) {\n for (const dependentKey of dependentInputKeys(descriptor, key)) {\n if (mutatedKeys.has(dependentKey)) continue;\n if (\n changedKeys.has(key) ||\n shouldClearDependentInput(descriptor, nextDraft, dependentKey)\n ) {\n delete nextDraft[dependentKey];\n const defaultValue = defaultValueForInput(\n descriptor,\n nextDraft,\n dependentKey,\n );\n if (defaultValue !== undefined) {\n nextDraft[dependentKey] = defaultValue;\n }\n }\n }\n }\n\n const allKeys = new Set([\n ...Object.keys(originalDraft),\n ...Object.keys(nextDraft),\n ]);\n for (const key of allKeys) {\n if (!(key in nextDraft)) {\n store.clearInput(descriptor.interactionKey, key);\n continue;\n }\n if (originalDraft[key] !== nextDraft[key]) {\n store.setInput(descriptor.interactionKey, key, nextDraft[key]);\n }\n }\n\n return nextDraft;\n}\n\nfunction defaultValueForInput(\n descriptor: InteractionDescriptor,\n draft: Readonly<Record<string, unknown>>,\n inputKey: string,\n): unknown {\n const input = inputByKey(descriptor, inputKey);\n if (!input || !(\"defaultValue\" in input)) return undefined;\n const defaultValue = input.defaultValue;\n if (!isInputValueReady(resolveInputDomain(input, draft), defaultValue)) {\n return undefined;\n }\n const candidateDraft = { ...draft, [inputKey]: defaultValue };\n const errors = validateInteractionInputDomains(descriptor, candidateDraft);\n return (errors[inputKey]?.length ?? 0) > 0 ? undefined : defaultValue;\n}\n\nfunction shouldClearDependentInput(\n descriptor: InteractionDescriptor,\n draft: Readonly<Record<string, unknown>>,\n dependentKey: string,\n): boolean {\n const input = inputByKey(descriptor, dependentKey);\n if (!input) return true;\n const value = draft[dependentKey];\n if (!isInputValueReady(resolveInputDomain(input, draft), value)) return true;\n const errors = validateInteractionInputDomains(descriptor, draft);\n return (errors[dependentKey]?.length ?? 0) > 0;\n}\n\nexport function getInteractionDraftReadiness(\n descriptor: InteractionDescriptor,\n draft: Readonly<Record<string, unknown>>,\n): InteractionDraftReadiness {\n const values = applyInteractionInputDefaults<Record<string, unknown>>(\n descriptor,\n draft,\n ) as Record<string, unknown>;\n const missingInputs = interactionInputKeys(descriptor).filter((key) => {\n const input = inputByKey(descriptor, key);\n const value = values[key];\n return input\n ? !isInputValueReady(resolveInputDomain(input, values), value)\n : value === null || value === undefined;\n });\n const missingInputSet = new Set(missingInputs);\n const readyFrontier = missingInputs.filter((key) => {\n const input = inputByKey(descriptor, key);\n if (!input) return true;\n return inputDependencyKeys(input).every((dependencyKey) => {\n if (missingInputSet.has(dependencyKey)) return false;\n const dependency = inputByKey(descriptor, dependencyKey);\n if (!dependency) return values[dependencyKey] !== undefined;\n return isInputValueReady(\n resolveInputDomain(dependency, values),\n values[dependencyKey],\n );\n });\n });\n const fieldErrors = validateInteractionInputDomains(descriptor, values);\n return {\n values,\n missingInputs,\n readyFrontier,\n blockedInputs: missingInputs.filter((key) => !readyFrontier.includes(key)),\n fieldErrors,\n ready:\n missingInputs.length === 0 && !hasInteractionFieldErrors(fieldErrors),\n };\n}\n\nexport function routeInteractionTarget(\n store: Pick<InteractionUiStore, \"getDraft\" | \"setInput\" | \"clearInput\">,\n descriptor: InteractionDescriptor,\n target: RoutedInteractionTarget,\n): RoutedInteractionTargetResult {\n const input = inputByKey(descriptor, target.inputKey);\n const currentDraft = store.getDraft(descriptor.interactionKey);\n const selection = isTargetDomain(input?.domain)\n ? input.domain.selection\n : undefined;\n const targetValue =\n selection?.mode === \"many\"\n ? toggleManyValue(currentDraft[target.inputKey], target.value, selection)\n : target.value;\n const params = applyInteractionDraftMutation(store, descriptor, [\n ...Object.entries(target.extraInputs ?? {}).map(([key, value]) => ({\n key,\n value,\n })),\n { key: target.inputKey, value: targetValue },\n ]);\n return {\n params,\n readiness: getInteractionDraftReadiness(descriptor, params),\n };\n}\n\nexport function routeCardInputIntent(\n store: Pick<InteractionUiStore, \"getDraft\" | \"setInput\" | \"clearInput\">,\n descriptor: InteractionDescriptor,\n intent: RoutedCardInputIntent,\n): RoutedInteractionTargetResult {\n return routeInteractionTarget(store, descriptor, {\n inputKey: intent.cardInputKey,\n value: intent.cardId,\n extraInputs: intent.dropTarget\n ? { [intent.dropTarget.inputKey]: intent.dropTarget.value }\n : undefined,\n });\n}\n\nexport function shouldRouteInteractionPending(\n descriptor: InteractionDescriptor,\n readiness: Pick<InteractionDraftReadiness, \"ready\">,\n): boolean {\n return descriptor.commit.mode !== \"autoWhenReady\" || !readiness.ready;\n}\n\nexport function shouldAutoSubmitInteraction(\n descriptor: InteractionDescriptor,\n): boolean {\n return (\n descriptor.commit.mode === \"autoWhenReady\" &&\n !descriptor.inputs.some((input) => isManyInput(input))\n );\n}\n\nexport function markInteractionPending(\n store: Pick<InteractionUiStore, \"arm\" | \"setPendingInteraction\">,\n descriptor: InteractionDescriptor,\n): void {\n store.arm(interactionArmScope(descriptor), descriptor.interactionKey);\n store.setPendingInteraction(descriptor.interactionKey);\n}\n\nexport function clearInteractionRoute(\n store: Pick<\n InteractionUiStore,\n | \"clearInput\"\n | \"getArmed\"\n | \"arm\"\n | \"getPendingInteraction\"\n | \"setPendingInteraction\"\n >,\n descriptor: InteractionDescriptor,\n): void {\n const armScope = interactionArmScope(descriptor);\n store.clearInput(descriptor.interactionKey);\n if (store.getArmed(armScope) === descriptor.interactionKey) {\n store.arm(armScope, null);\n }\n if (store.getPendingInteraction() === descriptor.interactionKey) {\n store.setPendingInteraction(null);\n }\n}\n\nexport function claimInteractionSubmit(\n store: Pick<InteractionUiStore, \"claimSubmitting\">,\n descriptor: InteractionDescriptor,\n): boolean {\n return store.claimSubmitting(descriptor.interactionKey);\n}\n","import type { InteractionHandleStatus } from \"../hooks/useInteractionHandle.js\";\nimport type { InteractionDescriptor } from \"../types/plugin-state.js\";\n\nexport type InteractionActionState =\n | \"available\"\n | \"unavailable\"\n | \"submitting\"\n | \"submitted\";\n\nexport type InteractionDisabledReason =\n | \"unavailable\"\n | \"selection-limit\"\n | \"submitting\"\n | \"submitted\";\n\nexport interface InteractionStatusSnapshot {\n status: InteractionHandleStatus;\n actionState: InteractionActionState;\n disabled: boolean;\n disabledReason?: InteractionDisabledReason;\n}\n\nexport function isInteractionAvailable(\n descriptor: InteractionDescriptor | null | undefined,\n): boolean {\n return descriptor?.availability.status === \"available\";\n}\n\nexport function interactionUnavailableReason(\n descriptor: InteractionDescriptor | null | undefined,\n): string | undefined {\n const availability = descriptor?.availability;\n return availability && availability.status !== \"available\"\n ? availability.reason\n : undefined;\n}\n\nexport function interactionStatusSnapshot({\n descriptor,\n status,\n}: {\n descriptor: InteractionDescriptor;\n status: InteractionHandleStatus;\n}): InteractionStatusSnapshot {\n if (status === \"submitted\") {\n return {\n status,\n actionState: \"submitted\",\n disabled: true,\n disabledReason: \"submitted\",\n };\n }\n if (status === \"submitting\") {\n return {\n status,\n actionState: \"submitting\",\n disabled: true,\n disabledReason: \"submitting\",\n };\n }\n if (!isInteractionAvailable(descriptor)) {\n return {\n status,\n actionState: \"unavailable\",\n disabled: true,\n disabledReason: \"unavailable\",\n };\n }\n return {\n status,\n actionState: \"available\",\n disabled: false,\n };\n}\n","import type { InteractionUiStore } from \"../context/InteractionDraftContext.js\";\nimport type {\n InteractionDescriptor,\n PluginStateSnapshot,\n ZoneHandlesSnapshot,\n} from \"../types/plugin-state.js\";\nimport {\n inputByKey,\n inputByTarget,\n isResolvedTargetDomain,\n isTargetDomain,\n} from \"./interaction-inputs.js\";\nimport {\n claimInteractionSubmit,\n clearInteractionRoute,\n markInteractionPending,\n routeCardInputIntent,\n shouldRouteInteractionPending,\n type InteractionDraftReadiness,\n type RoutedInteractionTargetResult,\n} from \"./interaction-router.js\";\nimport { isInteractionAvailable } from \"./interaction-status.js\";\n\n/**\n * Opaque drop-target identifier emitted by SDK presentation. The runtime\n * adapter resolves it back into a typed `(inputKey, value)` pair against the\n * descriptor of the card the drop is for.\n *\n * Two encodings are supported, both opaque to SDK presentation:\n *\n * - `dreamboard:drop:input:<inputKey>:<value>` — explicit collector input\n * key. Used by callers (CLI/scaffold tests, lower-level adapters) that\n * already know the descriptor input shape.\n * - `dreamboard:drop:kind:<targetKind>:<value>` — typed kind reference.\n * Used by the generated hand surface, where authors describe a target by\n * its domain kind (`card` for staging, `space`/`edge`/`vertex`/`tile`\n * for board destinations). The runtime adapter resolves it to the\n * matching collector input on the live descriptor at drop time.\n */\nexport type RuntimeDropTargetId = string;\n\nconst DROP_TARGET_PREFIX = \"dreamboard:drop\";\n\nexport type RuntimeDropTargetKind =\n | \"card\"\n | \"space\"\n | \"edge\"\n | \"vertex\"\n | \"tile\";\n\n/**\n * Build an opaque drop-target id keyed by the descriptor input name. Used\n * when the caller already knows the collector input shape.\n */\nexport function encodeRuntimeDropTargetId(\n inputKey: string,\n value: string,\n): RuntimeDropTargetId {\n return `${DROP_TARGET_PREFIX}:input:${inputKey}:${value}`;\n}\n\n/**\n * Build an opaque drop-target id keyed by typed target kind. Used by the\n * generated hand surface, where authors do not (and should not) know the\n * collector input names.\n */\nexport function encodeRuntimeDropTargetKind(\n kind: RuntimeDropTargetKind,\n value: string,\n): RuntimeDropTargetId {\n return `${DROP_TARGET_PREFIX}:kind:${kind}:${value}`;\n}\n\nexport type DecodedRuntimeDropTarget =\n | { mode: \"input\"; inputKey: string; value: string }\n | { mode: \"kind\"; kind: RuntimeDropTargetKind; value: string };\n\nexport function decodeRuntimeDropTargetId(\n targetId: RuntimeDropTargetId,\n): DecodedRuntimeDropTarget | null {\n if (!targetId.startsWith(`${DROP_TARGET_PREFIX}:`)) return null;\n const rest = targetId.slice(DROP_TARGET_PREFIX.length + 1);\n if (rest.startsWith(\"input:\")) {\n const body = rest.slice(\"input:\".length);\n const sep = body.indexOf(\":\");\n if (sep === -1) return null;\n return {\n mode: \"input\",\n inputKey: body.slice(0, sep),\n value: body.slice(sep + 1),\n };\n }\n if (rest.startsWith(\"kind:\")) {\n const body = rest.slice(\"kind:\".length);\n const sep = body.indexOf(\":\");\n if (sep === -1) return null;\n const kind = body.slice(0, sep) as RuntimeDropTargetKind;\n const value = body.slice(sep + 1);\n if (\n kind === \"card\" ||\n kind === \"space\" ||\n kind === \"edge\" ||\n kind === \"vertex\" ||\n kind === \"tile\"\n ) {\n return { mode: \"kind\", kind, value };\n }\n return null;\n }\n // Legacy format, kept for any external callers still using\n // `dreamboard:drop:<inputKey>:<value>`. New writers should use one of the\n // namespaced encoders above.\n const sep = rest.indexOf(\":\");\n if (sep === -1) return null;\n return {\n mode: \"input\",\n inputKey: rest.slice(0, sep),\n value: rest.slice(sep + 1),\n };\n}\n\nexport interface CardIntentAdapterContext {\n store: InteractionUiStore;\n /** Project-side snapshot of all available interactions (gameplay slice). */\n availableInteractions: readonly InteractionDescriptor[];\n /** Zone snapshot for the originating hand. */\n zoneSnapshot: ZoneHandlesSnapshot | null;\n /** Submit through the canonical runtime path. */\n submit: (\n descriptor: InteractionDescriptor,\n params: Record<string, unknown>,\n ) => Promise<void>;\n /**\n * Optional explicit interaction key. When provided, the adapter only routes\n * intents through this interaction; otherwise it picks the first interaction\n * eligible for the card.\n */\n interactionKey?: string;\n}\n\nexport type CardIntentInput =\n | { type: \"activate\"; cardId: string }\n | { type: \"drop\"; cardId: string; targetId: string };\n\nexport type CardIntentResult =\n | { status: \"ignored\"; reason: CardIntentIgnoredReason }\n | {\n status: \"pending\";\n descriptor: InteractionDescriptor;\n readiness: InteractionDraftReadiness;\n params: Record<string, unknown>;\n }\n | {\n status: \"submitted\";\n descriptor: InteractionDescriptor;\n readiness: InteractionDraftReadiness;\n params: Record<string, unknown>;\n }\n | {\n status: \"submitting\";\n descriptor: InteractionDescriptor;\n readiness: InteractionDraftReadiness;\n params: Record<string, unknown>;\n }\n | {\n status: \"error\";\n descriptor: InteractionDescriptor;\n error: unknown;\n };\n\nexport type CardIntentIgnoredReason =\n | \"no-descriptor\"\n | \"interaction-unavailable\"\n | \"no-card-input\"\n | \"card-not-eligible\"\n | \"drop-target-not-decodable\"\n | \"drop-target-input-unknown\"\n | \"drop-target-not-eligible\"\n | \"ambiguous-drop\"\n | \"already-submitting\";\n\ninterface CardRouteCandidate {\n descriptor: InteractionDescriptor;\n cardInputKey: string;\n}\n\n/**\n * Enumerate descriptors that can accept this card. Used both to pick a\n * single-action route for `activate` intents and to filter joint\n * `(card, destination)` matches for `drop` intents.\n */\nfunction listCardRouteCandidates(\n ctx: CardIntentAdapterContext,\n cardId: string,\n): CardRouteCandidate[] {\n const explicitKey = ctx.interactionKey;\n const candidates = ctx.zoneSnapshot\n ? (ctx.zoneSnapshot.playableByCardId[cardId] ?? [])\n : ctx.availableInteractions.filter(\n (descriptor) =>\n !explicitKey ||\n descriptor.interactionKey === explicitKey ||\n descriptor.interactionId === explicitKey,\n );\n const result: CardRouteCandidate[] = [];\n for (const descriptor of candidates) {\n if (explicitKey && descriptor.interactionKey !== explicitKey) continue;\n if (!isInteractionAvailable(descriptor)) continue;\n const targetInput = inputByTarget(descriptor, \"card\", cardId);\n if (targetInput) {\n result.push({ descriptor, cardInputKey: targetInput.key });\n continue;\n }\n const fallback = descriptor.inputs.find((input) => input.key === \"cardId\");\n if (fallback && isTargetDomain(fallback.domain)) {\n result.push({ descriptor, cardInputKey: fallback.key });\n }\n }\n return result;\n}\n\n/**\n * Apply an SDK `CardIntent` (generic activate/drop) to canonical Dreamboard\n * collector state. Returns the runtime classification for the call site to\n * react to (pending vs submitted vs ignored).\n *\n * Behavior:\n * - `activate` is mapped onto `routeCardInputIntent` with no destination.\n * - `drop` decodes the opaque target id; when it points at a typed input on\n * the same descriptor, both the card and the destination are written\n * atomically before readiness/`autoWhenReady` is evaluated.\n * - Disabled, unavailable or ineligible intents return `ignored` even if the\n * caller emits them.\n */\nexport async function applyCardIntent(\n ctx: CardIntentAdapterContext,\n intent: CardIntentInput,\n): Promise<CardIntentResult> {\n const candidates = listCardRouteCandidates(ctx, intent.cardId);\n if (candidates.length === 0) {\n return { status: \"ignored\", reason: \"no-descriptor\" };\n }\n // Filter out candidates whose card input rejects this card. The card\n // domain may be unresolved (lazy) — those still pass since their\n // eligibility is computed from the draft itself.\n const cardEligible = candidates.filter(({ descriptor, cardInputKey }) => {\n const cardInput = inputByKey(descriptor, cardInputKey);\n if (!cardInput) return false;\n if (!isResolvedTargetDomain(cardInput.domain)) return true;\n return cardInput.domain.eligibleTargets.includes(intent.cardId);\n });\n if (cardEligible.length === 0) {\n return { status: \"ignored\", reason: \"card-not-eligible\" };\n }\n\n let descriptor: InteractionDescriptor;\n let cardInputKey: string;\n let dropTarget: { inputKey: string; value: string } | undefined;\n\n if (intent.type === \"drop\") {\n const decoded = decodeRuntimeDropTargetId(intent.targetId);\n if (!decoded) {\n return { status: \"ignored\", reason: \"drop-target-not-decodable\" };\n }\n // Score every card-eligible candidate against the decoded destination.\n // A descriptor is a \"match\" only when it accepts both the card and the\n // dropped target; ambiguity is reported explicitly so authors can fix\n // the underlying descriptor projection rather than getting silent\n // submissions of the wrong action.\n const matches = cardEligible.flatMap((candidate) => {\n const resolvedInputKey =\n decoded.mode === \"input\"\n ? decoded.inputKey\n : resolveDropTargetInputKey(\n candidate.descriptor,\n decoded.kind,\n decoded.value,\n );\n if (!resolvedInputKey) return [];\n const dropInput = inputByKey(candidate.descriptor, resolvedInputKey);\n if (!dropInput) return [];\n if (\n isResolvedTargetDomain(dropInput.domain) &&\n !dropInput.domain.eligibleTargets.includes(decoded.value)\n ) {\n return [];\n }\n return [\n {\n ...candidate,\n dropTarget: { inputKey: resolvedInputKey, value: decoded.value },\n },\n ];\n });\n if (matches.length === 0) {\n // Distinguish \"no descriptor declares this input/kind at all\" from\n // \"the dropped value is not eligible for any descriptor that does\".\n const anyKnowsKey = cardEligible.some((candidate) => {\n if (decoded.mode === \"input\") {\n return (\n inputByKey(candidate.descriptor, decoded.inputKey) !== undefined\n );\n }\n return (\n resolveDropTargetInputKey(\n candidate.descriptor,\n decoded.kind,\n decoded.value,\n ) !== null\n );\n });\n return {\n status: \"ignored\",\n reason: anyKnowsKey\n ? \"drop-target-not-eligible\"\n : \"drop-target-input-unknown\",\n };\n }\n if (matches.length > 1) {\n // Ambiguity: more than one descriptor accepts both this card and this\n // destination. Signal so callers/tests catch the descriptor design\n // bug rather than the runtime silently picking one.\n return { status: \"ignored\", reason: \"ambiguous-drop\" };\n }\n descriptor = matches[0]!.descriptor;\n cardInputKey = matches[0]!.cardInputKey;\n dropTarget = matches[0]!.dropTarget;\n } else {\n descriptor = cardEligible[0]!.descriptor;\n cardInputKey = cardEligible[0]!.cardInputKey;\n }\n\n if (!isInteractionAvailable(descriptor)) {\n return { status: \"ignored\", reason: \"interaction-unavailable\" };\n }\n if (!inputByKey(descriptor, cardInputKey)) {\n return { status: \"ignored\", reason: \"no-card-input\" };\n }\n\n const routed: RoutedInteractionTargetResult = routeCardInputIntent(\n ctx.store,\n descriptor,\n {\n cardInputKey,\n cardId: intent.cardId,\n dropTarget,\n },\n );\n\n if (shouldRouteInteractionPending(descriptor, routed.readiness)) {\n markInteractionPending(ctx.store, descriptor);\n return {\n status: \"pending\",\n descriptor,\n readiness: routed.readiness,\n params: routed.params,\n };\n }\n\n if (!claimInteractionSubmit(ctx.store, descriptor)) {\n return {\n status: \"submitting\",\n descriptor,\n readiness: routed.readiness,\n params: routed.params,\n };\n }\n\n try {\n await ctx.submit(descriptor, routed.params);\n clearInteractionRoute(ctx.store, descriptor);\n return {\n status: \"submitted\",\n descriptor,\n readiness: routed.readiness,\n params: routed.params,\n };\n } catch (error) {\n return { status: \"error\", descriptor, error };\n } finally {\n ctx.store.setSubmitting(descriptor.interactionKey, false);\n }\n}\n\n/**\n * Resolve a typed drop-target kind/value pair to the descriptor's collector\n * input key. Authors describe targets at the type level (e.g. board space\n * `hex-a`) but the descriptor names that input by its authored collector\n * key (e.g. `spaceId`). This bridges the two without surfacing collector\n * names in the authoring API.\n */\nfunction resolveDropTargetInputKey(\n descriptor: InteractionDescriptor,\n kind: RuntimeDropTargetKind,\n value: string,\n): string | null {\n // Prefer an input whose authoritative resolved domain advertises this\n // value as eligible. Falls back to a kind-only match for lazy domains.\n let kindOnlyMatch: string | null = null;\n for (const input of descriptor.inputs) {\n if (!matchesDropTargetKind(input.domain, kind)) continue;\n if (\n isResolvedTargetDomain(input.domain) &&\n input.domain.eligibleTargets.includes(value)\n ) {\n return input.key;\n }\n if (kindOnlyMatch === null) {\n kindOnlyMatch = input.key;\n }\n }\n return kindOnlyMatch;\n}\n\nfunction matchesDropTargetKind(\n domain: InteractionDescriptor[\"inputs\"][number][\"domain\"],\n kind: RuntimeDropTargetKind,\n): boolean {\n if (kind === \"card\") {\n return isTargetDomain(domain) && domain.type === \"cardTarget\";\n }\n return (\n isTargetDomain(domain) &&\n domain.type === \"boardTarget\" &&\n domain.targetKind === kind\n );\n}\n\n/**\n * Project descriptor + draft state into per-card visual flags used by the\n * runtime hand surface. Each entry tracks which card ids are currently part\n * of any card-target draft, and which of those have field validation errors.\n */\nexport interface DraftCardProjectionEntry {\n descriptor: InteractionDescriptor;\n cardInputKeys: readonly string[];\n draftCardIds: ReadonlySet<string>;\n invalidCardIds: ReadonlySet<string>;\n}\n\nexport function projectDraftCardState(\n availableInteractions: readonly InteractionDescriptor[],\n drafts: Readonly<Record<string, Readonly<Record<string, unknown>>>>,\n validate: (\n descriptor: InteractionDescriptor,\n draft: Readonly<Record<string, unknown>>,\n ) => Partial<Record<string, readonly string[]>>,\n): DraftCardProjectionEntry[] {\n const entries: DraftCardProjectionEntry[] = [];\n for (const descriptor of availableInteractions) {\n const cardInputs = descriptor.inputs.filter(\n (input) =>\n isTargetDomain(input.domain) && input.domain.type === \"cardTarget\",\n );\n if (cardInputs.length === 0) continue;\n const draft = drafts[descriptor.interactionKey] ?? {};\n const draftCardIds = new Set<string>();\n for (const input of cardInputs) {\n const value = draft[input.key];\n if (Array.isArray(value)) {\n for (const item of value) {\n if (typeof item === \"string\") draftCardIds.add(item);\n }\n } else if (typeof value === \"string\") {\n draftCardIds.add(value);\n }\n }\n const fieldErrors = validate(descriptor, draft);\n const invalidCardIds = new Set<string>();\n for (const input of cardInputs) {\n if ((fieldErrors[input.key]?.length ?? 0) === 0) continue;\n const value = draft[input.key];\n if (Array.isArray(value)) {\n for (const item of value) {\n if (typeof item === \"string\") invalidCardIds.add(item);\n }\n } else if (typeof value === \"string\") {\n invalidCardIds.add(value);\n }\n }\n entries.push({\n descriptor,\n cardInputKeys: cardInputs.map((input) => input.key),\n draftCardIds,\n invalidCardIds,\n });\n }\n return entries;\n}\n\nexport interface ProjectedCardVisualState {\n selected: boolean;\n invalid: boolean;\n}\n\n/**\n * Combine the per-descriptor projection into a single per-card flag tuple.\n */\nexport function visualStateForCard(\n cardId: string,\n projection: readonly DraftCardProjectionEntry[],\n): ProjectedCardVisualState {\n let selected = false;\n let invalid = false;\n for (const entry of projection) {\n if (entry.draftCardIds.has(cardId)) selected = true;\n if (entry.invalidCardIds.has(cardId)) invalid = true;\n }\n return { selected, invalid };\n}\n\n/**\n * Return the set of card ids that are currently part of a many-selection\n * draft for any descriptor in the zone. Used by the hand view to drop\n * selected cards out of the visible hand layout while keeping the runtime\n * source of truth in the zone snapshot.\n */\nexport function selectedCardIdsForZone(\n store: Pick<InteractionUiStore, \"getDraft\">,\n zone: string,\n state: PluginStateSnapshot,\n): readonly string[] {\n const result = new Set<string>();\n for (const descriptor of state.gameplay.availableInteractions) {\n const cardInput = descriptor.inputs.find((input) => {\n if (!isTargetDomain(input.domain)) return false;\n if (input.domain.type !== \"cardTarget\") return false;\n const declaredZones =\n input.domain.zoneId !== undefined\n ? [input.domain.zoneId]\n : (input.domain.zoneIds ?? []);\n return declaredZones.length === 0 || declaredZones.includes(zone);\n });\n if (!cardInput) continue;\n if (!isTargetDomain(cardInput.domain)) continue;\n if (cardInput.domain.type !== \"cardTarget\") continue;\n const draft = store.getDraft(descriptor.interactionKey);\n const value = draft[cardInput.key];\n if (cardInput.domain.selection?.mode === \"many\" && Array.isArray(value)) {\n for (const item of value) {\n if (typeof item === \"string\") result.add(item);\n }\n }\n }\n return [...result];\n}\n","import { createContext, useContext, useMemo, type ReactNode } from \"react\";\nimport type { PlayerId } from \"@dreamboard/manifest-contract\";\nimport { useStore } from \"zustand\";\nimport {\n useInteractionUiStore,\n usePendingInteractionKey,\n} from \"../context/InteractionDraftContext.js\";\nimport { usePluginState } from \"../context/PluginStateContext.js\";\nimport { usePluginSession } from \"../context/PluginSessionContext.js\";\nimport { useActivePlayers } from \"../hooks/useActivePlayers.js\";\nimport { useGameView } from \"../hooks/useGameView.js\";\nimport { usePlayerInfo } from \"../hooks/usePlayerInfo.js\";\nimport { usePlayerTurnOrder } from \"../hooks/usePlayerTurnOrder.js\";\nimport type {\n InputDomain,\n InteractionDescriptor,\n InteractionInputDescriptor,\n} from \"../types/plugin-state.js\";\nimport type { Player } from \"../../ui/types/player-state.js\";\nimport { interactionLabel } from \"../utils/interaction-labels.js\";\nimport {\n clearInteractionRoute,\n getInteractionDraftReadiness,\n} from \"../utils/interaction-router.js\";\n\nexport type GamePlayer<PlayerIdValue extends string = PlayerId> = Omit<\n Player,\n \"playerId\"\n> & {\n playerId: PlayerIdValue;\n};\n\nexport type GamePlayerEntry<PlayerIdValue extends string = PlayerId> =\n GamePlayer<PlayerIdValue> & {\n index: number;\n isActive: boolean;\n isCurrentPlayer: boolean;\n isControllable: boolean;\n };\n\nexport interface GamePlayersState<PlayerIdValue extends string = PlayerId> {\n byId: ReadonlyMap<PlayerIdValue, GamePlayer<PlayerIdValue>>;\n order: readonly PlayerIdValue[];\n entries: ReadonlyArray<GamePlayerEntry<PlayerIdValue>>;\n active: readonly PlayerIdValue[];\n current: GamePlayer<PlayerIdValue> | null;\n}\n\nexport interface GameMeState<PlayerIdValue extends string = PlayerId> {\n playerId: PlayerIdValue | null;\n player: GamePlayer<PlayerIdValue> | null;\n controllablePlayerIds: readonly PlayerIdValue[];\n canAct: boolean;\n}\n\nexport interface GameTurnState<\n PlayerIdValue extends string = PlayerId,\n PhaseValue extends string = string,\n> {\n phase: PhaseValue | null;\n stage: string | null;\n activePlayerIds: readonly PlayerIdValue[];\n currentPlayerId: PlayerIdValue | null;\n order: readonly PlayerIdValue[];\n isMine: boolean;\n}\n\nexport interface GameRenderState<\n ViewValue = unknown,\n PlayerIdValue extends string = PlayerId,\n PhaseValue extends string = string,\n> {\n view: ViewValue;\n phase: PhaseValue | null;\n stage: string | null;\n session: ReturnType<typeof usePluginSession>;\n me: GameMeState<PlayerIdValue>;\n turn: GameTurnState<PlayerIdValue, PhaseValue>;\n players: GamePlayersState<PlayerIdValue>;\n}\n\nexport interface GamePendingInputState {\n key: string;\n kind: string;\n domain: InputDomain;\n title: string;\n}\n\nexport interface GameActiveActionState<\n Interaction extends string = string,\n Params extends Record<string, unknown> = Record<string, unknown>,\n> {\n interaction: Interaction;\n interactionId: string;\n descriptor: InteractionDescriptor<Interaction>;\n title: string;\n draft: Readonly<Partial<Params>>;\n values: Partial<Params>;\n missingInputs: readonly string[];\n readyFrontier: readonly string[];\n pendingInput: GamePendingInputState | null;\n}\n\nexport interface GameChromeState<\n ViewValue = unknown,\n PlayerIdValue extends string = PlayerId,\n PhaseValue extends string = string,\n Interaction extends string = string,\n> extends GameRenderState<ViewValue, PlayerIdValue, PhaseValue> {\n activePlayers: readonly PlayerIdValue[];\n activeAction: GameActiveActionState<Interaction> | null;\n cancel: (() => void) | null;\n}\n\nexport interface GameRootProps<\n ViewValue = unknown,\n PlayerIdValue extends string = PlayerId,\n PhaseValue extends string = string,\n> {\n onActionError?: (error: unknown) => void;\n children: (\n state: GameRenderState<ViewValue, PlayerIdValue, PhaseValue>,\n ) => ReactNode;\n}\n\nexport interface GameChromeProps<\n ViewValue = unknown,\n PlayerIdValue extends string = PlayerId,\n PhaseValue extends string = string,\n Interaction extends string = string,\n> {\n children: (\n state: GameChromeState<ViewValue, PlayerIdValue, PhaseValue, Interaction>,\n ) => ReactNode;\n}\n\ntype GameActionErrorHandler = (error: unknown) => void;\n\nconst GameActionErrorContext = createContext<GameActionErrorHandler | null>(\n null,\n);\n\nexport function useGameActionError(): GameActionErrorHandler | null {\n return useContext(GameActionErrorContext);\n}\n\nfunction fallbackPlayer<PlayerIdValue extends string>(\n playerId: PlayerIdValue,\n): GamePlayer<PlayerIdValue> {\n return {\n playerId,\n name: playerId,\n };\n}\n\nfunction useGameRenderState<\n ViewValue = unknown,\n PlayerIdValue extends string = PlayerId,\n PhaseValue extends string = string,\n>(): GameRenderState<ViewValue, PlayerIdValue, PhaseValue> {\n const view = useGameView() as ViewValue;\n const session = usePluginSession();\n const playerInfo = usePlayerInfo();\n const activePlayers = useActivePlayers().map(\n (playerId) => playerId as PlayerIdValue,\n );\n const turnOrder = usePlayerTurnOrder().map(\n (playerId) => playerId as PlayerIdValue,\n );\n const phase = usePluginState(\n (state) => state.gameplay.currentPhase,\n ) as PhaseValue | null;\n const stage = usePluginState((state) => state.gameplay.currentStage);\n\n const playersById = useMemo(() => {\n const next = new Map<PlayerIdValue, GamePlayer<PlayerIdValue>>();\n playerInfo.forEach((player, key) => {\n const playerId = key as PlayerIdValue;\n next.set(playerId, {\n ...player,\n playerId,\n });\n });\n return next;\n }, [playerInfo]);\n\n const controllingPlayerId =\n session.controllingPlayerId == null\n ? null\n : (session.controllingPlayerId as PlayerIdValue);\n const controllablePlayerIds = session.controllablePlayerIds.map(\n (playerId) => playerId as PlayerIdValue,\n );\n const currentPlayerId = activePlayers[0] ?? turnOrder[0] ?? null;\n const currentPlayer = currentPlayerId\n ? (playersById.get(currentPlayerId) ?? fallbackPlayer(currentPlayerId))\n : null;\n const mePlayer = controllingPlayerId\n ? (playersById.get(controllingPlayerId) ??\n fallbackPlayer(controllingPlayerId))\n : null;\n\n const entries = useMemo<ReadonlyArray<GamePlayerEntry<PlayerIdValue>>>(\n () =>\n turnOrder.map((playerId, index) => {\n const player = playersById.get(playerId) ?? fallbackPlayer(playerId);\n return {\n ...player,\n index,\n isActive: activePlayers.includes(playerId),\n isCurrentPlayer: playerId === controllingPlayerId,\n isControllable: controllablePlayerIds.includes(playerId),\n };\n }),\n [\n activePlayers,\n controllablePlayerIds,\n controllingPlayerId,\n playersById,\n turnOrder,\n ],\n );\n\n return {\n view,\n phase,\n stage,\n session,\n me: {\n playerId: controllingPlayerId,\n player: mePlayer,\n controllablePlayerIds,\n canAct:\n controllingPlayerId != null &&\n activePlayers.includes(controllingPlayerId),\n },\n turn: {\n phase,\n stage,\n activePlayerIds: activePlayers,\n currentPlayerId,\n order: turnOrder,\n isMine:\n controllingPlayerId != null &&\n activePlayers.includes(controllingPlayerId),\n },\n players: {\n byId: playersById,\n order: turnOrder,\n entries,\n active: activePlayers,\n current: currentPlayer,\n },\n };\n}\n\nexport function GameRoot<\n ViewValue = unknown,\n PlayerIdValue extends string = PlayerId,\n PhaseValue extends string = string,\n>({\n children,\n onActionError,\n}: GameRootProps<ViewValue, PlayerIdValue, PhaseValue>) {\n const state = useGameRenderState<ViewValue, PlayerIdValue, PhaseValue>();\n\n const rendered = <>{children(state)}</>;\n if (!onActionError) return rendered;\n return (\n <GameActionErrorContext.Provider value={onActionError}>\n {rendered}\n </GameActionErrorContext.Provider>\n );\n}\n\nexport function GameChrome<\n ViewValue = unknown,\n PlayerIdValue extends string = PlayerId,\n PhaseValue extends string = string,\n Interaction extends string = string,\n>({\n children,\n}: GameChromeProps<ViewValue, PlayerIdValue, PhaseValue, Interaction>) {\n const renderState = useGameRenderState<\n ViewValue,\n PlayerIdValue,\n PhaseValue\n >();\n const store = useInteractionUiStore();\n const pendingInteractionKey = usePendingInteractionKey();\n const draftSnapshot = useStore(store, (state) => state.drafts);\n const armSnapshot = useStore(store, (state) => state.arms);\n const descriptor = usePluginState((state) =>\n pendingInteractionKey\n ? state.gameplay.availableInteractions.find(\n (candidate) => candidate.interactionKey === pendingInteractionKey,\n )\n : undefined,\n );\n\n const activeAction =\n useMemo<GameActiveActionState<Interaction> | null>(() => {\n if (!descriptor) return null;\n const draft = store.getDraft(descriptor.interactionKey);\n const readiness = getInteractionDraftReadiness(descriptor, draft);\n const pendingInputKey =\n readiness.readyFrontier[0] ?? readiness.missingInputs[0] ?? null;\n const pendingInput = pendingInputKey\n ? descriptor.inputs.find((input) => input.key === pendingInputKey)\n : undefined;\n return {\n interaction: descriptor.interactionKey as Interaction,\n interactionId: descriptor.interactionId,\n descriptor: descriptor as InteractionDescriptor<Interaction>,\n title: interactionLabel(descriptor),\n draft,\n values: readiness.values,\n missingInputs: readiness.missingInputs,\n readyFrontier: readiness.readyFrontier,\n pendingInput: pendingInput ? pendingInputState(pendingInput) : null,\n };\n }, [descriptor, draftSnapshot, armSnapshot, store]);\n\n const cancel = useMemo(\n () =>\n descriptor\n ? () => {\n clearInteractionRoute(store, descriptor);\n }\n : null,\n [descriptor, store],\n );\n\n return (\n <>\n {children({\n ...renderState,\n activePlayers: renderState.turn.activePlayerIds,\n activeAction,\n cancel,\n })}\n </>\n );\n}\n\nfunction pendingInputState(\n input: InteractionInputDescriptor,\n): GamePendingInputState {\n return {\n key: input.key,\n kind: input.kind,\n domain: input.domain,\n title: pendingInputTitle(input),\n };\n}\n\nfunction pendingInputTitle(input: InteractionInputDescriptor): string {\n switch (input.kind) {\n case \"card\":\n return \"Choose a card\";\n case \"board-space\":\n return \"Choose a board space\";\n case \"board-edge\":\n return \"Choose a board edge\";\n case \"board-vertex\":\n return \"Choose a board vertex\";\n case \"board-tile\":\n return \"Choose a board tile\";\n default:\n return `Choose ${humanizeInputKey(input.key)}`;\n }\n}\n\nfunction humanizeInputKey(key: string): string {\n return key\n .replace(/Id$/, \"\")\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .replace(/[-_]+/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim()\n .toLowerCase();\n}\n\nexport const Game = {\n Root: GameRoot,\n Chrome: GameChrome,\n};\n","import type { PlayerId } from \"@dreamboard/manifest-contract\";\nimport { usePluginState } from \"../context/PluginStateContext.js\";\n\n/**\n * Returns the list of players the engine currently considers active, as\n * reported by the most recent gameplay snapshot.\n *\n * - For single-active-player phases, this has one entry.\n * - For multi-active-player phases (e.g. \"all players discard at once\"), it\n * includes every seat that is expected to act.\n * - Returns an empty array before the first gameplay snapshot arrives.\n *\n * Prefer this hook over re-projecting `currentPlayerId` / `turnOrder` into\n * the view: flow state belongs to the engine, and `useActivePlayers()` is\n * always in lock-step with server-authoritative state.\n */\nexport function useActivePlayers(): readonly PlayerId[] {\n return usePluginState((state) => {\n // During a `simultaneousPlayer` phase the engine reports\n // `flow.activePlayers` as `[]` (there is no single turn) and tracks\n // per-seat progress in `simultaneousPhase` instead. Surface the seats that\n // still owe an action so this hook keeps its documented \"every seat\n // expected to act\" contract — otherwise `canAct`, `useIsMyTurn`, and roster\n // `isActive` would be false for everyone mid-simultaneous-phase. Both\n // branches return references owned by the snapshot, so the selector stays\n // referentially stable for `useSyncExternalStore`.\n const simultaneous = state.gameplay.simultaneousPhase;\n if (simultaneous && simultaneous.pendingPlayerIds.length > 0) {\n return simultaneous.pendingPlayerIds;\n }\n return state.gameplay.activePlayers;\n });\n}\n","import { useRef, useSyncExternalStore } from \"react\";\nimport { useRuntimeContext } from \"../context/RuntimeContext.js\";\nimport type { GameView } from \"#dreamboard/ui-contract\";\nimport type { PluginStateSnapshot } from \"../types/reducer-state.js\";\nimport type { PluginRuntimeAPI } from \"../runtime/createPluginRuntimeAPI.js\";\n\ntype EqualityFn<T> = (left: T, right: T) => boolean;\n\ninterface SelectorCache<T> {\n rawView: GameView;\n selected: T;\n}\n\nfunction defaultEquality<T>(left: T, right: T): boolean {\n return Object.is(left, right);\n}\n\nfunction requireProjectedView(\n snapshot: PluginStateSnapshot | null | undefined,\n message: string,\n): GameView {\n const view = snapshot?.view;\n if (view === null || typeof view === \"undefined\") {\n throw new Error(message);\n }\n return view;\n}\n\n/**\n * Hook to select a derived value from the projected reducer view.\n * Only re-renders when the selected slice changes according to the equalityFn.\n *\n * @param selector - Function to extract data from the projected view\n * @param equalityFn - Optional equality function for selected slice comparison\n * @returns Selected value from the current projected view\n */\nexport function useGameSelector<T>(\n selector: (state: GameView) => T,\n equalityFn: EqualityFn<T> = defaultEquality,\n): T {\n const runtime = useRuntimeContext() as PluginRuntimeAPI;\n const selectorRef = useRef(selector);\n const equalityRef = useRef(equalityFn);\n const cacheRef = useRef<SelectorCache<T> | null>(null);\n\n if (selectorRef.current !== selector || equalityRef.current !== equalityFn) {\n selectorRef.current = selector;\n equalityRef.current = equalityFn;\n cacheRef.current = null;\n }\n\n const message =\n \"useGameSelector: Projected view not available. Ensure the reducer-native host payload is initialized.\";\n\n const getSelectedFromSnapshot = (\n snapshot: PluginStateSnapshot | null | undefined,\n ): T => {\n const view = requireProjectedView(snapshot, message);\n const cached = cacheRef.current;\n if (cached && cached.rawView === view) {\n return cached.selected;\n }\n\n const nextSelected = selectorRef.current(view);\n if (cached && equalityRef.current(cached.selected, nextSelected)) {\n cacheRef.current = {\n rawView: view,\n selected: cached.selected,\n };\n return cached.selected;\n }\n\n cacheRef.current = {\n rawView: view,\n selected: nextSelected,\n };\n return nextSelected;\n };\n\n const subscribe = (onStoreChange: () => void) => {\n if (!runtime.subscribeToState) {\n return () => {};\n }\n\n return runtime.subscribeToState((snapshot) => {\n const previousCache = cacheRef.current;\n const nextSelected = getSelectedFromSnapshot(\n snapshot as PluginStateSnapshot,\n );\n if (\n !previousCache ||\n !equalityRef.current(previousCache.selected, nextSelected)\n ) {\n onStoreChange();\n }\n });\n };\n\n const getSnapshot = () =>\n getSelectedFromSnapshot(\n (runtime.getSnapshot?.() ?? null) as PluginStateSnapshot | null,\n );\n\n return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n}\n","import type { GameView } from \"#dreamboard/ui-contract\";\nimport { useGameSelector } from \"./useGameSelector.js\";\n\n/**\n * Hook to access the current seat-projected reducer-native view.\n */\nexport function useGameView(): GameView {\n return useGameSelector((view) => view);\n}\n","import { useMemo } from \"react\";\nimport type { PlayerId } from \"@dreamboard/manifest-contract\";\nimport { useLobbyState } from \"./useLobby.js\";\nimport type { Player } from \"./useMe.js\";\n\nexport function usePlayerInfo(): Map<PlayerId, Player> {\n const lobby = useLobbyState();\n\n return useMemo(() => {\n if (!lobby) {\n return new Map();\n }\n\n const playerMap = new Map<PlayerId, Player>();\n\n for (const seat of lobby.seats) {\n const playerId = seat.playerId as PlayerId;\n playerMap.set(playerId, {\n playerId,\n name: seat.displayName,\n isHost: seat.isHost,\n color: seat.playerColor,\n });\n }\n\n return playerMap;\n }, [lobby]);\n}\n","import { useState, useEffect } from \"react\";\nimport { useRuntimeContext } from \"../context/RuntimeContext.js\";\nimport type { LobbyState } from \"../types/plugin-state.js\";\nimport type { PluginRuntimeAPI } from \"../runtime/createPluginRuntimeAPI.js\";\n\n// Re-export LobbyState for convenience\nexport type { LobbyState };\n\n/**\n * Subscribes to lobby updates from the plugin runtime snapshot when present.\n * Returns `null` until the host provides lobby state (SSR/tests/minimal runtimes).\n */\nexport function useLobbyState(): LobbyState | null {\n const runtime = useRuntimeContext() as PluginRuntimeAPI;\n\n const getStateFromSnapshot = (): LobbyState | null => {\n if (!runtime.getSnapshot) return null;\n const snapshot = runtime.getSnapshot();\n if (!snapshot?.lobby) return null;\n return snapshot.lobby;\n };\n\n const [lobbyState, setLobbyState] = useState<LobbyState | null>(\n getStateFromSnapshot,\n );\n\n useEffect(() => {\n if (!runtime.subscribeToState) {\n return;\n }\n\n const initialState = runtime.getSnapshot?.();\n if (initialState?.lobby) {\n setLobbyState(initialState.lobby);\n }\n\n return runtime.subscribeToState((snapshot) => {\n if (snapshot.lobby) {\n setLobbyState(snapshot.lobby);\n }\n });\n }, [runtime]);\n\n return lobbyState;\n}\n\n/**\n * Hook to subscribe to lobby state updates.\n * Returns the latest lobby information from state-sync messages.\n *\n * State is provided by PluginStateProvider from host's state-sync messages.\n * The host transforms raw SSE LOBBY_UPDATE messages into clean LobbyState objects.\n *\n * @returns Current lobby state (never null - throws if not available)\n * @throws Error if lobby state is not available\n *\n * @example\n * ```typescript\n * function LobbyScreen() {\n * const lobby = useLobby();\n * // lobby is guaranteed to be non-null\n * return <div>{lobby.seats.length} seats</div>;\n * }\n * ```\n */\nexport function useLobby(): LobbyState {\n const lobbyState = useLobbyState();\n if (lobbyState === null) {\n throw new Error(\n \"useLobby: Lobby state not available. \" +\n \"The host should only render the plugin when lobby state is ready.\",\n );\n }\n\n return lobbyState;\n}\n","import { useMemo } from \"react\";\nimport type { PlayerId } from \"@dreamboard/manifest-contract\";\nimport { useLobby } from \"./useLobby.js\";\n\n/**\n * Returns the player ids in turn order, as provided by the lobby seat\n * assignments. Matches `q.player.order()` on the reducer side: the\n * engine's turn order is seeded from the same seat assignments.\n *\n * - Returns an empty array before the first lobby snapshot arrives.\n * - Stable reference across renders when the seats don't change.\n *\n * Prefer this hook (combined with `useActivePlayers()` for the current\n * seat) over re-projecting `turnOrder` into the view — flow state\n * belongs to the engine and the SDK, not to game-specific projections.\n */\nexport function usePlayerTurnOrder(): readonly PlayerId[] {\n const lobby = useLobby();\n return useMemo(() => {\n if (!lobby) return [];\n return lobby.seats.map((seat) => seat.playerId as PlayerId);\n }, [lobby]);\n}\n","import type { InteractionDescriptor } from \"../types/plugin-state.js\";\n\nexport function humanizeInteractionId(id: string): string {\n if (!id) return id;\n const withSpaces = id\n .replace(/[-_]+/g, \" \")\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .replace(/([A-Z]+)([A-Z][a-z])/g, \"$1 $2\")\n .trim();\n if (!withSpaces) return id;\n return withSpaces\n .split(/\\s+/)\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n}\n\nexport function interactionLabel(\n descriptor: Pick<InteractionDescriptor, \"interactionId\" | \"interactionKey\">,\n): string {\n return humanizeInteractionId(\n descriptor.interactionId || descriptor.interactionKey,\n );\n}\n","import {\n cloneElement,\n isValidElement,\n type AriaAttributes,\n type CSSProperties,\n type HTMLAttributes,\n type JSX,\n type ChangeEvent,\n type MouseEvent,\n type PointerEvent,\n type ReactElement,\n type ReactNode,\n} from \"react\";\n\nexport type PrimitiveDataAttributes = Record<\n `data-${string}`,\n string | boolean | number | undefined\n>;\n\nexport type PrimitiveCommonProps = {\n asChild?: boolean;\n children?: ReactNode;\n className?: string;\n style?: CSSProperties;\n} & AriaAttributes &\n PrimitiveDataAttributes;\n\ntype EventHandler<Event> = (event: Event) => void;\n\nexport function composeEventHandlers<\n Event extends { defaultPrevented: boolean },\n>(\n authorHandler: EventHandler<Event> | undefined,\n primitiveHandler: EventHandler<Event> | undefined,\n): EventHandler<Event> | undefined {\n if (!authorHandler) return primitiveHandler;\n if (!primitiveHandler) return authorHandler;\n return (event) => {\n authorHandler(event);\n if (!event.defaultPrevented) {\n primitiveHandler(event);\n }\n };\n}\n\nexport function renderPrimitive<\n ElementProps extends HTMLAttributes<HTMLElement>,\n>(\n tagName: keyof JSX.IntrinsicElements,\n props: ElementProps & PrimitiveCommonProps,\n): ReactElement {\n const { asChild, children, ...primitiveProps } = props;\n if (asChild) {\n if (!isValidElement(children)) {\n throw new Error(\n \"asChild requires exactly one valid React element child.\",\n );\n }\n const element = children as ReactElement<HTMLAttributes<HTMLElement>>;\n const childProps = element.props;\n return cloneElement(element, {\n ...primitiveProps,\n ...childProps,\n className: [primitiveProps.className, childProps.className]\n .filter(Boolean)\n .join(\" \"),\n style: {\n ...(primitiveProps.style ?? {}),\n ...(childProps.style ?? {}),\n },\n onClick: composeEventHandlers(\n childProps.onClick,\n primitiveProps.onClick as EventHandler<MouseEvent<HTMLElement>>,\n ),\n onPointerDown: composeEventHandlers(\n childProps.onPointerDown,\n primitiveProps.onPointerDown as EventHandler<PointerEvent<HTMLElement>>,\n ),\n onPointerMove: composeEventHandlers(\n childProps.onPointerMove,\n primitiveProps.onPointerMove as EventHandler<PointerEvent<HTMLElement>>,\n ),\n onPointerUp: composeEventHandlers(\n childProps.onPointerUp,\n primitiveProps.onPointerUp as EventHandler<PointerEvent<HTMLElement>>,\n ),\n onPointerCancel: composeEventHandlers(\n childProps.onPointerCancel,\n primitiveProps.onPointerCancel as EventHandler<\n PointerEvent<HTMLElement>\n >,\n ),\n onChange: composeEventHandlers(\n childProps.onChange,\n primitiveProps.onChange as EventHandler<ChangeEvent<HTMLElement>>,\n ),\n });\n }\n const Tag = tagName as keyof JSX.IntrinsicElements;\n return <Tag {...(primitiveProps as object)}>{children}</Tag>;\n}\n","import {\n createContext,\n useContext,\n useMemo,\n type ButtonHTMLAttributes,\n type HTMLAttributes,\n type ReactNode,\n} from \"react\";\nimport type { ViewCard } from \"../../types/index.js\";\nimport { useInteractionUiStore } from \"../context/InteractionDraftContext.js\";\nimport { usePluginSession } from \"../context/PluginSessionContext.js\";\nimport { usePluginState } from \"../context/PluginStateContext.js\";\nimport { useRuntimeContext } from \"../context/RuntimeContext.js\";\nimport type {\n InteractionDescriptor,\n ZoneHandlesSnapshot,\n} from \"../types/plugin-state.js\";\nimport type { ZoneKey } from \"../ui-contract.js\";\nimport {\n inputByTarget,\n interactionInputKeys,\n isResolvedTargetDomain,\n} from \"../utils/interaction-inputs.js\";\nimport {\n claimInteractionSubmit,\n clearInteractionRoute,\n markInteractionPending,\n routeInteractionTarget,\n shouldRouteInteractionPending,\n} from \"../utils/interaction-router.js\";\nimport { useGameActionError } from \"./game.js\";\nimport { runInteractionAction } from \"./interaction-submit.js\";\nimport { isInteractionAvailable } from \"../utils/interaction-status.js\";\nimport {\n composeEventHandlers,\n renderPrimitive,\n type PrimitiveCommonProps,\n} from \"./primitive-props.js\";\n\ninterface ZoneContextValue {\n zone: string;\n snapshot: ZoneHandlesSnapshot | null;\n}\n\ninterface ZoneCardContextValue {\n zone: string;\n cardId: string;\n}\n\n/**\n * An item rendered by a zone primitive. Discriminated by `hidden`:\n *\n * - `hidden: false` — fully hydrated from the zone projection. Carries the\n * authored card type, properties, and reducer-projected interaction state.\n * - `hidden: true` — the zone snapshot exposes the card id but withholds its\n * contents (e.g. opponent zones, or a zone that is projected count-only).\n * The render contract is honest about not knowing the type; authors must\n * narrow on `hidden` before reading `cardType` / `properties`.\n *\n * Replaces the previous silent fallback that widened `cardType` to the\n * untyped string `\"unknown\"` — see SDK Design Principles §2 (strong contracts\n * over comments).\n */\nexport type ZoneCardRenderItem<\n CardIdValue extends string = string,\n CardTypeValue extends string = string,\n Properties extends Record<string, unknown> = Record<string, unknown>,\n> =\n | HydratedZoneCardRenderItem<CardIdValue, CardTypeValue, Properties>\n | HiddenZoneCardRenderItem<CardIdValue>;\n\nexport interface HydratedZoneCardRenderItem<\n CardIdValue extends string = string,\n CardTypeValue extends string = string,\n Properties extends Record<string, unknown> = Record<string, unknown>,\n> extends ViewCard<CardIdValue, CardTypeValue, Properties> {\n zone: string;\n index: number;\n hidden: false;\n playable: boolean;\n interactions: readonly InteractionDescriptor[];\n}\n\nexport interface HiddenZoneCardRenderItem<CardIdValue extends string = string> {\n id: CardIdValue;\n zone: string;\n index: number;\n hidden: true;\n}\n\nexport interface ZonePileContextValue {\n zone: string;\n label: string;\n count: number;\n cards: readonly string[];\n items: readonly ZoneCardRenderItem[];\n hasVisibleCards: boolean;\n isHidden: boolean;\n description: string | null;\n}\n\nconst ZoneContext = createContext<ZoneContextValue | null>(null);\nconst ZoneCardContext = createContext<ZoneCardContextValue | null>(null);\nconst ZonePileContext = createContext<ZonePileContextValue | null>(null);\n\nexport function useZonePrimitiveContext(): ZoneContextValue {\n const value = useContext(ZoneContext);\n if (!value) {\n throw new Error(\"Zone primitives must be rendered inside <Zone.Root>.\");\n }\n return value;\n}\n\nexport function useOptionalZonePrimitiveContext(): ZoneContextValue | null {\n return useContext(ZoneContext);\n}\n\nexport function useZoneCardContext(): ZoneCardContextValue | null {\n return useContext(ZoneCardContext);\n}\n\nexport function useZonePileContext(): ZonePileContextValue {\n const value = useContext(ZonePileContext);\n if (!value) {\n throw new Error(\n \"Zone pile primitives must be rendered inside <Zone.PileRoot>.\",\n );\n }\n return value;\n}\n\nexport interface ZoneRootProps<Zone extends string = ZoneKey>\n extends PrimitiveCommonProps, HTMLAttributes<HTMLElement> {\n zone: Zone;\n}\n\nexport function ZoneRoot<Zone extends string = ZoneKey>({\n zone,\n children,\n ...props\n}: ZoneRootProps<Zone>) {\n const snapshot =\n usePluginState((state) => state.gameplay.zones[zone]) ?? null;\n const value = useMemo<ZoneContextValue>(\n () => ({ zone, snapshot }),\n [snapshot, zone],\n );\n return (\n <ZoneContext.Provider value={value}>\n {renderPrimitive(\"div\", {\n ...props,\n \"data-dreamboard-zone-root\": \"\",\n \"data-zone\": zone,\n \"data-card-count\": snapshot?.cardIds.length ?? 0,\n children,\n })}\n </ZoneContext.Provider>\n );\n}\n\nexport interface ZoneListProps\n extends\n Omit<PrimitiveCommonProps, \"children\">,\n Omit<HTMLAttributes<HTMLElement>, \"children\"> {\n children?: ReactNode | ((card: ZoneCardRenderItem) => ReactNode);\n empty?: ReactNode;\n sort?: (a: ZoneCardRenderItem, b: ZoneCardRenderItem) => number;\n}\n\nexport function ZoneList({ children, empty, sort, ...props }: ZoneListProps) {\n const { zone, items, isEmpty } = useZoneCards({ sort });\n const renderedChildren =\n typeof children === \"function\"\n ? isEmpty\n ? empty\n : items.map((item) => (\n <ZoneItem key={item.id} card={item}>\n {children(item)}\n </ZoneItem>\n ))\n : isEmpty && empty !== undefined\n ? empty\n : children;\n return renderPrimitive(\"div\", {\n ...props,\n role: props.role ?? \"list\",\n \"data-dreamboard-zone-list\": \"\",\n \"data-zone\": zone,\n \"data-empty\": isEmpty || undefined,\n children: renderedChildren,\n });\n}\n\nexport interface UseZoneCardsOptions {\n sort?: (a: ZoneCardRenderItem, b: ZoneCardRenderItem) => number;\n}\n\nexport interface UseZoneCardsResult {\n zone: string;\n items: readonly ZoneCardRenderItem[];\n count: number;\n isEmpty: boolean;\n}\n\nexport function useZoneCards({\n sort,\n}: UseZoneCardsOptions = {}): UseZoneCardsResult {\n const { zone, snapshot } = useZonePrimitiveContext();\n return useMemo(() => {\n const cards = (snapshot?.cardIds ?? []).map((cardId, index) =>\n createZoneCardRenderItem(zone, snapshot, cardId, index),\n );\n const items = sort ? [...cards].sort(sort) : cards;\n const count = snapshot?.cardIds.length ?? 0;\n return {\n zone,\n items,\n count,\n isEmpty: count === 0,\n };\n }, [snapshot, sort, zone]);\n}\n\nexport interface ZoneItemProps\n extends PrimitiveCommonProps, HTMLAttributes<HTMLElement> {\n card: string | ZoneCardRenderItem;\n}\n\nexport function ZoneItem({ card, children, ...props }: ZoneItemProps) {\n const { zone, snapshot } = useZonePrimitiveContext();\n const item =\n typeof card === \"string\"\n ? createZoneCardRenderItem(\n zone,\n snapshot,\n card,\n indexOfCard(snapshot, card),\n )\n : card;\n const cardContext = useMemo<ZoneCardContextValue>(\n () => ({ zone, cardId: item.id }),\n [item.id, zone],\n );\n return (\n <ZoneCardContext.Provider value={cardContext}>\n {renderPrimitive(\"div\", {\n ...props,\n role: props.role ?? \"listitem\",\n \"data-dreamboard-zone-item\": \"\",\n \"data-zone\": zone,\n \"data-card-id\": item.id,\n \"data-card-type\": item.hidden ? undefined : item.cardType,\n \"data-card-index\": item.index,\n \"data-card-hidden\": item.hidden || undefined,\n \"data-playable\": item.hidden ? undefined : item.playable || undefined,\n children,\n })}\n </ZoneCardContext.Provider>\n );\n}\n\nexport interface ZoneCardAtProps<Zone extends string = ZoneKey> extends Omit<\n ZoneItemProps,\n \"card\" | \"children\"\n> {\n zone?: Zone;\n index: number;\n children?: ReactNode | ((card: ZoneCardRenderItem) => ReactNode);\n empty?: ReactNode;\n}\n\nfunction ZoneCardAtContent<Zone extends string = ZoneKey>({\n index,\n children,\n empty = null,\n ...props\n}: Omit<ZoneCardAtProps<Zone>, \"zone\">) {\n const { zone, snapshot } = useZonePrimitiveContext();\n const cardIndex = resolveZoneCardIndex(snapshot, index);\n if (cardIndex === null) return <>{empty}</>;\n\n const cardId = snapshot?.cardIds[cardIndex];\n if (!cardId) return <>{empty}</>;\n\n const card = createZoneCardRenderItem(zone, snapshot, cardId, cardIndex);\n return (\n <ZoneItem card={card} {...props}>\n {typeof children === \"function\" ? children(card) : children}\n </ZoneItem>\n );\n}\n\nexport function ZoneCardAt<Zone extends string = ZoneKey>({\n zone,\n ...props\n}: ZoneCardAtProps<Zone>) {\n if (zone) {\n return (\n <ZoneRoot zone={zone}>\n <ZoneCardAtContent {...props} />\n </ZoneRoot>\n );\n }\n return <ZoneCardAtContent {...props} />;\n}\n\nexport type ZoneTopCardProps<Zone extends string = ZoneKey> = Omit<\n ZoneCardAtProps<Zone>,\n \"index\"\n>;\n\nexport function ZoneTopCard<Zone extends string = ZoneKey>(\n props: ZoneTopCardProps<Zone>,\n) {\n return <ZoneCardAt {...props} index={0} />;\n}\n\nexport type ZoneCardActionExtraInputs =\n | Record<string, unknown>\n | ((cardId: string) => Record<string, unknown>);\n\nexport interface ZoneCardActionProps<Card extends string = string>\n extends\n PrimitiveCommonProps,\n Omit<ButtonHTMLAttributes<HTMLButtonElement>, \"onSelect\"> {\n card?: Card;\n interaction?: string;\n input?: string;\n extraInputs?: ZoneCardActionExtraInputs;\n onSelect?: (result: ZoneCardActionResult) => void;\n onSelectError?: (error: unknown) => void;\n}\n\nexport type ZoneCardActionResult =\n | { status: \"none\" }\n | {\n status: \"pending\";\n interactionKey: string;\n descriptor: InteractionDescriptor;\n missingInputs: readonly string[];\n }\n | {\n status: \"submitted\";\n interactionKey: string;\n descriptor: InteractionDescriptor;\n };\n\nexport function ZoneCardAction<Card extends string = string>({\n card,\n interaction,\n input,\n extraInputs,\n onSelect,\n onSelectError,\n disabled,\n onClick,\n children,\n ...props\n}: ZoneCardActionProps<Card>) {\n const { controllingPlayerId } = usePluginSession();\n const runtime = useRuntimeContext();\n const store = useInteractionUiStore();\n const contextCard = useZoneCardContext();\n const { snapshot } = useZonePrimitiveContext();\n const gameActionError = useGameActionError();\n const cardId = card ?? (contextCard?.cardId as Card | undefined);\n const route = useZoneCardActionRoute(cardId, snapshot, interaction, input);\n const isDisabled =\n disabled ??\n (!cardId ||\n !route.descriptor ||\n !route.inputKey ||\n route.ambiguous ||\n !isInteractionAvailable(route.descriptor));\n\n return renderPrimitive(\"button\", {\n type: \"button\",\n ...props,\n children,\n disabled: isDisabled,\n \"aria-disabled\": isDisabled,\n \"data-dreamboard-zone-card-action\": \"\",\n \"data-card-id\": cardId,\n \"data-interaction-id\": route.descriptor?.interactionId,\n \"data-interaction-key\": route.descriptor?.interactionKey ?? interaction,\n \"data-input-name\": route.inputKey ?? input,\n \"data-eligible\": Boolean(route.descriptor && route.inputKey),\n \"data-ambiguous\": route.ambiguous || undefined,\n \"data-disabled\": isDisabled || undefined,\n onClick: composeEventHandlers(onClick, () => {\n if (\n isDisabled ||\n !cardId ||\n !route.descriptor ||\n !route.inputKey ||\n !controllingPlayerId\n ) {\n return;\n }\n const descriptor = route.descriptor;\n const inputKey = route.inputKey;\n void runInteractionAction(\n async (): Promise<ZoneCardActionResult> => {\n const { params, readiness } = routeInteractionTarget(\n store,\n descriptor,\n {\n inputKey,\n value: cardId,\n extraInputs: resolveCardActionExtraInputs(extraInputs, cardId),\n },\n );\n if (shouldRouteInteractionPending(descriptor, readiness)) {\n markInteractionPending(store, descriptor);\n return {\n status: \"pending\",\n interactionKey: descriptor.interactionKey,\n descriptor,\n missingInputs: readiness.missingInputs,\n };\n }\n if (!claimInteractionSubmit(store, descriptor)) {\n return {\n status: \"submitted\",\n interactionKey: descriptor.interactionKey,\n descriptor,\n };\n }\n try {\n await runtime.submitInteraction(\n controllingPlayerId,\n descriptor.interactionId,\n params,\n );\n clearInteractionRoute(store, descriptor);\n return {\n status: \"submitted\",\n interactionKey: descriptor.interactionKey,\n descriptor,\n };\n } finally {\n store.setSubmitting(descriptor.interactionKey, false);\n }\n },\n {\n onSuccess: onSelect,\n onError: onSelectError ?? gameActionError ?? undefined,\n },\n );\n }),\n });\n}\n\nexport interface ZonePileRootProps<Zone extends string = ZoneKey> extends Omit<\n ZoneRootProps<Zone>,\n \"children\"\n> {\n label: string;\n children?: ReactNode;\n hiddenDescription?: string | null;\n emptyDescription?: string | null;\n visibleDescription?: ((count: number) => string) | null;\n}\n\nexport function ZonePileRoot<Zone extends string = ZoneKey>({\n zone,\n label,\n hiddenDescription = null,\n emptyDescription = null,\n visibleDescription = null,\n children,\n ...props\n}: ZonePileRootProps<Zone>) {\n return (\n <ZoneRoot zone={zone} {...props}>\n <ZonePileProvider\n emptyDescription={emptyDescription}\n hiddenDescription={hiddenDescription}\n label={label}\n visibleDescription={visibleDescription}\n >\n {children}\n </ZonePileProvider>\n </ZoneRoot>\n );\n}\n\ninterface ZonePileProviderProps {\n label: string;\n children?: ReactNode;\n hiddenDescription: string | null;\n emptyDescription: string | null;\n visibleDescription: ((count: number) => string) | null;\n}\n\nfunction ZonePileProvider({\n label,\n hiddenDescription,\n emptyDescription,\n visibleDescription,\n children,\n}: ZonePileProviderProps) {\n const { zone, snapshot } = useZonePrimitiveContext();\n // Snapshot is the single source of truth for what's in a pile. A zone that\n // isn't in the current phase's projection scope (snapshot === null) is\n // treated as hidden — author should change the reducer projection rather\n // than inject ids in the UI.\n const cards = snapshot?.cardIds ?? [];\n const items = cards.map((cardId, index) =>\n createZoneCardRenderItem(zone, snapshot, cardId, index),\n );\n const count = cards.length;\n const isHidden = snapshot === null;\n // PileCards iterates whatever the snapshot exposes. Items are tagged\n // `hidden: true | false` so the author's `renderCard` discriminates on\n // honest data — including the \"id without contents\" case — rather than\n // receiving a lying ViewCard with `cardType: \"unknown\"`.\n const hasVisibleCards = items.length > 0;\n const description = isHidden\n ? hiddenDescription\n : hasVisibleCards\n ? (visibleDescription?.(count) ?? null)\n : emptyDescription;\n const value = useMemo<ZonePileContextValue>(\n () => ({\n zone,\n label,\n count,\n cards,\n items,\n hasVisibleCards,\n isHidden,\n description,\n }),\n [cards, count, description, hasVisibleCards, isHidden, items, label, zone],\n );\n\n return (\n <ZonePileContext.Provider value={value}>\n {children}\n </ZonePileContext.Provider>\n );\n}\n\nexport interface ZonePileTriggerProps\n extends PrimitiveCommonProps, ButtonHTMLAttributes<HTMLButtonElement> {}\n\nexport function ZonePileTrigger({ children, ...props }: ZonePileTriggerProps) {\n const pile = useZonePileContext();\n return renderPrimitive(\"button\", {\n type: \"button\",\n ...props,\n \"aria-label\": props[\"aria-label\"] ?? `Show ${pile.label} pile`,\n \"data-dreamboard-zone-pile-trigger\": \"\",\n \"data-zone\": pile.zone,\n \"data-card-count\": pile.count,\n \"data-hidden\": pile.isHidden || undefined,\n children,\n });\n}\n\nexport type ZonePileLabelProps = PrimitiveCommonProps &\n HTMLAttributes<HTMLElement>;\n\nexport function ZonePileLabel({ children, ...props }: ZonePileLabelProps) {\n const pile = useZonePileContext();\n return renderPrimitive(\"span\", {\n ...props,\n \"data-dreamboard-zone-pile-label\": \"\",\n \"data-zone\": pile.zone,\n children: children ?? pile.label,\n });\n}\n\nexport type ZonePileCountProps = PrimitiveCommonProps &\n HTMLAttributes<HTMLElement>;\n\nexport function ZonePileCount({ children, ...props }: ZonePileCountProps) {\n const pile = useZonePileContext();\n return renderPrimitive(\"span\", {\n ...props,\n \"data-dreamboard-zone-pile-count\": \"\",\n \"data-zone\": pile.zone,\n \"data-card-count\": pile.count,\n children: children ?? `${pile.count} cards`,\n });\n}\n\nexport type ZonePileDescriptionProps = PrimitiveCommonProps &\n HTMLAttributes<HTMLElement>;\n\nexport function ZonePileDescription({\n children,\n ...props\n}: ZonePileDescriptionProps) {\n const pile = useZonePileContext();\n const description = children ?? pile.description;\n if (description === null || description === undefined) return null;\n\n return renderPrimitive(\"span\", {\n ...props,\n \"data-dreamboard-zone-pile-description\": \"\",\n \"data-zone\": pile.zone,\n children: description,\n });\n}\n\nexport interface ZonePileCardsProps extends Omit<ZoneListProps, \"children\"> {\n renderCard: (card: ZoneCardRenderItem) => ReactNode;\n}\n\nexport function ZonePileCards({ renderCard, ...props }: ZonePileCardsProps) {\n const pile = useZonePileContext();\n if (!pile.hasVisibleCards) return null;\n\n return (\n <ZoneList {...props}>\n {pile.items.map((card) => (\n <ZoneItem key={card.id} card={card}>\n {renderCard(card)}\n </ZoneItem>\n ))}\n </ZoneList>\n );\n}\n\nfunction indexOfCard(\n snapshot: ZoneHandlesSnapshot | null,\n cardId: string,\n): number {\n return snapshot?.cardIds.indexOf(cardId) ?? -1;\n}\n\nfunction resolveZoneCardIndex(\n snapshot: ZoneHandlesSnapshot | null,\n index: number,\n): number | null {\n const count = snapshot?.cardIds.length ?? 0;\n const resolved = index < 0 ? count + index : index;\n return resolved >= 0 && resolved < count ? resolved : null;\n}\n\nexport function createZoneCardRenderItem(\n zone: string,\n snapshot: ZoneHandlesSnapshot | null,\n cardId: string,\n index: number,\n): ZoneCardRenderItem {\n const card = parseViewCard(snapshot?.cardViewsById[cardId]);\n if (card === null) {\n // The snapshot exposes this card id but not its contents. Surface that\n // honestly via the `hidden: true` variant instead of fabricating a\n // ViewCard with a fake `cardType: \"unknown\"`.\n return { id: cardId, zone, index, hidden: true };\n }\n const interactions = snapshot?.playableByCardId[cardId] ?? [];\n return {\n ...card,\n id: cardId,\n zone,\n index,\n hidden: false,\n playable: interactions.some(isInteractionAvailable),\n interactions,\n };\n}\n\nfunction useZoneCardActionRoute(\n cardId: string | undefined,\n snapshot: ZoneHandlesSnapshot | null,\n interaction: string | undefined,\n input: string | undefined,\n): {\n descriptor: InteractionDescriptor | null;\n inputKey: string | null;\n ambiguous: boolean;\n} {\n return useMemo(() => {\n if (!cardId || !snapshot) {\n return { descriptor: null, inputKey: null, ambiguous: false };\n }\n const interactions = snapshot.playableByCardId[cardId] ?? [];\n if (interaction) {\n const descriptor =\n interactions.find(\n (candidate) =>\n candidate.interactionKey === interaction ||\n candidate.interactionId === interaction,\n ) ?? null;\n return {\n descriptor,\n inputKey: descriptor\n ? inputKeyForCardAction(descriptor, cardId, input)\n : null,\n ambiguous: false,\n };\n }\n const matches = interactions.flatMap((descriptor) => {\n if (!isInteractionAvailable(descriptor)) return [];\n const inputKey = inputKeyForCardAction(descriptor, cardId, input);\n return inputKey ? [{ descriptor, inputKey }] : [];\n });\n if (matches.length !== 1) {\n return {\n descriptor: matches[0]?.descriptor ?? null,\n inputKey: matches[0]?.inputKey ?? null,\n ambiguous: matches.length > 1,\n };\n }\n const match = matches[0];\n if (!match) {\n return { descriptor: null, inputKey: null, ambiguous: false };\n }\n return {\n descriptor: match.descriptor,\n inputKey: match.inputKey,\n ambiguous: false,\n };\n }, [cardId, input, interaction, snapshot]);\n}\n\nfunction inputKeyForCardAction(\n descriptor: InteractionDescriptor,\n cardId: string,\n explicitInput?: string,\n): string | null {\n if (explicitInput) {\n const input = descriptor.inputs.find(\n (candidate) => candidate.key === explicitInput,\n );\n return input?.domain.type === \"cardTarget\" &&\n isResolvedTargetDomain(input.domain) &&\n input.domain.eligibleTargets.includes(cardId)\n ? input.key\n : null;\n }\n const targetInput = inputByTarget(descriptor, \"card\", cardId);\n if (targetInput) return targetInput.key;\n if (interactionInputKeys(descriptor).includes(\"cardId\")) {\n return descriptor.inputs.find((candidate) => candidate.key === \"cardId\")\n ? \"cardId\"\n : null;\n }\n return null;\n}\n\nfunction resolveCardActionExtraInputs(\n extraInputs: ZoneCardActionExtraInputs | undefined,\n cardId: string,\n): Record<string, unknown> {\n return typeof extraInputs === \"function\"\n ? extraInputs(cardId)\n : (extraInputs ?? {});\n}\n\nfunction parseViewCard(serialized: string | undefined): ViewCard | null {\n if (!serialized) return null;\n try {\n const parsed = JSON.parse(serialized) as Partial<ViewCard>;\n if (typeof parsed.id !== \"string\" || typeof parsed.cardType !== \"string\") {\n return null;\n }\n return {\n ...parsed,\n id: parsed.id,\n cardType: parsed.cardType,\n properties:\n parsed.properties && typeof parsed.properties === \"object\"\n ? parsed.properties\n : {},\n };\n } catch {\n return null;\n }\n}\n\nexport const Zone = {\n Root: ZoneRoot,\n List: ZoneList,\n Item: ZoneItem,\n CardAt: ZoneCardAt,\n TopCard: ZoneTopCard,\n CardAction: ZoneCardAction,\n PileRoot: ZonePileRoot,\n PileTrigger: ZonePileTrigger,\n PileLabel: ZonePileLabel,\n PileCount: ZonePileCount,\n PileDescription: ZonePileDescription,\n PileCards: ZonePileCards,\n useZoneCards,\n};\n","import type {\n InteractionHandle,\n InteractionParamsShape,\n} from \"../hooks/useInteractionHandle.js\";\n\ntype UnhandledInteractionError = \"throw\" | \"log\" | \"ignore\";\n\ninterface RunInteractionActionOptions<Result> {\n onSuccess?: (result: Result) => void;\n onError?: (error: unknown) => void;\n unhandledError?: UnhandledInteractionError;\n}\n\nexport interface InteractionSubmitCallbacks {\n onSubmitSuccess?: () => void;\n onSubmitError?: (error: unknown) => void;\n}\n\nexport async function runInteractionAction<Result>(\n action: () => Promise<Result>,\n {\n onSuccess,\n onError,\n unhandledError = \"throw\",\n }: RunInteractionActionOptions<Result> = {},\n): Promise<void> {\n try {\n const result = await action();\n onSuccess?.(result);\n } catch (error) {\n if (onError) {\n onError(error);\n return;\n }\n if (unhandledError === \"log\") {\n console.error(error);\n return;\n }\n if (unhandledError === \"ignore\") {\n return;\n }\n throw error;\n }\n}\n\nexport function submitInteractionDraft<\n Params extends InteractionParamsShape = InteractionParamsShape,\n DefaultedKeys extends keyof Params & string = never,\n>(\n handle: InteractionHandle<Params, DefaultedKeys>,\n callbacks: InteractionSubmitCallbacks = {},\n options: { unhandledError?: UnhandledInteractionError } = {},\n): Promise<void> {\n return runInteractionAction(() => handle.submitDraft(), {\n onSuccess: callbacks.onSubmitSuccess,\n onError: callbacks.onSubmitError,\n unhandledError: options.unhandledError,\n });\n}\n\nexport function submitInteraction<\n Params extends InteractionParamsShape = InteractionParamsShape,\n DefaultedKeys extends keyof Params & string = never,\n>(\n handle: InteractionHandle<Params, DefaultedKeys>,\n callbacks: InteractionSubmitCallbacks = {},\n options: { unhandledError?: UnhandledInteractionError } = {},\n): Promise<void> {\n return runInteractionAction(() => handle.submit(), {\n onSuccess: callbacks.onSubmitSuccess,\n onError: callbacks.onSubmitError,\n unhandledError: options.unhandledError,\n });\n}\n\nexport function submitInteractionParams<\n Params extends InteractionParamsShape = InteractionParamsShape,\n DefaultedKeys extends keyof Params & string = never,\n>(\n handle: InteractionHandle<Params, DefaultedKeys>,\n params: Params,\n callbacks: InteractionSubmitCallbacks = {},\n options: { unhandledError?: UnhandledInteractionError } = {},\n): Promise<void> {\n return runInteractionAction(() => handle.submit(params), {\n onSuccess: callbacks.onSubmitSuccess,\n onError: callbacks.onSubmitError,\n unhandledError: options.unhandledError,\n });\n}\n","import {\n Fragment,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n type ReactNode,\n} from \"react\";\nimport {\n CardDragSurface,\n CardDropTargetView,\n HandView,\n StagingZone,\n type CardIntent,\n type CardDropTargetVisualState,\n type HandLayoutKind,\n type HandLayoutPolicy,\n type HandInteractionPolicy,\n type InteractionVisualState,\n type ViewCard,\n} from \"../../ui.js\";\nimport { useStore } from \"zustand\";\nimport { useShallow } from \"zustand/shallow\";\nimport { usePluginState } from \"../context/PluginStateContext.js\";\nimport { useInteractionUiStore } from \"../context/InteractionDraftContext.js\";\nimport {\n encodeRuntimeDropTargetKind,\n projectDraftCardState,\n selectedCardIdsForZone,\n type RuntimeDropTargetKind,\n} from \"../utils/card-intent-adapter.js\";\nimport {\n isResolvedTargetDomain,\n isTargetDomain,\n validateInteractionInputDomains,\n} from \"../utils/interaction-inputs.js\";\nimport {\n useCardIntentAdapter,\n type AuthoredCardIntent,\n type RuntimeCardIntentResult,\n} from \"./hand-intent-adapter.js\";\nimport type {\n InteractionDescriptor,\n PluginStateSnapshot,\n} from \"../types/plugin-state.js\";\nimport { isInteractionAvailable } from \"../utils/interaction-status.js\";\nimport { createZoneCardRenderItem, type ZoneCardRenderItem } from \"./zone.js\";\n\nexport interface RuntimeDropTarget {\n /** Stable opaque id; runtime adapter encodes the inputKey + value here. */\n targetId: string;\n /** Plain text label used by the SDK live-region announcements. */\n label: string;\n /** Optional `CardDropTargetVisualState` overrides. */\n visualState?: CardDropTargetVisualState;\n /** Visible content inside the drop target. */\n render: (state: CardDropTargetVisualState) => ReactNode;\n /** ARIA role override. Defaults to \"button\". */\n role?: string;\n /** Extra container className. */\n className?: string;\n /** Order hint for keyboard traversal. */\n order?: number;\n}\n\n/**\n * Per-hand summary projected alongside the card list. Authors can render\n * counts (\"3 of 5 selected\") without re-deriving selection state.\n */\nexport interface HandSelectionSummary {\n /** How many cards in this hand are part of the active many-select draft. */\n selectedCount: number;\n /** Card ids currently in the many-select draft, in iteration order. */\n selectedIds: readonly string[];\n /**\n * Whether at least one descriptor in this zone has form-side validation\n * errors against the current draft. Authors can use this to render an\n * inline hint without inspecting individual fields.\n */\n hasInvalidSelection: boolean;\n}\n\nexport interface HandSurfaceViewProps<Card extends ZoneCardRenderItem> {\n zone: string;\n cards: readonly Card[];\n /** Visual surface for a single card. */\n renderCard: (\n card: Card,\n state: InteractionVisualState,\n index: number,\n ) => ReactNode;\n /**\n * Render-safe slot for selection summary content. Fires during render\n * with the latest projected summary so authors can compose count chrome\n * (e.g. \"3 of 5 selected\") inline. The returned node is hoisted above\n * the hand region. Use this for visible UI; use `onSelectionSummary`\n * only for analytics or external state mirrors that need an effect.\n */\n renderSummary?: (summary: HandSelectionSummary) => ReactNode;\n /**\n * Optional selection summary observer. Invoked from a layout effect so\n * consumers may safely call `setState` in response. Use `renderSummary`\n * for inline rendering instead — that path avoids effect-timing\n * surprises.\n */\n onSelectionSummary?: (summary: HandSelectionSummary) => void;\n /**\n * Render-safe slot for the hand's commit/action chrome (e.g. a submit\n * button for a many-select interaction). Receives the same live summary as\n * `renderSummary`. Rendered below the hand inline on desktop and pinned as a\n * sticky footer inside the mobile dock, so the action stays reachable while\n * the hand is docked. Use this instead of anchoring the action elsewhere on\n * the board, where the dock would otherwise hide it.\n */\n renderActions?: (summary: HandSelectionSummary) => ReactNode;\n /** Layout policy forwarded to the SDK HandView. */\n layout?: HandLayoutKind | HandLayoutPolicy;\n /** Mobile interaction policy. Defaults to `direct-activate`. */\n mobileInteraction?: HandInteractionPolicy;\n /**\n * Drop targets to render around the hand. When provided, the hand renders\n * inside a `CardDragSurface` so SDK `drop` intents arrive with an opaque\n * target id that the runtime adapter can decode.\n */\n dropTargets?: readonly RuntimeDropTarget[];\n /**\n * Optional outer chrome around the drop targets, when `dropTargets` is\n * provided. Defaults to a flex row above the hand.\n */\n renderDropTargets?: (children: ReactNode) => ReactNode;\n /** Card width hint forwarded to the SDK HandView. */\n cardSize?: \"sm\" | \"md\" | \"lg\";\n /** Extra empty-state slot. */\n renderEmpty?: () => ReactNode;\n /** ARIA label for the hand region. */\n ariaLabel?: string;\n /**\n * Optional analytics hook. Receives the decoded authored intent (so\n * `targetId` is the manifest value, not the SDK opaque encoding) plus\n * the runtime classification.\n */\n onIntentRouted?: (\n intent: AuthoredCardIntent,\n result: RuntimeCardIntentResult,\n ) => void;\n className?: string;\n}\n\n/**\n * Generated hand presentation entry point.\n *\n * Lives in `ui-runtime` because it owns:\n *\n * - mapping descriptor/draft state into SDK `InteractionVisualState`\n * - hiding selected cards from the visible hand layout while the runtime keeps\n * the actual zone snapshot intact\n * - forwarding SDK `CardIntent` through the canonical collector adapter\n *\n * The component is intentionally Dreamboard-aware. The presentational\n * pieces (`HandView`, `CardDragSurface`, `CardDropTargetView`) come from\n * `@dreamboard-games/sdk/ui` and stay descriptor/draft unaware.\n */\nexport function HandSurfaceView<Card extends ZoneCardRenderItem>({\n zone,\n cards,\n renderCard,\n layout,\n mobileInteraction = \"direct-activate\",\n dropTargets,\n renderDropTargets,\n cardSize = \"sm\",\n renderEmpty,\n ariaLabel,\n onIntentRouted,\n onSelectionSummary,\n renderSummary,\n renderActions,\n className,\n}: HandSurfaceViewProps<Card>) {\n const route = useCardIntentAdapter({ zone, onResult: onIntentRouted });\n const interactionStore = useInteractionUiStore();\n // Subscribe to the entire drafts slice so selected/invalid state recomputes\n // on every input mutation across all interactions for this zone.\n const drafts = useStore(\n interactionStore,\n useShallow((state) => state.drafts),\n );\n const availableInteractions = usePluginState(\n (state) => state.gameplay.availableInteractions,\n );\n const selectedIds = usePluginState(\n useCallback(\n (state: PluginStateSnapshot) =>\n selectedCardIdsForZone(interactionStore, zone, state),\n // drafts is part of the store snapshot — useStore handles re-render.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [interactionStore, zone, drafts],\n ),\n );\n\n const visibleCards = useMemo(\n () => cards.filter((card) => !selectedIds.includes(card.id as string)),\n [cards, selectedIds],\n );\n\n // SDK HandView renders ViewCard. Hidden zone items expose only an id;\n // surface them as a face-down ViewCard so the lifted overlay/staging math\n // still has stable card geometry.\n const viewCards = useMemo<readonly ViewCard[]>(\n () =>\n visibleCards.map((card) =>\n card.hidden\n ? {\n id: card.id as string,\n cardType: \"hidden\",\n name: \"Hidden card\",\n properties: {},\n }\n : (card as ViewCard),\n ),\n [visibleCards],\n );\n\n const cardByViewId = useMemo(() => {\n const index = new Map<string, Card>();\n for (const card of visibleCards) {\n index.set(card.id as string, card);\n }\n return index;\n }, [visibleCards]);\n\n const cardDescriptorIndex = usePluginState((state) => {\n const snapshot = state.gameplay.zones[zone];\n return snapshot?.playableByCardId ?? {};\n });\n\n /**\n * Pre-compute, for each candidate descriptor in this zone, the set of\n * card-target input keys plus their current draft values and validation\n * field errors. This lets `stateForCard` answer selected/invalid in O(1)\n * per card without re-running validation per render.\n */\n const draftCardProjection = useMemo(\n () =>\n projectDraftCardState(\n availableInteractions,\n drafts,\n validateInteractionInputDomains,\n ),\n [availableInteractions, drafts],\n );\n\n // Eligibility is descriptor-derived, so compute it once across the visible\n // cards. `allVisibleEligible` lets us drop the per-card highlight when every\n // card is a legal target (the highlight would carry no information then).\n const eligibleCardIds = useMemo(() => {\n const set = new Set<string>();\n for (const card of visibleCards) {\n const cardId = card.id as string;\n const candidates = cardDescriptorIndex[cardId] ?? [];\n const eligible = candidates.some(\n (descriptor: InteractionDescriptor) =>\n isInteractionAvailable(descriptor) &&\n descriptor.inputs.some(\n (input) =>\n isResolvedTargetDomain(input.domain) &&\n input.domain.eligibleTargets.includes(cardId),\n ),\n );\n if (eligible) set.add(cardId);\n }\n return set;\n }, [visibleCards, cardDescriptorIndex]);\n const allVisibleEligible =\n visibleCards.length > 1 && eligibleCardIds.size === visibleCards.length;\n\n const stateForCard = useCallback(\n (viewCard: ViewCard): InteractionVisualState => {\n const cardId = viewCard.id as string;\n const sourceCard = cardByViewId.get(cardId);\n const eligible = eligibleCardIds.has(cardId);\n const selected = draftCardProjection.some((entry) =>\n entry.draftCardIds.has(cardId),\n );\n const invalid = draftCardProjection.some((entry) =>\n entry.invalidCardIds.has(cardId),\n );\n const disabled =\n !eligible &&\n !selected &&\n sourceCard !== undefined &&\n !sourceCard.hidden &&\n !sourceCard.playable;\n return {\n eligible,\n // Suppressed when the whole hand is eligible — see InteractionVisualState.\n distinctlyEligible: eligible && !allVisibleEligible,\n selected,\n invalid,\n disabled,\n };\n },\n [allVisibleEligible, cardByViewId, draftCardProjection, eligibleCardIds],\n );\n\n const selectionSummary = useMemo<HandSelectionSummary>(() => {\n const ids = new Set<string>();\n let hasInvalidSelection = false;\n for (const entry of draftCardProjection) {\n for (const cardId of entry.draftCardIds) ids.add(cardId);\n if (entry.invalidCardIds.size > 0) hasInvalidSelection = true;\n }\n return {\n selectedCount: ids.size,\n selectedIds: [...ids],\n hasInvalidSelection,\n };\n }, [draftCardProjection]);\n\n // Fire the summary observer from an effect so consumers can safely call\n // setState in response. Rendering visible summary chrome should go\n // through `renderSummary` instead.\n const onSelectionSummaryRef = useRef(onSelectionSummary);\n onSelectionSummaryRef.current = onSelectionSummary;\n useEffect(() => {\n onSelectionSummaryRef.current?.(selectionSummary);\n }, [selectionSummary]);\n\n const summaryContent = renderSummary ? renderSummary(selectionSummary) : null;\n const actionsNode = renderActions ? renderActions(selectionSummary) : null;\n // Pinned as a sticky footer so the action stays reachable while the hand is\n // docked on mobile (cards scroll behind it); inline on desktop `sticky` is\n // inert and it simply sits below the hand. The opaque surface background\n // occludes any cards scrolled underneath it in the dock.\n const actionsContent =\n actionsNode !== null && actionsNode !== undefined ? (\n <div\n data-dreamboard-hand-actions=\"\"\n data-zone={zone}\n className=\"sticky bottom-0 z-10 flex w-full flex-col items-center gap-2 px-3 pb-1 pt-2\"\n style={{\n background: \"var(--background, #fdfbf7)\",\n borderTop: \"1px solid var(--border, rgba(45,45,45,0.12))\",\n }}\n >\n {actionsNode}\n </div>\n ) : null;\n\n const handleIntent = useCallback(\n (intent: CardIntent) => {\n void route(intent);\n },\n [route],\n );\n\n const handView = (\n <HandView\n cards={viewCards}\n layout={layout}\n mobileInteraction={mobileInteraction}\n stateForCard={stateForCard}\n renderCard={(viewCard, state, index) => {\n const source = cardByViewId.get(viewCard.id as string);\n if (!source) return null;\n return renderCard(source, state, index);\n }}\n onCardIntent={handleIntent}\n cardSize={cardSize}\n renderEmpty={renderEmpty}\n aria-label={ariaLabel}\n className={className}\n />\n );\n\n if (!dropTargets || dropTargets.length === 0) {\n if (summaryContent === null && actionsContent === null) {\n return handView;\n }\n return (\n <Fragment>\n {summaryContent !== null ? (\n <div\n data-dreamboard-runtime-hand-summary=\"\"\n data-zone={zone}\n data-selection-count={selectionSummary.selectedCount}\n data-has-invalid-selection={\n selectionSummary.hasInvalidSelection ? \"true\" : \"false\"\n }\n >\n {summaryContent}\n </div>\n ) : null}\n {handView}\n {actionsContent}\n </Fragment>\n );\n }\n\n const targets = dropTargets.map((target) => (\n <CardDropTargetView\n key={target.targetId}\n targetId={target.targetId}\n state={target.visualState}\n label={target.label}\n role={target.role}\n order={target.order}\n className={target.className}\n renderTarget={target.render}\n />\n ));\n\n return (\n <CardDragSurface onCardIntent={handleIntent}>\n {summaryContent !== null ? (\n <div\n data-dreamboard-runtime-hand-summary=\"\"\n data-zone={zone}\n data-selection-count={selectionSummary.selectedCount}\n data-has-invalid-selection={\n selectionSummary.hasInvalidSelection ? \"true\" : \"false\"\n }\n >\n {summaryContent}\n </div>\n ) : null}\n {renderDropTargets ? (\n renderDropTargets(<Fragment>{targets}</Fragment>)\n ) : (\n <div data-dreamboard-runtime-drop-row=\"\" className=\"flex gap-2 mb-2\">\n {targets}\n </div>\n )}\n {handView}\n {actionsContent}\n </CardDragSurface>\n );\n}\n\nexport interface HandStagingViewProps {\n /** Zone whose many-select collection this stages. */\n zone: string;\n /** Visual for a staged card. */\n renderCard: (card: ZoneCardRenderItem) => ReactNode;\n /** Custom empty-slot content. */\n renderEmptySlot?: (index: number) => ReactNode;\n /** Heading above the slots. */\n label?: ReactNode;\n cardSize?: \"sm\" | \"md\" | \"lg\";\n ariaLabel?: string;\n className?: string;\n}\n\n/** First available many-select card-target selection scoped to `zone`. */\nfunction manyCardSelectionForZone(\n availableInteractions: readonly InteractionDescriptor[],\n zone: string,\n): { max?: number } | null {\n for (const descriptor of availableInteractions) {\n if (!isInteractionAvailable(descriptor)) continue;\n for (const input of descriptor.inputs) {\n if (!isTargetDomain(input.domain)) continue;\n if (input.domain.type !== \"cardTarget\") continue;\n const declaredZones =\n input.domain.zoneId !== undefined\n ? [input.domain.zoneId]\n : (input.domain.zoneIds ?? []);\n if (declaredZones.length !== 0 && !declaredZones.includes(zone)) continue;\n if (input.domain.selection?.mode === \"many\")\n return input.domain.selection;\n }\n }\n return null;\n}\n\n/**\n * Dreamboard-aware staging surface for a many-select card collection (e.g. the\n * cards you've chosen to pass). Projects the live draft into a fixed,\n * always-visible row of slots (empty placeholders until something is staged);\n * tapping a staged card routes an `activate` intent, which toggles it back out\n * of the collection so it returns to the hand. Adds no draft logic — the\n * presentational layout/theming lives in the SDK `StagingZone`.\n *\n * Renders nothing when the zone has no active many-select collection and\n * nothing staged, so authors can mount it unconditionally.\n */\nexport function HandStagingView({\n zone,\n renderCard,\n renderEmptySlot,\n label,\n cardSize = \"sm\",\n ariaLabel,\n className,\n}: HandStagingViewProps) {\n const interactionStore = useInteractionUiStore();\n const drafts = useStore(\n interactionStore,\n useShallow((state) => state.drafts),\n );\n const stagedIds = usePluginState(\n useCallback(\n (state: PluginStateSnapshot) =>\n selectedCardIdsForZone(interactionStore, zone, state),\n // drafts is part of the store snapshot — useStore handles re-render.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [interactionStore, zone, drafts],\n ),\n );\n const zoneSnapshot = usePluginState(\n (state) => state.gameplay.zones[zone] ?? null,\n );\n const availableInteractions = usePluginState(\n (state) => state.gameplay.availableInteractions,\n );\n\n const cards = useMemo(\n () =>\n stagedIds\n .map((cardId, index) =>\n createZoneCardRenderItem(zone, zoneSnapshot, cardId, index),\n )\n .filter((card) => !card.hidden),\n [stagedIds, zone, zoneSnapshot],\n );\n\n const selection = useMemo(\n () => manyCardSelectionForZone(availableInteractions, zone),\n [availableInteractions, zone],\n );\n const slotCount =\n selection?.max ?? (selection ? Math.max(cards.length, 1) : cards.length);\n\n const route = useCardIntentAdapter({ zone });\n const onRemove = useCallback(\n (cardId: string) => {\n void route({ type: \"activate\", cardId, source: \"tap\" });\n },\n [route],\n );\n\n if (slotCount <= 0 && cards.length === 0) return null;\n\n return (\n <StagingZone\n cards={cards as readonly ViewCard[]}\n slotCount={slotCount}\n size={cardSize}\n renderCard={(card) => renderCard(card as ZoneCardRenderItem)}\n onRemove={onRemove}\n renderEmptySlot={renderEmptySlot}\n label={label}\n aria-label={ariaLabel}\n className={className}\n />\n );\n}\n\n/**\n * Convenience helper for builders of generated hand surfaces. Encodes a\n * typed target kind plus value into the opaque `targetId` that the SDK\n * presents to its drop pipeline. The runtime adapter resolves the kind to\n * the matching descriptor input at drop time, so authors never need to\n * know collector input names. Generated typed targets call this internally.\n */\nexport function dropTargetIdFor(\n kind: RuntimeDropTargetKind,\n value: string,\n): string {\n return encodeRuntimeDropTargetKind(kind, value);\n}\n\n/**\n * Determine whether any descriptor in the available list expects a board or\n * card destination input alongside a card target. Used by generated facades\n * to decide whether to mount a drag surface even before the author wires\n * dropTargets.\n */\nexport function descriptorsHaveDestinationInput(\n state: PluginStateSnapshot,\n): boolean {\n for (const descriptor of state.gameplay.availableInteractions) {\n const cardInputs = descriptor.inputs.filter(\n (input) =>\n isTargetDomain(input.domain) && input.domain.type === \"cardTarget\",\n );\n const destinationInputs = descriptor.inputs.filter(\n (input) =>\n isTargetDomain(input.domain) && input.domain.type !== \"cardTarget\",\n );\n if (cardInputs.length > 0 && destinationInputs.length > 0) return true;\n }\n return false;\n}\n","import {\n createContext,\n useContext,\n useMemo,\n type ButtonHTMLAttributes,\n type ReactNode,\n} from \"react\";\nimport { useStore } from \"zustand\";\nimport {\n createHexBoardView,\n HexGrid,\n type AnyHexBoardInput,\n type BoardSpaceIdOf,\n type HexBoardView,\n type HexGridBoardProps,\n} from \"../../ui.js\";\nimport {\n useBoardInteractions,\n type BoardInteractionsContext,\n type BoardSelectionResult,\n type BoardTargetLayerOptions,\n} from \"../hooks/useBoardInteractions.js\";\nimport { usePluginState } from \"../context/PluginStateContext.js\";\nimport type { InteractionDescriptor } from \"../types/plugin-state.js\";\nimport type { BoardTargetKey } from \"../ui-contract.js\";\nimport {\n eligibleTargetsForInput,\n inputByKey,\n inputKeyForTarget,\n isResolvedTargetDomain,\n resolveInputDomain,\n type BoardTargetKind,\n} from \"../utils/interaction-inputs.js\";\nimport {\n composeEventHandlers,\n renderPrimitive,\n type PrimitiveCommonProps,\n} from \"./primitive-props.js\";\nimport { runInteractionAction } from \"./interaction-submit.js\";\nimport { useGameActionError } from \"./game.js\";\nimport { isInteractionAvailable } from \"../utils/interaction-status.js\";\nimport { useInteractionUiStore } from \"../context/InteractionDraftContext.js\";\n\ntype BoardContextValue = BoardInteractionsContext;\n\nconst BoardContext = createContext<BoardContextValue | null>(null);\nconst warnedAmbiguousBoardTargets = new Set<string>();\n\nfunction warnAmbiguousBoardTarget({\n kind,\n value,\n interactionKeys,\n}: {\n kind: BoardTargetKind;\n value: string;\n interactionKeys: readonly string[];\n}): void {\n const key = `${kind}:${value}:${interactionKeys.join(\"|\")}`;\n if (warnedAmbiguousBoardTargets.has(key)) return;\n warnedAmbiguousBoardTargets.add(key);\n console.error(\n `[dreamboard] Ambiguous Board.${kind} target \"${value}\" matched multiple available interactions: ${interactionKeys.join(\n \", \",\n )}. Declare the real initiating collector in Interaction.Routes (for example, a card or form input), arm one interaction before collecting this board target, or render an explicit Board.Target interaction prop.`,\n );\n}\n\nexport function useBoardPrimitiveContext(): BoardContextValue {\n const value = useContext(BoardContext);\n if (!value) {\n throw new Error(\"Board primitives must be rendered inside <Board.Root>.\");\n }\n return value;\n}\n\nexport interface BoardRootProps extends PrimitiveCommonProps {\n children: ReactNode;\n targetKinds?: readonly BoardTargetKind[];\n}\n\nexport function BoardRoot({ children, targetKinds, ...props }: BoardRootProps) {\n const board = useBoardInteractions({ targetKinds });\n return (\n <BoardContext.Provider value={board}>\n {renderPrimitive(\"div\", {\n ...props,\n \"data-dreamboard-board-root\": \"\",\n children,\n })}\n </BoardContext.Provider>\n );\n}\n\nexport interface BoardStateProps {\n children: (board: BoardInteractionsContext) => ReactNode;\n}\n\nexport function BoardState({ children }: BoardStateProps) {\n return <>{children(useBoardPrimitiveContext())}</>;\n}\n\nexport interface BoardHexViewProps<\n TBoard extends AnyHexBoardInput,\n TSpaceView extends { id: BoardSpaceIdOf<TBoard> },\n> {\n board: TBoard;\n spaces: readonly TSpaceView[];\n children: (view: HexBoardView<TBoard, TSpaceView>) => ReactNode;\n}\n\nexport function BoardHexView<\n const TBoard extends AnyHexBoardInput,\n const TSpaceView extends { id: BoardSpaceIdOf<TBoard> },\n>({ board, spaces, children }: BoardHexViewProps<TBoard, TSpaceView>) {\n const view = useMemo(\n () => createHexBoardView<TBoard, TSpaceView>(board, { spaces }),\n [board, spaces],\n );\n return <>{children(view)}</>;\n}\n\nexport interface BoardHexGridInteractions {\n edge?: BoardTargetLayerOptions;\n vertex?: BoardTargetLayerOptions;\n space?: BoardTargetLayerOptions;\n}\n\nexport type BoardHexGridInteractionFilter =\n | \"auto\"\n | false\n | {\n edge?: readonly string[];\n vertex?: readonly string[];\n space?: readonly string[];\n };\n\ntype BoardHexGridView<\n TBoard extends AnyHexBoardInput,\n TSpaceView extends { id: BoardSpaceIdOf<TBoard> },\n> = HexBoardView<TBoard, TSpaceView> & AnyHexBoardInput;\n\nexport type BoardHexGridProps<\n TBoard extends AnyHexBoardInput,\n TSpaceView extends { id: BoardSpaceIdOf<TBoard> },\n> = Omit<\n HexGridBoardProps<BoardHexGridView<TBoard, TSpaceView>>,\n \"board\" | \"interactiveEdges\" | \"interactiveVertices\" | \"interactiveSpaces\"\n> &\n Omit<BoardHexViewProps<TBoard, TSpaceView>, \"children\"> & {\n interactions?: BoardHexGridInteractionFilter;\n };\n\nexport function BoardHexGrid<\n const TBoard extends AnyHexBoardInput,\n const TSpaceView extends { id: BoardSpaceIdOf<TBoard> },\n>({\n board,\n spaces,\n interactions = \"auto\",\n ...props\n}: BoardHexGridProps<TBoard, TSpaceView>) {\n const boardInteractions = useBoardPrimitiveContext();\n const gameActionError = useGameActionError();\n const edgeLayer =\n interactions === false\n ? undefined\n : boardInteractions.targetLayers.edge({\n enabled: boardInteractions.eligible.edge.size > 0,\n interactionKeys:\n interactions === \"auto\" ? undefined : interactions.edge,\n onError: gameActionError ?? undefined,\n });\n const vertexLayer =\n interactions === false\n ? undefined\n : boardInteractions.targetLayers.vertex({\n enabled: boardInteractions.eligible.vertex.size > 0,\n interactionKeys:\n interactions === \"auto\" ? undefined : interactions.vertex,\n onError: gameActionError ?? undefined,\n });\n const spaceLayer =\n interactions === false\n ? undefined\n : boardInteractions.targetLayers.space({\n enabled: boardInteractions.eligible.space.size > 0,\n interactionKeys:\n interactions === \"auto\" ? undefined : interactions.space,\n onError: gameActionError ?? undefined,\n });\n return (\n <BoardHexView board={board} spaces={spaces}>\n {(view) => (\n <HexGrid\n {...props}\n board={view as BoardHexGridView<TBoard, TSpaceView>}\n interactiveEdges={edgeLayer}\n interactiveVertices={vertexLayer}\n interactiveSpaces={spaceLayer}\n />\n )}\n </BoardHexView>\n );\n}\n\nexport type BoardTargetExtraInputs =\n | Record<string, unknown>\n | ((targetId: string) => Record<string, unknown>);\n\nexport type BoardTargetProps<Target extends string = BoardTargetKey> =\n PrimitiveCommonProps &\n ButtonHTMLAttributes<HTMLButtonElement> & {\n kind: BoardTargetKind;\n value: Target;\n interaction?: string;\n input?: string;\n extraInputs?: BoardTargetExtraInputs;\n onSelect?: (result: BoardSelectionResult) => void;\n onSelectError?: (error: unknown) => void;\n };\n\nexport function BoardTarget<Target extends string = BoardTargetKey>({\n interaction,\n input,\n ...props\n}: BoardTargetProps<Target>) {\n const descriptor = usePluginState((state) =>\n interaction\n ? state.gameplay.availableInteractions.find(\n (candidate) =>\n candidate.interactionKey === interaction ||\n candidate.interactionId === interaction,\n )\n : undefined,\n );\n\n if (interaction) {\n return descriptor ? (\n <ExplicitBoardTarget descriptor={descriptor} input={input} {...props} />\n ) : (\n <UnavailableBoardTarget\n interaction={interaction}\n input={input}\n {...props}\n />\n );\n }\n\n return <UnambiguousBoardTarget input={input} {...props} />;\n}\n\nexport type BoardSpaceTargetProps<Target extends string = BoardTargetKey> =\n Omit<BoardTargetProps<Target>, \"kind\">;\n\nexport function BoardSpaceTarget<Target extends string = BoardTargetKey>(\n props: BoardSpaceTargetProps<Target>,\n) {\n return <BoardTarget kind=\"space\" {...props} />;\n}\n\nexport type BoardEdgeTargetProps<Target extends string = BoardTargetKey> = Omit<\n BoardTargetProps<Target>,\n \"kind\"\n>;\n\nexport function BoardEdgeTarget<Target extends string = BoardTargetKey>(\n props: BoardEdgeTargetProps<Target>,\n) {\n return <BoardTarget kind=\"edge\" {...props} />;\n}\n\nexport type BoardVertexTargetProps<Target extends string = BoardTargetKey> =\n Omit<BoardTargetProps<Target>, \"kind\">;\n\nexport function BoardVertexTarget<Target extends string = BoardTargetKey>(\n props: BoardVertexTargetProps<Target>,\n) {\n return <BoardTarget kind=\"vertex\" {...props} />;\n}\n\nfunction UnambiguousBoardTarget({\n kind,\n value,\n extraInputs,\n onSelect,\n onSelectError,\n disabled,\n onClick,\n children,\n ...props\n}: Omit<BoardTargetProps, \"interaction\">) {\n const board = useBoardPrimitiveContext();\n const gameActionError = useGameActionError();\n const targetState = board.targetState(kind, value);\n const eligible = board.isEligible(value, kind);\n const ambiguous = targetState.conflict;\n const conflictInteractionKeys = targetState.conflictInteractionKeys ?? [];\n if (ambiguous) {\n warnAmbiguousBoardTarget({\n kind,\n value,\n interactionKeys: conflictInteractionKeys,\n });\n }\n const isDisabled = disabled ?? (!targetState.eligible || ambiguous);\n const ambiguityMessage =\n ambiguous && conflictInteractionKeys.length > 0\n ? `Ambiguous ${kind} target \"${value}\" matched: ${conflictInteractionKeys.join(\n \", \",\n )}`\n : undefined;\n return renderPrimitive(\"button\", {\n type: \"button\",\n ...props,\n children,\n disabled: isDisabled,\n \"aria-disabled\": isDisabled,\n \"data-dreamboard-board-target\": \"\",\n \"data-target-kind\": kind,\n \"data-target-id\": value,\n \"data-eligible\": eligible,\n \"data-ambiguous\": ambiguous || undefined,\n \"data-conflict-interactions\":\n ambiguous && conflictInteractionKeys.length > 0\n ? conflictInteractionKeys.join(\" \")\n : undefined,\n \"data-disabled\": isDisabled || undefined,\n title: props.title ?? ambiguityMessage,\n onClick: composeEventHandlers(onClick, () => {\n if (isDisabled) return;\n void runInteractionAction(\n () => board.select[kind](value, resolveExtraInputs(extraInputs, value)),\n {\n onSuccess: onSelect,\n onError: onSelectError ?? gameActionError ?? undefined,\n },\n );\n }),\n });\n}\n\nfunction ExplicitBoardTarget({\n descriptor,\n kind,\n value,\n input,\n extraInputs,\n onSelect,\n onSelectError,\n disabled,\n onClick,\n children,\n ...props\n}: Omit<BoardTargetProps, \"interaction\"> & {\n descriptor: InteractionDescriptor;\n}) {\n const board = useBoardPrimitiveContext();\n const gameActionError = useGameActionError();\n const store = useInteractionUiStore();\n useStore(store, (state) => state.drafts[descriptor.interactionKey] ?? {});\n const draft = store.getDraft(descriptor.interactionKey);\n const inputKey = input ?? inputKeyForTarget(descriptor, kind, value, draft);\n const rawInputDescriptor = inputKey\n ? inputByKey(descriptor, inputKey)\n : undefined;\n const inputDescriptor = rawInputDescriptor\n ? resolveInputDomain(rawInputDescriptor, draft)\n : undefined;\n const eligibleTargets = inputKey\n ? eligibleTargetsForInput(descriptor, inputKey, draft)\n : undefined;\n const eligible =\n inputDescriptor !== undefined &&\n inputDescriptor.domain.type === \"boardTarget\" &&\n isResolvedTargetDomain(inputDescriptor.domain) &&\n inputDescriptor.domain.targetKind === kind &&\n (eligibleTargets ?? inputDescriptor.domain.eligibleTargets).includes(value);\n const isDisabled =\n disabled ?? (!isInteractionAvailable(descriptor) || !eligible);\n return renderPrimitive(\"button\", {\n type: \"button\",\n ...props,\n children,\n disabled: isDisabled,\n \"aria-disabled\": isDisabled,\n \"data-dreamboard-board-target\": \"\",\n \"data-target-kind\": kind,\n \"data-target-id\": value,\n \"data-interaction-id\": descriptor.interactionId,\n \"data-interaction-key\": descriptor.interactionKey,\n \"data-input-name\": inputKey ?? undefined,\n \"data-eligible\": eligible,\n \"data-disabled\": isDisabled || undefined,\n onClick: composeEventHandlers(onClick, () => {\n if (isDisabled || !inputKey) return;\n const resolvedExtraInputs = resolveExtraInputs(extraInputs, value);\n void runInteractionAction(\n () =>\n board.selectTarget(\n descriptor,\n kind,\n value,\n inputKey,\n resolvedExtraInputs,\n ),\n {\n onSuccess: onSelect,\n onError: onSelectError ?? gameActionError ?? undefined,\n },\n );\n }),\n });\n}\n\nfunction UnavailableBoardTarget({\n kind,\n value,\n interaction,\n input,\n disabled,\n children,\n ...props\n}: Omit<BoardTargetProps, \"onSelect\" | \"onSelectError\" | \"extraInputs\">) {\n const isDisabled = disabled ?? true;\n return renderPrimitive(\"button\", {\n type: \"button\",\n ...props,\n children,\n disabled: isDisabled,\n \"aria-disabled\": isDisabled,\n \"data-dreamboard-board-target\": \"\",\n \"data-target-kind\": kind,\n \"data-target-id\": value,\n \"data-interaction-key\": interaction,\n \"data-input-name\": input,\n \"data-eligible\": false,\n \"data-disabled\": isDisabled || undefined,\n });\n}\n\nfunction resolveExtraInputs(\n extraInputs: BoardTargetExtraInputs | undefined,\n targetId: string,\n): Record<string, unknown> {\n return typeof extraInputs === \"function\"\n ? extraInputs(targetId)\n : (extraInputs ?? {});\n}\n\nexport const Board = {\n Root: BoardRoot,\n State: BoardState,\n HexGrid: BoardHexGrid,\n HexView: BoardHexView,\n Target: BoardTarget,\n SpaceTarget: BoardSpaceTarget,\n EdgeTarget: BoardEdgeTarget,\n VertexTarget: BoardVertexTarget,\n};\n","import { useCallback, useMemo } from \"react\";\nimport { useStore } from \"zustand\";\nimport { useInteractionUiStore } from \"../context/InteractionDraftContext.js\";\nimport { usePluginSession } from \"../context/PluginSessionContext.js\";\nimport { usePluginState } from \"../context/PluginStateContext.js\";\nimport { useRuntimeContext } from \"../context/RuntimeContext.js\";\nimport { validationErrorFromUnknown } from \"../errors/ValidationError.js\";\nimport type {\n InteractiveTargetLayer,\n InteractiveTargetState,\n} from \"../components/board/target-layer.js\";\nimport type { InteractionDescriptor } from \"../types/plugin-state.js\";\nimport {\n applyInteractionInputDefaults,\n eligibleTargetsByBoardKind,\n eligibleTargetsForInput,\n hasBoardTargetInput,\n hasCardTargetInput,\n inputByTarget,\n inputKeyForTarget,\n isTargetDomain,\n type BoardTargetKind,\n} from \"../utils/interaction-inputs.js\";\nimport {\n claimInteractionSubmit,\n clearInteractionRoute,\n getInteractionDraftReadiness,\n markInteractionPending,\n routeInteractionTarget,\n shouldRouteInteractionPending,\n} from \"../utils/interaction-router.js\";\nimport { isInteractionAvailable } from \"../utils/interaction-status.js\";\n\nexport type BoardEligibleTargets = Readonly<\n Record<BoardTargetKind, ReadonlySet<string>>\n>;\n\nexport interface BoardTargetLayerOptions {\n enabled?: boolean;\n interactionKeys?: readonly string[];\n extraInputs?:\n | Record<string, unknown>\n | ((targetId: string) => Record<string, unknown>);\n onBeforeSelect?: () => void;\n onError?: (error: unknown) => void;\n}\n\nexport type BoardTargetLayerFactory = (\n options?: BoardTargetLayerOptions,\n) => InteractiveTargetLayer;\n\nexport type BoardSelectionResult<I extends string = string> =\n | { status: \"none\" }\n | {\n status: \"pending\";\n interactionKey: I;\n descriptor: InteractionDescriptor<I>;\n missingInputs: readonly string[];\n }\n | {\n status: \"submitted\";\n interactionKey: I;\n descriptor: InteractionDescriptor<I>;\n };\n\nexport interface BoardPendingInteraction<I extends string = string> {\n interactionKey: I;\n descriptor: InteractionDescriptor<I>;\n missingInputs: readonly string[];\n clear(): void;\n}\n\nexport interface BoardInteractionsOptions {\n /**\n * Target kinds the hook pulls interactions from. Defaults to every board\n * target kind. Restrict when a specific screen should only react to a subset\n * (e.g. a discard screen that only cares about tile clicks).\n */\n targetKinds?: readonly BoardTargetKind[];\n}\n\nexport class BoardInteractionConflictError extends Error {\n readonly name = \"BoardInteractionConflictError\";\n readonly targetKind: BoardTargetKind;\n readonly targetId: string;\n readonly interactionKeys: readonly string[];\n\n constructor({\n targetKind,\n targetId,\n interactionKeys,\n }: {\n targetKind: BoardTargetKind;\n targetId: string;\n interactionKeys: readonly string[];\n }) {\n super(\n `Ambiguous ${targetKind} target '${targetId}' matched interactions: ${interactionKeys.join(\n \", \",\n )}. Arm one interaction explicitly or route with a narrower board primitive.`,\n );\n this.targetKind = targetKind;\n this.targetId = targetId;\n this.interactionKeys = interactionKeys;\n }\n}\n\n/**\n * Opinionated board-level dispatch context. Collapses the repeated\n * \"collect every board handle, merge target domains across them,\n * route each click into the right interaction\" pattern that advanced\n * board games (Catan-class) otherwise have to re-implement by hand.\n */\nexport interface BoardInteractionsContext<I extends string = string> {\n /**\n * All board-surface interactions projected onto the controlling seat\n * — both available and unavailable. Rendered greyed-out states can\n * key off this even when the interaction isn't dispatchable yet.\n */\n interactions: ReadonlyArray<InteractionDescriptor<I>>;\n /**\n * Per-target-kind eligibility sets merged across every currently-\n * available board interaction. `eligible.vertex` answers \"which\n * vertex ids can be clicked right now?\" without the caller manually\n * unioning descriptor eligibility across handles or knowing the\n * authored input key.\n */\n eligible: BoardEligibleTargets;\n /**\n * True when `targetId` is eligible for at least one available\n * interaction. Pass `kind` to scope the check to a specific\n * board target kind.\n */\n isEligible(targetId: string, kind?: BoardTargetKind): boolean;\n /**\n * Target-kind dispatch. Routes by board geometry (`edge`, `vertex`,\n * `space`, `tile`) rather than authored input-key strings.\n */\n pendingInteraction: BoardPendingInteraction<I> | null;\n select: {\n edge(\n targetId: string,\n extraInputs?: Record<string, unknown>,\n ): Promise<BoardSelectionResult<I>>;\n vertex(\n targetId: string,\n extraInputs?: Record<string, unknown>,\n ): Promise<BoardSelectionResult<I>>;\n space(\n targetId: string,\n extraInputs?: Record<string, unknown>,\n ): Promise<BoardSelectionResult<I>>;\n tile(\n targetId: string,\n extraInputs?: Record<string, unknown>,\n ): Promise<BoardSelectionResult<I>>;\n };\n /**\n * Reducer-aware target layers for board primitives. Pass these directly\n * to grids so eligibility, dispatch, and submit error handling stay in\n * one place instead of being re-wired per component.\n */\n targetLayers: {\n edge: BoardTargetLayerFactory;\n vertex: BoardTargetLayerFactory;\n space: BoardTargetLayerFactory;\n tile: BoardTargetLayerFactory;\n };\n targetState(\n targetKind: BoardTargetKind,\n targetId: string,\n options?: Pick<BoardTargetLayerOptions, \"enabled\" | \"interactionKeys\">,\n ): InteractiveTargetState;\n selectTarget(\n descriptor: InteractionDescriptor<I>,\n targetKind: BoardTargetKind,\n targetId: string,\n inputKey: string,\n extraInputs?: Record<string, unknown>,\n ): Promise<BoardSelectionResult<I>>;\n}\n\n/**\n * Board-surface orchestration helper that removes the boilerplate of\n * wiring many `useInteractionById(...)` calls, merging their\n * eligibility sets, and dispatching clicks to the right handle.\n *\n * Internal board primitive controller for games that keep multiple board\n * interactions live simultaneously and dispatch by target geometry. The\n * typical\n * Catan-class shape:\n *\n * ```tsx\n * const board = useBoardInteractions();\n *\n * return (\n * <HexGrid\n * interactiveVertices={board.targetLayers.vertex()}\n * interactiveEdges={board.targetLayers.edge()}\n * onTileClick={(id) => board.select.space(id)}\n * />\n * );\n * ```\n *\n * Mount generated interaction routes with `<Interaction.Switch routes={...}>`\n * for interactions that need more input after a board target is selected.\n *\n * Eligibility and availability remain authoritative on reducer-projected\n * descriptors. Armed routed descriptors beat ambient board descriptors.\n * Multiple unarmed matches are ambiguous and throw\n * {@link BoardInteractionConflictError}.\n */\nexport function useBoardInteractions<I extends string = string>(\n options: BoardInteractionsOptions = {},\n): BoardInteractionsContext<I> {\n const { targetKinds } = options;\n\n const runtime = useRuntimeContext();\n const { controllingPlayerId } = usePluginSession();\n const store = useInteractionUiStore();\n const subscribedArmedBySurface = useStore(store, (state) => state.arms);\n const subscribedDrafts = useStore(store, (state) => state.drafts);\n const pendingInteractionKey = useStore(\n store,\n (state) => state.pendingInteractionKey,\n );\n const armedBySurface = store.getState().arms ?? subscribedArmedBySurface;\n const drafts = store.getState().drafts ?? subscribedDrafts;\n const descriptors = usePluginState(\n (state) => state.gameplay.availableInteractions ?? [],\n );\n\n const targetKindSet = useMemo(\n () => new Set<BoardTargetKind>(targetKinds),\n [targetKinds],\n );\n const armedIds = useMemo(\n () => new Set(Object.values(armedBySurface)),\n [armedBySurface],\n );\n\n const interactions = useMemo<ReadonlyArray<InteractionDescriptor<I>>>(() => {\n return descriptors.flatMap(\n (descriptor): Array<InteractionDescriptor<I>> => {\n if (armedIds.has(descriptor.interactionKey)) {\n return [\n { ...descriptor, interactionKey: descriptor.interactionKey as I },\n ];\n }\n if (hasCardTargetInput(descriptor)) return [];\n if (!hasBoardTargetInput(descriptor)) return [];\n const include =\n !targetKinds || targetKinds.length === 0\n ? true\n : (\n Object.keys(\n eligibleTargetsByBoardKind(descriptor),\n ) as BoardTargetKind[]\n ).some((kind) => targetKindSet.has(kind));\n return include\n ? [{ ...descriptor, interactionKey: descriptor.interactionKey as I }]\n : [];\n },\n );\n }, [armedIds, descriptors, targetKindSet, targetKinds]);\n\n const eligible = useMemo<BoardEligibleTargets>(() => {\n const acc: Record<BoardTargetKind, Set<string>> = {\n edge: new Set<string>(),\n vertex: new Set<string>(),\n space: new Set<string>(),\n tile: new Set<string>(),\n };\n for (const descriptor of interactions) {\n if (!isInteractionAvailable(descriptor)) continue;\n const targetsByKind = eligibleTargetsByBoardKind(\n descriptor,\n drafts[descriptor.interactionKey] ?? {},\n );\n for (const [targetKind, ids] of Object.entries(targetsByKind) as Array<\n [BoardTargetKind, readonly string[] | undefined]\n >) {\n if (!ids) continue;\n const bucket = acc[targetKind];\n for (const id of ids) bucket.add(id);\n }\n }\n return acc;\n }, [drafts, interactions]);\n\n const isEligible = useCallback(\n (targetId: string, kind?: BoardTargetKind) => {\n if (kind !== undefined) {\n return eligible[kind].has(targetId);\n }\n for (const bucket of Object.values(eligible)) {\n if (bucket.has(targetId)) return true;\n }\n return false;\n },\n [eligible],\n );\n\n const clearPendingInteraction = useCallback(\n (descriptor: InteractionDescriptor) => {\n clearInteractionRoute(store, descriptor);\n },\n [store],\n );\n\n const resolveSelection = useCallback(\n async (\n descriptor: InteractionDescriptor<I>,\n inputKey: string,\n targetId: string,\n extraInputs?: Record<string, unknown>,\n ): Promise<BoardSelectionResult<I>> => {\n if (!controllingPlayerId) return { status: \"none\" };\n const { params, readiness } = routeInteractionTarget(store, descriptor, {\n inputKey,\n value: targetId,\n extraInputs,\n });\n if (shouldRouteInteractionPending(descriptor, readiness)) {\n markInteractionPending(store, descriptor);\n return {\n status: \"pending\",\n interactionKey: descriptor.interactionKey as I,\n descriptor,\n missingInputs: readiness.missingInputs,\n };\n }\n\n const submitParams = applyInteractionInputDefaults<\n Record<string, unknown>\n >(descriptor, params);\n if (!claimInteractionSubmit(store, descriptor)) {\n return {\n status: \"submitted\",\n interactionKey: descriptor.interactionKey as I,\n descriptor,\n };\n }\n try {\n await runtime.submitInteraction(\n controllingPlayerId,\n descriptor.interactionId,\n submitParams as Record<string, unknown>,\n );\n clearPendingInteraction(descriptor);\n return {\n status: \"submitted\",\n interactionKey: descriptor.interactionKey as I,\n descriptor,\n };\n } catch (error) {\n throw validationErrorFromUnknown(error);\n } finally {\n store.setSubmitting(descriptor.interactionKey, false);\n }\n },\n [clearPendingInteraction, controllingPlayerId, runtime, store],\n );\n\n const resolveTargetMatches = useCallback(\n (\n targetKind: BoardTargetKind,\n targetId: string,\n interactionKeys?: readonly string[],\n ): Array<MatchingDescriptor<I>> => {\n const allowedInteractionKeys = interactionKeys\n ? new Set(interactionKeys)\n : null;\n const matches = interactions.flatMap((descriptor) => {\n if (\n allowedInteractionKeys &&\n !allowedInteractionKeys.has(descriptor.interactionKey)\n ) {\n return [];\n }\n if (!isInteractionAvailable(descriptor)) return [];\n const draft = store.getDraft(descriptor.interactionKey);\n const inputKey = inputKeyForTarget(\n descriptor,\n targetKind,\n targetId,\n draft,\n );\n if (!inputKey) return [];\n const input = inputByTarget(descriptor, targetKind, targetId, draft);\n if (\n input &&\n !isTargetSelectable(\n input,\n store.getDraft(descriptor.interactionKey),\n targetId,\n )\n ) {\n return [];\n }\n const targets = eligibleTargetsForInput(descriptor, inputKey, draft);\n if (!targets || !targets.includes(targetId)) return [];\n return [\n {\n descriptor,\n inputKey,\n armed: armedIds.has(descriptor.interactionKey),\n },\n ];\n });\n return matches;\n },\n [armedIds, interactions, store],\n );\n\n const selectByKind = useCallback(\n async (\n targetKind: BoardTargetKind,\n targetId: string,\n extraInputs?: Record<string, unknown>,\n interactionKeys?: readonly string[],\n ): Promise<BoardSelectionResult<I>> => {\n if (!controllingPlayerId) return { status: \"none\" };\n const matches = resolveTargetMatches(\n targetKind,\n targetId,\n interactionKeys,\n );\n const selected = selectDispatchCandidate(matches, targetKind, targetId);\n if (selected) {\n const { descriptor, inputKey } = selected;\n return resolveSelection(descriptor, inputKey, targetId, extraInputs);\n }\n return { status: \"none\" };\n },\n [controllingPlayerId, resolveSelection, resolveTargetMatches],\n );\n\n const select = useMemo(\n () => ({\n edge: (targetId: string, extraInputs?: Record<string, unknown>) =>\n selectByKind(\"edge\", targetId, extraInputs),\n vertex: (targetId: string, extraInputs?: Record<string, unknown>) =>\n selectByKind(\"vertex\", targetId, extraInputs),\n space: (targetId: string, extraInputs?: Record<string, unknown>) =>\n selectByKind(\"space\", targetId, extraInputs),\n tile: (targetId: string, extraInputs?: Record<string, unknown>) =>\n selectByKind(\"tile\", targetId, extraInputs),\n }),\n [selectByKind],\n );\n\n const targetState = useCallback(\n (\n targetKind: BoardTargetKind,\n targetId: string,\n options: Pick<\n BoardTargetLayerOptions,\n \"enabled\" | \"interactionKeys\"\n > = {},\n ): InteractiveTargetState => {\n const enabled = options.enabled !== false;\n const matches = enabled\n ? resolveTargetMatches(targetKind, targetId, options.interactionKeys)\n : [];\n const armed = matches.filter((match) => match.armed);\n const candidates = armed.length > 0 ? armed : matches;\n const selected = candidates[0] ?? null;\n const conflict = candidates.length > 1;\n const pending = selected\n ? pendingInteractionKey === selected.descriptor.interactionKey\n : false;\n const eligible = enabled && !!selected && !conflict;\n return {\n kind: targetKind,\n id: targetId,\n eligible,\n selectable: eligible && !!controllingPlayerId,\n hovered: false,\n interactionKey: selected?.descriptor.interactionKey,\n interactionId: selected?.descriptor.interactionId,\n inputKey: selected?.inputKey,\n pending,\n conflict,\n conflictInteractionKeys: conflict\n ? candidates.map((candidate) => candidate.descriptor.interactionKey)\n : undefined,\n unavailableReason: candidateUnavailableReason(selected, conflict),\n };\n },\n [controllingPlayerId, pendingInteractionKey, resolveTargetMatches],\n );\n\n const targetLayers = useMemo(() => {\n const createLayer =\n (targetKind: BoardTargetKind): BoardTargetLayerFactory =>\n (layerOptions = {}) => {\n const {\n enabled,\n interactionKeys,\n extraInputs,\n onBeforeSelect,\n onError,\n } = layerOptions;\n const resolveExtraInputs = (targetId: string) =>\n typeof extraInputs === \"function\"\n ? extraInputs(targetId)\n : extraInputs;\n return {\n enabled,\n eligible: eligible[targetKind],\n targetState: (targetId: string) => ({\n ...targetState(targetKind, targetId, { enabled, interactionKeys }),\n select: async () => {\n if (enabled === false) return { status: \"none\" };\n onBeforeSelect?.();\n try {\n return await selectByKind(\n targetKind,\n targetId,\n resolveExtraInputs(targetId),\n interactionKeys,\n );\n } catch (error) {\n onError?.(error);\n if (!onError) throw error;\n return { status: \"none\" };\n }\n },\n }),\n selectTargetId: async (targetId: string) => {\n if (enabled === false) return { status: \"none\" };\n onBeforeSelect?.();\n try {\n return await selectByKind(\n targetKind,\n targetId,\n resolveExtraInputs(targetId),\n interactionKeys,\n );\n } catch (error) {\n onError?.(error);\n if (!onError) throw error;\n return { status: \"none\" };\n }\n },\n };\n };\n return {\n edge: createLayer(\"edge\"),\n vertex: createLayer(\"vertex\"),\n space: createLayer(\"space\"),\n tile: createLayer(\"tile\"),\n };\n }, [eligible, selectByKind, targetState]);\n\n const pendingInteraction = useMemo<BoardPendingInteraction<I> | null>(() => {\n if (!pendingInteractionKey) return null;\n const descriptor = interactions.find(\n (candidate) => candidate.interactionKey === pendingInteractionKey,\n );\n if (!descriptor) return null;\n return {\n interactionKey: descriptor.interactionKey as I,\n descriptor,\n missingInputs: missingInputsForDraft(\n descriptor,\n drafts[descriptor.interactionKey] ?? {},\n ),\n clear: () => clearPendingInteraction(descriptor),\n };\n }, [clearPendingInteraction, drafts, interactions, pendingInteractionKey]);\n\n const selectTarget = useCallback(\n (\n descriptor: InteractionDescriptor<I>,\n _targetKind: BoardTargetKind,\n targetId: string,\n inputKey: string,\n extraInputs?: Record<string, unknown>,\n ) => resolveSelection(descriptor, inputKey, targetId, extraInputs),\n [resolveSelection],\n );\n\n return useMemo(\n () => ({\n interactions,\n eligible,\n isEligible,\n pendingInteraction,\n select,\n targetLayers,\n targetState,\n selectTarget,\n }),\n [\n interactions,\n eligible,\n isEligible,\n pendingInteraction,\n select,\n targetLayers,\n targetState,\n selectTarget,\n ],\n );\n}\n\nfunction isTargetSelectable(\n input: NonNullable<ReturnType<typeof inputByTarget>>,\n draft: Readonly<Record<string, unknown>>,\n targetId: string,\n): boolean {\n const selection = isTargetDomain(input.domain)\n ? input.domain.selection\n : undefined;\n if (selection?.mode !== \"many\" || !selection.distinct) return true;\n const current = draft[input.key];\n if (!Array.isArray(current)) return true;\n if (current.map((item) => String(item)).includes(targetId)) return true;\n return selection.max === undefined || current.length < selection.max;\n}\n\nfunction missingInputsForDraft(\n descriptor: InteractionDescriptor,\n draft: Readonly<Record<string, unknown>>,\n): string[] {\n return [...getInteractionDraftReadiness(descriptor, draft).missingInputs];\n}\n\ninterface MatchingDescriptor<I extends string> {\n descriptor: InteractionDescriptor<I>;\n inputKey: string;\n armed: boolean;\n}\n\nfunction selectDispatchCandidate<I extends string>(\n matches: ReadonlyArray<MatchingDescriptor<I>>,\n targetKind: BoardTargetKind,\n targetId: string,\n): MatchingDescriptor<I> | null {\n if (matches.length === 0) return null;\n const armed = matches.filter((match) => match.armed);\n const candidates = armed.length > 0 ? armed : matches;\n if (candidates.length > 1) {\n throw new BoardInteractionConflictError({\n targetKind,\n targetId,\n interactionKeys: candidates.map(\n (winner) => winner.descriptor.interactionKey,\n ),\n });\n }\n return candidates[0] ?? null;\n}\n\nfunction candidateUnavailableReason<I extends string>(\n match: MatchingDescriptor<I> | null,\n conflict: boolean,\n): string | undefined {\n if (conflict) return \"conflict\";\n if (!match) return \"unavailable\";\n if (!isInteractionAvailable(match.descriptor)) return \"unavailable\";\n return undefined;\n}\n","/**\n * Error thrown when action validation fails.\n * Contains the error code and optional message from the validation result.\n */\nexport class ValidationError extends Error {\n constructor(\n public readonly errorCode?: string,\n message?: string,\n ) {\n super(message || errorCode || \"Validation failed\");\n this.name = \"ValidationError\";\n }\n}\n\nexport function validationErrorFromUnknown(\n error: unknown,\n fallbackMessage = \"Interaction submission failed\",\n): ValidationError {\n if (error instanceof ValidationError) return error;\n const errorCode =\n typeof error === \"object\" &&\n error !== null &&\n \"errorCode\" in error &&\n typeof error.errorCode === \"string\"\n ? error.errorCode\n : undefined;\n const message = error instanceof Error ? error.message : fallbackMessage;\n return new ValidationError(errorCode, message);\n}\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n type ButtonHTMLAttributes,\n type HTMLAttributes,\n type InputHTMLAttributes,\n type ReactNode,\n} from \"react\";\nimport {\n useInteractionHandle,\n type InteractionHandle,\n type InteractionParamsShape,\n} from \"../hooks/useInteractionHandle.js\";\nimport {\n useInteractionUiStore,\n usePendingInteractionKey,\n usePendingInteractionRevision,\n} from \"../context/InteractionDraftContext.js\";\nimport { usePluginState } from \"../context/PluginStateContext.js\";\nimport type { InteractionInputKey, InteractionKey } from \"../ui-contract.js\";\nimport type {\n InteractionDescriptor,\n InteractionInputDescriptor,\n ZoneHandlesSnapshot,\n} from \"../types/plugin-state.js\";\nimport {\n hasInteractionFieldErrors,\n inputByKey,\n isBoardTargetDomain,\n isResolvedTargetDomain,\n isTargetDomain,\n isManyTargetSelectable,\n} from \"../utils/interaction-inputs.js\";\nimport {\n getInteractionDraftReadiness,\n markInteractionPending,\n routeCardInputIntent,\n shouldRouteInteractionPending,\n} from \"../utils/interaction-router.js\";\nimport {\n interactionUnavailableReason,\n isInteractionAvailable,\n} from \"../utils/interaction-status.js\";\nimport { interactionLabel } from \"../utils/interaction-labels.js\";\nimport {\n composeEventHandlers,\n renderPrimitive,\n type PrimitiveCommonProps,\n} from \"./primitive-props.js\";\nimport {\n BoundInteractionForm,\n castInteractionDraft,\n castInteractionHandle,\n type BoundInteractionFormProps,\n} from \"./interaction-form-binding.js\";\nimport {\n InteractionField as BaseInteractionField,\n type InteractionFieldProps as BaseInteractionFieldProps,\n} from \"../components/InteractionForm.js\";\nimport {\n submitInteractionDraft,\n submitInteractionParams,\n type InteractionSubmitCallbacks,\n} from \"./interaction-submit.js\";\nimport {\n useDialogLifecycle,\n type DialogLifecycleState,\n} from \"./dialog-lifecycle.js\";\nimport { useGameActionError } from \"./game.js\";\nimport { useOptionalZonePrimitiveContext, useZoneCardContext } from \"./zone.js\";\n\ninterface InteractionContextValue {\n interaction: string;\n descriptor: InteractionDescriptor | null;\n handle: ReturnType<typeof useInteractionHandle> | null;\n}\n\nconst InteractionContext = createContext<InteractionContextValue | null>(null);\n\nfunction humanizeInteraction(value: string): string {\n const parts = value.split(\".\");\n const leaf = parts[parts.length - 1] ?? value;\n return leaf\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .replace(/[-_]+/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim()\n .replace(/^./, (first: string) => first.toUpperCase());\n}\n\nexport function useInteractionPrimitiveContext(): InteractionContextValue {\n const value = useContext(InteractionContext);\n if (!value) {\n throw new Error(\n \"Interaction primitives must be rendered inside <Interaction.Root>.\",\n );\n }\n return value;\n}\n\n/**\n * Live draft value for the active interaction's card-target input, resolved\n * from the surrounding `<Interaction.Root>`. Returns the selected card-id array\n * for `selection: \"many\"` inputs and the single id for `selection: \"one\"`.\n * Returns `undefined` when there is no interaction context or no card-target\n * input (so it is safe to render outside a root). Reactive: `handle.values`\n * updates as the draft changes. Backs the card surface `slot.card.Value`.\n */\nexport function useResolvedCardTargetValue(): unknown {\n const context = useContext(InteractionContext);\n const descriptor = context?.descriptor;\n const handle = context?.handle;\n if (!descriptor || !handle) return undefined;\n const cardInput = descriptor.inputs.find(\n (input) =>\n isTargetDomain(input.domain) && input.domain.type === \"cardTarget\",\n );\n if (!cardInput) return undefined;\n return (handle.values as Record<string, unknown>)[cardInput.key];\n}\n\nfunction useInteractionDescriptor(interaction: string) {\n return usePluginState((state) =>\n state.gameplay.availableInteractions.find(\n (descriptor) =>\n descriptor.interactionKey === interaction ||\n descriptor.interactionId === interaction,\n ),\n );\n}\n\nexport interface InteractionRootProps<\n Interaction extends string = InteractionKey,\n> {\n interaction: Interaction;\n children: ReactNode;\n unavailable?: \"render\" | \"hide\";\n}\n\nfunction ResolvedInteractionRoot({\n interaction,\n descriptor,\n children,\n}: {\n interaction: string;\n descriptor: InteractionDescriptor;\n children: ReactNode;\n}) {\n const handle = useInteractionHandle(descriptor);\n const value = useMemo<InteractionContextValue>(\n () => ({ interaction, descriptor, handle }),\n [descriptor, handle, interaction],\n );\n return (\n <InteractionContext.Provider value={value}>\n {children}\n </InteractionContext.Provider>\n );\n}\n\nexport function InteractionRoot<Interaction extends string = InteractionKey>({\n interaction,\n children,\n unavailable = \"render\",\n}: InteractionRootProps<Interaction>) {\n const descriptor = useInteractionDescriptor(interaction);\n if (!descriptor) {\n if (unavailable === \"hide\") return null;\n return (\n <InteractionContext.Provider\n value={{\n interaction,\n descriptor: null,\n handle: null,\n }}\n >\n {children}\n </InteractionContext.Provider>\n );\n }\n if (!isInteractionAvailable(descriptor) && unavailable === \"hide\") {\n return null;\n }\n return (\n <ResolvedInteractionRoot interaction={interaction} descriptor={descriptor}>\n {children}\n </ResolvedInteractionRoot>\n );\n}\n\nexport type InteractionDialogState = DialogLifecycleState;\n\nexport interface InteractionDialogRenderState<\n Interaction extends string = InteractionKey,\n> {\n interaction: Interaction;\n state: InteractionDialogState;\n open: boolean;\n minimized: boolean;\n dismissed: boolean;\n setOpen: (open: boolean) => void;\n restore: () => void;\n minimize: () => void;\n dismiss: () => void;\n}\n\nexport interface InteractionDialogProps<\n Interaction extends string = InteractionKey,\n> {\n defaultOpen?: boolean;\n onStateChange?: (state: InteractionDialogState) => void;\n children: (state: InteractionDialogRenderState<Interaction>) => ReactNode;\n}\n\nexport function InteractionDialog<Interaction extends string = InteractionKey>({\n defaultOpen = false,\n onStateChange,\n children,\n}: InteractionDialogProps<Interaction>) {\n const { interaction } = useInteractionPrimitiveContext();\n const pendingInteractionKey = usePendingInteractionKey();\n const pendingInteractionRevision = usePendingInteractionRevision();\n const lifecycle = useDialogLifecycle({ defaultOpen, onStateChange });\n const restoredRevisionRef = useRef<number | null>(null);\n useEffect(() => {\n if (\n pendingInteractionKey === interaction &&\n restoredRevisionRef.current !== pendingInteractionRevision\n ) {\n restoredRevisionRef.current = pendingInteractionRevision;\n lifecycle.restore();\n }\n }, [\n interaction,\n lifecycle,\n pendingInteractionKey,\n pendingInteractionRevision,\n ]);\n const renderState = useMemo<InteractionDialogRenderState<Interaction>>(\n () => ({\n interaction: interaction as Interaction,\n ...lifecycle,\n }),\n [interaction, lifecycle],\n );\n return <>{children(renderState)}</>;\n}\n\nexport interface InteractionSwitchRenderState<\n Interaction extends string = InteractionKey,\n> {\n interaction: Interaction;\n descriptor: InteractionDescriptor<Interaction>;\n}\n\nexport type InteractionSwitchRouteMap<\n Interaction extends string = InteractionKey,\n> = {\n [Key in Interaction]?: (\n state: InteractionSwitchRenderState<Key>,\n ) => ReactNode;\n};\n\nexport interface InteractionRoute {\n readonly collect: Record<string, unknown>;\n}\n\nexport type InteractionRoutesMap<Interaction extends string = InteractionKey> =\n {\n [Key in Interaction]: InteractionRoute;\n };\n\nexport interface InteractionSwitchProps<\n Interaction extends string = InteractionKey,\n> {\n interaction?: Interaction;\n routes: InteractionSwitchRouteMap<Interaction>;\n fallback?: ReactNode;\n}\n\nexport function InteractionSwitch<Interaction extends string = InteractionKey>({\n interaction,\n routes,\n fallback = null,\n}: InteractionSwitchProps<Interaction>) {\n const pendingInteractionKey = usePendingInteractionKey();\n const descriptors = usePluginState(\n (state) => state.gameplay.availableInteractions,\n );\n const routedInteraction = interaction ?? pendingInteractionKey;\n const descriptor = routedInteraction\n ? descriptors.find(\n (candidate) => candidate.interactionKey === routedInteraction,\n )\n : undefined;\n if (!descriptor) return <>{fallback}</>;\n const route =\n routes[descriptor.interactionKey as keyof typeof routes] ?? null;\n if (!route) return <>{fallback}</>;\n const typedInteraction = descriptor.interactionKey as Interaction;\n return (\n <InteractionRoot interaction={typedInteraction}>\n {route({\n interaction: typedInteraction,\n descriptor: descriptor as InteractionDescriptor<Interaction>,\n })}\n </InteractionRoot>\n );\n}\n\nexport interface InteractionRoutesProps<\n Interaction extends string = InteractionKey,\n> {\n routes: InteractionRoutesMap<Interaction>;\n fallback?: ReactNode;\n includeUnavailable?: boolean | null;\n}\n\nconst warnedInteractionRouteIssues = new Set<string>();\n\nfunction warnInteractionRouteIssue(message: string) {\n if (warnedInteractionRouteIssues.has(message)) return;\n warnedInteractionRouteIssues.add(message);\n console.warn(message);\n}\n\nexport function InteractionRoutes<Interaction extends string = InteractionKey>({\n routes,\n fallback = null,\n includeUnavailable = false,\n}: InteractionRoutesProps<Interaction>) {\n const descriptors = usePluginState(\n (state) => state.gameplay.availableInteractions,\n );\n if (descriptors.length === 0) return <>{fallback}</>;\n const routedDescriptors = descriptors\n .filter(\n (descriptor) => includeUnavailable || isInteractionAvailable(descriptor),\n )\n .map((descriptor) => {\n const interaction = descriptor.interactionKey as Interaction;\n const route = routes[interaction as keyof typeof routes];\n if (!route) {\n warnInteractionRouteIssue(\n `[dreamboard] Interaction.Routes is missing a collector route for \"${descriptor.interactionKey}\". Declare the interaction in routes so input collection stays explicit.`,\n );\n return null;\n }\n const missingInputs = descriptor.inputs\n .map((input) => input.key)\n .filter((input) => !(input in route.collect));\n if (missingInputs.length > 0) {\n warnInteractionRouteIssue(\n `[dreamboard] Interaction.Routes route \"${descriptor.interactionKey}\" is missing collectors for: ${missingInputs.join(\n \", \",\n )}.`,\n );\n }\n return descriptor;\n });\n if (routedDescriptors.length === 0) return <>{fallback}</>;\n return null;\n}\n\nexport type InteractionPartProps = PrimitiveCommonProps &\n HTMLAttributes<HTMLElement>;\n\nexport function InteractionLabel({ children, ...props }: InteractionPartProps) {\n const { descriptor, interaction } = useInteractionPrimitiveContext();\n return renderPrimitive(\"span\", {\n ...props,\n \"data-dreamboard-interaction-label\": \"\",\n children:\n children ??\n (descriptor\n ? interactionLabel(descriptor)\n : humanizeInteraction(interaction)),\n });\n}\n\nexport function InteractionDescription({\n children,\n ...props\n}: InteractionPartProps) {\n const content = children;\n if (!content) return null;\n return renderPrimitive(\"span\", {\n ...props,\n \"data-dreamboard-interaction-description\": \"\",\n children: content,\n });\n}\n\nexport function InteractionUnavailableMessage({\n children,\n ...props\n}: InteractionPartProps) {\n const { descriptor, handle } = useInteractionPrimitiveContext();\n const reason =\n children ??\n handle?.unavailableReason ??\n interactionUnavailableReason(descriptor);\n if (!reason) return null;\n return renderPrimitive(\"span\", {\n ...props,\n \"data-dreamboard-interaction-unavailable\": \"\",\n children: reason,\n });\n}\n\nexport function InteractionValidationMessage({\n children,\n ...props\n}: InteractionPartProps) {\n const { handle } = useInteractionPrimitiveContext();\n const validation = handle?.validateDraft();\n const message =\n children ??\n validation?.formErrors[0] ??\n Object.values(validation?.fieldErrors ?? {})[0]?.[0] ??\n (validation?.missing[0]\n ? `${String(validation.missing[0])} is required.`\n : null);\n if (!message) return null;\n return renderPrimitive(\"span\", {\n ...props,\n \"data-dreamboard-interaction-validation\": \"\",\n children: message,\n });\n}\n\nexport type InteractionTriggerProps = PrimitiveCommonProps &\n ButtonHTMLAttributes<HTMLButtonElement>;\n\nexport function InteractionTrigger({\n disabled,\n onClick,\n ...props\n}: InteractionTriggerProps) {\n const { descriptor, handle } = useInteractionPrimitiveContext();\n const available = isInteractionAvailable(descriptor);\n const isDisabled = disabled === true || !available;\n return renderPrimitive(\"button\", {\n type: \"button\",\n ...props,\n disabled: isDisabled,\n \"aria-disabled\": isDisabled,\n \"data-dreamboard-interaction-trigger\": \"\",\n \"data-interaction-id\": descriptor?.interactionId,\n \"data-interaction-key\": descriptor?.interactionKey,\n \"data-available\": available,\n \"data-disabled\": isDisabled || undefined,\n \"data-state\": handle?.isArmed ? \"armed\" : \"idle\",\n onClick: composeEventHandlers(onClick, () => {\n handle?.arm();\n }),\n });\n}\n\nexport interface InteractionStateSnapshot<\n Params extends InteractionParamsShape = InteractionParamsShape,\n DefaultedKeys extends keyof Params & string = never,\n> {\n interaction: string;\n descriptor: InteractionDescriptor;\n handle: InteractionHandle<Params, DefaultedKeys>;\n draft: InteractionHandle<Params, DefaultedKeys>[\"draft\"];\n values: InteractionHandle<Params, DefaultedKeys>[\"values\"];\n status: InteractionHandle<Params, DefaultedKeys>[\"status\"];\n available: boolean;\n isReady: boolean;\n isArmed: boolean;\n inputKeys: readonly string[];\n missingInputs: readonly string[];\n readyFrontier: readonly string[];\n blockedInputs: readonly string[];\n hasInputs: boolean;\n}\n\nexport interface InteractionStateProps<\n Params extends InteractionParamsShape = InteractionParamsShape,\n DefaultedKeys extends keyof Params & string = never,\n> {\n unavailable: ReactNode;\n children: (\n state: InteractionStateSnapshot<Params, DefaultedKeys>,\n ) => ReactNode;\n}\n\nexport function InteractionState<\n Params extends InteractionParamsShape = InteractionParamsShape,\n DefaultedKeys extends keyof Params & string = never,\n>({ children, unavailable }: InteractionStateProps<Params, DefaultedKeys>) {\n const { interaction, descriptor, handle } = useInteractionPrimitiveContext();\n const store = useInteractionUiStore();\n if (!descriptor || !handle) {\n return <>{unavailable}</>;\n }\n const typedHandle = castInteractionHandle<Params, DefaultedKeys>(handle);\n const liveDraft = castInteractionDraft<Params, DefaultedKeys>(\n store.getDraft(descriptor.interactionKey),\n );\n const inputKeys = descriptor.inputs.map((input) => input.key);\n const readiness = getInteractionDraftReadiness(descriptor, liveDraft);\n return (\n <>\n {children({\n interaction,\n descriptor,\n handle: typedHandle,\n draft: liveDraft,\n values: typedHandle.values,\n status: typedHandle.status,\n available: typedHandle.available,\n isReady: readiness.ready,\n isArmed: typedHandle.isArmed,\n inputKeys,\n missingInputs: readiness.missingInputs,\n readyFrontier: readiness.readyFrontier,\n blockedInputs: readiness.blockedInputs,\n hasInputs: inputKeys.length > 0,\n })}\n </>\n );\n}\n\nexport type InteractionFormPrimitiveProps<\n Params extends InteractionParamsShape = InteractionParamsShape,\n DefaultedKeys extends keyof Params & string = never,\n> = BoundInteractionFormProps<Params, DefaultedKeys>;\n\nexport function InteractionFormPrimitive<\n Params extends InteractionParamsShape = InteractionParamsShape,\n DefaultedKeys extends keyof Params & string = never,\n>(props: InteractionFormPrimitiveProps<Params, DefaultedKeys>) {\n const { descriptor, handle } = useInteractionPrimitiveContext();\n if (!descriptor || !handle) return null;\n return (\n <BoundInteractionForm<Params, DefaultedKeys>\n descriptor={descriptor}\n handle={handle}\n {...props}\n />\n );\n}\n\nexport type InteractionFieldPrimitiveProps<\n Params extends InteractionParamsShape = InteractionParamsShape,\n Input extends keyof Params & string = keyof Params & string,\n> = Omit<\n BaseInteractionFieldProps<Params, Input>,\n \"descriptor\" | \"handle\" | \"inputKey\"\n> & {\n input: Input;\n};\n\nexport function InteractionFieldPrimitive<\n Params extends InteractionParamsShape = InteractionParamsShape,\n Input extends keyof Params & string = keyof Params & string,\n>({ input, ...props }: InteractionFieldPrimitiveProps<Params, Input>) {\n const { descriptor, handle } = useInteractionPrimitiveContext();\n if (!descriptor || !handle) return null;\n return (\n <BaseInteractionField<Params, Input>\n descriptor={descriptor}\n handle={castInteractionHandle<Params>(handle)}\n inputKey={input}\n {...props}\n />\n );\n}\n\nexport type InteractionSubmitProps = PrimitiveCommonProps &\n ButtonHTMLAttributes<HTMLButtonElement> & {\n params?:\n | InteractionParamsShape\n | (() => InteractionParamsShape | null | undefined);\n onSubmitSuccess?: InteractionSubmitCallbacks[\"onSubmitSuccess\"];\n onSubmitError?: InteractionSubmitCallbacks[\"onSubmitError\"];\n };\n\nexport function InteractionSubmit({\n disabled,\n onClick,\n params,\n onSubmitSuccess,\n onSubmitError,\n ...props\n}: InteractionSubmitProps) {\n const { descriptor, handle } = useInteractionPrimitiveContext();\n const gameActionError = useGameActionError();\n const isSubmitting = handle?.status === \"submitting\";\n const hasExplicitParams = params !== undefined;\n const available = isInteractionAvailable(descriptor);\n const isDisabled =\n disabled === true ||\n !available ||\n (!hasExplicitParams && !handle?.isReady) ||\n isSubmitting;\n return renderPrimitive(\"button\", {\n type: \"button\",\n ...props,\n disabled: isDisabled,\n \"aria-disabled\": isDisabled,\n \"data-dreamboard-interaction-submit\": \"\",\n \"data-interaction-id\": descriptor?.interactionId,\n \"data-interaction-key\": descriptor?.interactionKey,\n \"data-available\": available,\n \"data-disabled\": isDisabled || undefined,\n \"data-ready\": handle?.isReady ?? false,\n \"data-has-inputs\": descriptor ? descriptor.inputs.length > 0 : undefined,\n \"data-input-count\": descriptor?.inputs.length,\n \"data-submitting\": isSubmitting || undefined,\n \"data-state\": handle?.status ?? \"unavailable\",\n onClick: composeEventHandlers(onClick, () => {\n if (isDisabled || !handle) return;\n const resolvedParams = typeof params === \"function\" ? params() : params;\n if (resolvedParams === null || resolvedParams === undefined) {\n void submitInteractionDraft(handle, {\n onSubmitSuccess,\n onSubmitError: onSubmitError ?? gameActionError ?? undefined,\n });\n return;\n }\n void submitInteractionParams(handle, resolvedParams, {\n onSubmitSuccess,\n onSubmitError: onSubmitError ?? gameActionError ?? undefined,\n });\n }),\n });\n}\n\nexport type InteractionInputProps = PrimitiveCommonProps &\n Omit<InputHTMLAttributes<HTMLInputElement>, \"name\"> & {\n name: string;\n parse?: (value: string) => unknown;\n };\n\nexport function InteractionInput({\n name,\n parse,\n onChange,\n disabled,\n ...props\n}: InteractionInputProps) {\n const { descriptor, handle } = useInteractionPrimitiveContext();\n const value = handle?.draft[name];\n const isDisabled = disabled === true || !isInteractionAvailable(descriptor);\n return renderPrimitive(\"input\", {\n ...props,\n name,\n disabled: isDisabled,\n \"aria-disabled\": isDisabled,\n \"data-dreamboard-interaction-input\": \"\",\n \"data-input-name\": name,\n \"data-disabled\": isDisabled || undefined,\n \"data-selected\": value !== undefined || undefined,\n onChange: composeEventHandlers(onChange, (event) => {\n const target = event.currentTarget;\n handle?.setInput(name, parse ? parse(target.value) : target.value);\n }),\n });\n}\n\nexport type InteractionCardInputProps<\n Input extends string = InteractionInputKey,\n> = PrimitiveCommonProps &\n Omit<ButtonHTMLAttributes<HTMLButtonElement>, \"children\"> & {\n input: Input;\n unsafeCardId?: string;\n selected?: boolean;\n onSelectedChange?: (selected: boolean) => void;\n children?:\n | ReactNode\n | ((state: InteractionCardInputRenderState) => ReactNode);\n };\n\nexport interface InteractionCardInputRenderState {\n cardId: string | undefined;\n zone: string | undefined;\n selected: boolean;\n disabled: boolean;\n eligible: boolean;\n targetValid: boolean;\n selectable: boolean;\n cardAvailable: boolean;\n invalid: boolean;\n}\n\nexport function InteractionCardInput<\n Input extends string = InteractionInputKey,\n>({\n input,\n unsafeCardId,\n selected,\n onSelectedChange,\n onClick,\n disabled,\n children,\n ...props\n}: InteractionCardInputProps<Input>) {\n const { descriptor, handle } = useInteractionPrimitiveContext();\n const store = useInteractionUiStore();\n const zoneCard = useZoneCardContext();\n const zoneContext = useOptionalZonePrimitiveContext();\n const cardId = zoneCard?.cardId ?? unsafeCardId;\n const validationZone = zoneCard?.zone ?? zoneContext?.zone;\n const zoneSnapshot = usePluginState((state) =>\n validationZone ? state.gameplay.zones[validationZone] : undefined,\n );\n const cardDescriptor = usePluginState((state) => {\n if (!cardId || !validationZone) return undefined;\n return state.gameplay.zones[validationZone]?.playableByCardId[cardId]?.find(\n (candidate) =>\n candidate.interactionKey === descriptor?.interactionKey &&\n candidate.inputs.some((candidateInput) => candidateInput.key === input),\n );\n });\n const inputDescriptor = descriptor\n ? inputByKey(descriptor, input)\n : undefined;\n const targetInvalidReason = cardTargetInvalidReason({\n cardDescriptor,\n cardId,\n inputDescriptor,\n unsafeCardId,\n validationZone,\n zoneCard,\n zoneSnapshot,\n });\n const isTargetValid = targetInvalidReason === undefined;\n throwCardInputDevMismatch({\n cardId,\n targetInvalidReason,\n unsafeCardId,\n validationZone,\n zoneCard,\n });\n const liveDraft = descriptor ? store.getDraft(descriptor.interactionKey) : {};\n const currentValue =\n liveDraft[input] ?? handle?.draft[input] ?? handle?.values[input];\n const selection = isTargetDomain(inputDescriptor?.domain)\n ? inputDescriptor.domain.selection\n : undefined;\n const selectedByDraft =\n selection?.mode === \"many\"\n ? Array.isArray(currentValue) &&\n currentValue.map((item) => String(item)).includes(String(cardId))\n : currentValue !== undefined &&\n cardId !== undefined &&\n String(currentValue) === String(cardId);\n const isSelected = selected ?? selectedByDraft;\n const descriptorAvailable = isInteractionAvailable(descriptor);\n const cardDescriptorAvailable =\n cardDescriptor === undefined\n ? undefined\n : isInteractionAvailable(cardDescriptor);\n const isCardAvailable =\n cardDescriptorAvailable ?? (isTargetValid && descriptorAvailable);\n const cardUnavailableReason =\n interactionUnavailableReason(cardDescriptor) ??\n (!descriptorAvailable\n ? (interactionUnavailableReason(descriptor) ?? \"interaction-unavailable\")\n : undefined);\n const isSelectable =\n cardId !== undefined &&\n inputDescriptor !== undefined &&\n isManyTargetSelectable(inputDescriptor, currentValue, cardId);\n const validation = handle?.validateDraft();\n const fieldErrors = validation?.fieldErrors[input] ?? [];\n const isInvalid = fieldErrors.length > 0;\n const isDisabled =\n disabled === true ||\n !descriptorAvailable ||\n !cardId ||\n !isTargetValid ||\n !isCardAvailable ||\n !isSelectable ||\n !handle;\n\n const activateCardInput = useCallback(() => {\n if (isDisabled || !descriptor || !cardId || !handle || !inputDescriptor) {\n return;\n }\n const { params, readiness } = routeCardInputIntent(store, descriptor, {\n cardInputKey: input,\n cardId,\n });\n const hasMissingSurfaceTarget = readiness.readyFrontier.some((key) => {\n const candidate = inputByKey(descriptor, key);\n return (\n candidate !== undefined &&\n isBoardTargetDomain(candidate.domain) &&\n candidate.domain.selection?.mode !== \"many\"\n );\n });\n const hasMissingFormInput = readiness.readyFrontier.some((key) => {\n const candidate = inputByKey(descriptor, key);\n return (\n candidate !== undefined &&\n (!isTargetDomain(candidate.domain) ||\n candidate.domain.selection?.mode === \"many\")\n );\n });\n const hasFieldErrors = hasInteractionFieldErrors(readiness.fieldErrors);\n if (shouldRouteInteractionPending(descriptor, readiness)) {\n markInteractionPending(store, descriptor);\n store.setPendingInteraction(\n !hasMissingSurfaceTarget && (hasMissingFormInput || hasFieldErrors)\n ? descriptor.interactionKey\n : null,\n );\n }\n onSelectedChange?.(\n selection?.mode === \"many\"\n ? Array.isArray(params[input]) && params[input].includes(cardId)\n : true,\n );\n }, [\n cardId,\n descriptor,\n handle,\n input,\n inputDescriptor,\n isDisabled,\n onSelectedChange,\n selection,\n store,\n ]);\n\n const renderState: InteractionCardInputRenderState = {\n cardId,\n zone: validationZone,\n selected: isSelected,\n disabled: isDisabled,\n eligible: isTargetValid && isCardAvailable,\n targetValid: isTargetValid,\n selectable: isSelectable,\n cardAvailable: isCardAvailable,\n invalid: isInvalid,\n };\n const renderedChildren =\n typeof children === \"function\" ? children(renderState) : children;\n\n return renderPrimitive(\"button\", {\n type: \"button\",\n ...props,\n children: renderedChildren,\n disabled: isDisabled,\n \"aria-disabled\": isDisabled,\n \"aria-pressed\": isSelected,\n \"data-dreamboard-interaction-card-input\": \"\",\n \"data-input-name\": input,\n \"data-card-id\": cardId,\n \"data-zone\": validationZone,\n \"data-selected\": isSelected || undefined,\n \"data-eligible\": isTargetValid && isCardAvailable,\n \"data-target-valid\": isTargetValid,\n \"data-target-invalid-reason\": targetInvalidReason,\n \"data-selectable\": isSelectable,\n \"data-card-available\": isCardAvailable,\n \"data-card-unavailable-reason\": cardUnavailableReason,\n \"data-invalid\": isInvalid || undefined,\n \"data-disabled\": isDisabled || undefined,\n \"data-missing-resource\": cardId ? undefined : true,\n onClick: composeEventHandlers(onClick, () => {\n activateCardInput();\n }),\n });\n}\n\ntype CardTargetInvalidReason =\n | \"missing-card\"\n | \"wrong-zone\"\n | \"not-in-zone\"\n | \"not-top-card\"\n | \"not-in-domain\";\n\nfunction cardTargetInvalidReason({\n cardDescriptor,\n cardId,\n inputDescriptor,\n unsafeCardId,\n validationZone,\n zoneCard,\n zoneSnapshot,\n}: {\n cardDescriptor: InteractionDescriptor | undefined;\n cardId: string | undefined;\n inputDescriptor: InteractionInputDescriptor | undefined;\n unsafeCardId: string | undefined;\n validationZone: string | undefined;\n zoneCard: ReturnType<typeof useZoneCardContext>;\n zoneSnapshot: ZoneHandlesSnapshot | undefined;\n}): CardTargetInvalidReason | undefined {\n if (!cardId) return \"missing-card\";\n if (inputDescriptor?.domain.type !== \"cardTarget\") {\n return \"not-in-domain\";\n }\n if (zoneCard && unsafeCardId && unsafeCardId !== zoneCard.cardId) {\n return \"wrong-zone\";\n }\n if (\n validationZone &&\n zoneSnapshot &&\n !zoneSnapshot.cardIds.includes(cardId)\n ) {\n return \"not-in-zone\";\n }\n if (\n validationZone &&\n inputDescriptor.domain.zoneIds &&\n !inputDescriptor.domain.zoneIds.includes(validationZone)\n ) {\n return \"wrong-zone\";\n }\n if (validationZone && !cardDescriptor) {\n return zoneSnapshot?.cardIds[0] !== cardId\n ? \"not-top-card\"\n : \"not-in-domain\";\n }\n if (\n !zoneCard &&\n isResolvedTargetDomain(inputDescriptor.domain) &&\n !inputDescriptor.domain.eligibleTargets.includes(cardId)\n ) {\n return \"not-in-domain\";\n }\n return undefined;\n}\n\nfunction throwCardInputDevMismatch({\n cardId,\n targetInvalidReason,\n unsafeCardId,\n validationZone,\n zoneCard,\n}: {\n cardId: string | undefined;\n targetInvalidReason: CardTargetInvalidReason | undefined;\n unsafeCardId: string | undefined;\n validationZone: string | undefined;\n zoneCard: ReturnType<typeof useZoneCardContext>;\n}) {\n if (!isDevelopmentRuntime() || !validationZone) return;\n if (zoneCard && unsafeCardId && unsafeCardId !== zoneCard.cardId) {\n throw new Error(\n `Interaction.CardInput unsafeCardId '${unsafeCardId}' does not match surrounding Zone.Item card '${zoneCard.cardId}'.`,\n );\n }\n if (targetInvalidReason === \"not-in-zone\" && cardId) {\n throw new Error(\n `Interaction.CardInput card '${cardId}' is not present in surrounding zone '${validationZone}'.`,\n );\n }\n}\n\nfunction isDevelopmentRuntime(): boolean {\n const processLike = (\n globalThis as {\n process?: { env?: { NODE_ENV?: string } };\n }\n ).process;\n return processLike?.env?.NODE_ENV !== \"production\";\n}\n\nexport const Interaction = {\n Root: InteractionRoot,\n State: InteractionState,\n Switch: InteractionSwitch,\n Routes: InteractionRoutes,\n Dialog: InteractionDialog,\n Trigger: InteractionTrigger,\n Label: InteractionLabel,\n Description: InteractionDescription,\n UnavailableMessage: InteractionUnavailableMessage,\n ValidationMessage: InteractionValidationMessage,\n Input: InteractionInput,\n Field: InteractionFieldPrimitive,\n CardInput: InteractionCardInput,\n Form: InteractionFormPrimitive,\n Submit: InteractionSubmit,\n};\n","import { useCallback, useEffect, useMemo, useRef } from \"react\";\nimport {\n useArmedInteraction,\n useInteractionDraft,\n useInteractionSubmitting,\n useInteractionUiStore,\n} from \"../context/InteractionDraftContext.js\";\nimport { useClientParamSchema } from \"../context/ClientParamSchemaContext.js\";\nimport { usePluginState } from \"../context/PluginStateContext.js\";\nimport { usePluginSession } from \"../context/PluginSessionContext.js\";\nimport { useRuntimeContext } from \"../context/RuntimeContext.js\";\nimport {\n ValidationError,\n validationErrorFromUnknown,\n} from \"../errors/ValidationError.js\";\nimport type { InteractionDescriptor } from \"../types/plugin-state.js\";\nimport {\n applyInteractionInputDefaults,\n hasInteractionFieldErrors,\n interactionArmScope,\n interactionInputKeys,\n mergeInteractionFieldErrors,\n validateInteractionInputDomains,\n} from \"../utils/interaction-inputs.js\";\nimport {\n applyInteractionDraftMutation,\n claimInteractionSubmit,\n clearInteractionRoute,\n getInteractionDraftReadiness,\n shouldAutoSubmitInteraction,\n} from \"../utils/interaction-router.js\";\nimport {\n interactionUnavailableReason,\n isInteractionAvailable,\n} from \"../utils/interaction-status.js\";\n\n/**\n * Anything that can be used as a submit params object. Subset of TS\n * objects so generic defaults and `keyof Params & string` hold.\n */\nexport type InteractionParamsShape = Record<string, unknown>;\n\nexport type InteractionHandleStatus = \"open\" | \"submitting\" | \"submitted\";\n\nexport type DraftValidation<\n Params extends InteractionParamsShape = InteractionParamsShape,\n> =\n | {\n ok: true;\n params: Params;\n fieldErrors: Partial<Record<keyof Params & string, readonly string[]>>;\n formErrors: readonly string[];\n missing: ReadonlyArray<keyof Params & string>;\n }\n | {\n ok: false;\n fieldErrors: Partial<Record<keyof Params & string, readonly string[]>>;\n formErrors: readonly string[];\n missing: ReadonlyArray<keyof Params & string>;\n };\n\n/**\n * Bound handle around an {@link InteractionDescriptor}. Surfaces call into\n * this hook to submit/validate an interaction, track draft input state for\n * multi-step prompts, and arm/disarm themselves on a surface.\n *\n * Availability flags are mirrored from the authoritative descriptor; UI\n * MUST NOT recompute eligibility locally.\n *\n * When the surrounding workspace knows the concrete params shape (e.g.\n * obtained from the generated `InteractionParamsOf<Id>` alias), parameterise\n * this handle on `Params` so `submit`, `draft`, and `setInput` are all\n * statically typed. The default `Record<string, unknown>` preserves the\n * loosely-typed fallback for generic infrastructure.\n */\nexport interface InteractionHandle<\n Params extends InteractionParamsShape = InteractionParamsShape,\n DefaultedKeys extends keyof Params & string = never,\n> {\n descriptor: InteractionDescriptor;\n /** Draft commit policy projected by the reducer. */\n commit: InteractionDescriptor[\"commit\"];\n /**\n * Submit the interaction. When `params` is omitted the current draft (as\n * mutated by {@link InteractionHandle.setInput}) is used instead, which is\n * the common case for multi-input prompts.\n */\n submit: (params?: Params) => Promise<void>;\n /** Run server validation using `params` (or the current draft by default). */\n validate: (params?: Params) => Promise<void>;\n /** Run local generated client-schema validation against the current draft. */\n validateDraft: () => DraftValidation<Params>;\n /** Run server validation against the current draft. */\n validateDraftServer: () => Promise<void>;\n /**\n * Validate the current draft locally, submit parsed params, then clear the\n * draft only when submission succeeds.\n */\n submitDraft: () => Promise<void>;\n /** Derived from `descriptor.availability`. */\n available: boolean;\n /** Derived from `descriptor.availability`. */\n unavailableReason?: string;\n /** Local/authoritative progress for this interaction. */\n status: InteractionHandleStatus;\n\n // --- Draft state --------------------------------------------------------\n\n /** Live draft values for this interaction. Empty object when unset. */\n draft: Readonly<Partial<Params>>;\n /**\n * Draft values with authored input defaults applied. Fields with declared\n * defaults are typed as present; other draft fields remain partial.\n */\n values: Readonly<Partial<Params> & Pick<Params, DefaultedKeys>>;\n /** Set a single input on the draft. */\n setInput: <K extends keyof Params & string>(key: K, value: Params[K]) => void;\n /** Clear a single input (or the whole draft when `key` is omitted). */\n clearInput: (key?: keyof Params & string) => void;\n /**\n * True when every key declared on `descriptor.inputs` has a value in\n * the draft. Falls back to `true` when the descriptor declares no inputs.\n */\n isReady: boolean;\n /**\n * True when this interaction is the currently armed one on its surface.\n * Armed interactions are the ones that board primitives use\n * to highlight eligible targets and route clicks.\n */\n isArmed: boolean;\n /** Arm this interaction on its surface (disarms any previously armed). */\n arm: () => void;\n /** Disarm this interaction (if it was armed). */\n disarm: () => void;\n}\n\n/**\n * Bind an {@link InteractionDescriptor} to submit/validate helpers plus\n * draft + arming state. Use this from any surface; draft state is shared\n * across components through {@link InteractionUiProvider}, which\n * `PluginRuntime` auto-mounts.\n *\n * Example:\n * ```tsx\n * const handle = useInteractionHandle(placeThing);\n * handle.setInput(\"cardId\", card.id);\n * handle.setInput(\"ringId\", ring.id);\n * if (handle.isReady) await handle.submit();\n * ```\n */\nexport function useInteractionHandle<\n Params extends InteractionParamsShape = InteractionParamsShape,\n DefaultedKeys extends keyof Params & string = never,\n>(descriptor: InteractionDescriptor): InteractionHandle<Params, DefaultedKeys> {\n const runtime = useRuntimeContext();\n const { controllingPlayerId } = usePluginSession();\n const store = useInteractionUiStore();\n const submittingRef = useRef(false);\n const autoSubmitSignatureRef = useRef<string | null>(null);\n const simultaneousPhase = usePluginState(\n (state) => state.gameplay.simultaneousPhase,\n );\n\n const { interactionId, interactionKey, phaseName } = descriptor;\n const armScope = interactionArmScope(descriptor);\n const inputKeys = useMemo(\n () => interactionInputKeys(descriptor),\n [descriptor],\n );\n const paramsSchema = useClientParamSchema(phaseName, interactionId);\n const draft = useInteractionDraft(interactionKey) as Readonly<\n Partial<Params>\n >;\n const values = useMemo(\n () =>\n applyInteractionInputDefaults<Params>(descriptor, draft) as Readonly<\n Partial<Params> & Pick<Params, DefaultedKeys>\n >,\n [descriptor, draft],\n );\n const armedId = useArmedInteraction(armScope);\n const isArmed = armedId === interactionKey;\n const submitting = useInteractionSubmitting(interactionKey);\n const submitted =\n controllingPlayerId !== null &&\n simultaneousPhase?.phaseName === phaseName &&\n simultaneousPhase.interactionId === interactionId &&\n simultaneousPhase.sealedPlayerIds.includes(controllingPlayerId);\n const status: InteractionHandleStatus = submitted\n ? \"submitted\"\n : submitting\n ? \"submitting\"\n : \"open\";\n\n const isReady = useMemo(() => {\n return getInteractionDraftReadiness(\n descriptor,\n values as Record<string, unknown>,\n ).ready;\n }, [descriptor, values]);\n\n const requirePlayer = useCallback(() => {\n if (!controllingPlayerId) {\n throw new Error(\"useInteractionHandle: no controlling player available\");\n }\n return controllingPlayerId;\n }, [controllingPlayerId]);\n\n const submit = useCallback(\n async (params?: Params) => {\n if (status !== \"open\" || submittingRef.current) {\n throw new ValidationError(\n status === \"submitted\" ? \"ALREADY_SUBMITTED\" : \"SUBMITTING\",\n status === \"submitted\"\n ? \"Interaction has already been submitted.\"\n : \"Interaction submission is already in progress.\",\n );\n }\n if (!claimInteractionSubmit(store, descriptor)) {\n throw new ValidationError(\n \"SUBMITTING\",\n \"Interaction submission is already in progress.\",\n );\n }\n submittingRef.current = true;\n const finalParams = applyInteractionInputDefaults<Params>(\n descriptor,\n params ?? values,\n ) as Params;\n try {\n await runtime.submitInteraction(\n requirePlayer(),\n interactionId,\n finalParams as Record<string, unknown>,\n );\n clearInteractionRoute(store, descriptor);\n } catch (error) {\n throw validationErrorFromUnknown(error);\n } finally {\n submittingRef.current = false;\n store.setSubmitting(interactionKey, false);\n }\n },\n [\n descriptor,\n values,\n runtime,\n requirePlayer,\n interactionId,\n interactionKey,\n store,\n status,\n ],\n );\n\n const validate = useCallback(\n async (params?: Params) => {\n const finalParams = applyInteractionInputDefaults<Params>(\n descriptor,\n params ?? values,\n ) as Params;\n const result = await runtime.validateInteraction(\n requirePlayer(),\n interactionId,\n finalParams as Record<string, unknown>,\n );\n if (!result.valid) {\n throw new ValidationError(result.errorCode, result.message);\n }\n },\n [descriptor, values, runtime, requirePlayer, interactionId],\n );\n\n const validateDraft = useCallback((): DraftValidation<Params> => {\n const rawDraft = { ...values } as Record<string, unknown>;\n const required = inputKeys;\n const missing = getInteractionDraftReadiness(descriptor, rawDraft)\n .missingInputs as Array<keyof Params & string>;\n const domainFieldErrors = validateInteractionInputDomains(\n descriptor,\n rawDraft,\n ) as Partial<Record<keyof Params & string, readonly string[]>>;\n\n if (!paramsSchema) {\n if (missing.length > 0 || hasInteractionFieldErrors(domainFieldErrors)) {\n return {\n ok: false,\n fieldErrors: domainFieldErrors,\n formErrors: [],\n missing,\n };\n }\n return {\n ok: true,\n params: rawDraft as Params,\n fieldErrors: {},\n formErrors: [],\n missing: [],\n };\n }\n\n const result = paramsSchema.safeParse(rawDraft);\n if (result.success) {\n if (hasInteractionFieldErrors(domainFieldErrors)) {\n return {\n ok: false,\n fieldErrors: domainFieldErrors,\n formErrors: [],\n missing,\n };\n }\n return {\n ok: true,\n params: result.data as Params,\n fieldErrors: {},\n formErrors: [],\n missing: [],\n };\n }\n\n const fieldErrors: Partial<\n Record<keyof Params & string, readonly string[]>\n > = {};\n const formErrors: string[] = [];\n const missingSet = new Set<PropertyKey>(missing);\n for (const issue of result.error.issues) {\n const [first] = issue.path;\n if (typeof first === \"string\" && required.includes(first)) {\n if (missingSet.has(first)) continue;\n const key = first as keyof Params & string;\n fieldErrors[key] = [...(fieldErrors[key] ?? []), issue.message];\n } else {\n formErrors.push(issue.message);\n }\n }\n return {\n ok: false,\n fieldErrors: mergeInteractionFieldErrors(\n fieldErrors,\n domainFieldErrors,\n ) as Partial<Record<keyof Params & string, readonly string[]>>,\n formErrors,\n missing,\n };\n }, [descriptor, values, inputKeys, paramsSchema]);\n\n const validateDraftServer = useCallback(async () => {\n await validate({ ...values } as Params);\n }, [values, validate]);\n\n const submitDraft = useCallback(async () => {\n const validation = validateDraft();\n if (!validation.ok) {\n const message =\n validation.formErrors[0] ??\n Object.values(validation.fieldErrors).flat()[0] ??\n (validation.missing.length > 0\n ? \"Required inputs are missing\"\n : \"Draft validation failed\");\n throw new ValidationError(\"INVALID_DRAFT\", message);\n }\n await submit(validation.params);\n }, [submit, validateDraft]);\n\n useEffect(() => {\n if (!shouldAutoSubmitInteraction(descriptor)) {\n autoSubmitSignatureRef.current = null;\n return;\n }\n if (!isInteractionAvailable(descriptor) || status !== \"open\" || !isReady) {\n if (!isReady) autoSubmitSignatureRef.current = null;\n return;\n }\n const validation = validateDraft();\n if (!validation.ok) return;\n const signature = `${interactionKey}:${JSON.stringify(validation.params)}`;\n if (autoSubmitSignatureRef.current === signature) return;\n autoSubmitSignatureRef.current = signature;\n void submit(validation.params).catch(() => {\n // Runtime error channels surface the failure. Keep the draft intact and\n // suppress repeated attempts until the player changes the draft.\n });\n }, [\n descriptor.availability,\n descriptor.commit.mode,\n descriptor.inputs,\n interactionKey,\n isReady,\n status,\n submit,\n validateDraft,\n ]);\n\n const setInput = useCallback(\n <K extends keyof Params & string>(key: K, value: Params[K]) => {\n applyInteractionDraftMutation(store, descriptor, [{ key, value }]);\n },\n [store, descriptor],\n );\n\n const clearInput = useCallback(\n (key?: keyof Params & string) => {\n store.clearInput(interactionKey, key);\n },\n [store, interactionKey],\n );\n\n const arm = useCallback(() => {\n store.arm(armScope, interactionKey);\n }, [store, armScope, interactionKey]);\n\n const disarm = useCallback(() => {\n if (store.getArmed(armScope) === interactionKey) {\n store.arm(armScope, null);\n }\n }, [store, armScope, interactionKey]);\n\n return {\n descriptor,\n commit: descriptor.commit,\n available: isInteractionAvailable(descriptor),\n unavailableReason: interactionUnavailableReason(descriptor),\n status,\n submit,\n validate,\n validateDraft,\n validateDraftServer,\n submitDraft,\n draft,\n values,\n setInput,\n clearInput,\n isReady,\n isArmed,\n arm,\n disarm,\n };\n}\n","import { createContext, useContext } from \"react\";\n\nexport interface ClientParamSchema {\n safeParse: (value: unknown) =>\n | { success: true; data: Record<string, unknown> }\n | {\n success: false;\n error: {\n issues: ReadonlyArray<{\n path: readonly PropertyKey[];\n message: string;\n }>;\n };\n };\n}\n\nexport type ClientParamSchemaMap = Readonly<\n Record<string, Readonly<Record<string, ClientParamSchema>>>\n>;\n\nconst ClientParamSchemaContext = createContext<ClientParamSchemaMap>({});\n\nexport function ClientParamSchemaProvider({\n schemas,\n children,\n}: {\n schemas?: ClientParamSchemaMap;\n children: React.ReactNode;\n}) {\n return (\n <ClientParamSchemaContext.Provider value={schemas ?? {}}>\n {children}\n </ClientParamSchemaContext.Provider>\n );\n}\n\nexport function useClientParamSchema(\n phaseName: string | null | undefined,\n interactionId: string,\n): ClientParamSchema | undefined {\n const schemas = useContext(ClientParamSchemaContext);\n if (!phaseName) return undefined;\n return schemas[phaseName]?.[interactionId];\n}\n","import {\n useEffect,\n useId,\n useMemo,\n useState,\n type ButtonHTMLAttributes,\n type CSSProperties,\n type FormEvent,\n type ReactNode,\n} from \"react\";\nimport * as AccordionPrimitive from \"@radix-ui/react-accordion\";\nimport {\n Input,\n Label,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n surfaceStyle,\n useTheme,\n useThemeCssVars,\n} from \"../../ui.js\";\nimport type {\n DraftValidation,\n InteractionHandle,\n InteractionParamsShape,\n} from \"../hooks/useInteractionHandle.js\";\nimport type {\n InteractionChoiceOption,\n InteractionDescriptor,\n InteractionInputDescriptor,\n InputDomain,\n} from \"../types/plugin-state.js\";\nimport { interactionLabel } from \"../utils/interaction-labels.js\";\nimport {\n inputTargetKind,\n isResolvedTargetDomain,\n isTargetDomain,\n resolveInputDomain,\n resolveInteractionInputs,\n toggleManyValue,\n} from \"../utils/interaction-inputs.js\";\nimport { isInteractionAvailable } from \"../utils/interaction-status.js\";\nimport { useChromeSuppression, ThemedButton } from \"../../ui.js\";\n\nexport interface InteractionFieldRenderProps<\n Params extends InteractionParamsShape = InteractionParamsShape,\n Key extends keyof Params & string = keyof Params & string,\n> {\n descriptor: InteractionDescriptor;\n input: InteractionInputDescriptor & { key: Key };\n handle: InteractionHandle<Params>;\n value: Params[Key] | undefined;\n setValue: (value: Params[Key]) => void;\n clearValue: () => void;\n errors: readonly string[];\n missing: boolean;\n disabled: boolean;\n}\n\nexport type InteractionFieldRenderMap<\n Params extends InteractionParamsShape = InteractionParamsShape,\n> = Partial<{\n [K in keyof Params & string]: (\n props: InteractionFieldRenderProps<Params, K>,\n ) => ReactNode;\n}>;\n\nexport interface InteractionSlotComponentProps {\n children?: ReactNode;\n}\n\nexport type InteractionButtonSlotProps = InteractionSlotComponentProps &\n Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n \"children\" | \"disabled\" | \"type\" | \"value\"\n >;\n\nexport interface InteractionTargetSlotProps extends Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n | \"children\"\n | \"disabled\"\n | \"aria-disabled\"\n | \"aria-pressed\"\n | \"onClick\"\n | \"type\"\n | \"value\"\n> {\n value: string;\n children?: ReactNode;\n}\n\nexport interface InteractionOptionsSlotProps {\n children: (option: { value: string | null; label: string }) => ReactNode;\n}\n\nexport interface InteractionCardsSlotProps {\n children: (card: { id: string }) => ReactNode;\n}\n\nexport interface InteractionValueSlotProps {\n children: (value: unknown) => ReactNode;\n}\n\nexport interface InteractionInputSlot {\n Field: (props: InteractionSlotComponentProps) => ReactNode;\n Default: (props: InteractionSlotComponentProps) => ReactNode;\n Target: (props: InteractionTargetSlotProps) => ReactNode;\n Card: (props: InteractionTargetSlotProps) => ReactNode;\n Cards: (props: InteractionCardsSlotProps) => ReactNode;\n Options: (props: InteractionOptionsSlotProps) => ReactNode;\n Value: (props: InteractionValueSlotProps) => ReactNode;\n Label: (props: InteractionSlotComponentProps) => ReactNode;\n Message: (props: InteractionSlotComponentProps) => ReactNode;\n}\n\nexport type InteractionInputRenderMap = Record<\n string,\n (slot: InteractionInputSlot) => ReactNode\n>;\n\nexport interface InteractionSubmitSlot {\n Button: (props: InteractionButtonSlotProps) => ReactNode;\n}\n\nexport interface InteractionFieldProps<\n Params extends InteractionParamsShape = InteractionParamsShape,\n Key extends keyof Params & string = keyof Params & string,\n> {\n descriptor: InteractionDescriptor;\n inputKey: Key;\n handle: InteractionHandle<Params>;\n errors?: readonly string[];\n missing?: boolean;\n disabled?: boolean;\n render?: InteractionFieldRenderMap<Params>[Key];\n}\n\nexport interface InteractionFormProps<\n Params extends InteractionParamsShape = InteractionParamsShape,\n DefaultedKeys extends keyof Params & string = never,\n> {\n descriptor: InteractionDescriptor;\n handle: InteractionHandle<Params, DefaultedKeys>;\n fields?: ReadonlyArray<keyof Params & string>;\n hiddenFields?: ReadonlyArray<keyof Params & string>;\n renderFields?: InteractionFieldRenderMap<Params>;\n inputs?: InteractionInputRenderMap;\n submit?: (\n slot: InteractionSubmitSlot,\n descriptor: InteractionDescriptor,\n ) => ReactNode;\n title?: ReactNode;\n description?: ReactNode;\n submitLabel?: ReactNode;\n cancelLabel?: ReactNode;\n onCancel?: () => void;\n onSubmitSuccess?: () => void;\n disabled?: boolean;\n accordion?: boolean;\n defaultOpen?: boolean;\n style?: CSSProperties;\n}\n\nconst EMPTY_FIELD_ERRORS: readonly string[] = [];\n\nexport function InteractionForm<\n Params extends InteractionParamsShape = InteractionParamsShape,\n DefaultedKeys extends keyof Params & string = never,\n>({\n descriptor,\n handle,\n fields,\n hiddenFields,\n renderFields,\n inputs,\n submit: renderSubmit,\n title,\n description,\n submitLabel,\n cancelLabel = \"Cancel\",\n onCancel,\n onSubmitSuccess,\n disabled = false,\n accordion = true,\n defaultOpen = false,\n style,\n}: InteractionFormProps<Params, DefaultedKeys>) {\n const theme = useTheme();\n const fallbackLabel = interactionLabel(descriptor);\n const formId = useId();\n useChromeSuppression(formId, true);\n const [pending, setPending] = useState(false);\n const [validation, setValidation] = useState<DraftValidation<Params> | null>(\n null,\n );\n const [formError, setFormError] = useState<string | null>(null);\n const [accordionOpen, setAccordionOpen] = useState(defaultOpen);\n const hidden = useMemo(() => new Set(hiddenFields ?? []), [hiddenFields]);\n const visibleInputs = useMemo(() => {\n if (inputs) {\n const rendered = new Set(Object.keys(inputs));\n return resolveInteractionInputs(\n descriptor,\n handle.values as Readonly<Record<string, unknown>>,\n ).filter((input) => rendered.has(input.key));\n }\n const allowed = fields ? new Set(fields) : null;\n return defaultFormInputs(\n descriptor,\n handle.values as Readonly<Record<string, unknown>>,\n ).filter((input) => {\n const key = input.key as keyof Params & string;\n if (allowed && !allowed.has(key)) return false;\n return !hidden.has(key);\n });\n }, [descriptor, fields, hidden, handle.values, inputs]);\n\n const currentValidation = validation;\n const fieldErrors = (currentValidation?.fieldErrors ?? {}) as Partial<\n Record<keyof Params & string, readonly string[]>\n >;\n const missing = new Set<string>(currentValidation?.missing ?? []);\n const formErrors = [\n ...(currentValidation?.formErrors ?? []),\n ...(formError ? [formError] : []),\n ];\n const isDisabled = disabled || pending || !isInteractionAvailable(descriptor);\n const useAccordion = accordion && visibleInputs.length > 0;\n\n useEffect(() => {\n setAccordionOpen(defaultOpen);\n }, [defaultOpen, descriptor.interactionId]);\n\n const containerStyle: CSSProperties = {\n ...surfaceStyle(theme, { tone: \"card\" }),\n display: \"flex\",\n flexDirection: \"column\",\n gap: theme.space[2],\n padding: theme.space[3],\n minWidth: \"min(100%, 280px)\",\n boxSizing: \"border-box\",\n fontFamily: theme.typography.fontFamily.body,\n ...style,\n };\n\n const submit = async (event: FormEvent) => {\n event.preventDefault();\n if (isDisabled) return;\n const nextValidation = handle.validateDraft();\n setValidation(nextValidation);\n setFormError(null);\n if (!nextValidation.ok) {\n setAccordionOpen(true);\n return;\n }\n setPending(true);\n try {\n await handle.submitDraft();\n onSubmitSuccess?.();\n setAccordionOpen(defaultOpen);\n } catch (error) {\n setAccordionOpen(true);\n setFormError(\n error instanceof Error\n ? error.message\n : \"Interaction submission failed\",\n );\n } finally {\n setPending(false);\n }\n };\n\n const header = (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 2 }}>\n <strong\n style={{\n fontFamily: theme.typography.fontFamily.display,\n fontSize: theme.typography.fontSize.md,\n color: theme.semantic.text.primary,\n }}\n >\n {title ?? fallbackLabel}\n </strong>\n {description ? (\n <span\n style={{\n fontSize: theme.typography.fontSize.sm,\n color: theme.semantic.text.muted,\n }}\n >\n {description}\n </span>\n ) : null}\n </div>\n );\n\n const fieldsContent =\n visibleInputs.length > 0 ? (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: theme.space[3],\n }}\n >\n {visibleInputs.map((input) => {\n const key = input.key as keyof Params & string;\n const inputRenderer = inputs?.[key];\n return (\n <InteractionField<Params>\n key={input.key}\n descriptor={descriptor}\n inputKey={key}\n handle={handle}\n errors={fieldErrors[key] ?? []}\n missing={missing.has(key)}\n disabled={isDisabled}\n render={\n inputRenderer\n ? ({ input, errors, missing, disabled }) =>\n inputRenderer(\n createInteractionInputSlot({\n descriptor,\n input,\n handle,\n errors,\n missing,\n disabled,\n }),\n )\n : renderFields?.[key]\n }\n />\n );\n })}\n </div>\n ) : null;\n\n if (visibleInputs.length === 0 && !handle.isReady) {\n throw new Error(\n `InteractionForm '${descriptor.interactionKey}' has required inputs that cannot be rendered by the default form. Provide renderFields, select on a surface, or use a default-renderable input domain.`,\n );\n }\n\n const formErrorContent =\n formErrors.length > 0 ? (\n <div\n role=\"alert\"\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: theme.space[1],\n color: theme.semantic.intent.danger.solid,\n fontSize: theme.typography.fontSize.sm,\n }}\n >\n {formErrors.map((error) => (\n <span key={error}>{error}</span>\n ))}\n </div>\n ) : null;\n\n const actions = (\n <div\n style={{\n display: \"flex\",\n gap: theme.space[2],\n justifyContent: \"flex-end\",\n }}\n >\n {onCancel ? (\n <ThemedButton\n type=\"button\"\n variant=\"secondary\"\n size=\"sm\"\n disabled={pending}\n onClick={onCancel}\n className=\"h-9 px-3 text-sm\"\n >\n {cancelLabel}\n </ThemedButton>\n ) : null}\n {renderSubmit ? (\n renderSubmit(\n {\n Button: ({ children, ...buttonProps }) => (\n <ThemedButton\n type=\"submit\"\n variant=\"primary\"\n size=\"sm\"\n disabled={isDisabled}\n className=\"h-9 px-3 text-sm\"\n {...buttonProps}\n >\n {pending\n ? \"Submitting...\"\n : (children ?? submitLabel ?? fallbackLabel)}\n </ThemedButton>\n ),\n },\n descriptor,\n )\n ) : (\n <ThemedButton\n type=\"submit\"\n variant=\"primary\"\n size=\"sm\"\n disabled={isDisabled}\n className=\"h-9 px-3 text-sm\"\n >\n {pending ? \"Submitting...\" : (submitLabel ?? fallbackLabel)}\n </ThemedButton>\n )}\n </div>\n );\n\n const body = (\n <>\n {fieldsContent}\n {formErrorContent}\n {actions}\n </>\n );\n\n return (\n <form\n data-interaction-form\n data-interaction-id={descriptor.interactionId}\n onSubmit={(event) => void submit(event)}\n style={containerStyle}\n >\n {useAccordion ? (\n <AccordionPrimitive.Root\n type=\"single\"\n collapsible\n value={accordionOpen ? \"fields\" : undefined}\n onValueChange={(value: string) =>\n setAccordionOpen(value === \"fields\")\n }\n >\n <AccordionPrimitive.Item value=\"fields\">\n <AccordionPrimitive.Header style={{ margin: 0 }}>\n <AccordionPrimitive.Trigger\n style={{\n alignItems: \"center\",\n appearance: \"none\",\n background: \"transparent\",\n border: 0,\n color: theme.semantic.text.primary,\n cursor: \"pointer\",\n display: \"flex\",\n fontFamily: theme.typography.fontFamily.display,\n fontSize: theme.typography.fontSize.md,\n fontWeight: theme.typography.fontWeight.bold,\n justifyContent: \"space-between\",\n padding: 0,\n textAlign: \"left\",\n width: \"100%\",\n }}\n >\n <span>{title ?? fallbackLabel}</span>\n <span aria-hidden>{accordionOpen ? \"−\" : \"+\"}</span>\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n <AccordionPrimitive.Content>\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: theme.space[2],\n marginTop: theme.space[2],\n }}\n >\n {description ? (\n <span\n style={{\n fontSize: theme.typography.fontSize.sm,\n color: theme.semantic.text.muted,\n }}\n >\n {description}\n </span>\n ) : null}\n {body}\n </div>\n </AccordionPrimitive.Content>\n </AccordionPrimitive.Item>\n </AccordionPrimitive.Root>\n ) : (\n <>\n {header}\n {body}\n </>\n )}\n </form>\n );\n}\n\nfunction createInteractionInputSlot<\n Params extends InteractionParamsShape,\n Key extends keyof Params & string,\n>({\n descriptor,\n input,\n handle,\n errors,\n missing,\n disabled,\n}: {\n descriptor: InteractionDescriptor;\n input: InteractionInputDescriptor & { key: Key };\n handle: InteractionHandle<Params>;\n errors: readonly string[];\n missing: boolean;\n disabled: boolean;\n}): InteractionInputSlot {\n const value = handle.values[input.key] as Params[Key] | undefined;\n const resolvedInput = resolveInputDomain(\n input,\n handle.values as Readonly<Record<string, unknown>>,\n ) as InteractionInputDescriptor & { key: Key };\n\n const targetButton = ({\n value: targetValue,\n children,\n kind,\n ...buttonProps\n }: InteractionTargetSlotProps & { kind: \"card\" | \"target\" }) => {\n const domain = resolvedInput.domain;\n const eligible =\n isResolvedTargetDomain(domain) &&\n domain.eligibleTargets.includes(targetValue);\n const selection = isTargetDomain(domain) ? domain.selection : undefined;\n const currentValue = handle.values[input.key];\n const selected =\n selection?.mode === \"many\"\n ? Array.isArray(currentValue) &&\n currentValue.map(String).includes(targetValue)\n : currentValue !== undefined && String(currentValue) === targetValue;\n const isDisabled = disabled || !eligible;\n const dataAttribute =\n kind === \"card\"\n ? { \"data-dreamboard-interaction-card-slot\": \"\" }\n : { \"data-dreamboard-interaction-target-slot\": \"\" };\n return (\n <button\n type=\"button\"\n disabled={isDisabled}\n aria-disabled={isDisabled}\n aria-pressed={selected}\n data-input-name={input.key}\n data-target-kind={inputTargetKind(domain)}\n data-target-value={targetValue}\n data-eligible={eligible}\n data-selected={selected || undefined}\n data-disabled={isDisabled || undefined}\n {...dataAttribute}\n {...buttonProps}\n onClick={() => {\n if (isDisabled) return;\n const nextValue =\n selection?.mode === \"many\"\n ? toggleManyValue(currentValue, targetValue, selection)\n : targetValue;\n handle.setInput(input.key, nextValue as Params[Key]);\n }}\n >\n {children ?? targetValue}\n </button>\n );\n };\n\n return {\n Field: () => (\n <DefaultInteractionField\n descriptor={descriptor}\n input={resolvedInput}\n handle={handle}\n value={value}\n setValue={(next) => handle.setInput(input.key, next)}\n clearValue={() => handle.clearInput(input.key)}\n errors={errors}\n missing={missing}\n disabled={disabled}\n />\n ),\n Default: ({ children }) => {\n const hasDefault = \"defaultValue\" in input;\n const isDisabled = disabled || !hasDefault;\n return (\n <button\n type=\"button\"\n disabled={isDisabled}\n aria-disabled={isDisabled}\n data-dreamboard-interaction-default-slot=\"\"\n data-input-name={input.key}\n data-disabled={isDisabled || undefined}\n onClick={() => {\n if (isDisabled) return;\n handle.setInput(input.key, input.defaultValue as Params[Key]);\n }}\n >\n {children ?? \"Use default\"}\n </button>\n );\n },\n Target: (props) => targetButton({ ...props, kind: \"target\" }),\n Card: (props) => targetButton({ ...props, kind: \"card\" }),\n Cards: ({ children }) => {\n const domain = resolvedInput.domain;\n const targets = isResolvedTargetDomain(domain)\n ? domain.eligibleTargets\n : [];\n return <>{targets.map((id) => children({ id }))}</>;\n },\n Options: ({ children }) => {\n const domain = resolvedInput.domain;\n const choices =\n domain.type === \"choice\" || domain.type === \"choiceList\"\n ? (domain.choices ?? [])\n : [];\n return <>{choices.map((choice) => children(choice))}</>;\n },\n Value: ({ children }) => <>{children(value)}</>,\n Label: ({ children }) => <>{children ?? labelForInput(resolvedInput)}</>,\n Message: ({ children }) => {\n const message = children ?? errors[0] ?? (missing ? \"Required\" : null);\n return message ? (\n <span role=\"alert\" data-dreamboard-interaction-message-slot=\"\">\n {message}\n </span>\n ) : null;\n },\n };\n}\n\nexport function InteractionField<\n Params extends InteractionParamsShape = InteractionParamsShape,\n Key extends keyof Params & string = keyof Params & string,\n>({\n descriptor,\n inputKey,\n handle,\n errors = EMPTY_FIELD_ERRORS,\n missing = false,\n disabled = false,\n render,\n}: InteractionFieldProps<Params, Key>) {\n const input = descriptor.inputs.find(\n (candidate) => candidate.key === inputKey,\n );\n if (!input) return null;\n const typedInput = resolveInputDomain(\n input,\n handle.values as Readonly<Record<string, unknown>>,\n ) as InteractionInputDescriptor & { key: Key };\n const value = handle.values[inputKey] as Params[Key] | undefined;\n const props: InteractionFieldRenderProps<Params, Key> = {\n descriptor,\n input: typedInput,\n handle,\n value,\n setValue: (next) => handle.setInput(inputKey, next),\n clearValue: () => handle.clearInput(inputKey),\n errors,\n missing,\n disabled,\n };\n if (render) return <>{render(props)}</>;\n return <DefaultInteractionField {...props} />;\n}\n\nexport function hasDefaultInteractionFormFields(\n descriptor: Pick<InteractionDescriptor, \"inputs\">,\n): boolean {\n return defaultFormInputs(descriptor).length > 0;\n}\n\nexport function defaultFormInputs(\n descriptor: Pick<InteractionDescriptor, \"inputs\">,\n values: Readonly<Record<string, unknown>> = {},\n): InteractionInputDescriptor[] {\n return resolveInteractionInputs(descriptor, values).filter((input) => {\n switch (input.domain.type) {\n case \"choice\":\n case \"choiceList\":\n case \"resourceMap\":\n case \"boundedNumber\":\n return true;\n case \"cardTarget\":\n case \"boardTarget\":\n return input.domain.selection?.mode === \"many\";\n }\n });\n}\n\nfunction DefaultInteractionField<\n Params extends InteractionParamsShape,\n Key extends keyof Params & string,\n>(props: InteractionFieldRenderProps<Params, Key>) {\n const { input } = props;\n switch (input.domain.type) {\n case \"choice\":\n if (input.domain.selection?.mode === \"many\") {\n return (\n <ChoiceListField\n {...props}\n domain={{\n type: \"choiceList\",\n choices: input.domain.choices,\n min: input.domain.selection.min ?? 0,\n max: input.domain.selection.max,\n selection: input.domain.selection,\n }}\n />\n );\n }\n return <ChoiceField {...props} domain={input.domain} />;\n case \"choiceList\":\n return <ChoiceListField {...props} domain={input.domain} />;\n case \"resourceMap\":\n return <ResourceMapField {...props} domain={input.domain} />;\n case \"boundedNumber\":\n return <BoundedNumberField {...props} domain={input.domain} />;\n case \"cardTarget\":\n case \"boardTarget\":\n return <TargetSummaryField {...props} domain={input.domain} />;\n }\n}\n\nfunction FieldFrame({\n label,\n controlId,\n errors,\n missing,\n children,\n}: {\n label: ReactNode;\n controlId?: string;\n errors: readonly string[];\n missing: boolean;\n children: ReactNode;\n}) {\n const theme = useTheme();\n const messages = errors.length > 0 ? errors : missing ? [\"Required\"] : [];\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: theme.space[1],\n fontSize: theme.typography.fontSize.sm,\n color: theme.semantic.text.primary,\n }}\n >\n <Label\n htmlFor={controlId}\n style={{\n color: theme.semantic.text.primary,\n fontWeight: theme.typography.fontWeight.bold,\n }}\n >\n {label}\n </Label>\n {children}\n {messages.length > 0 ? (\n <span\n role=\"alert\"\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: 2,\n color: theme.semantic.intent.danger.solid,\n fontSize: theme.typography.fontSize.xs,\n }}\n >\n {messages.map((message) => (\n <span key={message}>{message}</span>\n ))}\n </span>\n ) : null}\n </div>\n );\n}\n\nfunction ChoiceOptionLabel({ choice }: { choice: InteractionChoiceOption }) {\n const theme = useTheme();\n return (\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 6,\n minWidth: 0,\n }}\n >\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 6,\n minWidth: 0,\n }}\n >\n {choice.icon ? (\n <span aria-hidden style={{ fontSize: \"1.1em\", lineHeight: 1 }}>\n {choice.icon}\n </span>\n ) : null}\n <span style={{ overflow: \"hidden\", textOverflow: \"ellipsis\" }}>\n {choice.label}\n </span>\n </span>\n {choice.badge ? (\n <span\n style={{\n borderRadius: 999,\n background: theme.semantic.surface.inset,\n color: theme.semantic.text.muted,\n fontSize: theme.typography.fontSize.xs,\n fontWeight: theme.typography.fontWeight.bold,\n lineHeight: 1,\n padding: \"3px 6px\",\n whiteSpace: \"nowrap\",\n }}\n >\n {choice.badge}\n </span>\n ) : null}\n </span>\n );\n}\n\nfunction ChoiceDescription({ choice }: { choice?: InteractionChoiceOption }) {\n const theme = useTheme();\n const message = choice?.disabledReason ?? choice?.description;\n if (!message) return null;\n return (\n <span\n style={{\n color: choice?.disabledReason\n ? theme.semantic.intent.danger.solid\n : theme.semantic.text.muted,\n fontSize: theme.typography.fontSize.xs,\n }}\n >\n {message}\n </span>\n );\n}\n\nconst NULL_CHOICE_SELECT_VALUE = \"__dreamboard_null_choice__\";\n\nfunction choiceRenderKey(choice: InteractionChoiceOption): string {\n return choice.value === null ? NULL_CHOICE_SELECT_VALUE : choice.value;\n}\n\nfunction encodeChoiceSelectValue(value: unknown): string | undefined {\n if (value === null) return NULL_CHOICE_SELECT_VALUE;\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction decodeChoiceSelectValue(value: string): string | null {\n return value === NULL_CHOICE_SELECT_VALUE ? null : value;\n}\n\nfunction ChoiceField<\n Params extends InteractionParamsShape,\n Key extends keyof Params & string,\n>({\n input,\n value,\n setValue,\n errors,\n missing,\n disabled,\n domain,\n}: InteractionFieldRenderProps<Params, Key> & {\n domain: Extract<InputDomain, { type: \"choice\" }>;\n}) {\n const theme = useTheme();\n const themeCssVars = useThemeCssVars();\n const choices = domain.choices ?? [];\n const controlId = useId();\n const selectedChoice =\n typeof value === \"string\" || value === null\n ? choices.find((choice) => choice.value === value)\n : undefined;\n if (choices.length > 0 && choices.length <= 3) {\n return (\n <FieldFrame\n label={labelForInput(input)}\n errors={errors}\n missing={missing}\n >\n <span\n style={{\n display: \"inline-flex\",\n flexWrap: \"wrap\",\n gap: theme.space[1],\n }}\n >\n {choices.map((choice) => {\n const selected = value === choice.value;\n return (\n <ThemedButton\n key={choiceRenderKey(choice)}\n type=\"button\"\n variant={selected ? \"primary\" : \"secondary\"}\n size=\"sm\"\n disabled={disabled || choice.disabled}\n aria-pressed={selected}\n title={choice.disabledReason ?? choice.description}\n onClick={() => setValue(choice.value as Params[Key])}\n className=\"h-8 px-3 text-sm\"\n >\n <ChoiceOptionLabel choice={choice} />\n </ThemedButton>\n );\n })}\n </span>\n </FieldFrame>\n );\n }\n return (\n <FieldFrame\n label={labelForInput(input)}\n controlId={controlId}\n errors={errors}\n missing={missing}\n >\n <Select\n disabled={disabled}\n value={encodeChoiceSelectValue(value)}\n onValueChange={(next: string) =>\n setValue(decodeChoiceSelectValue(next) as Params[Key])\n }\n >\n <SelectTrigger id={controlId} size=\"sm\" className=\"w-full bg-white\">\n <span data-slot=\"select-value\">\n {selectedChoice ? (\n <ChoiceOptionLabel choice={selectedChoice} />\n ) : (\n <span style={{ color: theme.semantic.text.muted }}>\n Choose...\n </span>\n )}\n </span>\n </SelectTrigger>\n <SelectContent\n style={{\n ...themeCssVars,\n fontFamily: theme.typography.fontFamily.body,\n }}\n >\n {choices.map((choice) => (\n <SelectItem\n key={choiceRenderKey(choice)}\n value={choiceRenderKey(choice)}\n textValue={choice.label}\n disabled={choice.disabled}\n >\n <ChoiceOptionLabel choice={choice} />\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <ChoiceDescription choice={selectedChoice} />\n </FieldFrame>\n );\n}\n\nfunction ChoiceListField<\n Params extends InteractionParamsShape,\n Key extends keyof Params & string,\n>({\n input,\n value,\n setValue,\n errors,\n missing,\n disabled,\n domain,\n}: InteractionFieldRenderProps<Params, Key> & {\n domain: Extract<InputDomain, { type: \"choiceList\" }>;\n}) {\n const theme = useTheme();\n const selected = new Set(Array.isArray(value) ? (value as string[]) : []);\n const min =\n domain.selection?.mode === \"many\"\n ? (domain.selection.min ?? 0)\n : domain.min;\n const max =\n (domain.selection?.mode === \"many\" ? domain.selection.max : domain.max) ??\n domain.choices?.length ??\n Number.POSITIVE_INFINITY;\n const toggle = (choice: string) => {\n const next = new Set(selected);\n if (next.has(choice)) next.delete(choice);\n else if (next.size < max) next.add(choice);\n setValue([...next] as Params[Key]);\n };\n const meta =\n min || Number.isFinite(max)\n ? `Pick ${min ?? 0}${Number.isFinite(max) ? `-${max}` : \"+\"}`\n : undefined;\n return (\n <FieldFrame\n label={\n <span\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n gap: theme.space[2],\n }}\n >\n <span>{labelForInput(input)}</span>\n {meta ? (\n <span style={{ color: theme.semantic.text.muted }}>{meta}</span>\n ) : null}\n </span>\n }\n errors={errors}\n missing={missing}\n >\n <span style={{ display: \"flex\", flexWrap: \"wrap\", gap: theme.space[1] }}>\n {(domain.choices ?? []).map((choice) => {\n const value = choice.value as string;\n const checked = selected.has(value);\n return (\n <ThemedButton\n key={value}\n type=\"button\"\n variant={checked ? \"primary\" : \"secondary\"}\n size=\"sm\"\n disabled={\n disabled ||\n choice.disabled ||\n (!checked && selected.size >= max)\n }\n aria-pressed={checked}\n title={choice.disabledReason ?? choice.description}\n onClick={() => toggle(value)}\n className=\"h-8 px-3 text-sm\"\n >\n <ChoiceOptionLabel choice={choice} />\n </ThemedButton>\n );\n })}\n </span>\n </FieldFrame>\n );\n}\n\nfunction ResourceMapField<\n Params extends InteractionParamsShape,\n Key extends keyof Params & string,\n>({\n input,\n value,\n setValue,\n errors,\n missing,\n disabled,\n domain,\n}: InteractionFieldRenderProps<Params, Key> & {\n domain: Extract<InputDomain, { type: \"resourceMap\" }>;\n}) {\n const theme = useTheme();\n const current: Record<string, unknown> = isRecord(value) ? value : {};\n const update = (\n resourceId: string,\n delta: number,\n min: number,\n max: number,\n ) => {\n const previous = numberOrZero(current[resourceId]);\n const next = Math.max(min, Math.min(max, previous + delta));\n setValue({ ...current, [resourceId]: next } as Params[Key]);\n };\n return (\n <FieldFrame label={labelForInput(input)} errors={errors} missing={missing}>\n <span\n style={{\n display: \"grid\",\n gridTemplateColumns: \"repeat(auto-fit, minmax(140px, 1fr))\",\n gap: theme.space[2],\n }}\n >\n {(domain.resources ?? []).map((resource) => {\n const min = resource.min ?? 0;\n const max = resource.max ?? 0;\n const amount = numberOrZero(current[resource.resourceId]);\n return (\n <span\n key={resource.resourceId}\n style={{\n display: \"grid\",\n gridTemplateColumns: \"minmax(0, 1fr) auto auto auto\",\n alignItems: \"center\",\n gap: theme.space[1],\n padding: theme.space[2],\n borderRadius: theme.radius.md,\n background: theme.semantic.surface.inset,\n }}\n >\n <span\n style={{\n minWidth: 0,\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: theme.space[1],\n }}\n >\n {resource.icon ? (\n <span aria-hidden style={{ fontSize: \"1.1em\" }}>\n {resource.icon}\n </span>\n ) : null}\n {resource.label ?? humanize(input.key)}\n </span>\n <StepperButton\n label={`Decrease ${resource.label ?? resource.resourceId}`}\n disabled={disabled || amount <= min}\n onClick={() => update(resource.resourceId, -1, min, max)}\n >\n -\n </StepperButton>\n <span\n style={{\n minWidth: \"2ch\",\n textAlign: \"center\",\n fontVariantNumeric: \"tabular-nums\",\n }}\n >\n {amount}\n </span>\n <StepperButton\n label={`Increase ${resource.label ?? resource.resourceId}`}\n disabled={disabled || amount >= max}\n onClick={() => update(resource.resourceId, 1, min, max)}\n >\n +\n </StepperButton>\n </span>\n );\n })}\n </span>\n </FieldFrame>\n );\n}\n\nfunction BoundedNumberField<\n Params extends InteractionParamsShape,\n Key extends keyof Params & string,\n>({\n input,\n value,\n setValue,\n errors,\n missing,\n disabled,\n domain,\n}: InteractionFieldRenderProps<Params, Key> & {\n domain: Extract<InputDomain, { type: \"boundedNumber\" }>;\n}) {\n const theme = useTheme();\n const min = domain.min ?? 0;\n const max = domain.max ?? Number.POSITIVE_INFINITY;\n const step = domain.step ?? 1;\n const current = typeof value === \"number\" ? value : min;\n const controlId = useId();\n const update = (next: number) =>\n setValue(Math.max(min, Math.min(max, next)) as Params[Key]);\n return (\n <FieldFrame\n label={labelForInput(input)}\n controlId={controlId}\n errors={errors}\n missing={missing}\n >\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: theme.space[1],\n }}\n >\n <StepperButton\n label={`Decrease ${input.key}`}\n disabled={disabled || current <= min}\n onClick={() => update(current - step)}\n >\n -\n </StepperButton>\n <Input\n id={controlId}\n type=\"number\"\n min={min}\n max={Number.isFinite(max) ? max : undefined}\n step={step}\n value={current}\n disabled={disabled}\n onChange={(event) => update(Number(event.target.value))}\n className=\"h-9 w-[8ch] px-2 text-center text-sm md:text-sm\"\n />\n <StepperButton\n label={`Increase ${input.key}`}\n disabled={disabled || current >= max}\n onClick={() => update(current + step)}\n >\n +\n </StepperButton>\n </span>\n </FieldFrame>\n );\n}\n\nfunction TargetSummaryField<\n Params extends InteractionParamsShape,\n Key extends keyof Params & string,\n>({\n input,\n value,\n errors,\n missing,\n domain,\n}: InteractionFieldRenderProps<Params, Key> & {\n domain: Extract<InputDomain, { type: \"cardTarget\" | \"boardTarget\" }>;\n}) {\n const target = inputTargetKind(domain) ?? \"target\";\n return (\n <FieldFrame label={labelForInput(input)} errors={errors} missing={missing}>\n <span>\n {Array.isArray(value)\n ? value.length > 0\n ? `${value.length} selected: ${value.join(\", \")}`\n : `Select ${targetSelectionLabel(domain)}.`\n : typeof value === \"string\"\n ? value\n : `Select a ${target} on the board.`}\n </span>\n </FieldFrame>\n );\n}\n\nfunction targetSelectionLabel(domain: InputDomain): string {\n const target = inputTargetKind(domain) ?? \"target\";\n const selection = isTargetDomain(domain) ? domain.selection : undefined;\n if (selection?.mode !== \"many\") return `a ${target}`;\n const min = selection.min ?? 0;\n if (selection.max !== undefined && min === selection.max) {\n return `${min} ${target}${min === 1 ? \"\" : \"s\"}`;\n }\n return `${min}${selection.max ? `-${selection.max}` : \"+\"} ${target}s`;\n}\n\nfunction StepperButton({\n label,\n disabled,\n onClick,\n children,\n}: {\n label: string;\n disabled: boolean;\n onClick: () => void;\n children: ReactNode;\n}) {\n return (\n <ThemedButton\n type=\"button\"\n variant=\"secondary\"\n size=\"sm\"\n aria-label={label}\n disabled={disabled}\n onClick={onClick}\n className=\"h-8 w-8 text-sm\"\n >\n {children}\n </ThemedButton>\n );\n}\n\nfunction labelForInput(input: InteractionInputDescriptor): string {\n if (input.domain.type === \"choice\") {\n const exact = input.domain.choices?.find(\n (choice) => choice.value === input.defaultValue,\n );\n if (exact?.label && input.key === exact.value) return exact.label;\n }\n return humanize(input.key);\n}\n\nfunction humanize(key: string): string {\n return key\n .replace(/Id$/, \"\")\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .replace(/[-_]+/g, \" \")\n .replace(/\\b\\w/g, (letter) => letter.toUpperCase());\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction numberOrZero(value: unknown): number {\n return typeof value === \"number\" && Number.isFinite(value) ? value : 0;\n}\n","import {\n InteractionForm,\n type InteractionFormProps,\n} from \"../components/InteractionForm.js\";\nimport type {\n InteractionHandle,\n InteractionParamsShape,\n} from \"../hooks/useInteractionHandle.js\";\nimport type { InteractionDescriptor } from \"../types/plugin-state.js\";\n\nexport type BoundInteractionFormProps<\n Params extends InteractionParamsShape = InteractionParamsShape,\n DefaultedKeys extends keyof Params & string = never,\n> = Omit<InteractionFormProps<Params, DefaultedKeys>, \"descriptor\" | \"handle\">;\n\nexport function castInteractionHandle<\n Params extends InteractionParamsShape = InteractionParamsShape,\n DefaultedKeys extends keyof Params & string = never,\n>(handle: InteractionHandle): InteractionHandle<Params, DefaultedKeys> {\n return handle as InteractionHandle<Params, DefaultedKeys>;\n}\n\nexport function castInteractionDraft<\n Params extends InteractionParamsShape = InteractionParamsShape,\n DefaultedKeys extends keyof Params & string = never,\n>(\n draft: Record<string, unknown>,\n): InteractionHandle<Params, DefaultedKeys>[\"draft\"] {\n return draft as InteractionHandle<Params, DefaultedKeys>[\"draft\"];\n}\n\nexport function castInteractionFields<\n Params extends InteractionParamsShape = InteractionParamsShape,\n>(fields: readonly string[]): ReadonlyArray<keyof Params & string> {\n return fields as ReadonlyArray<keyof Params & string>;\n}\n\nexport function BoundInteractionForm<\n Params extends InteractionParamsShape = InteractionParamsShape,\n DefaultedKeys extends keyof Params & string = never,\n>({\n descriptor,\n handle,\n ...props\n}: BoundInteractionFormProps<Params, DefaultedKeys> & {\n descriptor: InteractionDescriptor;\n handle: InteractionHandle;\n}) {\n return (\n <InteractionForm<Params, DefaultedKeys>\n descriptor={descriptor}\n handle={castInteractionHandle<Params, DefaultedKeys>(handle)}\n {...props}\n />\n );\n}\n","import { useCallback, useMemo, useState } from \"react\";\n\nexport type DialogLifecycleState = \"open\" | \"minimized\" | \"dismissed\";\n\nexport interface DialogLifecycleValue {\n state: DialogLifecycleState;\n open: boolean;\n minimized: boolean;\n dismissed: boolean;\n setOpen: (open: boolean) => void;\n restore: () => void;\n minimize: () => void;\n dismiss: () => void;\n}\n\nexport interface DialogLifecycleOptions {\n defaultOpen?: boolean;\n onStateChange?: (state: DialogLifecycleState) => void;\n}\n\nexport function useDialogLifecycle({\n defaultOpen = true,\n onStateChange,\n}: DialogLifecycleOptions): DialogLifecycleValue {\n const [state, setState] = useState<DialogLifecycleState>(\n defaultOpen ? \"open\" : \"minimized\",\n );\n const updateState = useCallback(\n (nextState: DialogLifecycleState) => {\n setState(nextState);\n onStateChange?.(nextState);\n },\n [onStateChange],\n );\n const restore = useCallback(() => updateState(\"open\"), [updateState]);\n const minimize = useCallback(() => updateState(\"minimized\"), [updateState]);\n const dismiss = useCallback(() => updateState(\"dismissed\"), [updateState]);\n const setOpen = useCallback(\n (open: boolean) => {\n updateState(open ? \"open\" : \"minimized\");\n },\n [updateState],\n );\n\n return useMemo<DialogLifecycleValue>(\n () => ({\n state,\n open: state === \"open\",\n minimized: state === \"minimized\",\n dismissed: state === \"dismissed\",\n setOpen,\n restore,\n minimize,\n dismiss,\n }),\n [dismiss, minimize, restore, setOpen, state],\n );\n}\n","import type { ReactElement, ReactNode } from \"react\";\nimport { usePluginState } from \"../context/PluginStateContext.js\";\nimport type { PhaseKey } from \"../ui-contract.js\";\n\nexport type PhaseRouteMap<Phase extends string = PhaseKey> = {\n readonly [Key in Phase]: () => ReactNode;\n};\n\nexport type PhaseFallback = ReactNode | ((phase: string | null) => ReactNode);\n\nexport interface PhaseSwitchProps<Phase extends string = PhaseKey> {\n routes: PhaseRouteMap<Phase>;\n fallback?: PhaseFallback;\n}\n\nfunction hasRoute<Phase extends string>(\n routes: PhaseRouteMap<Phase>,\n phase: string,\n): phase is Phase {\n return Object.prototype.hasOwnProperty.call(routes, phase);\n}\n\nfunction renderFallback(\n fallback: PhaseFallback | undefined,\n phase: string | null,\n): ReactNode {\n return typeof fallback === \"function\" ? fallback(phase) : (fallback ?? null);\n}\n\nexport function PhaseSwitch<Phase extends string = PhaseKey>({\n routes,\n fallback,\n}: PhaseSwitchProps<Phase>): ReactElement | null {\n const phase = usePluginState((state) => state.gameplay.currentPhase);\n if (phase && hasRoute(routes, phase)) {\n return <>{routes[phase]()}</>;\n }\n return <>{renderFallback(fallback, phase)}</>;\n}\n\nexport const Phase = {\n Switch: PhaseSwitch,\n};\n","import {\n createContext,\n Fragment,\n useContext,\n useMemo,\n type ButtonHTMLAttributes,\n type HTMLAttributes,\n type ReactElement,\n type ReactNode,\n} from \"react\";\nimport type { PlayerId } from \"@dreamboard/manifest-contract\";\nimport { useActivePlayers } from \"../hooks/useActivePlayers.js\";\nimport { usePlayerInfo } from \"../hooks/usePlayerInfo.js\";\nimport { usePlayerTurnOrder } from \"../hooks/usePlayerTurnOrder.js\";\nimport { usePluginActions } from \"../context/PluginStateContext.js\";\nimport { usePluginSession } from \"../context/PluginSessionContext.js\";\nimport {\n composeEventHandlers,\n renderPrimitive,\n type PrimitiveCommonProps,\n} from \"./primitive-props.js\";\nimport type { HexColor } from \"../../ui.js\";\n\nexport interface PlayerRosterBadge {\n key: string;\n label?: ReactNode;\n icon?: ReactNode;\n tooltip?: string;\n}\n\nexport interface PlayerRosterEntry {\n playerId: PlayerId;\n name: string;\n color?: HexColor;\n index: number;\n isActive: boolean;\n isCurrentPlayer: boolean;\n isControllable: boolean;\n canSwitchToPlayer: boolean;\n score?: number;\n scoreLabel?: string;\n badges: readonly PlayerRosterBadge[];\n metadata?: Record<string, unknown>;\n}\n\nexport interface PlayerRosterRootProps {\n children: ReactNode;\n order?: \"turn\" | \"self-first\";\n include?: \"all\" | \"self\" | \"opponents\";\n score?: (playerId: PlayerId) => number | undefined;\n scoreLabel?: string | ((playerId: PlayerId) => string | undefined);\n badges?: (\n playerId: PlayerId,\n ) => ReadonlyArray<PlayerRosterBadge | null | false | undefined>;\n metadata?: (playerId: PlayerId) => Record<string, unknown> | undefined;\n}\n\ninterface PlayerRosterContextValue {\n players: readonly PlayerRosterEntry[];\n}\n\nconst PlayerRosterContext = createContext<PlayerRosterContextValue | null>(\n null,\n);\n\nfunction usePlayerRosterContext(): PlayerRosterContextValue {\n const value = useContext(PlayerRosterContext);\n if (!value) {\n throw new Error(\n \"PlayerRoster primitives must be rendered inside <PlayerRoster.Root>.\",\n );\n }\n return value;\n}\n\nfunction projectBadges(\n badges: PlayerRosterRootProps[\"badges\"],\n playerId: PlayerId,\n): readonly PlayerRosterBadge[] {\n return (badges?.(playerId) ?? []).filter(\n (badge): badge is PlayerRosterBadge => Boolean(badge),\n );\n}\n\nexport function PlayerRosterRoot({\n children,\n order = \"turn\",\n include = \"all\",\n score,\n scoreLabel,\n badges,\n metadata,\n}: PlayerRosterRootProps) {\n const playerInfo = usePlayerInfo();\n const activePlayers = useActivePlayers();\n const turnOrder = usePlayerTurnOrder();\n const { controllingPlayerId, controllablePlayerIds } = usePluginSession();\n\n const players = useMemo<readonly PlayerRosterEntry[]>(() => {\n const orderedPlayerIds =\n order === \"self-first\" && controllingPlayerId\n ? [\n ...turnOrder.filter((pid) => pid === controllingPlayerId),\n ...turnOrder.filter((pid) => pid !== controllingPlayerId),\n ]\n : turnOrder;\n\n return orderedPlayerIds\n .map((playerId, index): PlayerRosterEntry => {\n const player = playerInfo.get(playerId);\n const isCurrentPlayer = playerId === controllingPlayerId;\n const isControllable = controllablePlayerIds.includes(playerId);\n const resolvedScoreLabel =\n typeof scoreLabel === \"function\" ? scoreLabel(playerId) : scoreLabel;\n\n return {\n playerId,\n name: player?.name ?? playerId,\n color: player?.color,\n index,\n isActive: activePlayers.includes(playerId),\n isCurrentPlayer,\n isControllable,\n canSwitchToPlayer:\n controllablePlayerIds.length > 1 &&\n isControllable &&\n !isCurrentPlayer,\n score: score?.(playerId),\n scoreLabel: resolvedScoreLabel,\n badges: projectBadges(badges, playerId),\n metadata: metadata?.(playerId),\n };\n })\n .filter((player) => {\n if (include === \"self\") return player.isCurrentPlayer;\n if (include === \"opponents\") return !player.isCurrentPlayer;\n return true;\n });\n }, [\n activePlayers,\n badges,\n controllablePlayerIds,\n controllingPlayerId,\n include,\n metadata,\n order,\n playerInfo,\n score,\n scoreLabel,\n turnOrder,\n ]);\n\n const value = useMemo<PlayerRosterContextValue>(\n () => ({ players }),\n [players],\n );\n\n return (\n <PlayerRosterContext.Provider value={value}>\n {children}\n </PlayerRosterContext.Provider>\n );\n}\n\nexport type PlayerRosterListProps = Omit<PrimitiveCommonProps, \"children\"> &\n Omit<HTMLAttributes<HTMLElement>, \"children\"> & {\n children?: (player: PlayerRosterEntry) => ReactNode;\n };\n\nexport function PlayerRosterList({\n children,\n ...props\n}: PlayerRosterListProps) {\n const { players } = usePlayerRosterContext();\n return renderPrimitive(\"div\", {\n ...props,\n \"data-dreamboard-player-roster-list\": \"\",\n children: players.map((player) => (\n <Fragment key={player.playerId}>\n {children ? children(player) : <PlayerRosterName player={player} />}\n </Fragment>\n )),\n });\n}\n\nexport function PlayerRosterEmpty({ children }: { children?: ReactNode }) {\n const { players } = usePlayerRosterContext();\n if (players.length > 0) return null;\n return <>{children}</>;\n}\n\nexport type PlayerRosterSwitchButtonProps = Omit<\n PrimitiveCommonProps,\n \"children\"\n> &\n ButtonHTMLAttributes<HTMLButtonElement> & {\n player: PlayerRosterEntry;\n children?: ReactNode;\n };\n\nexport function PlayerRosterSwitchButton({\n player,\n disabled,\n onClick,\n ...props\n}: PlayerRosterSwitchButtonProps) {\n const { switchPlayer } = usePluginActions();\n const isDisabled = disabled === true || !player.canSwitchToPlayer;\n return renderPrimitive(\"button\", {\n type: \"button\",\n ...props,\n disabled: isDisabled,\n \"aria-current\": player.isCurrentPlayer ? \"true\" : undefined,\n \"aria-disabled\": isDisabled,\n \"data-dreamboard-player-roster-switch\": \"\",\n \"data-player-id\": player.playerId,\n \"data-active\": player.isActive || undefined,\n \"data-current\": player.isCurrentPlayer || undefined,\n \"data-controllable\": player.isControllable || undefined,\n \"data-switchable\": player.canSwitchToPlayer || undefined,\n \"data-disabled\": isDisabled || undefined,\n onClick: composeEventHandlers(onClick, () => {\n if (!isDisabled) switchPlayer(player.playerId);\n }),\n });\n}\n\nexport type PlayerRosterPartProps = PrimitiveCommonProps &\n HTMLAttributes<HTMLElement> & {\n player: PlayerRosterEntry;\n };\n\nexport interface PlayerRosterComponents {\n Root(props: PlayerRosterRootProps): ReactElement | null;\n List(props: PlayerRosterListProps): ReactElement;\n Empty(props: { children?: ReactNode }): ReactElement | null;\n SwitchButton(props: PlayerRosterSwitchButtonProps): ReactElement;\n Name(props: PlayerRosterPartProps): ReactElement;\n Score(props: PlayerRosterPartProps): ReactElement | null;\n Badges(props: PlayerRosterPartProps): ReactElement | null;\n}\n\nexport function PlayerRosterName({\n player,\n children,\n ...props\n}: PlayerRosterPartProps) {\n return renderPrimitive(\"span\", {\n ...props,\n \"data-dreamboard-player-roster-name\": \"\",\n children: children ?? player.name,\n });\n}\n\nexport function PlayerRosterScore({\n player,\n children,\n ...props\n}: PlayerRosterPartProps) {\n if (player.score === undefined && children === undefined) return null;\n const label = player.scoreLabel ? ` ${player.scoreLabel}` : \"\";\n return renderPrimitive(\"span\", {\n ...props,\n \"data-dreamboard-player-roster-score\": \"\",\n children: children ?? `${player.score}${label}`,\n });\n}\n\nexport function PlayerRosterBadges({\n player,\n children,\n ...props\n}: PlayerRosterPartProps) {\n if (player.badges.length === 0 && children === undefined) return null;\n return renderPrimitive(\"span\", {\n ...props,\n \"data-dreamboard-player-roster-badges\": \"\",\n children:\n children ??\n player.badges.map((badge) => (\n <span\n key={badge.key}\n data-dreamboard-player-roster-badge=\"\"\n title={badge.tooltip}\n aria-label={badge.tooltip}\n >\n {badge.icon}\n {badge.label}\n </span>\n )),\n });\n}\n\nexport const PlayerRoster: PlayerRosterComponents = {\n Root: PlayerRosterRoot,\n List: PlayerRosterList,\n Empty: PlayerRosterEmpty,\n SwitchButton: PlayerRosterSwitchButton,\n Name: PlayerRosterName,\n Score: PlayerRosterScore,\n Badges: PlayerRosterBadges,\n};\n","import {\n Fragment,\n createContext,\n useContext,\n useMemo,\n type ButtonHTMLAttributes,\n type ReactNode,\n} from \"react\";\nimport { useSeatInbox } from \"../hooks/useSeatInbox.js\";\nimport type { PromptKey, PromptOptionKey } from \"../ui-contract.js\";\nimport type {\n InteractionDescriptor,\n InteractionContextOption,\n} from \"../types/plugin-state.js\";\nimport { interactionInputKeys } from \"../utils/interaction-inputs.js\";\nimport { interactionLabel } from \"../utils/interaction-labels.js\";\nimport { isInteractionAvailable } from \"../utils/interaction-status.js\";\nimport {\n InteractionDescription,\n InteractionLabel,\n InteractionRoot,\n useInteractionPrimitiveContext,\n type InteractionPartProps,\n type InteractionRootProps,\n} from \"./interaction.js\";\nimport {\n composeEventHandlers,\n renderPrimitive,\n type PrimitiveCommonProps,\n} from \"./primitive-props.js\";\nimport {\n submitInteractionParams,\n type InteractionSubmitCallbacks,\n} from \"./interaction-submit.js\";\nimport {\n useDialogLifecycle,\n type DialogLifecycleState,\n} from \"./dialog-lifecycle.js\";\nimport { useGameActionError } from \"./game.js\";\n\nexport type PromptRootProps<Prompt extends string = PromptKey> =\n InteractionRootProps<Prompt>;\n\nexport function PromptRoot<Prompt extends string = PromptKey>(\n props: PromptRootProps<Prompt>,\n) {\n return <InteractionRoot {...props} />;\n}\n\nexport function PromptTitle(props: InteractionPartProps) {\n const { descriptor } = useInteractionPrimitiveContext();\n const context =\n descriptor?.kind === \"prompt\" ? descriptor.context : undefined;\n return (\n <InteractionLabel {...props}>\n {props.children ??\n context?.title ??\n (descriptor ? interactionLabel(descriptor) : undefined)}\n </InteractionLabel>\n );\n}\n\nexport function PromptMessage(props: InteractionPartProps) {\n const { descriptor } = useInteractionPrimitiveContext();\n const context =\n descriptor?.kind === \"prompt\" ? descriptor.context : undefined;\n const message =\n props.children ??\n (typeof context?.payload?.message === \"string\"\n ? context.payload.message\n : undefined);\n if (!message) return null;\n return <InteractionDescription {...props}>{message}</InteractionDescription>;\n}\n\nexport type PromptOptionProps<Option extends string = PromptOptionKey> =\n PrimitiveCommonProps &\n ButtonHTMLAttributes<HTMLButtonElement> & {\n value: Option;\n disableWhenUnavailable?: boolean;\n onSubmitError?: InteractionSubmitCallbacks[\"onSubmitError\"];\n onSubmitSuccess?: InteractionSubmitCallbacks[\"onSubmitSuccess\"];\n };\n\nexport function PromptOption<Option extends string = PromptOptionKey>({\n value,\n disabled,\n disableWhenUnavailable = false,\n onClick,\n onSubmitError,\n onSubmitSuccess,\n children,\n ...props\n}: PromptOptionProps<Option>) {\n const { descriptor, handle } = useInteractionPrimitiveContext();\n const gameActionError = useGameActionError();\n const context =\n descriptor?.kind === \"prompt\" ? descriptor.context : undefined;\n const option = context?.options?.find((candidate) => candidate.id === value);\n const inputKey = descriptor ? interactionInputKeys(descriptor)[0] : undefined;\n const choice = descriptor?.inputs.find(\n (input) => input.key === inputKey,\n )?.domain;\n const optionChoice =\n choice?.type === \"choice\"\n ? choice.choices?.find((candidate) => candidate.value === value)\n : undefined;\n const isDisabled =\n disabled ??\n (!handle ||\n !inputKey ||\n handle.status !== \"open\" ||\n optionChoice?.disabled === true ||\n (disableWhenUnavailable && !isInteractionAvailable(descriptor)));\n return renderPrimitive(\"button\", {\n type: \"button\",\n ...props,\n disabled: isDisabled,\n \"aria-disabled\": isDisabled,\n \"data-dreamboard-prompt-option\": \"\",\n \"data-option-value\": value,\n \"data-disabled\": isDisabled || undefined,\n \"data-available\": isInteractionAvailable(descriptor),\n \"data-disabled-reason\": optionChoice?.disabledReason,\n title: props.title ?? optionChoice?.disabledReason,\n onClick: composeEventHandlers(onClick, () => {\n if (!handle || !inputKey || isDisabled) return;\n void submitInteractionParams(\n handle,\n { [inputKey]: value },\n {\n onSubmitSuccess,\n onSubmitError: onSubmitError ?? gameActionError ?? undefined,\n },\n { unhandledError: \"log\" },\n );\n }),\n children: children ?? option?.label ?? value,\n });\n}\n\nexport interface PromptOptionRenderItem {\n id: string;\n label?: string;\n}\n\nexport interface PromptOptionsProps {\n children: (option: PromptOptionRenderItem) => ReactNode;\n}\n\nexport function PromptOptions({ children }: PromptOptionsProps) {\n const { descriptor } = useInteractionPrimitiveContext();\n const options: readonly InteractionContextOption[] =\n descriptor?.kind === \"prompt\" ? (descriptor.context.options ?? []) : [];\n return (\n <>\n {options.map((option) => (\n <Fragment key={option.id}>{children(option)}</Fragment>\n ))}\n </>\n );\n}\n\nexport type PromptDialogState = DialogLifecycleState;\n\nexport interface PromptDialogRenderState<Prompt extends string = PromptKey> {\n prompt: Prompt;\n state: PromptDialogState;\n open: boolean;\n minimized: boolean;\n dismissed: boolean;\n setOpen: (open: boolean) => void;\n restore: () => void;\n minimize: () => void;\n dismiss: () => void;\n}\n\nexport interface PromptDialogProps<Prompt extends string = PromptKey> {\n prompt: Prompt;\n defaultOpen?: boolean;\n onStateChange?: (state: PromptDialogState) => void;\n children: (state: PromptDialogRenderState<Prompt>) => ReactNode;\n}\n\nexport function PromptDialog<Prompt extends string = PromptKey>({\n prompt,\n defaultOpen = true,\n onStateChange,\n children,\n}: PromptDialogProps<Prompt>) {\n const lifecycle = useDialogLifecycle({ defaultOpen, onStateChange });\n const renderState = useMemo<PromptDialogRenderState<Prompt>>(\n () => ({\n prompt,\n ...lifecycle,\n }),\n [lifecycle, prompt],\n );\n return <>{children(renderState)}</>;\n}\n\ninterface PromptInboxContextValue {\n prompts: readonly InteractionDescriptor[];\n}\n\nconst PromptInboxContext = createContext<PromptInboxContextValue | null>(null);\n\nfunction usePromptInboxContext(): PromptInboxContextValue {\n const value = useContext(PromptInboxContext);\n if (!value) {\n throw new Error(\n \"PromptInbox primitives must be rendered inside <PromptInbox.Root>.\",\n );\n }\n return value;\n}\n\nexport function PromptInboxRoot({ children }: { children: ReactNode }) {\n const inbox = useSeatInbox();\n return (\n <PromptInboxContext.Provider value={{ prompts: inbox.prompts }}>\n {children}\n </PromptInboxContext.Provider>\n );\n}\n\nexport function PromptInboxEmpty({ children }: { children?: ReactNode }) {\n const { prompts } = usePromptInboxContext();\n if (prompts.length > 0) return null;\n return <>{children}</>;\n}\n\nexport interface PromptInboxItemsProps {\n children: (prompt: InteractionDescriptor) => ReactNode;\n}\n\nexport function PromptInboxItems({ children }: PromptInboxItemsProps) {\n const { prompts } = usePromptInboxContext();\n return <>{prompts.map((prompt) => children(prompt))}</>;\n}\n\nexport const Prompt = {\n Root: PromptRoot,\n Title: PromptTitle,\n Message: PromptMessage,\n Option: PromptOption,\n Options: PromptOptions,\n Dialog: PromptDialog,\n};\n\nexport const PromptInbox = {\n Root: PromptInboxRoot,\n Empty: PromptInboxEmpty,\n Items: PromptInboxItems,\n};\n","import { usePluginState } from \"../context/PluginStateContext.js\";\nimport type { InteractionDescriptor } from \"../types/plugin-state.js\";\nimport {\n eligibleTargetsByBoardKind,\n hasBoardTargetInput,\n} from \"../utils/interaction-inputs.js\";\n\n/**\n * Structured inbox view of the controlling seat's available interactions.\n * Interactions are grouped into UI behavior buckets. Prompt-kind interactions\n * (authored via `promptInput(...)`) surface at `bySurface.inbox`.\n */\nexport interface SeatInbox {\n /** Interactions grouped by derived UI bucket id. */\n bySurface: Record<string, readonly InteractionDescriptor[]>;\n /** Prompt-kind interactions addressed to the controlling seat. */\n prompts: readonly InteractionDescriptor[];\n /** Flat list of all available interactions (ungrouped). */\n all: readonly InteractionDescriptor[];\n}\n\n/**\n * Returns the controlling seat's available interactions grouped by UI bucket.\n * Prompt-kind interactions (authored via `promptInput(...)`) appear both in\n * `bySurface.inbox` and in `prompts`. Backed by authoritative descriptors\n * from the trusted bundle — clients MUST NOT recompute availability.\n */\nexport function useSeatInbox(): SeatInbox {\n const interactions = usePluginState(\n (s) => s.gameplay.availableInteractions ?? [],\n );\n\n const bySurface: Record<string, InteractionDescriptor[]> = {};\n const prompts: InteractionDescriptor[] = [];\n for (const descriptor of interactions) {\n const surface = bucketForDescriptor(descriptor);\n (bySurface[surface] ??= []).push(descriptor);\n if (descriptor.kind === \"prompt\") {\n prompts.push(descriptor);\n }\n }\n\n return {\n bySurface,\n prompts,\n all: interactions,\n };\n}\n\nfunction bucketForDescriptor(descriptor: InteractionDescriptor): string {\n if (descriptor.kind === \"prompt\") return \"inbox\";\n if (descriptor.zoneId) return \"hand\";\n if (hasBoardTargetInput(descriptor)) {\n const byKind = eligibleTargetsByBoardKind(descriptor);\n if (byKind.vertex) return \"board-vertex\";\n if (byKind.edge) return \"board-edge\";\n if (byKind.tile) return \"board-tile\";\n if (byKind.space) return \"board-space\";\n }\n return \"panel\";\n}\n","import { createContext, useContext, type ReactNode } from \"react\";\n\nexport type DiceValue = number | null | undefined;\n\nexport interface DiceState {\n values: ReadonlyArray<number | undefined> | undefined;\n /** Undefined if any die has not been rolled yet. */\n sum: number | undefined;\n diceCount: number;\n allRolled: boolean;\n}\n\nexport interface DiceRootProps {\n values?: readonly DiceValue[] | null;\n /** Used when values are not provided. */\n count?: number;\n children: ReactNode;\n}\n\nexport interface DiceValuesProps {\n children: (state: DiceState) => ReactNode;\n}\n\nexport interface DiceComponents {\n Root(props: DiceRootProps): ReactNode;\n Values(props: DiceValuesProps): ReactNode;\n}\n\nconst DiceContext = createContext<DiceState | null>(null);\n\nexport function normalizeDiceState({\n values,\n count = 2,\n}: {\n values?: readonly DiceValue[] | null;\n count?: number;\n}): DiceState {\n const normalizedValues = values?.map((value) => value ?? undefined);\n const allRolled =\n normalizedValues?.every((value) => value !== undefined) ?? false;\n const sum = allRolled\n ? normalizedValues?.reduce<number>(\n (total, value) => total + (value ?? 0),\n 0,\n )\n : undefined;\n\n return {\n values: normalizedValues,\n sum,\n diceCount: normalizedValues?.length ?? count,\n allRolled,\n };\n}\n\nexport function DiceRoot({ values, count, children }: DiceRootProps) {\n return (\n <DiceContext.Provider value={normalizeDiceState({ values, count })}>\n {children}\n </DiceContext.Provider>\n );\n}\n\nexport function useDicePrimitiveContext(): DiceState {\n const value = useContext(DiceContext);\n if (!value) {\n throw new Error(\"Dice primitives must be rendered inside <Dice.Root>.\");\n }\n return value;\n}\n\nexport function DiceValues({ children }: DiceValuesProps) {\n return children(useDicePrimitiveContext());\n}\n\nexport const Dice: DiceComponents = {\n Root: DiceRoot,\n Values: DiceValues,\n};\n"],"mappings":"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","names":["jsx","createContext","useContext","createContext","useContext","useState","useEffect","useMemo","createContext","useContext","jsx","createContext","useContext","Fragment","jsx","createContext","state","useMemo","sep","descriptor","cardInputKey","result","createContext","useContext","useMemo","useStore","useSyncExternalStore","useSyncExternalStore","useMemo","useState","useEffect","useState","useEffect","useMemo","useMemo","useMemo","Fragment","jsx","createContext","useContext","useMemo","useStore","jsx","createContext","useContext","useMemo","Fragment","jsx","createContext","useContext","useMemo","Fragment","useCallback","useEffect","useMemo","useRef","useStore","useShallow","jsx","jsxs","useStore","useShallow","useCallback","useMemo","useRef","useEffect","Fragment","createContext","useContext","useMemo","useStore","useCallback","useMemo","useStore","useStore","useMemo","useCallback","options","eligible","resolveExtraInputs","Fragment","jsx","createContext","useContext","useMemo","useStore","createContext","useCallback","useContext","useEffect","useMemo","useRef","useCallback","useEffect","useMemo","useRef","createContext","useContext","jsx","useRef","useMemo","useCallback","useEffect","useEffect","useMemo","useState","Fragment","jsx","jsxs","useState","useMemo","useEffect","input","missing","disabled","jsx","jsxs","value","jsx","jsx","useCallback","useMemo","useState","Fragment","jsx","createContext","useContext","useMemo","useRef","useEffect","useCallback","Fragment","jsx","createContext","Fragment","useContext","useMemo","Fragment","jsx","jsxs","createContext","useContext","useMemo","Fragment","createContext","useContext","useMemo","Fragment","jsx","useMemo","createContext","useContext","createContext","useContext","jsx"]}
|