{
  "$schema": "https://ui.shadcn.com/schema/registry.json",
  "name": "mrdoge-ui",
  "homepage": "https://mrdoge.co",
  "items": [
    {
      "name": "match-card",
      "type": "registry:component",
      "title": "Match Card",
      "description": "Compact match row with teams, score or kickoff time, status, and an optional odds row.",
      "registryDependencies": [],
      "files": [
        {
          "path": "registry/mrdoge-ui/match-card/match-card.tsx",
          "type": "registry:component"
        },
        {
          "path": "registry/mrdoge-ui/odds-selector/odds-selector.tsx",
          "type": "registry:component"
        },
        {
          "path": "registry/mrdoge-ui/entity-image/entity-image.tsx",
          "type": "registry:component"
        }
      ]
    },
    {
      "name": "mrdoge-match-card-adapter",
      "type": "registry:lib",
      "title": "Match Card Adapter (Mr. Doge SDK)",
      "description": "Maps a real matches.get()/odds.list() response onto Match Card's props.",
      "registryDependencies": ["match-card"],
      "dependencies": ["@mrdoge/protocol"],
      "files": [
        {
          "path": "lib/mrdoge-adapters/match-card.ts",
          "type": "registry:lib",
          "target": "lib/mrdoge-adapters/match-card.ts"
        }
      ]
    },
    {
      "name": "match-card-compact",
      "type": "registry:component",
      "title": "Match Card Compact",
      "description": "Minimal match row: overlapping crests plus a label, no score/status/odds.",
      "registryDependencies": ["entity-image"],
      "files": [
        {
          "path": "registry/mrdoge-ui/match-card-compact/match-card-compact.tsx",
          "type": "registry:component"
        }
      ]
    },
    {
      "name": "match-highlight",
      "type": "registry:component",
      "title": "Match Highlight",
      "description": "Detailed match header for a match page: teams, score, live clock, cards, and corners.",
      "registryDependencies": ["popover", "match-card-compact"],
      "files": [
        {
          "path": "registry/mrdoge-ui/match-highlight/match-highlight.tsx",
          "type": "registry:component"
        },
        {
          "path": "registry/mrdoge-ui/entity-image/entity-image.tsx",
          "type": "registry:component"
        }
      ]
    },
    {
      "name": "mrdoge-match-highlight-adapter",
      "type": "registry:lib",
      "title": "Match Highlight Adapter (Mr. Doge SDK)",
      "description": "Maps a real matches.get()/matches.subscribe() response onto Match Highlight's props.",
      "registryDependencies": ["match-highlight"],
      "dependencies": ["@mrdoge/protocol"],
      "files": [
        {
          "path": "lib/mrdoge-adapters/match-highlight.ts",
          "type": "registry:lib",
          "target": "lib/mrdoge-adapters/match-highlight.ts"
        }
      ]
    },
    {
      "name": "odds-selector",
      "type": "registry:component",
      "title": "Odds Selector",
      "description": "Labeled odds card for a market: selectable options with price movement and suspended states.",
      "registryDependencies": ["button"],
      "files": [
        {
          "path": "registry/mrdoge-ui/odds-selector/odds-selector.tsx",
          "type": "registry:component"
        },
        {
          "path": "registry/mrdoge-ui/odds-selector/odds-selector-skeleton.tsx",
          "type": "registry:component"
        }
      ]
    },
    {
      "name": "mrdoge-odds-selector-adapter",
      "type": "registry:lib",
      "title": "Odds Selector Adapter (Mr. Doge SDK)",
      "description": "Pairs Over/Under markets into OddsLine[] and picks a representative line, for Odds Selector's lines prop.",
      "registryDependencies": ["odds-selector"],
      "dependencies": ["@mrdoge/protocol"],
      "files": [
        {
          "path": "lib/mrdoge-adapters/odds-lines.ts",
          "type": "registry:lib",
          "target": "lib/mrdoge-adapters/odds-lines.ts"
        }
      ]
    },
    {
      "name": "bet-slip",
      "type": "registry:component",
      "title": "Bet Slip",
      "description": "Panel for selected picks, with single/parlay mode, optional stake input, and computed potential payout.",
      "registryDependencies": ["button", "input", "match-card-compact"],
      "files": [
        {
          "path": "registry/mrdoge-ui/bet-slip/bet-slip.tsx",
          "type": "registry:component"
        }
      ]
    },
    {
      "name": "mrdoge-bet-slip-adapter",
      "type": "registry:lib",
      "title": "Bet Slip Adapter (Mr. Doge SDK)",
      "description": "Builds a BetSlipPick from a real match, one of its markets, and a selected line id.",
      "registryDependencies": ["bet-slip"],
      "dependencies": ["@mrdoge/protocol"],
      "files": [
        {
          "path": "lib/mrdoge-adapters/bet-slip.ts",
          "type": "registry:lib",
          "target": "lib/mrdoge-adapters/bet-slip.ts"
        }
      ]
    },
    {
      "name": "mrdoge-conflict-adapter",
      "type": "registry:lib",
      "title": "Conflict Adapter (Mr. Doge SDK)",
      "description": "Flags mutually incompatible picks (Match Result vs Double Chance, Over/Under threshold overlap, BTTS vs low Totals) for disabledIds or conflictingPickIds.",
      "registryDependencies": ["bet-slip"],
      "dependencies": ["@mrdoge/protocol"],
      "files": [
        {
          "path": "lib/mrdoge-adapters/conflicts.ts",
          "type": "registry:lib",
          "target": "lib/mrdoge-adapters/conflicts.ts"
        }
      ]
    },
    {
      "name": "match-timeline",
      "type": "registry:component",
      "title": "Match Timeline",
      "description": "Chronological feed of match events (goals, cards, substitutions).",
      "registryDependencies": [],
      "files": [
        {
          "path": "registry/mrdoge-ui/match-timeline/match-timeline.tsx",
          "type": "registry:component"
        }
      ]
    },
    {
      "name": "stats-list",
      "type": "registry:component",
      "title": "Stats List",
      "description": "Generic home/away match stats comparison, one row per stat, sport-agnostic.",
      "registryDependencies": [],
      "files": [
        {
          "path": "registry/mrdoge-ui/stats-list/stats-list.tsx",
          "type": "registry:component"
        }
      ]
    },
    {
      "name": "mrdoge-stats-list-adapter",
      "type": "registry:lib",
      "title": "Stats List Adapter (Mr. Doge SDK)",
      "description": "Maps a real match.stats (any of the 8 sports) onto Stats List's entries prop.",
      "registryDependencies": ["stats-list"],
      "dependencies": ["@mrdoge/protocol"],
      "files": [
        {
          "path": "lib/mrdoge-adapters/stats-list.ts",
          "type": "registry:lib",
          "target": "lib/mrdoge-adapters/stats-list.ts"
        }
      ]
    },
    {
      "name": "mrdoge-match-timeline-adapter",
      "type": "registry:lib",
      "title": "Match Timeline Adapter (Mr. Doge SDK)",
      "description": "Maps a real match's timeline events onto Match Timeline's entries prop.",
      "registryDependencies": ["match-timeline"],
      "dependencies": ["@mrdoge/protocol"],
      "files": [
        {
          "path": "lib/mrdoge-adapters/match-timeline.ts",
          "type": "registry:lib",
          "target": "lib/mrdoge-adapters/match-timeline.ts"
        }
      ]
    },
    {
      "name": "entity-image",
      "type": "registry:component",
      "title": "Entity Image",
      "description": "Team or region logo, unstyled; falls back to initials when the image is missing.",
      "registryDependencies": [],
      "files": [
        {
          "path": "registry/mrdoge-ui/entity-image/entity-image.tsx",
          "type": "registry:component"
        }
      ]
    },
    {
      "name": "mrdoge-client",
      "type": "registry:lib",
      "title": "Mr. Doge Client",
      "description": "Browser SDK client singleton, authenticated via short-lived tokens minted by your own backend, never a raw API key.",
      "dependencies": ["@mrdoge/react"],
      "files": [
        {
          "path": "registry/mrdoge-ui/mrdoge-client/mrdoge-client.ts",
          "type": "registry:lib"
        }
      ]
    },
    {
      "name": "rate-limit",
      "type": "registry:lib",
      "title": "Rate Limit",
      "description": "In-memory, per-instance rate limiter for gating routes that have no user session to check instead.",
      "files": [
        {
          "path": "lib/rate-limit.ts",
          "type": "registry:lib",
          "target": "lib/rate-limit.ts"
        }
      ]
    },
    {
      "name": "mrdoge-token-route",
      "type": "registry:item",
      "title": "Mr. Doge Token Route",
      "description": "Server route that mints short-lived SDK tokens for the browser client, using @mrdoge/node and your MRDOGE_ODDS_API_KEY.",
      "dependencies": ["@mrdoge/node", "server-only"],
      "registryDependencies": ["rate-limit"],
      "envVars": {
        "MRDOGE_ODDS_API_KEY": ""
      },
      "files": [
        {
          "path": "registry/mrdoge-ui/mrdoge-token-route/route.ts",
          "type": "registry:page",
          "target": "app/api/mrdoge/token/route.ts"
        }
      ]
    },
    {
      "name": "use-live-match",
      "type": "registry:hook",
      "title": "useLiveMatch",
      "description": "Subscribes to a single match over WebSocket: score, status, and clock update in real time as the match progresses.",
      "dependencies": ["@mrdoge/react", "@mrdoge/node", "server-only"],
      "envVars": {
        "MRDOGE_ODDS_API_KEY": ""
      },
      "files": [
        {
          "path": "registry/mrdoge-ui/use-live-match/use-live-match.ts",
          "type": "registry:hook"
        },
        {
          "path": "registry/mrdoge-ui/mrdoge-token-route/route.ts",
          "type": "registry:page",
          "target": "app/api/mrdoge/token/route.ts"
        }
      ]
    },
    {
      "name": "use-match",
      "type": "registry:hook",
      "title": "useMatch",
      "description": "One-shot fetch of a single match: no live updates, unlike useLiveMatch. Call again / remount to refresh.",
      "dependencies": ["@mrdoge/react", "@mrdoge/node", "server-only"],
      "envVars": {
        "MRDOGE_ODDS_API_KEY": ""
      },
      "files": [
        {
          "path": "registry/mrdoge-ui/use-match/use-match.ts",
          "type": "registry:hook"
        },
        {
          "path": "registry/mrdoge-ui/mrdoge-token-route/route.ts",
          "type": "registry:page",
          "target": "app/api/mrdoge/token/route.ts"
        }
      ]
    },
    {
      "name": "use-odds",
      "type": "registry:hook",
      "title": "useOdds",
      "description": "Subscribes to a single match's odds over WebSocket (Business tier): pre-live or in-play, every matching market updates in place as odds change.",
      "dependencies": ["@mrdoge/react", "@mrdoge/node", "server-only"],
      "envVars": {
        "MRDOGE_ODDS_API_KEY": ""
      },
      "files": [
        {
          "path": "registry/mrdoge-ui/use-odds/use-odds.ts",
          "type": "registry:hook"
        },
        {
          "path": "registry/mrdoge-ui/mrdoge-token-route/route.ts",
          "type": "registry:page",
          "target": "app/api/mrdoge/token/route.ts"
        }
      ]
    },
    {
      "name": "use-odds-movement",
      "type": "registry:hook",
      "title": "useOddsMovement",
      "description": "Diffs each bet item's price against its previous snapshot, so an Odds Selector can color a price green or red as live odds change.",
      "dependencies": ["@mrdoge/react"],
      "files": [
        {
          "path": "registry/mrdoge-ui/use-odds-movement/use-odds-movement.ts",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "use-trending-matches",
      "type": "registry:hook",
      "title": "useTrendingMatches",
      "description": "Today's most-viewed matches, ranked server-side by views. One-shot, not a subscription.",
      "dependencies": ["@mrdoge/react", "@mrdoge/node", "server-only"],
      "envVars": {
        "MRDOGE_ODDS_API_KEY": ""
      },
      "files": [
        {
          "path": "registry/mrdoge-ui/use-trending-matches/use-trending-matches.ts",
          "type": "registry:hook"
        },
        {
          "path": "registry/mrdoge-ui/mrdoge-token-route/route.ts",
          "type": "registry:page",
          "target": "app/api/mrdoge/token/route.ts"
        }
      ]
    },
    {
      "name": "use-matches",
      "type": "registry:hook",
      "title": "useMatches",
      "description": "A plain list of matches, not limited to today's most-viewed ones. One-shot, not a subscription.",
      "dependencies": ["@mrdoge/react", "@mrdoge/node", "server-only"],
      "envVars": {
        "MRDOGE_ODDS_API_KEY": ""
      },
      "files": [
        {
          "path": "registry/mrdoge-ui/use-matches/use-matches.ts",
          "type": "registry:hook"
        },
        {
          "path": "registry/mrdoge-ui/mrdoge-token-route/route.ts",
          "type": "registry:page",
          "target": "app/api/mrdoge/token/route.ts"
        }
      ]
    },
    {
      "name": "use-regions",
      "type": "registry:hook",
      "title": "useRegions",
      "description": "Every region, with event/competition counts when filtered. One-shot, not a subscription.",
      "dependencies": ["@mrdoge/react", "@mrdoge/node", "server-only"],
      "envVars": {
        "MRDOGE_ODDS_API_KEY": ""
      },
      "files": [
        {
          "path": "registry/mrdoge-ui/use-regions/use-regions.ts",
          "type": "registry:hook"
        },
        {
          "path": "registry/mrdoge-ui/mrdoge-token-route/route.ts",
          "type": "registry:page",
          "target": "app/api/mrdoge/token/route.ts"
        }
      ]
    },
    {
      "name": "use-live-matches",
      "type": "registry:hook",
      "title": "useLiveMatches",
      "description": "Subscribes to matches over WebSocket, filtered by sports/regions/competitions; updates in place as matches start, finish, or change.",
      "dependencies": ["@mrdoge/react", "@mrdoge/node", "server-only"],
      "envVars": {
        "MRDOGE_ODDS_API_KEY": ""
      },
      "files": [
        {
          "path": "registry/mrdoge-ui/use-live-matches/use-live-matches.ts",
          "type": "registry:hook"
        },
        {
          "path": "registry/mrdoge-ui/mrdoge-token-route/route.ts",
          "type": "registry:page",
          "target": "app/api/mrdoge/token/route.ts"
        }
      ]
    }
  ]
}
