@oddsmith/ui 1.0.0 → 1.0.1

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.
Files changed (115) hide show
  1. package/README.md +1 -1
  2. package/dist/components/os-leaderboard-casino/assets/fallback/config.json +1 -1
  3. package/dist/components/os-leaderboard-casino/assets/fallback/defaults/glam-sections.json +3 -3
  4. package/dist/components/os-leaderboard-casino/assets/fallback/labels.json +1 -1
  5. package/dist/components/os-leaderboard-casino/assets/fallback/labels.json.js +7 -7
  6. package/dist/components/os-leaderboard-casino/assets/fallback/manifest.json +1 -1
  7. package/dist/components/os-leaderboard-casino/assets/fallback/presets.json +1 -1
  8. package/dist/components/os-leaderboard-casino/assets/fallback/presets.json.js +1 -1
  9. package/dist/components/os-leaderboard-casino/assets/fallback/resolved-presets.json +4 -4
  10. package/dist/components/os-leaderboard-casino/assets/fallback/resolved-presets.json.js +1 -1
  11. package/dist/components/os-leaderboard-casino/constants/defaults.d.ts +8 -0
  12. package/dist/components/os-leaderboard-casino/constants/index.d.ts +2 -0
  13. package/dist/components/os-leaderboard-casino/constants/tags.d.ts +22 -0
  14. package/dist/components/os-leaderboard-casino/constants/tags.js +6 -4
  15. package/dist/components/os-leaderboard-casino/constants/tags.js.map +1 -1
  16. package/dist/components/os-leaderboard-casino/container/os-leaderboard-casino.d.ts +35 -0
  17. package/dist/components/os-leaderboard-casino/container/os-leaderboard-casino.host.d.ts +13 -0
  18. package/dist/components/os-leaderboard-casino/container/os-leaderboard-casino.js +5 -5
  19. package/dist/components/os-leaderboard-casino/index.d.ts +36 -0
  20. package/dist/components/os-leaderboard-casino/index.js +23 -23
  21. package/dist/components/os-leaderboard-casino/integration/assemble-assets.d.ts +21 -0
  22. package/dist/components/os-leaderboard-casino/integration/assets-context.d.ts +26 -0
  23. package/dist/components/os-leaderboard-casino/integration/defaults-glam.d.ts +14 -0
  24. package/dist/components/os-leaderboard-casino/integration/defaults-new-money.d.ts +3 -0
  25. package/dist/components/os-leaderboard-casino/integration/index.d.ts +5 -0
  26. package/dist/components/os-leaderboard-casino/integration/labels.d.ts +1 -0
  27. package/dist/components/os-leaderboard-casino/integration/load-assets.d.ts +9 -0
  28. package/dist/components/os-leaderboard-casino/integration/presets.d.ts +1 -0
  29. package/dist/components/os-leaderboard-casino/integration/resolve-input.d.ts +20 -0
  30. package/dist/components/os-leaderboard-casino/integration/resolve-input.js +3 -3
  31. package/dist/components/os-leaderboard-casino/integration/themes.d.ts +1 -0
  32. package/dist/components/os-leaderboard-casino/sections/climb-section/climb-section.d.ts +19 -0
  33. package/dist/components/os-leaderboard-casino/sections/climb-section/climb-section.host.d.ts +15 -0
  34. package/dist/components/os-leaderboard-casino/sections/events-banner/components/event-icons.d.ts +5 -0
  35. package/dist/components/os-leaderboard-casino/sections/events-banner/events-banner.d.ts +16 -0
  36. package/dist/components/os-leaderboard-casino/sections/events-banner/events-banner.host.d.ts +8 -0
  37. package/dist/components/os-leaderboard-casino/sections/events-banner/events-banner.js +1 -0
  38. package/dist/components/os-leaderboard-casino/sections/events-banner/events-banner.js.map +1 -1
  39. package/dist/components/os-leaderboard-casino/sections/footer-section/footer-section.d.ts +10 -0
  40. package/dist/components/os-leaderboard-casino/sections/footer-section/footer-section.host.d.ts +3 -0
  41. package/dist/components/os-leaderboard-casino/sections/footer-section/footer-section.js +1 -0
  42. package/dist/components/os-leaderboard-casino/sections/footer-section/footer-section.js.map +1 -1
  43. package/dist/components/os-leaderboard-casino/sections/games-section/components/game-images.d.ts +1 -0
  44. package/dist/components/os-leaderboard-casino/sections/games-section/games-section.d.ts +20 -0
  45. package/dist/components/os-leaderboard-casino/sections/games-section/games-section.host.d.ts +7 -0
  46. package/dist/components/os-leaderboard-casino/sections/header-section/header-section.d.ts +12 -0
  47. package/dist/components/os-leaderboard-casino/sections/header-section/header-section.host.d.ts +8 -0
  48. package/dist/components/os-leaderboard-casino/sections/hero-section/hero-section.d.ts +37 -0
  49. package/dist/components/os-leaderboard-casino/sections/hero-section/hero-section.host.d.ts +20 -0
  50. package/dist/components/os-leaderboard-casino/sections/hero-section/hero-section.js +1 -0
  51. package/dist/components/os-leaderboard-casino/sections/hero-section/hero-section.js.map +1 -1
  52. package/dist/components/os-leaderboard-casino/sections/legals-section/legals-section.d.ts +18 -0
  53. package/dist/components/os-leaderboard-casino/sections/legals-section/legals-section.host.d.ts +8 -0
  54. package/dist/components/os-leaderboard-casino/sections/legals-section/legals-section.js +1 -0
  55. package/dist/components/os-leaderboard-casino/sections/legals-section/legals-section.js.map +1 -1
  56. package/dist/components/os-leaderboard-casino/sections/live-feed-section/live-feed-section.d.ts +13 -0
  57. package/dist/components/os-leaderboard-casino/sections/live-feed-section/live-feed-section.host.d.ts +8 -0
  58. package/dist/components/os-leaderboard-casino/sections/marquee-section/components/win-icons.d.ts +3 -0
  59. package/dist/components/os-leaderboard-casino/sections/marquee-section/marquee-item.d.ts +14 -0
  60. package/dist/components/os-leaderboard-casino/sections/marquee-section/marquee-section.d.ts +42 -0
  61. package/dist/components/os-leaderboard-casino/sections/marquee-section/marquee-section.host.d.ts +8 -0
  62. package/dist/components/os-leaderboard-casino/sections/marquee-section/marquee-variants.d.ts +6 -0
  63. package/dist/components/os-leaderboard-casino/sections/prize-section/components/medal-coin/medal-coin.d.ts +16 -0
  64. package/dist/components/os-leaderboard-casino/sections/prize-section/components/medal-coin/medal-coin.js +71 -0
  65. package/dist/components/os-leaderboard-casino/sections/prize-section/components/medal-coin/medal-coin.js.map +1 -0
  66. package/dist/components/os-leaderboard-casino/sections/prize-section/components/medal-coin/medal-coin.scss.js +5 -0
  67. package/dist/components/os-leaderboard-casino/sections/prize-section/components/medal-coin/medal-coin.scss.js.map +1 -0
  68. package/dist/components/os-leaderboard-casino/sections/prize-section/prize-section.d.ts +23 -0
  69. package/dist/components/os-leaderboard-casino/sections/prize-section/prize-section.host.d.ts +11 -0
  70. package/dist/components/os-leaderboard-casino/sections/prize-section/prize-section.js +15 -14
  71. package/dist/components/os-leaderboard-casino/sections/prize-section/prize-section.js.map +1 -1
  72. package/dist/components/os-leaderboard-casino/sections/stats-section/components/stat-band/stat-band.d.ts +17 -0
  73. package/dist/components/os-leaderboard-casino/sections/stats-section/components/stat-card/stat-card.d.ts +15 -0
  74. package/dist/components/os-leaderboard-casino/sections/stats-section/components/stat-chip/stat-chip.d.ts +17 -0
  75. package/dist/components/os-leaderboard-casino/sections/stats-section/components/stat-gauge/stat-gauge.d.ts +14 -0
  76. package/dist/components/os-leaderboard-casino/sections/stats-section/components/stat-icons.d.ts +5 -0
  77. package/dist/components/os-leaderboard-casino/sections/stats-section/components/stat-icons.js +11 -0
  78. package/dist/components/os-leaderboard-casino/sections/stats-section/components/stat-icons.js.map +1 -0
  79. package/dist/components/os-leaderboard-casino/sections/stats-section/components/stat-meter/stat-meter.d.ts +17 -0
  80. package/dist/components/os-leaderboard-casino/sections/stats-section/components/stat-rail/stat-rail.d.ts +17 -0
  81. package/dist/components/os-leaderboard-casino/sections/stats-section/components/stat-rail/stat-rail.js +61 -0
  82. package/dist/components/os-leaderboard-casino/sections/stats-section/components/stat-rail/stat-rail.js.map +1 -0
  83. package/dist/components/os-leaderboard-casino/sections/stats-section/components/stat-rail/stat-rail.scss.js +5 -0
  84. package/dist/components/os-leaderboard-casino/sections/stats-section/components/stat-rail/stat-rail.scss.js.map +1 -0
  85. package/dist/components/os-leaderboard-casino/sections/stats-section/stats-section.d.ts +16 -0
  86. package/dist/components/os-leaderboard-casino/sections/stats-section/stats-section.host.d.ts +13 -0
  87. package/dist/components/os-leaderboard-casino/sections/stats-section/stats-section.js +14 -12
  88. package/dist/components/os-leaderboard-casino/sections/stats-section/stats-section.js.map +1 -1
  89. package/dist/components/os-leaderboard-casino/sections/table-section/table-section.d.ts +31 -0
  90. package/dist/components/os-leaderboard-casino/sections/table-section/table-section.host.d.ts +15 -0
  91. package/dist/components/os-leaderboard-casino/sections/table-section/table-section.js +1 -0
  92. package/dist/components/os-leaderboard-casino/sections/table-section/table-section.js.map +1 -1
  93. package/dist/components/os-leaderboard-casino/services/adapter.service.d.ts +11 -0
  94. package/dist/components/os-leaderboard-casino/services/icon.service.d.ts +28 -0
  95. package/dist/components/os-leaderboard-casino/services/index.d.ts +2 -0
  96. package/dist/components/os-leaderboard-casino/theme/index.d.ts +3 -0
  97. package/dist/components/os-leaderboard-casino/theme/prize-icons.d.ts +1 -0
  98. package/dist/components/os-leaderboard-casino/theme/prize-resolve.d.ts +5 -0
  99. package/dist/components/os-leaderboard-casino/theme/styles.d.ts +9 -0
  100. package/dist/components/os-leaderboard-casino/theme/vip-icons.d.ts +2 -0
  101. package/dist/components/os-leaderboard-casino/theme/vip-mark.d.ts +7 -0
  102. package/dist/components/os-leaderboard-casino/types/assets.d.ts +40 -0
  103. package/dist/components/os-leaderboard-casino/types/data.d.ts +106 -0
  104. package/dist/components/os-leaderboard-casino/types/events.d.ts +18 -0
  105. package/dist/components/os-leaderboard-casino/types/icons.d.ts +18 -0
  106. package/dist/components/os-leaderboard-casino/types/input.d.ts +73 -0
  107. package/dist/components/os-leaderboard-casino/types/ledger.d.ts +67 -0
  108. package/dist/components/os-leaderboard-casino/types/sections.d.ts +200 -0
  109. package/dist/components/os-leaderboard-casino/types/state.d.ts +69 -0
  110. package/dist/shared/lib/lit/component.d.ts +5 -0
  111. package/dist/shared/lib/lit/safe-custom-element.d.ts +5 -0
  112. package/dist/shared/lib/lit/scss.d.ts +3 -0
  113. package/dist/shared/lib/lit/template.d.ts +3 -0
  114. package/package.json +3 -2
  115. package/dist/index.d.ts +0 -734
