@dreamboard-games/sdk 0.2.0
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/LICENSE.md +96 -0
- package/README.md +12 -0
- package/dist/HandView-ncJIVLhN.d.ts +193 -0
- package/dist/ResourceCounter-CTREyF73.d.ts +102 -0
- package/dist/ThemeProvider-fy0_QzgO.d.ts +99 -0
- package/dist/bundle-TIZcw8LB.d.ts +281 -0
- package/dist/cards-Sl3b40Mv.d.ts +13 -0
- package/dist/chunk-7YAHLYBR.js +481 -0
- package/dist/chunk-7YAHLYBR.js.map +1 -0
- package/dist/chunk-FDNZTDD6.js +8085 -0
- package/dist/chunk-FDNZTDD6.js.map +1 -0
- package/dist/chunk-GKKBPPSW.js +598 -0
- package/dist/chunk-GKKBPPSW.js.map +1 -0
- package/dist/chunk-I46YJSOD.js +1 -0
- package/dist/chunk-I46YJSOD.js.map +1 -0
- package/dist/chunk-KAELH4KC.js +104 -0
- package/dist/chunk-KAELH4KC.js.map +1 -0
- package/dist/chunk-PZ5AY32C.js +10 -0
- package/dist/chunk-PZ5AY32C.js.map +1 -0
- package/dist/chunk-T3ZKNUZ7.js +1 -0
- package/dist/chunk-T3ZKNUZ7.js.map +1 -0
- package/dist/chunk-T52J5RMF.js +1 -0
- package/dist/chunk-T52J5RMF.js.map +1 -0
- package/dist/chunk-TDSWKVZ4.js +5401 -0
- package/dist/chunk-TDSWKVZ4.js.map +1 -0
- package/dist/chunk-U5C6BONG.js +34 -0
- package/dist/chunk-U5C6BONG.js.map +1 -0
- package/dist/chunk-VDXOF4FW.js +69 -0
- package/dist/chunk-VDXOF4FW.js.map +1 -0
- package/dist/chunk-VFTAA4WO.js +115 -0
- package/dist/chunk-VFTAA4WO.js.map +1 -0
- package/dist/chunk-WN74KVNY.js +17 -0
- package/dist/chunk-WN74KVNY.js.map +1 -0
- package/dist/chunk-WYPQ3GG5.js +10990 -0
- package/dist/chunk-WYPQ3GG5.js.map +1 -0
- package/dist/components-D5ZRE2Hl.d.ts +1451 -0
- package/dist/generated/runtime/primitives.d.ts +12 -0
- package/dist/generated/runtime/primitives.js +180 -0
- package/dist/generated/runtime/primitives.js.map +1 -0
- package/dist/generated/runtime-api.d.ts +3 -0
- package/dist/generated/runtime-api.js +2 -0
- package/dist/generated/runtime-api.js.map +1 -0
- package/dist/generated/runtime.d.ts +14 -0
- package/dist/generated/runtime.js +18 -0
- package/dist/generated/runtime.js.map +1 -0
- package/dist/generated/workspace-contract.d.ts +14 -0
- package/dist/generated/workspace-contract.js +14 -0
- package/dist/generated/workspace-contract.js.map +1 -0
- package/dist/hex-board-view-D_07hO6O.d.ts +933 -0
- package/dist/hex-color-MhOyuY-o.d.ts +8 -0
- package/dist/index-BwqPQtBu.d.ts +1433 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/infrastructure/reducer-bundle-abi.d.ts +1083 -0
- package/dist/infrastructure/reducer-bundle-abi.js +14 -0
- package/dist/infrastructure/reducer-bundle-abi.js.map +1 -0
- package/dist/infrastructure/workspace-codegen.d.ts +53 -0
- package/dist/infrastructure/workspace-codegen.js +44 -0
- package/dist/infrastructure/workspace-codegen.js.map +1 -0
- package/dist/manifest-contract-BNHVGFtU.d.ts +9 -0
- package/dist/package-set.d.ts +13 -0
- package/dist/package-set.js +12 -0
- package/dist/package-set.js.map +1 -0
- package/dist/primitive-props-DpKs-GCr.d.ts +11 -0
- package/dist/reducer.d.ts +3786 -0
- package/dist/reducer.js +8131 -0
- package/dist/reducer.js.map +1 -0
- package/dist/runtime/primitives.d.ts +226 -0
- package/dist/runtime/primitives.js +180 -0
- package/dist/runtime/primitives.js.map +1 -0
- package/dist/runtime/types/runtime-api.d.ts +1 -0
- package/dist/runtime/types/runtime-api.js +2 -0
- package/dist/runtime/types/runtime-api.js.map +1 -0
- package/dist/runtime/workspace-contract.d.ts +172 -0
- package/dist/runtime/workspace-contract.js +14 -0
- package/dist/runtime/workspace-contract.js.map +1 -0
- package/dist/runtime-api-3dshj6kK.d.ts +101 -0
- package/dist/runtime-api-DWxvTr-O.d.ts +379 -0
- package/dist/runtime.d.ts +58 -0
- package/dist/runtime.js +13 -0
- package/dist/runtime.js.map +1 -0
- package/dist/slots-1GPGihk8.d.ts +8 -0
- package/dist/testing.d.ts +149 -0
- package/dist/testing.js +513 -0
- package/dist/testing.js.map +1 -0
- package/dist/types.d.ts +496 -0
- package/dist/types.js +28 -0
- package/dist/types.js.map +1 -0
- package/dist/ui/components.d.ts +16 -0
- package/dist/ui/components.js +192 -0
- package/dist/ui/components.js.map +1 -0
- package/dist/ui/defaults.d.ts +19 -0
- package/dist/ui/defaults.js +104 -0
- package/dist/ui/defaults.js.map +1 -0
- package/dist/ui/plugin-styles.css +250 -0
- package/dist/ui/types/player-state.d.ts +365 -0
- package/dist/ui/types/player-state.js +1 -0
- package/dist/ui/types/player-state.js.map +1 -0
- package/dist/ui-contract-iQfTtUSL.d.ts +1161 -0
- package/dist/ui.d.ts +320 -0
- package/dist/ui.js +253 -0
- package/dist/ui.js.map +1 -0
- package/package.json +199 -0
- package/src/generated/reducer-contract/builders.ts +90 -0
- package/src/generated/reducer-contract/version.ts +9 -0
- package/src/generated/reducer-contract/wire.ts +100 -0
- package/src/generated/reducer-contract/zod.ts +101 -0
- package/src/generated/runtime/primitives.ts +2 -0
- package/src/generated/runtime-api.ts +5 -0
- package/src/generated/runtime.ts +35 -0
- package/src/generated/workspace-contract.ts +2 -0
- package/src/index.ts +7 -0
- package/src/infrastructure/reducer-bundle-abi.ts +8 -0
- package/src/infrastructure/reducer-contract/bundle.ts +37 -0
- package/src/infrastructure/workspace-codegen/hex-geometry.ts +69 -0
- package/src/infrastructure/workspace-codegen/index.ts +64 -0
- package/src/infrastructure/workspace-codegen/manifest-contract.ts +6632 -0
- package/src/infrastructure/workspace-codegen/manifest-validation.ts +795 -0
- package/src/infrastructure/workspace-codegen/ownership.ts +131 -0
- package/src/infrastructure/workspace-codegen/preset-card-sets.ts +169 -0
- package/src/infrastructure/workspace-codegen/seeds.ts +1705 -0
- package/src/infrastructure/workspace-codegen.ts +1 -0
- package/src/package-set.ts +19 -0
- package/src/reducer/authoring/contract.ts +157 -0
- package/src/reducer/authoring/effect.ts +224 -0
- package/src/reducer/authoring/game.ts +23 -0
- package/src/reducer/authoring/interaction.ts +98 -0
- package/src/reducer/authoring/phase.ts +300 -0
- package/src/reducer/authoring/types.ts +70 -0
- package/src/reducer/authoring/validation.ts +382 -0
- package/src/reducer/authoring/view-stage.ts +68 -0
- package/src/reducer/authoring.ts +29 -0
- package/src/reducer/bundle/ingress-bundle.ts +491 -0
- package/src/reducer/bundle/trusted/engine-instruction-resolver.ts +254 -0
- package/src/reducer/bundle/trusted/flow-instruction-resolver.ts +73 -0
- package/src/reducer/bundle/trusted/instruction-runner.ts +414 -0
- package/src/reducer/bundle/trusted/interaction-authorization.ts +137 -0
- package/src/reducer/bundle/trusted/interaction-collectors.ts +859 -0
- package/src/reducer/bundle/trusted/interaction-decision.ts +747 -0
- package/src/reducer/bundle/trusted/interaction-resolver.ts +95 -0
- package/src/reducer/bundle/trusted/interaction-types.ts +171 -0
- package/src/reducer/bundle/trusted/lifecycle-runner.ts +427 -0
- package/src/reducer/bundle/trusted/projection-builder.ts +356 -0
- package/src/reducer/bundle/trusted/projection-context.ts +39 -0
- package/src/reducer/bundle/trusted/rng-sampler.ts +150 -0
- package/src/reducer/bundle/trusted/runtime-registry.ts +120 -0
- package/src/reducer/bundle/trusted/runtime-scope.ts +336 -0
- package/src/reducer/bundle/trusted/simultaneous-player.ts +97 -0
- package/src/reducer/bundle/trusted/stage-resolver.ts +87 -0
- package/src/reducer/bundle/trusted/static-projection.ts +116 -0
- package/src/reducer/bundle/trusted/trusted-runtime-args.ts +97 -0
- package/src/reducer/bundle/trusted/trusted-runtime-result.ts +39 -0
- package/src/reducer/bundle/trusted/trusted-setup-profiles.ts +43 -0
- package/src/reducer/bundle/trusted/trusted-state-codec.ts +48 -0
- package/src/reducer/bundle/trusted-bundle.ts +97 -0
- package/src/reducer/bundle/types.ts +171 -0
- package/src/reducer/bundle.ts +2 -0
- package/src/reducer/client-param-schemas.ts +57 -0
- package/src/reducer/compose.ts +34 -0
- package/src/reducer/core/runtime-input.ts +30 -0
- package/src/reducer/core/runtime-instruction.ts +59 -0
- package/src/reducer/core/types.ts +62 -0
- package/src/reducer/definition-index.ts +277 -0
- package/src/reducer/derived.ts +106 -0
- package/src/reducer/effects.ts +92 -0
- package/src/reducer/engine/runtime-instruction-engine.ts +155 -0
- package/src/reducer/ingress/decode-runtime-input.ts +7 -0
- package/src/reducer/ingress/decode-session-state.ts +9 -0
- package/src/reducer/ingress/encode-session-state.ts +6 -0
- package/src/reducer/ingress/input-codec.ts +18 -0
- package/src/reducer/ingress/phase-schemas.ts +62 -0
- package/src/reducer/ingress/raw-types.ts +107 -0
- package/src/reducer/ingress/runtime-codec.ts +14 -0
- package/src/reducer/ingress/runtime-payload.ts +13 -0
- package/src/reducer/ingress/session-codec.ts +392 -0
- package/src/reducer/ingress/types.ts +6 -0
- package/src/reducer/inputs/boardInput.ts +217 -0
- package/src/reducer/inputs/boardTarget.ts +190 -0
- package/src/reducer/inputs/cardInput.ts +86 -0
- package/src/reducer/inputs/cardTarget.ts +101 -0
- package/src/reducer/inputs/choiceTarget.ts +104 -0
- package/src/reducer/inputs/defineInputs.ts +71 -0
- package/src/reducer/inputs/formInput.ts +809 -0
- package/src/reducer/inputs/many.ts +120 -0
- package/src/reducer/inputs/promptInput.ts +87 -0
- package/src/reducer/inputs/rngInput.ts +58 -0
- package/src/reducer/inputs/targetRule.ts +123 -0
- package/src/reducer/inputs.ts +41 -0
- package/src/reducer/model/definition.ts +1072 -0
- package/src/reducer/model/extract.ts +745 -0
- package/src/reducer/model/manifest.ts +570 -0
- package/src/reducer/model/queries.ts +641 -0
- package/src/reducer/model/runtime.ts +264 -0
- package/src/reducer/model/spec.ts +1386 -0
- package/src/reducer/model/table.ts +260 -0
- package/src/reducer/model.ts +7 -0
- package/src/reducer/ops.ts +1034 -0
- package/src/reducer/parse-utils.ts +28 -0
- package/src/reducer/per-player.ts +422 -0
- package/src/reducer/rng.ts +69 -0
- package/src/reducer/schema-helpers.ts +185 -0
- package/src/reducer/setup-bootstrap-helpers.ts +171 -0
- package/src/reducer/setup-bootstrap.ts +481 -0
- package/src/reducer/table-ops.ts +2671 -0
- package/src/reducer/table-queries.ts +372 -0
- package/src/reducer/transaction.ts +120 -0
- package/src/reducer.ts +314 -0
- package/src/runtime/primitives.ts +1 -0
- package/src/runtime/types/runtime-api.ts +1 -0
- package/src/runtime/workspace-contract.ts +32 -0
- package/src/runtime-internal/components/InteractionForm.tsx +1309 -0
- package/src/runtime-internal/components/PluginRuntime.tsx +103 -0
- package/src/runtime-internal/components/board/target-layer.ts +70 -0
- package/src/runtime-internal/context/ClientParamSchemaContext.tsx +44 -0
- package/src/runtime-internal/context/InteractionDraftContext.tsx +279 -0
- package/src/runtime-internal/context/PluginSessionContext.tsx +47 -0
- package/src/runtime-internal/context/PluginStateContext.tsx +262 -0
- package/src/runtime-internal/context/RuntimeContext.tsx +96 -0
- package/src/runtime-internal/defaults/components.tsx +409 -0
- package/src/runtime-internal/defaults/index.ts +11 -0
- package/src/runtime-internal/errors/ValidationError.ts +29 -0
- package/src/runtime-internal/hooks/useActivePlayers.ts +33 -0
- package/src/runtime-internal/hooks/useBoardInteractions.ts +665 -0
- package/src/runtime-internal/hooks/useGameSelector.ts +105 -0
- package/src/runtime-internal/hooks/useGameView.ts +9 -0
- package/src/runtime-internal/hooks/useInteractionByKey.ts +354 -0
- package/src/runtime-internal/hooks/useInteractionHandle.ts +438 -0
- package/src/runtime-internal/hooks/useIsMyTurn.ts +20 -0
- package/src/runtime-internal/hooks/useLobby.ts +76 -0
- package/src/runtime-internal/hooks/useMe.ts +48 -0
- package/src/runtime-internal/hooks/usePlayerInfo.ts +28 -0
- package/src/runtime-internal/hooks/usePlayerTurnOrder.ts +23 -0
- package/src/runtime-internal/hooks/usePluginRuntime.ts +147 -0
- package/src/runtime-internal/hooks/useSeatInbox.ts +61 -0
- package/src/runtime-internal/hooks/useSimultaneousPhase.ts +10 -0
- package/src/runtime-internal/index.ts +42 -0
- package/src/runtime-internal/internal.ts +43 -0
- package/src/runtime-internal/plugin-styles.css +250 -0
- package/src/runtime-internal/primitives/board.tsx +459 -0
- package/src/runtime-internal/primitives/dialog-lifecycle.ts +58 -0
- package/src/runtime-internal/primitives/dice.tsx +79 -0
- package/src/runtime-internal/primitives/game-ui-provider.tsx +35 -0
- package/src/runtime-internal/primitives/game.tsx +387 -0
- package/src/runtime-internal/primitives/hand-intent-adapter.ts +147 -0
- package/src/runtime-internal/primitives/hand-surface.tsx +594 -0
- package/src/runtime-internal/primitives/index.ts +196 -0
- package/src/runtime-internal/primitives/interaction-form-binding.tsx +56 -0
- package/src/runtime-internal/primitives/interaction-submit.ts +90 -0
- package/src/runtime-internal/primitives/interaction.tsx +987 -0
- package/src/runtime-internal/primitives/phase.tsx +43 -0
- package/src/runtime-internal/primitives/player-roster.tsx +302 -0
- package/src/runtime-internal/primitives/primitive-props.tsx +101 -0
- package/src/runtime-internal/primitives/prompt.tsx +255 -0
- package/src/runtime-internal/primitives/ui.tsx +60 -0
- package/src/runtime-internal/primitives/zone.tsx +791 -0
- package/src/runtime-internal/reducer.ts +30 -0
- package/src/runtime-internal/runtime/createPluginRuntimeAPI.ts +605 -0
- package/src/runtime-internal/types/plugin-state.ts +508 -0
- package/src/runtime-internal/types/reducer-state.ts +24 -0
- package/src/runtime-internal/types/runtime-api.ts +114 -0
- package/src/runtime-internal/ui-contract.ts +519 -0
- package/src/runtime-internal/utils/card-intent-adapter.ts +546 -0
- package/src/runtime-internal/utils/interaction-inputs.ts +492 -0
- package/src/runtime-internal/utils/interaction-labels.ts +23 -0
- package/src/runtime-internal/utils/interaction-router.ts +273 -0
- package/src/runtime-internal/utils/interaction-status.ts +74 -0
- package/src/runtime-internal/workspace-contract.ts +1170 -0
- package/src/runtime.ts +34 -0
- package/src/testing/create-expect-api.ts +352 -0
- package/src/testing/create-test-runtime.ts +381 -0
- package/src/testing/definitions.ts +127 -0
- package/src/testing/index.ts +3 -0
- package/src/testing.ts +1 -0
- package/src/type-stubs/manifest-contract.d.ts +42 -0
- package/src/type-stubs/manifest-contract.js +72 -0
- package/src/type-stubs/ui-contract.d.ts +5 -0
- package/src/type-stubs/ui-contract.js +1 -0
- package/src/types/authoring-card-properties.type-test.ts +266 -0
- package/src/types/authoring.ts +1282 -0
- package/src/types/cards.ts +19 -0
- package/src/types/contracts.ts +1550 -0
- package/src/types/generated-helpers.ts +35 -0
- package/src/types/index.ts +147 -0
- package/src/types/slots.ts +11 -0
- package/src/types.ts +1 -0
- package/src/ui/components/ActionButton.tsx +97 -0
- package/src/ui/components/ActionPanel.tsx +315 -0
- package/src/ui/components/Card.tsx +378 -0
- package/src/ui/components/CardDragSurface.tsx +1076 -0
- package/src/ui/components/ChromeSuppressionContext.tsx +70 -0
- package/src/ui/components/CostDisplay.tsx +145 -0
- package/src/ui/components/DiceRoller.tsx +581 -0
- package/src/ui/components/Drawer.tsx +180 -0
- package/src/ui/components/ErrorBoundary.tsx +275 -0
- package/src/ui/components/GameEndDisplay.tsx +398 -0
- package/src/ui/components/GameSkeleton.tsx +260 -0
- package/src/ui/components/Hand.tsx +468 -0
- package/src/ui/components/HandDock.tsx +299 -0
- package/src/ui/components/HandView.tsx +441 -0
- package/src/ui/components/MobileHandTray.tsx +381 -0
- package/src/ui/components/MoreActions.tsx +143 -0
- package/src/ui/components/PhaseIndicator.tsx +341 -0
- package/src/ui/components/PlayArea.tsx +146 -0
- package/src/ui/components/PrimaryActionButton.tsx +336 -0
- package/src/ui/components/PrimaryButton.tsx +45 -0
- package/src/ui/components/ResourceCounter.tsx +270 -0
- package/src/ui/components/StagingZone.tsx +134 -0
- package/src/ui/components/ThemedButton.tsx +113 -0
- package/src/ui/components/Toast.tsx +264 -0
- package/src/ui/components/board/HexGrid.tsx +1294 -0
- package/src/ui/components/board/NetworkGraph.tsx +476 -0
- package/src/ui/components/board/SlotSystem.tsx +388 -0
- package/src/ui/components/board/SquareGrid.tsx +1165 -0
- package/src/ui/components/board/TrackBoard.tsx +496 -0
- package/src/ui/components/board/ZoneMap.tsx +448 -0
- package/src/ui/components/board/hex-board-view.ts +123 -0
- package/src/ui/components/board/index.ts +142 -0
- package/src/ui/components/board/interaction-accessibility.ts +21 -0
- package/src/ui/components/board/target-layer.ts +66 -0
- package/src/ui/components/card-render-content.type-test.ts +27 -0
- package/src/ui/components/hand-layout-math.ts +163 -0
- package/src/ui/components/hand-pointer-engine.ts +413 -0
- package/src/ui/components/index.ts +245 -0
- package/src/ui/components.ts +1 -0
- package/src/ui/defaults/components.tsx +106 -0
- package/src/ui/defaults/index.ts +8 -0
- package/src/ui/defaults.ts +1 -0
- package/src/ui/errors/ValidationError.ts +29 -0
- package/src/ui/helpers/cards.ts +19 -0
- package/src/ui/helpers/track-board.ts +211 -0
- package/src/ui/hooks/useBoardTopology.ts +316 -0
- package/src/ui/hooks/useCards.ts +10 -0
- package/src/ui/hooks/useHandCardPointer.ts +381 -0
- package/src/ui/hooks/useHandLayout.ts +378 -0
- package/src/ui/hooks/useHandPresentation.ts +121 -0
- package/src/ui/hooks/useHexBoard.ts +74 -0
- package/src/ui/hooks/useHexGrid.ts +185 -0
- package/src/ui/hooks/useIsMobile.ts +35 -0
- package/src/ui/hooks/usePanZoom.ts +278 -0
- package/src/ui/hooks/useSquareBoard.ts +124 -0
- package/src/ui/hooks/useSquareGrid.ts +328 -0
- package/src/ui/index.ts +98 -0
- package/src/ui/internal/ui/alert.tsx +51 -0
- package/src/ui/internal/ui/button.tsx +58 -0
- package/src/ui/internal/ui/dialog.tsx +134 -0
- package/src/ui/internal/ui/input.tsx +21 -0
- package/src/ui/internal/ui/label.tsx +21 -0
- package/src/ui/internal/ui/select.tsx +129 -0
- package/src/ui/internal/ui/tooltip.tsx +54 -0
- package/src/ui/internal/ui/utils.ts +5 -0
- package/src/ui/plugin-styles.css +250 -0
- package/src/ui/primitives/dialog-lifecycle.ts +58 -0
- package/src/ui/primitives/dice.tsx +79 -0
- package/src/ui/primitives/primitive-props.tsx +101 -0
- package/src/ui/theme/ThemeProvider.tsx +252 -0
- package/src/ui/theme/board.ts +61 -0
- package/src/ui/theme/css-vars.ts +105 -0
- package/src/ui/theme/derive.ts +240 -0
- package/src/ui/theme/index.ts +61 -0
- package/src/ui/theme/presets/arcade.ts +261 -0
- package/src/ui/theme/presets/studio.ts +261 -0
- package/src/ui/theme/presets/tabletop.ts +266 -0
- package/src/ui/theme/tokens.ts +392 -0
- package/src/ui/types/hex-color.ts +20 -0
- package/src/ui/types/player-state.ts +463 -0
- package/src/ui/types/tiled-board.ts +785 -0
- package/src/ui/types/visual-state.ts +137 -0
- package/src/ui.ts +1 -0
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { useState, useEffect, useRef } from "react";
|
|
2
|
+
import {
|
|
3
|
+
createPluginRuntimeAPI,
|
|
4
|
+
type PluginRuntimeAPI,
|
|
5
|
+
} from "../runtime/createPluginRuntimeAPI.js";
|
|
6
|
+
|
|
7
|
+
export interface UsePluginRuntimeOptions {
|
|
8
|
+
/**
|
|
9
|
+
* Timeout in milliseconds to wait for state-sync.
|
|
10
|
+
* @default 10000 (10 seconds)
|
|
11
|
+
*/
|
|
12
|
+
timeout?: number;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface UsePluginRuntimeResult {
|
|
16
|
+
/** The RuntimeAPI instance */
|
|
17
|
+
runtime: PluginRuntimeAPI;
|
|
18
|
+
/** Whether the initial reducer-native snapshot is available and ready */
|
|
19
|
+
isReady: boolean;
|
|
20
|
+
/**
|
|
21
|
+
* True when the plugin was ready before but the current snapshot has no
|
|
22
|
+
* projected view — e.g. you've acted and are waiting on the rest of the
|
|
23
|
+
* table in a simultaneous phase. Lets the loading affordance read as a
|
|
24
|
+
* mid-game wait rather than a cold "still loading" stall.
|
|
25
|
+
*/
|
|
26
|
+
waiting: boolean;
|
|
27
|
+
/** Error message if initialization failed */
|
|
28
|
+
error: string | null;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function hasProjectedView(
|
|
32
|
+
snapshot: ReturnType<PluginRuntimeAPI["getSnapshot"]> | null | undefined,
|
|
33
|
+
): boolean {
|
|
34
|
+
return (
|
|
35
|
+
snapshot !== null &&
|
|
36
|
+
snapshot !== undefined &&
|
|
37
|
+
snapshot.view !== null &&
|
|
38
|
+
snapshot.view !== undefined
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Hook that creates and manages a PluginRuntimeAPI instance.
|
|
44
|
+
*
|
|
45
|
+
* This hook handles:
|
|
46
|
+
* 1. Creating the RuntimeAPI
|
|
47
|
+
* 2. Waiting for the first state-sync snapshot before setting isReady
|
|
48
|
+
*
|
|
49
|
+
* In the new architecture, the host only renders the plugin when a reducer-native
|
|
50
|
+
* snapshot is available, so isReady should become true quickly after init.
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* ```tsx
|
|
54
|
+
* function PluginRuntime({ children }: { children: React.ReactNode }) {
|
|
55
|
+
* const { runtime, isReady, error } = usePluginRuntime();
|
|
56
|
+
*
|
|
57
|
+
* if (error) {
|
|
58
|
+
* return <div>Error: {error}</div>;
|
|
59
|
+
* }
|
|
60
|
+
*
|
|
61
|
+
* if (!isReady) {
|
|
62
|
+
* return <GameSkeleton message="Waiting for game state..." />;
|
|
63
|
+
* }
|
|
64
|
+
*
|
|
65
|
+
* return <RuntimeProvider runtime={runtime}>{children}</RuntimeProvider>;
|
|
66
|
+
* }
|
|
67
|
+
* ```
|
|
68
|
+
*/
|
|
69
|
+
export function usePluginRuntime(
|
|
70
|
+
options: UsePluginRuntimeOptions = {},
|
|
71
|
+
): UsePluginRuntimeResult {
|
|
72
|
+
const { timeout = 10000 } = options;
|
|
73
|
+
|
|
74
|
+
// Create runtime once and keep stable reference
|
|
75
|
+
const [runtime] = useState<PluginRuntimeAPI>(() => createPluginRuntimeAPI());
|
|
76
|
+
const [isReady, setIsReady] = useState(() => {
|
|
77
|
+
const snapshot = runtime.getSnapshot?.();
|
|
78
|
+
return hasProjectedView(snapshot);
|
|
79
|
+
});
|
|
80
|
+
const [error, setError] = useState<string | null>(null);
|
|
81
|
+
// Latches once we've shown a view, so a later view-less snapshot reads as a
|
|
82
|
+
// mid-game wait rather than a fresh load. (A ref, so it never re-triggers a
|
|
83
|
+
// render on its own.)
|
|
84
|
+
const hasBeenReadyRef = useRef(false);
|
|
85
|
+
if (isReady) hasBeenReadyRef.current = true;
|
|
86
|
+
|
|
87
|
+
// Subscribe to state-sync and set isReady when the first snapshot arrives.
|
|
88
|
+
useEffect(() => {
|
|
89
|
+
const markReadyFromSnapshot = () => {
|
|
90
|
+
const currentSnapshot = runtime.getSnapshot?.();
|
|
91
|
+
if (!hasProjectedView(currentSnapshot)) {
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
setError(null);
|
|
95
|
+
setIsReady(true);
|
|
96
|
+
return true;
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
if (markReadyFromSnapshot()) {
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// Set up timeout
|
|
104
|
+
const timeoutId = setTimeout(() => {
|
|
105
|
+
if (!markReadyFromSnapshot()) {
|
|
106
|
+
setError(
|
|
107
|
+
`Timed out waiting for the initial projected view after ${timeout}ms. ` +
|
|
108
|
+
"Ensure the host sends a reducer-native state-sync with a seat view.",
|
|
109
|
+
);
|
|
110
|
+
}
|
|
111
|
+
}, timeout);
|
|
112
|
+
|
|
113
|
+
// Fallback poll for dev/HMR flows where the runtime snapshot may already
|
|
114
|
+
// exist but the first subscribe callback is missed.
|
|
115
|
+
const pollId = setInterval(() => {
|
|
116
|
+
if (markReadyFromSnapshot()) {
|
|
117
|
+
clearInterval(pollId);
|
|
118
|
+
clearTimeout(timeoutId);
|
|
119
|
+
}
|
|
120
|
+
}, 100);
|
|
121
|
+
|
|
122
|
+
// Subscribe to state changes
|
|
123
|
+
const unsubscribe = runtime.subscribeToState?.((state) => {
|
|
124
|
+
if (!hasProjectedView(state)) {
|
|
125
|
+
setIsReady(false);
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
clearInterval(pollId);
|
|
129
|
+
clearTimeout(timeoutId);
|
|
130
|
+
setError(null);
|
|
131
|
+
setIsReady(true);
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
return () => {
|
|
135
|
+
clearInterval(pollId);
|
|
136
|
+
clearTimeout(timeoutId);
|
|
137
|
+
unsubscribe?.();
|
|
138
|
+
};
|
|
139
|
+
}, [runtime, timeout]);
|
|
140
|
+
|
|
141
|
+
return {
|
|
142
|
+
runtime,
|
|
143
|
+
isReady,
|
|
144
|
+
waiting: hasBeenReadyRef.current && !isReady,
|
|
145
|
+
error,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { usePluginState } from "../context/PluginStateContext.js";
|
|
2
|
+
import type { InteractionDescriptor } from "../types/plugin-state.js";
|
|
3
|
+
import {
|
|
4
|
+
eligibleTargetsByBoardKind,
|
|
5
|
+
hasBoardTargetInput,
|
|
6
|
+
} from "../utils/interaction-inputs.js";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Structured inbox view of the controlling seat's available interactions.
|
|
10
|
+
* Interactions are grouped into UI behavior buckets. Prompt-kind interactions
|
|
11
|
+
* (authored via `promptInput(...)`) surface at `bySurface.inbox`.
|
|
12
|
+
*/
|
|
13
|
+
export interface SeatInbox {
|
|
14
|
+
/** Interactions grouped by derived UI bucket id. */
|
|
15
|
+
bySurface: Record<string, readonly InteractionDescriptor[]>;
|
|
16
|
+
/** Prompt-kind interactions addressed to the controlling seat. */
|
|
17
|
+
prompts: readonly InteractionDescriptor[];
|
|
18
|
+
/** Flat list of all available interactions (ungrouped). */
|
|
19
|
+
all: readonly InteractionDescriptor[];
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Returns the controlling seat's available interactions grouped by UI bucket.
|
|
24
|
+
* Prompt-kind interactions (authored via `promptInput(...)`) appear both in
|
|
25
|
+
* `bySurface.inbox` and in `prompts`. Backed by authoritative descriptors
|
|
26
|
+
* from the trusted bundle — clients MUST NOT recompute availability.
|
|
27
|
+
*/
|
|
28
|
+
export function useSeatInbox(): SeatInbox {
|
|
29
|
+
const interactions = usePluginState(
|
|
30
|
+
(s) => s.gameplay.availableInteractions ?? [],
|
|
31
|
+
);
|
|
32
|
+
|
|
33
|
+
const bySurface: Record<string, InteractionDescriptor[]> = {};
|
|
34
|
+
const prompts: InteractionDescriptor[] = [];
|
|
35
|
+
for (const descriptor of interactions) {
|
|
36
|
+
const surface = bucketForDescriptor(descriptor);
|
|
37
|
+
(bySurface[surface] ??= []).push(descriptor);
|
|
38
|
+
if (descriptor.kind === "prompt") {
|
|
39
|
+
prompts.push(descriptor);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
return {
|
|
44
|
+
bySurface,
|
|
45
|
+
prompts,
|
|
46
|
+
all: interactions,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function bucketForDescriptor(descriptor: InteractionDescriptor): string {
|
|
51
|
+
if (descriptor.kind === "prompt") return "inbox";
|
|
52
|
+
if (descriptor.zoneId) return "hand";
|
|
53
|
+
if (hasBoardTargetInput(descriptor)) {
|
|
54
|
+
const byKind = eligibleTargetsByBoardKind(descriptor);
|
|
55
|
+
if (byKind.vertex) return "board-vertex";
|
|
56
|
+
if (byKind.edge) return "board-edge";
|
|
57
|
+
if (byKind.tile) return "board-tile";
|
|
58
|
+
if (byKind.space) return "board-space";
|
|
59
|
+
}
|
|
60
|
+
return "panel";
|
|
61
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { usePluginState } from "../context/PluginStateContext.js";
|
|
2
|
+
import type { SimultaneousPhaseSnapshot } from "../types/plugin-state.js";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Returns visibility-safe progress metadata for the active simultaneous-player
|
|
6
|
+
* phase, or null when no simultaneous submission barrier is active.
|
|
7
|
+
*/
|
|
8
|
+
export function useSimultaneousPhase(): SimultaneousPhaseSnapshot | null {
|
|
9
|
+
return usePluginState((state) => state.gameplay.simultaneousPhase ?? null);
|
|
10
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export {
|
|
2
|
+
createDreamboardUI,
|
|
3
|
+
type CardKey,
|
|
4
|
+
type DreamboardUI,
|
|
5
|
+
type DreamboardUIRegister,
|
|
6
|
+
type TypedGame,
|
|
7
|
+
type UIContract,
|
|
8
|
+
type ZoneKey,
|
|
9
|
+
} from "./ui-contract.js";
|
|
10
|
+
export { PluginStateProvider } from "./context/PluginStateContext.js";
|
|
11
|
+
export {
|
|
12
|
+
RuntimeContext,
|
|
13
|
+
RuntimeProvider,
|
|
14
|
+
useRuntimeContext,
|
|
15
|
+
} from "./context/RuntimeContext.js";
|
|
16
|
+
export {
|
|
17
|
+
type ClientParamSchema,
|
|
18
|
+
type ClientParamSchemaMap,
|
|
19
|
+
} from "./context/ClientParamSchemaContext.js";
|
|
20
|
+
export {
|
|
21
|
+
PluginRuntime,
|
|
22
|
+
type PluginRuntimeProps,
|
|
23
|
+
} from "./components/PluginRuntime.js";
|
|
24
|
+
export { createPluginRuntimeAPI } from "./runtime/createPluginRuntimeAPI.js";
|
|
25
|
+
export { usePluginRuntime } from "./hooks/usePluginRuntime.js";
|
|
26
|
+
export type * from "./hooks/usePluginRuntime.js";
|
|
27
|
+
export type {
|
|
28
|
+
DraftValidation,
|
|
29
|
+
InteractionHandle,
|
|
30
|
+
InteractionHandleStatus,
|
|
31
|
+
InteractionParamsShape,
|
|
32
|
+
} from "./hooks/useInteractionHandle.js";
|
|
33
|
+
export type {
|
|
34
|
+
ActionInteractionDescriptor,
|
|
35
|
+
InteractionContext,
|
|
36
|
+
InteractionContextOption,
|
|
37
|
+
InteractionDescriptor,
|
|
38
|
+
InputDomainDependencyCase,
|
|
39
|
+
PluginStateSnapshot,
|
|
40
|
+
PromptInteractionDescriptor,
|
|
41
|
+
} from "./types/plugin-state.js";
|
|
42
|
+
export type * from "./types/runtime-api.js";
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export {
|
|
2
|
+
RuntimeContext,
|
|
3
|
+
RuntimeProvider,
|
|
4
|
+
useRuntimeContext,
|
|
5
|
+
} from "./context/RuntimeContext.js";
|
|
6
|
+
export {
|
|
7
|
+
createDreamboardUI,
|
|
8
|
+
type DreamboardUI,
|
|
9
|
+
type TypedGame,
|
|
10
|
+
} from "./ui-contract.js";
|
|
11
|
+
export type {
|
|
12
|
+
BoardHexGridInteractionFilter,
|
|
13
|
+
BoardHexGridProps,
|
|
14
|
+
BoardHexViewProps,
|
|
15
|
+
BoardSpaceTargetProps,
|
|
16
|
+
BoardTargetProps,
|
|
17
|
+
BoardEdgeTargetProps,
|
|
18
|
+
BoardVertexTargetProps,
|
|
19
|
+
UIRootProps,
|
|
20
|
+
ZoneCardAtProps,
|
|
21
|
+
ZoneCardRenderItem,
|
|
22
|
+
ZoneListProps,
|
|
23
|
+
ZonePileCardsProps,
|
|
24
|
+
} from "./primitives/index.js";
|
|
25
|
+
export {
|
|
26
|
+
InteractionForm,
|
|
27
|
+
defaultFormInputs,
|
|
28
|
+
hasDefaultInteractionFormFields,
|
|
29
|
+
type InteractionFormProps,
|
|
30
|
+
} from "./components/InteractionForm.js";
|
|
31
|
+
export { createPluginRuntimeAPI } from "./runtime/createPluginRuntimeAPI.js";
|
|
32
|
+
export {
|
|
33
|
+
PluginStateProvider,
|
|
34
|
+
usePluginActions,
|
|
35
|
+
usePluginState,
|
|
36
|
+
} from "./context/PluginStateContext.js";
|
|
37
|
+
export { usePluginRuntime } from "./hooks/usePluginRuntime.js";
|
|
38
|
+
export type { PluginStateSnapshot } from "./types/plugin-state.js";
|
|
39
|
+
export type {
|
|
40
|
+
RuntimeAPI,
|
|
41
|
+
SubmissionError,
|
|
42
|
+
ValidationResult,
|
|
43
|
+
} from "./types/runtime-api.js";
|