@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,64 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* Disclosure that hides a list of low-salience actions behind a single
|
|
4
|
+
* "More" toggle. Sized and styled by the active theme so it looks
|
|
5
|
+
* consistent with neighbouring `<DefaultInteractionButton>` rows.
|
|
6
|
+
*
|
|
7
|
+
* Why not a popover or dropdown? Two reasons:
|
|
8
|
+
*
|
|
9
|
+
* 1. **Layout safety.** The default panel surface lives directly above
|
|
10
|
+
* the hand strip; a floating popover would be obscured by the
|
|
11
|
+
* hand's `overflow-x: auto` clipping. An inline expansion stays
|
|
12
|
+
* inside the panel container and pushes neighbouring rows down.
|
|
13
|
+
* 2. **Discoverability.** Players miss menus that hide behind triple
|
|
14
|
+
* dots / chevrons. An expanded inline list still looks like a row
|
|
15
|
+
* of buttons (Jakob — same affordance as the always-visible row).
|
|
16
|
+
*
|
|
17
|
+
* The toggle reports its open state via `aria-expanded` and labels
|
|
18
|
+
* the disclosed region via `aria-controls` so screen readers announce
|
|
19
|
+
* "Expanded — More actions, region containing 3 buttons" naturally.
|
|
20
|
+
*/
|
|
21
|
+
import { useId, useState } from "react";
|
|
22
|
+
import { ChevronDown, MoreHorizontal } from "lucide-react";
|
|
23
|
+
import { useTheme } from "../theme/ThemeProvider.js";
|
|
24
|
+
import { ThemedButton } from "./ThemedButton.js";
|
|
25
|
+
export function MoreActions({ children, label = "More", count, defaultOpen = false, style, }) {
|
|
26
|
+
const theme = useTheme();
|
|
27
|
+
const [open, setOpen] = useState(defaultOpen);
|
|
28
|
+
// `useId` keeps the aria pairing stable across re-renders even when
|
|
29
|
+
// many `<MoreActions>` exist on screen (rare, but easy to break).
|
|
30
|
+
const regionId = `more-actions-${useId().replace(/:/g, "")}`;
|
|
31
|
+
const showCount = typeof count === "number" && count > 0;
|
|
32
|
+
return (_jsxs("div", { "data-shell-slot": "more-actions", "data-more-actions-open": open ? "true" : "false", style: {
|
|
33
|
+
display: "flex",
|
|
34
|
+
flexDirection: "column",
|
|
35
|
+
gap: theme.space[2],
|
|
36
|
+
alignItems: "stretch",
|
|
37
|
+
// The disclosure is its own block so wrap behaviour upstream
|
|
38
|
+
// doesn't interleave the toggle and the disclosed items.
|
|
39
|
+
flex: "1 1 100%",
|
|
40
|
+
minWidth: 0,
|
|
41
|
+
}, children: [_jsxs(ThemedButton, { type: "button", variant: "secondary", size: "md", "aria-expanded": open, "aria-controls": regionId, onClick: () => setOpen((value) => !value), style: {
|
|
42
|
+
display: "inline-flex",
|
|
43
|
+
alignItems: "center",
|
|
44
|
+
gap: theme.space[1],
|
|
45
|
+
...style,
|
|
46
|
+
}, children: [_jsx(MoreHorizontal, { size: 16, "aria-hidden": true }), _jsx("span", { children: label }), showCount ? (_jsxs("span", { "aria-hidden": true, style: {
|
|
47
|
+
fontVariantNumeric: "tabular-nums",
|
|
48
|
+
opacity: 0.78,
|
|
49
|
+
}, children: ["(", count, ")"] })) : null, _jsx(ChevronDown, { size: 14, "aria-hidden": true, style: {
|
|
50
|
+
transform: open ? "rotate(180deg)" : "rotate(0deg)",
|
|
51
|
+
transition: `transform ${theme.motion.duration.fast} ${theme.motion.easing.out}`,
|
|
52
|
+
} })] }), open ? (_jsx("div", { id: regionId, role: "region", "aria-label": label, style: {
|
|
53
|
+
display: "flex",
|
|
54
|
+
flexDirection: "row",
|
|
55
|
+
flexWrap: "wrap",
|
|
56
|
+
gap: theme.space[2],
|
|
57
|
+
// Inset visually so the disclosed cluster reads as a
|
|
58
|
+
// sub-region rather than a continuation of the main panel.
|
|
59
|
+
paddingInline: theme.space[3],
|
|
60
|
+
paddingBlock: theme.space[2],
|
|
61
|
+
background: theme.semantic.surface.inset,
|
|
62
|
+
borderRadius: theme.radius.lg,
|
|
63
|
+
}, children: children })) : null] }));
|
|
64
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Surfaces the dominant turn-state question — "is this me?" / "who am I
|
|
3
|
+
* waiting for?" — as a single headline, with the phase label demoted to
|
|
4
|
+
* secondary copy underneath.
|
|
5
|
+
*
|
|
6
|
+
* The previous design rendered three peer chips (`Waiting`, `Roll dice`,
|
|
7
|
+
* `Player 3`) which fragmented one piece of information across three
|
|
8
|
+
* UI atoms. The redesign collapses them into a single status line:
|
|
9
|
+
*
|
|
10
|
+
* ◐ Waiting for Player 3…
|
|
11
|
+
* Roll dice
|
|
12
|
+
*
|
|
13
|
+
* ● Your turn
|
|
14
|
+
* Build, trade, or end your turn.
|
|
15
|
+
*
|
|
16
|
+
* Both states get a leading status indicator that animates so the eye
|
|
17
|
+
* picks up the "live" cue immediately. Animations are skipped when the
|
|
18
|
+
* theme reports `motion.reducedMotion === "true"`.
|
|
19
|
+
*
|
|
20
|
+
* Prop API is unchanged so existing callers (Catan, Things-in-Rings,
|
|
21
|
+
* tests) keep working without edits. The `variant` knob still toggles
|
|
22
|
+
* surface treatment (`badge` is layout-only, `bar` wraps the headline
|
|
23
|
+
* in an inset HUD strip, `minimal` collapses to a single underlined
|
|
24
|
+
* label for tight HUDs).
|
|
25
|
+
*/
|
|
26
|
+
export interface PhaseIndicatorProps {
|
|
27
|
+
currentPhase: string;
|
|
28
|
+
phaseLabels?: Record<string, string>;
|
|
29
|
+
isMyTurn?: boolean;
|
|
30
|
+
activePlayerNames?: string[];
|
|
31
|
+
variant?: "badge" | "bar" | "minimal";
|
|
32
|
+
className?: string;
|
|
33
|
+
}
|
|
34
|
+
export declare function PhaseIndicator({ currentPhase, phaseLabels, isMyTurn, activePlayerNames, variant, className, }: PhaseIndicatorProps): import("react/jsx-runtime").JSX.Element;
|
|
35
|
+
//# sourceMappingURL=PhaseIndicator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PhaseIndicator.d.ts","sourceRoot":"","sources":["../../src/components/PhaseIndicator.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAQH,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,OAAO,CAAC,EAAE,OAAO,GAAG,KAAK,GAAG,SAAS,CAAC;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,cAAc,CAAC,EAC7B,YAAY,EACZ,WAAW,EACX,QAAQ,EACR,iBAAiB,EACjB,OAAiB,EACjB,SAAS,GACV,EAAE,mBAAmB,2CAyErB"}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* Surfaces the dominant turn-state question — "is this me?" / "who am I
|
|
4
|
+
* waiting for?" — as a single headline, with the phase label demoted to
|
|
5
|
+
* secondary copy underneath.
|
|
6
|
+
*
|
|
7
|
+
* The previous design rendered three peer chips (`Waiting`, `Roll dice`,
|
|
8
|
+
* `Player 3`) which fragmented one piece of information across three
|
|
9
|
+
* UI atoms. The redesign collapses them into a single status line:
|
|
10
|
+
*
|
|
11
|
+
* ◐ Waiting for Player 3…
|
|
12
|
+
* Roll dice
|
|
13
|
+
*
|
|
14
|
+
* ● Your turn
|
|
15
|
+
* Build, trade, or end your turn.
|
|
16
|
+
*
|
|
17
|
+
* Both states get a leading status indicator that animates so the eye
|
|
18
|
+
* picks up the "live" cue immediately. Animations are skipped when the
|
|
19
|
+
* theme reports `motion.reducedMotion === "true"`.
|
|
20
|
+
*
|
|
21
|
+
* Prop API is unchanged so existing callers (Catan, Things-in-Rings,
|
|
22
|
+
* tests) keep working without edits. The `variant` knob still toggles
|
|
23
|
+
* surface treatment (`badge` is layout-only, `bar` wraps the headline
|
|
24
|
+
* in an inset HUD strip, `minimal` collapses to a single underlined
|
|
25
|
+
* label for tight HUDs).
|
|
26
|
+
*/
|
|
27
|
+
import { motion } from "framer-motion";
|
|
28
|
+
import { clsx } from "clsx";
|
|
29
|
+
import { useTheme } from "../theme/ThemeProvider.js";
|
|
30
|
+
import { surfaceStyle } from "../theme/derive.js";
|
|
31
|
+
export function PhaseIndicator({ currentPhase, phaseLabels, isMyTurn, activePlayerNames, variant = "badge", className, }) {
|
|
32
|
+
const theme = useTheme();
|
|
33
|
+
const reducedMotion = theme.motion.reducedMotion === "true";
|
|
34
|
+
const label = phaseLabels?.[currentPhase] ?? formatPhase(currentPhase);
|
|
35
|
+
if (variant === "minimal") {
|
|
36
|
+
return (_jsx("span", { className: className, style: {
|
|
37
|
+
fontFamily: theme.typography.fontFamily.body,
|
|
38
|
+
fontSize: theme.typography.fontSize.sm,
|
|
39
|
+
fontWeight: theme.typography.fontWeight.bold,
|
|
40
|
+
color: theme.semantic.text.muted,
|
|
41
|
+
textDecoration: "underline",
|
|
42
|
+
textDecorationStyle: "wavy",
|
|
43
|
+
textDecorationColor: theme.semantic.border.subtle,
|
|
44
|
+
textUnderlineOffset: "4px",
|
|
45
|
+
}, role: "status", "aria-label": `Current phase: ${label}`, children: label }));
|
|
46
|
+
}
|
|
47
|
+
// Decide which state we're in. Only one is active at a time so the
|
|
48
|
+
// headline is unambiguous.
|
|
49
|
+
const state = isMyTurn === true
|
|
50
|
+
? "your-turn"
|
|
51
|
+
: isMyTurn === false && activePlayerNames && activePlayerNames.length > 0
|
|
52
|
+
? "waiting"
|
|
53
|
+
: "phase-only";
|
|
54
|
+
const containerStyle = variant === "bar"
|
|
55
|
+
? {
|
|
56
|
+
...surfaceStyle(theme, { tone: "inset", radius: "hud" }),
|
|
57
|
+
padding: theme.space[3],
|
|
58
|
+
boxShadow: theme.elevation.inset,
|
|
59
|
+
fontFamily: theme.typography.fontFamily.body,
|
|
60
|
+
}
|
|
61
|
+
: { fontFamily: theme.typography.fontFamily.body };
|
|
62
|
+
const headline = renderHeadline({
|
|
63
|
+
state,
|
|
64
|
+
activePlayerNames,
|
|
65
|
+
label,
|
|
66
|
+
theme,
|
|
67
|
+
reducedMotion,
|
|
68
|
+
});
|
|
69
|
+
const ariaLabel = state === "your-turn"
|
|
70
|
+
? `Your turn — ${label}`
|
|
71
|
+
: state === "waiting"
|
|
72
|
+
? `Waiting for ${formatPlayerList(activePlayerNames ?? [])} — ${label}`
|
|
73
|
+
: label;
|
|
74
|
+
return (_jsx("div", { className: clsx("flex items-center gap-3 flex-wrap", className), style: containerStyle, role: "status", "aria-live": "polite", "aria-atomic": "true", "aria-label": ariaLabel, children: headline }));
|
|
75
|
+
}
|
|
76
|
+
function formatPhase(phase) {
|
|
77
|
+
const formatted = phase
|
|
78
|
+
.replace(/([A-Z])/g, " $1")
|
|
79
|
+
.replace(/_/g, " ")
|
|
80
|
+
.trim()
|
|
81
|
+
.replace(/^\w/, (c) => c.toUpperCase());
|
|
82
|
+
return formatted === "Player Turn" ? "Turn" : formatted;
|
|
83
|
+
}
|
|
84
|
+
function formatPlayerList(names) {
|
|
85
|
+
if (names.length === 0)
|
|
86
|
+
return "";
|
|
87
|
+
if (names.length === 1)
|
|
88
|
+
return names[0];
|
|
89
|
+
if (names.length === 2)
|
|
90
|
+
return `${names[0]} and ${names[1]}`;
|
|
91
|
+
return `${names.slice(0, -1).join(", ")}, and ${names[names.length - 1]}`;
|
|
92
|
+
}
|
|
93
|
+
function renderHeadline({ state, activePlayerNames, label, theme, reducedMotion, }) {
|
|
94
|
+
if (state === "phase-only") {
|
|
95
|
+
return (_jsx("div", { style: textBlockStyle(theme), children: _jsx("span", { style: titleTextStyle(theme), children: label }) }));
|
|
96
|
+
}
|
|
97
|
+
const isYourTurn = state === "your-turn";
|
|
98
|
+
const intent = isYourTurn
|
|
99
|
+
? theme.semantic.intent.success
|
|
100
|
+
: theme.semantic.intent.info;
|
|
101
|
+
const titleText = isYourTurn
|
|
102
|
+
? "Your turn"
|
|
103
|
+
: `Waiting for ${formatPlayerList(activePlayerNames ?? [])}…`;
|
|
104
|
+
return (_jsxs(motion.div, { initial: reducedMotion ? { opacity: 0 } : { opacity: 0, y: -4 }, animate: reducedMotion ? { opacity: 1 } : { opacity: 1, y: 0 }, style: {
|
|
105
|
+
display: "flex",
|
|
106
|
+
alignItems: "center",
|
|
107
|
+
gap: theme.space[3],
|
|
108
|
+
}, children: [_jsx(StatusIndicator, { intent: intent, kind: isYourTurn ? "pulse" : "spinner", reducedMotion: reducedMotion }), _jsxs("div", { style: textBlockStyle(theme), children: [_jsx("span", { style: titleTextStyle(theme), children: titleText }), _jsx("span", { style: subtitleTextStyle(theme), children: label })] })] }));
|
|
109
|
+
}
|
|
110
|
+
function textBlockStyle(theme) {
|
|
111
|
+
return {
|
|
112
|
+
display: "flex",
|
|
113
|
+
flexDirection: "column",
|
|
114
|
+
alignItems: "flex-start",
|
|
115
|
+
gap: theme.space[0.5],
|
|
116
|
+
minWidth: 0,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
function titleTextStyle(theme) {
|
|
120
|
+
return {
|
|
121
|
+
fontFamily: theme.typography.fontFamily.body,
|
|
122
|
+
fontSize: theme.typography.fontSize.lg,
|
|
123
|
+
fontWeight: theme.typography.fontWeight.bold,
|
|
124
|
+
letterSpacing: theme.typography.letterSpacing.tight,
|
|
125
|
+
lineHeight: theme.typography.lineHeight.tight,
|
|
126
|
+
color: theme.semantic.text.primary,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
function subtitleTextStyle(theme) {
|
|
130
|
+
return {
|
|
131
|
+
fontFamily: theme.typography.fontFamily.body,
|
|
132
|
+
fontSize: theme.typography.fontSize.xs,
|
|
133
|
+
fontWeight: theme.typography.fontWeight.medium,
|
|
134
|
+
letterSpacing: theme.typography.letterSpacing.caps,
|
|
135
|
+
textTransform: "uppercase",
|
|
136
|
+
color: theme.semantic.text.muted,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Animated status indicator sized to sit next to a body-font headline.
|
|
141
|
+
*
|
|
142
|
+
* Kept intentionally chip-less so it shares the chrome strip's
|
|
143
|
+
* understated treatment (the rest of the chrome uses bare typography
|
|
144
|
+
* and lets intent colour live in chips, dots, and borders — not in
|
|
145
|
+
* full-saturation surfaces). The colour comes from one
|
|
146
|
+
* {@link Theme}-supplied intent ramp so swapping themes keeps the
|
|
147
|
+
* indicator consistent with chips, toasts, and buttons that use the
|
|
148
|
+
* same intent.
|
|
149
|
+
*
|
|
150
|
+
* - `pulse` — soft halo radiating outward from a solid centre dot.
|
|
151
|
+
* Used for the player's own active turn.
|
|
152
|
+
* - `spinner` — thin partial ring rotating around a soft-filled
|
|
153
|
+
* centre. Reads as the standard "in flight / live" affordance.
|
|
154
|
+
*/
|
|
155
|
+
function StatusIndicator({ intent, kind, reducedMotion, }) {
|
|
156
|
+
const size = 16;
|
|
157
|
+
if (kind === "pulse") {
|
|
158
|
+
return (_jsxs("span", { "aria-hidden": "true", style: {
|
|
159
|
+
position: "relative",
|
|
160
|
+
display: "inline-flex",
|
|
161
|
+
alignItems: "center",
|
|
162
|
+
justifyContent: "center",
|
|
163
|
+
width: size,
|
|
164
|
+
height: size,
|
|
165
|
+
flexShrink: 0,
|
|
166
|
+
}, children: [_jsx(motion.span, { style: {
|
|
167
|
+
position: "absolute",
|
|
168
|
+
inset: 2,
|
|
169
|
+
borderRadius: "9999px",
|
|
170
|
+
background: intent.soft,
|
|
171
|
+
}, animate: reducedMotion
|
|
172
|
+
? undefined
|
|
173
|
+
: { scale: [1, 1.6, 1], opacity: [0.7, 0, 0.7] }, transition: {
|
|
174
|
+
repeat: reducedMotion ? 0 : Infinity,
|
|
175
|
+
duration: 1.6,
|
|
176
|
+
ease: "easeOut",
|
|
177
|
+
} }), _jsx("span", { style: {
|
|
178
|
+
position: "relative",
|
|
179
|
+
display: "inline-block",
|
|
180
|
+
width: 8,
|
|
181
|
+
height: 8,
|
|
182
|
+
borderRadius: "9999px",
|
|
183
|
+
background: intent.solid,
|
|
184
|
+
} })] }));
|
|
185
|
+
}
|
|
186
|
+
// "spinner" — partial ring rotating around an inset soft fill.
|
|
187
|
+
return (_jsxs("span", { "aria-hidden": "true", style: {
|
|
188
|
+
position: "relative",
|
|
189
|
+
display: "inline-flex",
|
|
190
|
+
alignItems: "center",
|
|
191
|
+
justifyContent: "center",
|
|
192
|
+
width: size,
|
|
193
|
+
height: size,
|
|
194
|
+
flexShrink: 0,
|
|
195
|
+
}, children: [_jsx("span", { style: {
|
|
196
|
+
position: "absolute",
|
|
197
|
+
inset: 4,
|
|
198
|
+
borderRadius: "9999px",
|
|
199
|
+
background: intent.soft,
|
|
200
|
+
} }), _jsx(motion.span, { style: {
|
|
201
|
+
position: "absolute",
|
|
202
|
+
inset: 0,
|
|
203
|
+
borderRadius: "9999px",
|
|
204
|
+
border: "2px solid transparent",
|
|
205
|
+
borderTopColor: intent.solid,
|
|
206
|
+
borderRightColor: intent.solid,
|
|
207
|
+
}, animate: reducedMotion ? undefined : { rotate: 360 }, transition: {
|
|
208
|
+
repeat: reducedMotion ? 0 : Infinity,
|
|
209
|
+
duration: 1.2,
|
|
210
|
+
ease: "linear",
|
|
211
|
+
} })] }));
|
|
212
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Central game board area for active game components (tricks, played
|
|
3
|
+
* cards, zones, etc.).
|
|
4
|
+
*
|
|
5
|
+
* Visual chrome (frame, empty placeholder, card entrance/exit) is
|
|
6
|
+
* sourced from the active {@link useTheme} so the play area re-skins
|
|
7
|
+
* with the rest of the shell.
|
|
8
|
+
*/
|
|
9
|
+
import { type CardProps, type ViewCard } from "./Card.js";
|
|
10
|
+
export interface PlayAreaProps<CardData extends ViewCard = ViewCard> {
|
|
11
|
+
cards: readonly CardData[];
|
|
12
|
+
filter?: (card: CardData) => boolean;
|
|
13
|
+
cardSize?: CardProps["size"];
|
|
14
|
+
renderCard?: CardProps<CardData>["renderContent"];
|
|
15
|
+
layout?: "grid" | "row";
|
|
16
|
+
interactive?: boolean;
|
|
17
|
+
onCardClick?: (cardId: string) => void;
|
|
18
|
+
"aria-label"?: string;
|
|
19
|
+
className?: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* @example
|
|
23
|
+
* ```tsx
|
|
24
|
+
* <PlayArea cards={trickCards} layout="row" renderCard={(card) => <PlayingCard card={card} />} />
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export declare function PlayArea<CardData extends ViewCard = ViewCard>({ cards, filter, cardSize, renderCard, layout, interactive, onCardClick, "aria-label": ariaLabel, className, }: PlayAreaProps<CardData>): import("react/jsx-runtime").JSX.Element;
|
|
28
|
+
//# sourceMappingURL=PlayArea.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PlayArea.d.ts","sourceRoot":"","sources":["../../src/components/PlayArea.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAAQ,KAAK,SAAS,EAAE,KAAK,QAAQ,EAAE,MAAM,WAAW,CAAC;AAIhE,MAAM,WAAW,aAAa,CAAC,QAAQ,SAAS,QAAQ,GAAG,QAAQ;IACjE,KAAK,EAAE,SAAS,QAAQ,EAAE,CAAC;IAC3B,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,OAAO,CAAC;IACrC,QAAQ,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IAC7B,UAAU,CAAC,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC,eAAe,CAAC,CAAC;IAClD,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,SAAS,QAAQ,GAAG,QAAQ,EAAE,EAC7D,KAAK,EACL,MAAM,EACN,QAAe,EACf,UAAU,EACV,MAAc,EACd,WAAmB,EACnB,WAAW,EACX,YAAY,EAAE,SAAuB,EACrC,SAAS,GACV,EAAE,aAAa,CAAC,QAAQ,CAAC,2CAiFzB"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* Central game board area for active game components (tricks, played
|
|
4
|
+
* cards, zones, etc.).
|
|
5
|
+
*
|
|
6
|
+
* Visual chrome (frame, empty placeholder, card entrance/exit) is
|
|
7
|
+
* sourced from the active {@link useTheme} so the play area re-skins
|
|
8
|
+
* with the rest of the shell.
|
|
9
|
+
*/
|
|
10
|
+
import { motion, AnimatePresence } from "framer-motion";
|
|
11
|
+
import { clsx } from "clsx";
|
|
12
|
+
import { Card } from "./Card.js";
|
|
13
|
+
import { useTheme } from "../theme/ThemeProvider.js";
|
|
14
|
+
import { chipStyle } from "../theme/derive.js";
|
|
15
|
+
/**
|
|
16
|
+
* @example
|
|
17
|
+
* ```tsx
|
|
18
|
+
* <PlayArea cards={trickCards} layout="row" renderCard={(card) => <PlayingCard card={card} />} />
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export function PlayArea({ cards, filter, cardSize = "md", renderCard, layout = "row", interactive = false, onCardClick, "aria-label": ariaLabel = "Play area", className, }) {
|
|
22
|
+
const theme = useTheme();
|
|
23
|
+
const reducedMotion = theme.motion.reducedMotion === "true";
|
|
24
|
+
const visibleCards = filter ? cards.filter(filter) : cards;
|
|
25
|
+
const layoutClasses = {
|
|
26
|
+
grid: "grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 gap-3 sm:gap-6",
|
|
27
|
+
row: "flex flex-wrap items-center justify-center gap-3 sm:gap-6",
|
|
28
|
+
};
|
|
29
|
+
return (_jsx("div", { className: clsx("relative w-full min-h-[200px] sm:min-h-[300px] p-6 sm:p-8", className), style: {
|
|
30
|
+
background: theme.semantic.surface.inset,
|
|
31
|
+
border: `2px dashed ${theme.semantic.border.default}`,
|
|
32
|
+
borderRadius: theme.radius.hud,
|
|
33
|
+
fontFamily: theme.typography.fontFamily.body,
|
|
34
|
+
color: theme.semantic.text.primary,
|
|
35
|
+
}, role: "region", "aria-label": `${ariaLabel} - ${visibleCards.length} item${visibleCards.length !== 1 ? "s" : ""}`, children: _jsx(AnimatePresence, { mode: "popLayout", children: visibleCards.length === 0 ? (_jsx(motion.div, { className: "flex items-center justify-center h-full absolute inset-0 pointer-events-none", initial: { opacity: 0 }, animate: { opacity: 1 }, exit: { opacity: 0 }, role: "status", "aria-live": "polite", children: _jsx("div", { style: {
|
|
36
|
+
...chipStyle(theme, { variant: "warning", size: "md" }),
|
|
37
|
+
fontSize: theme.typography.fontSize.md,
|
|
38
|
+
paddingBlock: theme.space[2],
|
|
39
|
+
paddingInline: theme.space[4],
|
|
40
|
+
}, children: "No cards in play" }) })) : (_jsx("div", { className: layoutClasses[layout], children: visibleCards.map((card, index) => (_jsx(motion.div, { layout: !reducedMotion, initial: reducedMotion
|
|
41
|
+
? { opacity: 0, scale: 1 }
|
|
42
|
+
: { opacity: 0, scale: 0.8 }, animate: { opacity: 1, scale: 1 }, exit: { opacity: 0, scale: 0.8 }, transition: {
|
|
43
|
+
type: "spring",
|
|
44
|
+
stiffness: 260,
|
|
45
|
+
damping: 20,
|
|
46
|
+
delay: reducedMotion ? 0 : index * 0.05,
|
|
47
|
+
}, children: _jsx(Card, { card: card, size: cardSize, renderContent: renderCard, disabled: !interactive, onCardClick: interactive ? onCardClick : undefined }) }, card.id))) })) }) }));
|
|
48
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
export interface PluginRuntimeProps {
|
|
3
|
+
/** Child components to render after state sync has started */
|
|
4
|
+
children: React.ReactNode;
|
|
5
|
+
/**
|
|
6
|
+
* Timeout in milliseconds to wait for the first state-sync snapshot.
|
|
7
|
+
* @default 10000 (10 seconds)
|
|
8
|
+
*/
|
|
9
|
+
timeout?: number;
|
|
10
|
+
/** Custom loading component to show while waiting for state sync */
|
|
11
|
+
loadingComponent?: React.ReactNode;
|
|
12
|
+
/** Custom error component to show when initialization fails */
|
|
13
|
+
errorComponent?: (error: string) => React.ReactNode;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* PluginRuntime provides the RuntimeContext for plugin components.
|
|
17
|
+
*
|
|
18
|
+
* This component:
|
|
19
|
+
* - Creates a RuntimeAPI instance using the SDK-provided implementation
|
|
20
|
+
* - Waits for the first reducer-native state-sync snapshot before rendering children
|
|
21
|
+
* - Provides RuntimeAPI and session state to all child components
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```tsx
|
|
25
|
+
* // In your plugin's index.tsx
|
|
26
|
+
* import { PluginRuntime } from "./components/dreamboard";
|
|
27
|
+
* import App from './App';
|
|
28
|
+
*
|
|
29
|
+
* ReactDOM.createRoot(document.getElementById('root')!).render(
|
|
30
|
+
* <PluginRuntime>
|
|
31
|
+
* <App />
|
|
32
|
+
* </PluginRuntime>
|
|
33
|
+
* );
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
export declare function PluginRuntime({ children, timeout, loadingComponent, errorComponent, }: PluginRuntimeProps): import("react/jsx-runtime").JSX.Element;
|
|
37
|
+
//# sourceMappingURL=PluginRuntime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PluginRuntime.d.ts","sourceRoot":"","sources":["../../src/components/PluginRuntime.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAO1B,MAAM,WAAW,kBAAkB;IACjC,8DAA8D;IAC9D,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oEAAoE;IACpE,gBAAgB,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACnC,+DAA+D;IAC/D,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,KAAK,CAAC,SAAS,CAAC;CACrD;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,aAAa,CAAC,EAC5B,QAAQ,EACR,OAAe,EACf,gBAAgB,EAChB,cAAc,GACf,EAAE,kBAAkB,2CA+BpB"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { InteractionUiProvider } from "../context/InteractionDraftContext.js";
|
|
3
|
+
import { RuntimeProvider } from "../context/RuntimeContext.js";
|
|
4
|
+
import { usePluginSession } from "../context/PluginSessionContext.js";
|
|
5
|
+
import { usePluginRuntime } from "../hooks/usePluginRuntime.js";
|
|
6
|
+
import { GameSkeleton } from "./GameSkeleton.js";
|
|
7
|
+
/**
|
|
8
|
+
* PluginRuntime provides the RuntimeContext for plugin components.
|
|
9
|
+
*
|
|
10
|
+
* This component:
|
|
11
|
+
* - Creates a RuntimeAPI instance using the SDK-provided implementation
|
|
12
|
+
* - Waits for the first reducer-native state-sync snapshot before rendering children
|
|
13
|
+
* - Provides RuntimeAPI and session state to all child components
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```tsx
|
|
17
|
+
* // In your plugin's index.tsx
|
|
18
|
+
* import { PluginRuntime } from "./components/dreamboard";
|
|
19
|
+
* import App from './App';
|
|
20
|
+
*
|
|
21
|
+
* ReactDOM.createRoot(document.getElementById('root')!).render(
|
|
22
|
+
* <PluginRuntime>
|
|
23
|
+
* <App />
|
|
24
|
+
* </PluginRuntime>
|
|
25
|
+
* );
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export function PluginRuntime({ children, timeout = 10000, loadingComponent, errorComponent, }) {
|
|
29
|
+
const { runtime, isReady, error } = usePluginRuntime({ timeout });
|
|
30
|
+
if (error) {
|
|
31
|
+
if (errorComponent) {
|
|
32
|
+
return _jsx(_Fragment, { children: errorComponent(error) });
|
|
33
|
+
}
|
|
34
|
+
return (_jsx("div", { className: "flex h-full w-full items-center justify-center bg-gray-50", children: _jsxs("div", { className: "text-center p-6", children: [_jsx("p", { className: "text-red-600 font-medium mb-2", children: "Failed to load game" }), _jsx("p", { className: "text-gray-600 text-sm", children: error })] }) }));
|
|
35
|
+
}
|
|
36
|
+
if (!isReady) {
|
|
37
|
+
if (loadingComponent) {
|
|
38
|
+
return _jsx(_Fragment, { children: loadingComponent });
|
|
39
|
+
}
|
|
40
|
+
return _jsx(GameSkeleton, { message: "Waiting for game state..." });
|
|
41
|
+
}
|
|
42
|
+
return (_jsx(RuntimeProvider, { runtime: runtime, children: _jsx(SessionScopedInteractionUiProvider, { children: children }) }));
|
|
43
|
+
}
|
|
44
|
+
function SessionScopedInteractionUiProvider({ children, }) {
|
|
45
|
+
const { controllingPlayerId } = usePluginSession();
|
|
46
|
+
return (_jsx(InteractionUiProvider, { children: children }, controllingPlayerId ?? "__no_player__"));
|
|
47
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Theme-aware primary CTA button — the dominant call-to-action on
|
|
3
|
+
* the screen at any given moment ("Roll dice", "End turn", "Confirm
|
|
4
|
+
* trade", "Place settlement").
|
|
5
|
+
*
|
|
6
|
+
* The shell's `chrome.primaryAction` slot accepts either a
|
|
7
|
+
* pre-rendered React node *or* an {@link InteractionHandle}. When a
|
|
8
|
+
* handle is supplied, the shell wraps it in this component so the
|
|
9
|
+
* call site collapses from ~10 lines to one. Authors who need a
|
|
10
|
+
* fully bespoke CTA can still pass any node.
|
|
11
|
+
*
|
|
12
|
+
* Visual contract (Laws of UX cross-references):
|
|
13
|
+
*
|
|
14
|
+
* - **Fitts** — defaults to `lg` size (min 56px tall, generous
|
|
15
|
+
* horizontal padding) so the dock target is easy to land on.
|
|
16
|
+
* Authors can opt down to `md`.
|
|
17
|
+
* - **Von Restorff (isolation)** — uses `intent.primary.solid` with
|
|
18
|
+
* `elevation.lifted` and an animated halo when `attention="auto"`
|
|
19
|
+
* and the descriptor is available, so the button outranks every
|
|
20
|
+
* other element in its peripheral neighbourhood.
|
|
21
|
+
* - **Peak-end** — when the action becomes available (handle flips
|
|
22
|
+
* from disabled → enabled), the halo pulses for one breath cycle
|
|
23
|
+
* so the eye finds the change without re-scanning the screen.
|
|
24
|
+
* - **Doherty / responsiveness** — clicks set an internal `pending`
|
|
25
|
+
* flag the moment submit fires so the button visibly absorbs the
|
|
26
|
+
* tap, even on slow networks. Throwing submitters are swallowed
|
|
27
|
+
* here for the same reason `<DefaultInteractionButton>` does:
|
|
28
|
+
* descriptor availability is authoritative.
|
|
29
|
+
* - **Accessibility** — minimum 56×56 hit area satisfies WCAG 2.5.5.
|
|
30
|
+
* `prefers-reduced-motion` zeroes out the halo and press
|
|
31
|
+
* transitions through the theme's `motion.reducedMotion` token.
|
|
32
|
+
*/
|
|
33
|
+
import { type CSSProperties, type ReactNode } from "react";
|
|
34
|
+
import { type ButtonSize, type ButtonVariant } from "../theme/derive.js";
|
|
35
|
+
import type { InteractionHandle, InteractionParamsShape } from "../hooks/useInteractionHandle.js";
|
|
36
|
+
import type { SubmittedActionConfig } from "./surfaces/internal/DefaultInteractionButton.js";
|
|
37
|
+
/** Attention-pulse policy for the trailing halo. */
|
|
38
|
+
export type PrimaryActionAttention = "auto" | "always" | "off";
|
|
39
|
+
export interface PrimaryActionButtonProps<Params extends InteractionParamsShape = InteractionParamsShape> {
|
|
40
|
+
/**
|
|
41
|
+
* Bound interaction handle (typically from `useInteractionByKey`).
|
|
42
|
+
* The button mirrors `descriptor.label`, disables itself when the
|
|
43
|
+
* descriptor is unavailable, surfaces `unavailableReason` as a
|
|
44
|
+
* tooltip, and submits explicit `params` or the current draft on click.
|
|
45
|
+
*/
|
|
46
|
+
handle: InteractionHandle<Params>;
|
|
47
|
+
/**
|
|
48
|
+
* Override the visual variant. Defaults to `primary` (which maps
|
|
49
|
+
* to `intent.primary` regardless of the descriptor's `emphasis`
|
|
50
|
+
* hint — the shell's primary slot is, by definition, primary).
|
|
51
|
+
*/
|
|
52
|
+
variant?: ButtonVariant;
|
|
53
|
+
/**
|
|
54
|
+
* Sizing. Defaults to `lg` so the dock target is comfortable on
|
|
55
|
+
* touch and visually outranks panel buttons sized `md`.
|
|
56
|
+
*/
|
|
57
|
+
size?: ButtonSize;
|
|
58
|
+
/**
|
|
59
|
+
* Override the label inferred from `descriptor.label`. Use only
|
|
60
|
+
* when the descriptor's label needs phase-specific copy that the
|
|
61
|
+
* authoring layer can't express.
|
|
62
|
+
*/
|
|
63
|
+
label?: ReactNode;
|
|
64
|
+
/** Client-side draft readiness. Reducer availability remains authoritative. */
|
|
65
|
+
ready?: boolean;
|
|
66
|
+
/** Copy and visual overrides once this interaction has been submitted. */
|
|
67
|
+
whenSubmitted?: SubmittedActionConfig;
|
|
68
|
+
/**
|
|
69
|
+
* Optional leading icon override. When omitted, falls back to
|
|
70
|
+
* `descriptor.icon` (an emoji glyph from the authoring spec).
|
|
71
|
+
*/
|
|
72
|
+
icon?: ReactNode;
|
|
73
|
+
/**
|
|
74
|
+
* Submit params forwarded to `handle.submit`. When omitted, the button
|
|
75
|
+
* submits the handle's current draft via `handle.submitDraft()`.
|
|
76
|
+
*/
|
|
77
|
+
params?: Record<string, unknown>;
|
|
78
|
+
/**
|
|
79
|
+
* Attention-halo policy. `auto` (default) pulses the halo for one
|
|
80
|
+
* breath when the button transitions from disabled → enabled (so
|
|
81
|
+
* the user sees the moment the action becomes available), then
|
|
82
|
+
* settles into a slow ambient breath while the action remains
|
|
83
|
+
* available. `always` keeps the breath running unconditionally.
|
|
84
|
+
* `off` suppresses the halo entirely.
|
|
85
|
+
*
|
|
86
|
+
* Ignored when `theme.motion.reducedMotion === "true"`.
|
|
87
|
+
*/
|
|
88
|
+
attention?: PrimaryActionAttention;
|
|
89
|
+
/** Additional inline style merged after the resolved button style. */
|
|
90
|
+
style?: CSSProperties;
|
|
91
|
+
/** Optional className for downstream styling hooks. */
|
|
92
|
+
className?: string;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* @see PrimaryActionButtonProps
|
|
96
|
+
*/
|
|
97
|
+
export declare function PrimaryActionButton<Params extends InteractionParamsShape = InteractionParamsShape>({ handle, variant, size, label, ready, whenSubmitted, icon, params, attention, style, className, }: PrimaryActionButtonProps<Params>): import("react/jsx-runtime").JSX.Element;
|
|
98
|
+
//# sourceMappingURL=PrimaryActionButton.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PrimaryActionButton.d.ts","sourceRoot":"","sources":["../../src/components/PrimaryActionButton.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,EAIL,KAAK,aAAa,EAClB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAGf,OAAO,EAEL,KAAK,UAAU,EACf,KAAK,aAAa,EACnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EACV,iBAAiB,EACjB,sBAAsB,EACvB,MAAM,kCAAkC,CAAC;AAG1C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iDAAiD,CAAC;AAE7F,oDAAoD;AACpD,MAAM,MAAM,sBAAsB,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;AAE/D,MAAM,WAAW,wBAAwB,CACvC,MAAM,SAAS,sBAAsB,GAAG,sBAAsB;IAE9D;;;;;OAKG;IACH,MAAM,EAAE,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAClC;;;;OAIG;IACH,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB;;;OAGG;IACH,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB;;;;OAIG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,+EAA+E;IAC/E,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,0EAA0E;IAC1E,aAAa,CAAC,EAAE,qBAAqB,CAAC;IACtC;;;OAGG;IACH,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC;;;;;;;;;OASG;IACH,SAAS,CAAC,EAAE,sBAAsB,CAAC;IACnC,sEAAsE;IACtE,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,SAAS,sBAAsB,GAAG,sBAAsB,EAC9D,EACA,MAAM,EACN,OAAmB,EACnB,IAAW,EACX,KAAK,EACL,KAAY,EACZ,aAAa,EACb,IAAI,EACJ,MAAM,EACN,SAAkB,EAClB,KAAK,EACL,SAAS,GACV,EAAE,wBAAwB,CAAC,MAAM,CAAC,2CA+KlC"}
|