@@ -0,0 +1,23 @@
1
+ import { LitElement, nothing } from 'lit';
2
+ import { OsLeaderboardCasinoPrizeSection } from '../../types/sections.js';
3
+ import { PrizeSectionHost } from './prize-section.host.js';
4
+ /** Top-3 metallic podium showcase + remaining prize tiers. */
5
+ export declare class OsLeaderboardCasinoPrize extends LitElement implements PrizeSectionHost {
6
+ static styles: import('lit').CSSResult[];
7
+ section: OsLeaderboardCasinoPrizeSection;
8
+ private restPrizes;
9
+ private secondPrize?;
10
+ private firstPrize?;
11
+ private thirdPrize?;
12
+ get sectionTitle(): string;
13
+ get showStrategy(): boolean;
14
+ get strategyLabel(): string;
15
+ get hasTierList(): boolean;
16
+ willUpdate(): void;
17
+ private onPrizeClick;
18
+ private formatValue;
19
+ private renderPodiumSlot;
20
+ renderPodium(): import('lit').TemplateResult<1>;
21
+ renderTierList(): import('lit').TemplateResult<1>;
22
+ render(): import('lit').TemplateResult | typeof nothing;
23
+ }
@@ -0,0 +1,11 @@
1
+ import { TemplateResult } from 'lit';
2
+ import { OsLeaderboardCasinoPrizeSection } from '../../types/sections.js';
3
+ export interface PrizeSectionHost {
4
+ section: OsLeaderboardCasinoPrizeSection;
5
+ sectionTitle: string;
6
+ showStrategy: boolean;
7
+ strategyLabel: string;
8
+ renderPodium(): TemplateResult;
9
+ renderTierList(): TemplateResult;
10
+ hasTierList: boolean;
11
+ }
@@ -1,18 +1,19 @@
1
- import { LitElement as f, html as o, nothing as a } from "lit";
1
+ import { LitElement as f, html as n, nothing as a } from "lit";
2
2
  import { property as P } from "lit/decorators.js";
3
3
  import { Component as p } from "../../../../shared/lib/lit/component.js";
4
4
  import { scss as v } from "../../../../shared/lib/lit/scss.js";
5
5
  import { DEFAULT_PRIZE_TITLE as b } from "../../constants/defaults.js";
6
6
  import { OS_LEADERBOARD_CASINO_PRIZE as $ } from "../../constants/tags.js";
7
7
  import { osLeaderboardCasinoTheme as g } from "../../theme/styles.js";
8
- import { labelText as d } from "../../types/data.js";
9
- import { iconService as u } from "../../services/icon.service.js";
8
+ import { iconService as d } from "../../services/icon.service.js";
9
+ import { labelText as u } from "../../types/data.js";
10
10
  import { OS_LEADERBOARD_CASINO_PRIZE_CLICK as k } from "../../types/events.js";
11
+ import "./components/medal-coin/medal-coin.js";
11
12
  import S from "./prize-section.html.js";
12
13
  import _ from "./prize-section.scss.js";
13
14
  var y = Object.defineProperty, z = Object.getOwnPropertyDescriptor, h = (r, t, e, i) => {
14
- for (var s = i > 1 ? void 0 : i ? z(t, e) : t, n = r.length - 1, c; n >= 0; n--)
15
- (c = r[n]) && (s = (i ? c(t, e, s) : c(s)) || s);
15
+ for (var s = i > 1 ? void 0 : i ? z(t, e) : t, o = r.length - 1, c; o >= 0; o--)
16
+ (c = r[o]) && (s = (i ? c(t, e, s) : c(s)) || s);
16
17
  return i && s && y(t, e, s), s;
17
18
  };
18
19
  function F(r) {
@@ -80,36 +81,36 @@ let l = class extends f {
80
81
  first: "Champion",
81
82
  second: "2nd place",
82
83
  third: "3rd place"
83
- }, n = t === "first" ? 68 : 52;
84
- return o`
84
+ }, o = t === "first" ? 68 : 52;
85
+ return n`
85
86
  <button class="slot ${t}" @click=${() => this.onPrizeClick(r)}>
86
87
  <div class="coin">
87
88
  <os-leaderboard-casino-medal-coin
88
89
  variant=${e[t]}
89
90
  rank=${i[t]}
90
- size=${n}
91
+ size=${o}
91
92
  ></os-leaderboard-casino-medal-coin>
92
93
  </div>
93
94
  <div class="place">${s[t]}</div>
94
- <div class="name">${d(r.label)}</div>
95
+ <div class="name">${u(r.label)}</div>
95
96
  <div class="value">${this.formatValue(r)}</div>
96
97
  </button>
97
98
  `;
98
99
  }
99
100
  renderPodium() {
100
- return o`
101
+ return n`
101
102
  ${this.secondPrize ? this.renderPodiumSlot(this.secondPrize, "second") : a}
102
103
  ${this.firstPrize ? this.renderPodiumSlot(this.firstPrize, "first") : a}
103
104
  ${this.thirdPrize ? this.renderPodiumSlot(this.thirdPrize, "third") : a}
104
105
  `;
105
106
  }
