@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,235 @@
|
|
|
1
|
+
import { useState, useRef, useEffect, useMemo, useCallback } from "react";
|
|
2
|
+
// Card dimensions used for fan offset and total-width calculations.
|
|
3
|
+
// These must match the rendered widths from `Card.tsx`'s `sizeClasses`
|
|
4
|
+
// at the `sm` Tailwind breakpoint (≥640px), since that's the size
|
|
5
|
+
// player decks render at on virtually all gameplay viewports. Older
|
|
6
|
+
// values here were ~30% smaller than what `Card` actually paints,
|
|
7
|
+
// which caused cards to overlap by 30+ pixels even when there was
|
|
8
|
+
// plenty of horizontal room in the hand container.
|
|
9
|
+
const CARD_DIMENSIONS = {
|
|
10
|
+
sm: { width: 80, height: 112 },
|
|
11
|
+
md: { width: 96, height: 144 },
|
|
12
|
+
lg: { width: 128, height: 192 },
|
|
13
|
+
};
|
|
14
|
+
const MIN_VISIBLE_PORTION = 16; // minimum visible pixels per card when overlapping
|
|
15
|
+
const HOVER_LIFT = 20; // pixels to lift on hover
|
|
16
|
+
const SELECTED_LIFT = 8; // pixels to lift when selected
|
|
17
|
+
const DRAWER_THRESHOLD_RATIO = 0.3; // if overlap is less than 30% of card width, use drawer
|
|
18
|
+
/**
|
|
19
|
+
* Hook for managing hand layout calculations and interactions.
|
|
20
|
+
*
|
|
21
|
+
* Provides container measurement, overlap calculations, drawer mode detection,
|
|
22
|
+
* and hover state management for card hand displays.
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```tsx
|
|
26
|
+
* function MyHand({ cards, selectedIds }) {
|
|
27
|
+
* const {
|
|
28
|
+
* containerRef,
|
|
29
|
+
* cardsContainerRef,
|
|
30
|
+
* totalWidth,
|
|
31
|
+
* useDrawerMode,
|
|
32
|
+
* cardDimensions,
|
|
33
|
+
* hoveredIndex,
|
|
34
|
+
* handleMouseMove,
|
|
35
|
+
* handleMouseLeave,
|
|
36
|
+
* getCardPosition,
|
|
37
|
+
* constants,
|
|
38
|
+
* } = useHandLayout({
|
|
39
|
+
* cardCount: cards.length,
|
|
40
|
+
* cardSize: "md",
|
|
41
|
+
* layout: "overlap",
|
|
42
|
+
* });
|
|
43
|
+
*
|
|
44
|
+
* if (useDrawerMode) {
|
|
45
|
+
* return <MyDrawerUI cards={cards} />;
|
|
46
|
+
* }
|
|
47
|
+
*
|
|
48
|
+
* return (
|
|
49
|
+
* <div ref={containerRef}>
|
|
50
|
+
* <div
|
|
51
|
+
* ref={cardsContainerRef}
|
|
52
|
+
* style={{ width: totalWidth, height: cardDimensions.height + constants.hoverLift }}
|
|
53
|
+
* onMouseMove={handleMouseMove}
|
|
54
|
+
* onMouseLeave={handleMouseLeave}
|
|
55
|
+
* >
|
|
56
|
+
* {cards.map((card, index) => {
|
|
57
|
+
* const isHovered = hoveredIndex === index;
|
|
58
|
+
* const isSelected = selectedIds.includes(card.id);
|
|
59
|
+
* const position = getCardPosition(index, isHovered, isSelected);
|
|
60
|
+
*
|
|
61
|
+
* return (
|
|
62
|
+
* <div
|
|
63
|
+
* key={card.id}
|
|
64
|
+
* style={{
|
|
65
|
+
* position: "absolute",
|
|
66
|
+
* left: position.x,
|
|
67
|
+
* transform: `translateY(${position.y}px)`,
|
|
68
|
+
* zIndex: position.zIndex,
|
|
69
|
+
* }}
|
|
70
|
+
* >
|
|
71
|
+
* <MyCard card={card} />
|
|
72
|
+
* </div>
|
|
73
|
+
* );
|
|
74
|
+
* })}
|
|
75
|
+
* </div>
|
|
76
|
+
* </div>
|
|
77
|
+
* );
|
|
78
|
+
* }
|
|
79
|
+
* ```
|
|
80
|
+
*/
|
|
81
|
+
export function useHandLayout({ cardCount, cardSize = "md", layout = "overlap", containerPadding = 32, }) {
|
|
82
|
+
const containerRef = useRef(null);
|
|
83
|
+
const cardsContainerRef = useRef(null);
|
|
84
|
+
const [containerWidth, setContainerWidth] = useState(0);
|
|
85
|
+
const [hoveredIndex, setHoveredIndex] = useState(null);
|
|
86
|
+
const cardDimensions = CARD_DIMENSIONS[cardSize];
|
|
87
|
+
// Measure container width with ResizeObserver
|
|
88
|
+
useEffect(() => {
|
|
89
|
+
const updateWidth = () => {
|
|
90
|
+
if (containerRef.current) {
|
|
91
|
+
setContainerWidth(containerRef.current.clientWidth - containerPadding);
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
updateWidth();
|
|
95
|
+
const observer = new ResizeObserver(updateWidth);
|
|
96
|
+
if (containerRef.current) {
|
|
97
|
+
observer.observe(containerRef.current);
|
|
98
|
+
}
|
|
99
|
+
return () => observer.disconnect();
|
|
100
|
+
}, [containerPadding]);
|
|
101
|
+
// Calculate adaptive overlap based on container width and card count
|
|
102
|
+
const { cardOffset, totalWidth, useDrawerMode } = useMemo(() => {
|
|
103
|
+
if (layout !== "overlap") {
|
|
104
|
+
return {
|
|
105
|
+
cardOffset: cardDimensions.width,
|
|
106
|
+
totalWidth: 0,
|
|
107
|
+
useDrawerMode: false,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
if (cardCount === 0) {
|
|
111
|
+
return { cardOffset: 0, totalWidth: 0, useDrawerMode: false };
|
|
112
|
+
}
|
|
113
|
+
if (cardCount === 1) {
|
|
114
|
+
return {
|
|
115
|
+
cardOffset: cardDimensions.width,
|
|
116
|
+
totalWidth: cardDimensions.width,
|
|
117
|
+
useDrawerMode: false,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
// Available width for overlap distribution
|
|
121
|
+
const availableWidth = containerWidth;
|
|
122
|
+
if (availableWidth <= 0) {
|
|
123
|
+
return {
|
|
124
|
+
cardOffset: cardDimensions.width,
|
|
125
|
+
totalWidth: cardDimensions.width * cardCount,
|
|
126
|
+
useDrawerMode: false,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
// Calculate the offset needed to fit all cards
|
|
130
|
+
// Total width = cardWidth + (cardCount - 1) * offset
|
|
131
|
+
// So offset = (availableWidth - cardWidth) / (cardCount - 1)
|
|
132
|
+
const idealOffset = (availableWidth - cardDimensions.width) / (cardCount - 1);
|
|
133
|
+
// Clamp offset between minimum visible portion and full card width
|
|
134
|
+
const clampedOffset = Math.max(MIN_VISIBLE_PORTION, Math.min(cardDimensions.width, idealOffset));
|
|
135
|
+
// Calculate total width with this offset
|
|
136
|
+
const width = cardDimensions.width + (cardCount - 1) * clampedOffset;
|
|
137
|
+
// Determine if we should use drawer mode
|
|
138
|
+
// Use drawer if cards are overlapping too much (less than threshold of card visible)
|
|
139
|
+
const visiblePortion = clampedOffset / cardDimensions.width;
|
|
140
|
+
const shouldUseDrawer = visiblePortion < DRAWER_THRESHOLD_RATIO && cardCount > 2;
|
|
141
|
+
return {
|
|
142
|
+
cardOffset: clampedOffset,
|
|
143
|
+
totalWidth: width,
|
|
144
|
+
useDrawerMode: shouldUseDrawer,
|
|
145
|
+
};
|
|
146
|
+
}, [cardCount, containerWidth, layout, cardDimensions.width]);
|
|
147
|
+
// Calculate hovered card index based on mouse X position
|
|
148
|
+
// This allows hovering on adjacent cards even when one is popped up
|
|
149
|
+
const handleMouseMove = useCallback((e) => {
|
|
150
|
+
if (!cardsContainerRef.current ||
|
|
151
|
+
cardCount === 0 ||
|
|
152
|
+
layout === "spread" ||
|
|
153
|
+
layout === "stack") {
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
const rect = cardsContainerRef.current.getBoundingClientRect();
|
|
157
|
+
const mouseX = e.clientX - rect.left;
|
|
158
|
+
let newHoveredIndex = null;
|
|
159
|
+
// Find which card the mouse is over based on X position
|
|
160
|
+
for (let i = cardCount - 1; i >= 0; i--) {
|
|
161
|
+
const cardLeft = i * cardOffset;
|
|
162
|
+
const cardRight = i === cardCount - 1
|
|
163
|
+
? cardLeft + cardDimensions.width
|
|
164
|
+
: (i + 1) * cardOffset;
|
|
165
|
+
if (mouseX >= cardLeft && mouseX < cardRight) {
|
|
166
|
+
newHoveredIndex = i;
|
|
167
|
+
break;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
// Check if mouse is in the rightmost card's full area
|
|
171
|
+
if (newHoveredIndex === null && mouseX >= 0 && mouseX < totalWidth) {
|
|
172
|
+
const lastCardLeft = (cardCount - 1) * cardOffset;
|
|
173
|
+
if (mouseX >= lastCardLeft) {
|
|
174
|
+
newHoveredIndex = cardCount - 1;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
setHoveredIndex(newHoveredIndex);
|
|
178
|
+
}, [cardCount, cardOffset, totalWidth, layout, cardDimensions.width]);
|
|
179
|
+
const handleMouseLeave = useCallback(() => {
|
|
180
|
+
setHoveredIndex(null);
|
|
181
|
+
}, []);
|
|
182
|
+
// Calculate z-index: hovered > selected > position
|
|
183
|
+
const getZIndex = useCallback((index, isHovered, isSelected) => {
|
|
184
|
+
if (isHovered)
|
|
185
|
+
return 200;
|
|
186
|
+
if (isSelected)
|
|
187
|
+
return 100 + index;
|
|
188
|
+
return index;
|
|
189
|
+
}, []);
|
|
190
|
+
// Get card position props for different layouts
|
|
191
|
+
const getCardPosition = useCallback((index, isHovered, isSelected) => {
|
|
192
|
+
const zIndex = getZIndex(index, isHovered, isSelected);
|
|
193
|
+
if (layout === "stack") {
|
|
194
|
+
return {
|
|
195
|
+
x: index * 4,
|
|
196
|
+
y: 0,
|
|
197
|
+
zIndex,
|
|
198
|
+
transformOrigin: "bottom center",
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
if (layout === "spread") {
|
|
202
|
+
return {
|
|
203
|
+
x: 0,
|
|
204
|
+
y: 0,
|
|
205
|
+
zIndex,
|
|
206
|
+
transformOrigin: "bottom center",
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
// Overlap layout (default) - simple horizontal overlap with lift on hover/select
|
|
210
|
+
const yOffset = isHovered ? -HOVER_LIFT : isSelected ? -SELECTED_LIFT : 0;
|
|
211
|
+
return {
|
|
212
|
+
x: index * cardOffset,
|
|
213
|
+
y: yOffset,
|
|
214
|
+
zIndex,
|
|
215
|
+
transformOrigin: "bottom center",
|
|
216
|
+
};
|
|
217
|
+
}, [layout, cardOffset, getZIndex]);
|
|
218
|
+
return {
|
|
219
|
+
containerRef,
|
|
220
|
+
cardsContainerRef,
|
|
221
|
+
containerWidth,
|
|
222
|
+
cardOffset,
|
|
223
|
+
totalWidth,
|
|
224
|
+
useDrawerMode,
|
|
225
|
+
cardDimensions,
|
|
226
|
+
constants: {
|
|
227
|
+
hoverLift: HOVER_LIFT,
|
|
228
|
+
selectedLift: SELECTED_LIFT,
|
|
229
|
+
},
|
|
230
|
+
hoveredIndex,
|
|
231
|
+
handleMouseMove,
|
|
232
|
+
handleMouseLeave,
|
|
233
|
+
getCardPosition,
|
|
234
|
+
};
|
|
235
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { AnyHexBoardInput, BoardSpaceIdOf, NormalizedHexBoard, NormalizedHexTileOf } from "../types/tiled-board.js";
|
|
2
|
+
export declare function useHexBoard<const TBoard extends AnyHexBoardInput>(board: TBoard): {
|
|
3
|
+
board: NormalizedHexBoard<TBoard>;
|
|
4
|
+
getTile: (tileId: BoardSpaceIdOf<TBoard>) => NormalizedHexTileOf<TBoard> | undefined;
|
|
5
|
+
getTileAt: (q: number, r: number) => NormalizedHexTileOf<TBoard> | undefined;
|
|
6
|
+
getNeighbors: (tileId: BoardSpaceIdOf<TBoard>) => Array<NormalizedHexTileOf<TBoard>>;
|
|
7
|
+
getTilesInRange: (centerTileId: BoardSpaceIdOf<TBoard>, range: number) => Array<NormalizedHexTileOf<TBoard>>;
|
|
8
|
+
layout: TBoard extends AnyHexBoardInput ? "hex" : "square";
|
|
9
|
+
getSpace: (spaceId: BoardSpaceIdOf<TBoard>) => (TBoard extends AnyHexBoardInput ? NormalizedHexTileOf<TBoard> : TBoard extends import("../index.js").AnySquareBoardInput ? import("../index.js").NormalizedSquareCellOf<TBoard> : never) | undefined;
|
|
10
|
+
getEdge: (edgeId: import("../index.js").BoardEdgeIdOf<TBoard>) => (TBoard extends AnyHexBoardInput ? import("../index.js").NormalizedHexEdgeOf<TBoard> : TBoard extends import("../index.js").AnySquareBoardInput ? import("../index.js").NormalizedSquareEdgeOf<TBoard> : never) | undefined;
|
|
11
|
+
getVertex: (vertexId: import("../index.js").BoardVertexIdOf<TBoard>) => (TBoard extends AnyHexBoardInput ? import("../index.js").NormalizedHexVertexOf<TBoard> : TBoard extends import("../index.js").AnySquareBoardInput ? import("../index.js").NormalizedSquareVertexOf<TBoard> : never) | undefined;
|
|
12
|
+
getAdjacentSpaces: (spaceId: BoardSpaceIdOf<TBoard>) => (TBoard extends AnyHexBoardInput ? NormalizedHexTileOf<TBoard> : TBoard extends import("../index.js").AnySquareBoardInput ? import("../index.js").NormalizedSquareCellOf<TBoard> : never)[];
|
|
13
|
+
getDistance: (fromSpaceId: BoardSpaceIdOf<TBoard>, toSpaceId: BoardSpaceIdOf<TBoard>) => number;
|
|
14
|
+
getSpaceEdges: (spaceId: BoardSpaceIdOf<TBoard>) => (TBoard extends AnyHexBoardInput ? import("../index.js").NormalizedHexEdgeOf<TBoard> : TBoard extends import("../index.js").AnySquareBoardInput ? import("../index.js").NormalizedSquareEdgeOf<TBoard> : never)[];
|
|
15
|
+
getSpaceVertices: (spaceId: BoardSpaceIdOf<TBoard>) => (TBoard extends AnyHexBoardInput ? import("../index.js").NormalizedHexVertexOf<TBoard> : TBoard extends import("../index.js").AnySquareBoardInput ? import("../index.js").NormalizedSquareVertexOf<TBoard> : never)[];
|
|
16
|
+
getIncidentEdges: (vertexId: import("../index.js").BoardVertexIdOf<TBoard>) => (TBoard extends AnyHexBoardInput ? import("../index.js").NormalizedHexEdgeOf<TBoard> : TBoard extends import("../index.js").AnySquareBoardInput ? import("../index.js").NormalizedSquareEdgeOf<TBoard> : never)[];
|
|
17
|
+
getIncidentVertices: (edgeId: import("../index.js").BoardEdgeIdOf<TBoard>) => (TBoard extends AnyHexBoardInput ? import("../index.js").NormalizedHexVertexOf<TBoard> : TBoard extends import("../index.js").AnySquareBoardInput ? import("../index.js").NormalizedSquareVertexOf<TBoard> : never)[];
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=useHexBoard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useHexBoard.d.ts","sourceRoot":"","sources":["../../src/hooks/useHexBoard.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,gBAAgB,EAChB,cAAc,EACd,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,yBAAyB,CAAC;AAIjC,wBAAgB,WAAW,CAAC,KAAK,CAAC,MAAM,SAAS,gBAAgB,EAC/D,KAAK,EAAE,MAAM;;sBAmBF,cAAc,CAAC,MAAM,CAAC,KAEzB,mBAAmB,CAAC,MAAM,CAAC,GAC3B,SAAS;mBAMX,MAAM,KAAK,MAAM,KAEf,mBAAmB,CAAC,MAAM,CAAC,GAC3B,SAAS;2BAMN,cAAc,CAAC,MAAM,CAAC,KACgB,KAAK,CAChD,mBAAmB,CAAC,MAAM,CAAC,CAC5B;oCAMY,cAAc,CAAC,MAAM,CAAC,SAAS,MAAM,KAG7C,KAAK,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;;;;;;;;;;;EAa5C"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { useCallback, useMemo } from "react";
|
|
2
|
+
import { normalizeHexBoardInput } from "../types/tiled-board.js";
|
|
3
|
+
import { useBoardTopology } from "./useBoardTopology.js";
|
|
4
|
+
export function useHexBoard(board) {
|
|
5
|
+
const normalizedBoard = useMemo(() => normalizeHexBoardInput(board), [board]);
|
|
6
|
+
const topology = useBoardTopology(board);
|
|
7
|
+
const tileByCoordinate = useMemo(() => new Map(normalizedBoard.tiles.map((tile) => [`${tile.q},${tile.r}`, tile])), [normalizedBoard.tiles]);
|
|
8
|
+
const getTile = useCallback((tileId) => {
|
|
9
|
+
return topology.getSpace(tileId);
|
|
10
|
+
}, [topology]);
|
|
11
|
+
const getTileAt = useCallback((q, r) => {
|
|
12
|
+
return tileByCoordinate.get(`${q},${r}`);
|
|
13
|
+
}, [tileByCoordinate]);
|
|
14
|
+
const getNeighbors = useCallback((tileId) => {
|
|
15
|
+
return topology.getAdjacentSpaces(tileId);
|
|
16
|
+
}, [topology]);
|
|
17
|
+
const getTilesInRange = useCallback((centerTileId, range) => {
|
|
18
|
+
return normalizedBoard.tiles.filter((tile) => topology.getDistance(centerTileId, tile.id) <= range);
|
|
19
|
+
}, [normalizedBoard.tiles, topology]);
|
|
20
|
+
return {
|
|
21
|
+
...topology,
|
|
22
|
+
board: normalizedBoard,
|
|
23
|
+
getTile,
|
|
24
|
+
getTileAt,
|
|
25
|
+
getNeighbors,
|
|
26
|
+
getTilesInRange,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* useHexGrid hook - Headless logic for hex grid games
|
|
3
|
+
*
|
|
4
|
+
* Provides utilities for:
|
|
5
|
+
* - Coordinate conversion and neighbor finding
|
|
6
|
+
* - Distance calculations
|
|
7
|
+
* - Tile lookups
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```tsx
|
|
11
|
+
* const { getNeighbors, getDistance, getTile } = useHexGrid(tiles);
|
|
12
|
+
*
|
|
13
|
+
* // Find all adjacent tiles
|
|
14
|
+
* const neighbors = getNeighbors('center');
|
|
15
|
+
*
|
|
16
|
+
* // Check if two tiles are adjacent
|
|
17
|
+
* const isAdjacent = getDistance('tile1', 'tile2') === 1;
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export interface HexTileData {
|
|
21
|
+
/** Unique tile identifier */
|
|
22
|
+
id: string;
|
|
23
|
+
/** Axial coordinate Q */
|
|
24
|
+
q: number;
|
|
25
|
+
/** Axial coordinate R */
|
|
26
|
+
r: number;
|
|
27
|
+
/** Tile type */
|
|
28
|
+
type?: string;
|
|
29
|
+
/** Additional data */
|
|
30
|
+
data?: Record<string, unknown>;
|
|
31
|
+
}
|
|
32
|
+
export interface UseHexGridReturn {
|
|
33
|
+
/** Get a tile by ID */
|
|
34
|
+
getTile: (tileId: string) => HexTileData | undefined;
|
|
35
|
+
/** Get a tile by coordinates */
|
|
36
|
+
getTileAt: (q: number, r: number) => HexTileData | undefined;
|
|
37
|
+
/** Get neighboring tiles */
|
|
38
|
+
getNeighbors: (tileId: string) => HexTileData[];
|
|
39
|
+
/** Get distance between two tiles */
|
|
40
|
+
getDistance: (fromId: string, toId: string) => number;
|
|
41
|
+
/** Get all tiles within a range */
|
|
42
|
+
getHexesInRange: (centerId: string, range: number) => HexTileData[];
|
|
43
|
+
/** Convert axial to cube coordinates */
|
|
44
|
+
axialToCube: (q: number, r: number) => {
|
|
45
|
+
x: number;
|
|
46
|
+
y: number;
|
|
47
|
+
z: number;
|
|
48
|
+
};
|
|
49
|
+
/** Convert cube to axial coordinates */
|
|
50
|
+
cubeToAxial: (x: number, y: number, z: number) => {
|
|
51
|
+
q: number;
|
|
52
|
+
r: number;
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
export declare function useHexGrid(tiles: HexTileData[]): UseHexGridReturn;
|
|
56
|
+
//# sourceMappingURL=useHexGrid.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useHexGrid.d.ts","sourceRoot":"","sources":["../../src/hooks/useHexGrid.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAQH,MAAM,WAAW,WAAW;IAC1B,6BAA6B;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,yBAAyB;IACzB,CAAC,EAAE,MAAM,CAAC;IACV,yBAAyB;IACzB,CAAC,EAAE,MAAM,CAAC;IACV,gBAAgB;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sBAAsB;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,gBAAgB;IAC/B,uBAAuB;IACvB,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,WAAW,GAAG,SAAS,CAAC;IACrD,gCAAgC;IAChC,SAAS,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,WAAW,GAAG,SAAS,CAAC;IAC7D,4BAA4B;IAC5B,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,WAAW,EAAE,CAAC;IAChD,qCAAqC;IACrC,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IACtD,mCAAmC;IACnC,eAAe,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,WAAW,EAAE,CAAC;IACpE,wCAAwC;IACxC,WAAW,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3E,wCAAwC;IACxC,WAAW,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5E;AAmBD,wBAAgB,UAAU,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,gBAAgB,CA+GjE"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* useHexGrid hook - Headless logic for hex grid games
|
|
3
|
+
*
|
|
4
|
+
* Provides utilities for:
|
|
5
|
+
* - Coordinate conversion and neighbor finding
|
|
6
|
+
* - Distance calculations
|
|
7
|
+
* - Tile lookups
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```tsx
|
|
11
|
+
* const { getNeighbors, getDistance, getTile } = useHexGrid(tiles);
|
|
12
|
+
*
|
|
13
|
+
* // Find all adjacent tiles
|
|
14
|
+
* const neighbors = getNeighbors('center');
|
|
15
|
+
*
|
|
16
|
+
* // Check if two tiles are adjacent
|
|
17
|
+
* const isAdjacent = getDistance('tile1', 'tile2') === 1;
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
import { useMemo, useCallback } from "react";
|
|
21
|
+
// ============================================================================
|
|
22
|
+
// Axial direction vectors
|
|
23
|
+
// ============================================================================
|
|
24
|
+
const AXIAL_DIRECTIONS = [
|
|
25
|
+
{ q: 1, r: 0 },
|
|
26
|
+
{ q: 1, r: -1 },
|
|
27
|
+
{ q: 0, r: -1 },
|
|
28
|
+
{ q: -1, r: 0 },
|
|
29
|
+
{ q: -1, r: 1 },
|
|
30
|
+
{ q: 0, r: 1 },
|
|
31
|
+
];
|
|
32
|
+
// ============================================================================
|
|
33
|
+
// Hook Implementation
|
|
34
|
+
// ============================================================================
|
|
35
|
+
export function useHexGrid(tiles) {
|
|
36
|
+
// Create lookup maps
|
|
37
|
+
const tileById = useMemo(() => {
|
|
38
|
+
return new Map(tiles.map((t) => [t.id, t]));
|
|
39
|
+
}, [tiles]);
|
|
40
|
+
const tileByCoord = useMemo(() => {
|
|
41
|
+
return new Map(tiles.map((t) => [`${t.q},${t.r}`, t]));
|
|
42
|
+
}, [tiles]);
|
|
43
|
+
// Get tile by ID
|
|
44
|
+
const getTile = useCallback((tileId) => {
|
|
45
|
+
return tileById.get(tileId);
|
|
46
|
+
}, [tileById]);
|
|
47
|
+
// Get tile by coordinates
|
|
48
|
+
const getTileAt = useCallback((q, r) => {
|
|
49
|
+
return tileByCoord.get(`${q},${r}`);
|
|
50
|
+
}, [tileByCoord]);
|
|
51
|
+
// Get neighboring tiles
|
|
52
|
+
const getNeighbors = useCallback((tileId) => {
|
|
53
|
+
const tile = tileById.get(tileId);
|
|
54
|
+
if (!tile)
|
|
55
|
+
return [];
|
|
56
|
+
const neighbors = [];
|
|
57
|
+
for (const dir of AXIAL_DIRECTIONS) {
|
|
58
|
+
const neighbor = tileByCoord.get(`${tile.q + dir.q},${tile.r + dir.r}`);
|
|
59
|
+
if (neighbor) {
|
|
60
|
+
neighbors.push(neighbor);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return neighbors;
|
|
64
|
+
}, [tileById, tileByCoord]);
|
|
65
|
+
// Calculate distance between two tiles
|
|
66
|
+
const getDistance = useCallback((fromId, toId) => {
|
|
67
|
+
const from = tileById.get(fromId);
|
|
68
|
+
const to = tileById.get(toId);
|
|
69
|
+
if (!from || !to)
|
|
70
|
+
return Infinity;
|
|
71
|
+
// Hex distance formula using axial coordinates
|
|
72
|
+
return ((Math.abs(from.q - to.q) +
|
|
73
|
+
Math.abs(from.q + from.r - to.q - to.r) +
|
|
74
|
+
Math.abs(from.r - to.r)) /
|
|
75
|
+
2);
|
|
76
|
+
}, [tileById]);
|
|
77
|
+
// Get all tiles within range
|
|
78
|
+
const getHexesInRange = useCallback((centerId, range) => {
|
|
79
|
+
const center = tileById.get(centerId);
|
|
80
|
+
if (!center)
|
|
81
|
+
return [];
|
|
82
|
+
const results = [];
|
|
83
|
+
for (let dq = -range; dq <= range; dq++) {
|
|
84
|
+
const minR = Math.max(-range, -dq - range);
|
|
85
|
+
const maxR = Math.min(range, -dq + range);
|
|
86
|
+
for (let dr = minR; dr <= maxR; dr++) {
|
|
87
|
+
const tile = tileByCoord.get(`${center.q + dq},${center.r + dr}`);
|
|
88
|
+
if (tile) {
|
|
89
|
+
results.push(tile);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return results;
|
|
94
|
+
}, [tileById, tileByCoord]);
|
|
95
|
+
// Convert axial to cube coordinates
|
|
96
|
+
const axialToCube = useCallback((q, r) => {
|
|
97
|
+
return { x: q, z: r, y: -q - r };
|
|
98
|
+
}, []);
|
|
99
|
+
// Convert cube to axial coordinates
|
|
100
|
+
const cubeToAxial = useCallback((x, _y, z) => {
|
|
101
|
+
return { q: x, r: z };
|
|
102
|
+
}, []);
|
|
103
|
+
return {
|
|
104
|
+
getTile,
|
|
105
|
+
getTileAt,
|
|
106
|
+
getNeighbors,
|
|
107
|
+
getDistance,
|
|
108
|
+
getHexesInRange,
|
|
109
|
+
axialToCube,
|
|
110
|
+
cubeToAxial,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { InteractionHandle, InteractionParamsShape } from "./useInteractionHandle.js";
|
|
2
|
+
/**
|
|
3
|
+
* Look up an interaction descriptor by phase-qualified key on the controlling seat's
|
|
4
|
+
* inbox and return a bound {@link InteractionHandle}. Returns `null`
|
|
5
|
+
* when no matching descriptor is currently projected.
|
|
6
|
+
*
|
|
7
|
+
* Prefer this over manual `inbox.bySurface.panel?.find(...)` + sentinel
|
|
8
|
+
* descriptor patterns — it keeps hook-call order stable and guarantees
|
|
9
|
+
* the handle reflects the freshest descriptor.
|
|
10
|
+
*
|
|
11
|
+
* Types:
|
|
12
|
+
* - `Key` narrows the key literal. When called from the workspace-local
|
|
13
|
+
* `useInteractionByKey` re-export generated in `ui-contract.ts`, `Key` is
|
|
14
|
+
* constrained to the generated `InteractionKey` union so typos become
|
|
15
|
+
* compile errors.
|
|
16
|
+
* - `Params` is the params shape (`InteractionParamsOf<Key>` in the
|
|
17
|
+
* generated re-export). It flows through to `draft`, `submit`,
|
|
18
|
+
* `validate`, and `setInput` for compile-time safety.
|
|
19
|
+
*
|
|
20
|
+
* ```tsx
|
|
21
|
+
* // from the generated workspace re-export
|
|
22
|
+
* const handle = useInteractionByKey("play.placeThingCard");
|
|
23
|
+
* if (!handle) return <Waiting/>;
|
|
24
|
+
* handle.setInput("cardId", card.id); // typed to ThingsDeckCardId
|
|
25
|
+
* await handle.submit();
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export declare function useInteractionByKey<Key extends string = string, Params extends InteractionParamsShape = InteractionParamsShape, DefaultedKeys extends keyof Params & string = never>(interactionKey: Key | null | undefined): InteractionHandle<Params, DefaultedKeys> | null;
|
|
29
|
+
//# sourceMappingURL=useInteractionByKey.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useInteractionByKey.d.ts","sourceRoot":"","sources":["../../src/hooks/useInteractionByKey.ts"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAEV,iBAAiB,EAEjB,sBAAsB,EACvB,MAAM,2BAA2B,CAAC;AAEnC;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,SAAS,MAAM,GAAG,MAAM,EAC3B,MAAM,SAAS,sBAAsB,GAAG,sBAAsB,EAC9D,aAAa,SAAS,MAAM,MAAM,GAAG,MAAM,GAAG,KAAK,EAEnD,cAAc,EAAE,GAAG,GAAG,IAAI,GAAG,SAAS,GACrC,iBAAiB,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,IAAI,CA2RjD"}
|