UI Bridge
Overview
React components for bridge card game UI.
@workspace/ui-bridge provides domain-specific React components for building bridge game interfaces. Components are organized into sub-path exports by domain module.
Quick Start
import { BridgeProvider } from '@workspace/ui-bridge/bridge-context/bridge-provider';
import { SuitDisplay } from '@workspace/ui-bridge/suit/suit-display';
import { CardDisplay } from '@workspace/ui-bridge/card/card-display';
function App() {
return (
<BridgeProvider>
<SuitDisplay suit="S" />
<CardDisplay card="SA" />
</BridgeProvider>
);
}Sub-path exports
One sub-path per module, generated from the package exports map. Globs (./hand/*, ./components/bid/*, …) expose every .tsx file of their folder; .ts modules are listed one by one.
| Import path | Exports |
|---|---|
| Bridge context | |
@workspace/ui-bridge/bridge-context/bridge-provider | BridgeEngineContext, BridgeProvider |
@workspace/ui-bridge/bridge-context/element-id-provider | BridgeElementIdProvider, useBridgeElementIds, BRIDGE_ELEMENT_KEYS |
@workspace/ui-bridge/bridge-context/with-bridge-context | withBridgeContext |
@workspace/ui-bridge/bridge-context/use-bridge-engine | useBridgeEngine |
@workspace/ui-bridge/bridge-context/use-variant | useVariant, setSuitVariantStyle |
| Providers | |
@workspace/ui-bridge/provider | BridgePrimitivesProvider |
@workspace/ui-bridge/context/final-comment-editor-context | FinalCommentEditorProvider, useFinalCommentEditor, useFinalCommentEditorOptional, useRegisterFinalCommentEditor |
| Strings | |
@workspace/ui-bridge/strings | BridgeStringsProvider, defaultBridgeStrings, use…Strings hooks |
| Suit | |
@workspace/ui-bridge/suit/suit-display | SuitDisplay |
@workspace/ui-bridge/suit/suit-icons-context | SuitIconsProvider, useSuitIcons |
@workspace/ui-bridge/suit/suit-icons | SpadeSuit, HeartSuit, DiamondSuit, ClubSuit, PetitBridgeSuit, DEFAULT_SUIT_ICONS, … |
| Rank | |
@workspace/ui-bridge/rank/rank-display | RankDisplay |
| Card | |
@workspace/ui-bridge/card/card-display | CardDisplay |
@workspace/ui-bridge/card/card-face | CardFaceProvider, cardFaceChrome, useCardFace |
@workspace/ui-bridge/card/card-fan | CardFan |
@workspace/ui-bridge/card/card-image | CardImage |
@workspace/ui-bridge/card/playing-card | PlayingCard |
| Bid | |
@workspace/ui-bridge/components/bid/bid-box-pad | BidBoxPad, BID_BOX_PAD_W, BID_BOX_PAD_H |
@workspace/ui-bridge/components/bid/bid-button | BidButton |
@workspace/ui-bridge/components/bid/bid-card-face-defs | FaceTextureDefs, BidCardFaceDefs, useSharedFaceTextureIds |
@workspace/ui-bridge/components/bid/bid-card-face | BidCardFace, heightForLevel, faceHeightFor, tabFractionForDenomination, notchForDenomination, FACE_W, … |
@workspace/ui-bridge/components/bid/bid-card-fan | BidCardFan, fanRowLength |
@workspace/ui-bridge/components/bid/bid-card-packet | BidCardPacket, bidOrdinal, packetBids, packetHeightFor, packetHeadCenter |
@workspace/ui-bridge/components/bid/bid-denomination-display | BidDenominationDisplay |
@workspace/ui-bridge/components/bid/bid-display | BidDisplay |
@workspace/ui-bridge/components/bid/bid-drawer | BidDrawer |
@workspace/ui-bridge/components/bid/bid-flight | BidFlightProvider, BidFlightGrounded, flightStart, useBidTakeoff, useBidLanding |
@workspace/ui-bridge/components/bid/bid-pad | BidPad, useBidPadContext, isBidDisabled, isBidOutbid, PAD_ORDER |
@workspace/ui-bridge/components/bid/bid-rail | BidRail, railTooltip |
@workspace/ui-bridge/components/bid/bid-sequence-input | BidSequenceInput |
@workspace/ui-bridge/components/bid/bid-token | BidGlyph, BidToken |
@workspace/ui-bridge/components/bid/bidding-pad | BiddingPad |
@workspace/ui-bridge/components/bid/paper | PaperGrain, paperTexture, paperBlendVars |
| Contract | |
@workspace/ui-bridge/contract/contract-display | ContractDisplay |
@workspace/ui-bridge/contract/contract-pill | ContractPill |
@workspace/ui-bridge/contract/contract-selection | ContractSelection |
@workspace/ui-bridge/contract/declarer-pill | DeclarerPill |
@workspace/ui-bridge/contract/hooks/use-contract-result | useContractResult |
@workspace/ui-bridge/contract/hooks/use-trump | useTrump |
| Player | |
@workspace/ui-bridge/player/player-display | PlayerDisplay, getPlayerSideColor, DEFAULT_PLAYER_SIDE_COLORS, PLAYER_NOTATION_ATTR |
@workspace/ui-bridge/player/player-selector | PlayerSelector, DEFAULT_PLAYER_SELECTOR_LABELS |
@workspace/ui-bridge/player/player-team-display | PlayerTeamDisplay, resolveTeam, TEAMS |
@workspace/ui-bridge/player/selected-player-alert | SelectedPlayerAlert |
| Vulnerability | |
@workspace/ui-bridge/vulnerability/vulnerability-display | VulnerabilityDisplay, VULNERABILITY_NOTATION_ATTR |
@workspace/ui-bridge/vulnerability/vulnerability-icon | VulnerabilityIcon |
| Scoring | |
@workspace/ui-bridge/scoring/scoring-display | ScoringDisplay |
| Auction | |
@workspace/ui-bridge/auction/auction-sequence | AuctionSequenceView, AuctionSequence |
| Fields | |
@workspace/ui-bridge/fields/denomination-select | DenominationSelect |
@workspace/ui-bridge/fields/doubling-select | DoublingSelect |
@workspace/ui-bridge/fields/enum-field | EnumField |
@workspace/ui-bridge/fields/level-select | LevelSelect |
@workspace/ui-bridge/fields/pedagogy-mode-select | PedagogyModeSelect |
@workspace/ui-bridge/fields/player-select | PlayerSelect |
@workspace/ui-bridge/fields/result-expected-select | ResultExpectedSelect |
@workspace/ui-bridge/fields/scoring-select | ScoringSelect |
@workspace/ui-bridge/fields/tricks-select | TricksSelect |
@workspace/ui-bridge/fields/vulnerability-select | VulnerabilitySelect |
@workspace/ui-bridge/fields/vulnerable-select | VulnerableSelect |
| Hand | |
@workspace/ui-bridge/hand/clear-hands-button | ClearHandsButton |
@workspace/ui-bridge/hand/compact-hand | CompactHand |
@workspace/ui-bridge/hand/complete-hands-button | CompleteHandsButton |
@workspace/ui-bridge/hand/context | HandProvider, useHandContext |
@workspace/ui-bridge/hand/distribute-hands-button | DistributeHandsButton |
@workspace/ui-bridge/hand/hand-display-row | HandDisplayRow |
@workspace/ui-bridge/hand/hand-root | HandRoot |
@workspace/ui-bridge/hand/hand-suit-icon | HandSuitIcon |
@workspace/ui-bridge/hand/hands-action-buttons | HandsActionButtons |
@workspace/ui-bridge/hand/hands-pill | HandsPill |
@workspace/ui-bridge/hand/redistribute-hands-button | RedistributeHandsButton |
@workspace/ui-bridge/hand/rotate-hands-button | RotateHandsButton |
@workspace/ui-bridge/hand/hand | Hand |
@workspace/ui-bridge/hand/hooks/use-are-hands-complete | useAreHandsComplete |
@workspace/ui-bridge/hand/hooks/use-hands-status | useHandsStatus |
@workspace/ui-bridge/hand/use-hand-input-state | useHandInputState |
@workspace/ui-bridge/hand/use-hand-input-validation | useHandInputValidation |
| Board | |
@workspace/ui-bridge/board/board-layout | BoardLayoutContext, BoardLayout |
@workspace/ui-bridge/board/board-position | BoardPosition, playerToPosition |
@workspace/ui-bridge/board/compass-rose | CompassRose |
@workspace/ui-bridge/board/deal-board-preview | DealBoardPreview |
@workspace/ui-bridge/board/hands-board | HandsBoard |
@workspace/ui-bridge/board/trick-table-layout | TrickTableLayout |
@workspace/ui-bridge/board/trick-table-position | TrickTableCard, TrickTableCenter, playerToSlot, slotToPlayer |
@workspace/ui-bridge/board/board | Board |
@workspace/ui-bridge/board/trick-table | TrickTable |
| Editor primitives | |
@workspace/ui-bridge/primitives/editor/auction-editor | AuctionEditor, useAuctionEditor, useAuctionTable, useGridHeaderItems, groupBidsIntoRows |
@workspace/ui-bridge/primitives/editor/deal-params | DealParams, useDealParamsContext |
@workspace/ui-bridge/primitives/editor/deal-status | DealStatus |
@workspace/ui-bridge/primitives/editor/pbn-importer | PbnImporter, usePbnImporterContext, useDealOptionContext, PBN_FILE_EXTENSIONS |
@workspace/ui-bridge/primitives/editor/play-editor | PlayEditor, usePlayEditorContext |
@workspace/ui-bridge/primitives/editor/player-selector | PlayerSelector, usePlayerSelectorContext, usePlayerOptionContext |
@workspace/ui-bridge/primitives/editor/use-pedagogy-mode-groups | usePedagogyModeGroups |
@workspace/ui-bridge/primitives/editor/use-pedagogy-mode-with-rules | usePedagogyModeWithRules |
| Table primitives | |
@workspace/ui-bridge/primitives/auction-sequence | AuctionSeq, seatEntries, useAuctionColumns, useAuctionEntries |
@workspace/ui-bridge/primitives/compass | useContinuousAngle, useCompass |
@workspace/ui-bridge/primitives/dummy | Dummy, useDummy |
@workspace/ui-bridge/primitives/hand | Hand, useHand, useCard |
@workspace/ui-bridge/primitives/hands-editor | HandsEditor, useHandsEditorContext, useHandEditorContext |
@workspace/ui-bridge/primitives/seat-player | SeatPlayer, useSeatPlayer |
@workspace/ui-bridge/primitives/table-hand | TableHand, useTableHand, useTableHandCard, useSuitLane |
@workspace/ui-bridge/primitives/table-surface | SlotProvider, Table, useTableSurface, useSlot, layoutFor, gridModeFor, … |
@workspace/ui-bridge/primitives/trick | Trick, playerToSlot, slotToPlayer, trickWidth, TRICK_COMPASS_MIN, TRICK_CENTER_FLOOR_REM, … |
| Auction | |
@workspace/ui-bridge/components/auction/auction-bid-pad | AuctionBidPad |
@workspace/ui-bridge/components/auction/auction-comments-display | AuctionComments |
@workspace/ui-bridge/components/auction/auction-grid-content | AuctionGridContent |
@workspace/ui-bridge/components/auction/auction-grid-display | AuctionGridDisplay |
@workspace/ui-bridge/components/auction/auction-grid-header | AuctionGridHeader |
@workspace/ui-bridge/components/auction/auction-grid | AuctionGrid |
@workspace/ui-bridge/components/auction/auction-next-bidder | AuctionNextBidder |
@workspace/ui-bridge/components/auction/auction-preview-table | AuctionPreviewTable |
| Play | |
@workspace/ui-bridge/play/incomplete-hands-callout | IncompleteHandsCallout |
@workspace/ui-bridge/play/lead-pill | LeadPill |
@workspace/ui-bridge/play/play-annotations | PlayAnnotations, DEFAULT_PLAY_ANNOTATIONS_LABELS |
@workspace/ui-bridge/play/play-comments-display | PlayComments |
@workspace/ui-bridge/play/play-errors | PlayErrors |
@workspace/ui-bridge/play/play-help | PlayHelp, DEFAULT_PLAY_HELP_LABELS |
@workspace/ui-bridge/play/play-input | PlayInput, DEFAULT_PLAY_INPUT_LABELS |
@workspace/ui-bridge/play/play-sequence-preview | PlaySequencePreview |
@workspace/ui-bridge/play/tricks-display | TricksDisplay |
@workspace/ui-bridge/play/hooks/use-has-played-suit | useHasPlayedSuit |
@workspace/ui-bridge/play/hooks/use-lead | useLead |
@workspace/ui-bridge/play/hooks/useTricksWithWinners | useTricksWithWinners |
| Play table | |
@workspace/ui-bridge/components/play/play-controls | PlayControls |
@workspace/ui-bridge/components/play/play-current-player-hand | PlayCurrentPlayerHand |
@workspace/ui-bridge/components/play/play-trick-table-display | PlayTrickTableDisplay |
@workspace/ui-bridge/components/play/play-trick-table | PlayTrickTable |
@workspace/ui-bridge/components/table/compass | VulnerabilityHub, Compass, FittedCompass, CompassRoseIcon |
@workspace/ui-bridge/components/table/dummy-hand | DummyHand, DUMMY_VIS_RANK, DUMMY_VIS_RANK_SUIT |
@workspace/ui-bridge/components/table/felt | Felt |
@workspace/ui-bridge/components/table/hand | HeroHand, useSuitLaneLabel, getSuitGridTemplate |
@workspace/ui-bridge/components/table/kbd-hint | KbdHintItems, KbdHintSlot, useKbdHintContent, useKbdHintZone |
@workspace/ui-bridge/components/table/playable | DeploySheet, nonOptimalDim, hasOptimalCard, useCardInteractivityMode, usePlayable |
@workspace/ui-bridge/components/table/table-surface | TableSurface |
@workspace/ui-bridge/components/table/trick | TrickMat, trickCardEnterBudgetMs |
| Views | |
@workspace/ui-bridge/views/auction-table | AuctionTable |
@workspace/ui-bridge/views/play-table | PlayTable, trickSpansRow |
| Deal | |
@workspace/ui-bridge/components/deal/contract-sequence-popover | ContractSequencePopover |
@workspace/ui-bridge/components/deal/deal-aside | DealAside |
@workspace/ui-bridge/components/deal/deal-board | DealBoard |
@workspace/ui-bridge/components/deal/deal-comment | DealCommentBubble, DealCommentOverlay, DealCommentStrip, dealCommentPositionFor, useDealCommentsActive, useDealCommentHistory, … |
@workspace/ui-bridge/components/deal/deal-diagram | DealDiagram |
@workspace/ui-bridge/components/deal/deal-info-facts | DealInfoRow, DEAL_INFO_FACT_RENDERERS |
@workspace/ui-bridge/components/deal/deal-info-sheet | DealInfoSheet |
@workspace/ui-bridge/components/deal/deal-info | DealInfo |
@workspace/ui-bridge/components/deal/deal-scorecard | DealScorecard |
@workspace/ui-bridge/components/deal/diagram-hand | DiagramHand |
@workspace/ui-bridge/components/deal/hcp-badge | HcpBadge, HcpDetailBadge |
@workspace/ui-bridge/components/deal/player-header | PlayerHeader |
@workspace/ui-bridge/components/deal/swappable | createSwappable |
| Deal cells and preview | |
@workspace/ui-bridge/deal/cells/player-position-cell | PlayerPositionCell |
@workspace/ui-bridge/deal/cells/player-side-cell | PlayerSideCell |
@workspace/ui-bridge/deal/cells/scoring-cell | ScoringCell |
@workspace/ui-bridge/deal/cells/teaching-mode-cell | TeachingModeCell |
@workspace/ui-bridge/deal/cells/vulnerability-cell | VulnerabilityCell |
@workspace/ui-bridge/deal/board-preview | BoardPreview |
@workspace/ui-bridge/deal/board-preview-view-model | Types: BoardPreviewViewModel |
| Review | |
@workspace/ui-bridge/components/review/actions | PhaseControls, ShareRow, NextButton, SHARE_CHANNELS |
@workspace/ui-bridge/components/review/atoms | BidText, ContractText, ScoreText, RoleTag, SegControl, REVIEW_SUIT_ORDER |
@workspace/ui-bridge/components/review/comment-panel | CommentPanel |
@workspace/ui-bridge/components/review/continue-overlay | ContinueOverlay |
@workspace/ui-bridge/components/review/cross | Cross |
@workspace/ui-bridge/components/review/level-picker-overlay | LevelPickerOverlay |
@workspace/ui-bridge/components/review/mini-hand | MiniHand |
@workspace/ui-bridge/components/review/replay-ui | ReplayBar, ReplayControlsCard, TrickLoupe |
@workspace/ui-bridge/components/review/review-large | DealReviewLarge |
@workspace/ui-bridge/components/review/review-narrow | DealReviewNarrow |
@workspace/ui-bridge/components/review/sequence-card | SequenceCard |
@workspace/ui-bridge/components/review/verdict | VerdictScore |
@workspace/ui-bridge/components/review/deal-review-props | Types: DealReviewProps |
@workspace/ui-bridge/components/review/is-seat-vulnerable | isSeatVulnerable |
@workspace/ui-bridge/components/review/review-comments-view-model | Types: ReviewCommentsViewModel |
@workspace/ui-bridge/components/review/review-view-model | Types: NextDealLevel, ReviewViewModel |
@workspace/ui-bridge/components/review/use-trick-replay | computeCardState, computeLeadState, useTrickReplay, BEFORE_FIRST_TRICK |
| Result | |
@workspace/ui-bridge/components/result/result-view | ResultView |
@workspace/ui-bridge/components/result/reveal | Reveal |
@workspace/ui-bridge/components/result/stars | StarSlot, ResultStars, introStarsDoneMs, starLayoutId, MAX_STARS |
| Chrome | |
@workspace/ui-bridge/components/chrome/action-dial | ActionDial |
@workspace/ui-bridge/components/chrome/radial-menu | RadialMenu |
@workspace/ui-bridge/components/panels/claim-options | ClaimOptionsList |
| Styled hand rows | |
@workspace/ui-bridge/components/board/Board | Board |
@workspace/ui-bridge/components/hands-editor | StyledHandsEditor |
@workspace/ui-bridge/components/hand/hand-suit-row | HandSuitRow |
@workspace/ui-bridge/components/hand/hand | Hand |
@workspace/ui-bridge/components/hand/validated-hand-suit-row | ValidatedHandSuitRow |
| Decorations | |
@workspace/ui-bridge/components/floating-suits | FloatingSuits, defaultFloatingPositions, rightOnlyFloatingPositions |
| Labels | |
@workspace/ui-bridge/labels/contract-or-trump | ContractOrTrumpLabel |
@workspace/ui-bridge/labels/result-expected | ResultExpected |
@workspace/ui-bridge/labels/teaching-mode-group | TeachingModeGroup |
@workspace/ui-bridge/labels/teaching-mode | TeachingMode |
| Misc | |
@workspace/ui-bridge/misc/deal-selector | DealSelector, DEFAULT_DEAL_SELECTOR_LABELS |
@workspace/ui-bridge/misc/file-upload-button | FileUploadButton, DEFAULT_SUPPORTED_FILE_TYPES, DEFAULT_FILE_UPLOAD_BUTTON_LABELS |
@workspace/ui-bridge/misc/final-comment-display | FinalComment |
@workspace/ui-bridge/misc/import-deal-selector-dialog | ImportDealSelectorDialog, DEFAULT_IMPORT_DEAL_SELECTOR_DIALOG_LABELS |
@workspace/ui-bridge/misc/import-pbn-file | ImportPBNFile, PBN_FILE_EXTENSIONS, DEFAULT_IMPORT_PBN_FILE_LABELS |
@workspace/ui-bridge/misc/key-value-preview | KeyValuePreview |
@workspace/ui-bridge/misc/preview-card | PreviewCard |
@workspace/ui-bridge/misc/teaching-mode-badge | TeachingModeBadge |
| Par | |
@workspace/ui-bridge/par/par-contract | ParContract |
@workspace/ui-bridge/par/par-trick-count | ParTrickCount |
| PBN | |
@workspace/ui-bridge/pbn/file-explorer-dialog | FileExplorerDialog, DEFAULT_FILE_EXPLORER_DIALOG_LABELS |
@workspace/ui-bridge/pbn/file-explorer-row-parts | DealBoardPreview, MetadataPreview, AuctionPreview, PlayPreview, TeachingPreview |
@workspace/ui-bridge/pbn/file-explorer-row | FileExplorerRow, DEFAULT_FILE_EXPLORER_ROW_LABELS |
@workspace/ui-bridge/pbn/use-deal-preview-data | useDealPreviewData |
@workspace/ui-bridge/pbn/download-pbn-file | downloadPBNFile |
| Hooks | |
@workspace/ui-bridge/hooks/useAuctionInput | useAuctionInput |
@workspace/ui-bridge/hooks/useDynamicFontSize | useDynamicFontSize |
@workspace/ui-bridge/hooks/useFieldVisibility | useFieldVisibility |
@workspace/ui-bridge/hooks/useTableSuitOrders | useTableSuitOrders |
@workspace/ui-bridge/hooks/useValidateDeal | useValidateDeal |
| Timing | |
@workspace/ui-bridge/timing/motion | MotionProvider, motionSeconds, restingCardLayout, useMotion, FULL_MOTION, REDUCED_MOTION, … |
@workspace/ui-bridge/timing/use-beat-release | useBeatRelease |
| Interaction | |
@workspace/ui-bridge/interaction/types | Types: TargetIntent, InteractionContext, NormalizedClickEvent, NormalizedKeyEvent |
@workspace/ui-bridge/interaction/resolve-intent | resolveIntent |
@workspace/ui-bridge/interaction/registry | InteractionRegistryProvider, useInteractionHandler, useInteractionContext, useInteractionRegistryDebug |
| Lib | |
@workspace/ui-bridge/lib/table-slots | getSlot, getPlayerAtSlot |
| Styles | |
@workspace/ui-bridge/styles.css | CSS custom properties for suit colors and variants |
Architecture
Most display components follow a pattern:
- BridgeProvider wraps the app to provide engine context (rules + notation)
- Components use
useBridgeEngine()internally for variant-specific rendering (notation, display config) - Copy comes from
BridgeStringsProvider(@workspace/ui-bridge/strings), never from an i18n library - Compound components (Hand, AuctionEditor, PlayEditor) provide their own context via a Root component
- Every atom that renders a bridge value (suit, rank, card, call, contract, seat, vulnerability, scoring, expected result, field options) carries
translate="no"and thenotranslateclass on the element it renders: page translators leave it alone (i18n)
Package Structure
provider.tsx
styles.css