Client integration

Universal API — Casino Integration Guide

Integration guide — server-side API for live data, TV overlays, and iframe video embeds on your partner platform.

Base URL: https://universeapi.store

Getting started

Before calling the API, Universal API will provision your partner account with:

  • API key — send on every server-side request (keep it secret; never expose in browser or mobile bundles).
  • Allowed domains — partner website domains that may embed the TV iframe (e.g. partner.com, app.partner.com).
  • Subscription period — your key is valid between the start and end dates on your account.

API base URL: https://universeapi.store/api

All endpoints live under /api. JSON responses use application/json unless noted otherwise. Contact your account manager for key rotation, new domains, or subscription changes.

15 live gamesReal-time snapshotsServer-to-server JSONTV iframe embed

Authentication

Include your API key on every server-side request using one of the following headers:

HeadersCopy
X-API-Key: your-api-key
# or
Authorization: Bearer your-api-key

Access control

Different routes use different checks:

RouteWho calls itAuth
/api/* (games, state, results, embed mint)Your backendAPI key + active subscription + Allowed IPs (if configured)
/ws?eventId=&apiKey=Your backendAPI key query + subscription + Allowed IPs (same as REST)
/api/tv/playerEnd-user browser (iframe)Embed token + tv=true + parent page domain in your allowed domains

Server API requests are rejected if any of the following apply:

  • API key is missing or invalid
  • Your account is inactive or outside the subscription window
  • Caller IP is not on your Admin Allowed IPs list (when that list is non-empty). Leave Allowed IPs empty to allow any source IP.

Proxy API and WebSocket calls through your backend and keep the key secret. Casino live push uses wss://universeapi.store/ws?eventId=…&apiKey=… (same IP rules as REST).

TV embed requests

To mint iframe embed tokens (POST /tv/games/:eventId/embed), also send:

TV headerCopy
X-TV-Client: true

The browser iframe player validates the embedding site via Referer / Origin against your account's allowed domains. Register every production domain where users will load the iframe (including www variants if used).

Endpoints

All paths below are relative to https://universeapi.store/api.

MethodPathPurpose
GET/healthGateway health check
GET/gamesGame catalog
GET/games/:eventId/stateLive snapshot (poll from backend)
WS/ws?eventId=&apiKey=Live state push (prefer over polling)
GET / POST/games/:eventId/results, /resultsHistorical round results
GET/tv/games/:eventId/stateAlias of /games/:eventId/state
POST/tv/games/:eventId/embedMint short-lived iframe token (backend only)
GET/tv/playerBrowser iframe player (embed token + domain)

Game catalog

GET/gamesAPI key

Returns every game available on your subscription.

ExampleCopy
GET https://universeapi.store/api/games
X-API-Key: your-api-key
Response 200Copy
{
  "games": [
    { "eventId": "99.0010", "eventName": "20-20 TEENPATTI" },
    { "eventId": "99.0018", "eventName": "DRAGON TIGER" }
  ]
}

Live game state

GET/games/:eventId/stateAPI key

Returns the current live snapshot for one game — round timer, markets, cards, and result data when available.

ExampleCopy
GET https://universeapi.store/api/games/99.0010/state
X-API-Key: your-api-key
Response 200Copy
{
  "client": "Your Company Name",
  "clientIp": "203.0.113.10",
  "eventId": "99.0010",
  "stale": false,
  "freshnessMs": 280,
  "data": {
    "roundId": "123456789",
    "status": "OPEN",
    "roundStatus": "OPEN",
    "leftSec": 12,
    "marketArr": [ … ],
    "cardsArr": { … },
    "resultsArr": [ … ],
    "updatedAt": "2026-05-24T11:00:00.000Z"
  }
}

Prefer WebSocket push for live screens: wss://universeapi.store/ws?eventId=99.0010&apiKey=YOUR_KEY (frames use type: "subscribed" then type: "state"). Poll this HTTP endpoint as a reconnect fallback (e.g. every 1–2 seconds). A 503 response means live data is temporarily unavailable or stale — retry after a short delay.

GET /tv/games/:eventId/state is an alias — same request and response.

Live demo

Real responses from the live casino feed, fetched through this site’s backend proxy (/api/public/uapi/*). The lobby and game pages on this site render exactly this data.

Casino API — live responses

idle · 0 ms

GET /api/public/uapi/games

Historical results

Fetch recent completed rounds for a game — winners, cards, and market outcomes. Use this to populate the "Recent results" panel in your live UI.

GET/games/:eventId/resultsAPI key

Returns recent completed rounds for the game in the path.

ExampleCopy
GET https://universeapi.store/api/games/99.0010/results
X-API-Key: your-api-key

Same response from POST /results with body { "eventId": "99.0010" } or GET /results?eventId=99.0010.

Response 200Copy
{
  "data": [
    {
      "roundId": "987654321",
      "winner": "A",
      "cards": { "A": ["H7", "D9"], "B": ["C3", "S5"] },
      "results": [
        {
          "marketName": "Main",
          "runners": [
            { "selectionId": "1", "result": "WIN" },
            { "selectionId": "2", "result": "LOSE" }
          ]
        }
      ]
    }
  ],
  "meta": { "status": true, "message": "Success" }
}

Poll when the user opens a game or after each round ends — every 10–30 seconds is usually enough. Returns 503 if historical results are temporarily unavailable.

TV & video

Embed the live video stream in an iframe on your site. Your backend mints a short-lived token; the browser loads the player URL — no API key in the iframe.

NeedEndpointUsed in
First-party streaming configPOST /public/tv/streamingPublic casino UI — returns iframeUrl (direct WebRTC player)
Video iframe URLPOST /api/tv/games/:eventId/embedYour backend (returns embed path)
Video player pageGET /api/tv/player?embedToken=&tv=trueBrowser iframe src (redirects to upstream WebRTC player)

For timer, odds, and cards overlays, use Live game state — not the TV endpoints below.

POST/public/tv/streamingSession + first-party Origin

Returns upstream WebRTC player config for the public casino UI at https://universeapi.store. Use iframeUrl as the iframe src — do not wrap it in another player page (nested iframes block WebRTC video).

ExampleCopy
POST https://universeapi.store/public/tv/streaming
Origin: https://universeapi.store
X-Session-Token: <from POST /public/session>
X-TV-Client: true
Content-Type: application/json

{ "eventId": "99.0010" }
Response 200Copy
{
  "data": {
    "eventId": "99.0010",
    "appName": "live",
    "url": "livecdnplatin.com",
    "streamingName": "GAME10",
    "token": "…"
  },
  "iframeUrl": "https://player.universestudio.games/index.html?appName=live&streamingName=GAME10&url=livecdnplatin.com&token=…",
  "playerUrl": "/public/tv/player?eventId=99.0010"
}

Prefer iframeUrl for embedding. playerUrl is a legacy gateway redirect to the same upstream player.

Iframe video embed

Browsers cannot send X-API-Key on an iframe src. Use a two-step flow: your backend mints a short-lived embed token, then your frontend loads the player iframe with that token.

How iframe integration works

Browser on partner.com (live page)
    ↓  POST /your-backend/casino/tv/:eventId/embed
Your backend
    ↓  POST https://universeapi.store/api/tv/games/:eventId/embed  +  X-API-Key  +  X-TV-Client: true
Universal API
    ↓  { iframePath, expiresIn }
Your backend
    ↓  { iframeUrl: "https://universeapi.store/api/tv/player?..." }
Browser on partner.com
    ↓  <iframe src="iframeUrl">  (embedToken + Referer: partner.com)
Universal API player page → upstream video stream
1

Backend requests embed token

POST /api/tv/games/:eventId/embed with API key + X-TV-Client: true
2

Return iframe URL to frontend

Response includes iframePath — prefix with https://universeapi.store for the full URL.
3

Browser loads iframe

Set iframe src to the URL. Token expires after expiresIn seconds — refresh before expiry.
POST/tv/games/:eventId/embedAPI key + X-TV-Client

Creates a short-lived embed token for one game. Call from your server only — never expose the API key in browser code.

RequestCopy
POST https://universeapi.store/api/tv/games/99.0010/embed
Content-Type: application/json
X-API-Key: your-api-key
X-TV-Client: true
Response 200Copy
{
  "eventId": "99.0010",
  "embedToken": "YkpY2RozaknDuLWGPR8cSbx0_SSnMnsMtK55fCo2ojw",
  "expiresIn": 3600,
  "iframePath": "/api/tv/player?eventId=99.0010&embedToken=YkpY2Roz...&tv=true"
}
GET/tv/player?eventId=&embedToken=&tv=trueEmbed token + tv=true + domain allowlist

Provider-hosted HTML player page. Use as iframe src on your whitelisted partner domain. The browser must send a Referer or Origin header matching one of your allowed domains (subdomains of a registered domain are accepted).

Do not set referrerpolicy="no-referrer" on the iframe — that blocks domain validation.

Query paramRequiredDescription
eventIdYesGame id (must match the token)
embedTokenYesToken from POST /api/tv/games/:eventId/embed
tvYesMust be true

Token refresh

Embed tokens expire after expiresIn seconds (default 3600). Refresh from your backend a few minutes before expiry — do not put the API key in browser code to call our embed endpoint directly.

Refresh before expiryCopy
let refreshTimer;

async function loadVideo(eventId) {
  const res = await fetch(
    `/your-backend/casino/tv/${encodeURIComponent(eventId)}/embed`,
    { method: "POST" }
  );
  const body = await res.json();
  if (!res.ok || !body.iframeUrl) throw new Error(body.error ?? "Video unavailable");

  document.getElementById("video-frame").src = body.iframeUrl;

  clearTimeout(refreshTimer);
  const refreshMs = Math.max((body.expiresIn - 300) * 1000, 60_000);
  refreshTimer = setTimeout(() => loadVideo(eventId), refreshMs);
}

HTML — live page with video iframe

HTMLCopy
<div class="uc-live-video">
  <iframe
    id="video-frame"
    title="Live casino stream"
    allow="autoplay; fullscreen"
    referrerpolicy="strict-origin-when-cross-origin"
    style="width:100%;aspect-ratio:16/9;border:0;border-radius:10px;background:#000"
  ></iframe>
  <p id="video-error" class="uc-error" hidden></p>
</div>

<script>
  async function loadVideo(eventId) {
    const res = await fetch(
      `/your-backend/casino/tv/${encodeURIComponent(eventId)}/embed`,
      { method: "POST" }
    );
    const body = await res.json();
    if (!res.ok || !body.iframeUrl) {
      document.getElementById("video-error").hidden = false;
      document.getElementById("video-error").textContent =
        body.error ?? "Video unavailable";
      return;
    }
    document.getElementById("video-frame").src = body.iframeUrl;
  }

  loadVideo(new URLSearchParams(location.search).get("eventId"));
</script>

Backend proxy — mint embed URL

your-backend/routes/casino.jsCopy
router.post("/tv/:eventId/embed", async (req, res) => {
  const { eventId } = req.params;
  const r = await fetch(`https://universeapi.store/api/tv/games/${eventId}/embed`, {
    method: "POST",
    headers: {
      "X-API-Key": process.env.UC_API_KEY,
      "X-TV-Client": "true",
    },
  });
  const body = await r.json();
  if (!r.ok) {
    res.status(r.status).json(body);
    return;
  }
  // Prefix iframePath with provider base URL
  const providerBaseUrl = process.env.UC_PROVIDER_BASE_URL ?? "https://universeapi.store";
  res.json({
    iframeUrl: `${providerBaseUrl}${body.iframePath}`,
    expiresIn: body.expiresIn,
  });
});

Iframe troubleshooting

SymptomLikely causeFix
Universe Casino logo stuck (no live video)Double-nested iframe blocked WebRTC encrypted-mediaUse iframeUrl from POST /public/tv/streaming directly, or GET /api/tv/player (redirects upstream). Add allow="autoplay; fullscreen; encrypted-media" on the iframe.
Blank iframe / error pageExpired or invalid embedTokenCall your backend embed proxy again and set a new iframe src
"Domain not whitelisted" in iframeParent page domain not in your allowed domains, or Referer blockedAsk your account manager to add the embedding domain (e.g. partner.com). Remove no-referrer from the iframe.
403 on embed POSTSubscription expired or account disabledContact support to renew or reactivate your account
503 on embed POSTNo stream configured for that gameVerify game is live; retry when streaming is available
401 on embed POSTMissing X-TV-Client: trueAdd header on server-side embed request

Important: the TV player URL serves video only. Overlays come from Live game state.

Response fields

FieldDescription
eventIdGame identifier (e.g. 99.0010)
staletrue when the snapshot is outdated — treat as degraded data
freshnessMsMilliseconds since the snapshot was last updated
data.roundIdCurrent round identifier
data.status / data.roundStatusRound phase (e.g. OPEN, CLOSED)
data.leftSecSeconds remaining in the current betting window
data.marketArrMarkets and runner prices for the round
data.cardsArrDealt cards keyed by market/runner
data.resultsArrRecent result entries when present in live snapshot
data[].roundIdRound id from GET /api/games/:eventId/results
data[].winnerWinning runner code for the round
data[].cardsCard codes dealt in that round
data[].resultsPer-market runner outcomes (WIN / LOSE)

Betting & wallet (seat API)

These endpoints let your platform place real bets on Universal API rounds. Player money always stays in your wallet: we call your callback URL to debit stake and credit winnings. All three endpoints use the same x-api-key header and respect your IP / domain whitelist.

Place a bet

POST/api/public/v1/betAPI key
RequestCopy
POST /api/public/v1/bet
x-api-key: <your key>
content-type: application/json

{
  "userId": "player-1042",
  "gameId": "99.0010",
  "roundId": "1725312001",
  "market": "Lucky 7",
  "selection": "LOW",
  "odds": 1.98,
  "stake": 500,
  "reference": "your-unique-txn-id"
}
ResponseCopy
{ "status": "ok", "betId": "…", "reference": "your-unique-txn-id", "balance": 9500, "currency": "INR" }

Idempotent: resending the same reference returns the original bet with duplicate: true — never double-debits.

Player balance

POST/api/public/v1/balanceAPI key
RequestCopy
{ "userId": "player-1042" }
ResponseCopy
{ "status": "ok", "currency": "INR", "balance": 9500 }

Bet history

GET/api/public/v1/bets?userId=&gameId=&limit=50API key
ResponseCopy
{ "status": "ok", "count": 2, "bets": [
  { "operator_user_id": "player-1042", "game_id": "99.0010", "round_id": "1725312001",
    "selection": "LOW", "odds": 1.98, "stake": 500, "payout": 990,
    "status": "won", "reference": "your-unique-txn-id", "settled_at": "…" }
] }

Method flexible: /me, /games and /bets answer to both GET and POST. Write endpoints (/bet, /balance, /cashout, /settle) are POST only and reply with a JSON method_not_allowed error (405) on GET — you will never get an HTML page back, so response.json() is always safe.

Your wallet callback

Set your callback base URL in the operator panel. We POST to <callback>/balance, <callback>/debit, <callback>/credit and <callback>/rollback.

Body we sendCopy
{
  "action": "debit",
  "operatorId": "…",
  "currency": "INR",
  "userId": "player-1042",
  "amount": 500,
  "reference": "your-unique-txn-id",
  "gameId": "99.0010",
  "roundId": "1725312001",
  "betId": "…",
  "timestamp": "2026-09-02T23:10:00.000Z"
}

Headers: x-universal-operator (your operator id) and x-universal-signature = HMAC-SHA256 of the raw body using your callback secret (hex). Verify it before touching balances.

Verify (Node.js)Copy
const expected = crypto.createHmac("sha256", CALLBACK_SECRET)
  .update(rawBody).digest("hex");
if (expected !== req.headers["x-universal-signature"]) return res.status(401).end();
Your replyCopy
{ "status": "ok", "balance": 9500, "reference": "your-unique-txn-id" }

Reply non-2xx or { "status": "failed" } to reject a debit (e.g. insufficient funds) — the bet is then rejected and logged in your panel. Settlement credits are sent automatically when the round result arrives; failed inserts trigger a rollback.

Balance maintain

Player funds always live in your wallet. We never hold or display a balance of our own — every stake, payout and refund is a call to your callback URL, so your ledger stays the single source of truth.

Money flow of one round

1

Bet placed

We POST <callback>/debit with the stake and a unique reference. Deduct it and reply with the new balance.
2

Round result

On a win we POST <callback>/credit with the payout and the same reference plus settlementRef. On a loss no call is made — the stake already left the wallet.
3

Anything fails

If the bet cannot be stored or the round is voided we POST <callback>/rollback with the original reference. Return the stake exactly once.
4

Sync check

Our seat API reports the balance you last returned. Poll POST /api/public/v1/balance or read your own ledger to confirm both sides agree.

Rules to keep balances correct

Idempotency (Node.js)Copy
// store every reference you have already processed
const seen = await db.tx.findOne({ reference: body.reference, action: body.action });
if (seen) return res.json({ status: "ok", balance: seen.balanceAfter, reference: body.reference });

const balance = await wallet.apply(body.userId, body.action === "debit" ? -body.amount : body.amount);
await db.tx.insert({ reference: body.reference, action: body.action, balanceAfter: balance });
res.json({ status: "ok", balance, reference: body.reference });

Never apply the same reference + action twice. Retries are normal (network timeouts) and must return the stored result, not a second debit or credit.

  • Verify x-universal-signature before changing any balance.
  • Reply within 5 seconds; a timeout is treated as callback_failed and the bet is rejected.
  • Always return the post-transaction balance in the same currency you registered.
  • Reject with { "status": "failed", "error": "insufficient_funds" } instead of returning a negative balance.
  • Reconcile daily with GET /api/public/v1/bets — stake and payout per reference should match your ledger row for row.
Daily reconciliationCopy
GET /api/public/v1/bets?limit=500
// for each bet: ledger.debit(reference) === bet.stake
//               bet.status === "won" ? ledger.credit(reference) === bet.payout : no credit row

Errors

Data endpoints reply with { "error": "message" }. Betting / wallet endpoints reply with { "status": "error", "code": "…", "message": "…" }.

StatusCodeMeaning
401missing_keyNo x-api-key / Authorization header sent
401invalid_keyKey unknown or deactivated
403operator_disabledAccount disabled — contact support
403ip_not_allowedCalling IP is not whitelisted for this key
403domain_not_allowedOrigin domain not whitelisted for this key
402plan_expiredMonthly subscription has ended — renew to resume
400bad_requestInvalid or missing body fields
409round_closedBetting is closed for that round
424no_callback_urlSet your wallet callback URL in the operator panel
502callback_failedYour wallet endpoint was unreachable or errored
402wallet_rejectedYour wallet declined the debit (e.g. low balance)
404Unknown eventId — check the supported games list
503Live data missing or stale — retry with backoff

Integration guide

Recommended setup for a production integration.

1

Store credentials securely

Keep your API key in server-side environment variables. Never expose it in browser code or mobile app bundles.
2

Register embedding domains

Provide every production domain where end users will load the TV iframe (e.g. partner.com, www.partner.com). Subdomains of a registered domain are accepted automatically.
3

Fetch the game list

Call GET /api/games once at startup (or cache with a long TTL) to build your game menu.
4

Poll live state per game

When a user opens a game, poll GET /api/games/:eventId/state every 1–2 seconds from your backend and forward normalized data to your frontend.
5

Handle degraded responses

On 503 or stale: true, show a "live data temporarily unavailable" state and retry with exponential backoff.
6

Load recent results

Call GET /api/games/:eventId/results when the live page opens and refresh every 10–30 seconds for the results sidebar.
7

Embed live video (optional)

On the live page, call your backend embed proxy, set iframe src to the returned URL, and refresh the token before expiresIn. See Iframe embed.

Best practice: proxy all API calls through your own backend so the API key never reaches the browser. Only the short-lived embed token is passed to the iframe URL.

Game UI reference (HTML & CSS)

Copy the markup and styles below into your partner site. Bind odds from data.marketArr on live state and populate result modals from GET /api/games/:eventId/results. Download image assets from this site and host them on your server under the same /assets/ paths.

Assets: All files are served from this domain only (e.g. /assets/cards/H7_.png). Use Download to save files — no third-party links. After download, upload to your CDN keeping the path structure.

99.0010

20-20 TEENPATTI

99.0013

1DAY TEEN PATTI

99.0016

JOKER TEEN PATTI

99.0014

MUFLIS TEEN PATTI

99.0018

DRAGON TIGER

99.0019

20-20 DRAGON TIGER

99.0021

1 DAY DRAGON TIGER

99.0030

LUCKY 7

99.0005

AMAR AKBAR ANTHONY

99.0046

CARD RACE

99.0001

BACCARAT

99.0025

ANDAR BAHAR

99.0022

32 CARDS

99.0007

POKER

99.0041

DTL

20-20 TEENPATTI 99.0010

Runner tiles per market + dual-column result modal (Player A vs Player B).

Bind prices from data.marketArr. Map card codes from cardsArr to cardImageUrl(code).

Assets (download from this site)

AssetPath on your serverDownload
Playing card/assets/cards/{code}_.png
Hidden / back card/assets/cards/null.pngDownload
Result modal trophy styles/assets/docs/trophy-icons.cssDownload

HTML — asset links & img tags

HTMLCopy
<link rel="stylesheet" href="/assets/docs/trophy-icons.css" />

<!-- Bind src from API card codes; paths are on your server after you download assets -->
<img src="/assets/cards/H7_.png" alt="Player A card" width="62" />
<img src="/assets/cards/S5_.png" alt="Player B card" width="62" />

JavaScript — build image URLs from API codes

JSCopy
const ASSET_BASE = "https://your-domain.com";

function cardImageUrl(code) {
  if (!code || code === "0") return `${ASSET_BASE}/assets/cards/null.png`;
  return `${ASSET_BASE}/assets/cards/${code}_.png`;
}

// After download: host files under /assets/ on your server

Live odds / markets UI

HTMLCopy
<div class="uc-markets-scroll">
  <section class="uc-market">
    <header class="uc-market-header">
      <strong class="uc-market-title">PAIR PLUS A</strong>
      <span class="uc-market-minmax">Min/Max: 100 - 25000</span>
    </header>
    <div class="uc-market-body">
      <div class="uc-runners-row uc-runners-row-two">
        <div class="uc-runner">
          <span class="uc-runner-name">Pair A</span>
          <div class="uc-odds-box">
            <div class="uc-odds-price">2.5</div>
            <div class="uc-odds-size">100</div>
          </div>
        </div>
        <div class="uc-runner">
          <span class="uc-runner-name">Pair B</span>
          <div class="uc-odds-box">
            <div class="uc-odds-price">2.5</div>
            <div class="uc-odds-size">100</div>
          </div>
        </div>
      </div>
    </div>
  </section>
  <section class="uc-market">
    <header class="uc-market-header">
      <strong class="uc-market-title">WINNER</strong>
      <span class="uc-market-minmax">Min/Max: 100 - 100000</span>
    </header>
    <div class="uc-market-body">
      <div class="uc-runners-row uc-runners-row-two">
        <div class="uc-runner">
          <span class="uc-runner-name">Player A</span>
          <div class="uc-odds-box">
            <div class="uc-odds-price">1.98</div>
            <div class="uc-odds-size">500</div>
          </div>
        </div>
        <div class="uc-runner">
          <span class="uc-runner-name">Player B</span>
          <div class="uc-odds-box">
            <div class="uc-odds-price">1.98</div>
            <div class="uc-odds-size">500</div>
          </div>
        </div>
      </div>
    </div>
  </section>
</div>

CSS — odds panel

CSSCopy
:root,
[data-theme="light"] {
  --casino-page-bg: var(--ifm-background-color);
  --casino-shell-bg: #000;
  --casino-markets-bg: #ededed;
  --casino-market-header-bg: #000;
  --casino-market-header-text: #fff;
  --casino-market-body-bg: #fff;
  --casino-text: #243a48;
  --casino-text-muted: var(--ifm-color-emphasis-600);
  --casino-runners-bg: linear-gradient(
    90deg,
    rgb(153 199 241) 0%,
    rgb(138 189 216 / 50%) 49%,
    rgb(146 198 246) 100%
  );
  --casino-odds-bg: rgba(114, 187, 239, 0.5);
  --casino-odds-text: #111;
  --casino-odds-shadow: 0 2px 7px 1px #67828be6;
  --casino-back-bg: #72bbef;
  --casino-lay-bg: #faa9ba;
  --casino-sportbook-bg: #fff;
  --casino-sportbook-border: #ccc;
  --casino-results-bg: #000;
  --casino-results-text: #fff;
  --casino-results-muted: #ccc;
  --casino-modal-bg: #fff;
  --casino-modal-header-bg: #000;
  --casino-modal-header-text: #fff;
  --casino-modal-text: #243a48;
  --casino-modal-shadow: 0 8px 32px rgba(0, 0, 0, 0.25);
  --casino-modal-backdrop: rgba(0, 0, 0, 0.5);
  --casino-card-border: #000;
  --casino-link: #243a48;
}

[data-theme="dark"] {
  --casino-page-bg: var(--ifm-background-color);
  --casino-shell-bg: #0d1117;
  --casino-markets-bg: var(--ifm-background-color);
  --casino-market-header-bg: #161b22;
  --casino-market-header-text: var(--ifm-font-color-base);
  --casino-market-body-bg: var(--ifm-background-surface-color);
  --casino-text: var(--ifm-font-color-base);
  --casino-text-muted: var(--ifm-color-emphasis-500);
  --casino-runners-bg: linear-gradient(
    90deg,
    rgb(36 58 72) 0%,
    rgb(28 45 56 / 70%) 49%,
    rgb(36 58 72) 100%
  );
  --casino-odds-bg: rgba(114, 187, 239, 0.22);
  --casino-odds-text: var(--ifm-font-color-base);
  --casino-odds-shadow: 0 2px 8px rgba(0, 0, 0, 0.45);
  --casino-back-bg: #72bbef;
  --casino-lay-bg: #faa9ba;
  --casino-sportbook-bg: var(--ifm-background-surface-color);
  --casino-sportbook-border: var(--ifm-color-emphasis-300);
  --casino-results-bg: #161b22;
  --casino-results-text: var(--ifm-font-color-base);
  --casino-results-muted: var(--ifm-color-emphasis-500);
  --casino-modal-bg: var(--ifm-background-surface-color);
  --casino-modal-header-bg: #161b22;
  --casino-modal-header-text: var(--ifm-font-color-base);
  --casino-modal-text: var(--ifm-font-color-base);
  --casino-modal-shadow: 0 8px 32px rgba(0, 0, 0, 0.55);
  --casino-modal-backdrop: rgba(0, 0, 0, 0.72);
  --casino-card-border: var(--ifm-color-emphasis-400);
  --casino-link: var(--ifm-color-primary-light);
}

/**
 * Flattened markets panel styles (from CasinoLiveGame styles.module.css).
 * Use with the HTML templates in docs — pair with casino-variables.css.
 */
