Bridge Training
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 pathExports
Bridge context
@workspace/ui-bridge/bridge-context/bridge-providerBridgeEngineContext, BridgeProvider
@workspace/ui-bridge/bridge-context/element-id-providerBridgeElementIdProvider, useBridgeElementIds, BRIDGE_ELEMENT_KEYS
@workspace/ui-bridge/bridge-context/with-bridge-contextwithBridgeContext
@workspace/ui-bridge/bridge-context/use-bridge-engineuseBridgeEngine
@workspace/ui-bridge/bridge-context/use-variantuseVariant, setSuitVariantStyle
Providers
@workspace/ui-bridge/providerBridgePrimitivesProvider
@workspace/ui-bridge/context/final-comment-editor-contextFinalCommentEditorProvider, useFinalCommentEditor, useFinalCommentEditorOptional, useRegisterFinalCommentEditor
Strings
@workspace/ui-bridge/stringsBridgeStringsProvider, defaultBridgeStrings, use…Strings hooks
Suit
@workspace/ui-bridge/suit/suit-displaySuitDisplay
@workspace/ui-bridge/suit/suit-icons-contextSuitIconsProvider, useSuitIcons
@workspace/ui-bridge/suit/suit-iconsSpadeSuit, HeartSuit, DiamondSuit, ClubSuit, PetitBridgeSuit, DEFAULT_SUIT_ICONS, …
Rank
@workspace/ui-bridge/rank/rank-displayRankDisplay
Card
@workspace/ui-bridge/card/card-displayCardDisplay
@workspace/ui-bridge/card/card-faceCardFaceProvider, cardFaceChrome, useCardFace
@workspace/ui-bridge/card/card-fanCardFan
@workspace/ui-bridge/card/card-imageCardImage
@workspace/ui-bridge/card/playing-cardPlayingCard
Bid
@workspace/ui-bridge/components/bid/bid-box-padBidBoxPad, BID_BOX_PAD_W, BID_BOX_PAD_H
@workspace/ui-bridge/components/bid/bid-buttonBidButton
@workspace/ui-bridge/components/bid/bid-card-face-defsFaceTextureDefs, BidCardFaceDefs, useSharedFaceTextureIds
@workspace/ui-bridge/components/bid/bid-card-faceBidCardFace, heightForLevel, faceHeightFor, tabFractionForDenomination, notchForDenomination, FACE_W, …
@workspace/ui-bridge/components/bid/bid-card-fanBidCardFan, fanRowLength
@workspace/ui-bridge/components/bid/bid-card-packetBidCardPacket, bidOrdinal, packetBids, packetHeightFor, packetHeadCenter
@workspace/ui-bridge/components/bid/bid-denomination-displayBidDenominationDisplay
@workspace/ui-bridge/components/bid/bid-displayBidDisplay
@workspace/ui-bridge/components/bid/bid-drawerBidDrawer
@workspace/ui-bridge/components/bid/bid-flightBidFlightProvider, BidFlightGrounded, flightStart, useBidTakeoff, useBidLanding
@workspace/ui-bridge/components/bid/bid-padBidPad, useBidPadContext, isBidDisabled, isBidOutbid, PAD_ORDER
@workspace/ui-bridge/components/bid/bid-railBidRail, railTooltip
@workspace/ui-bridge/components/bid/bid-sequence-inputBidSequenceInput
@workspace/ui-bridge/components/bid/bid-tokenBidGlyph, BidToken
@workspace/ui-bridge/components/bid/bidding-padBiddingPad
@workspace/ui-bridge/components/bid/paperPaperGrain, paperTexture, paperBlendVars
Contract
@workspace/ui-bridge/contract/contract-displayContractDisplay
@workspace/ui-bridge/contract/contract-pillContractPill
@workspace/ui-bridge/contract/contract-selectionContractSelection
@workspace/ui-bridge/contract/declarer-pillDeclarerPill
@workspace/ui-bridge/contract/hooks/use-contract-resultuseContractResult
@workspace/ui-bridge/contract/hooks/use-trumpuseTrump
Player
@workspace/ui-bridge/player/player-displayPlayerDisplay, getPlayerSideColor, DEFAULT_PLAYER_SIDE_COLORS, PLAYER_NOTATION_ATTR
@workspace/ui-bridge/player/player-selectorPlayerSelector, DEFAULT_PLAYER_SELECTOR_LABELS
@workspace/ui-bridge/player/player-team-displayPlayerTeamDisplay, resolveTeam, TEAMS
@workspace/ui-bridge/player/selected-player-alertSelectedPlayerAlert
Vulnerability
@workspace/ui-bridge/vulnerability/vulnerability-displayVulnerabilityDisplay, VULNERABILITY_NOTATION_ATTR
@workspace/ui-bridge/vulnerability/vulnerability-iconVulnerabilityIcon
Scoring
@workspace/ui-bridge/scoring/scoring-displayScoringDisplay
Auction
@workspace/ui-bridge/auction/auction-sequenceAuctionSequenceView, AuctionSequence
Fields
@workspace/ui-bridge/fields/denomination-selectDenominationSelect
@workspace/ui-bridge/fields/doubling-selectDoublingSelect
@workspace/ui-bridge/fields/enum-fieldEnumField
@workspace/ui-bridge/fields/level-selectLevelSelect
@workspace/ui-bridge/fields/pedagogy-mode-selectPedagogyModeSelect
@workspace/ui-bridge/fields/player-selectPlayerSelect
@workspace/ui-bridge/fields/result-expected-selectResultExpectedSelect
@workspace/ui-bridge/fields/scoring-selectScoringSelect
@workspace/ui-bridge/fields/tricks-selectTricksSelect
@workspace/ui-bridge/fields/vulnerability-selectVulnerabilitySelect
@workspace/ui-bridge/fields/vulnerable-selectVulnerableSelect
Hand
@workspace/ui-bridge/hand/clear-hands-buttonClearHandsButton
@workspace/ui-bridge/hand/compact-handCompactHand
@workspace/ui-bridge/hand/complete-hands-buttonCompleteHandsButton
@workspace/ui-bridge/hand/contextHandProvider, useHandContext
@workspace/ui-bridge/hand/distribute-hands-buttonDistributeHandsButton
@workspace/ui-bridge/hand/hand-display-rowHandDisplayRow
@workspace/ui-bridge/hand/hand-rootHandRoot
@workspace/ui-bridge/hand/hand-suit-iconHandSuitIcon
@workspace/ui-bridge/hand/hands-action-buttonsHandsActionButtons
@workspace/ui-bridge/hand/hands-pillHandsPill
@workspace/ui-bridge/hand/redistribute-hands-buttonRedistributeHandsButton
@workspace/ui-bridge/hand/rotate-hands-buttonRotateHandsButton
@workspace/ui-bridge/hand/handHand
@workspace/ui-bridge/hand/hooks/use-are-hands-completeuseAreHandsComplete
@workspace/ui-bridge/hand/hooks/use-hands-statususeHandsStatus
@workspace/ui-bridge/hand/use-hand-input-stateuseHandInputState
@workspace/ui-bridge/hand/use-hand-input-validationuseHandInputValidation
Board
@workspace/ui-bridge/board/board-layoutBoardLayoutContext, BoardLayout
@workspace/ui-bridge/board/board-positionBoardPosition, playerToPosition
@workspace/ui-bridge/board/compass-roseCompassRose
@workspace/ui-bridge/board/deal-board-previewDealBoardPreview
@workspace/ui-bridge/board/hands-boardHandsBoard
@workspace/ui-bridge/board/trick-table-layoutTrickTableLayout
@workspace/ui-bridge/board/trick-table-positionTrickTableCard, TrickTableCenter, playerToSlot, slotToPlayer
@workspace/ui-bridge/board/boardBoard
@workspace/ui-bridge/board/trick-tableTrickTable
Editor primitives
@workspace/ui-bridge/primitives/editor/auction-editorAuctionEditor, useAuctionEditor, useAuctionTable, useGridHeaderItems, groupBidsIntoRows
@workspace/ui-bridge/primitives/editor/deal-paramsDealParams, useDealParamsContext
@workspace/ui-bridge/primitives/editor/deal-statusDealStatus
@workspace/ui-bridge/primitives/editor/pbn-importerPbnImporter, usePbnImporterContext, useDealOptionContext, PBN_FILE_EXTENSIONS
@workspace/ui-bridge/primitives/editor/play-editorPlayEditor, usePlayEditorContext
@workspace/ui-bridge/primitives/editor/player-selectorPlayerSelector, usePlayerSelectorContext, usePlayerOptionContext
@workspace/ui-bridge/primitives/editor/use-pedagogy-mode-groupsusePedagogyModeGroups
@workspace/ui-bridge/primitives/editor/use-pedagogy-mode-with-rulesusePedagogyModeWithRules
Table primitives
@workspace/ui-bridge/primitives/auction-sequenceAuctionSeq, seatEntries, useAuctionColumns, useAuctionEntries
@workspace/ui-bridge/primitives/compassuseContinuousAngle, useCompass
@workspace/ui-bridge/primitives/dummyDummy, useDummy
@workspace/ui-bridge/primitives/handHand, useHand, useCard
@workspace/ui-bridge/primitives/hands-editorHandsEditor, useHandsEditorContext, useHandEditorContext
@workspace/ui-bridge/primitives/seat-playerSeatPlayer, useSeatPlayer
@workspace/ui-bridge/primitives/table-handTableHand, useTableHand, useTableHandCard, useSuitLane
@workspace/ui-bridge/primitives/table-surfaceSlotProvider, Table, useTableSurface, useSlot, layoutFor, gridModeFor, …
@workspace/ui-bridge/primitives/trickTrick, playerToSlot, slotToPlayer, trickWidth, TRICK_COMPASS_MIN, TRICK_CENTER_FLOOR_REM, …
Auction
@workspace/ui-bridge/components/auction/auction-bid-padAuctionBidPad
@workspace/ui-bridge/components/auction/auction-comments-displayAuctionComments
@workspace/ui-bridge/components/auction/auction-grid-contentAuctionGridContent
@workspace/ui-bridge/components/auction/auction-grid-displayAuctionGridDisplay
@workspace/ui-bridge/components/auction/auction-grid-headerAuctionGridHeader
@workspace/ui-bridge/components/auction/auction-gridAuctionGrid
@workspace/ui-bridge/components/auction/auction-next-bidderAuctionNextBidder
@workspace/ui-bridge/components/auction/auction-preview-tableAuctionPreviewTable
Play
@workspace/ui-bridge/play/incomplete-hands-calloutIncompleteHandsCallout
@workspace/ui-bridge/play/lead-pillLeadPill
@workspace/ui-bridge/play/play-annotationsPlayAnnotations, DEFAULT_PLAY_ANNOTATIONS_LABELS
@workspace/ui-bridge/play/play-comments-displayPlayComments
@workspace/ui-bridge/play/play-errorsPlayErrors
@workspace/ui-bridge/play/play-helpPlayHelp, DEFAULT_PLAY_HELP_LABELS
@workspace/ui-bridge/play/play-inputPlayInput, DEFAULT_PLAY_INPUT_LABELS
@workspace/ui-bridge/play/play-sequence-previewPlaySequencePreview
@workspace/ui-bridge/play/tricks-displayTricksDisplay
@workspace/ui-bridge/play/hooks/use-has-played-suituseHasPlayedSuit
@workspace/ui-bridge/play/hooks/use-leaduseLead
@workspace/ui-bridge/play/hooks/useTricksWithWinnersuseTricksWithWinners
Play table
@workspace/ui-bridge/components/play/play-controlsPlayControls
@workspace/ui-bridge/components/play/play-current-player-handPlayCurrentPlayerHand
@workspace/ui-bridge/components/play/play-trick-table-displayPlayTrickTableDisplay
@workspace/ui-bridge/components/play/play-trick-tablePlayTrickTable
@workspace/ui-bridge/components/table/compassVulnerabilityHub, Compass, FittedCompass, CompassRoseIcon
@workspace/ui-bridge/components/table/dummy-handDummyHand, DUMMY_VIS_RANK, DUMMY_VIS_RANK_SUIT
@workspace/ui-bridge/components/table/feltFelt
@workspace/ui-bridge/components/table/handHeroHand, useSuitLaneLabel, getSuitGridTemplate
@workspace/ui-bridge/components/table/kbd-hintKbdHintItems, KbdHintSlot, useKbdHintContent, useKbdHintZone
@workspace/ui-bridge/components/table/playableDeploySheet, nonOptimalDim, hasOptimalCard, useCardInteractivityMode, usePlayable
@workspace/ui-bridge/components/table/table-surfaceTableSurface
@workspace/ui-bridge/components/table/trickTrickMat, trickCardEnterBudgetMs
Views
@workspace/ui-bridge/views/auction-tableAuctionTable
@workspace/ui-bridge/views/play-tablePlayTable, trickSpansRow
Deal
@workspace/ui-bridge/components/deal/contract-sequence-popoverContractSequencePopover
@workspace/ui-bridge/components/deal/deal-asideDealAside
@workspace/ui-bridge/components/deal/deal-boardDealBoard
@workspace/ui-bridge/components/deal/deal-commentDealCommentBubble, DealCommentOverlay, DealCommentStrip, dealCommentPositionFor, useDealCommentsActive, useDealCommentHistory, …
@workspace/ui-bridge/components/deal/deal-diagramDealDiagram
@workspace/ui-bridge/components/deal/deal-info-factsDealInfoRow, DEAL_INFO_FACT_RENDERERS
@workspace/ui-bridge/components/deal/deal-info-sheetDealInfoSheet
@workspace/ui-bridge/components/deal/deal-infoDealInfo
@workspace/ui-bridge/components/deal/deal-scorecardDealScorecard
@workspace/ui-bridge/components/deal/diagram-handDiagramHand
@workspace/ui-bridge/components/deal/hcp-badgeHcpBadge, HcpDetailBadge
@workspace/ui-bridge/components/deal/player-headerPlayerHeader
@workspace/ui-bridge/components/deal/swappablecreateSwappable
Deal cells and preview
@workspace/ui-bridge/deal/cells/player-position-cellPlayerPositionCell
@workspace/ui-bridge/deal/cells/player-side-cellPlayerSideCell
@workspace/ui-bridge/deal/cells/scoring-cellScoringCell
@workspace/ui-bridge/deal/cells/teaching-mode-cellTeachingModeCell
@workspace/ui-bridge/deal/cells/vulnerability-cellVulnerabilityCell
@workspace/ui-bridge/deal/board-previewBoardPreview
@workspace/ui-bridge/deal/board-preview-view-modelTypes: BoardPreviewViewModel
Review
@workspace/ui-bridge/components/review/actionsPhaseControls, ShareRow, NextButton, SHARE_CHANNELS
@workspace/ui-bridge/components/review/atomsBidText, ContractText, ScoreText, RoleTag, SegControl, REVIEW_SUIT_ORDER
@workspace/ui-bridge/components/review/comment-panelCommentPanel
@workspace/ui-bridge/components/review/continue-overlayContinueOverlay
@workspace/ui-bridge/components/review/crossCross
@workspace/ui-bridge/components/review/level-picker-overlayLevelPickerOverlay
@workspace/ui-bridge/components/review/mini-handMiniHand
@workspace/ui-bridge/components/review/replay-uiReplayBar, ReplayControlsCard, TrickLoupe
@workspace/ui-bridge/components/review/review-largeDealReviewLarge
@workspace/ui-bridge/components/review/review-narrowDealReviewNarrow
@workspace/ui-bridge/components/review/sequence-cardSequenceCard
@workspace/ui-bridge/components/review/verdictVerdictScore
@workspace/ui-bridge/components/review/deal-review-propsTypes: DealReviewProps
@workspace/ui-bridge/components/review/is-seat-vulnerableisSeatVulnerable
@workspace/ui-bridge/components/review/review-comments-view-modelTypes: ReviewCommentsViewModel
@workspace/ui-bridge/components/review/review-view-modelTypes: NextDealLevel, ReviewViewModel
@workspace/ui-bridge/components/review/use-trick-replaycomputeCardState, computeLeadState, useTrickReplay, BEFORE_FIRST_TRICK
Result
@workspace/ui-bridge/components/result/result-viewResultView
@workspace/ui-bridge/components/result/revealReveal
@workspace/ui-bridge/components/result/starsStarSlot, ResultStars, introStarsDoneMs, starLayoutId, MAX_STARS
Chrome
@workspace/ui-bridge/components/chrome/action-dialActionDial
@workspace/ui-bridge/components/chrome/radial-menuRadialMenu
@workspace/ui-bridge/components/panels/claim-optionsClaimOptionsList
Styled hand rows
@workspace/ui-bridge/components/board/BoardBoard
@workspace/ui-bridge/components/hands-editorStyledHandsEditor
@workspace/ui-bridge/components/hand/hand-suit-rowHandSuitRow
@workspace/ui-bridge/components/hand/handHand
@workspace/ui-bridge/components/hand/validated-hand-suit-rowValidatedHandSuitRow
Decorations
@workspace/ui-bridge/components/floating-suitsFloatingSuits, defaultFloatingPositions, rightOnlyFloatingPositions
Labels
@workspace/ui-bridge/labels/contract-or-trumpContractOrTrumpLabel
@workspace/ui-bridge/labels/result-expectedResultExpected
@workspace/ui-bridge/labels/teaching-mode-groupTeachingModeGroup
@workspace/ui-bridge/labels/teaching-modeTeachingMode
Misc
@workspace/ui-bridge/misc/deal-selectorDealSelector, DEFAULT_DEAL_SELECTOR_LABELS
@workspace/ui-bridge/misc/file-upload-buttonFileUploadButton, DEFAULT_SUPPORTED_FILE_TYPES, DEFAULT_FILE_UPLOAD_BUTTON_LABELS
@workspace/ui-bridge/misc/final-comment-displayFinalComment
@workspace/ui-bridge/misc/import-deal-selector-dialogImportDealSelectorDialog, DEFAULT_IMPORT_DEAL_SELECTOR_DIALOG_LABELS
@workspace/ui-bridge/misc/import-pbn-fileImportPBNFile, PBN_FILE_EXTENSIONS, DEFAULT_IMPORT_PBN_FILE_LABELS
@workspace/ui-bridge/misc/key-value-previewKeyValuePreview
@workspace/ui-bridge/misc/preview-cardPreviewCard
@workspace/ui-bridge/misc/teaching-mode-badgeTeachingModeBadge
Par
@workspace/ui-bridge/par/par-contractParContract
@workspace/ui-bridge/par/par-trick-countParTrickCount
PBN
@workspace/ui-bridge/pbn/file-explorer-dialogFileExplorerDialog, DEFAULT_FILE_EXPLORER_DIALOG_LABELS
@workspace/ui-bridge/pbn/file-explorer-row-partsDealBoardPreview, MetadataPreview, AuctionPreview, PlayPreview, TeachingPreview
@workspace/ui-bridge/pbn/file-explorer-rowFileExplorerRow, DEFAULT_FILE_EXPLORER_ROW_LABELS
@workspace/ui-bridge/pbn/use-deal-preview-datauseDealPreviewData
@workspace/ui-bridge/pbn/download-pbn-filedownloadPBNFile
Hooks
@workspace/ui-bridge/hooks/useAuctionInputuseAuctionInput
@workspace/ui-bridge/hooks/useDynamicFontSizeuseDynamicFontSize
@workspace/ui-bridge/hooks/useFieldVisibilityuseFieldVisibility
@workspace/ui-bridge/hooks/useTableSuitOrdersuseTableSuitOrders
@workspace/ui-bridge/hooks/useValidateDealuseValidateDeal
Timing
@workspace/ui-bridge/timing/motionMotionProvider, motionSeconds, restingCardLayout, useMotion, FULL_MOTION, REDUCED_MOTION, …
@workspace/ui-bridge/timing/use-beat-releaseuseBeatRelease
Interaction
@workspace/ui-bridge/interaction/typesTypes: TargetIntent, InteractionContext, NormalizedClickEvent, NormalizedKeyEvent
@workspace/ui-bridge/interaction/resolve-intentresolveIntent
@workspace/ui-bridge/interaction/registryInteractionRegistryProvider, useInteractionHandler, useInteractionContext, useInteractionRegistryDebug
Lib
@workspace/ui-bridge/lib/table-slotsgetSlot, getPlayerAtSlot
Styles
@workspace/ui-bridge/styles.cssCSS custom properties for suit colors and variants

Architecture

Most display components follow a pattern:

  1. BridgeProvider wraps the app to provide engine context (rules + notation)
  2. Components use useBridgeEngine() internally for variant-specific rendering (notation, display config)
  3. Copy comes from BridgeStringsProvider (@workspace/ui-bridge/strings), never from an i18n library
  4. Compound components (Hand, AuctionEditor, PlayEditor) provide their own context via a Root component
  5. Every atom that renders a bridge value (suit, rank, card, call, contract, seat, vulnerability, scoring, expected result, field options) carries translate="no" and the notranslate class on the element it renders: page translators leave it alone (i18n)

Package Structure

provider.tsx
styles.css