@oddsmith/ui 1.0.2 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -46,7 +46,7 @@
46
46
  "hero": {
47
47
  "bannerAsset": {
48
48
  "uuid": "banner-1",
49
- "createdTs": "2026-06-21T19:25:10.876Z",
49
+ "createdTs": "2026-06-22T09:00:06.011Z",
50
50
  "name": "midnight-millions-banner",
51
51
  "label": "Midnight Millions",
52
52
  "comment": "",
@@ -57,7 +57,7 @@
57
57
  },
58
58
  "title": "Midnight Millions",
59
59
  "description": "Climb the board before the timer hits zero.",
60
- "endTs": "2026-06-24T19:25:10.877Z",
60
+ "endTs": "2026-06-25T09:00:06.012Z",
61
61
  "status": "active",
62
62
  "prizePoolValue": 124500,
63
63
  "prizePoolCurrency": "USD"
@@ -2,5 +2,5 @@
2
2
  "version": 1,
3
3
  "component": "os-leaderboard-casino",
4
4
  "tier": "free",
5
- "generatedAt": "2026-06-21T19:25:10.878Z"
5
+ "generatedAt": "2026-06-22T09:00:06.012Z"
6
6
  }
@@ -83,7 +83,7 @@
83
83
  "hero": {
84
84
  "bannerAsset": {
85
85
  "uuid": "banner-1",
86
- "createdTs": "2026-06-21T19:25:10.876Z",
86
+ "createdTs": "2026-06-22T09:00:06.011Z",
87
87
  "name": "midnight-millions-banner",
88
88
  "label": "Midnight Millions",
89
89
  "comment": "",
@@ -94,7 +94,7 @@
94
94
  },
95
95
  "title": "Midnight Millions",
96
96
  "description": "Climb the board before the timer hits zero.",
97
- "endTs": "2026-06-24T19:25:10.877Z",
97
+ "endTs": "2026-06-25T09:00:06.012Z",
98
98
  "status": "active",
99
99
  "prizePoolValue": 124500,
100
100
  "prizePoolCurrency": "USD"
@@ -1,4 +1,4 @@
1
- const e = { config: { appearance: "glam", themeId: "glam-default", labels: { back: "Return", live: "Live", cta: "Enter the Leaderboard" }, enabled: ["marquee", "events", "hero", "prize", "stats", "games", "climb", "table", "footer", "legals"], mainOrder: ["prize", "stats", "games", "climb", "table"], themeVars: { "--os-casino-font-display": "'Sora', system-ui, sans-serif", "--os-casino-font-body": "'Inter', system-ui, sans-serif", "--os-casino-font-mono": "ui-monospace, 'JetBrains Mono', monospace", "--os-casino-bg": "#181622", "--os-casino-bg-2": "#181622" } }, sections: { marquee: { items: [{ id: "mq-1", gameId: "slot-machine", text: "krakenbet won $4,200 on Mega Fortune", amount: 4200, currency: "USD", vip: !0 }, { id: "mq-2", gameId: "roulette", text: "marisol_v won $1,800 on Lightning Roulette", amount: 1800, currency: "USD" }, { id: "mq-3", gameId: "cards", text: "mr_midnight won $9,600 on VIP Baccarat", amount: 9600, currency: "USD", vip: !0 }], speedSec: 32 }, events: { events: [{ id: "event-1", title: "Double points weekend", subtitle: "All slots count 2× toward the board", accent: "gold" }, { id: "event-2", title: "High roller boost", subtitle: "Tables over $500 qualify for bonus tiers", accent: "violet" }] }, hero: { bannerAsset: { uuid: "banner-1", createdTs: "2026-06-21T19:25:10.876Z", name: "midnight-millions-banner", label: "Midnight Millions", comment: "", url: "", tags: [], type: "GAME", sportType: "casino" }, title: "Midnight Millions", description: "Climb the board before the timer hits zero.", endTs: "2026-06-24T19:25:10.877Z", status: "active", prizePoolValue: 124500, prizePoolCurrency: "USD" }, prize: { prizePackage: { uuid: "prize-package-1", name: "Midnight Millions", prizes: [{ uuid: "prize-1", label: { values: [{ value: "Grand Jackpot", language: "en" }], labelType: "ON_DEMAND", enValue: "Grand Jackpot" }, value: 5e4, currency: "USD", rankFrom: 1, rankTo: 1 }, { uuid: "prize-2", label: { values: [{ value: "Major Jackpot", language: "en" }], labelType: "ON_DEMAND", enValue: "Major Jackpot" }, value: 25e3, currency: "USD", rankFrom: 2, rankTo: 2 }, { uuid: "prize-3", label: { values: [{ value: "Mini Jackpot", language: "en" }], labelType: "ON_DEMAND", enValue: "Mini Jackpot" }, value: 1e4, currency: "USD", rankFrom: 3, rankTo: 3 }, { uuid: "prize-4", label: { values: [{ value: "Casino Credits", language: "en" }], labelType: "ON_DEMAND", enValue: "Casino Credits" }, value: 1e3, currency: "USD", rankFrom: 4, rankTo: 4 }, { uuid: "prize-5", label: { values: [{ value: "Free Spins ×25", language: "en" }], labelType: "ON_DEMAND", enValue: "Free Spins ×25" }, value: 250, currency: "USD", rankFrom: 5, rankTo: 10 }, { uuid: "prize-6", label: { values: [{ value: "Mystery Bonus Drop", language: "en" }], labelType: "ON_DEMAND", enValue: "Mystery Bonus Drop" }, value: 100, currency: "USD", rankFrom: 11, rankTo: 200 }] }, allocationStrategy: "BEST_PRIZE" }, stats: { totalParticipants: 12842, totalPrizes: 6, biggestWin: 9600, biggestWinCurrency: "USD" }, games: { games: [{ id: "chips", title: "Golden Chips", boost: "2×" }, { id: "cards", title: "VIP Baccarat", boost: "1.5×" }, { id: "slot-machine", title: "Mega Fortune", boost: "2×" }, { id: "roulette", title: "Lightning Roulette", boost: "1.5×" }, { id: "dice", title: "Crystal Dice", boost: "1.2×" }, { id: "gates-of-olympus", title: "Gates of Olympus", boost: "3×" }] }, climb: { username: "deep_cut", rank: 17, points: 28460, nextTierRank: 10, nextTierLabel: "Free Spins ×25", pointsToNextTier: 1240, progress: 0.62, trend: 3 }, table: { mode: "preview", topPlayers: [{ username: "krakenbet", rank: 1, points: 184200, totalBet: 14200, prize: { uuid: "prize-1", label: { values: [{ value: "Grand Jackpot", language: "en" }], labelType: "ON_DEMAND", enValue: "Grand Jackpot" }, value: 5e4, currency: "USD", rankFrom: 1, rankTo: 1 }, splitCount: 1, you: !1, vip: !0, previousRank: 3, winRate: 68, gamesPlayed: 182 }, { username: "marisol_v", rank: 2, points: 129718, totalBet: 12800, prize: { uuid: "prize-2", label: { values: [{ value: "Major Jackpot", language: "en" }], labelType: "ON_DEMAND", enValue: "Major Jackpot" }, value: 25e3, currency: "USD", rankFrom: 2, rankTo: 2 }, splitCount: 1, you: !1, previousRank: 4, winRate: 64, gamesPlayed: 168 }, { username: "mr_midnight", rank: 3, points: 100109, totalBet: 11500, prize: { uuid: "prize-3", label: { values: [{ value: "Mini Jackpot", language: "en" }], labelType: "ON_DEMAND", enValue: "Mini Jackpot" }, value: 1e4, currency: "USD", rankFrom: 3, rankTo: 3 }, splitCount: 1, you: !1, vip: !0, previousRank: 2, winRate: 61, gamesPlayed: 155 }, { username: "piotr_k", rank: 4, points: 81504, totalBet: 10200, prize: { uuid: "prize-4", label: { values: [{ value: "Casino Credits", language: "en" }], labelType: "ON_DEMAND", enValue: "Casino Credits" }, value: 1e3, currency: "USD", rankFrom: 4, rankTo: 4 }, splitCount: 1, you: !1, vip: !0, previousRank: 1, winRate: 58, gamesPlayed: 144 }, { username: "bl4ze77", rank: 5, points: 68731, totalBet: 9100, prize: { uuid: "prize-5", label: { values: [{ value: "Free Spins ×25", language: "en" }], labelType: "ON_DEMAND", enValue: "Free Spins ×25" }, value: 250, currency: "USD", rankFrom: 5, rankTo: 10 }, splitCount: 1, you: !1, previousRank: 6, winRate: 56, gamesPlayed: 138 }, { username: "ghostchip", rank: 6, points: 59419, totalBet: 8200, prize: { uuid: "prize-5", label: { values: [{ value: "Free Spins ×25", language: "en" }], labelType: "ON_DEMAND", enValue: "Free Spins ×25" }, value: 250, currency: "USD", rankFrom: 5, rankTo: 10 }, splitCount: 1, you: !1, previousRank: 5, winRate: 54, gamesPlayed: 127 }, { username: "LunaX", rank: 7, points: 52330, totalBet: 7400, prize: { uuid: "prize-5", label: { values: [{ value: "Free Spins ×25", language: "en" }], labelType: "ON_DEMAND", enValue: "Free Spins ×25" }, value: 250, currency: "USD", rankFrom: 5, rankTo: 10 }, splitCount: 1, you: !1, vip: !0, previousRank: 10, winRate: 51, gamesPlayed: 119 }, { username: "soyuz3", rank: 8, points: 46751, totalBet: 6600, prize: { uuid: "prize-5", label: { values: [{ value: "Free Spins ×25", language: "en" }], labelType: "ON_DEMAND", enValue: "Free Spins ×25" }, value: 250, currency: "USD", rankFrom: 5, rankTo: 10 }, splitCount: 1, you: !1, previousRank: 7, winRate: 49, gamesPlayed: 113 }, { username: "NovaBet", rank: 9, points: 42248, totalBet: 5800, prize: { uuid: "prize-5", label: { values: [{ value: "Free Spins ×25", language: "en" }], labelType: "ON_DEMAND", enValue: "Free Spins ×25" }, value: 250, currency: "USD", rankFrom: 5, rankTo: 10 }, splitCount: 1, you: !1, previousRank: 9, winRate: 47, gamesPlayed: 106 }, { username: "tundra_rex", rank: 10, points: 38536, totalBet: 5e3, prize: { uuid: "prize-5", label: { values: [{ value: "Free Spins ×25", language: "en" }], labelType: "ON_DEMAND", enValue: "Free Spins ×25" }, value: 250, currency: "USD", rankFrom: 5, rankTo: 10 }, splitCount: 1, you: !1, previousRank: 8, winRate: 44, gamesPlayed: 98 }], currentUser: { username: "deep_cut", rank: 17, points: 28460, totalBet: 3200, prize: { uuid: "prize-6", label: { values: [{ value: "Mystery Bonus Drop", language: "en" }], labelType: "ON_DEMAND", enValue: "Mystery Bonus Drop" }, value: 100, currency: "USD", rankFrom: 11, rankTo: 200 }, splitCount: 1, you: !0, previousRank: 20, winRate: 48, gamesPlayed: 31 }, ctaLabel: "Enter the Leaderboard" }, footer: { text: "Unused powered by oddsmith.io" }, legals: { links: [{ type: "internal", label: "Rules" }, { type: "internal", label: "FAQ" }, { type: "external", label: "Terms & Conditions", href: "https://www.google.com" }] } } }, a = {
1
+ const e = { config: { appearance: "glam", themeId: "glam-default", labels: { back: "Return", live: "Live", cta: "Enter the Leaderboard" }, enabled: ["marquee", "events", "hero", "prize", "stats", "games", "climb", "table", "footer", "legals"], mainOrder: ["prize", "stats", "games", "climb", "table"], themeVars: { "--os-casino-font-display": "'Sora', system-ui, sans-serif", "--os-casino-font-body": "'Inter', system-ui, sans-serif", "--os-casino-font-mono": "ui-monospace, 'JetBrains Mono', monospace", "--os-casino-bg": "#181622", "--os-casino-bg-2": "#181622" } }, sections: { marquee: { items: [{ id: "mq-1", gameId: "slot-machine", text: "krakenbet won $4,200 on Mega Fortune", amount: 4200, currency: "USD", vip: !0 }, { id: "mq-2", gameId: "roulette", text: "marisol_v won $1,800 on Lightning Roulette", amount: 1800, currency: "USD" }, { id: "mq-3", gameId: "cards", text: "mr_midnight won $9,600 on VIP Baccarat", amount: 9600, currency: "USD", vip: !0 }], speedSec: 32 }, events: { events: [{ id: "event-1", title: "Double points weekend", subtitle: "All slots count 2× toward the board", accent: "gold" }, { id: "event-2", title: "High roller boost", subtitle: "Tables over $500 qualify for bonus tiers", accent: "violet" }] }, hero: { bannerAsset: { uuid: "banner-1", createdTs: "2026-06-22T09:00:06.011Z", name: "midnight-millions-banner", label: "Midnight Millions", comment: "", url: "", tags: [], type: "GAME", sportType: "casino" }, title: "Midnight Millions", description: "Climb the board before the timer hits zero.", endTs: "2026-06-25T09:00:06.012Z", status: "active", prizePoolValue: 124500, prizePoolCurrency: "USD" }, prize: { prizePackage: { uuid: "prize-package-1", name: "Midnight Millions", prizes: [{ uuid: "prize-1", label: { values: [{ value: "Grand Jackpot", language: "en" }], labelType: "ON_DEMAND", enValue: "Grand Jackpot" }, value: 5e4, currency: "USD", rankFrom: 1, rankTo: 1 }, { uuid: "prize-2", label: { values: [{ value: "Major Jackpot", language: "en" }], labelType: "ON_DEMAND", enValue: "Major Jackpot" }, value: 25e3, currency: "USD", rankFrom: 2, rankTo: 2 }, { uuid: "prize-3", label: { values: [{ value: "Mini Jackpot", language: "en" }], labelType: "ON_DEMAND", enValue: "Mini Jackpot" }, value: 1e4, currency: "USD", rankFrom: 3, rankTo: 3 }, { uuid: "prize-4", label: { values: [{ value: "Casino Credits", language: "en" }], labelType: "ON_DEMAND", enValue: "Casino Credits" }, value: 1e3, currency: "USD", rankFrom: 4, rankTo: 4 }, { uuid: "prize-5", label: { values: [{ value: "Free Spins ×25", language: "en" }], labelType: "ON_DEMAND", enValue: "Free Spins ×25" }, value: 250, currency: "USD", rankFrom: 5, rankTo: 10 }, { uuid: "prize-6", label: { values: [{ value: "Mystery Bonus Drop", language: "en" }], labelType: "ON_DEMAND", enValue: "Mystery Bonus Drop" }, value: 100, currency: "USD", rankFrom: 11, rankTo: 200 }] }, allocationStrategy: "BEST_PRIZE" }, stats: { totalParticipants: 12842, totalPrizes: 6, biggestWin: 9600, biggestWinCurrency: "USD" }, games: { games: [{ id: "chips", title: "Golden Chips", boost: "2×" }, { id: "cards", title: "VIP Baccarat", boost: "1.5×" }, { id: "slot-machine", title: "Mega Fortune", boost: "2×" }, { id: "roulette", title: "Lightning Roulette", boost: "1.5×" }, { id: "dice", title: "Crystal Dice", boost: "1.2×" }, { id: "gates-of-olympus", title: "Gates of Olympus", boost: "3×" }] }, climb: { username: "deep_cut", rank: 17, points: 28460, nextTierRank: 10, nextTierLabel: "Free Spins ×25", pointsToNextTier: 1240, progress: 0.62, trend: 3 }, table: { mode: "preview", topPlayers: [{ username: "krakenbet", rank: 1, points: 184200, totalBet: 14200, prize: { uuid: "prize-1", label: { values: [{ value: "Grand Jackpot", language: "en" }], labelType: "ON_DEMAND", enValue: "Grand Jackpot" }, value: 5e4, currency: "USD", rankFrom: 1, rankTo: 1 }, splitCount: 1, you: !1, vip: !0, previousRank: 3, winRate: 68, gamesPlayed: 182 }, { username: "marisol_v", rank: 2, points: 129718, totalBet: 12800, prize: { uuid: "prize-2", label: { values: [{ value: "Major Jackpot", language: "en" }], labelType: "ON_DEMAND", enValue: "Major Jackpot" }, value: 25e3, currency: "USD", rankFrom: 2, rankTo: 2 }, splitCount: 1, you: !1, previousRank: 4, winRate: 64, gamesPlayed: 168 }, { username: "mr_midnight", rank: 3, points: 100109, totalBet: 11500, prize: { uuid: "prize-3", label: { values: [{ value: "Mini Jackpot", language: "en" }], labelType: "ON_DEMAND", enValue: "Mini Jackpot" }, value: 1e4, currency: "USD", rankFrom: 3, rankTo: 3 }, splitCount: 1, you: !1, vip: !0, previousRank: 2, winRate: 61, gamesPlayed: 155 }, { username: "piotr_k", rank: 4, points: 81504, totalBet: 10200, prize: { uuid: "prize-4", label: { values: [{ value: "Casino Credits", language: "en" }], labelType: "ON_DEMAND", enValue: "Casino Credits" }, value: 1e3, currency: "USD", rankFrom: 4, rankTo: 4 }, splitCount: 1, you: !1, vip: !0, previousRank: 1, winRate: 58, gamesPlayed: 144 }, { username: "bl4ze77", rank: 5, points: 68731, totalBet: 9100, prize: { uuid: "prize-5", label: { values: [{ value: "Free Spins ×25", language: "en" }], labelType: "ON_DEMAND", enValue: "Free Spins ×25" }, value: 250, currency: "USD", rankFrom: 5, rankTo: 10 }, splitCount: 1, you: !1, previousRank: 6, winRate: 56, gamesPlayed: 138 }, { username: "ghostchip", rank: 6, points: 59419, totalBet: 8200, prize: { uuid: "prize-5", label: { values: [{ value: "Free Spins ×25", language: "en" }], labelType: "ON_DEMAND", enValue: "Free Spins ×25" }, value: 250, currency: "USD", rankFrom: 5, rankTo: 10 }, splitCount: 1, you: !1, previousRank: 5, winRate: 54, gamesPlayed: 127 }, { username: "LunaX", rank: 7, points: 52330, totalBet: 7400, prize: { uuid: "prize-5", label: { values: [{ value: "Free Spins ×25", language: "en" }], labelType: "ON_DEMAND", enValue: "Free Spins ×25" }, value: 250, currency: "USD", rankFrom: 5, rankTo: 10 }, splitCount: 1, you: !1, vip: !0, previousRank: 10, winRate: 51, gamesPlayed: 119 }, { username: "soyuz3", rank: 8, points: 46751, totalBet: 6600, prize: { uuid: "prize-5", label: { values: [{ value: "Free Spins ×25", language: "en" }], labelType: "ON_DEMAND", enValue: "Free Spins ×25" }, value: 250, currency: "USD", rankFrom: 5, rankTo: 10 }, splitCount: 1, you: !1, previousRank: 7, winRate: 49, gamesPlayed: 113 }, { username: "NovaBet", rank: 9, points: 42248, totalBet: 5800, prize: { uuid: "prize-5", label: { values: [{ value: "Free Spins ×25", language: "en" }], labelType: "ON_DEMAND", enValue: "Free Spins ×25" }, value: 250, currency: "USD", rankFrom: 5, rankTo: 10 }, splitCount: 1, you: !1, previousRank: 9, winRate: 47, gamesPlayed: 106 }, { username: "tundra_rex", rank: 10, points: 38536, totalBet: 5e3, prize: { uuid: "prize-5", label: { values: [{ value: "Free Spins ×25", language: "en" }], labelType: "ON_DEMAND", enValue: "Free Spins ×25" }, value: 250, currency: "USD", rankFrom: 5, rankTo: 10 }, splitCount: 1, you: !1, previousRank: 8, winRate: 44, gamesPlayed: 98 }], currentUser: { username: "deep_cut", rank: 17, points: 28460, totalBet: 3200, prize: { uuid: "prize-6", label: { values: [{ value: "Mystery Bonus Drop", language: "en" }], labelType: "ON_DEMAND", enValue: "Mystery Bonus Drop" }, value: 100, currency: "USD", rankFrom: 11, rankTo: 200 }, splitCount: 1, you: !0, previousRank: 20, winRate: 48, gamesPlayed: 31 }, ctaLabel: "Enter the Leaderboard" }, footer: { text: "Unused powered by oddsmith.io" }, legals: { links: [{ type: "internal", label: "Rules" }, { type: "internal", label: "FAQ" }, { type: "external", label: "Terms & Conditions", href: "https://www.google.com" }] } } }, a = {
2
2
  golden: e
3
3
  };
4
4
  export {
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Casino leaderboard — config-driven glam layout.
3
3
  *
4
- * Parent app ships producer JSON under `/assets/...` and passes it to the element:
4
+ * Parent app ships producer JSON under `/os-leaderboard-casino-config/...` and passes it to the element:
5
5
  *
6
6
  * ```ts
7
7
  * import '@oddsmith/ui/os-leaderboard-casino';
@@ -21,7 +21,7 @@
21
21
  * }, assets);
22
22
  * ```
23
23
  *
24
- * Or set `assets-base-url="/assets/producer_output/os-leaderboard-casino/free"` on the element.
24
+ * Or set `assets-base-url="/os-leaderboard-casino-config/free"` on the element.
25
25
  * Without parent assets, the bundled `assets/fallback/fallback.json` is used.
26
26
  */
27
27
  export type { LeaderboardCasinoAssetsBundle, LeaderboardCasinoAssetsInput, LeaderboardCasinoAssetsPreset, LeaderboardCasinoAssetsTheme, } from './types/assets.js';
@@ -1,7 +1,7 @@
1
1
  import { LeaderboardCasinoAssetsBundle } from '../types/assets.js';
2
2
  export { assembleAssetsBundle, LEADERBOARD_CASINO_ASSET_FILES, loadAssetsFromBaseUrl, } from './assemble-assets.js';
3
- /** Default path under parent app static `assets/`. */
4
- export declare const LEADERBOARD_CASINO_DEFAULT_ASSETS_BASE = "/assets/producer_output/os-leaderboard-casino/free";
3
+ /** Default path under parent app `public/` static files. */
4
+ export declare const LEADERBOARD_CASINO_DEFAULT_ASSETS_BASE = "/os-leaderboard-casino-config/free";
5
5
  /**
6
6
  * Load free-tier JSON from the parent app. Falls back to bundled
7
7
  * `assets/fallback/*.json` when remote files fail.
@@ -1,22 +1,22 @@
1
- import { getFallbackAssetsBundle as r } from "./assets-context.js";
2
- import { loadAssetsFromBaseUrl as a } from "./assemble-assets.js";
3
- import { LEADERBOARD_CASINO_ASSET_FILES as c, assembleAssetsBundle as u } from "./assemble-assets.js";
4
- const o = "/assets/producer_output/os-leaderboard-casino/free";
5
- async function n(e = o) {
1
+ import { getFallbackAssetsBundle as a } from "./assets-context.js";
2
+ import { loadAssetsFromBaseUrl as o } from "./assemble-assets.js";
3
+ import { LEADERBOARD_CASINO_ASSET_FILES as c, assembleAssetsBundle as i } from "./assemble-assets.js";
4
+ const r = "/os-leaderboard-casino-config/free";
5
+ async function l(e = r) {
6
6
  try {
7
- return await a(e);
7
+ return await o(e);
8
8
  } catch (s) {
9
9
  return console.warn(
10
10
  "[os-leaderboard-casino] Failed to load parent assets, using bundled fallback.",
11
11
  s
12
- ), r();
12
+ ), a();
13
13
  }
14
14
  }
15
15
  export {
16
16
  c as LEADERBOARD_CASINO_ASSET_FILES,
17
- o as LEADERBOARD_CASINO_DEFAULT_ASSETS_BASE,
18
- u as assembleAssetsBundle,
19
- a as loadAssetsFromBaseUrl,
20
- n as loadLeaderboardCasinoAssets
17
+ r as LEADERBOARD_CASINO_DEFAULT_ASSETS_BASE,
18
+ i as assembleAssetsBundle,
19
+ o as loadAssetsFromBaseUrl,
20
+ l as loadLeaderboardCasinoAssets
21
21
  };
22
22
  //# sourceMappingURL=load-assets.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"load-assets.js","sources":["../../../../src/components/os-leaderboard-casino/integration/load-assets.ts"],"sourcesContent":["import type { LeaderboardCasinoAssetsBundle } from '../types/assets.js';\nimport { getFallbackAssetsBundle } from './assets-context.js';\nimport {\n LEADERBOARD_CASINO_ASSET_FILES,\n loadAssetsFromBaseUrl,\n} from './assemble-assets.js';\n\nexport {\n assembleAssetsBundle,\n LEADERBOARD_CASINO_ASSET_FILES,\n loadAssetsFromBaseUrl,\n} from './assemble-assets.js';\n\n/** Default path under parent app static `assets/`. */\nexport const LEADERBOARD_CASINO_DEFAULT_ASSETS_BASE =\n '/assets/producer_output/os-leaderboard-casino/free';\n\n/**\n * Load free-tier JSON from the parent app. Falls back to bundled\n * `assets/fallback/*.json` when remote files fail.\n */\nexport async function loadLeaderboardCasinoAssets(\n baseUrl: string = LEADERBOARD_CASINO_DEFAULT_ASSETS_BASE,\n): Promise<LeaderboardCasinoAssetsBundle> {\n try {\n return await loadAssetsFromBaseUrl(baseUrl);\n } catch (error) {\n console.warn(\n '[os-leaderboard-casino] Failed to load parent assets, using bundled fallback.',\n error,\n );\n return getFallbackAssetsBundle();\n }\n}\n"],"names":["LEADERBOARD_CASINO_DEFAULT_ASSETS_BASE","loadLeaderboardCasinoAssets","baseUrl","loadAssetsFromBaseUrl","error","getFallbackAssetsBundle"],"mappings":";;;AAcO,MAAMA,IACX;AAMF,eAAsBC,EACpBC,IAAkBF,GACsB;AACxC,MAAI;AACF,WAAO,MAAMG,EAAsBD,CAAO;AAAA,EAC5C,SAASE,GAAO;AACd,mBAAQ;AAAA,MACN;AAAA,MACAA;AAAA,IAAA,GAEKC,EAAA;AAAA,EACT;AACF;"}
1
+ {"version":3,"file":"load-assets.js","sources":["../../../../src/components/os-leaderboard-casino/integration/load-assets.ts"],"sourcesContent":["import type { LeaderboardCasinoAssetsBundle } from '../types/assets.js';\nimport { getFallbackAssetsBundle } from './assets-context.js';\nimport {\n LEADERBOARD_CASINO_ASSET_FILES,\n loadAssetsFromBaseUrl,\n} from './assemble-assets.js';\n\nexport {\n assembleAssetsBundle,\n LEADERBOARD_CASINO_ASSET_FILES,\n loadAssetsFromBaseUrl,\n} from './assemble-assets.js';\n\n/** Default path under parent app `public/` static files. */\nexport const LEADERBOARD_CASINO_DEFAULT_ASSETS_BASE =\n '/os-leaderboard-casino-config/free';\n\n/**\n * Load free-tier JSON from the parent app. Falls back to bundled\n * `assets/fallback/*.json` when remote files fail.\n */\nexport async function loadLeaderboardCasinoAssets(\n baseUrl: string = LEADERBOARD_CASINO_DEFAULT_ASSETS_BASE,\n): Promise<LeaderboardCasinoAssetsBundle> {\n try {\n return await loadAssetsFromBaseUrl(baseUrl);\n } catch (error) {\n console.warn(\n '[os-leaderboard-casino] Failed to load parent assets, using bundled fallback.',\n error,\n );\n return getFallbackAssetsBundle();\n }\n}\n"],"names":["LEADERBOARD_CASINO_DEFAULT_ASSETS_BASE","loadLeaderboardCasinoAssets","baseUrl","loadAssetsFromBaseUrl","error","getFallbackAssetsBundle"],"mappings":";;;AAcO,MAAMA,IACX;AAMF,eAAsBC,EACpBC,IAAkBF,GACsB;AACxC,MAAI;AACF,WAAO,MAAMG,EAAsBD,CAAO;AAAA,EAC5C,SAASE,GAAO;AACd,mBAAQ;AAAA,MACN;AAAA,MACAA;AAAA,IAAA,GAEKC,EAAA;AAAA,EACT;AACF;"}
@@ -130,10 +130,12 @@ let n = class extends f {
130
130
  return p`
131
131
  <div class="countdown">
132
132
  <span class="label">Ends in</span>
133
- ${s(e.days, "days")}<span class="sep">:</span>
134
- ${s(e.hours, "hours")}<span class="sep">:</span>
135
- ${s(e.minutes, "min")}<span class="sep">:</span>
136
- ${s(e.seconds, "sec")}
133
+ <div class="countdown-track">
134
+ ${s(e.days, "days")}<span class="sep">:</span>
135
+ ${s(e.hours, "hours")}<span class="sep">:</span>
136
+ ${s(e.minutes, "min")}<span class="sep">:</span>
137
+ ${s(e.seconds, "sec")}
138
+ </div>
137
139
  </div>
138
140
  `;
139
141
  }
@@ -1 +1 @@
1
- {"version":3,"file":"hero-section.js","sources":["../../../../../src/components/os-leaderboard-casino/sections/hero-section/hero-section.ts"],"sourcesContent":["import { LitElement, html, nothing } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { Component } from '@oddsmith/lib/lit/component.js';\nimport { scss } from '@oddsmith/lib/lit/scss.js';\nimport { OS_LEADERBOARD_CASINO_HERO } from '@os-leaderboard-casino/constants/tags.js';\nimport { osLeaderboardCasinoTheme } from '@os-leaderboard-casino/theme/index.js';\nimport type { LeaderboardStatus } from '@os-leaderboard-casino/types/data.js';\nimport type { OsLeaderboardCasinoHeroSection } from '@os-leaderboard-casino/types/sections.js';\nimport type { HeroSectionHost } from './hero-section.host.js';\nimport renderTemplate from './hero-section.html?lit-html';\nimport styles from './hero-section.scss?inline';\n\ninterface CountdownParts {\n expired: boolean;\n days: number;\n hours: number;\n minutes: number;\n seconds: number;\n}\n\nfunction countdownTo(endTs: string, now = Date.now()): CountdownParts {\n const remaining = Math.floor((new Date(endTs).getTime() - now) / 1000);\n if (!Number.isFinite(remaining) || remaining <= 0) {\n return { expired: true, days: 0, hours: 0, minutes: 0, seconds: 0 };\n }\n return {\n expired: false,\n days: Math.floor(remaining / 86400),\n hours: Math.floor((remaining % 86400) / 3600),\n minutes: Math.floor((remaining % 3600) / 60),\n seconds: remaining % 60,\n };\n}\n\nconst STATUS_LABELS: Record<LeaderboardStatus, string> = {\n upcoming: 'Upcoming',\n active: 'Live',\n completed: 'Finished',\n cancelled: 'Cancelled',\n};\n\n/** Glam hero — golden ring, shimmer title, prize-pool headline, glowing countdown. */\n@Component({ selector: OS_LEADERBOARD_CASINO_HERO })\nexport class OsLeaderboardCasinoHero\n extends LitElement\n implements HeroSectionHost\n{\n static styles = [osLeaderboardCasinoTheme, scss(styles)];\n\n @property({ attribute: false })\n section!: OsLeaderboardCasinoHeroSection;\n\n @state()\n private now = Date.now();\n\n /** Animated odometer value shown for `prizePoolValue`. */\n @state()\n private poolDisplay: number | null = null;\n\n @state()\n poolBump = false;\n\n private timer?: ReturnType<typeof setInterval>;\n private poolRaf?: number;\n private bumpTimer?: ReturnType<typeof setTimeout>;\n\n get showBanner(): boolean {\n return Boolean(this.section?.bannerAsset?.url);\n }\n\n get bannerUrl(): string {\n return this.section?.bannerAsset?.url ?? '';\n }\n\n get bannerAlt(): string {\n return this.section?.bannerAsset?.label || '';\n }\n\n get showStatus(): boolean {\n return Boolean(this.section?.status);\n }\n\n get status(): LeaderboardStatus | undefined {\n return this.section?.status;\n }\n\n get statusLabel(): string {\n const status = this.section?.status;\n return status ? STATUS_LABELS[status] : '';\n }\n\n get showActiveDot(): boolean {\n return this.section?.status === 'active';\n }\n\n get showDescription(): boolean {\n return Boolean(this.section?.description);\n }\n\n get showPool(): boolean {\n return this.poolDisplay != null || Boolean(this.section?.prizePool);\n }\n\n get poolValueLabel(): string {\n if (this.poolDisplay != null) return this.formatPool(this.poolDisplay);\n return this.section?.prizePool ?? '';\n }\n\n get poolLabel(): string {\n return this.section?.prizePoolLabel ?? 'Total prize pool';\n }\n\n get showRising(): boolean {\n return this.poolDisplay != null;\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n this.timer = setInterval(() => {\n this.now = Date.now();\n }, 1000);\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n if (this.timer) clearInterval(this.timer);\n if (this.poolRaf) cancelAnimationFrame(this.poolRaf);\n if (this.bumpTimer) clearTimeout(this.bumpTimer);\n }\n\n willUpdate(changed: Map<string, unknown>) {\n if (!changed.has('section')) return;\n const target = this.section?.prizePoolValue;\n if (target == null) {\n this.poolDisplay = null;\n return;\n }\n if (this.poolDisplay == null) {\n this.poolDisplay = target;\n return;\n }\n if (target !== this.poolDisplay) this.animatePool(target);\n }\n\n /** Rolling count-up from the current display value to `target`. */\n private animatePool(target: number) {\n if (this.poolRaf) cancelAnimationFrame(this.poolRaf);\n const from = this.poolDisplay ?? target;\n const duration = 1100;\n const start = performance.now();\n const tick = (t: number) => {\n const p = Math.min(1, (t - start) / duration);\n const eased = 1 - Math.pow(1 - p, 3);\n this.poolDisplay = Math.round(from + (target - from) * eased);\n if (p < 1) this.poolRaf = requestAnimationFrame(tick);\n };\n this.poolRaf = requestAnimationFrame(tick);\n\n if (target > from) {\n this.poolBump = true;\n if (this.bumpTimer) clearTimeout(this.bumpTimer);\n this.bumpTimer = setTimeout(() => {\n this.poolBump = false;\n }, 650);\n }\n }\n\n private formatPool(value: number): string {\n try {\n return new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: this.section?.prizePoolCurrency ?? 'USD',\n maximumFractionDigits: 0,\n }).format(value);\n } catch {\n return value.toLocaleString();\n }\n }\n\n private get isFinished(): boolean {\n const status = this.section?.status;\n if (status === 'completed' || status === 'cancelled') return true;\n if (!this.section?.endTs) return false;\n return countdownTo(this.section.endTs, this.now).expired;\n }\n\n renderCountdown() {\n const endTs = this.section?.endTs;\n if (!endTs) return nothing;\n\n if (this.isFinished) {\n return html`<span class=\"ended\">🏁 Contest finished</span>`;\n }\n\n const c = countdownTo(endTs, this.now);\n const cell = (v: number, label: string) =>\n html`<div class=\"cell\">\n <b>${String(v).padStart(2, '0')}</b><span>${label}</span>\n </div>`;\n\n return html`\n <div class=\"countdown\">\n <span class=\"label\">Ends in</span>\n ${cell(c.days, 'days')}<span class=\"sep\">:</span>\n ${cell(c.hours, 'hours')}<span class=\"sep\">:</span>\n ${cell(c.minutes, 'min')}<span class=\"sep\">:</span>\n ${cell(c.seconds, 'sec')}\n </div>\n `;\n }\n\n render() {\n if (!this.section) return nothing;\n return renderTemplate(this);\n }\n}\n"],"names":["countdownTo","endTs","now","remaining","STATUS_LABELS","OsLeaderboardCasinoHero","LitElement","status","changed","target","from","duration","start","tick","t","p","eased","value","nothing","html","c","cell","v","label","renderTemplate","osLeaderboardCasinoTheme","scss","styles","__decorateClass","property","state","Component","OS_LEADERBOARD_CASINO_HERO"],"mappings":";;;;;;;;;;;;;;;;;AAoBA,SAASA,EAAYC,GAAeC,IAAM,KAAK,OAAuB;AACpE,QAAMC,IAAY,KAAK,OAAO,IAAI,KAAKF,CAAK,EAAE,QAAA,IAAYC,KAAO,GAAI;AACrE,SAAI,CAAC,OAAO,SAASC,CAAS,KAAKA,KAAa,IACvC,EAAE,SAAS,IAAM,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,EAAA,IAE3D;AAAA,IACL,SAAS;AAAA,IACT,MAAM,KAAK,MAAMA,IAAY,KAAK;AAAA,IAClC,OAAO,KAAK,MAAOA,IAAY,QAAS,IAAI;AAAA,IAC5C,SAAS,KAAK,MAAOA,IAAY,OAAQ,EAAE;AAAA,IAC3C,SAASA,IAAY;AAAA,EAAA;AAEzB;AAEA,MAAMC,IAAmD;AAAA,EACvD,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,WAAW;AACb;AAIO,IAAMC,IAAN,cACGC,EAEV;AAAA,EAHO,cAAA;AAAA,UAAA,GAAA,SAAA,GAUL,KAAQ,MAAM,KAAK,IAAA,GAInB,KAAQ,cAA6B,MAGrC,KAAA,WAAW;AAAA,EAAA;AAAA,EAMX,IAAI,aAAsB;AACxB,WAAO,EAAQ,KAAK,SAAS,aAAa;AAAA,EAC5C;AAAA,EAEA,IAAI,YAAoB;AACtB,WAAO,KAAK,SAAS,aAAa,OAAO;AAAA,EAC3C;AAAA,EAEA,IAAI,YAAoB;AACtB,WAAO,KAAK,SAAS,aAAa,SAAS;AAAA,EAC7C;AAAA,EAEA,IAAI,aAAsB;AACxB,WAAO,EAAQ,KAAK,SAAS;AAAA,EAC/B;AAAA,EAEA,IAAI,SAAwC;AAC1C,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA,EAEA,IAAI,cAAsB;AACxB,UAAMC,IAAS,KAAK,SAAS;AAC7B,WAAOA,IAASH,EAAcG,CAAM,IAAI;AAAA,EAC1C;AAAA,EAEA,IAAI,gBAAyB;AAC3B,WAAO,KAAK,SAAS,WAAW;AAAA,EAClC;AAAA,EAEA,IAAI,kBAA2B;AAC7B,WAAO,EAAQ,KAAK,SAAS;AAAA,EAC/B;AAAA,EAEA,IAAI,WAAoB;AACtB,WAAO,KAAK,eAAe,QAAQ,EAAQ,KAAK,SAAS;AAAA,EAC3D;AAAA,EAEA,IAAI,iBAAyB;AAC3B,WAAI,KAAK,eAAe,OAAa,KAAK,WAAW,KAAK,WAAW,IAC9D,KAAK,SAAS,aAAa;AAAA,EACpC;AAAA,EAEA,IAAI,YAAoB;AACtB,WAAO,KAAK,SAAS,kBAAkB;AAAA,EACzC;AAAA,EAEA,IAAI,aAAsB;AACxB,WAAO,KAAK,eAAe;AAAA,EAC7B;AAAA,EAEA,oBAA0B;AACxB,UAAM,kBAAA,GACN,KAAK,QAAQ,YAAY,MAAM;AAC7B,WAAK,MAAM,KAAK,IAAA;AAAA,IAClB,GAAG,GAAI;AAAA,EACT;AAAA,EAEA,uBAA6B;AAC3B,UAAM,qBAAA,GACF,KAAK,SAAO,cAAc,KAAK,KAAK,GACpC,KAAK,WAAS,qBAAqB,KAAK,OAAO,GAC/C,KAAK,aAAW,aAAa,KAAK,SAAS;AAAA,EACjD;AAAA,EAEA,WAAWC,GAA+B;AACxC,QAAI,CAACA,EAAQ,IAAI,SAAS,EAAG;AAC7B,UAAMC,IAAS,KAAK,SAAS;AAC7B,QAAIA,KAAU,MAAM;AAClB,WAAK,cAAc;AACnB;AAAA,IACF;AACA,QAAI,KAAK,eAAe,MAAM;AAC5B,WAAK,cAAcA;AACnB;AAAA,IACF;AACA,IAAIA,MAAW,KAAK,eAAa,KAAK,YAAYA,CAAM;AAAA,EAC1D;AAAA;AAAA,EAGQ,YAAYA,GAAgB;AAClC,IAAI,KAAK,WAAS,qBAAqB,KAAK,OAAO;AACnD,UAAMC,IAAO,KAAK,eAAeD,GAC3BE,IAAW,MACXC,IAAQ,YAAY,IAAA,GACpBC,IAAO,CAACC,MAAc;AAC1B,YAAMC,IAAI,KAAK,IAAI,IAAID,IAAIF,KAASD,CAAQ,GACtCK,IAAQ,IAAI,KAAK,IAAI,IAAID,GAAG,CAAC;AACnC,WAAK,cAAc,KAAK,MAAML,KAAQD,IAASC,KAAQM,CAAK,GACxDD,IAAI,MAAG,KAAK,UAAU,sBAAsBF,CAAI;AAAA,IACtD;AACA,SAAK,UAAU,sBAAsBA,CAAI,GAErCJ,IAASC,MACX,KAAK,WAAW,IACZ,KAAK,aAAW,aAAa,KAAK,SAAS,GAC/C,KAAK,YAAY,WAAW,MAAM;AAChC,WAAK,WAAW;AAAA,IAClB,GAAG,GAAG;AAAA,EAEV;AAAA,EAEQ,WAAWO,GAAuB;AACxC,QAAI;AACF,aAAO,IAAI,KAAK,aAAa,SAAS;AAAA,QACpC,OAAO;AAAA,QACP,UAAU,KAAK,SAAS,qBAAqB;AAAA,QAC7C,uBAAuB;AAAA,MAAA,CACxB,EAAE,OAAOA,CAAK;AAAA,IACjB,QAAQ;AACN,aAAOA,EAAM,eAAA;AAAA,IACf;AAAA,EACF;AAAA,EAEA,IAAY,aAAsB;AAChC,UAAMV,IAAS,KAAK,SAAS;AAC7B,WAAIA,MAAW,eAAeA,MAAW,cAAoB,KACxD,KAAK,SAAS,QACZP,EAAY,KAAK,QAAQ,OAAO,KAAK,GAAG,EAAE,UADhB;AAAA,EAEnC;AAAA,EAEA,kBAAkB;AAChB,UAAMC,IAAQ,KAAK,SAAS;AAC5B,QAAI,CAACA,EAAO,QAAOiB;AAEnB,QAAI,KAAK;AACP,aAAOC;AAGT,UAAMC,IAAIpB,EAAYC,GAAO,KAAK,GAAG,GAC/BoB,IAAO,CAACC,GAAWC,MACvBJ;AAAAA,aACO,OAAOG,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC,aAAaC,CAAK;AAAA;AAGrD,WAAOJ;AAAAA;AAAAA;AAAAA,UAGDE,EAAKD,EAAE,MAAM,MAAM,CAAC;AAAA,UACpBC,EAAKD,EAAE,OAAO,OAAO,CAAC;AAAA,UACtBC,EAAKD,EAAE,SAAS,KAAK,CAAC;AAAA,UACtBC,EAAKD,EAAE,SAAS,KAAK,CAAC;AAAA;AAAA;AAAA,EAG9B;AAAA,EAEA,SAAS;AACP,WAAK,KAAK,UACHI,EAAe,IAAI,IADAN;AAAAA,EAE5B;AACF;AA5Kab,EAIJ,SAAS,CAACoB,GAA0BC,EAAKC,CAAM,CAAC;AAGvDC,EAAA;AAAA,EADCC,EAAS,EAAE,WAAW,GAAA,CAAO;AAAA,GANnBxB,EAOX,WAAA,WAAA,CAAA;AAGQuB,EAAA;AAAA,EADPE,EAAA;AAAM,GATIzB,EAUH,WAAA,OAAA,CAAA;AAIAuB,EAAA;AAAA,EADPE,EAAA;AAAM,GAbIzB,EAcH,WAAA,eAAA,CAAA;AAGRuB,EAAA;AAAA,EADCE,EAAA;AAAM,GAhBIzB,EAiBX,WAAA,YAAA,CAAA;AAjBWA,IAANuB,EAAA;AAAA,EADNG,EAAU,EAAE,UAAUC,EAAA,CAA4B;AAAA,GACtC3B,CAAA;"}
1
+ {"version":3,"file":"hero-section.js","sources":["../../../../../src/components/os-leaderboard-casino/sections/hero-section/hero-section.ts"],"sourcesContent":["import { LitElement, html, nothing } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { Component } from '@oddsmith/lib/lit/component.js';\nimport { scss } from '@oddsmith/lib/lit/scss.js';\nimport { OS_LEADERBOARD_CASINO_HERO } from '@os-leaderboard-casino/constants/tags.js';\nimport { osLeaderboardCasinoTheme } from '@os-leaderboard-casino/theme/index.js';\nimport type { LeaderboardStatus } from '@os-leaderboard-casino/types/data.js';\nimport type { OsLeaderboardCasinoHeroSection } from '@os-leaderboard-casino/types/sections.js';\nimport type { HeroSectionHost } from './hero-section.host.js';\nimport renderTemplate from './hero-section.html?lit-html';\nimport styles from './hero-section.scss?inline';\n\ninterface CountdownParts {\n expired: boolean;\n days: number;\n hours: number;\n minutes: number;\n seconds: number;\n}\n\nfunction countdownTo(endTs: string, now = Date.now()): CountdownParts {\n const remaining = Math.floor((new Date(endTs).getTime() - now) / 1000);\n if (!Number.isFinite(remaining) || remaining <= 0) {\n return { expired: true, days: 0, hours: 0, minutes: 0, seconds: 0 };\n }\n return {\n expired: false,\n days: Math.floor(remaining / 86400),\n hours: Math.floor((remaining % 86400) / 3600),\n minutes: Math.floor((remaining % 3600) / 60),\n seconds: remaining % 60,\n };\n}\n\nconst STATUS_LABELS: Record<LeaderboardStatus, string> = {\n upcoming: 'Upcoming',\n active: 'Live',\n completed: 'Finished',\n cancelled: 'Cancelled',\n};\n\n/** Glam hero — golden ring, shimmer title, prize-pool headline, glowing countdown. */\n@Component({ selector: OS_LEADERBOARD_CASINO_HERO })\nexport class OsLeaderboardCasinoHero\n extends LitElement\n implements HeroSectionHost\n{\n static styles = [osLeaderboardCasinoTheme, scss(styles)];\n\n @property({ attribute: false })\n section!: OsLeaderboardCasinoHeroSection;\n\n @state()\n private now = Date.now();\n\n /** Animated odometer value shown for `prizePoolValue`. */\n @state()\n private poolDisplay: number | null = null;\n\n @state()\n poolBump = false;\n\n private timer?: ReturnType<typeof setInterval>;\n private poolRaf?: number;\n private bumpTimer?: ReturnType<typeof setTimeout>;\n\n get showBanner(): boolean {\n return Boolean(this.section?.bannerAsset?.url);\n }\n\n get bannerUrl(): string {\n return this.section?.bannerAsset?.url ?? '';\n }\n\n get bannerAlt(): string {\n return this.section?.bannerAsset?.label || '';\n }\n\n get showStatus(): boolean {\n return Boolean(this.section?.status);\n }\n\n get status(): LeaderboardStatus | undefined {\n return this.section?.status;\n }\n\n get statusLabel(): string {\n const status = this.section?.status;\n return status ? STATUS_LABELS[status] : '';\n }\n\n get showActiveDot(): boolean {\n return this.section?.status === 'active';\n }\n\n get showDescription(): boolean {\n return Boolean(this.section?.description);\n }\n\n get showPool(): boolean {\n return this.poolDisplay != null || Boolean(this.section?.prizePool);\n }\n\n get poolValueLabel(): string {\n if (this.poolDisplay != null) return this.formatPool(this.poolDisplay);\n return this.section?.prizePool ?? '';\n }\n\n get poolLabel(): string {\n return this.section?.prizePoolLabel ?? 'Total prize pool';\n }\n\n get showRising(): boolean {\n return this.poolDisplay != null;\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n this.timer = setInterval(() => {\n this.now = Date.now();\n }, 1000);\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n if (this.timer) clearInterval(this.timer);\n if (this.poolRaf) cancelAnimationFrame(this.poolRaf);\n if (this.bumpTimer) clearTimeout(this.bumpTimer);\n }\n\n willUpdate(changed: Map<string, unknown>) {\n if (!changed.has('section')) return;\n const target = this.section?.prizePoolValue;\n if (target == null) {\n this.poolDisplay = null;\n return;\n }\n if (this.poolDisplay == null) {\n this.poolDisplay = target;\n return;\n }\n if (target !== this.poolDisplay) this.animatePool(target);\n }\n\n /** Rolling count-up from the current display value to `target`. */\n private animatePool(target: number) {\n if (this.poolRaf) cancelAnimationFrame(this.poolRaf);\n const from = this.poolDisplay ?? target;\n const duration = 1100;\n const start = performance.now();\n const tick = (t: number) => {\n const p = Math.min(1, (t - start) / duration);\n const eased = 1 - Math.pow(1 - p, 3);\n this.poolDisplay = Math.round(from + (target - from) * eased);\n if (p < 1) this.poolRaf = requestAnimationFrame(tick);\n };\n this.poolRaf = requestAnimationFrame(tick);\n\n if (target > from) {\n this.poolBump = true;\n if (this.bumpTimer) clearTimeout(this.bumpTimer);\n this.bumpTimer = setTimeout(() => {\n this.poolBump = false;\n }, 650);\n }\n }\n\n private formatPool(value: number): string {\n try {\n return new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: this.section?.prizePoolCurrency ?? 'USD',\n maximumFractionDigits: 0,\n }).format(value);\n } catch {\n return value.toLocaleString();\n }\n }\n\n private get isFinished(): boolean {\n const status = this.section?.status;\n if (status === 'completed' || status === 'cancelled') return true;\n if (!this.section?.endTs) return false;\n return countdownTo(this.section.endTs, this.now).expired;\n }\n\n renderCountdown() {\n const endTs = this.section?.endTs;\n if (!endTs) return nothing;\n\n if (this.isFinished) {\n return html`<span class=\"ended\">🏁 Contest finished</span>`;\n }\n\n const c = countdownTo(endTs, this.now);\n const cell = (v: number, label: string) =>\n html`<div class=\"cell\">\n <b>${String(v).padStart(2, '0')}</b><span>${label}</span>\n </div>`;\n\n return html`\n <div class=\"countdown\">\n <span class=\"label\">Ends in</span>\n <div class=\"countdown-track\">\n ${cell(c.days, 'days')}<span class=\"sep\">:</span>\n ${cell(c.hours, 'hours')}<span class=\"sep\">:</span>\n ${cell(c.minutes, 'min')}<span class=\"sep\">:</span>\n ${cell(c.seconds, 'sec')}\n </div>\n </div>\n `;\n }\n\n render() {\n if (!this.section) return nothing;\n return renderTemplate(this);\n }\n}\n"],"names":["countdownTo","endTs","now","remaining","STATUS_LABELS","OsLeaderboardCasinoHero","LitElement","status","changed","target","from","duration","start","tick","t","p","eased","value","nothing","html","c","cell","v","label","renderTemplate","osLeaderboardCasinoTheme","scss","styles","__decorateClass","property","state","Component","OS_LEADERBOARD_CASINO_HERO"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- const e = ':host{display:block;width:100%}.hero{position:relative;overflow:hidden;border-radius:var(--radius-sm);border:1px solid var(--panel-border);background:radial-gradient(90% 130% at 50% -20%,color-mix(in srgb,var(--violet) 22%,transparent),transparent 55%),radial-gradient(70% 110% at 12% 110%,color-mix(in srgb,var(--gold) 16%,transparent),transparent 58%),radial-gradient(65% 100% at 88% 108%,color-mix(in srgb,var(--gold) 12%,transparent),transparent 62%),var(--panel-bg);box-shadow:var(--panel-shadow);text-align:center;padding:clamp(26px,5vw,44px) clamp(18px,4vw,36px) clamp(22px,4vw,34px)}.hero:before{content:"";position:absolute;top:120%;left:50%;width:150%;aspect-ratio:1;transform:translate(-50%,-50%);transform-origin:50% 50%;background:conic-gradient(from 0deg,transparent 0deg,transparent 45deg,color-mix(in srgb,var(--gold) 24%,transparent) 55deg,color-mix(in srgb,var(--gold) 20%,transparent) 58deg,transparent 67deg,transparent 198deg,color-mix(in srgb,var(--violet) 22%,transparent) 208deg,color-mix(in srgb,var(--violet) 16%,transparent) 211deg,transparent 220deg,transparent 360deg);filter:blur(28px);opacity:.92;animation:halo 16s linear infinite;pointer-events:none;z-index:0}@keyframes halo{to{transform:translate(-50%,-50%) rotate(360deg)}}@media(max-width:640px){.hero:before{top:100%;width:215%}}.banner-img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;opacity:.22;z-index:0}.inner{position:relative;z-index:1}.status{display:inline-flex;align-items:center;gap:7px;font-size:10.5px;font-weight:800;letter-spacing:.14em;text-transform:uppercase;padding:6px 14px;border-radius:999px;background:var(--panel-bg);border:1px solid var(--panel-border);color:var(--text-dim)}.status.active{color:var(--green);border-color:color-mix(in srgb,var(--green) 45%,transparent)}.status.active .dot{width:7px;height:7px;border-radius:50%;background:var(--green);animation:pulse 1.6s ease-in-out infinite}.status.completed{color:var(--gold);border-color:var(--hairline-gold)}.status.cancelled{color:var(--red)}@keyframes pulse{0%,to{opacity:1}50%{opacity:.35}}h2{margin:16px 0 0;font-family:var(--font-display);font-size:clamp(26px,5.4vw,40px);font-weight:800;letter-spacing:-.02em;line-height:1.12;background:var(--gold-gradient);background-size:200% auto;background-position:0% center;-webkit-background-clip:text;background-clip:text;color:transparent;animation:shimmer 5.5s linear infinite;text-wrap:balance}@keyframes shimmer{0%{background-position:0% center}to{background-position:200% center}}.description{margin:12px auto 0;font-size:13.5px;line-height:1.6;color:var(--text-dim);max-width:52ch}.pool{margin-top:22px;display:inline-flex;flex-direction:column;align-items:center;gap:4px;padding:14px 34px;border-radius:16px;background:var(--panel-bg);border:1px solid var(--panel-border);box-shadow:var(--panel-shadow)}.pool .label{font-size:10px;font-weight:800;letter-spacing:.2em;text-transform:uppercase;color:var(--text-faint)}.pool .value{font-family:var(--font-mono);font-size:clamp(28px,5vw,38px);font-weight:800;color:var(--gold-strong);text-shadow:0 0 26px var(--gold-glow);line-height:1.1;font-variant-numeric:tabular-nums;transition:text-shadow .3s ease}.pool .value.bump{animation:pool-bump .6s ease}@keyframes pool-bump{0%{transform:scale(1)}35%{transform:scale(1.06);text-shadow:0 0 42px var(--gold-glow),0 0 12px var(--gold-strong)}to{transform:scale(1)}}.pool .rising{display:inline-flex;align-items:center;gap:4px;margin-top:2px;font-size:9.5px;font-weight:800;letter-spacing:.14em;text-transform:uppercase;color:var(--green)}.pool .rising i{width:5px;height:5px;border-radius:50%;background:var(--green);animation:pulse 1.6s ease-in-out infinite}.countdown{display:flex;align-items:center;justify-content:center;gap:8px;margin-top:22px;flex-wrap:wrap}.countdown .label{width:100%;font-size:10px;font-weight:800;letter-spacing:.2em;text-transform:uppercase;color:var(--text-faint);margin-bottom:2px}.cell{min-width:60px;text-align:center;background:var(--panel-bg);border:1px solid var(--panel-border);border-radius:var(--radius-sm);padding:9px 10px 8px}.cell b{display:block;font-family:var(--font-mono);font-size:21px;font-weight:800;color:var(--text);line-height:1.1}.cell span{display:block;margin-top:3px;font-size:9px;font-weight:700;letter-spacing:.12em;text-transform:uppercase;color:var(--text-faint)}.sep{font-family:var(--font-mono);font-size:18px;font-weight:800;color:var(--gold);opacity:.7}@media(max-width:480px){.cell{min-width:48px;padding:8px 6px 7px}.cell b{font-size:18px}.countdown{gap:5px}.sep{font-size:15px}}.ended{display:inline-flex;align-items:center;gap:8px;margin-top:22px;padding:10px 20px;border-radius:var(--radius-sm);background:var(--gold-soft);border:1px solid var(--hairline-gold);color:var(--gold);font-weight:700;font-size:14px}';
1
+ const e = ':host{display:block;width:100%}.hero{position:relative;overflow:hidden;border-radius:var(--radius-sm);border:1px solid var(--panel-border);background:radial-gradient(90% 130% at 50% -20%,color-mix(in srgb,var(--violet) 22%,transparent),transparent 55%),radial-gradient(70% 110% at 12% 110%,color-mix(in srgb,var(--gold) 16%,transparent),transparent 58%),radial-gradient(65% 100% at 88% 108%,color-mix(in srgb,var(--gold) 12%,transparent),transparent 62%),var(--panel-bg);box-shadow:var(--panel-shadow);text-align:center;padding:clamp(26px,5vw,44px) clamp(18px,4vw,36px) clamp(22px,4vw,34px)}.hero:before{content:"";position:absolute;top:120%;left:50%;width:150%;aspect-ratio:1;transform:translate(-50%,-50%);transform-origin:50% 50%;background:conic-gradient(from 0deg,transparent 0deg,transparent 45deg,color-mix(in srgb,var(--gold) 24%,transparent) 55deg,color-mix(in srgb,var(--gold) 20%,transparent) 58deg,transparent 67deg,transparent 198deg,color-mix(in srgb,var(--violet) 22%,transparent) 208deg,color-mix(in srgb,var(--violet) 16%,transparent) 211deg,transparent 220deg,transparent 360deg);filter:blur(28px);opacity:.92;animation:halo 16s linear infinite;pointer-events:none;z-index:0}@keyframes halo{to{transform:translate(-50%,-50%) rotate(360deg)}}@media(max-width:640px){.hero:before{top:100%;width:215%}}.banner-img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;opacity:.22;z-index:0}.inner{position:relative;z-index:1}.status{display:inline-flex;align-items:center;gap:7px;font-size:10.5px;font-weight:800;letter-spacing:.14em;text-transform:uppercase;padding:6px 14px;border-radius:999px;background:var(--panel-bg);border:1px solid var(--panel-border);color:var(--text-dim)}.status.active{color:var(--green);border-color:color-mix(in srgb,var(--green) 45%,transparent)}.status.active .dot{width:7px;height:7px;border-radius:50%;background:var(--green);animation:pulse 1.6s ease-in-out infinite}.status.completed{color:var(--gold);border-color:var(--hairline-gold)}.status.cancelled{color:var(--red)}@keyframes pulse{0%,to{opacity:1}50%{opacity:.35}}h2{margin:16px 0 0;font-family:var(--font-display);font-size:clamp(26px,5.4vw,40px);font-weight:800;letter-spacing:-.02em;line-height:1.12;background:var(--gold-gradient);background-size:200% auto;background-position:0% center;-webkit-background-clip:text;background-clip:text;color:transparent;animation:shimmer 5.5s linear infinite;text-wrap:balance}@keyframes shimmer{0%{background-position:0% center}to{background-position:200% center}}.description{margin:12px auto 0;font-size:13.5px;line-height:1.6;color:var(--text-dim);max-width:52ch}.pool{margin-top:22px;display:inline-flex;flex-direction:column;align-items:center;gap:4px;padding:14px 34px;border-radius:16px;background:var(--panel-bg);border:1px solid var(--panel-border);box-shadow:var(--panel-shadow)}.pool .label{font-size:10px;font-weight:800;letter-spacing:.2em;text-transform:uppercase;color:var(--text-faint)}.pool .value{font-family:var(--font-mono);font-size:clamp(28px,5vw,38px);font-weight:800;color:var(--gold-strong);text-shadow:0 0 26px var(--gold-glow);line-height:1.1;font-variant-numeric:tabular-nums;transition:text-shadow .3s ease}.pool .value.bump{animation:pool-bump .6s ease}@keyframes pool-bump{0%{transform:scale(1)}35%{transform:scale(1.06);text-shadow:0 0 42px var(--gold-glow),0 0 12px var(--gold-strong)}to{transform:scale(1)}}.pool .rising{display:inline-flex;align-items:center;gap:4px;margin-top:2px;font-size:9.5px;font-weight:800;letter-spacing:.14em;text-transform:uppercase;color:var(--green)}.pool .rising i{width:5px;height:5px;border-radius:50%;background:var(--green);animation:pulse 1.6s ease-in-out infinite}.countdown{--countdown-cell-size: 60px;--countdown-digit-size: 21px;--countdown-unit-size: 9px;--countdown-sep-size: 18px;--countdown-track-gap: 6px;display:flex;flex-direction:column;align-items:center;gap:8px;margin-top:22px}.countdown .label{font-size:10px;font-weight:800;letter-spacing:.2em;text-transform:uppercase;color:var(--text-faint)}.countdown-track{display:inline-grid;grid-template-columns:var(--countdown-cell-size) auto var(--countdown-cell-size) auto var(--countdown-cell-size) auto var(--countdown-cell-size);column-gap:var(--countdown-track-gap);align-items:center;justify-items:center;max-width:100%}.countdown-track>.cell{width:var(--countdown-cell-size);height:var(--countdown-cell-size);min-width:var(--countdown-cell-size);max-width:var(--countdown-cell-size);min-height:var(--countdown-cell-size);max-height:var(--countdown-cell-size);box-sizing:border-box;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;background:var(--panel-bg);border:1px solid var(--panel-border);border-radius:var(--radius-sm);padding:0;overflow:hidden;grid-column:span 1}.countdown-track>.cell b{display:block;width:100%;font-family:var(--font-mono);font-size:var(--countdown-digit-size);font-weight:800;color:var(--text);line-height:1}.countdown-track>.cell span{display:block;width:100%;margin-top:3px;font-size:var(--countdown-unit-size);font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--text-faint);line-height:1;white-space:nowrap}.countdown-track>.sep{flex:none;text-align:center;font-family:var(--font-mono);font-size:var(--countdown-sep-size);font-weight:800;color:var(--gold);opacity:.7;line-height:1}@media(max-width:545px){.countdown{--countdown-cell-size: 52px;--countdown-digit-size: 18px;--countdown-unit-size: 8px;--countdown-sep-size: 15px}}@media(max-width:420px){.countdown{--countdown-cell-size: 44px;--countdown-digit-size: 14px;--countdown-unit-size: 7px;--countdown-sep-size: 11px}.countdown .label{font-size:9px;letter-spacing:.16em}}.ended{display:inline-flex;align-items:center;gap:8px;margin-top:22px;padding:10px 20px;border-radius:var(--radius-sm);background:var(--gold-soft);border:1px solid var(--hairline-gold);color:var(--gold);font-weight:700;font-size:14px}';
2
2
  export {
3
3
  e as default
4
4
  };
@@ -1,4 +1,4 @@
1
- const o = '@charset "UTF-8";:host{display:block;width:100%}.strategy{font-size:9.5px;font-weight:800;letter-spacing:.12em;text-transform:uppercase;padding:4px 10px;border-radius:999px;background:var(--violet-soft);border:1px solid color-mix(in srgb,var(--violet) 40%,transparent);color:#c9adff}.podium{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px;align-items:end}.slot{position:relative;overflow:hidden;border-radius:var(--radius-sm);padding:16px 12px 14px;text-align:center;border:1px solid var(--panel-border);background:var(--panel-bg);box-shadow:var(--panel-shadow);transition:transform var(--transition-fast),box-shadow var(--transition-fast)}.slot:hover{transform:translateY(-3px)}.slot.first{order:2;padding-top:22px;padding-bottom:20px;border-color:var(--panel-border);background:radial-gradient(120% 90% at 50% -10%,color-mix(in srgb,var(--gold) 18%,transparent),transparent 60%),var(--panel-bg);box-shadow:var(--panel-shadow)}.slot.second{order:1;border-color:var(--panel-border);background:var(--panel-bg)}.slot.third{order:3;border-color:var(--panel-border);background:var(--panel-bg)}.coin{display:flex;justify-content:center;min-height:52px}.slot.first .coin{min-height:68px}.place{margin-top:7px;font-size:9px;font-weight:800;letter-spacing:.16em;text-transform:uppercase;color:var(--text-faint)}.slot.first .place{color:var(--gold)}.slot.second .place{color:var(--silver)}.slot.third .place{color:var(--bronze)}.slot .name{margin-top:5px;font-size:12px;font-weight:700;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.slot .value{margin-top:6px;font-family:var(--font-mono);font-size:16px;font-weight:800;color:var(--gold-strong)}.slot.first .value{font-size:20px;text-shadow:0 0 18px var(--gold-glow)}.list{display:flex;flex-direction:column;gap:7px;margin-top:10px}.tier{display:flex;align-items:center;gap:12px;width:100%;text-align:left;font-family:var(--font-body);padding:11px 14px;background:var(--panel-bg);border:1px solid var(--panel-border);border-radius:var(--radius-sm);box-shadow:var(--panel-shadow);transition:border-color var(--transition-fast)}.tier:hover{border-color:var(--hairline-gold)}.tier .icon{flex:none;display:grid;place-items:center;line-height:0}.tier .icon svg{width:28px;height:28px}.tier .info{flex:1;min-width:0}.tier .name{font-size:13px;font-weight:700;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tier .range{margin-top:1px;font-size:11px;color:var(--text-dim)}.tier .value{flex:none;font-family:var(--font-mono);font-size:13.5px;font-weight:700;color:var(--gold)}@media(max-width:480px){.slot .value{font-size:13.5px}.slot.first .value{font-size:16px}}';
1
+ const o = '@charset "UTF-8";:host{display:block;width:100%}.strategy{font-size:9.5px;font-weight:800;letter-spacing:.12em;text-transform:uppercase;padding:4px 10px;border-radius:999px;background:var(--violet-soft);border:1px solid color-mix(in srgb,var(--violet) 40%,transparent);color:#c9adff}.podium{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px;align-items:end}.slot{position:relative;overflow:hidden;border-radius:var(--radius-sm);padding:16px 12px 14px;text-align:center;border:1px solid var(--panel-border);background:var(--panel-bg);box-shadow:var(--panel-shadow);transition:transform var(--transition-fast),box-shadow var(--transition-fast)}.slot:hover{transform:translateY(-3px)}.slot.first{order:2;padding-top:22px;padding-bottom:20px;border-color:var(--panel-border);background:radial-gradient(120% 90% at 50% -10%,color-mix(in srgb,var(--gold) 18%,transparent),transparent 60%),var(--panel-bg);box-shadow:var(--panel-shadow)}.slot.second{order:1;border-color:var(--panel-border);background:var(--panel-bg)}.slot.third{order:3;border-color:var(--panel-border);background:var(--panel-bg)}.coin{display:flex;justify-content:center;min-height:52px}.slot.first .coin{min-height:68px}.place{margin-top:7px;font-size:9px;font-weight:800;letter-spacing:.16em;text-transform:uppercase;color:var(--text-faint)}.slot.first .place{color:var(--gold)}.slot.second .place{color:var(--silver)}.slot.third .place{color:var(--bronze)}.slot .name{margin-top:5px;font-size:12px;font-weight:700;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.slot .value{margin-top:6px;font-family:var(--font-mono);font-size:16px;font-weight:800;color:var(--gold-strong)}.slot.first .value{font-size:20px;text-shadow:0 0 18px var(--gold-glow)}.list{display:flex;flex-direction:column;gap:7px;margin-top:10px}.tier{display:flex;align-items:center;gap:12px;width:100%;text-align:left;font-family:var(--font-body);padding:11px 14px;background:var(--panel-bg);border:1px solid var(--panel-border);border-radius:var(--radius-sm);box-shadow:var(--panel-shadow);transition:border-color var(--transition-fast)}.tier:hover{border-color:var(--hairline-gold)}.tier .icon{flex:none;display:grid;place-items:center;line-height:0}.tier .icon svg{width:28px;height:28px}.tier .info{flex:1;min-width:0}.tier .name{font-size:13px;font-weight:700;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tier .range{margin-top:1px;font-size:11px;color:var(--text-dim)}.tier .value{flex:none;font-family:var(--font-mono);font-size:13.5px;font-weight:700;color:var(--gold)}@media(max-width:480px){.slot .value{font-size:13.5px}.slot.first .value{font-size:16px}}@media(max-width:420px){.podium{gap:8px}.slot{padding:14px 8px 12px}.slot.first{padding-top:18px;padding-bottom:16px}.slot .name{font-size:11px;letter-spacing:-.01em}}';
2
2
  export {
3
3
  o as default
4
4
  };
@@ -37,6 +37,6 @@ export interface LeaderboardCasinoAssetsBundle {
37
37
  export interface LeaderboardCasinoAssetsInput {
38
38
  /** Full bundle — preferred when parent already loaded JSON. */
39
39
  bundle?: LeaderboardCasinoAssetsBundle | null;
40
- /** e.g. `/assets/producer_output/os-leaderboard-casino/free` — loads `bundle.json`. */
40
+ /** e.g. `/os-leaderboard-casino-config/free` — loads JSON from producer output. */
41
41
  baseUrl?: string;
42
42
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oddsmith/ui",
3
- "version": "1.0.2",
3
+ "version": "1.0.4",
4
4
  "description": "Brandable casino leaderboard web component",
5
5
  "keywords": [
6
6
  "casino",