106
107
  renderTierList() {
107
- return o`${this.restPrizes.map(
108
- (r) => o`
108
+ return n`${this.restPrizes.map(
109
+ (r) => n`
109
110
  <button class="tier" @click=${() => this.onPrizeClick(r)}>
110
- <span class="icon">${u.get(u.resolvePrizeIconName(r.label)).svg()}</span>
111
+ <span class="icon">${d.get(d.resolvePrizeIconName(r.label)).svg()}</span>
111
112
  <span class="info">
112
- <span class="name">${d(r.label)}</span>
113
+ <span class="name">${u(r.label)}</span>
113
114
  <span class="range">Rank ${F(r)}</span>
114
115
  </span>
115
116
  <span class="value">${this.formatValue(r)}</span>
@@ -1 +1 @@
1
- {"version":3,"file":"prize-section.js","sources":["../../../../../src/components/os-leaderboard-casino/sections/prize-section/prize-section.ts"],"sourcesContent":["import { LitElement, html, nothing } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { Component } from '@oddsmith/lib/lit/component.js';\nimport { scss } from '@oddsmith/lib/lit/scss.js';\nimport { DEFAULT_PRIZE_TITLE } from '@os-leaderboard-casino/constants/defaults.js';\nimport { OS_LEADERBOARD_CASINO_PRIZE } from '@os-leaderboard-casino/constants/tags.js';\nimport { osLeaderboardCasinoTheme } from '@os-leaderboard-casino/theme/index.js';\nimport {\n labelText,\n type QuizPrize,\n} from '@os-leaderboard-casino/types/data.js';\nimport { iconService } from '@os-leaderboard-casino/services/icon.service.js';\nimport { OS_LEADERBOARD_CASINO_PRIZE_CLICK } from '@os-leaderboard-casino/types/events.js';\nimport type { OsLeaderboardCasinoPrizeSection } from '@os-leaderboard-casino/types/sections.js';\nimport type { PrizeSectionHost } from './prize-section.host.js';\nimport './components/medal-coin/medal-coin.js';\nimport renderTemplate from './prize-section.html?lit-html';\nimport styles from './prize-section.scss?inline';\n\nfunction rankRange(prize: QuizPrize): string {\n return prize.rankFrom === prize.rankTo\n ? `#${prize.rankFrom}`\n : `#${prize.rankFrom}–${prize.rankTo}`;\n}\n\nfunction podiumPrizeForRank(\n prizes: QuizPrize[],\n rank: 1 | 2 | 3,\n): QuizPrize | undefined {\n return prizes.find(\n (prize) => prize.rankFrom === rank && prize.rankTo === rank,\n );\n}\n\nfunction tierPrizesFrom(prizes: QuizPrize[]): QuizPrize[] {\n return prizes.filter(\n (prize) =>\n !(\n prize.rankFrom === prize.rankTo &&\n prize.rankFrom >= 1 &&\n prize.rankFrom <= 3\n ),\n );\n}\n\n/** Top-3 metallic podium showcase + remaining prize tiers. */\n@Component({ selector: OS_LEADERBOARD_CASINO_PRIZE })\nexport class OsLeaderboardCasinoPrize\n extends LitElement\n implements PrizeSectionHost\n{\n static styles = [osLeaderboardCasinoTheme, scss(styles)];\n\n @property({ attribute: false })\n section!: OsLeaderboardCasinoPrizeSection;\n\n private restPrizes: QuizPrize[] = [];\n private secondPrize?: QuizPrize;\n private firstPrize?: QuizPrize;\n private thirdPrize?: QuizPrize;\n\n get sectionTitle(): string {\n return this.section?.title ?? DEFAULT_PRIZE_TITLE;\n }\n\n get showStrategy(): boolean {\n return Boolean(this.section?.allocationStrategy);\n }\n\n get strategyLabel(): string {\n return this.section?.allocationStrategy === 'SPLIT_PRIZE'\n ? 'Split Prize'\n : 'Best Prize';\n }\n\n get hasTierList(): boolean {\n return this.restPrizes.length > 0;\n }\n\n willUpdate() {\n const prizes = this.section?.prizePackage?.prizes ?? [];\n this.firstPrize = podiumPrizeForRank(prizes, 1);\n this.secondPrize = podiumPrizeForRank(prizes, 2);\n this.thirdPrize = podiumPrizeForRank(prizes, 3);\n this.restPrizes = tierPrizesFrom(prizes).sort(\n (left, right) => left.rankFrom - right.rankFrom,\n );\n }\n\n private onPrizeClick(prize: QuizPrize) {\n this.dispatchEvent(\n new CustomEvent(OS_LEADERBOARD_CASINO_PRIZE_CLICK, {\n detail: { prize },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n private formatValue(prize: QuizPrize): string {\n if (prize.value == null) return '';\n try {\n return new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: prize.currency ?? 'USD',\n maximumFractionDigits: 0,\n }).format(prize.value);\n } catch {\n return `${prize.value} ${prize.currency ?? ''}`.trim();\n }\n }\n\n private renderPodiumSlot(\n prize: QuizPrize,\n place: 'first' | 'second' | 'third',\n ) {\n const variants = {\n first: 'gold',\n second: 'silver',\n third: 'bronze',\n } as const;\n const ranks = { first: 1, second: 2, third: 3 };\n const labels = {\n first: 'Champion',\n second: '2nd place',\n third: '3rd place',\n };\n const coinSize = place === 'first' ? 68 : 52;\n return html`\n <button class=\"slot ${place}\" @click=${() => this.onPrizeClick(prize)}>\n <div class=\"coin\">\n <os-leaderboard-casino-medal-coin\n variant=${variants[place]}\n rank=${ranks[place]}\n size=${coinSize}\n ></os-leaderboard-casino-medal-coin>\n </div>\n <div class=\"place\">${labels[place]}</div>\n <div class=\"name\">${labelText(prize.label)}</div>\n <div class=\"value\">${this.formatValue(prize)}</div>\n </button>\n `;\n }\n\n renderPodium() {\n return html`\n ${this.secondPrize\n ? this.renderPodiumSlot(this.secondPrize, 'second')\n : nothing}\n ${this.firstPrize\n ? this.renderPodiumSlot(this.firstPrize, 'first')\n : nothing}\n ${this.thirdPrize\n ? this.renderPodiumSlot(this.thirdPrize, 'third')\n : nothing}\n `;\n }\n\n renderTierList() {\n return html`${this.restPrizes.map(\n (prize) => html`\n <button class=\"tier\" @click=${() => this.onPrizeClick(prize)}>\n <span class=\"icon\">${iconService.get(iconService.resolvePrizeIconName(prize.label)).svg()}</span>\n <span class=\"info\">\n <span class=\"name\">${labelText(prize.label)}</span>\n <span class=\"range\">Rank ${rankRange(prize)}</span>\n </span>\n <span class=\"value\">${this.formatValue(prize)}</span>\n </button>\n `,\n )}`;\n }\n\n render() {\n const prizes = this.section?.prizePackage?.prizes ?? [];\n if (!prizes.length) return nothing;\n return renderTemplate(this);\n }\n}\n"],"names":["rankRange","prize","podiumPrizeForRank","prizes","rank","tierPrizesFrom","OsLeaderboardCasinoPrize","LitElement","DEFAULT_PRIZE_TITLE","left","right","OS_LEADERBOARD_CASINO_PRIZE_CLICK","place","variants","ranks","labels","coinSize","html","labelText","nothing","iconService","renderTemplate","osLeaderboardCasinoTheme","scss","styles","__decorateClass","property","Component","OS_LEADERBOARD_CASINO_PRIZE"],"mappings":"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"}
1
+ {"version":3,"file":"prize-section.js","sources":["../../../../../src/components/os-leaderboard-casino/sections/prize-section/prize-section.ts"],"sourcesContent":["import { LitElement, html, nothing } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { Component } from '@oddsmith/lib/lit/component.js';\nimport { scss } from '@oddsmith/lib/lit/scss.js';\nimport { DEFAULT_PRIZE_TITLE } from '@os-leaderboard-casino/constants/defaults.js';\nimport { OS_LEADERBOARD_CASINO_PRIZE } from '@os-leaderboard-casino/constants/tags.js';\nimport { osLeaderboardCasinoTheme } from '@os-leaderboard-casino/theme/index.js';\nimport {\n labelText,\n type QuizPrize,\n} from '@os-leaderboard-casino/types/data.js';\nimport { iconService } from '@os-leaderboard-casino/services/icon.service.js';\nimport { OS_LEADERBOARD_CASINO_PRIZE_CLICK } from '@os-leaderboard-casino/types/events.js';\nimport type { OsLeaderboardCasinoPrizeSection } from '@os-leaderboard-casino/types/sections.js';\nimport type { PrizeSectionHost } from './prize-section.host.js';\nimport './components/medal-coin/medal-coin.js';\nimport renderTemplate from './prize-section.html?lit-html';\nimport styles from './prize-section.scss?inline';\n\nfunction rankRange(prize: QuizPrize): string {\n return prize.rankFrom === prize.rankTo\n ? `#${prize.rankFrom}`\n : `#${prize.rankFrom}–${prize.rankTo}`;\n}\n\nfunction podiumPrizeForRank(\n prizes: QuizPrize[],\n rank: 1 | 2 | 3,\n): QuizPrize | undefined {\n return prizes.find(\n (prize) => prize.rankFrom === rank && prize.rankTo === rank,\n );\n}\n\nfunction tierPrizesFrom(prizes: QuizPrize[]): QuizPrize[] {\n return prizes.filter(\n (prize) =>\n !(\n prize.rankFrom === prize.rankTo &&\n prize.rankFrom >= 1 &&\n prize.rankFrom <= 3\n ),\n );\n}\n\n/** Top-3 metallic podium showcase + remaining prize tiers. */\n@Component({ selector: OS_LEADERBOARD_CASINO_PRIZE })\nexport class OsLeaderboardCasinoPrize\n extends LitElement\n implements PrizeSectionHost\n{\n static styles = [osLeaderboardCasinoTheme, scss(styles)];\n\n @property({ attribute: false })\n section!: OsLeaderboardCasinoPrizeSection;\n\n private restPrizes: QuizPrize[] = [];\n private secondPrize?: QuizPrize;\n private firstPrize?: QuizPrize;\n private thirdPrize?: QuizPrize;\n\n get sectionTitle(): string {\n return this.section?.title ?? DEFAULT_PRIZE_TITLE;\n }\n\n get showStrategy(): boolean {\n return Boolean(this.section?.allocationStrategy);\n }\n\n get strategyLabel(): string {\n return this.section?.allocationStrategy === 'SPLIT_PRIZE'\n ? 'Split Prize'\n : 'Best Prize';\n }\n\n get hasTierList(): boolean {\n return this.restPrizes.length > 0;\n }\n\n willUpdate() {\n const prizes = this.section?.prizePackage?.prizes ?? [];\n this.firstPrize = podiumPrizeForRank(prizes, 1);\n this.secondPrize = podiumPrizeForRank(prizes, 2);\n this.thirdPrize = podiumPrizeForRank(prizes, 3);\n this.restPrizes = tierPrizesFrom(prizes).sort(\n (left, right) => left.rankFrom - right.rankFrom,\n );\n }\n\n private onPrizeClick(prize: QuizPrize) {\n this.dispatchEvent(\n new CustomEvent(OS_LEADERBOARD_CASINO_PRIZE_CLICK, {\n detail: { prize },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n private formatValue(prize: QuizPrize): string {\n if (prize.value == null) return '';\n try {\n return new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: prize.currency ?? 'USD',\n maximumFractionDigits: 0,\n }).format(prize.value);\n } catch {\n return `${prize.value} ${prize.currency ?? ''}`.trim();\n }\n }\n\n private renderPodiumSlot(\n prize: QuizPrize,\n place: 'first' | 'second' | 'third',\n ) {\n const variants = {\n first: 'gold',\n second: 'silver',\n third: 'bronze',\n } as const;\n const ranks = { first: 1, second: 2, third: 3 };\n const labels = {\n first: 'Champion',\n second: '2nd place',\n third: '3rd place',\n };\n const coinSize = place === 'first' ? 68 : 52;\n return html`\n <button class=\"slot ${place}\" @click=${() => this.onPrizeClick(prize)}>\n <div class=\"coin\">\n <os-leaderboard-casino-medal-coin\n variant=${variants[place]}\n rank=${ranks[place]}\n size=${coinSize}\n ></os-leaderboard-casino-medal-coin>\n </div>\n <div class=\"place\">${labels[place]}</div>\n <div class=\"name\">${labelText(prize.label)}</div>\n <div class=\"value\">${this.formatValue(prize)}</div>\n </button>\n `;\n }\n\n renderPodium() {\n return html`\n ${this.secondPrize\n ? this.renderPodiumSlot(this.secondPrize, 'second')\n : nothing}\n ${this.firstPrize\n ? this.renderPodiumSlot(this.firstPrize, 'first')\n : nothing}\n ${this.thirdPrize\n ? this.renderPodiumSlot(this.thirdPrize, 'third')\n : nothing}\n `;\n }\n\n renderTierList() {\n return html`${this.restPrizes.map(\n (prize) => html`\n <button class=\"tier\" @click=${() => this.onPrizeClick(prize)}>\n <span class=\"icon\">${iconService.get(iconService.resolvePrizeIconName(prize.label)).svg()}</span>\n <span class=\"info\">\n <span class=\"name\">${labelText(prize.label)}</span>\n <span class=\"range\">Rank ${rankRange(prize)}</span>\n </span>\n <span class=\"value\">${this.formatValue(prize)}</span>\n </button>\n `,\n )}`;\n }\n\n render() {\n const prizes = this.section?.prizePackage?.prizes ?? [];\n if (!prizes.length) return nothing;\n return renderTemplate(this);\n }\n}\n"],"names":["rankRange","prize","podiumPrizeForRank","prizes","rank","tierPrizesFrom","OsLeaderboardCasinoPrize","LitElement","DEFAULT_PRIZE_TITLE","left","right","OS_LEADERBOARD_CASINO_PRIZE_CLICK","place","variants","ranks","labels","coinSize","html","labelText","nothing","iconService","renderTemplate","osLeaderboardCasinoTheme","scss","styles","__decorateClass","property","Component","OS_LEADERBOARD_CASINO_PRIZE"],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { LitElement } from 'lit';
2
+ import { statIcons } from '../stat-icons.js';
3
+ export type StatBandAccent = 'participants' | 'prizes' | 'ends';
4
+ export type StatBandIcon = keyof typeof statIcons;
5
+ export type StatBandSegment = 'solo' | 'start' | 'middle' | 'end';
6
+ /** Centered KPI band — accent stripe, icon ring, stacked value + label. */
7
+ export declare class OsLeaderboardCasinoStatBand extends LitElement {
8
+ static styles: import('lit').CSSResult[];
9
+ accent: StatBandAccent;
10
+ icon: StatBandIcon;
11
+ value: string;
12
+ label: string;
13
+ segment: StatBandSegment;
14
+ compact: boolean;
15
+ highlight: boolean;
16
+ render(): import('lit').TemplateResult<1>;
17
+ }
@@ -0,0 +1,15 @@
1
+ import { LitElement } from 'lit';
2
+ import { statIcons } from '../stat-icons.js';
3
+ export type StatCardAccent = 'participants' | 'prizes' | 'ends';
4
+ export type StatCardIcon = keyof typeof statIcons;
5
+ /** Classic glow stat tile — rounded glass cards with soft accent wash. */
6
+ export declare class OsLeaderboardCasinoStatCard extends LitElement {
7
+ static styles: import('lit').CSSResult[];
8
+ accent: StatCardAccent;
9
+ icon: StatCardIcon;
10
+ value: string;
11
+ label: string;
12
+ compact: boolean;
13
+ glow: boolean;
14
+ render(): import('lit').TemplateResult<1>;
15
+ }
@@ -0,0 +1,17 @@
1
+ import { LitElement } from 'lit';
2
+ import { statIcons } from '../stat-icons.js';
3
+ export type StatChipAccent = 'participants' | 'prizes' | 'ends';
4
+ export type StatChipIcon = keyof typeof statIcons;
5
+ export type StatChipSegment = 'solo' | 'start' | 'middle' | 'end';
6
+ /** Compact chip readout — inline icon + value, label tucked below. */
7
+ export declare class OsLeaderboardCasinoStatChip extends LitElement {
8
+ static styles: import('lit').CSSResult[];
9
+ accent: StatChipAccent;
10
+ icon: StatChipIcon;
11
+ value: string;
12
+ label: string;
13
+ segment: StatChipSegment;
14
+ compact: boolean;
15
+ highlight: boolean;
16
+ render(): import('lit').TemplateResult<1>;
17
+ }
@@ -0,0 +1,14 @@
1
+ import { LitElement } from 'lit';
2
+ import { statIcons } from '../stat-icons.js';
3
+ export type StatGaugeAccent = 'participants' | 'prizes' | 'ends';
4
+ export type StatGaugeIcon = keyof typeof statIcons;
5
+ /** Telemetry gauge tile — variant B stat readout from v0 stat-strip. */
6
+ export declare class OsLeaderboardCasinoStatGauge extends LitElement {
7
+ static styles: import('lit').CSSResult[];
8
+ accent: StatGaugeAccent;
9
+ icon: StatGaugeIcon;
10
+ value: string;
11
+ label: string;
12
+ compact: boolean;
13
+ render(): import('lit').TemplateResult<1>;
14
+ }
@@ -0,0 +1,5 @@
1
+ import { TemplateResult } from 'lit';
2
+ export type StatIconName = 'users' | 'gift' | 'clock' | 'trophy';
3
+ type IconFn = () => TemplateResult;
4
+ export declare const statIcons: Record<StatIconName, IconFn>;
5
+ export {};
@@ -0,0 +1,11 @@
1
+ import { iconService as t } from "../../../services/icon.service.js";
2
+ const o = {
3
+ users: () => t.svg("stat.users"),
4
+ gift: () => t.svg("stat.gift"),
5
+ clock: () => t.svg("stat.clock"),
6
+ trophy: () => t.svg("win.trophy")
7
+ };
8
+ export {
9
+ o as statIcons
10
+ };
11
+ //# sourceMappingURL=stat-icons.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stat-icons.js","sources":["../../../../../../src/components/os-leaderboard-casino/sections/stats-section/components/stat-icons.ts"],"sourcesContent":["import { iconService } from '@os-leaderboard-casino/services/icon.service.js';\nimport type { TemplateResult } from 'lit';\n\nexport type StatIconName = 'users' | 'gift' | 'clock' | 'trophy';\n\ntype IconFn = () => TemplateResult;\n\nexport const statIcons: Record<StatIconName, IconFn> = {\n users: () => iconService.svg('stat.users'),\n gift: () => iconService.svg('stat.gift'),\n clock: () => iconService.svg('stat.clock'),\n trophy: () => iconService.svg('win.trophy'),\n};\n"],"names":["statIcons","iconService"],"mappings":";AAOO,MAAMA,IAA0C;AAAA,EACrD,OAAO,MAAMC,EAAY,IAAI,YAAY;AAAA,EACzC,MAAM,MAAMA,EAAY,IAAI,WAAW;AAAA,EACvC,OAAO,MAAMA,EAAY,IAAI,YAAY;AAAA,EACzC,QAAQ,MAAMA,EAAY,IAAI,YAAY;AAC5C;"}
@@ -0,0 +1,17 @@
1
+ import { LitElement } from 'lit';
2
+ import { statIcons } from '../stat-icons.js';
3
+ export type StatMeterAccent = 'participants' | 'prizes' | 'ends';
4
+ export type StatMeterIcon = keyof typeof statIcons;
5
+ export type StatMeterSegment = 'solo' | 'start' | 'middle' | 'end';
6
+ /** Meter readout — label + value with animated accent fill bar. */
7
+ export declare class OsLeaderboardCasinoStatMeter extends LitElement {
8
+ static styles: import('lit').CSSResult[];
9
+ accent: StatMeterAccent;
10
+ icon: StatMeterIcon;
11
+ value: string;
12
+ label: string;
13
+ segment: StatMeterSegment;
14
+ compact: boolean;
15
+ highlight: boolean;
16
+ render(): import('lit').TemplateResult<1>;
17
+ }
@@ -0,0 +1,17 @@
1
+ import { LitElement } from 'lit';
2
+ import { statIcons } from '../stat-icons.js';
3
+ export type StatRailAccent = 'participants' | 'prizes' | 'ends' | 'biggestWin';
4
+ export type StatRailIcon = keyof typeof statIcons;
5
+ export type StatRailSegment = 'solo' | 'start' | 'middle' | 'end';
6
+ /** Horizontal rail segment — icon well + label/value with accent shimmer. */
7
+ export declare class OsLeaderboardCasinoStatRail extends LitElement {
8
+ static styles: import('lit').CSSResult[];
9
+ accent: StatRailAccent;
10
+ icon: StatRailIcon;
11
+ value: string;
12
+ label: string;
13
+ segment: StatRailSegment;
14
+ compact: boolean;
15
+ highlight: boolean;
16
+ render(): import('lit').TemplateResult<1>;
17
+ }
@@ -0,0 +1,61 @@
1
+ import { LitElement as m, html as h } from "lit";
2
+ import { property as o } from "lit/decorators.js";
3
+ import { Component as v } from "../../../../../../shared/lib/lit/component.js";
4
+ import { scss as f } from "../../../../../../shared/lib/lit/scss.js";
5
+ import { OS_LEADERBOARD_CASINO_STAT_RAIL as y } from "../../../../constants/tags.js";
6
+ import { osLeaderboardCasinoTheme as u } from "../../../../theme/styles.js";
7
+ import "lit/directives/unsafe-svg.js";
8
+ import { statIcons as n } from "../stat-icons.js";
9
+ import d from "./stat-rail.scss.js";
10
+ var g = Object.defineProperty, _ = Object.getOwnPropertyDescriptor, e = (s, i, l, p) => {
11
+ for (var r = p > 1 ? void 0 : p ? _(i, l) : i, a = s.length - 1, c; a >= 0; a--)
12
+ (c = s[a]) && (r = (p ? c(i, l, r) : c(r)) || r);
13
+ return p && r && g(i, l, r), r;
14
+ };
15
+ let t = class extends m {
16
+ constructor() {
17
+ super(...arguments), this.accent = "participants", this.icon = "users", this.value = "", this.label = "", this.segment = "solo", this.compact = !1, this.highlight = !1;
18
+ }
19
+ render() {
20
+ const s = n[this.icon] ?? n.users;
21
+ return h`
22
+ <div class="rail">
23
+ <div class="icon-well">${s()}</div>
24
+ <div class="copy">
25
+ <div class="label">${this.label}</div>
26
+ <div class="value">${this.value}</div>
27
+ </div>
28
+ <span class="shimmer" aria-hidden="true"></span>
29
+ </div>
30
+ `;
31
+ }
32
+ };
33
+ t.styles = [u, f(d)];
34
+ e([
35
+ o({ type: String, reflect: !0 })
36
+ ], t.prototype, "accent", 2);
37
+ e([
38
+ o({ type: String })
39
+ ], t.prototype, "icon", 2);
40
+ e([
41
+ o({ type: String })
42
+ ], t.prototype, "value", 2);
43
+ e([
44
+ o({ type: String })
45
+ ], t.prototype, "label", 2);
46
+ e([
47
+ o({ type: String, reflect: !0 })
48
+ ], t.prototype, "segment", 2);
49
+ e([
50
+ o({ type: Boolean, reflect: !0 })
51
+ ], t.prototype, "compact", 2);
52
+ e([
53
+ o({ type: Boolean, reflect: !0 })
54
+ ], t.prototype, "highlight", 2);
55
+ t = e([
56
+ v({ selector: y })
57
+ ], t);
58
+ export {
59
+ t as OsLeaderboardCasinoStatRail
60
+ };
61
+ //# sourceMappingURL=stat-rail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stat-rail.js","sources":["../../../../../../../src/components/os-leaderboard-casino/sections/stats-section/components/stat-rail/stat-rail.ts"],"sourcesContent":["import { LitElement, html } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { Component } from '@oddsmith/lib/lit/component.js';\nimport { scss } from '@oddsmith/lib/lit/scss.js';\nimport { OS_LEADERBOARD_CASINO_STAT_RAIL } from '@os-leaderboard-casino/constants/tags.js';\nimport { osLeaderboardCasinoTheme } from '@os-leaderboard-casino/theme/index.js';\nimport { statIcons } from '../stat-icons.js';\nimport styles from './stat-rail.scss?inline';\n\nexport type StatRailAccent = 'participants' | 'prizes' | 'ends' | 'biggestWin';\nexport type StatRailIcon = keyof typeof statIcons;\nexport type StatRailSegment = 'solo' | 'start' | 'middle' | 'end';\n\n/** Horizontal rail segment — icon well + label/value with accent shimmer. */\n@Component({ selector: OS_LEADERBOARD_CASINO_STAT_RAIL })\nexport class OsLeaderboardCasinoStatRail extends LitElement {\n static styles = [osLeaderboardCasinoTheme, scss(styles)];\n\n @property({ type: String, reflect: true })\n accent: StatRailAccent = 'participants';\n\n @property({ type: String })\n icon: StatRailIcon = 'users';\n\n @property({ type: String })\n value = '';\n\n @property({ type: String })\n label = '';\n\n @property({ type: String, reflect: true })\n segment: StatRailSegment = 'solo';\n\n @property({ type: Boolean, reflect: true })\n compact = false;\n\n @property({ type: Boolean, reflect: true })\n highlight = false;\n\n render() {\n const icon = statIcons[this.icon] ?? statIcons.users;\n return html`\n <div class=\"rail\">\n <div class=\"icon-well\">${icon()}</div>\n <div class=\"copy\">\n <div class=\"label\">${this.label}</div>\n <div class=\"value\">${this.value}</div>\n </div>\n <span class=\"shimmer\" aria-hidden=\"true\"></span>\n </div>\n `;\n }\n}\n"],"names":["OsLeaderboardCasinoStatRail","LitElement","icon","statIcons","html","osLeaderboardCasinoTheme","scss","styles","__decorateClass","property","Component","OS_LEADERBOARD_CASINO_STAT_RAIL"],"mappings":";;;;;;;;;;;;;;AAeO,IAAMA,IAAN,cAA0CC,EAAW;AAAA,EAArD,cAAA;AAAA,UAAA,GAAA,SAAA,GAIL,KAAA,SAAyB,gBAGzB,KAAA,OAAqB,SAGrB,KAAA,QAAQ,IAGR,KAAA,QAAQ,IAGR,KAAA,UAA2B,QAG3B,KAAA,UAAU,IAGV,KAAA,YAAY;AAAA,EAAA;AAAA,EAEZ,SAAS;AACP,UAAMC,IAAOC,EAAU,KAAK,IAAI,KAAKA,EAAU;AAC/C,WAAOC;AAAA;AAAA,iCAEsBF,GAAM;AAAA;AAAA,+BAER,KAAK,KAAK;AAAA,+BACV,KAAK,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA,EAKvC;AACF;AArCaF,EACJ,SAAS,CAACK,GAA0BC,EAAKC,CAAM,CAAC;AAGvDC,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,QAAQ,SAAS,IAAM;AAAA,GAH9BT,EAIX,WAAA,UAAA,CAAA;AAGAQ,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GANfT,EAOX,WAAA,QAAA,CAAA;AAGAQ,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GATfT,EAUX,WAAA,SAAA,CAAA;AAGAQ,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GAZfT,EAaX,WAAA,SAAA,CAAA;AAGAQ,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,QAAQ,SAAS,IAAM;AAAA,GAf9BT,EAgBX,WAAA,WAAA,CAAA;AAGAQ,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,SAAS,SAAS,IAAM;AAAA,GAlB/BT,EAmBX,WAAA,WAAA,CAAA;AAGAQ,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,SAAS,SAAS,IAAM;AAAA,GArB/BT,EAsBX,WAAA,aAAA,CAAA;AAtBWA,IAANQ,EAAA;AAAA,EADNE,EAAU,EAAE,UAAUC,EAAA,CAAiC;AAAA,GAC3CX,CAAA;"}
@@ -0,0 +1,5 @@
1
+ const t = ':host{display:block;flex:1;min-width:0}:host([hidden]){display:none}.rail{position:relative;overflow:hidden;display:flex;align-items:center;gap:14px;height:100%;box-sizing:border-box;padding:16px 18px 18px;border:1px solid var(--panel-border);border-radius:var(--radius-sm);background:var(--panel-bg);box-shadow:var(--panel-shadow)}:host([accent=participants]){--rail-accent: var(--green);--icon-bg: var(--green-soft);--icon-color: var(--green)}:host([accent=prizes]){--rail-accent: var(--gold);--icon-bg: var(--gold-soft);--icon-color: var(--gold)}:host([accent=ends]){--rail-accent: var(--violet);--icon-bg: var(--violet-soft);--icon-color: var(--violet)}:host([accent=biggestWin]){--rail-accent: var(--red);--icon-bg: var(--red-soft);--icon-color: var(--red)}.icon-well{flex-shrink:0;width:44px;height:44px;display:grid;place-items:center;border-radius:10px;background:var(--icon-bg);border:1px solid color-mix(in srgb,var(--rail-accent) 30%,transparent);color:var(--icon-color);box-shadow:inset 0 1px color-mix(in srgb,white 8%,transparent)}.icon-well svg{width:20px;height:20px}.copy{min-width:0;flex:1}.label{font-family:var(--font-mono);font-size:10px;font-weight:700;letter-spacing:.16em;text-transform:uppercase;color:var(--text-dim)}.value{margin-top:6px;font-family:var(--font-mono);font-size:24px;font-weight:800;line-height:1.1;color:var(--text);font-variant-numeric:tabular-nums}:host([compact]) .value{font-size:15px;line-height:1.25}:host([highlight]) .value{color:var(--gold-strong);text-shadow:0 0 16px color-mix(in srgb,var(--gold) 35%,transparent)}.shimmer{position:absolute;left:0;right:0;bottom:0;height:2px;background:linear-gradient(90deg,transparent,var(--rail-accent),transparent);opacity:.55}.shimmer:after{content:"";position:absolute;inset:0;background:inherit;filter:blur(4px);opacity:.8}.rail:after{content:"";position:absolute;left:-40%;bottom:0;width:35%;height:2px;background:linear-gradient(90deg,transparent,color-mix(in srgb,var(--rail-accent) 90%,white),transparent);animation:rail-shimmer 3.2s ease-in-out infinite;pointer-events:none}@keyframes rail-shimmer{0%,to{transform:translate(0);opacity:0}20%{opacity:1}80%{opacity:1}to{transform:translate(420%);opacity:0}}@media(prefers-reduced-motion:reduce){.rail:after{animation:none;opacity:.35;left:0;width:100%;transform:none}}';
2
+ export {
3
+ t as default
4
+ };
5
+ //# sourceMappingURL=stat-rail.scss.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stat-rail.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -0,0 +1,16 @@
1
+ import { LitElement, nothing } from 'lit';
2
+ import { OsLeaderboardCasinoStatsSection } from '../../types/sections.js';
3
+ import { StatsSectionHost, StatRailSegment } from './stats-section.host.js';
4
+ export declare class OsLeaderboardCasinoStats extends LitElement implements StatsSectionHost {
5
+ static styles: import('lit').CSSResult[];
6
+ section: OsLeaderboardCasinoStatsSection;
7
+ get participantsLabel(): string;
8
+ get showPrizes(): boolean;
9
+ get prizesLabel(): string;
10
+ get showBiggestWin(): boolean;
11
+ get biggestWinLabel(): string;
12
+ get participantsSegment(): StatRailSegment;
13
+ get prizesSegment(): StatRailSegment;
14
+ get biggestWinSegment(): StatRailSegment;
15
+ render(): import('lit').TemplateResult | typeof nothing;
16
+ }
@@ -0,0 +1,13 @@
1
+ import { OsLeaderboardCasinoStatsSection } from '../../types/sections.js';
2
+ export type StatRailSegment = 'solo' | 'start' | 'middle' | 'end';
3
+ export interface StatsSectionHost {
4
+ section: OsLeaderboardCasinoStatsSection;
5
+ participantsLabel: string;
6
+ participantsSegment: StatRailSegment;
7
+ showPrizes: boolean;
8
+ prizesLabel: string;
9
+ prizesSegment: StatRailSegment;
10
+ showBiggestWin: boolean;
11
+ biggestWinLabel: string;
12
+ biggestWinSegment: StatRailSegment;
13
+ }
@@ -1,14 +1,16 @@
1
- import { LitElement as m, nothing as c } from "lit";
2
- import { property as l } from "lit/decorators.js";
3
- import { Component as p } from "../../../../shared/lib/lit/component.js";
1
+ import { LitElement as g, nothing as p } from "lit";
2
+ import { property as c } from "lit/decorators.js";
3
+ import { Component as l } from "../../../../shared/lib/lit/component.js";
4
4
  import { scss as u } from "../../../../shared/lib/lit/scss.js";
5
5
  import { OS_LEADERBOARD_CASINO_STATS as h } from "../../constants/tags.js";
6
6
  import { osLeaderboardCasinoTheme as f } from "../../theme/styles.js";
7
+ import "lit/directives/unsafe-svg.js";
8
+ import "./components/stat-rail/stat-rail.js";
7
9
  import b from "./stats-section.html.js";
8
10
  import S from "./stats-section.scss.js";
9
- var L = Object.defineProperty, d = Object.getOwnPropertyDescriptor, g = (r, e, n, i) => {
10
- for (var t = i > 1 ? void 0 : i ? d(e, n) : e, o = r.length - 1, a; o >= 0; o--)
11
- (a = r[o]) && (t = (i ? a(e, n, t) : a(t)) || t);
11
+ var L = Object.defineProperty, d = Object.getOwnPropertyDescriptor, a = (r, e, n, i) => {
12
+ for (var t = i > 1 ? void 0 : i ? d(e, n) : e, o = r.length - 1, m; o >= 0; o--)
13
+ (m = r[o]) && (t = (i ? m(e, n, t) : m(t)) || t);
12
14
  return i && t && L(e, n, t), t;
13
15
  };
14
16
  function P(r, e = "USD") {
@@ -22,7 +24,7 @@ function P(r, e = "USD") {
22
24
  return r.toLocaleString();
23
25
  }
24
26
  }
25
- let s = class extends m {
27
+ let s = class extends g {
26
28
  get participantsLabel() {
27
29
  return this.section.totalParticipants.toLocaleString();
28
30
  }
@@ -51,15 +53,15 @@ let s = class extends m {
51
53
  return "end";
52
54
  }
53
55
  render() {
54
- return this.section ? b(this) : c;
56
+ return this.section ? b(this) : p;
55
57
  }
56
58
  };
57
59
  s.styles = [f, u(S)];
58
- g([
59
- l({ attribute: !1 })
60
+ a([
61
+ c({ attribute: !1 })
60
62
  ], s.prototype, "section", 2);
61
- s = g([
62
- p({ selector: h })
63
+ s = a([
64
+ l({ selector: h })
63
65
  ], s);
64
66
  export {
65
67
  s as OsLeaderboardCasinoStats
@@ -1 +1 @@
1
- {"version":3,"file":"stats-section.js","sources":["../../../../../src/components/os-leaderboard-casino/sections/stats-section/stats-section.ts"],"sourcesContent":["import { LitElement, nothing } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { Component } from '@oddsmith/lib/lit/component.js';\nimport { scss } from '@oddsmith/lib/lit/scss.js';\nimport { OS_LEADERBOARD_CASINO_STATS } from '@os-leaderboard-casino/constants/tags.js';\nimport { osLeaderboardCasinoTheme } from '@os-leaderboard-casino/theme/index.js';\nimport type { OsLeaderboardCasinoStatsSection } from '@os-leaderboard-casino/types/sections.js';\nimport type { StatsSectionHost, StatRailSegment } from './stats-section.host.js';\nimport './components/stat-rail/stat-rail.js';\nimport renderTemplate from './stats-section.html?lit-html';\nimport styles from './stats-section.scss?inline';\n\nfunction formatWinAmount(value: number, currency = 'USD'): string {\n try {\n return new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency,\n maximumFractionDigits: 0,\n }).format(value);\n } catch {\n return value.toLocaleString();\n }\n}\n\n@Component({ selector: OS_LEADERBOARD_CASINO_STATS })\nexport class OsLeaderboardCasinoStats\n extends LitElement\n implements StatsSectionHost\n{\n static styles = [osLeaderboardCasinoTheme, scss(styles)];\n\n @property({ attribute: false })\n section!: OsLeaderboardCasinoStatsSection;\n\n get participantsLabel(): string {\n return this.section.totalParticipants.toLocaleString();\n }\n\n get showPrizes(): boolean {\n return this.section.totalPrizes != null;\n }\n\n get prizesLabel(): string {\n return (this.section.totalPrizes ?? 0).toLocaleString();\n }\n\n get showBiggestWin(): boolean {\n return this.section.biggestWin != null;\n }\n\n get biggestWinLabel(): string {\n return formatWinAmount(\n this.section.biggestWin ?? 0,\n this.section.biggestWinCurrency ?? 'USD',\n );\n }\n\n get participantsSegment(): StatRailSegment {\n if (!this.showPrizes && !this.showBiggestWin) return 'solo';\n return 'start';\n }\n\n get prizesSegment(): StatRailSegment {\n return this.showBiggestWin ? 'middle' : 'end';\n }\n\n get biggestWinSegment(): StatRailSegment {\n return 'end';\n }\n\n render() {\n if (!this.section) return nothing;\n return renderTemplate(this);\n }\n}\n"],"names":["formatWinAmount","value","currency","OsLeaderboardCasinoStats","LitElement","renderTemplate","nothing","osLeaderboardCasinoTheme","scss","styles","__decorateClass","property","Component","OS_LEADERBOARD_CASINO_STATS"],"mappings":";;;;;;;;;;;;;AAYA,SAASA,EAAgBC,GAAeC,IAAW,OAAe;AAChE,MAAI;AACF,WAAO,IAAI,KAAK,aAAa,SAAS;AAAA,MACpC,OAAO;AAAA,MACP,UAAAA;AAAA,MACA,uBAAuB;AAAA,IAAA,CACxB,EAAE,OAAOD,CAAK;AAAA,EACjB,QAAQ;AACN,WAAOA,EAAM,eAAA;AAAA,EACf;AACF;AAGO,IAAME,IAAN,cACGC,EAEV;AAAA,EAME,IAAI,oBAA4B;AAC9B,WAAO,KAAK,QAAQ,kBAAkB,eAAA;AAAA,EACxC;AAAA,EAEA,IAAI,aAAsB;AACxB,WAAO,KAAK,QAAQ,eAAe;AAAA,EACrC;AAAA,EAEA,IAAI,cAAsB;AACxB,YAAQ,KAAK,QAAQ,eAAe,GAAG,eAAA;AAAA,EACzC;AAAA,EAEA,IAAI,iBAA0B;AAC5B,WAAO,KAAK,QAAQ,cAAc;AAAA,EACpC;AAAA,EAEA,IAAI,kBAA0B;AAC5B,WAAOJ;AAAA,MACL,KAAK,QAAQ,cAAc;AAAA,MAC3B,KAAK,QAAQ,sBAAsB;AAAA,IAAA;AAAA,EAEvC;AAAA,EAEA,IAAI,sBAAuC;AACzC,WAAI,CAAC,KAAK,cAAc,CAAC,KAAK,iBAAuB,SAC9C;AAAA,EACT;AAAA,EAEA,IAAI,gBAAiC;AACnC,WAAO,KAAK,iBAAiB,WAAW;AAAA,EAC1C;AAAA,EAEA,IAAI,oBAAqC;AACvC,WAAO;AAAA,EACT;AAAA,EAEA,SAAS;AACP,WAAK,KAAK,UACHK,EAAe,IAAI,IADAC;AAAA,EAE5B;AACF;AAjDaH,EAIJ,SAAS,CAACI,GAA0BC,EAAKC,CAAM,CAAC;AAGvDC,EAAA;AAAA,EADCC,EAAS,EAAE,WAAW,GAAA,CAAO;AAAA,GANnBR,EAOX,WAAA,WAAA,CAAA;AAPWA,IAANO,EAAA;AAAA,EADNE,EAAU,EAAE,UAAUC,EAAA,CAA6B;AAAA,GACvCV,CAAA;"}
1
+ {"version":3,"file":"stats-section.js","sources":["../../../../../src/components/os-leaderboard-casino/sections/stats-section/stats-section.ts"],"sourcesContent":["import { LitElement, nothing } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { Component } from '@oddsmith/lib/lit/component.js';\nimport { scss } from '@oddsmith/lib/lit/scss.js';\nimport { OS_LEADERBOARD_CASINO_STATS } from '@os-leaderboard-casino/constants/tags.js';\nimport { osLeaderboardCasinoTheme } from '@os-leaderboard-casino/theme/index.js';\nimport type { OsLeaderboardCasinoStatsSection } from '@os-leaderboard-casino/types/sections.js';\nimport type { StatsSectionHost, StatRailSegment } from './stats-section.host.js';\nimport './components/stat-rail/stat-rail.js';\nimport renderTemplate from './stats-section.html?lit-html';\nimport styles from './stats-section.scss?inline';\n\nfunction formatWinAmount(value: number, currency = 'USD'): string {\n try {\n return new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency,\n maximumFractionDigits: 0,\n }).format(value);\n } catch {\n return value.toLocaleString();\n }\n}\n\n@Component({ selector: OS_LEADERBOARD_CASINO_STATS })\nexport class OsLeaderboardCasinoStats\n extends LitElement\n implements StatsSectionHost\n{\n static styles = [osLeaderboardCasinoTheme, scss(styles)];\n\n @property({ attribute: false })\n section!: OsLeaderboardCasinoStatsSection;\n\n get participantsLabel(): string {\n return this.section.totalParticipants.toLocaleString();\n }\n\n get showPrizes(): boolean {\n return this.section.totalPrizes != null;\n }\n\n get prizesLabel(): string {\n return (this.section.totalPrizes ?? 0).toLocaleString();\n }\n\n get showBiggestWin(): boolean {\n return this.section.biggestWin != null;\n }\n\n get biggestWinLabel(): string {\n return formatWinAmount(\n this.section.biggestWin ?? 0,\n this.section.biggestWinCurrency ?? 'USD',\n );\n }\n\n get participantsSegment(): StatRailSegment {\n if (!this.showPrizes && !this.showBiggestWin) return 'solo';\n return 'start';\n }\n\n get prizesSegment(): StatRailSegment {\n return this.showBiggestWin ? 'middle' : 'end';\n }\n\n get biggestWinSegment(): StatRailSegment {\n return 'end';\n }\n\n render() {\n if (!this.section) return nothing;\n return renderTemplate(this);\n }\n}\n"],"names":["formatWinAmount","value","currency","OsLeaderboardCasinoStats","LitElement","renderTemplate","nothing","osLeaderboardCasinoTheme","scss","styles","__decorateClass","property","Component","OS_LEADERBOARD_CASINO_STATS"],"mappings":";;;;;;;;;;;;;;;AAYA,SAASA,EAAgBC,GAAeC,IAAW,OAAe;AAChE,MAAI;AACF,WAAO,IAAI,KAAK,aAAa,SAAS;AAAA,MACpC,OAAO;AAAA,MACP,UAAAA;AAAA,MACA,uBAAuB;AAAA,IAAA,CACxB,EAAE,OAAOD,CAAK;AAAA,EACjB,QAAQ;AACN,WAAOA,EAAM,eAAA;AAAA,EACf;AACF;AAGO,IAAME,IAAN,cACGC,EAEV;AAAA,EAME,IAAI,oBAA4B;AAC9B,WAAO,KAAK,QAAQ,kBAAkB,eAAA;AAAA,EACxC;AAAA,EAEA,IAAI,aAAsB;AACxB,WAAO,KAAK,QAAQ,eAAe;AAAA,EACrC;AAAA,EAEA,IAAI,cAAsB;AACxB,YAAQ,KAAK,QAAQ,eAAe,GAAG,eAAA;AAAA,EACzC;AAAA,EAEA,IAAI,iBAA0B;AAC5B,WAAO,KAAK,QAAQ,cAAc;AAAA,EACpC;AAAA,EAEA,IAAI,kBAA0B;AAC5B,WAAOJ;AAAA,MACL,KAAK,QAAQ,cAAc;AAAA,MAC3B,KAAK,QAAQ,sBAAsB;AAAA,IAAA;AAAA,EAEvC;AAAA,EAEA,IAAI,sBAAuC;AACzC,WAAI,CAAC,KAAK,cAAc,CAAC,KAAK,iBAAuB,SAC9C;AAAA,EACT;AAAA,EAEA,IAAI,gBAAiC;AACnC,WAAO,KAAK,iBAAiB,WAAW;AAAA,EAC1C;AAAA,EAEA,IAAI,oBAAqC;AACvC,WAAO;AAAA,EACT;AAAA,EAEA,SAAS;AACP,WAAK,KAAK,UACHK,EAAe,IAAI,IADAC;AAAA,EAE5B;AACF;AAjDaH,EAIJ,SAAS,CAACI,GAA0BC,EAAKC,CAAM,CAAC;AAGvDC,EAAA;AAAA,EADCC,EAAS,EAAE,WAAW,GAAA,CAAO;AAAA,GANnBR,EAOX,WAAA,WAAA,CAAA;AAPWA,IAANO,EAAA;AAAA,EADNE,EAAU,EAAE,UAAUC,EAAA,CAA6B;AAAA,GACvCV,CAAA;"}
@@ -0,0 +1,31 @@
1
+ import { LitElement, nothing } from 'lit';
2
+ import { OsLeaderboardCasinoTableView } from '../../types/sections.js';
3
+ import { TableSectionHost } from './table-section.host.js';
4
+ /** Top-players preview — pinned current user, golden CTA. */
5
+ export declare class OsLeaderboardCasinoTable extends LitElement implements TableSectionHost {
6
+ static styles: import('lit').CSSResult[];
7
+ private _resizeObserver?;
8
+ connectedCallback(): void;
9
+ disconnectedCallback(): void;
10
+ protected updated(): void;
11
+ private _syncStickyWidth;
12
+ section: OsLeaderboardCasinoTableView;
13
+ /** Campaign uuid included in the `leaderboard-open` event detail. */
14
+ uuid: string;
15
+ finished: boolean;
16
+ get sectionTitle(): string;
17
+ get ctaLabel(): string;
18
+ private get visiblePlayers();
19
+ private get pinnedCurrentUser();
20
+ get hasPlayers(): boolean;
21
+ get emptyMessage(): string;
22
+ get showPinned(): boolean;
23
+ onOpenClick(): void;
24
+ private resolvePlayerPrize;
25
+ private renderRankChange;
26
+ private avatarUrl;
27
+ private renderRow;
28
+ renderPlayers(): import('lit').TemplateResult<1>;
29
+ renderPinnedRow(): typeof nothing | import('lit').TemplateResult<1>;
30
+ render(): import('lit').TemplateResult | typeof nothing;
31
+ }
@@ -0,0 +1,15 @@
1
+ import { LitTemplate } from '../../../../shared/lib/lit/template.js';
2
+ import { OsLeaderboardCasinoTableView } from '../../types/sections.js';
3
+ export interface TableSectionHost {
4
+ section: OsLeaderboardCasinoTableView;
5
+ uuid: string;
6
+ finished: boolean;
7
+ sectionTitle: string;
8
+ ctaLabel: string;
9
+ hasPlayers: boolean;
10
+ emptyMessage: string;
11
+ showPinned: boolean;
12
+ onOpenClick(): void;
13
+ renderPlayers(): LitTemplate;
14
+ renderPinnedRow(): LitTemplate;
15
+ }
@@ -13,6 +13,7 @@ import { renderPlayerName as C } from "../../theme/vip-mark.js";
13
13
  import { labelText as R } from "../../types/data.js";
14
14
  import { prizeForRank as L, podiumVariantForRank as E } from "../../theme/prize-resolve.js";
15
15
  import { OS_LEADERBOARD_CASINO_OPEN as O } from "../../types/events.js";
16
+ import "../prize-section/components/medal-coin/medal-coin.js";
16
17
  import z from "./table-section.html.js";
17
18
  import A from "./table-section.scss.js";
18
19
  var D = Object.defineProperty, T = Object.getOwnPropertyDescriptor, l = (e, s, t, o) => {
@@ -1 +1 @@
1
- {"version":3,"file":"table-section.js","sources":["../../../../../src/components/os-leaderboard-casino/sections/table-section/table-section.ts"],"sourcesContent":["import { LitElement, html, nothing } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { unsafeSVG } from 'lit/directives/unsafe-svg.js';\nimport rankUpSvg from '../../assets/icons/table.rank-up.svg?raw';\nimport rankDownSvg from '../../assets/icons/table.rank-down.svg?raw';\nimport rankNeutralSvg from '../../assets/icons/table.rank-neutral.svg?raw';\nimport { Component } from '@oddsmith/lib/lit/component.js';\nimport { scss } from '@oddsmith/lib/lit/scss.js';\nimport {\n DEFAULT_CTA_LABEL,\n DEFAULT_CTA_LABEL_FINISHED,\n DEFAULT_TABLE_TITLE,\n} from '@os-leaderboard-casino/constants/defaults.js';\nimport { OS_LEADERBOARD_CASINO_TABLE } from '@os-leaderboard-casino/constants/tags.js';\nimport { osLeaderboardCasinoTheme } from '@os-leaderboard-casino/theme/index.js';\nimport { renderPlayerName } from '@os-leaderboard-casino/theme/vip-mark.js';\nimport {\n labelText,\n type QuizPrize,\n type UserRank,\n} from '@os-leaderboard-casino/types/data.js';\nimport {\n podiumVariantForRank,\n prizeForRank,\n} from '@os-leaderboard-casino/theme/prize-resolve.js';\nimport { OS_LEADERBOARD_CASINO_OPEN } from '@os-leaderboard-casino/types/events.js';\nimport type { OsLeaderboardCasinoTableView } from '@os-leaderboard-casino/types/sections.js';\nimport type { TableSectionHost } from './table-section.host.js';\nimport '@os-leaderboard-casino/sections/prize-section/components/medal-coin/medal-coin.js';\nimport renderTemplate from './table-section.html?lit-html';\nimport styles from './table-section.scss?inline';\n\nfunction formatTotalBet(value: number): string {\n return new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: 'USD',\n maximumFractionDigits: 0,\n }).format(value);\n}\n\nfunction formatGamesPlayed(value: number | undefined): string {\n return value != null ? value.toLocaleString() : '—';\n}\n\nfunction addViewBox(svg: string): string {\n return svg.replace('<svg ', '<svg viewBox=\"0 0 512 512\" ');\n}\n\nconst rankUpSvgVb = addViewBox(rankUpSvg);\nconst rankDownSvgVb = addViewBox(rankDownSvg);\nconst rankNeutralSvgVb = addViewBox(rankNeutralSvg);\n\n/** Top-players preview — pinned current user, golden CTA. */\n@Component({ selector: OS_LEADERBOARD_CASINO_TABLE })\nexport class OsLeaderboardCasinoTable\n extends LitElement\n implements TableSectionHost\n{\n static styles = [osLeaderboardCasinoTheme, scss(styles)];\n\n private _resizeObserver?: ResizeObserver;\n\n connectedCallback() {\n super.connectedCallback();\n this._resizeObserver = new ResizeObserver(() => this._syncStickyWidth());\n this._resizeObserver.observe(this);\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this._resizeObserver?.disconnect();\n }\n\n protected updated() {\n this._syncStickyWidth();\n }\n\n private _syncStickyWidth() {\n const card = this.shadowRoot?.querySelector<HTMLElement>('.card');\n const player = this.shadowRoot?.querySelector<HTMLElement>('.col-player');\n\n if (card) {\n this.style.setProperty(\n '--table-scrollport-width',\n `${card.clientWidth}px`,\n );\n }\n\n if (player) {\n this.style.setProperty(\n '--sticky-player-width',\n `${player.offsetWidth}px`,\n );\n }\n }\n\n @property({ attribute: false })\n section!: OsLeaderboardCasinoTableView;\n\n /** Campaign uuid included in the `leaderboard-open` event detail. */\n @property({ type: String })\n uuid = '';\n\n @property({ type: Boolean })\n finished = false;\n\n get sectionTitle(): string {\n return DEFAULT_TABLE_TITLE;\n }\n\n get ctaLabel(): string {\n return (\n this.section?.ctaLabel ??\n (this.finished ? DEFAULT_CTA_LABEL_FINISHED : DEFAULT_CTA_LABEL)\n );\n }\n\n private get visiblePlayers(): UserRank[] {\n return this.section?.topPlayers ?? [];\n }\n\n private get pinnedCurrentUser(): UserRank | undefined {\n const current = this.section?.currentUser;\n if (!current || !('you' in current)) return undefined;\n const players = this.section?.topPlayers ?? [];\n return players.some((p) => p.you) ? undefined : current;\n }\n\n get hasPlayers(): boolean {\n return this.visiblePlayers.length > 0;\n }\n\n get emptyMessage(): string {\n return 'No players yet.';\n }\n\n get showPinned(): boolean {\n return this.pinnedCurrentUser != null;\n }\n\n onOpenClick() {\n this.dispatchEvent(\n new CustomEvent(OS_LEADERBOARD_CASINO_OPEN, {\n detail: { uuid: this.uuid },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n private resolvePlayerPrize(player: UserRank): QuizPrize | null {\n const prizes = this.section?.prizes ?? [];\n return prizeForRank(prizes, player.rank) ?? player.prize;\n }\n\n private renderRankChange(player: UserRank) {\n if (player.previousRank == null)\n return html`<span class=\"chip flat\"\n >${unsafeSVG(rankNeutralSvgVb)}</span\n >`;\n const delta = player.previousRank - player.rank;\n if (delta === 0)\n return html`<span class=\"chip flat\"\n >${unsafeSVG(rankNeutralSvgVb)}</span\n >`;\n if (delta > 0)\n return html`<span class=\"chip up\"\n >${unsafeSVG(rankUpSvgVb)}${delta}</span\n >`;\n return html`<span class=\"chip down\"\n >${unsafeSVG(rankDownSvgVb)}${Math.abs(delta)}</span\n >`;\n }\n\n private avatarUrl(username: string): string {\n return `https://api.dicebear.com/9.x/lorelei/svg?seed=${encodeURIComponent(\n username,\n )}`;\n }\n\n private renderRow(player: UserRank) {\n const podiumClass =\n !player.you && player.rank <= 3 ? `podium-${player.rank}` : '';\n const prize = this.resolvePlayerPrize(player);\n const totalBet =\n player.totalBet ?? Math.round(player.points * (1.8 + player.rank * 0.04));\n return html`\n <div\n class=\"row ${player.you ? 'you' : ''} ${player.vip\n ? 'vip'\n : ''} ${podiumClass}\"\n >\n ${player.rank <= 3 && !player.you\n ? html`<span class=\"rank col-rank\"\n ><os-leaderboard-casino-medal-coin\n variant=${podiumVariantForRank(player.rank as 1 | 2 | 3)}\n rank=${player.rank}\n size=${30}\n ></os-leaderboard-casino-medal-coin\n ></span>`\n : html`<span class=\"rank col-rank\">#${player.rank}</span>`}\n <div class=\"player col-player\">\n <span class=\"avatar\">\n <img src=${this.avatarUrl(player.username)} alt=\"\" loading=\"lazy\" />\n </span>\n <span class=\"who\">\n <span class=\"username\">\n ${renderPlayerName(player.username, {\n vip: player.vip,\n suffix: player.you\n ? html`<span class=\"you-tag\">You</span>`\n : nothing,\n })}\n </span>\n ${prize\n ? html`<span class=\"prize-sub\"\n ><span class=\"prize-label\"\n >${labelText(prize.label)}</span\n ></span\n >`\n : nothing}\n </span>\n </div>\n <span class=\"col-games\">${formatGamesPlayed(player.gamesPlayed)}</span>\n <span class=\"col-win-rate\"\n >${player.winRate != null ? `${player.winRate}%` : '—'}</span\n >\n <span class=\"col-bet\">${formatTotalBet(totalBet)}</span>\n <span class=\"col-points\"><b>${player.points.toLocaleString()}</b></span>\n <span class=\"col-rank-change\">${this.renderRankChange(player)}</span>\n </div>\n `;\n }\n\n renderPlayers() {\n return html`${this.visiblePlayers.map((p) => this.renderRow(p))}`;\n }\n\n renderPinnedRow() {\n const pinned = this.pinnedCurrentUser;\n if (!pinned) return nothing;\n return this.renderRow(pinned);\n }\n\n render() {\n if (!this.section) return nothing;\n return renderTemplate(this);\n }\n}\n"],"names":["formatTotalBet","value","formatGamesPlayed","addViewBox","svg","rankUpSvgVb","rankUpSvg","rankDownSvgVb","rankDownSvg","rankNeutralSvgVb","rankNeutralSvg","OsLeaderboardCasinoTable","LitElement","card","player","DEFAULT_TABLE_TITLE","DEFAULT_CTA_LABEL_FINISHED","DEFAULT_CTA_LABEL","current","p","OS_LEADERBOARD_CASINO_OPEN","prizes","prizeForRank","html","unsafeSVG","delta","username","podiumClass","prize","totalBet","podiumVariantForRank","renderPlayerName","nothing","labelText","pinned","renderTemplate","osLeaderboardCasinoTheme","scss","styles","__decorateClass","property","Component","OS_LEADERBOARD_CASINO_TABLE"],"mappings":"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"}
1
+ {"version":3,"file":"table-section.js","sources":["../../../../../src/components/os-leaderboard-casino/sections/table-section/table-section.ts"],"sourcesContent":["import { LitElement, html, nothing } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { unsafeSVG } from 'lit/directives/unsafe-svg.js';\nimport rankUpSvg from '../../assets/icons/table.rank-up.svg?raw';\nimport rankDownSvg from '../../assets/icons/table.rank-down.svg?raw';\nimport rankNeutralSvg from '../../assets/icons/table.rank-neutral.svg?raw';\nimport { Component } from '@oddsmith/lib/lit/component.js';\nimport { scss } from '@oddsmith/lib/lit/scss.js';\nimport {\n DEFAULT_CTA_LABEL,\n DEFAULT_CTA_LABEL_FINISHED,\n DEFAULT_TABLE_TITLE,\n} from '@os-leaderboard-casino/constants/defaults.js';\nimport { OS_LEADERBOARD_CASINO_TABLE } from '@os-leaderboard-casino/constants/tags.js';\nimport { osLeaderboardCasinoTheme } from '@os-leaderboard-casino/theme/index.js';\nimport { renderPlayerName } from '@os-leaderboard-casino/theme/vip-mark.js';\nimport {\n labelText,\n type QuizPrize,\n type UserRank,\n} from '@os-leaderboard-casino/types/data.js';\nimport {\n podiumVariantForRank,\n prizeForRank,\n} from '@os-leaderboard-casino/theme/prize-resolve.js';\nimport { OS_LEADERBOARD_CASINO_OPEN } from '@os-leaderboard-casino/types/events.js';\nimport type { OsLeaderboardCasinoTableView } from '@os-leaderboard-casino/types/sections.js';\nimport type { TableSectionHost } from './table-section.host.js';\nimport '@os-leaderboard-casino/sections/prize-section/components/medal-coin/medal-coin.js';\nimport renderTemplate from './table-section.html?lit-html';\nimport styles from './table-section.scss?inline';\n\nfunction formatTotalBet(value: number): string {\n return new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: 'USD',\n maximumFractionDigits: 0,\n }).format(value);\n}\n\nfunction formatGamesPlayed(value: number | undefined): string {\n return value != null ? value.toLocaleString() : '—';\n}\n\nfunction addViewBox(svg: string): string {\n return svg.replace('<svg ', '<svg viewBox=\"0 0 512 512\" ');\n}\n\nconst rankUpSvgVb = addViewBox(rankUpSvg);\nconst rankDownSvgVb = addViewBox(rankDownSvg);\nconst rankNeutralSvgVb = addViewBox(rankNeutralSvg);\n\n/** Top-players preview — pinned current user, golden CTA. */\n@Component({ selector: OS_LEADERBOARD_CASINO_TABLE })\nexport class OsLeaderboardCasinoTable\n extends LitElement\n implements TableSectionHost\n{\n static styles = [osLeaderboardCasinoTheme, scss(styles)];\n\n private _resizeObserver?: ResizeObserver;\n\n connectedCallback() {\n super.connectedCallback();\n this._resizeObserver = new ResizeObserver(() => this._syncStickyWidth());\n this._resizeObserver.observe(this);\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this._resizeObserver?.disconnect();\n }\n\n protected updated() {\n this._syncStickyWidth();\n }\n\n private _syncStickyWidth() {\n const card = this.shadowRoot?.querySelector<HTMLElement>('.card');\n const player = this.shadowRoot?.querySelector<HTMLElement>('.col-player');\n\n if (card) {\n this.style.setProperty(\n '--table-scrollport-width',\n `${card.clientWidth}px`,\n );\n }\n\n if (player) {\n this.style.setProperty(\n '--sticky-player-width',\n `${player.offsetWidth}px`,\n );\n }\n }\n\n @property({ attribute: false })\n section!: OsLeaderboardCasinoTableView;\n\n /** Campaign uuid included in the `leaderboard-open` event detail. */\n @property({ type: String })\n uuid = '';\n\n @property({ type: Boolean })\n finished = false;\n\n get sectionTitle(): string {\n return DEFAULT_TABLE_TITLE;\n }\n\n get ctaLabel(): string {\n return (\n this.section?.ctaLabel ??\n (this.finished ? DEFAULT_CTA_LABEL_FINISHED : DEFAULT_CTA_LABEL)\n );\n }\n\n private get visiblePlayers(): UserRank[] {\n return this.section?.topPlayers ?? [];\n }\n\n private get pinnedCurrentUser(): UserRank | undefined {\n const current = this.section?.currentUser;\n if (!current || !('you' in current)) return undefined;\n const players = this.section?.topPlayers ?? [];\n return players.some((p) => p.you) ? undefined : current;\n }\n\n get hasPlayers(): boolean {\n return this.visiblePlayers.length > 0;\n }\n\n get emptyMessage(): string {\n return 'No players yet.';\n }\n\n get showPinned(): boolean {\n return this.pinnedCurrentUser != null;\n }\n\n onOpenClick() {\n this.dispatchEvent(\n new CustomEvent(OS_LEADERBOARD_CASINO_OPEN, {\n detail: { uuid: this.uuid },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n private resolvePlayerPrize(player: UserRank): QuizPrize | null {\n const prizes = this.section?.prizes ?? [];\n return prizeForRank(prizes, player.rank) ?? player.prize;\n }\n\n private renderRankChange(player: UserRank) {\n if (player.previousRank == null)\n return html`<span class=\"chip flat\"\n >${unsafeSVG(rankNeutralSvgVb)}</span\n >`;\n const delta = player.previousRank - player.rank;\n if (delta === 0)\n return html`<span class=\"chip flat\"\n >${unsafeSVG(rankNeutralSvgVb)}</span\n >`;\n if (delta > 0)\n return html`<span class=\"chip up\"\n >${unsafeSVG(rankUpSvgVb)}${delta}</span\n >`;\n return html`<span class=\"chip down\"\n >${unsafeSVG(rankDownSvgVb)}${Math.abs(delta)}</span\n >`;\n }\n\n private avatarUrl(username: string): string {\n return `https://api.dicebear.com/9.x/lorelei/svg?seed=${encodeURIComponent(\n username,\n )}`;\n }\n\n private renderRow(player: UserRank) {\n const podiumClass =\n !player.you && player.rank <= 3 ? `podium-${player.rank}` : '';\n const prize = this.resolvePlayerPrize(player);\n const totalBet =\n player.totalBet ?? Math.round(player.points * (1.8 + player.rank * 0.04));\n return html`\n <div\n class=\"row ${player.you ? 'you' : ''} ${player.vip\n ? 'vip'\n : ''} ${podiumClass}\"\n >\n ${player.rank <= 3 && !player.you\n ? html`<span class=\"rank col-rank\"\n ><os-leaderboard-casino-medal-coin\n variant=${podiumVariantForRank(player.rank as 1 | 2 | 3)}\n rank=${player.rank}\n size=${30}\n ></os-leaderboard-casino-medal-coin\n ></span>`\n : html`<span class=\"rank col-rank\">#${player.rank}</span>`}\n <div class=\"player col-player\">\n <span class=\"avatar\">\n <img src=${this.avatarUrl(player.username)} alt=\"\" loading=\"lazy\" />\n </span>\n <span class=\"who\">\n <span class=\"username\">\n ${renderPlayerName(player.username, {\n vip: player.vip,\n suffix: player.you\n ? html`<span class=\"you-tag\">You</span>`\n : nothing,\n })}\n </span>\n ${prize\n ? html`<span class=\"prize-sub\"\n ><span class=\"prize-label\"\n >${labelText(prize.label)}</span\n ></span\n >`\n : nothing}\n </span>\n </div>\n <span class=\"col-games\">${formatGamesPlayed(player.gamesPlayed)}</span>\n <span class=\"col-win-rate\"\n >${player.winRate != null ? `${player.winRate}%` : '—'}</span\n >\n <span class=\"col-bet\">${formatTotalBet(totalBet)}</span>\n <span class=\"col-points\"><b>${player.points.toLocaleString()}</b></span>\n <span class=\"col-rank-change\">${this.renderRankChange(player)}</span>\n </div>\n `;\n }\n\n renderPlayers() {\n return html`${this.visiblePlayers.map((p) => this.renderRow(p))}`;\n }\n\n renderPinnedRow() {\n const pinned = this.pinnedCurrentUser;\n if (!pinned) return nothing;\n return this.renderRow(pinned);\n }\n\n render() {\n if (!this.section) return nothing;\n return renderTemplate(this);\n }\n}\n"],"names":["formatTotalBet","value","formatGamesPlayed","addViewBox","svg","rankUpSvgVb","rankUpSvg","rankDownSvgVb","rankDownSvg","rankNeutralSvgVb","rankNeutralSvg","OsLeaderboardCasinoTable","LitElement","card","player","DEFAULT_TABLE_TITLE","DEFAULT_CTA_LABEL_FINISHED","DEFAULT_CTA_LABEL","current","p","OS_LEADERBOARD_CASINO_OPEN","prizes","prizeForRank","html","unsafeSVG","delta","username","podiumClass","prize","totalBet","podiumVariantForRank","renderPlayerName","nothing","labelText","pinned","renderTemplate","osLeaderboardCasinoTheme","scss","styles","__decorateClass","property","Component","OS_LEADERBOARD_CASINO_TABLE"],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { OsLeaderboardCasinoLayout } from '../types/sections.js';
2
+ import { OsLeaderboardCasinoState } from '../types/state.js';
3
+ /** Maps facade state into the glam layout shell. */
4
+ export declare class AdapterService {
5
+ toLayout(state: OsLeaderboardCasinoState): OsLeaderboardCasinoLayout;
6
+ applyThemeVars(host: HTMLElement, state: OsLeaderboardCasinoState): void;
7
+ private buildLayout;
8
+ private isEnabled;
9
+ private mainOrder;
10
+ }
11
+ export declare const adapterService: AdapterService;