.uc-markets-scroll {
  background: var(--casino-markets-bg);
}

.uc-market {
  margin-bottom: 3px;
}

.uc-market-header {
  padding: 4px 8px;
  font-size: 12px;
  font-weight: 700;
  background: var(--casino-market-header-bg);
  color: var(--casino-market-header-text);
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 8px;
}

.uc-market-title {
  flex: 1;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.uc-market-minmax {
  font-size: 11px;
  font-weight: 400;
  opacity: 0.85;
  flex-shrink: 0;
  white-space: nowrap;
}

.uc-market-body {
  position: relative;
  background: var(--casino-market-body-bg);
  border-bottom-left-radius: 6px;
}

.uc-suspended-overlay {
  position: absolute;
  inset: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 22px;
  font-weight: 700;
  text-transform: uppercase;
  color: #fff;
  background: rgba(0, 0, 0, 0.65);
  border: 2px solid #666;
  z-index: 1;
}

.uc-runners-row {
  display: flex;
  background: var(--casino-runners-bg);
  padding: 6px 4px 10px;
  gap: 4px;
}

.uc-runners-row-two .uc-runner {
  flex: 1 1 50%;
  max-width: 50%;
}

.uc-runners-row-three .uc-runner {
  flex: 1 1 33.333%;
  max-width: 33.333%;
}

.uc-runners-row-stacked {
  flex-direction: column;
  gap: 6px;
  padding: 6px 8px 10px;
}

.uc-runners-row-stacked .uc-runner {
  flex: 0 0 auto;
  width: 100%;
  max-width: 100%;
  flex-direction: row;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
}

.uc-runner {
  display: flex;
  flex-direction: column;
  align-items: center;
  min-width: 0;
  padding: 0 2px;
}

.uc-runner-name {
  font-size: 11px;
  font-weight: 700;
  color: var(--casino-text);
  margin-bottom: 4px;
  text-align: center;
  line-height: 1.15;
  min-height: 26px;
  display: flex;
  align-items: flex-end;
  justify-content: center;
}

.uc-odds-box {
  width: 100%;
  max-width: 150px;
  min-width: 72px;
  border-radius: 5px;
  padding: 4px 2px;
  background: var(--casino-odds-bg);
  box-shadow: var(--casino-odds-shadow);
  color: var(--casino-odds-text);
  text-align: center;
  font-weight: 600;
}

.uc-odds-price {
  font-size: 13px;
  line-height: 1.2;
}

.uc-odds-size {
  font-size: 11px;
  font-weight: 400;
  opacity: 0.85;
  line-height: 1.2;
}

/* Back / lay table (1 Day Teen Patti, 1 Day Dragon Tiger) */
.uc-sportbook-table {
  width: 100%;
  border-collapse: collapse;
  background: var(--casino-sportbook-bg);
  table-layout: fixed;
}

.uc-sportbook-table th,
.uc-sportbook-table td {
  border-top: 1px solid var(--casino-sportbook-border);
  vertical-align: middle;
}

.uc-back-cell {
  background: var(--casino-back-bg);
  text-align: center;
}

.uc-lay-cell {
  background: var(--casino-lay-bg);
  text-align: center;
}

Result modal UI

HTML — result modal bodyCopy
<div style="margin-bottom: 80px;">
  <div class="modal-title p-2">
    <h6 class="text-right round-id"><b>Round Id:</b> 952705064335</h6>
  </div>
  <div class="col-12 col-md-6 col-xs-12 paati_boxs">
    <h6>Player A</h6>
    <div class="card-Img-box">
      <img src="/assets/cards/H7_.png" alt="Player A card 1" />
      <img src="/assets/cards/D9_.png" alt="Player A card 2" />
      <img src="/assets/cards/C3_.png" alt="Player A card 3" />
    </div>
    <div class="btn winner-team WinnerA">Winner</div>
  </div>
  <div class="col-12 col-md-6 col-xs-12 paati_boxs">
    <h6>Player B</h6>
    <div class="card-Img-box">
      <img src="/assets/cards/S5_.png" alt="Player B card 1" />
      <img src="/assets/cards/H2_.png" alt="Player B card 2" />
      <img src="/assets/cards/D8_.png" alt="Player B card 3" />
    </div>
  </div>
  <div class="clearfix"></div>
  <div class="col-md-12 col-xs-12 all-market-winner">
    <h6 class="text-center fw-bold">WINNER</h6>
    <div class="dual-column-market-row">
      <div class="card-Img-box sectionA p-1">
        <i class="fa fa-trophy winner-icon" aria-hidden="true"></i>
        <span class="teen-market-runner-name">PLAYER A</span>
      </div>
      <div class="card-Img-box sectionB p-1">
        <i class="fa fa-trophy loser-icon" aria-hidden="true"></i>
        <span class="teen-market-runner-name">PLAYER B</span>
      </div>
    </div>
  </div>
</div>

CSS — result modal

CSSCopy
:root,
[data-theme="light"] {
  --casino-page-bg: var(--ifm-background-color);
  --casino-shell-bg: #000;
  --casino-markets-bg: #ededed;
  --casino-market-header-bg: #000;
  --casino-market-header-text: #fff;
  --casino-market-body-bg: #fff;
  --casino-text: #243a48;
  --casino-text-muted: var(--ifm-color-emphasis-600);
  --casino-runners-bg: linear-gradient(
    90deg,
    rgb(153 199 241) 0%,
    rgb(138 189 216 / 50%) 49%,
    rgb(146 198 246) 100%
  );
  --casino-odds-bg: rgba(114, 187, 239, 0.5);
  --casino-odds-text: #111;
  --casino-odds-shadow: 0 2px 7px 1px #67828be6;
  --casino-back-bg: #72bbef;
  --casino-lay-bg: #faa9ba;
  --casino-sportbook-bg: #fff;
  --casino-sportbook-border: #ccc;
  --casino-results-bg: #000;
  --casino-results-text: #fff;
  --casino-results-muted: #ccc;
  --casino-modal-bg: #fff;
  --casino-modal-header-bg: #000;
  --casino-modal-header-text: #fff;
  --casino-modal-text: #243a48;
  --casino-modal-shadow: 0 8px 32px rgba(0, 0, 0, 0.25);
  --casino-modal-backdrop: rgba(0, 0, 0, 0.5);
  --casino-card-border: #000;
  --casino-link: #243a48;
}

[data-theme="dark"] {
  --casino-page-bg: var(--ifm-background-color);
  --casino-shell-bg: #0d1117;
  --casino-markets-bg: var(--ifm-background-color);
  --casino-market-header-bg: #161b22;
  --casino-market-header-text: var(--ifm-font-color-base);
  --casino-market-body-bg: var(--ifm-background-surface-color);
  --casino-text: var(--ifm-font-color-base);
  --casino-text-muted: var(--ifm-color-emphasis-500);
  --casino-runners-bg: linear-gradient(
    90deg,
    rgb(36 58 72) 0%,
    rgb(28 45 56 / 70%) 49%,
    rgb(36 58 72) 100%
  );
  --casino-odds-bg: rgba(114, 187, 239, 0.22);
  --casino-odds-text: var(--ifm-font-color-base);
  --casino-odds-shadow: 0 2px 8px rgba(0, 0, 0, 0.45);
  --casino-back-bg: #72bbef;
  --casino-lay-bg: #faa9ba;
  --casino-sportbook-bg: var(--ifm-background-surface-color);
  --casino-sportbook-border: var(--ifm-color-emphasis-300);
  --casino-results-bg: #161b22;
  --casino-results-text: var(--ifm-font-color-base);
  --casino-results-muted: var(--ifm-color-emphasis-500);
  --casino-modal-bg: var(--ifm-background-surface-color);
  --casino-modal-header-bg: #161b22;
  --casino-modal-header-text: var(--ifm-font-color-base);
  --casino-modal-text: var(--ifm-font-color-base);
  --casino-modal-shadow: 0 8px 32px rgba(0, 0, 0, 0.55);
  --casino-modal-backdrop: rgba(0, 0, 0, 0.72);
  --casino-card-border: var(--ifm-color-emphasis-400);
  --casino-link: var(--ifm-color-primary-light);
}

/**
 * Flattened markets panel styles (from CasinoLiveGame styles.module.css).
 * Use with the HTML templates in docs — pair with casino-variables.css.
 */
.uc-markets-scroll {
  background: var(--casino-markets-bg);
}

.uc-market {
  margin-bottom: 3px;
}

.uc-market-header {
  padding: 4px 8px;
  font-size: 12px;
  font-weight: 700;
  background: var(--casino-market-header-bg);
  color: var(--casino-market-header-text);
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 8px;
}

.uc-market-title {
  flex: 1;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.uc-market-minmax {
  font-size: 11px;
  font-weight: 400;
  opacity: 0.85;
  flex-shrink: 0;
  white-space: nowrap;
}

.uc-market-body {
  position: relative;
  background: var(--casino-market-body-bg);
  border-bottom-left-radius: 6px;
}

.uc-suspended-overlay {
  position: absolute;
  inset: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 22px;
  font-weight: 700;
  text-transform: uppercase;
  color: #fff;
  background: rgba(0, 0, 0, 0.65);
  border: 2px solid #666;
  z-index: 1;
}

.uc-runners-row {
  display: flex;
  background: var(--casino-runners-bg);
  padding: 6px 4px 10px;
  gap: 4px;
}

.uc-runners-row-two .uc-runner {
  flex: 1 1 50%;
  max-width: 50%;
}

.uc-runners-row-three .uc-runner {
  flex: 1 1 33.333%;
  max-width: 33.333%;
}

.uc-runners-row-stacked {
  flex-direction: column;
  gap: 6px;
  padding: 6px 8px 10px;
}

.uc-runners-row-stacked .uc-runner {
  flex: 0 0 auto;
  width: 100%;
  max-width: 100%;
  flex-direction: row;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
}

.uc-runner {
  display: flex;
  flex-direction: column;
  align-items: center;
  min-width: 0;
  padding: 0 2px;
}

.uc-runner-name {
  font-size: 11px;
  font-weight: 700;
  color: var(--casino-text);
  margin-bottom: 4px;
  text-align: center;
  line-height: 1.15;
  min-height: 26px;
  display: flex;
  align-items: flex-end;
  justify-content: center;
}

.uc-odds-box {
  width: 100%;
  max-width: 150px;
  min-width: 72px;
  border-radius: 5px;
  padding: 4px 2px;
  background: var(--casino-odds-bg);
  box-shadow: var(--casino-odds-shadow);
  color: var(--casino-odds-text);
  text-align: center;
  font-weight: 600;
}

.uc-odds-price {
  font-size: 13px;
  line-height: 1.2;
}

.uc-odds-size {
  font-size: 11px;
  font-weight: 400;
  opacity: 0.85;
  line-height: 1.2;
}

/* Back / lay table (1 Day Teen Patti, 1 Day Dragon Tiger) */
.uc-sportbook-table {
  width: 100%;
  border-collapse: collapse;
  background: var(--casino-sportbook-bg);
  table-layout: fixed;
}

.uc-sportbook-table th,
.uc-sportbook-table td {
  border-top: 1px solid var(--casino-sportbook-border);
  vertical-align: middle;
}

.uc-back-cell {
  background: var(--casino-back-bg);
  text-align: center;
}

.uc-lay-cell {
  background: var(--casino-lay-bg);
  text-align: center;
}

@import url('https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css');

/* 20-20 Teen Patti result modal — Wazeer app-results / #resultModal */
.teenPattiResultModalRoot {
  font-family: Tahoma, Helvetica, sans-serif;
}

.teenPattiResultModalRoot .modal-dialog {
  width: 100%;
  max-width: 560px;
  margin: 0 auto;
}

.teenPattiResultModalRoot .modal-content {
  background: #fff;
  border-radius: 6px;
  overflow: hidden;
  box-shadow: 0 5px 15px rgba(0, 0, 0, 0.35);
}

.teenPattiResultModalRoot .bet-slip-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  background: linear-gradient(-180deg, #000 0%, #000 100%);
  color: #fff;
  padding: 8px 12px;
  border: 0;
}

.teenPattiResultModalRoot .bet-slip-head .modal-title {
  margin: 0;
  font-size: 15px;
  font-weight: 700;
  text-transform: capitalize;
}

.teenPattiResultModalRoot .bet-slip-head .modal-title b {
  font-weight: 700;
}

.teenPattiResultModalRoot .bet-slip-head .close {
  float: none;
  padding: 0;
  margin: 0;
  background: transparent;
  border: 0;
  color: #fff;
  opacity: 1;
  font-size: 24px;
  line-height: 1;
  cursor: pointer;
  text-shadow: none;
}

.teenPattiResultModalRoot .modal-body {
  padding: 8px 12px 16px;
  max-height: 80vh;
  overflow-y: auto;
  text-align: left;
}

.teenPattiResultModalRoot .body-bottom {
  margin-bottom: 40px;
}

.teenPattiResultModalRoot .modal-title.p-2 {
  padding: 8px;
  margin: 0;
}

.teenPattiResultModalRoot .round-id {
  margin: 0;
  font-size: 14px;
  font-weight: 700;
  text-align: right;
  color: #243a48;
}

.teenPattiResultModalRoot .round-id b {
  font-weight: 700;
}

.teenPattiResultModalRoot .paati_boxs {
  width: 50%;
  float: left;
  box-sizing: border-box;
  padding: 0 4px;
  text-align: center;
}

.teenPattiResultModalRoot .paati_boxs h6 {
  margin: 0 0 8px;
  font-size: 16px;
  font-weight: 700;
}

.teenPattiResultModalRoot .card-Img-box {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
}

.teenPattiResultModalRoot .card-Img-box img {
  width: 62px;
  height: auto;
  border: 1px solid #000;
  border-radius: 17px;
  margin: 6px;
}

.teenPattiResultModalRoot .all-market-winner .sectionA.p-1,
.teenPattiResultModalRoot .all-market-winner .sectionB.p-1 {
  padding: 4px;
  min-height: 28px;
  align-items: center;
  justify-content: center;
  gap: 3px;
}

.teenPattiResultModalRoot .teen-market-runner-name {
  margin-left: 3px;
  font-size: 12px;
  font-weight: 700;
  color: #243a48;
  line-height: 1.2;
  text-transform: uppercase;
}

.teenPattiResultModalRoot .winner-icon {
  animation: wazeerTeenPattiWinnerPulse 1.5s infinite;
  border-radius: 50%;
  color: #1d7f1e;
  margin-left: 0;
  font-size: 14px;
  flex-shrink: 0;
}

.teenPattiResultModalRoot .loser-icon {
  animation: wazeerTeenPattiWinnerPulse 1.5s infinite;
  border-radius: 50%;
  color: #ca1010;
  transform: rotate(180deg);
  margin-left: 0;
  font-size: 14px;
  flex-shrink: 0;
}

.teenPattiResultModalRoot .winner-team {
  background: #28a745;
  padding: 5px 10px;
  color: #fff;
  font-size: 20px;
  font-weight: 700;
  display: block;
  margin: 10px auto;
  width: fit-content;
  border: 0;
  border-radius: 4px;
}

.teenPattiResultModalRoot .clearfix {
  clear: both;
  border-top: 1px solid #ccc;
}

.teenPattiResultModalRoot .all-market-winner {
  border-bottom: 1px solid #ccc;
  padding: 10px 0;
}

.teenPattiResultModalRoot .all-market-winner .text-center.fw-bold {
  text-align: center;
  font-size: 12px;
  font-weight: 700;
  margin-bottom: 8px;
  line-height: 1.3;
  color: #243a48;
}

.teenPattiResultModalRoot .all-market-winner .sectionA,
.teenPattiResultModalRoot .all-market-winner .sectionB {
  width: 50%;
  display: inline-flex;
  text-align: center;
  font-size: 12px;
  vertical-align: top;
  box-sizing: border-box;
  align-items: center;
  justify-content: center;
}

@keyframes wazeerTeenPattiWinnerPulse {
  0% {
    box-shadow: 0 0 0 0 rgba(29, 127, 30, 0.6);
  }

  70% {
    box-shadow: 0 0 0 10px rgba(29, 127, 30, 0);
  }

  100% {
    box-shadow: 0 0 0 0 rgba(29, 127, 30, 0);
  }
}

@media only screen and (max-width: 767px) {
  .teenPattiResultModalRoot .paati_boxs {
    width: 100%;
    float: none;
    margin: 5px 0;
    padding: 0;
  }

  .teenPattiResultModalRoot .paati_boxs h6 {
    font-size: 18px;
  }

  .teenPattiResultModalRoot .card-Img-box img {
    width: 50px;
    border-radius: 14px;
  }
}

/* Lucky 7 result modal — stacked full-width runner rows */
.lucky7ResultModalRoot .lucky7-body-bottom {
  margin-bottom: 80px;
}

.lucky7ResultModalRoot .lucky7-card-box {
  float: none;
  width: 100%;
  max-width: none;
  margin: 0 auto 8px;
  padding: 0;
  text-align: center;
}

.lucky7ResultModalRoot .lucky7-card-box + .clearfix {
  border-top: 0;
}

@media only screen and (max-width: 767px) {
  .lucky7ResultModalRoot .lucky7-card-box {
    max-width: 100%;
  }
}

/* 1 Day Teen Patti result modal */
.oneDayTeenPattiResultModalRoot .one-day-teen-body-bottom {
  margin-bottom: 80px;
}

.oneDayTeenPattiResultModalRoot .card-Img-box .btn.winner-team {
  display: block;
  margin: 8px auto 0;
}

.oneDayTeenPattiResultModalRoot .winner-team {
  display: block;
  margin: 8px auto 0;
}

/* Joker Teen Patti result modal */
.jokerTeenPattiResultModalRoot .joker-teen-body-bottom {
  margin-bottom: 80px;
}

.jokerTeenPattiResultModalRoot .card-Img-box .btn.winner-team {
  display: block;
  margin: 8px auto 0;
}

.jokerTeenPattiResultModalRoot .winner-team {
  display: block;
  margin: 8px auto 0;
}

/* Muflis Teen Patti result modal */
.muflisTeenPattiResultModalRoot .muflis-teen-body-bottom {
  margin-bottom: 0;
}

.muflisTeenPattiResultModalRoot .card-Img-box .btn.winner-team {
  display: block;
  margin: 8px auto 0;
  width: fit-content;
}

/* Card Race result modal */
.cardRaceResultModalRoot .card-race-body-bottom {
  margin-bottom: 0;
}

.cardRaceResultModalRoot .showall-card {
  list-style: none;
  padding: 6px 4px;
  margin: 0;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  border-bottom: 1px solid #eee;
}

.cardRaceResultModalRoot .showall-card .ms-1 {
  margin-left: 2px;
  display: inline-flex;
}

.cardRaceResultModalRoot .showall-card .imgClassModal {
  width: 32px;
  height: auto;
  border: 1px solid #000;
  border-radius: 8px;
}

.cardRaceResultModalRoot .modal-title.p-2[style*='float'] {
  float: left;
  width: 100%;
}

.cardRaceResultModalRoot .modal-title.p-2[style*='float'] + .paati_boxs {
  clear: both;
}

/* Amar Akbar Anthony result modal */
.aaaResultModalRoot .aaa-body-bottom {
  margin-bottom: 0;
}

.dragonTiger2020ResultModalRoot .dragon-tiger-body-bottom {
  margin-bottom: 80px;
}

.dragonTiger2020ResultModalRoot .winner-team {
  display: block;
  margin: 8px auto 0;
}

/* 1 Day Dragon Tiger result modal */
.oneDayDragonTigerResultModalRoot .showall-card {
  list-style: none;
  padding: 8px 4px;
  margin: 0;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  border-bottom: 1px solid #eee;
}

.oneDayDragonTigerResultModalRoot .showall-card .mr-2 {
  margin-right: 8px;
  font-weight: 700;
  font-size: 14px;
  color: #243a48;
}

.oneDayDragonTigerResultModalRoot .showall-card .ms-1 {
  margin-left: 3px;
}

.oneDayDragonTigerResultModalRoot .showall-card .imgClassModal {
  width: 42px;
  height: auto;
  border: 1px solid #000;
  border-radius: 12px;
}

/* Baccarat result modal */
.baccaratResultModalRoot .winner-team {
  display: block;
  margin: 8px auto 0;
}

/* Andar Bahar result modal */
.andarBaharResultModalRoot .andar-bahar-body-bottom {
  margin-bottom: 80px;
}

.andarBaharResultModalRoot .showall-card {
  list-style: none;
  padding: 8px 4px;
  margin: 0;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  border-bottom: 1px solid #eee;
}

.andarBaharResultModalRoot .showall-card .mr-2 {
  margin-right: 8px;
  font-weight: 700;
  font-size: 14px;
  color: #243a48;
  display: flex;
  align-items: center;
}

.andarBaharResultModalRoot .showall-card .andar-bahar-card-item {
  margin-left: 3px;
}

.andarBaharResultModalRoot .showall-card img {
  width: 42px;
  height: auto;
  border: 1px solid #000;
  border-radius: 12px;
}

/* 32 Cards result modal */
.cards32ResultModalRoot .cards32-body-bottom {
  margin-bottom: 80px;
}

.cards32ResultModalRoot .cards32-round-id {
  float: none;
  width: 100%;
  clear: both;
}

.cards32ResultModalRoot .cards32-round-id-clear {
  border-top: 0;
  clear: both;
}

.cards32ResultModalRoot .cards32-player-box {
  float: none;
  width: 100%;
  max-width: none;
  padding: 0;
  clear: both;
}

.cards32ResultModalRoot .showall-card {
  list-style: none;
  padding: 8px 4px;
  margin: 0;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  border-bottom: 1px solid #eee;
}

.cards32ResultModalRoot .showall-card .mr-2 {
  margin-right: 8px;
  font-weight: 700;
  font-size: 14px;
  color: #243a48;
}

.cards32ResultModalRoot .showall-card .cards32-card-item {
  margin-left: 3px;
}

.cards32ResultModalRoot .showall-card .imgClassModal {
  width: 42px;
  height: auto;
  border: 1px solid #000;
  border-radius: 12px;
}

.cards32ResultModalRoot .showall-card .me-1 {
  margin-right: 4px;
}

/* 20-20 Poker result modal */
.pokerResultModalRoot .poker-body-bottom {
  margin-bottom: 80px;
}

.pokerResultModalRoot .poker-round-id {
  float: none;
  width: 100%;
  clear: both;
}

.pokerResultModalRoot .poker-round-id-clear {
  border-top: 0;
  clear: both;
}

.pokerResultModalRoot .poker-card-box {
  float: none;
  width: 100%;
  max-width: none;
  padding: 0;
  clear: both;
}

.pokerResultModalRoot .showall-card {
  list-style: none;
  padding: 8px 4px;
  margin: 0;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  border-bottom: 1px solid #eee;
}

.pokerResultModalRoot .showall-card b {
  font-weight: 700;
  font-size: 14px;
  color: #243a48;
}

.pokerResultModalRoot .showall-card .ms-1 {
  margin-left: 4px;
}

.pokerResultModalRoot .showall-card .imgClassModal {
  width: 42px;
  height: auto;
  border: 1px solid #000;
  border-radius: 12px;
}

Supported games

eventIdGame name
99.001020-20 TEENPATTI
99.0030LUCKY 7
99.00131DAY TEEN PATTI
99.0016JOKER TEEN PATTI
99.001920-20 DRAGON TIGER
99.0001BACCARAT
99.0025ANDAR BAHAR
99.002232 CARDS
99.0007POKER
99.0041DTL
99.00211 DAY DRAGON TIGER
99.0014MUFLIS TEEN PATTI
99.0046CARD RACE
99.0005AMAR AKBAR ANTHONY
99.0018DRAGON TIGER
88.0019LUCKY 0 TO 9
88.0020DREAM CATCHER
88.0021HEADS & TAILS
88.0030VIMAAN
88.0023BALLOON