@dreamboard-games/ui-sdk 0.0.41
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 +89 -0
- package/NOTICE +1 -0
- package/README.md +154 -0
- package/dist/components/ActionButton.d.ts +13 -0
- package/dist/components/ActionButton.d.ts.map +1 -0
- package/dist/components/ActionButton.js +14 -0
- package/dist/components/ActionPanel.d.ts +33 -0
- package/dist/components/ActionPanel.d.ts.map +1 -0
- package/dist/components/ActionPanel.js +148 -0
- package/dist/components/Card.d.ts +29 -0
- package/dist/components/Card.d.ts.map +1 -0
- package/dist/components/Card.js +220 -0
- package/dist/components/ChromeSuppressionContext.d.ts +7 -0
- package/dist/components/ChromeSuppressionContext.d.ts.map +1 -0
- package/dist/components/ChromeSuppressionContext.js +34 -0
- package/dist/components/CostDisplay.d.ts +22 -0
- package/dist/components/CostDisplay.d.ts.map +1 -0
- package/dist/components/CostDisplay.js +41 -0
- package/dist/components/DiceRoller.d.ts +30 -0
- package/dist/components/DiceRoller.d.ts.map +1 -0
- package/dist/components/DiceRoller.js +319 -0
- package/dist/components/Drawer.d.ts +19 -0
- package/dist/components/Drawer.d.ts.map +1 -0
- package/dist/components/Drawer.js +55 -0
- package/dist/components/ErrorBoundary.d.ts +24 -0
- package/dist/components/ErrorBoundary.d.ts.map +1 -0
- package/dist/components/ErrorBoundary.js +37 -0
- package/dist/components/GameEndDisplay.d.ts +27 -0
- package/dist/components/GameEndDisplay.d.ts.map +1 -0
- package/dist/components/GameEndDisplay.js +185 -0
- package/dist/components/GameSkeleton.d.ts +12 -0
- package/dist/components/GameSkeleton.d.ts.map +1 -0
- package/dist/components/GameSkeleton.js +54 -0
- package/dist/components/Hand.d.ts +99 -0
- package/dist/components/Hand.d.ts.map +1 -0
- package/dist/components/Hand.js +162 -0
- package/dist/components/HandDock.d.ts +35 -0
- package/dist/components/HandDock.d.ts.map +1 -0
- package/dist/components/HandDock.js +124 -0
- package/dist/components/InteractionForm.d.ts +50 -0
- package/dist/components/InteractionForm.d.ts.map +1 -0
- package/dist/components/InteractionForm.js +402 -0
- package/dist/components/MoreActions.d.ts +49 -0
- package/dist/components/MoreActions.d.ts.map +1 -0
- package/dist/components/MoreActions.js +64 -0
- package/dist/components/PhaseIndicator.d.ts +35 -0
- package/dist/components/PhaseIndicator.d.ts.map +1 -0
- package/dist/components/PhaseIndicator.js +212 -0
- package/dist/components/PlayArea.d.ts +28 -0
- package/dist/components/PlayArea.d.ts.map +1 -0
- package/dist/components/PlayArea.js +48 -0
- package/dist/components/PluginRuntime.d.ts +37 -0
- package/dist/components/PluginRuntime.d.ts.map +1 -0
- package/dist/components/PluginRuntime.js +47 -0
- package/dist/components/PrimaryActionButton.d.ts +98 -0
- package/dist/components/PrimaryActionButton.d.ts.map +1 -0
- package/dist/components/PrimaryActionButton.js +183 -0
- package/dist/components/PrimaryButton.d.ts +20 -0
- package/dist/components/PrimaryButton.d.ts.map +1 -0
- package/dist/components/PrimaryButton.js +5 -0
- package/dist/components/PromptDialogHost.d.ts +15 -0
- package/dist/components/PromptDialogHost.d.ts.map +1 -0
- package/dist/components/PromptDialogHost.js +22 -0
- package/dist/components/ResourceCounter.d.ts +38 -0
- package/dist/components/ResourceCounter.d.ts.map +1 -0
- package/dist/components/ResourceCounter.js +118 -0
- package/dist/components/ThemedButton.d.ts +12 -0
- package/dist/components/ThemedButton.d.ts.map +1 -0
- package/dist/components/ThemedButton.js +38 -0
- package/dist/components/Toast.d.ts +35 -0
- package/dist/components/Toast.d.ts.map +1 -0
- package/dist/components/Toast.js +116 -0
- package/dist/components/board/HexGrid.d.ts +344 -0
- package/dist/components/board/HexGrid.d.ts.map +1 -0
- package/dist/components/board/HexGrid.js +340 -0
- package/dist/components/board/NetworkGraph.d.ts +100 -0
- package/dist/components/board/NetworkGraph.d.ts.map +1 -0
- package/dist/components/board/NetworkGraph.js +123 -0
- package/dist/components/board/SlotSystem.d.ts +71 -0
- package/dist/components/board/SlotSystem.d.ts.map +1 -0
- package/dist/components/board/SlotSystem.js +87 -0
- package/dist/components/board/SquareGrid.d.ts +188 -0
- package/dist/components/board/SquareGrid.d.ts.map +1 -0
- package/dist/components/board/SquareGrid.js +328 -0
- package/dist/components/board/TrackBoard.d.ts +113 -0
- package/dist/components/board/TrackBoard.d.ts.map +1 -0
- package/dist/components/board/TrackBoard.js +135 -0
- package/dist/components/board/ZoneMap.d.ts +88 -0
- package/dist/components/board/ZoneMap.d.ts.map +1 -0
- package/dist/components/board/ZoneMap.js +133 -0
- package/dist/components/board/hex-board-view.d.ts +69 -0
- package/dist/components/board/hex-board-view.d.ts.map +1 -0
- package/dist/components/board/hex-board-view.js +60 -0
- package/dist/components/board/index.d.ts +23 -0
- package/dist/components/board/index.d.ts.map +1 -0
- package/dist/components/board/index.js +40 -0
- package/dist/components/board/interaction-accessibility.d.ts +5 -0
- package/dist/components/board/interaction-accessibility.d.ts.map +1 -0
- package/dist/components/board/interaction-accessibility.js +13 -0
- package/dist/components/board/target-layer.d.ts +13 -0
- package/dist/components/board/target-layer.d.ts.map +1 -0
- package/dist/components/board/target-layer.js +10 -0
- package/dist/components/card-render-content.type-test.d.ts +2 -0
- package/dist/components/card-render-content.type-test.d.ts.map +1 -0
- package/dist/components/card-render-content.type-test.js +1 -0
- package/dist/components/index.d.ts +34 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +35 -0
- package/dist/components/interaction-dialog-behavior.d.ts +15 -0
- package/dist/components/interaction-dialog-behavior.d.ts.map +1 -0
- package/dist/components/interaction-dialog-behavior.js +9 -0
- package/dist/components/surfaces/BlockerSurface.d.ts +27 -0
- package/dist/components/surfaces/BlockerSurface.d.ts.map +1 -0
- package/dist/components/surfaces/BlockerSurface.js +38 -0
- package/dist/components/surfaces/BoardSurface.d.ts +77 -0
- package/dist/components/surfaces/BoardSurface.d.ts.map +1 -0
- package/dist/components/surfaces/BoardSurface.js +180 -0
- package/dist/components/surfaces/ChromeSurface.d.ts +29 -0
- package/dist/components/surfaces/ChromeSurface.d.ts.map +1 -0
- package/dist/components/surfaces/ChromeSurface.js +34 -0
- package/dist/components/surfaces/ExhaustivenessAudit.d.ts +32 -0
- package/dist/components/surfaces/ExhaustivenessAudit.d.ts.map +1 -0
- package/dist/components/surfaces/ExhaustivenessAudit.js +65 -0
- package/dist/components/surfaces/InboxSurface.d.ts +40 -0
- package/dist/components/surfaces/InboxSurface.d.ts.map +1 -0
- package/dist/components/surfaces/InboxSurface.js +99 -0
- package/dist/components/surfaces/MarketSurface.d.ts +62 -0
- package/dist/components/surfaces/MarketSurface.d.ts.map +1 -0
- package/dist/components/surfaces/MarketSurface.js +242 -0
- package/dist/components/surfaces/PanelSurface.d.ts +111 -0
- package/dist/components/surfaces/PanelSurface.d.ts.map +1 -0
- package/dist/components/surfaces/PanelSurface.js +180 -0
- package/dist/components/surfaces/PlayerCardsSurface.d.ts +104 -0
- package/dist/components/surfaces/PlayerCardsSurface.d.ts.map +1 -0
- package/dist/components/surfaces/PlayerCardsSurface.js +178 -0
- package/dist/components/surfaces/internal/CardZoneFollowUpForm.d.ts +7 -0
- package/dist/components/surfaces/internal/CardZoneFollowUpForm.d.ts.map +1 -0
- package/dist/components/surfaces/internal/CardZoneFollowUpForm.js +9 -0
- package/dist/components/surfaces/internal/DefaultInteractionButton.d.ts +71 -0
- package/dist/components/surfaces/internal/DefaultInteractionButton.d.ts.map +1 -0
- package/dist/components/surfaces/internal/DefaultInteractionButton.js +82 -0
- package/dist/components/surfaces/internal/useCardZoneInteractions.d.ts +21 -0
- package/dist/components/surfaces/internal/useCardZoneInteractions.d.ts.map +1 -0
- package/dist/components/surfaces/internal/useCardZoneInteractions.js +202 -0
- package/dist/components/surfaces/types.d.ts +59 -0
- package/dist/components/surfaces/types.d.ts.map +1 -0
- package/dist/components/surfaces/types.js +1 -0
- package/dist/context/ClientParamSchemaContext.d.ts +21 -0
- package/dist/context/ClientParamSchemaContext.d.ts.map +1 -0
- package/dist/context/ClientParamSchemaContext.js +12 -0
- package/dist/context/InteractionDraftContext.d.ts +69 -0
- package/dist/context/InteractionDraftContext.d.ts.map +1 -0
- package/dist/context/InteractionDraftContext.js +145 -0
- package/dist/context/PluginSessionContext.d.ts +33 -0
- package/dist/context/PluginSessionContext.d.ts.map +1 -0
- package/dist/context/PluginSessionContext.js +38 -0
- package/dist/context/PluginStateContext.d.ts +116 -0
- package/dist/context/PluginStateContext.d.ts.map +1 -0
- package/dist/context/PluginStateContext.js +186 -0
- package/dist/context/RuntimeContext.d.ts +49 -0
- package/dist/context/RuntimeContext.d.ts.map +1 -0
- package/dist/context/RuntimeContext.js +67 -0
- package/dist/defaults/components.d.ts +52 -0
- package/dist/defaults/components.d.ts.map +1 -0
- package/dist/defaults/components.js +159 -0
- package/dist/defaults/index.d.ts +2 -0
- package/dist/defaults/index.d.ts.map +1 -0
- package/dist/defaults/index.js +1 -0
- package/dist/errors/ValidationError.d.ts +10 -0
- package/dist/errors/ValidationError.d.ts.map +1 -0
- package/dist/errors/ValidationError.js +23 -0
- package/dist/helpers/cards.d.ts +3 -0
- package/dist/helpers/cards.d.ts.map +1 -0
- package/dist/helpers/cards.js +11 -0
- package/dist/helpers/track-board.d.ts +79 -0
- package/dist/helpers/track-board.d.ts.map +1 -0
- package/dist/helpers/track-board.js +56 -0
- package/dist/hooks/useActivePlayers.d.ts +16 -0
- package/dist/hooks/useActivePlayers.d.ts.map +1 -0
- package/dist/hooks/useActivePlayers.js +17 -0
- package/dist/hooks/useBoardInteractions.d.ts +110 -0
- package/dist/hooks/useBoardInteractions.d.ts.map +1 -0
- package/dist/hooks/useBoardInteractions.js +248 -0
- package/dist/hooks/useBoardTopology.d.ts +23 -0
- package/dist/hooks/useBoardTopology.d.ts.map +1 -0
- package/dist/hooks/useBoardTopology.js +128 -0
- package/dist/hooks/useCards.d.ts +3 -0
- package/dist/hooks/useCards.d.ts.map +1 -0
- package/dist/hooks/useCards.js +5 -0
- package/dist/hooks/useGameSelector.d.ts +13 -0
- package/dist/hooks/useGameSelector.d.ts.map +1 -0
- package/dist/hooks/useGameSelector.js +67 -0
- package/dist/hooks/useGameView.d.ts +6 -0
- package/dist/hooks/useGameView.d.ts.map +1 -0
- package/dist/hooks/useGameView.js +7 -0
- package/dist/hooks/useHandLayout.d.ts +120 -0
- package/dist/hooks/useHandLayout.d.ts.map +1 -0
- package/dist/hooks/useHandLayout.js +235 -0
- package/dist/hooks/useHexBoard.d.ts +19 -0
- package/dist/hooks/useHexBoard.d.ts.map +1 -0
- package/dist/hooks/useHexBoard.js +28 -0
- package/dist/hooks/useHexGrid.d.ts +56 -0
- package/dist/hooks/useHexGrid.d.ts.map +1 -0
- package/dist/hooks/useHexGrid.js +112 -0
- package/dist/hooks/useInteractionByKey.d.ts +29 -0
- package/dist/hooks/useInteractionByKey.d.ts.map +1 -0
- package/dist/hooks/useInteractionByKey.js +263 -0
- package/dist/hooks/useInteractionHandle.d.ts +103 -0
- package/dist/hooks/useInteractionHandle.d.ts.map +1 -0
- package/dist/hooks/useInteractionHandle.js +254 -0
- package/dist/hooks/useIsMobile.d.ts +7 -0
- package/dist/hooks/useIsMobile.d.ts.map +1 -0
- package/dist/hooks/useIsMobile.js +29 -0
- package/dist/hooks/useIsMyTurn.d.ts +6 -0
- package/dist/hooks/useIsMyTurn.d.ts.map +1 -0
- package/dist/hooks/useIsMyTurn.js +11 -0
- package/dist/hooks/useLobby.d.ts +28 -0
- package/dist/hooks/useLobby.d.ts.map +1 -0
- package/dist/hooks/useLobby.js +60 -0
- package/dist/hooks/useMe.d.ts +11 -0
- package/dist/hooks/useMe.d.ts.map +1 -0
- package/dist/hooks/useMe.js +32 -0
- package/dist/hooks/usePanZoom.d.ts +113 -0
- package/dist/hooks/usePanZoom.d.ts.map +1 -0
- package/dist/hooks/usePanZoom.js +165 -0
- package/dist/hooks/usePlayerInfo.d.ts +4 -0
- package/dist/hooks/usePlayerInfo.d.ts.map +1 -0
- package/dist/hooks/usePlayerInfo.js +21 -0
- package/dist/hooks/usePlayerTurnOrder.d.ts +15 -0
- package/dist/hooks/usePlayerTurnOrder.d.ts.map +1 -0
- package/dist/hooks/usePlayerTurnOrder.js +22 -0
- package/dist/hooks/usePluginRuntime.d.ts +45 -0
- package/dist/hooks/usePluginRuntime.d.ts.map +1 -0
- package/dist/hooks/usePluginRuntime.js +92 -0
- package/dist/hooks/useSeatInbox.d.ts +22 -0
- package/dist/hooks/useSeatInbox.d.ts.map +1 -0
- package/dist/hooks/useSeatInbox.js +43 -0
- package/dist/hooks/useSimultaneousPhase.d.ts +7 -0
- package/dist/hooks/useSimultaneousPhase.d.ts.map +1 -0
- package/dist/hooks/useSimultaneousPhase.js +8 -0
- package/dist/hooks/useSquareBoard.d.ts +21 -0
- package/dist/hooks/useSquareBoard.d.ts.map +1 -0
- package/dist/hooks/useSquareBoard.js +67 -0
- package/dist/hooks/useSquareGrid.d.ts +96 -0
- package/dist/hooks/useSquareGrid.d.ts.map +1 -0
- package/dist/hooks/useSquareGrid.js +152 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/internal/ui/alert.d.ts +8 -0
- package/dist/internal/ui/alert.d.ts.map +1 -0
- package/dist/internal/ui/alert.js +11 -0
- package/dist/internal/ui/button.d.ts +10 -0
- package/dist/internal/ui/button.d.ts.map +1 -0
- package/dist/internal/ui/button.js +21 -0
- package/dist/internal/ui/dialog.d.ts +16 -0
- package/dist/internal/ui/dialog.d.ts.map +1 -0
- package/dist/internal/ui/dialog.js +35 -0
- package/dist/internal/ui/input.d.ts +3 -0
- package/dist/internal/ui/input.d.ts.map +1 -0
- package/dist/internal/ui/input.js +5 -0
- package/dist/internal/ui/label.d.ts +4 -0
- package/dist/internal/ui/label.d.ts.map +1 -0
- package/dist/internal/ui/label.js +7 -0
- package/dist/internal/ui/select.d.ts +9 -0
- package/dist/internal/ui/select.d.ts.map +1 -0
- package/dist/internal/ui/select.js +23 -0
- package/dist/internal/ui/tooltip.d.ts +7 -0
- package/dist/internal/ui/tooltip.d.ts.map +1 -0
- package/dist/internal/ui/tooltip.js +16 -0
- package/dist/internal/ui/utils.d.ts +3 -0
- package/dist/internal/ui/utils.d.ts.map +1 -0
- package/dist/internal/ui/utils.js +4 -0
- package/dist/internal.d.ts +7 -0
- package/dist/internal.d.ts.map +1 -0
- package/dist/internal.js +4 -0
- package/dist/plugin-styles.css +246 -0
- package/dist/primitives/board.d.ts +29 -0
- package/dist/primitives/board.d.ts.map +1 -0
- package/dist/primitives/board.js +163 -0
- package/dist/primitives/game-ui-provider.d.ts +12 -0
- package/dist/primitives/game-ui-provider.d.ts.map +1 -0
- package/dist/primitives/game-ui-provider.js +7 -0
- package/dist/primitives/index.d.ts +8 -0
- package/dist/primitives/index.d.ts.map +1 -0
- package/dist/primitives/index.js +7 -0
- package/dist/primitives/interaction.d.ts +52 -0
- package/dist/primitives/interaction.d.ts.map +1 -0
- package/dist/primitives/interaction.js +250 -0
- package/dist/primitives/phase.d.ts +15 -0
- package/dist/primitives/phase.d.ts.map +1 -0
- package/dist/primitives/phase.js +18 -0
- package/dist/primitives/player-roster.d.ts +64 -0
- package/dist/primitives/player-roster.d.ts.map +1 -0
- package/dist/primitives/player-roster.js +149 -0
- package/dist/primitives/primitive-props.d.ts +15 -0
- package/dist/primitives/primitive-props.d.ts.map +1 -0
- package/dist/primitives/primitive-props.js +39 -0
- package/dist/primitives/prompt.d.ts +44 -0
- package/dist/primitives/prompt.d.ts.map +1 -0
- package/dist/primitives/prompt.js +101 -0
- package/dist/primitives/zone.d.ts +31 -0
- package/dist/primitives/zone.d.ts.map +1 -0
- package/dist/primitives/zone.js +58 -0
- package/dist/reducer.d.ts +21 -0
- package/dist/reducer.d.ts.map +1 -0
- package/dist/reducer.js +14 -0
- package/dist/runtime/createPluginRuntimeAPI.d.ts +67 -0
- package/dist/runtime/createPluginRuntimeAPI.d.ts.map +1 -0
- package/dist/runtime/createPluginRuntimeAPI.js +419 -0
- package/dist/theme/ThemeProvider.d.ts +98 -0
- package/dist/theme/ThemeProvider.d.ts.map +1 -0
- package/dist/theme/ThemeProvider.js +148 -0
- package/dist/theme/board.d.ts +42 -0
- package/dist/theme/board.d.ts.map +1 -0
- package/dist/theme/board.js +34 -0
- package/dist/theme/css-vars.d.ts +31 -0
- package/dist/theme/css-vars.d.ts.map +1 -0
- package/dist/theme/css-vars.js +88 -0
- package/dist/theme/derive.d.ts +66 -0
- package/dist/theme/derive.d.ts.map +1 -0
- package/dist/theme/derive.js +161 -0
- package/dist/theme/index.d.ts +22 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +20 -0
- package/dist/theme/presets/arcade.d.ts +10 -0
- package/dist/theme/presets/arcade.d.ts.map +1 -0
- package/dist/theme/presets/arcade.js +257 -0
- package/dist/theme/presets/studio.d.ts +10 -0
- package/dist/theme/presets/studio.d.ts.map +1 -0
- package/dist/theme/presets/studio.js +257 -0
- package/dist/theme/presets/tabletop.d.ts +15 -0
- package/dist/theme/presets/tabletop.d.ts.map +1 -0
- package/dist/theme/presets/tabletop.js +262 -0
- package/dist/theme/tokens.d.ts +345 -0
- package/dist/theme/tokens.d.ts.map +1 -0
- package/dist/theme/tokens.js +57 -0
- package/dist/types/player-state.d.ts +337 -0
- package/dist/types/player-state.d.ts.map +1 -0
- package/dist/types/player-state.js +1 -0
- package/dist/types/plugin-state.d.ts +324 -0
- package/dist/types/plugin-state.d.ts.map +1 -0
- package/dist/types/plugin-state.js +1 -0
- package/dist/types/reducer-state.d.ts +10 -0
- package/dist/types/reducer-state.d.ts.map +1 -0
- package/dist/types/reducer-state.js +1 -0
- package/dist/types/runtime-api.d.ts +99 -0
- package/dist/types/runtime-api.d.ts.map +1 -0
- package/dist/types/runtime-api.js +1 -0
- package/dist/types/tiled-board.d.ts +187 -0
- package/dist/types/tiled-board.d.ts.map +1 -0
- package/dist/types/tiled-board.js +226 -0
- package/dist/ui-contract.d.ts +78 -0
- package/dist/ui-contract.d.ts.map +1 -0
- package/dist/ui-contract.js +15 -0
- package/dist/ui-sdk.d.ts +3409 -0
- package/dist/utils/interaction-inputs.d.ts +22 -0
- package/dist/utils/interaction-inputs.d.ts.map +1 -0
- package/dist/utils/interaction-inputs.js +219 -0
- package/dist/utils/interaction-labels.d.ts +4 -0
- package/dist/utils/interaction-labels.d.ts.map +1 -0
- package/dist/utils/interaction-labels.js +18 -0
- package/dist/utils/interaction-status.d.ts +15 -0
- package/dist/utils/interaction-status.d.ts.map +1 -0
- package/dist/utils/interaction-status.js +31 -0
- package/package.json +101 -0
- package/src/components/ActionButton.tsx +48 -0
- package/src/components/ActionPanel.tsx +310 -0
- package/src/components/Card.tsx +385 -0
- package/src/components/ChromeSuppressionContext.tsx +70 -0
- package/src/components/CostDisplay.test.tsx +23 -0
- package/src/components/CostDisplay.tsx +145 -0
- package/src/components/DiceRoller.tsx +601 -0
- package/src/components/Drawer.tsx +179 -0
- package/src/components/ErrorBoundary.tsx +119 -0
- package/src/components/GameEndDisplay.test.tsx +19 -0
- package/src/components/GameEndDisplay.tsx +398 -0
- package/src/components/GameSkeleton.tsx +260 -0
- package/src/components/Hand.tsx +387 -0
- package/src/components/HandDock.tsx +257 -0
- package/src/components/InteractionForm.test.tsx +303 -0
- package/src/components/InteractionForm.tsx +1029 -0
- package/src/components/MoreActions.test.tsx +93 -0
- package/src/components/MoreActions.tsx +143 -0
- package/src/components/PhaseIndicator.tsx +341 -0
- package/src/components/PlayArea.tsx +125 -0
- package/src/components/PluginRuntime.tsx +92 -0
- package/src/components/PrimaryActionButton.test.tsx +138 -0
- package/src/components/PrimaryActionButton.tsx +351 -0
- package/src/components/PrimaryButton.tsx +44 -0
- package/src/components/PromptDialogHost.tsx +92 -0
- package/src/components/ResourceCounter.test.tsx +29 -0
- package/src/components/ResourceCounter.tsx +275 -0
- package/src/components/ThemedButton.tsx +78 -0
- package/src/components/Toast.tsx +251 -0
- package/src/components/__fixtures__/ActionButton.fixture.tsx +234 -0
- package/src/components/__fixtures__/ActionPanel.fixture.tsx +298 -0
- package/src/components/__fixtures__/Card.fixture.tsx +185 -0
- package/src/components/__fixtures__/CostDisplay.fixture.tsx +156 -0
- package/src/components/__fixtures__/DiceRoller.fixture.tsx +435 -0
- package/src/components/__fixtures__/Drawer.fixture.tsx +113 -0
- package/src/components/__fixtures__/ErrorBoundary.fixture.tsx +82 -0
- package/src/components/__fixtures__/GameEndDisplay.fixture.tsx +188 -0
- package/src/components/__fixtures__/GameSkeleton.fixture.tsx +46 -0
- package/src/components/__fixtures__/Hand.fixture.tsx +522 -0
- package/src/components/__fixtures__/HexGrid.fixture.tsx +1181 -0
- package/src/components/__fixtures__/NetworkGraph.fixture.tsx +599 -0
- package/src/components/__fixtures__/PhaseIndicator.fixture.tsx +181 -0
- package/src/components/__fixtures__/PlayArea.fixture.tsx +221 -0
- package/src/components/__fixtures__/ResourceCounter.fixture.tsx +227 -0
- package/src/components/__fixtures__/SlotSystem.fixture.tsx +824 -0
- package/src/components/__fixtures__/SquareGrid.fixture.tsx +764 -0
- package/src/components/__fixtures__/Toast.fixture.tsx +97 -0
- package/src/components/__fixtures__/TrackBoard.fixture.tsx +685 -0
- package/src/components/__fixtures__/ZoneMap.fixture.tsx +754 -0
- package/src/components/board/HexGrid.tsx +1294 -0
- package/src/components/board/NetworkGraph.tsx +476 -0
- package/src/components/board/SlotSystem.tsx +339 -0
- package/src/components/board/SquareGrid.tsx +1165 -0
- package/src/components/board/TrackBoard.tsx +496 -0
- package/src/components/board/ZoneMap.tsx +448 -0
- package/src/components/board/hex-board-view.test.tsx +114 -0
- package/src/components/board/hex-board-view.ts +123 -0
- package/src/components/board/index.ts +142 -0
- package/src/components/board/interaction-accessibility.ts +21 -0
- package/src/components/board/target-layer-grids.test.tsx +420 -0
- package/src/components/board/target-layer.ts +30 -0
- package/src/components/card-render-content.type-test.ts +27 -0
- package/src/components/index.ts +208 -0
- package/src/components/interaction-dialog-behavior.test.ts +23 -0
- package/src/components/interaction-dialog-behavior.ts +22 -0
- package/src/components/surfaces/BlockerSurface.test.tsx +158 -0
- package/src/components/surfaces/BlockerSurface.tsx +127 -0
- package/src/components/surfaces/BoardSurface.tsx +340 -0
- package/src/components/surfaces/ChromeSurface.tsx +123 -0
- package/src/components/surfaces/ExhaustivenessAudit.tsx +91 -0
- package/src/components/surfaces/InboxSurface.test.tsx +149 -0
- package/src/components/surfaces/InboxSurface.tsx +245 -0
- package/src/components/surfaces/MarketSurface.tsx +544 -0
- package/src/components/surfaces/PanelSurface.test.tsx +496 -0
- package/src/components/surfaces/PanelSurface.tsx +458 -0
- package/src/components/surfaces/PlayerCardsSurface.tsx +525 -0
- package/src/components/surfaces/internal/CardZoneFollowUpForm.tsx +35 -0
- package/src/components/surfaces/internal/DefaultInteractionButton.tsx +219 -0
- package/src/components/surfaces/internal/useCardZoneInteractions.ts +311 -0
- package/src/components/surfaces/types.ts +100 -0
- package/src/context/ClientParamSchemaContext.tsx +44 -0
- package/src/context/InteractionDraftContext.tsx +204 -0
- package/src/context/PluginSessionContext.tsx +47 -0
- package/src/context/PluginStateContext.tsx +254 -0
- package/src/context/RuntimeContext.tsx +96 -0
- package/src/defaults/components.tsx +442 -0
- package/src/defaults/defaults.test.tsx +230 -0
- package/src/defaults/index.ts +1 -0
- package/src/errors/ValidationError.ts +29 -0
- package/src/helpers/cards.ts +19 -0
- package/src/helpers/track-board.ts +211 -0
- package/src/hooks/useActivePlayers.ts +19 -0
- package/src/hooks/useBoardInteractions.test.tsx +622 -0
- package/src/hooks/useBoardInteractions.ts +434 -0
- package/src/hooks/useBoardTopology.ts +316 -0
- package/src/hooks/useCards.test.tsx +129 -0
- package/src/hooks/useCards.ts +10 -0
- package/src/hooks/useGameSelector.ts +105 -0
- package/src/hooks/useGameView.ts +9 -0
- package/src/hooks/useHandLayout.ts +349 -0
- package/src/hooks/useHexBoard.ts +74 -0
- package/src/hooks/useHexGrid.ts +185 -0
- package/src/hooks/useInteractionByKey.ts +349 -0
- package/src/hooks/useInteractionHandle.ts +437 -0
- package/src/hooks/useIsMobile.ts +35 -0
- package/src/hooks/useIsMyTurn.test.tsx +99 -0
- package/src/hooks/useIsMyTurn.ts +15 -0
- package/src/hooks/useLobby.ts +76 -0
- package/src/hooks/useMe.ts +48 -0
- package/src/hooks/usePanZoom.ts +278 -0
- package/src/hooks/usePlayerInfo.ts +28 -0
- package/src/hooks/usePlayerTurnOrder.ts +23 -0
- package/src/hooks/usePluginRuntime.test.tsx +102 -0
- package/src/hooks/usePluginRuntime.ts +130 -0
- package/src/hooks/useSeatInbox.ts +61 -0
- package/src/hooks/useSimultaneousPhase.ts +10 -0
- package/src/hooks/useSquareBoard.ts +124 -0
- package/src/hooks/useSquareGrid.ts +328 -0
- package/src/index.test.ts +474 -0
- package/src/index.ts +148 -0
- package/src/internal/ui/alert.tsx +51 -0
- package/src/internal/ui/button.tsx +58 -0
- package/src/internal/ui/dialog.tsx +134 -0
- package/src/internal/ui/input.tsx +21 -0
- package/src/internal/ui/label.tsx +21 -0
- package/src/internal/ui/select.tsx +129 -0
- package/src/internal/ui/tooltip.tsx +54 -0
- package/src/internal/ui/utils.ts +5 -0
- package/src/internal.ts +18 -0
- package/src/plugin-styles.css +246 -0
- package/src/primitives/board.test.tsx +139 -0
- package/src/primitives/board.tsx +267 -0
- package/src/primitives/game-ui-provider.tsx +35 -0
- package/src/primitives/index.ts +83 -0
- package/src/primitives/interaction.test.tsx +420 -0
- package/src/primitives/interaction.tsx +405 -0
- package/src/primitives/phase.test.tsx +82 -0
- package/src/primitives/phase.tsx +43 -0
- package/src/primitives/player-roster.test.tsx +168 -0
- package/src/primitives/player-roster.tsx +301 -0
- package/src/primitives/primitive-props.tsx +82 -0
- package/src/primitives/prompt.test.tsx +159 -0
- package/src/primitives/prompt.tsx +203 -0
- package/src/primitives/zone.tsx +113 -0
- package/src/reducer.ts +42 -0
- package/src/runtime/createPluginRuntimeAPI.ts +605 -0
- package/src/theme/ThemeProvider.test.tsx +36 -0
- package/src/theme/ThemeProvider.tsx +252 -0
- package/src/theme/board.ts +61 -0
- package/src/theme/css-vars.ts +105 -0
- package/src/theme/derive.ts +240 -0
- package/src/theme/index.ts +61 -0
- package/src/theme/presets/arcade.ts +261 -0
- package/src/theme/presets/studio.ts +261 -0
- package/src/theme/presets/tabletop.ts +266 -0
- package/src/theme/theme.test.ts +258 -0
- package/src/theme/tokens.ts +392 -0
- package/src/types/player-state.ts +445 -0
- package/src/types/plugin-state.ts +407 -0
- package/src/types/reducer-state.ts +24 -0
- package/src/types/runtime-api.ts +114 -0
- package/src/types/tiled-board.ts +785 -0
- package/src/ui-contract.ts +168 -0
- package/src/utils/interaction-inputs.test.ts +109 -0
- package/src/utils/interaction-inputs.ts +331 -0
- package/src/utils/interaction-labels.ts +23 -0
- package/src/utils/interaction-status.ts +59 -0
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
/** Reducer-native UI primitives for building game interfaces. */
|
|
2
|
+
|
|
3
|
+
// Presentational components (no hooks, receive data as props)
|
|
4
|
+
export { Card, type CardProps, type ViewCard } from "./Card.js";
|
|
5
|
+
export { Hand, type HandProps } from "./Hand.js";
|
|
6
|
+
export {
|
|
7
|
+
HandDock,
|
|
8
|
+
type HandDockMode,
|
|
9
|
+
type HandDockPlacement,
|
|
10
|
+
type HandDockPresentation,
|
|
11
|
+
type HandDockProps,
|
|
12
|
+
type HandDockToggleContext,
|
|
13
|
+
} from "./HandDock.js";
|
|
14
|
+
export { PlayArea, type PlayAreaProps } from "./PlayArea.js";
|
|
15
|
+
|
|
16
|
+
// Other UI components
|
|
17
|
+
export { GameSkeleton, type GameSkeletonProps } from "./GameSkeleton.js";
|
|
18
|
+
export {
|
|
19
|
+
ToastProvider,
|
|
20
|
+
useToast,
|
|
21
|
+
type Toast,
|
|
22
|
+
type ToastType,
|
|
23
|
+
} from "./Toast.js";
|
|
24
|
+
export { ErrorBoundary, type ErrorBoundaryProps } from "./ErrorBoundary.js";
|
|
25
|
+
export { PluginRuntime, type PluginRuntimeProps } from "./PluginRuntime.js";
|
|
26
|
+
export {
|
|
27
|
+
Drawer,
|
|
28
|
+
DrawerPortal,
|
|
29
|
+
DrawerOverlay,
|
|
30
|
+
DrawerTrigger,
|
|
31
|
+
DrawerClose,
|
|
32
|
+
DrawerContent,
|
|
33
|
+
DrawerHeader,
|
|
34
|
+
DrawerFooter,
|
|
35
|
+
DrawerTitle,
|
|
36
|
+
DrawerDescription,
|
|
37
|
+
} from "./Drawer.js";
|
|
38
|
+
export {
|
|
39
|
+
Dialog,
|
|
40
|
+
DialogPortal,
|
|
41
|
+
DialogOverlay,
|
|
42
|
+
DialogTrigger,
|
|
43
|
+
DialogClose,
|
|
44
|
+
DialogContent,
|
|
45
|
+
DialogHeader,
|
|
46
|
+
DialogFooter,
|
|
47
|
+
DialogTitle,
|
|
48
|
+
DialogDescription,
|
|
49
|
+
} from "../internal/ui/dialog.js";
|
|
50
|
+
|
|
51
|
+
// Game UI primitives (SDK v0.1.0+)
|
|
52
|
+
export {
|
|
53
|
+
ResourceCounter,
|
|
54
|
+
type ResourceCounterProps,
|
|
55
|
+
type ResourceDisplayConfig,
|
|
56
|
+
} from "./ResourceCounter.js";
|
|
57
|
+
export {
|
|
58
|
+
CostDisplay,
|
|
59
|
+
type CostDisplayProps,
|
|
60
|
+
type ResourceDefinition,
|
|
61
|
+
} from "./CostDisplay.js";
|
|
62
|
+
export { ActionButton, type ActionButtonProps } from "./ActionButton.js";
|
|
63
|
+
export { PrimaryButton, type PrimaryButtonProps } from "./PrimaryButton.js";
|
|
64
|
+
export { ThemedButton, type ThemedButtonProps } from "./ThemedButton.js";
|
|
65
|
+
export {
|
|
66
|
+
PrimaryActionButton,
|
|
67
|
+
type PrimaryActionButtonProps,
|
|
68
|
+
type PrimaryActionAttention,
|
|
69
|
+
} from "./PrimaryActionButton.js";
|
|
70
|
+
export {
|
|
71
|
+
InteractionForm,
|
|
72
|
+
InteractionField,
|
|
73
|
+
defaultFormInputs,
|
|
74
|
+
hasDefaultInteractionFormFields,
|
|
75
|
+
type InteractionFieldProps,
|
|
76
|
+
type InteractionFieldRenderMap,
|
|
77
|
+
type InteractionFieldRenderProps,
|
|
78
|
+
type InteractionFormProps,
|
|
79
|
+
} from "./InteractionForm.js";
|
|
80
|
+
export {
|
|
81
|
+
ActionPanel,
|
|
82
|
+
ActionGroup,
|
|
83
|
+
type ActionPanelProps,
|
|
84
|
+
type ActionGroupProps,
|
|
85
|
+
} from "./ActionPanel.js";
|
|
86
|
+
export { MoreActions, type MoreActionsProps } from "./MoreActions.js";
|
|
87
|
+
export { DiceRoller, type DiceRollerProps } from "./DiceRoller.js";
|
|
88
|
+
export { PhaseIndicator, type PhaseIndicatorProps } from "./PhaseIndicator.js";
|
|
89
|
+
export {
|
|
90
|
+
GameEndDisplay,
|
|
91
|
+
type GameEndDisplayProps,
|
|
92
|
+
type PlayerScore,
|
|
93
|
+
} from "./GameEndDisplay.js";
|
|
94
|
+
export {
|
|
95
|
+
PromptDialogHost,
|
|
96
|
+
type PromptDialogHostProps,
|
|
97
|
+
} from "./PromptDialogHost.js";
|
|
98
|
+
|
|
99
|
+
// Board primitives (SDK v0.2.0+)
|
|
100
|
+
export {
|
|
101
|
+
NetworkGraph,
|
|
102
|
+
DefaultNetworkNode,
|
|
103
|
+
DefaultNetworkEdge,
|
|
104
|
+
DefaultNetworkPiece,
|
|
105
|
+
type NetworkGraphProps,
|
|
106
|
+
type NetworkNode,
|
|
107
|
+
type NetworkEdge,
|
|
108
|
+
type NetworkPiece,
|
|
109
|
+
type DefaultNetworkNodeProps,
|
|
110
|
+
type DefaultNetworkEdgeProps,
|
|
111
|
+
type DefaultNetworkPieceProps,
|
|
112
|
+
} from "./board/NetworkGraph.js";
|
|
113
|
+
|
|
114
|
+
export {
|
|
115
|
+
ZoneMap,
|
|
116
|
+
DefaultZone,
|
|
117
|
+
DefaultZonePieces,
|
|
118
|
+
DefaultZonePiece,
|
|
119
|
+
type ZoneMapProps,
|
|
120
|
+
type ZoneDefinition,
|
|
121
|
+
type ZonePiece,
|
|
122
|
+
type ZoneShape,
|
|
123
|
+
type ZoneHighlightType,
|
|
124
|
+
type DefaultZoneProps,
|
|
125
|
+
type DefaultZonePiecesProps,
|
|
126
|
+
type DefaultZonePieceProps,
|
|
127
|
+
} from "./board/ZoneMap.js";
|
|
128
|
+
|
|
129
|
+
export {
|
|
130
|
+
TrackBoard,
|
|
131
|
+
DefaultTrackSpace,
|
|
132
|
+
DefaultTrackPiece,
|
|
133
|
+
DefaultTrackConnection,
|
|
134
|
+
DefaultTrackJump,
|
|
135
|
+
type TrackBoardProps,
|
|
136
|
+
type TrackSpace,
|
|
137
|
+
type TrackPiece,
|
|
138
|
+
type DefaultTrackSpaceProps,
|
|
139
|
+
type DefaultTrackPieceProps,
|
|
140
|
+
type DefaultTrackConnectionProps,
|
|
141
|
+
type DefaultTrackJumpProps,
|
|
142
|
+
} from "./board/TrackBoard.js";
|
|
143
|
+
|
|
144
|
+
export {
|
|
145
|
+
SlotSystem,
|
|
146
|
+
DefaultSlotItem,
|
|
147
|
+
DefaultSlotOccupant,
|
|
148
|
+
DefaultEmptySlot,
|
|
149
|
+
type SlotSystemProps,
|
|
150
|
+
type SlotDefinition,
|
|
151
|
+
type SlotOccupant,
|
|
152
|
+
type DefaultSlotItemProps,
|
|
153
|
+
type DefaultSlotOccupantProps,
|
|
154
|
+
type DefaultEmptySlotProps,
|
|
155
|
+
} from "./board/SlotSystem.js";
|
|
156
|
+
|
|
157
|
+
export {
|
|
158
|
+
SquareGrid,
|
|
159
|
+
DefaultGridCell,
|
|
160
|
+
DefaultGridPiece,
|
|
161
|
+
DefaultChessPiece,
|
|
162
|
+
toAlgebraic,
|
|
163
|
+
toNumeric,
|
|
164
|
+
type SquareGridBoardProps,
|
|
165
|
+
type SquareGridProps,
|
|
166
|
+
type InteractiveSquareEdge,
|
|
167
|
+
type InteractiveSquareVertex,
|
|
168
|
+
type SquareEdgePosition,
|
|
169
|
+
type SquareVertexPosition,
|
|
170
|
+
type DefaultGridCellProps,
|
|
171
|
+
type DefaultGridPieceProps,
|
|
172
|
+
type DefaultChessPieceProps,
|
|
173
|
+
} from "./board/SquareGrid.js";
|
|
174
|
+
|
|
175
|
+
export {
|
|
176
|
+
HexGrid,
|
|
177
|
+
hexUtils,
|
|
178
|
+
DefaultHexTile,
|
|
179
|
+
DefaultHexEdge,
|
|
180
|
+
DefaultHexVertex,
|
|
181
|
+
type HexGridBoardProps,
|
|
182
|
+
type HexGridProps,
|
|
183
|
+
type HexOrientation,
|
|
184
|
+
type HexTileGeometry,
|
|
185
|
+
type InteractiveHexEdge,
|
|
186
|
+
type InteractiveHexVertex,
|
|
187
|
+
type InteractiveTargetLayer,
|
|
188
|
+
type InteractiveTargetRenderState,
|
|
189
|
+
type EdgePosition,
|
|
190
|
+
type DefaultHexTileProps,
|
|
191
|
+
type DefaultHexEdgeProps,
|
|
192
|
+
type DefaultHexVertexProps,
|
|
193
|
+
} from "./board/HexGrid.js";
|
|
194
|
+
export {
|
|
195
|
+
createHexBoardView,
|
|
196
|
+
type HexBoardView,
|
|
197
|
+
type HexBoardViewTile,
|
|
198
|
+
} from "./board/hex-board-view.js";
|
|
199
|
+
export type {
|
|
200
|
+
HexTileState,
|
|
201
|
+
HexEdgeState,
|
|
202
|
+
HexVertexState,
|
|
203
|
+
SquareCellState,
|
|
204
|
+
SquareEdgeState,
|
|
205
|
+
SquarePieceState,
|
|
206
|
+
SquareVertexState,
|
|
207
|
+
} from "../types/player-state.js";
|
|
208
|
+
export type { CardCollection, ViewSlotOccupant } from "@dreamboard/sdk-types";
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { expect, test } from "bun:test";
|
|
2
|
+
import { resolveDialogDismissBehavior } from "./interaction-dialog-behavior.js";
|
|
3
|
+
|
|
4
|
+
test("resolveDialogDismissBehavior prefers structured dismissBehavior", () => {
|
|
5
|
+
expect(
|
|
6
|
+
resolveDialogDismissBehavior({
|
|
7
|
+
dismissBehavior: {
|
|
8
|
+
type: "minimize",
|
|
9
|
+
trayLabel: "Trade",
|
|
10
|
+
trayIcon: "🤝",
|
|
11
|
+
},
|
|
12
|
+
}),
|
|
13
|
+
).toEqual({
|
|
14
|
+
type: "minimize",
|
|
15
|
+
trayLabel: "Trade",
|
|
16
|
+
trayIcon: "🤝",
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
test("resolveDialogDismissBehavior defaults to non-dismissible", () => {
|
|
21
|
+
expect(resolveDialogDismissBehavior({})).toEqual({ type: "none" });
|
|
22
|
+
expect(resolveDialogDismissBehavior(undefined)).toEqual({ type: "none" });
|
|
23
|
+
});
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export type InteractionDialogDismissBehavior =
|
|
2
|
+
| { type: "none" }
|
|
3
|
+
| { type: "dismiss" }
|
|
4
|
+
| { type: "minimize"; trayLabel: string; trayIcon?: string };
|
|
5
|
+
|
|
6
|
+
export interface InteractionDialogPresentation {
|
|
7
|
+
dismissBehavior?: InteractionDialogDismissBehavior;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export function resolveDialogDismissBehavior(
|
|
11
|
+
dialog: InteractionDialogPresentation | undefined,
|
|
12
|
+
): InteractionDialogDismissBehavior {
|
|
13
|
+
const dismissBehavior = dialog?.dismissBehavior;
|
|
14
|
+
if (dismissBehavior) return dismissBehavior;
|
|
15
|
+
return { type: "none" };
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export function canCloseDialog(
|
|
19
|
+
dismissBehavior: InteractionDialogDismissBehavior,
|
|
20
|
+
): boolean {
|
|
21
|
+
return dismissBehavior.type !== "none";
|
|
22
|
+
}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { expect, test } from "bun:test";
|
|
2
|
+
import { renderToString } from "react-dom/server";
|
|
3
|
+
import { RuntimeContext } from "../../context/RuntimeContext.js";
|
|
4
|
+
import { PluginSessionContext } from "../../context/PluginSessionContext.js";
|
|
5
|
+
import type {
|
|
6
|
+
InteractionDescriptor,
|
|
7
|
+
PluginStateSnapshot,
|
|
8
|
+
} from "../../types/plugin-state.js";
|
|
9
|
+
import type {
|
|
10
|
+
PluginSessionState,
|
|
11
|
+
RuntimeAPI,
|
|
12
|
+
} from "../../types/runtime-api.js";
|
|
13
|
+
import { BlockerSurface } from "./BlockerSurface.js";
|
|
14
|
+
|
|
15
|
+
function createSessionState(): PluginSessionState {
|
|
16
|
+
return {
|
|
17
|
+
status: "ready",
|
|
18
|
+
sessionId: "session-1",
|
|
19
|
+
controllablePlayerIds: ["player-1"],
|
|
20
|
+
controllingPlayerId: "player-1",
|
|
21
|
+
userId: "user-1",
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function createBlockerDescriptor(
|
|
26
|
+
id: string,
|
|
27
|
+
available: boolean,
|
|
28
|
+
overrides: Partial<InteractionDescriptor> = {},
|
|
29
|
+
): InteractionDescriptor {
|
|
30
|
+
return {
|
|
31
|
+
phaseName: "takeTurn",
|
|
32
|
+
interactionKey: `takeTurn.${id}`,
|
|
33
|
+
interactionId: id,
|
|
34
|
+
kind: "action",
|
|
35
|
+
inputs: [],
|
|
36
|
+
commit: { mode: "manual" },
|
|
37
|
+
available,
|
|
38
|
+
...overrides,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function createSnapshot(
|
|
43
|
+
session: PluginSessionState,
|
|
44
|
+
descriptors: InteractionDescriptor[],
|
|
45
|
+
): PluginStateSnapshot {
|
|
46
|
+
return {
|
|
47
|
+
view: null,
|
|
48
|
+
gameplay: {
|
|
49
|
+
currentPhase: "takeTurn",
|
|
50
|
+
currentStage: null,
|
|
51
|
+
activePlayers: ["player-1"],
|
|
52
|
+
availableInteractions: descriptors,
|
|
53
|
+
zones: {},
|
|
54
|
+
},
|
|
55
|
+
lobby: null,
|
|
56
|
+
notifications: [],
|
|
57
|
+
session,
|
|
58
|
+
history: null,
|
|
59
|
+
syncId: 1,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function createRuntime(snapshot: PluginStateSnapshot): RuntimeAPI & {
|
|
64
|
+
getSnapshot: () => PluginStateSnapshot;
|
|
65
|
+
subscribeToState: (
|
|
66
|
+
listener: (state: PluginStateSnapshot) => void,
|
|
67
|
+
) => () => void;
|
|
68
|
+
} {
|
|
69
|
+
return {
|
|
70
|
+
validateInteraction: async () => ({ valid: true }),
|
|
71
|
+
submitInteraction: async () => undefined,
|
|
72
|
+
getSessionState: () => snapshot.session,
|
|
73
|
+
disconnect: () => undefined,
|
|
74
|
+
getSnapshot: () => snapshot,
|
|
75
|
+
subscribeToState: () => () => undefined,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function renderShell(snapshot: PluginStateSnapshot): string {
|
|
80
|
+
const runtime = createRuntime(snapshot);
|
|
81
|
+
return renderToString(
|
|
82
|
+
<RuntimeContext.Provider value={runtime}>
|
|
83
|
+
<PluginSessionContext.Provider value={snapshot.session}>
|
|
84
|
+
<BlockerSurface />
|
|
85
|
+
</PluginSessionContext.Provider>
|
|
86
|
+
</RuntimeContext.Provider>,
|
|
87
|
+
);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// Regression: blocker-surface interactions whose `available` predicate is
|
|
91
|
+
// false must not escalate into a modal overlay. Without this filter an
|
|
92
|
+
// interaction like Catan's `discardCards`, which is surfaced as a blocker
|
|
93
|
+
// but only addresses specific seats, would render an un-dismissable prompt
|
|
94
|
+
// for every other active player.
|
|
95
|
+
test("BlockerSurface hides descriptors where available is false", () => {
|
|
96
|
+
const session = createSessionState();
|
|
97
|
+
const snapshot = createSnapshot(session, [
|
|
98
|
+
createBlockerDescriptor("discardCards", false),
|
|
99
|
+
]);
|
|
100
|
+
|
|
101
|
+
const html = renderShell(snapshot);
|
|
102
|
+
|
|
103
|
+
expect(html).not.toContain("discardCards");
|
|
104
|
+
expect(html).not.toContain('data-surface="blocker"');
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
test("BlockerSurface does not infer blocking overlays from plain action descriptors", () => {
|
|
108
|
+
const session = createSessionState();
|
|
109
|
+
const snapshot = createSnapshot(session, [
|
|
110
|
+
createBlockerDescriptor("mustDiscard", true),
|
|
111
|
+
]);
|
|
112
|
+
|
|
113
|
+
const html = renderShell(snapshot);
|
|
114
|
+
|
|
115
|
+
expect(html).not.toContain("mustDiscard");
|
|
116
|
+
expect(html).not.toContain('data-surface="blocker"');
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
test("BlockerSurface ignores action descriptors after reducer-owned blocker surfaces are removed", () => {
|
|
120
|
+
const session = createSessionState();
|
|
121
|
+
const snapshot = createSnapshot(session, [
|
|
122
|
+
createBlockerDescriptor("skipMe", false),
|
|
123
|
+
createBlockerDescriptor("showMe", true),
|
|
124
|
+
]);
|
|
125
|
+
|
|
126
|
+
const html = renderShell(snapshot);
|
|
127
|
+
|
|
128
|
+
expect(html).not.toContain("skipMe");
|
|
129
|
+
expect(html).not.toContain("showMe");
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
test("BlockerSurface does not escalate form actions into blocking overlays", () => {
|
|
133
|
+
const session = createSessionState();
|
|
134
|
+
const snapshot = createSnapshot(session, [
|
|
135
|
+
createBlockerDescriptor("discardCards", true, {
|
|
136
|
+
inputs: [
|
|
137
|
+
{
|
|
138
|
+
key: "discard",
|
|
139
|
+
kind: "form",
|
|
140
|
+
domain: {
|
|
141
|
+
type: "resourceMap",
|
|
142
|
+
resources: [
|
|
143
|
+
{ resourceId: "wood", label: "Wood", min: 0, max: 4 },
|
|
144
|
+
{ resourceId: "brick", label: "Brick", min: 0, max: 4 },
|
|
145
|
+
],
|
|
146
|
+
},
|
|
147
|
+
},
|
|
148
|
+
],
|
|
149
|
+
}),
|
|
150
|
+
]);
|
|
151
|
+
|
|
152
|
+
const html = renderShell(snapshot);
|
|
153
|
+
|
|
154
|
+
expect(html).not.toContain('data-surface="blocker"');
|
|
155
|
+
expect(html).not.toContain('data-interaction-form="true"');
|
|
156
|
+
expect(html).not.toContain("Wood");
|
|
157
|
+
expect(html).not.toContain("Brick");
|
|
158
|
+
});
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
import { useSeatInbox } from "../../hooks/useSeatInbox.js";
|
|
3
|
+
import {
|
|
4
|
+
useInteractionHandle,
|
|
5
|
+
type InteractionHandle,
|
|
6
|
+
} from "../../hooks/useInteractionHandle.js";
|
|
7
|
+
import { useTheme } from "../../theme/ThemeProvider.js";
|
|
8
|
+
import type { InteractionDescriptor } from "../../types/plugin-state.js";
|
|
9
|
+
import { DefaultInteractionButton } from "./internal/DefaultInteractionButton.js";
|
|
10
|
+
import type {
|
|
11
|
+
InteractionDefaultedKeysOf,
|
|
12
|
+
InteractionParamsByKeyShape,
|
|
13
|
+
InteractionParamsOf,
|
|
14
|
+
SurfaceRenderMap,
|
|
15
|
+
} from "./types.js";
|
|
16
|
+
|
|
17
|
+
export interface BlockerSurfaceProps<
|
|
18
|
+
I extends string = never,
|
|
19
|
+
ParamsByKey extends Partial<InteractionParamsByKeyShape> = {},
|
|
20
|
+
> {
|
|
21
|
+
/**
|
|
22
|
+
* Optional per-interaction overrides. Omit to fall back to the default
|
|
23
|
+
* `DefaultInteractionButton` inside the blocker overlay.
|
|
24
|
+
*/
|
|
25
|
+
render?: SurfaceRenderMap<I, ParamsByKey>;
|
|
26
|
+
/**
|
|
27
|
+
* Fallback renderer for blocker interactions without a `render` entry.
|
|
28
|
+
* Defaults to the built-in `DefaultInteractionButton`.
|
|
29
|
+
*/
|
|
30
|
+
renderItem?: (
|
|
31
|
+
descriptor: InteractionDescriptor<I>,
|
|
32
|
+
handle: InteractionHandle<
|
|
33
|
+
InteractionParamsOf<ParamsByKey, I>,
|
|
34
|
+
InteractionDefaultedKeysOf<ParamsByKey, I>
|
|
35
|
+
>,
|
|
36
|
+
) => ReactNode;
|
|
37
|
+
/** Shown when no blocker interactions are addressed to the controlling seat. */
|
|
38
|
+
empty?: ReactNode;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Default renderer for legacy blocker interactions. Rendered as a layout-less
|
|
43
|
+
* item list; callers decide whether to mount it inline or wrap it in their own
|
|
44
|
+
* overlay container.
|
|
45
|
+
*
|
|
46
|
+
* Visual styling is sourced entirely from the active {@link useTheme}.
|
|
47
|
+
*/
|
|
48
|
+
export function BlockerSurface<
|
|
49
|
+
I extends string = never,
|
|
50
|
+
ParamsByKey extends Partial<InteractionParamsByKeyShape> = {},
|
|
51
|
+
>({ render, renderItem, empty = null }: BlockerSurfaceProps<I, ParamsByKey>) {
|
|
52
|
+
const theme = useTheme();
|
|
53
|
+
const inbox = useSeatInbox();
|
|
54
|
+
// Blocker semantics: only mount descriptors that are *actually blocking*.
|
|
55
|
+
// An unavailable blocker (e.g. `discardCards` when this seat is not on the
|
|
56
|
+
// discard list) must not escalate into a modal overlay — that would block
|
|
57
|
+
// the UI with no valid action to dismiss it.
|
|
58
|
+
const items = (
|
|
59
|
+
(inbox.bySurface.blocker ?? []) as ReadonlyArray<InteractionDescriptor<I>>
|
|
60
|
+
).filter((descriptor) => descriptor.available !== false);
|
|
61
|
+
if (items.length === 0) return <>{empty}</>;
|
|
62
|
+
return (
|
|
63
|
+
<div
|
|
64
|
+
role="alertdialog"
|
|
65
|
+
aria-modal="true"
|
|
66
|
+
aria-label="Blocking interaction"
|
|
67
|
+
data-surface="blocker"
|
|
68
|
+
style={{
|
|
69
|
+
display: "flex",
|
|
70
|
+
flexDirection: "column",
|
|
71
|
+
gap: theme.space[3],
|
|
72
|
+
alignItems: "stretch",
|
|
73
|
+
}}
|
|
74
|
+
>
|
|
75
|
+
{items.map((descriptor) => (
|
|
76
|
+
<BlockerItem<I, ParamsByKey>
|
|
77
|
+
key={descriptor.interactionKey}
|
|
78
|
+
descriptor={descriptor}
|
|
79
|
+
render={render}
|
|
80
|
+
renderItem={renderItem}
|
|
81
|
+
/>
|
|
82
|
+
))}
|
|
83
|
+
</div>
|
|
84
|
+
);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function BlockerItem<
|
|
88
|
+
I extends string,
|
|
89
|
+
ParamsByKey extends Partial<InteractionParamsByKeyShape> = {},
|
|
90
|
+
>({
|
|
91
|
+
descriptor,
|
|
92
|
+
render,
|
|
93
|
+
renderItem,
|
|
94
|
+
}: {
|
|
95
|
+
descriptor: InteractionDescriptor<I>;
|
|
96
|
+
render?: SurfaceRenderMap<I, ParamsByKey>;
|
|
97
|
+
renderItem?: (
|
|
98
|
+
descriptor: InteractionDescriptor<I>,
|
|
99
|
+
handle: InteractionHandle<
|
|
100
|
+
InteractionParamsOf<ParamsByKey, I>,
|
|
101
|
+
InteractionDefaultedKeysOf<ParamsByKey, I>
|
|
102
|
+
>,
|
|
103
|
+
) => ReactNode;
|
|
104
|
+
}) {
|
|
105
|
+
const handle = useInteractionHandle<
|
|
106
|
+
InteractionParamsOf<ParamsByKey, I>,
|
|
107
|
+
InteractionDefaultedKeysOf<ParamsByKey, I>
|
|
108
|
+
>(descriptor);
|
|
109
|
+
const override = render?.[descriptor.interactionKey] as
|
|
110
|
+
| ((
|
|
111
|
+
descriptor: InteractionDescriptor<I>,
|
|
112
|
+
handle: InteractionHandle<
|
|
113
|
+
InteractionParamsOf<ParamsByKey, I>,
|
|
114
|
+
InteractionDefaultedKeysOf<ParamsByKey, I>
|
|
115
|
+
>,
|
|
116
|
+
) => ReactNode)
|
|
117
|
+
| undefined;
|
|
118
|
+
if (override) return <>{override(descriptor, handle)}</>;
|
|
119
|
+
if (renderItem) return <>{renderItem(descriptor, handle)}</>;
|
|
120
|
+
return (
|
|
121
|
+
<DefaultInteractionButton
|
|
122
|
+
descriptor={descriptor}
|
|
123
|
+
handle={handle}
|
|
124
|
+
defaultFormOpen
|
|
125
|
+
/>
|
|
126
|
+
);
|
|
127
|
+
}
|