@oddsmith/ui 1.0.0 → 1.0.2
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.
- package/README.md +1 -1
- package/dist/components/os-leaderboard-casino/assets/fallback/defaults/glam-sections.json +3 -3
- package/dist/components/os-leaderboard-casino/assets/fallback/manifest.json +1 -1
- package/dist/components/os-leaderboard-casino/assets/fallback/resolved-presets.json +6 -4
- package/dist/components/os-leaderboard-casino/assets/fallback/resolved-presets.json.js +1 -1
- package/dist/components/os-leaderboard-casino/assets/fallback/themes.json +3 -4
- package/dist/components/os-leaderboard-casino/assets/fallback/themes.json.js +3 -4
- package/dist/components/os-leaderboard-casino/assets/fallback/themes.json.js.map +1 -1
- package/dist/components/os-leaderboard-casino/constants/defaults.d.ts +8 -0
- package/dist/components/os-leaderboard-casino/constants/index.d.ts +2 -0
- package/dist/components/os-leaderboard-casino/constants/tags.d.ts +22 -0
- package/dist/components/os-leaderboard-casino/constants/tags.js +6 -4
- package/dist/components/os-leaderboard-casino/constants/tags.js.map +1 -1
- package/dist/components/os-leaderboard-casino/container/os-leaderboard-casino.d.ts +35 -0
- package/dist/components/os-leaderboard-casino/container/os-leaderboard-casino.host.d.ts +13 -0
- package/dist/components/os-leaderboard-casino/container/os-leaderboard-casino.html.js +5 -3
- package/dist/components/os-leaderboard-casino/container/os-leaderboard-casino.html.js.map +1 -1
- package/dist/components/os-leaderboard-casino/container/os-leaderboard-casino.js +12 -10
- package/dist/components/os-leaderboard-casino/container/os-leaderboard-casino.js.map +1 -1
- package/dist/components/os-leaderboard-casino/container/os-leaderboard-casino.scss.js +1 -1
- package/dist/components/os-leaderboard-casino/index.d.ts +36 -0
- package/dist/components/os-leaderboard-casino/index.js +23 -23
- package/dist/components/os-leaderboard-casino/integration/assemble-assets.d.ts +21 -0
- package/dist/components/os-leaderboard-casino/integration/assets-context.d.ts +26 -0
- package/dist/components/os-leaderboard-casino/integration/assets-context.js +40 -35
- package/dist/components/os-leaderboard-casino/integration/assets-context.js.map +1 -1
- package/dist/components/os-leaderboard-casino/integration/defaults-glam.d.ts +14 -0
- package/dist/components/os-leaderboard-casino/integration/defaults-new-money.d.ts +3 -0
- package/dist/components/os-leaderboard-casino/integration/index.d.ts +5 -0
- package/dist/components/os-leaderboard-casino/integration/labels.d.ts +1 -0
- package/dist/components/os-leaderboard-casino/integration/load-assets.d.ts +9 -0
- package/dist/components/os-leaderboard-casino/integration/presets.d.ts +1 -0
- package/dist/components/os-leaderboard-casino/integration/resolve-input.d.ts +20 -0
- package/dist/components/os-leaderboard-casino/integration/resolve-input.js +31 -27
- package/dist/components/os-leaderboard-casino/integration/resolve-input.js.map +1 -1
- package/dist/components/os-leaderboard-casino/integration/themes.d.ts +1 -0
- package/dist/components/os-leaderboard-casino/sections/climb-section/climb-section.d.ts +18 -0
- package/dist/components/os-leaderboard-casino/sections/climb-section/climb-section.host.d.ts +14 -0
- package/dist/components/os-leaderboard-casino/sections/climb-section/climb-section.html.js +7 -5
- package/dist/components/os-leaderboard-casino/sections/climb-section/climb-section.html.js.map +1 -1
- package/dist/components/os-leaderboard-casino/sections/climb-section/climb-section.js +33 -38
- package/dist/components/os-leaderboard-casino/sections/climb-section/climb-section.js.map +1 -1
- package/dist/components/os-leaderboard-casino/sections/events-banner/components/event-icons.d.ts +5 -0
- package/dist/components/os-leaderboard-casino/sections/events-banner/components/event-icons.js +7 -5
- package/dist/components/os-leaderboard-casino/sections/events-banner/components/event-icons.js.map +1 -1
- package/dist/components/os-leaderboard-casino/sections/events-banner/events-banner.d.ts +16 -0
- package/dist/components/os-leaderboard-casino/sections/events-banner/events-banner.host.d.ts +8 -0
- package/dist/components/os-leaderboard-casino/sections/events-banner/events-banner.js +26 -22
- package/dist/components/os-leaderboard-casino/sections/events-banner/events-banner.js.map +1 -1
- package/dist/components/os-leaderboard-casino/sections/footer-section/footer-section.d.ts +10 -0
- package/dist/components/os-leaderboard-casino/sections/footer-section/footer-section.host.d.ts +3 -0
- package/dist/components/os-leaderboard-casino/sections/footer-section/footer-section.html.js +7 -5
- package/dist/components/os-leaderboard-casino/sections/footer-section/footer-section.html.js.map +1 -1
- package/dist/components/os-leaderboard-casino/sections/footer-section/footer-section.js +11 -8
- package/dist/components/os-leaderboard-casino/sections/footer-section/footer-section.js.map +1 -1
- package/dist/components/os-leaderboard-casino/sections/games-section/components/game-images.d.ts +1 -0
- package/dist/components/os-leaderboard-casino/sections/games-section/games-section.d.ts +20 -0
- package/dist/components/os-leaderboard-casino/sections/games-section/games-section.host.d.ts +7 -0
- package/dist/components/os-leaderboard-casino/sections/games-section/games-section.html.js +5 -3
- package/dist/components/os-leaderboard-casino/sections/games-section/games-section.html.js.map +1 -1
- package/dist/components/os-leaderboard-casino/sections/games-section/games-section.js +15 -13
- package/dist/components/os-leaderboard-casino/sections/games-section/games-section.js.map +1 -1
- package/dist/components/os-leaderboard-casino/sections/header-section/header-section.d.ts +12 -0
- package/dist/components/os-leaderboard-casino/sections/header-section/header-section.host.d.ts +8 -0
- package/dist/components/os-leaderboard-casino/sections/hero-section/hero-section.d.ts +37 -0
- package/dist/components/os-leaderboard-casino/sections/hero-section/hero-section.host.d.ts +20 -0
- package/dist/components/os-leaderboard-casino/sections/hero-section/hero-section.html.js +6 -4
- package/dist/components/os-leaderboard-casino/sections/hero-section/hero-section.html.js.map +1 -1
- package/dist/components/os-leaderboard-casino/sections/hero-section/hero-section.js +6 -2
- package/dist/components/os-leaderboard-casino/sections/hero-section/hero-section.js.map +1 -1
- package/dist/components/os-leaderboard-casino/sections/legals-section/legals-section.d.ts +18 -0
- package/dist/components/os-leaderboard-casino/sections/legals-section/legals-section.host.d.ts +8 -0
- package/dist/components/os-leaderboard-casino/sections/legals-section/legals-section.html.js +5 -3
- package/dist/components/os-leaderboard-casino/sections/legals-section/legals-section.html.js.map +1 -1
- package/dist/components/os-leaderboard-casino/sections/legals-section/legals-section.js +10 -5
- package/dist/components/os-leaderboard-casino/sections/legals-section/legals-section.js.map +1 -1
- package/dist/components/os-leaderboard-casino/sections/live-feed-section/live-feed-section.d.ts +13 -0
- package/dist/components/os-leaderboard-casino/sections/live-feed-section/live-feed-section.host.d.ts +8 -0
- package/dist/components/os-leaderboard-casino/sections/marquee-section/components/win-icons.d.ts +3 -0
- package/dist/components/os-leaderboard-casino/sections/marquee-section/marquee-item.d.ts +14 -0
- package/dist/components/os-leaderboard-casino/sections/marquee-section/marquee-section.d.ts +42 -0
- package/dist/components/os-leaderboard-casino/sections/marquee-section/marquee-section.host.d.ts +8 -0
- package/dist/components/os-leaderboard-casino/sections/marquee-section/marquee-section.html.js +5 -3
- package/dist/components/os-leaderboard-casino/sections/marquee-section/marquee-section.html.js.map +1 -1
- package/dist/components/os-leaderboard-casino/sections/marquee-section/marquee-section.js +26 -23
- package/dist/components/os-leaderboard-casino/sections/marquee-section/marquee-section.js.map +1 -1
- package/dist/components/os-leaderboard-casino/sections/marquee-section/marquee-variants.d.ts +6 -0
- package/dist/components/os-leaderboard-casino/sections/prize-section/components/medal-coin/medal-coin.d.ts +16 -0
- package/dist/components/os-leaderboard-casino/sections/prize-section/components/medal-coin/medal-coin.js +73 -0
- package/dist/components/os-leaderboard-casino/sections/prize-section/components/medal-coin/medal-coin.js.map +1 -0
- package/dist/components/os-leaderboard-casino/sections/prize-section/components/medal-coin/medal-coin.scss.js +5 -0
- package/dist/components/os-leaderboard-casino/sections/prize-section/components/medal-coin/medal-coin.scss.js.map +1 -0
- package/dist/components/os-leaderboard-casino/sections/prize-section/prize-section.d.ts +23 -0
- package/dist/components/os-leaderboard-casino/sections/prize-section/prize-section.host.d.ts +11 -0
- package/dist/components/os-leaderboard-casino/sections/prize-section/prize-section.html.js +5 -3
- package/dist/components/os-leaderboard-casino/sections/prize-section/prize-section.html.js.map +1 -1
- package/dist/components/os-leaderboard-casino/sections/prize-section/prize-section.js +18 -15
- package/dist/components/os-leaderboard-casino/sections/prize-section/prize-section.js.map +1 -1
- package/dist/components/os-leaderboard-casino/sections/stats-section/components/stat-band/stat-band.d.ts +17 -0
- package/dist/components/os-leaderboard-casino/sections/stats-section/components/stat-card/stat-card.d.ts +15 -0
- package/dist/components/os-leaderboard-casino/sections/stats-section/components/stat-chip/stat-chip.d.ts +17 -0
- package/dist/components/os-leaderboard-casino/sections/stats-section/components/stat-gauge/stat-gauge.d.ts +14 -0
- package/dist/components/os-leaderboard-casino/sections/stats-section/components/stat-icons.d.ts +5 -0
- package/dist/components/os-leaderboard-casino/sections/stats-section/components/stat-icons.js +11 -0
- package/dist/components/os-leaderboard-casino/sections/stats-section/components/stat-icons.js.map +1 -0
- package/dist/components/os-leaderboard-casino/sections/stats-section/components/stat-meter/stat-meter.d.ts +17 -0
- package/dist/components/os-leaderboard-casino/sections/stats-section/components/stat-rail/stat-rail.d.ts +17 -0
- package/dist/components/os-leaderboard-casino/sections/stats-section/components/stat-rail/stat-rail.js +63 -0
- package/dist/components/os-leaderboard-casino/sections/stats-section/components/stat-rail/stat-rail.js.map +1 -0
- package/dist/components/os-leaderboard-casino/sections/stats-section/components/stat-rail/stat-rail.scss.js +5 -0
- package/dist/components/os-leaderboard-casino/sections/stats-section/components/stat-rail/stat-rail.scss.js.map +1 -0
- package/dist/components/os-leaderboard-casino/sections/stats-section/stats-section.d.ts +16 -0
- package/dist/components/os-leaderboard-casino/sections/stats-section/stats-section.host.d.ts +13 -0
- package/dist/components/os-leaderboard-casino/sections/stats-section/stats-section.html.js +5 -3
- package/dist/components/os-leaderboard-casino/sections/stats-section/stats-section.html.js.map +1 -1
- package/dist/components/os-leaderboard-casino/sections/stats-section/stats-section.js +20 -16
- package/dist/components/os-leaderboard-casino/sections/stats-section/stats-section.js.map +1 -1
- package/dist/components/os-leaderboard-casino/sections/table-section/table-section.d.ts +31 -0
- package/dist/components/os-leaderboard-casino/sections/table-section/table-section.host.d.ts +15 -0
- package/dist/components/os-leaderboard-casino/sections/table-section/table-section.html.js +5 -3
- package/dist/components/os-leaderboard-casino/sections/table-section/table-section.html.js.map +1 -1
- package/dist/components/os-leaderboard-casino/sections/table-section/table-section.js +17 -14
- package/dist/components/os-leaderboard-casino/sections/table-section/table-section.js.map +1 -1
- package/dist/components/os-leaderboard-casino/services/adapter.service.d.ts +11 -0
- package/dist/components/os-leaderboard-casino/services/icon.service.d.ts +28 -0
- package/dist/components/os-leaderboard-casino/services/icon.service.js +10 -8
- package/dist/components/os-leaderboard-casino/services/icon.service.js.map +1 -1
- package/dist/components/os-leaderboard-casino/services/index.d.ts +2 -0
- package/dist/components/os-leaderboard-casino/theme/background.d.ts +4 -0
- package/dist/components/os-leaderboard-casino/theme/background.js +22 -0
- package/dist/components/os-leaderboard-casino/theme/background.js.map +1 -0
- package/dist/components/os-leaderboard-casino/theme/index.d.ts +3 -0
- package/dist/components/os-leaderboard-casino/theme/prize-icons.d.ts +1 -0
- package/dist/components/os-leaderboard-casino/theme/prize-resolve.d.ts +5 -0
- package/dist/components/os-leaderboard-casino/theme/styles.d.ts +9 -0
- package/dist/components/os-leaderboard-casino/theme/styles.js +3 -3
- package/dist/components/os-leaderboard-casino/theme/styles.js.map +1 -1
- package/dist/components/os-leaderboard-casino/theme/vip-icons.d.ts +2 -0
- package/dist/components/os-leaderboard-casino/theme/vip-mark.d.ts +7 -0
- package/dist/components/os-leaderboard-casino/theme/vip-mark.js +11 -9
- package/dist/components/os-leaderboard-casino/theme/vip-mark.js.map +1 -1
- package/dist/components/os-leaderboard-casino/types/assets.d.ts +42 -0
- package/dist/components/os-leaderboard-casino/types/data.d.ts +106 -0
- package/dist/components/os-leaderboard-casino/types/events.d.ts +18 -0
- package/dist/components/os-leaderboard-casino/types/icons.d.ts +18 -0
- package/dist/components/os-leaderboard-casino/types/input.d.ts +79 -0
- package/dist/components/os-leaderboard-casino/types/ledger.d.ts +67 -0
- package/dist/components/os-leaderboard-casino/types/sections.d.ts +200 -0
- package/dist/components/os-leaderboard-casino/types/state.d.ts +69 -0
- package/dist/shared/lib/lit/component.d.ts +5 -0
- package/dist/shared/lib/lit/safe-custom-element.d.ts +5 -0
- package/dist/shared/lib/lit/scss.d.ts +3 -0
- package/dist/shared/lib/lit/scss.js +4 -4
- package/dist/shared/lib/lit/template.d.ts +3 -0
- package/dist/shared/vendor/lit-element-lit-element.js +45 -0
- package/dist/shared/vendor/lit-element-lit-element.js.map +1 -0
- package/dist/shared/vendor/lit-html-directive-helpers.js +32 -0
- package/dist/shared/vendor/lit-html-directive-helpers.js.map +1 -0
- package/dist/shared/vendor/lit-html-directive.js +23 -0
- package/dist/shared/vendor/lit-html-directive.js.map +1 -0
- package/dist/shared/vendor/lit-html-keyed.js +18 -0
- package/dist/shared/vendor/lit-html-keyed.js.map +1 -0
- package/dist/shared/vendor/lit-html-lit-html.js +234 -0
- package/dist/shared/vendor/lit-html-lit-html.js.map +1 -0
- package/dist/shared/vendor/lit-html-repeat.js +57 -0
- package/dist/shared/vendor/lit-html-repeat.js.map +1 -0
- package/dist/shared/vendor/lit-html-unsafe-html.js +21 -0
- package/dist/shared/vendor/lit-html-unsafe-html.js.map +1 -0
- package/dist/shared/vendor/lit-html-unsafe-svg.js +10 -0
- package/dist/shared/vendor/lit-html-unsafe-svg.js.map +1 -0
- package/dist/shared/vendor/lit-reactive-element-base.js +5 -0
- package/dist/shared/vendor/lit-reactive-element-base.js.map +1 -0
- package/dist/shared/vendor/lit-reactive-element-css-tag.js +46 -0
- package/dist/shared/vendor/lit-reactive-element-css-tag.js.map +1 -0
- package/dist/shared/vendor/lit-reactive-element-property.js +33 -0
- package/dist/shared/vendor/lit-reactive-element-property.js.map +1 -0
- package/dist/shared/vendor/lit-reactive-element-query.js +13 -0
- package/dist/shared/vendor/lit-reactive-element-query.js.map +1 -0
- package/dist/shared/vendor/lit-reactive-element-reactive-element.js +226 -0
- package/dist/shared/vendor/lit-reactive-element-reactive-element.js.map +1 -0
- package/dist/shared/vendor/lit-reactive-element-state.js +8 -0
- package/dist/shared/vendor/lit-reactive-element-state.js.map +1 -0
- package/package.json +5 -2
- package/dist/index.d.ts +0 -734
|
@@ -1,15 +1,19 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import "../../../../shared/vendor/lit-reactive-element-reactive-element.js";
|
|
2
|
+
import { nothing as g } from "../../../../shared/vendor/lit-html-lit-html.js";
|
|
3
|
+
import { LitElement as p } from "../../../../shared/vendor/lit-element-lit-element.js";
|
|
4
|
+
import { property as c } from "../../../../shared/vendor/lit-reactive-element-property.js";
|
|
5
|
+
import { Component as l } from "../../../../shared/lib/lit/component.js";
|
|
4
6
|
import { scss as u } from "../../../../shared/lib/lit/scss.js";
|
|
5
|
-
import { OS_LEADERBOARD_CASINO_STATS as
|
|
6
|
-
import { osLeaderboardCasinoTheme as
|
|
7
|
+
import { OS_LEADERBOARD_CASINO_STATS as f } from "../../constants/tags.js";
|
|
8
|
+
import { osLeaderboardCasinoTheme as h } from "../../theme/styles.js";
|
|
9
|
+
import "../../../../shared/vendor/lit-html-unsafe-svg.js";
|
|
10
|
+
import "./components/stat-rail/stat-rail.js";
|
|
7
11
|
import b from "./stats-section.html.js";
|
|
8
12
|
import S from "./stats-section.scss.js";
|
|
9
|
-
var L = Object.defineProperty, d = Object.getOwnPropertyDescriptor,
|
|
10
|
-
for (var t = i > 1 ? void 0 : i ? d(e,
|
|
11
|
-
(
|
|
12
|
-
return i && t && L(e,
|
|
13
|
+
var L = Object.defineProperty, d = Object.getOwnPropertyDescriptor, a = (r, e, o, i) => {
|
|
14
|
+
for (var t = i > 1 ? void 0 : i ? d(e, o) : e, n = r.length - 1, m; n >= 0; n--)
|
|
15
|
+
(m = r[n]) && (t = (i ? m(e, o, t) : m(t)) || t);
|
|
16
|
+
return i && t && L(e, o, t), t;
|
|
13
17
|
};
|
|
14
18
|
function P(r, e = "USD") {
|
|
15
19
|
try {
|
|
@@ -22,7 +26,7 @@ function P(r, e = "USD") {
|
|
|
22
26
|
return r.toLocaleString();
|
|
23
27
|
}
|
|
24
28
|
}
|
|
25
|
-
let s = class extends
|
|
29
|
+
let s = class extends p {
|
|
26
30
|
get participantsLabel() {
|
|
27
31
|
return this.section.totalParticipants.toLocaleString();
|
|
28
32
|
}
|
|
@@ -51,15 +55,15 @@ let s = class extends m {
|
|
|
51
55
|
return "end";
|
|
52
56
|
}
|
|
53
57
|
render() {
|
|
54
|
-
return this.section ? b(this) :
|
|
58
|
+
return this.section ? b(this) : g;
|
|
55
59
|
}
|
|
56
60
|
};
|
|
57
|
-
s.styles = [
|
|
58
|
-
|
|
59
|
-
|
|
61
|
+
s.styles = [h, u(S)];
|
|
62
|
+
a([
|
|
63
|
+
c({ attribute: !1 })
|
|
60
64
|
], s.prototype, "section", 2);
|
|
61
|
-
s =
|
|
62
|
-
|
|
65
|
+
s = a([
|
|
66
|
+
l({ selector: f })
|
|
63
67
|
], s);
|
|
64
68
|
export {
|
|
65
69
|
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":"
|
|
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;AAAAA,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
|
+
}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
1
|
+
import "../../../../shared/vendor/lit-reactive-element-reactive-element.js";
|
|
2
|
+
import { html as s } from "../../../../shared/vendor/lit-html-lit-html.js";
|
|
3
|
+
import "../../../../shared/vendor/lit-element-lit-element.js";
|
|
4
|
+
function c(a) {
|
|
3
5
|
return s`<section>
|
|
4
6
|
<div class="section-header">
|
|
5
7
|
<h2 class="section-title">${a.sectionTitle}</h2>
|
|
@@ -33,6 +35,6 @@ function n(a) {
|
|
|
33
35
|
`;
|
|
34
36
|
}
|
|
35
37
|
export {
|
|
36
|
-
|
|
38
|
+
c as default
|
|
37
39
|
};
|
|
38
40
|
//# sourceMappingURL=table-section.html.js.map
|
package/dist/components/os-leaderboard-casino/sections/table-section/table-section.html.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table-section.html.js","sources":["../../../../../src/components/os-leaderboard-casino/sections/table-section/table-section.html?lit-html"],"sourcesContent":["\nimport { html } from 'lit';\n\nexport default function render(host) {\n return html`<section>\n <div class=\"section-header\">\n <h2 class=\"section-title\">${host.sectionTitle}</h2>\n </div>\n\n <div class=\"card-shell\">\n <div class=\"card-accent\" aria-hidden=\"true\"></div>\n <div class=\"card\">\n <div class=\"table-scroll\">\n <div class=\"table-head\">\n <span class=\"col-rank\">Rank</span>\n <span class=\"col-player\">Player</span>\n <span class=\"col-games\">Games</span>\n <span class=\"col-win-rate\">Win rate</span>\n <span class=\"col-bet\">Total bet</span>\n <span class=\"col-points\">Points</span>\n <span class=\"col-rank-change\">Change</span>\n </div>\n <div class=\"empty\" ?hidden=${host.hasPlayers}>${host.emptyMessage}</div>\n ${host.renderPlayers()}\n <div class=\"divider\" ?hidden=${!host.showPinned}>Your position</div>\n ${host.renderPinnedRow()}\n </div>\n </div>\n </div>\n\n <button type=\"button\" class=\"cta\" @click=${host.onOpenClick}>\n ${host.ctaLabel}\n </button>\n</section>\n`;\n}\n"],"names":["render","host","html"],"mappings":"
|
|
1
|
+
{"version":3,"file":"table-section.html.js","sources":["../../../../../src/components/os-leaderboard-casino/sections/table-section/table-section.html?lit-html"],"sourcesContent":["\nimport { html } from 'lit';\n\nexport default function render(host) {\n return html`<section>\n <div class=\"section-header\">\n <h2 class=\"section-title\">${host.sectionTitle}</h2>\n </div>\n\n <div class=\"card-shell\">\n <div class=\"card-accent\" aria-hidden=\"true\"></div>\n <div class=\"card\">\n <div class=\"table-scroll\">\n <div class=\"table-head\">\n <span class=\"col-rank\">Rank</span>\n <span class=\"col-player\">Player</span>\n <span class=\"col-games\">Games</span>\n <span class=\"col-win-rate\">Win rate</span>\n <span class=\"col-bet\">Total bet</span>\n <span class=\"col-points\">Points</span>\n <span class=\"col-rank-change\">Change</span>\n </div>\n <div class=\"empty\" ?hidden=${host.hasPlayers}>${host.emptyMessage}</div>\n ${host.renderPlayers()}\n <div class=\"divider\" ?hidden=${!host.showPinned}>Your position</div>\n ${host.renderPinnedRow()}\n </div>\n </div>\n </div>\n\n <button type=\"button\" class=\"cta\" @click=${host.onOpenClick}>\n ${host.ctaLabel}\n </button>\n</section>\n`;\n}\n"],"names":["render","host","html"],"mappings":";;;AAGe,SAASA,EAAOC,GAAM;AACnC,SAAOC;AAAAA;AAAAA,gCAEuBD,EAAK,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mCAgBdA,EAAK,UAAU,IAAIA,EAAK,YAAY;AAAA,QAC/DA,EAAK,cAAa,CAAE;AAAA,qCACS,CAACA,EAAK,UAAU;AAAA,QAC7CA,EAAK,gBAAe,CAAE;AAAA;AAAA;AAAA;AAAA;AAAA,6CAKeA,EAAK,WAAW;AAAA,MACvDA,EAAK,QAAQ;AAAA;AAAA;AAAA;AAInB;"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import "../../../../shared/vendor/lit-reactive-element-reactive-element.js";
|
|
2
|
+
import { html as r, nothing as i } from "../../../../shared/vendor/lit-html-lit-html.js";
|
|
3
|
+
import { LitElement as f } from "../../../../shared/vendor/lit-element-lit-element.js";
|
|
4
|
+
import { property as d } from "../../../../shared/vendor/lit-reactive-element-property.js";
|
|
5
|
+
import { unsafeSVG as c } from "../../../../shared/vendor/lit-html-unsafe-svg.js";
|
|
4
6
|
import v from "../../assets/icons/table.rank-up.svg.js";
|
|
5
7
|
import b from "../../assets/icons/table.rank-down.svg.js";
|
|
6
8
|
import g from "../../assets/icons/table.rank-neutral.svg.js";
|
|
@@ -13,11 +15,12 @@ import { renderPlayerName as C } from "../../theme/vip-mark.js";
|
|
|
13
15
|
import { labelText as R } from "../../types/data.js";
|
|
14
16
|
import { prizeForRank as L, podiumVariantForRank as E } from "../../theme/prize-resolve.js";
|
|
15
17
|
import { OS_LEADERBOARD_CASINO_OPEN as O } from "../../types/events.js";
|
|
16
|
-
import
|
|
17
|
-
import A from "./table-section.
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
18
|
+
import "../prize-section/components/medal-coin/medal-coin.js";
|
|
19
|
+
import A from "./table-section.html.js";
|
|
20
|
+
import z from "./table-section.scss.js";
|
|
21
|
+
var D = Object.defineProperty, T = Object.getOwnPropertyDescriptor, p = (e, s, t, o) => {
|
|
22
|
+
for (var n = o > 1 ? void 0 : o ? T(s, t) : s, l = e.length - 1, u; l >= 0; l--)
|
|
23
|
+
(u = e[l]) && (n = (o ? u(s, t, n) : u(n)) || n);
|
|
21
24
|
return o && n && D(s, t, n), n;
|
|
22
25
|
};
|
|
23
26
|
function U(e) {
|
|
@@ -160,20 +163,20 @@ let a = class extends f {
|
|
|
160
163
|
return e ? this.renderRow(e) : i;
|
|
161
164
|
}
|
|
162
165
|
render() {
|
|
163
|
-
return this.section ?
|
|
166
|
+
return this.section ? A(this) : i;
|
|
164
167
|
}
|
|
165
168
|
};
|
|
166
|
-
a.styles = [S, y(
|
|
167
|
-
|
|
169
|
+
a.styles = [S, y(z)];
|
|
170
|
+
p([
|
|
168
171
|
d({ attribute: !1 })
|
|
169
172
|
], a.prototype, "section", 2);
|
|
170
|
-
|
|
173
|
+
p([
|
|
171
174
|
d({ type: String })
|
|
172
175
|
], a.prototype, "uuid", 2);
|
|
173
|
-
|
|
176
|
+
p([
|
|
174
177
|
d({ type: Boolean })
|
|
175
178
|
], a.prototype, "finished", 2);
|
|
176
|
-
a =
|
|
179
|
+
a = p([
|
|
177
180
|
k({ selector: P })
|
|
178
181
|
], a);
|
|
179
182
|
export {
|
|
@@ -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;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { LabelKey } from '../types/data.js';
|
|
2
|
+
import { GameIconName, IconHandle, IconRenderOptions, PrizeIconName, StatIconName, WinIconName } from '../types/icons.js';
|
|
3
|
+
import { TemplateResult } from 'lit';
|
|
4
|
+
export type { GameIconName, IconHandle, IconName, IconRenderOptions, PrizeIconName, StatIconName, WinIconName, } from '../types/icons.js';
|
|
5
|
+
/** Registry-backed icon loader for os-leaderboard-casino. */
|
|
6
|
+
export declare class IconService {
|
|
7
|
+
private readonly registry;
|
|
8
|
+
private loadPromise;
|
|
9
|
+
private loaded;
|
|
10
|
+
/** Load all bundled SVG and game image icons. Call once on app start. */
|
|
11
|
+
load(): Promise<void>;
|
|
12
|
+
/** Pick a loaded icon by registry name, e.g. `prize.free-spins`. */
|
|
13
|
+
get(name: string): IconHandle;
|
|
14
|
+
has(name: string): boolean;
|
|
15
|
+
resolvePrizeIconName(label: LabelKey | string | undefined): PrizeIconName;
|
|
16
|
+
resolveGameIconName(id: string, index: number): GameIconName;
|
|
17
|
+
resolveWinIconName(name: string, index: number): WinIconName;
|
|
18
|
+
resolveStatIconName(name: string): StatIconName;
|
|
19
|
+
render(name: string, options?: IconRenderOptions): TemplateResult;
|
|
20
|
+
svg(name: string): TemplateResult;
|
|
21
|
+
url(name: string): string;
|
|
22
|
+
private assertLoaded;
|
|
23
|
+
}
|
|
24
|
+
export declare const iconService: IconService;
|
|
25
|
+
export declare function prizeIconSvg(label: LabelKey | string | undefined): TemplateResult;
|
|
26
|
+
export declare function renderPrizeIcon(label: LabelKey | string | undefined, className?: string): TemplateResult;
|
|
27
|
+
export declare function resolveGameImage(id: string, index: number): string;
|
|
28
|
+
export declare function winIcon(name: string): TemplateResult;
|
|
@@ -3,8 +3,8 @@ import m from "../assets/icons/prize.default.svg.js";
|
|
|
3
3
|
import g from "../assets/icons/prize.elite-bonus.svg.js";
|
|
4
4
|
import l from "../assets/icons/prize.free-spins.svg.js";
|
|
5
5
|
import _ from "../assets/icons/prize.grand-jackpot.svg.js";
|
|
6
|
-
import
|
|
7
|
-
import
|
|
6
|
+
import p from "../assets/icons/prize.high-roller.svg.js";
|
|
7
|
+
import u from "../assets/icons/prize.mystery-bonus.svg.js";
|
|
8
8
|
import f from "../assets/icons/stat.clock.svg.js";
|
|
9
9
|
import v from "../assets/icons/stat.gift.svg.js";
|
|
10
10
|
import d from "../assets/icons/stat.users.svg.js";
|
|
@@ -18,8 +18,10 @@ import z from "../assets/icons/win.coin.svg.js";
|
|
|
18
18
|
import S from "../assets/icons/win.fire.svg.js";
|
|
19
19
|
import $ from "../assets/icons/win.gem.svg.js";
|
|
20
20
|
import N from "../assets/icons/win.trophy.svg.js";
|
|
21
|
-
import
|
|
22
|
-
import {
|
|
21
|
+
import "../../../shared/vendor/lit-reactive-element-reactive-element.js";
|
|
22
|
+
import { html as o } from "../../../shared/vendor/lit-html-lit-html.js";
|
|
23
|
+
import "../../../shared/vendor/lit-element-lit-element.js";
|
|
24
|
+
import { unsafeSVG as n } from "../../../shared/vendor/lit-html-unsafe-svg.js";
|
|
23
25
|
import { labelText as O } from "../types/data.js";
|
|
24
26
|
import E from "../assets/images/games/cards.png.js";
|
|
25
27
|
import L from "../assets/images/games/chips.png.js";
|
|
@@ -33,8 +35,8 @@ const M = /* @__PURE__ */ Object.assign({
|
|
|
33
35
|
"../assets/icons/prize.elite-bonus.svg": g,
|
|
34
36
|
"../assets/icons/prize.free-spins.svg": l,
|
|
35
37
|
"../assets/icons/prize.grand-jackpot.svg": _,
|
|
36
|
-
"../assets/icons/prize.high-roller.svg":
|
|
37
|
-
"../assets/icons/prize.mystery-bonus.svg":
|
|
38
|
+
"../assets/icons/prize.high-roller.svg": p,
|
|
39
|
+
"../assets/icons/prize.mystery-bonus.svg": u,
|
|
38
40
|
"../assets/icons/stat.clock.svg": f,
|
|
39
41
|
"../assets/icons/stat.gift.svg": v,
|
|
40
42
|
"../assets/icons/stat.users.svg": d,
|
|
@@ -180,13 +182,13 @@ class T {
|
|
|
180
182
|
}
|
|
181
183
|
}
|
|
182
184
|
const V = new T();
|
|
183
|
-
function
|
|
185
|
+
function Ie(r) {
|
|
184
186
|
const e = r.startsWith("win.") ? r : `win.${r}`;
|
|
185
187
|
return V.svg(e);
|
|
186
188
|
}
|
|
187
189
|
export {
|
|
188
190
|
T as IconService,
|
|
189
191
|
V as iconService,
|
|
190
|
-
|
|
192
|
+
Ie as winIcon
|
|
191
193
|
};
|
|
192
194
|
//# sourceMappingURL=icon.service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"icon.service.js","sources":["../../../../src/components/os-leaderboard-casino/services/icon.service.ts"],"sourcesContent":["import { html } from 'lit';\nimport { unsafeSVG } from 'lit/directives/unsafe-svg.js';\nimport { labelText, type LabelKey } from '@os-leaderboard-casino/types/data.js';\nimport cards from '../assets/images/games/cards.png?url';\nimport chips from '../assets/images/games/chips.png?url';\nimport dice from '../assets/images/games/dice.png?url';\nimport gatesOfOlympus from '../assets/images/games/gates-of-olympus.png?url';\nimport roulette from '../assets/images/games/roulette.png?url';\nimport slotMachine from '../assets/images/games/slot-machine.png?url';\nimport type {\n GameIconName,\n IconHandle,\n IconName,\n IconRenderOptions,\n PrizeIconName,\n StatIconName,\n WinIconName,\n} from '../types/icons.js';\nimport type { TemplateResult } from 'lit';\n\nexport type {\n GameIconName,\n IconHandle,\n IconName,\n IconRenderOptions,\n PrizeIconName,\n StatIconName,\n WinIconName,\n} from '../types/icons.js';\n\nconst svgModules = import.meta.glob('../assets/icons/*.svg', {\n query: '?raw',\n import: 'default',\n eager: true,\n}) as Record<string, string>;\n\nconst GAME_ICON_URLS: Record<GameIconName, string> = {\n 'game.cards': cards,\n 'game.chips': chips,\n 'game.dice': dice,\n 'game.gates-of-olympus': gatesOfOlympus,\n 'game.roulette': roulette,\n 'game.slot-machine': slotMachine,\n};\n\nconst GAME_ICON_FALLBACK_ORDER: readonly GameIconName[] = [\n 'game.cards',\n 'game.chips',\n 'game.dice',\n 'game.gates-of-olympus',\n 'game.roulette',\n 'game.slot-machine',\n];\n\nconst GAME_ID_TO_ICON: Record<string, GameIconName> = {\n cards: 'game.cards',\n chips: 'game.chips',\n dice: 'game.dice',\n 'gates-of-olympus': 'game.gates-of-olympus',\n roulette: 'game.roulette',\n 'slot-machine': 'game.slot-machine',\n};\n\nfunction iconNameFromPath(path: string): string {\n return path.match(/\\/([^/]+)\\.svg$/)?.[1] ?? '';\n}\n\nfunction createSvgHandle(name: IconName, markup: string): IconHandle {\n return {\n name,\n kind: 'svg',\n svg() {\n return html`${unsafeSVG(markup)}`;\n },\n render({ className = '' } = {}) {\n const content = html`${unsafeSVG(markup)}`;\n return className\n ? html`<span class=${className}>${content}</span>`\n : content;\n },\n };\n}\n\nfunction createImageHandle(name: IconName, url: string): IconHandle {\n return {\n name,\n kind: 'image',\n url,\n svg() {\n throw new Error(`[IconService] Icon \"${name}\" is an image, not SVG`);\n },\n render({ className = '', alt = '' } = {}) {\n return html`<img\n src=${url}\n alt=${alt}\n class=${className}\n loading=\"lazy\"\n />`;\n },\n };\n}\n\nfunction resolvePrizeIconName(\n label: LabelKey | string | undefined,\n): PrizeIconName {\n const text = labelText(label).toLowerCase();\n\n if (text.includes('grand jackpot') || text === 'jackpot') {\n return 'prize.grand-jackpot';\n }\n if (text.includes('elite bonus')) {\n return 'prize.elite-bonus';\n }\n if (text.includes('high roller')) {\n return 'prize.high-roller';\n }\n if (text.includes('free spin')) {\n return 'prize.free-spins';\n }\n if (text.includes('casino credit')) {\n return 'prize.casino-credits';\n }\n if (text.includes('mystery')) {\n return 'prize.mystery-bonus';\n }\n\n return 'prize.default';\n}\n\nfunction resolveGameIconName(id: string, index: number): GameIconName {\n return (\n GAME_ID_TO_ICON[id] ??\n GAME_ICON_FALLBACK_ORDER[index % GAME_ICON_FALLBACK_ORDER.length]\n );\n}\n\n/** Registry-backed icon loader for os-leaderboard-casino. */\nexport class IconService {\n private readonly registry = new Map<string, IconHandle>();\n private loadPromise: Promise<void> | null = null;\n private loaded = false;\n\n /** Load all bundled SVG and game image icons. Call once on app start. */\n async load(): Promise<void> {\n if (this.loaded) return;\n if (this.loadPromise) return this.loadPromise;\n\n this.loadPromise = (async () => {\n for (const [path, markup] of Object.entries(svgModules)) {\n const name = iconNameFromPath(path);\n if (!name) continue;\n this.registry.set(name, createSvgHandle(name as IconName, markup));\n }\n\n for (const [name, url] of Object.entries(GAME_ICON_URLS)) {\n this.registry.set(name, createImageHandle(name as IconName, url));\n }\n\n this.loaded = true;\n })();\n\n return this.loadPromise;\n }\n\n /** Pick a loaded icon by registry name, e.g. `prize.free-spins`. */\n get(name: string): IconHandle {\n this.assertLoaded();\n const icon = this.registry.get(name);\n if (!icon) {\n throw new Error(`[IconService] Unknown icon \"${name}\"`);\n }\n return icon;\n }\n\n has(name: string): boolean {\n this.assertLoaded();\n return this.registry.has(name);\n }\n\n resolvePrizeIconName(label: LabelKey | string | undefined): PrizeIconName {\n return resolvePrizeIconName(label);\n }\n\n resolveGameIconName(id: string, index: number): GameIconName {\n return resolveGameIconName(id, index);\n }\n\n resolveWinIconName(name: string, index: number): WinIconName {\n const key = `win.${name}` as WinIconName;\n if (this.has(key)) return key;\n\n const fallback: WinIconName[] = [\n 'win.bag',\n 'win.coin',\n 'win.trophy',\n 'win.fire',\n 'win.gem',\n 'win.bolt',\n ];\n return fallback[index % fallback.length];\n }\n\n resolveStatIconName(name: string): StatIconName {\n const key = `stat.${name}` as StatIconName;\n return this.has(key) ? key : 'stat.users';\n }\n\n render(name: string, options?: IconRenderOptions): TemplateResult {\n return this.get(name).render(options);\n }\n\n svg(name: string): TemplateResult {\n return this.get(name).svg();\n }\n\n url(name: string): string {\n const icon = this.get(name);\n if (icon.kind !== 'image' || !icon.url) {\n throw new Error(`[IconService] Icon \"${name}\" has no image URL`);\n }\n return icon.url;\n }\n\n private assertLoaded(): void {\n if (!this.loaded) {\n throw new Error('[IconService] Call load() before get()');\n }\n }\n}\n\nexport const iconService = new IconService();\n\nexport function prizeIconSvg(\n label: LabelKey | string | undefined,\n): TemplateResult {\n return iconService.svg(iconService.resolvePrizeIconName(label));\n}\n\nexport function renderPrizeIcon(\n label: LabelKey | string | undefined,\n className = '',\n): TemplateResult {\n return iconService.render(iconService.resolvePrizeIconName(label), {\n className: ['prize-icon', className].filter(Boolean).join(' '),\n });\n}\n\nexport function resolveGameImage(id: string, index: number): string {\n return iconService.url(iconService.resolveGameIconName(id, index));\n}\n\nexport function winIcon(name: string): TemplateResult {\n const registryName = name.startsWith('win.') ? name : `win.${name}`;\n return iconService.svg(registryName);\n}\n"],"names":["svgModules","__vite_glob_0_0","__vite_glob_0_1","__vite_glob_0_2","__vite_glob_0_3","__vite_glob_0_4","__vite_glob_0_5","__vite_glob_0_6","__vite_glob_0_7","__vite_glob_0_8","__vite_glob_0_9","__vite_glob_0_10","__vite_glob_0_11","__vite_glob_0_12","__vite_glob_0_13","__vite_glob_0_14","__vite_glob_0_15","__vite_glob_0_16","__vite_glob_0_17","__vite_glob_0_18","__vite_glob_0_19","GAME_ICON_URLS","cards","chips","dice","gatesOfOlympus","roulette","slotMachine","GAME_ICON_FALLBACK_ORDER","GAME_ID_TO_ICON","iconNameFromPath","path","createSvgHandle","name","markup","html","unsafeSVG","className","content","createImageHandle","url","alt","resolvePrizeIconName","label","text","labelText","resolveGameIconName","id","index","IconService","icon","key","fallback","options","iconService","winIcon","registryName"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"icon.service.js","sources":["../../../../src/components/os-leaderboard-casino/services/icon.service.ts"],"sourcesContent":["import { html } from 'lit';\nimport { unsafeSVG } from 'lit/directives/unsafe-svg.js';\nimport { labelText, type LabelKey } from '@os-leaderboard-casino/types/data.js';\nimport cards from '../assets/images/games/cards.png?url';\nimport chips from '../assets/images/games/chips.png?url';\nimport dice from '../assets/images/games/dice.png?url';\nimport gatesOfOlympus from '../assets/images/games/gates-of-olympus.png?url';\nimport roulette from '../assets/images/games/roulette.png?url';\nimport slotMachine from '../assets/images/games/slot-machine.png?url';\nimport type {\n GameIconName,\n IconHandle,\n IconName,\n IconRenderOptions,\n PrizeIconName,\n StatIconName,\n WinIconName,\n} from '../types/icons.js';\nimport type { TemplateResult } from 'lit';\n\nexport type {\n GameIconName,\n IconHandle,\n IconName,\n IconRenderOptions,\n PrizeIconName,\n StatIconName,\n WinIconName,\n} from '../types/icons.js';\n\nconst svgModules = import.meta.glob('../assets/icons/*.svg', {\n query: '?raw',\n import: 'default',\n eager: true,\n}) as Record<string, string>;\n\nconst GAME_ICON_URLS: Record<GameIconName, string> = {\n 'game.cards': cards,\n 'game.chips': chips,\n 'game.dice': dice,\n 'game.gates-of-olympus': gatesOfOlympus,\n 'game.roulette': roulette,\n 'game.slot-machine': slotMachine,\n};\n\nconst GAME_ICON_FALLBACK_ORDER: readonly GameIconName[] = [\n 'game.cards',\n 'game.chips',\n 'game.dice',\n 'game.gates-of-olympus',\n 'game.roulette',\n 'game.slot-machine',\n];\n\nconst GAME_ID_TO_ICON: Record<string, GameIconName> = {\n cards: 'game.cards',\n chips: 'game.chips',\n dice: 'game.dice',\n 'gates-of-olympus': 'game.gates-of-olympus',\n roulette: 'game.roulette',\n 'slot-machine': 'game.slot-machine',\n};\n\nfunction iconNameFromPath(path: string): string {\n return path.match(/\\/([^/]+)\\.svg$/)?.[1] ?? '';\n}\n\nfunction createSvgHandle(name: IconName, markup: string): IconHandle {\n return {\n name,\n kind: 'svg',\n svg() {\n return html`${unsafeSVG(markup)}`;\n },\n render({ className = '' } = {}) {\n const content = html`${unsafeSVG(markup)}`;\n return className\n ? html`<span class=${className}>${content}</span>`\n : content;\n },\n };\n}\n\nfunction createImageHandle(name: IconName, url: string): IconHandle {\n return {\n name,\n kind: 'image',\n url,\n svg() {\n throw new Error(`[IconService] Icon \"${name}\" is an image, not SVG`);\n },\n render({ className = '', alt = '' } = {}) {\n return html`<img\n src=${url}\n alt=${alt}\n class=${className}\n loading=\"lazy\"\n />`;\n },\n };\n}\n\nfunction resolvePrizeIconName(\n label: LabelKey | string | undefined,\n): PrizeIconName {\n const text = labelText(label).toLowerCase();\n\n if (text.includes('grand jackpot') || text === 'jackpot') {\n return 'prize.grand-jackpot';\n }\n if (text.includes('elite bonus')) {\n return 'prize.elite-bonus';\n }\n if (text.includes('high roller')) {\n return 'prize.high-roller';\n }\n if (text.includes('free spin')) {\n return 'prize.free-spins';\n }\n if (text.includes('casino credit')) {\n return 'prize.casino-credits';\n }\n if (text.includes('mystery')) {\n return 'prize.mystery-bonus';\n }\n\n return 'prize.default';\n}\n\nfunction resolveGameIconName(id: string, index: number): GameIconName {\n return (\n GAME_ID_TO_ICON[id] ??\n GAME_ICON_FALLBACK_ORDER[index % GAME_ICON_FALLBACK_ORDER.length]\n );\n}\n\n/** Registry-backed icon loader for os-leaderboard-casino. */\nexport class IconService {\n private readonly registry = new Map<string, IconHandle>();\n private loadPromise: Promise<void> | null = null;\n private loaded = false;\n\n /** Load all bundled SVG and game image icons. Call once on app start. */\n async load(): Promise<void> {\n if (this.loaded) return;\n if (this.loadPromise) return this.loadPromise;\n\n this.loadPromise = (async () => {\n for (const [path, markup] of Object.entries(svgModules)) {\n const name = iconNameFromPath(path);\n if (!name) continue;\n this.registry.set(name, createSvgHandle(name as IconName, markup));\n }\n\n for (const [name, url] of Object.entries(GAME_ICON_URLS)) {\n this.registry.set(name, createImageHandle(name as IconName, url));\n }\n\n this.loaded = true;\n })();\n\n return this.loadPromise;\n }\n\n /** Pick a loaded icon by registry name, e.g. `prize.free-spins`. */\n get(name: string): IconHandle {\n this.assertLoaded();\n const icon = this.registry.get(name);\n if (!icon) {\n throw new Error(`[IconService] Unknown icon \"${name}\"`);\n }\n return icon;\n }\n\n has(name: string): boolean {\n this.assertLoaded();\n return this.registry.has(name);\n }\n\n resolvePrizeIconName(label: LabelKey | string | undefined): PrizeIconName {\n return resolvePrizeIconName(label);\n }\n\n resolveGameIconName(id: string, index: number): GameIconName {\n return resolveGameIconName(id, index);\n }\n\n resolveWinIconName(name: string, index: number): WinIconName {\n const key = `win.${name}` as WinIconName;\n if (this.has(key)) return key;\n\n const fallback: WinIconName[] = [\n 'win.bag',\n 'win.coin',\n 'win.trophy',\n 'win.fire',\n 'win.gem',\n 'win.bolt',\n ];\n return fallback[index % fallback.length];\n }\n\n resolveStatIconName(name: string): StatIconName {\n const key = `stat.${name}` as StatIconName;\n return this.has(key) ? key : 'stat.users';\n }\n\n render(name: string, options?: IconRenderOptions): TemplateResult {\n return this.get(name).render(options);\n }\n\n svg(name: string): TemplateResult {\n return this.get(name).svg();\n }\n\n url(name: string): string {\n const icon = this.get(name);\n if (icon.kind !== 'image' || !icon.url) {\n throw new Error(`[IconService] Icon \"${name}\" has no image URL`);\n }\n return icon.url;\n }\n\n private assertLoaded(): void {\n if (!this.loaded) {\n throw new Error('[IconService] Call load() before get()');\n }\n }\n}\n\nexport const iconService = new IconService();\n\nexport function prizeIconSvg(\n label: LabelKey | string | undefined,\n): TemplateResult {\n return iconService.svg(iconService.resolvePrizeIconName(label));\n}\n\nexport function renderPrizeIcon(\n label: LabelKey | string | undefined,\n className = '',\n): TemplateResult {\n return iconService.render(iconService.resolvePrizeIconName(label), {\n className: ['prize-icon', className].filter(Boolean).join(' '),\n });\n}\n\nexport function resolveGameImage(id: string, index: number): string {\n return iconService.url(iconService.resolveGameIconName(id, index));\n}\n\nexport function winIcon(name: string): TemplateResult {\n const registryName = name.startsWith('win.') ? name : `win.${name}`;\n return iconService.svg(registryName);\n}\n"],"names":["svgModules","__vite_glob_0_0","__vite_glob_0_1","__vite_glob_0_2","__vite_glob_0_3","__vite_glob_0_4","__vite_glob_0_5","__vite_glob_0_6","__vite_glob_0_7","__vite_glob_0_8","__vite_glob_0_9","__vite_glob_0_10","__vite_glob_0_11","__vite_glob_0_12","__vite_glob_0_13","__vite_glob_0_14","__vite_glob_0_15","__vite_glob_0_16","__vite_glob_0_17","__vite_glob_0_18","__vite_glob_0_19","GAME_ICON_URLS","cards","chips","dice","gatesOfOlympus","roulette","slotMachine","GAME_ICON_FALLBACK_ORDER","GAME_ID_TO_ICON","iconNameFromPath","path","createSvgHandle","name","markup","html","unsafeSVG","className","content","createImageHandle","url","alt","resolvePrizeIconName","label","text","labelText","resolveGameIconName","id","index","IconService","icon","key","fallback","options","iconService","winIcon","registryName"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { AdapterService, adapterService } from './adapter.service.js';
|
|
2
|
+
export { IconService, iconService, type GameIconName, type IconHandle, type IconName, type IconRenderOptions, type PrizeIconName, type StatIconName, type WinIconName, prizeIconSvg, renderPrizeIcon, resolveGameImage, winIcon, } from './icon.service.js';
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
/** Normalize `#rgb`, `#rrggbb`, or `#rrggbbaa` to lowercase `#rrggbb`. */
|
|
2
|
+
export declare function normalizeHexColor(input: string): string | null;
|
|
3
|
+
/** Map a client hex background to host CSS custom properties. */
|
|
4
|
+
export declare function resolveBackgroundVars(background: string): Record<string, string> | null;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
const e = /^#?(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/;
|
|
2
|
+
function o(n) {
|
|
3
|
+
return n.length !== 3 ? n : n.split("").map((t) => t + t).join("");
|
|
4
|
+
}
|
|
5
|
+
function i(n) {
|
|
6
|
+
const t = n.trim();
|
|
7
|
+
if (!e.test(t)) return null;
|
|
8
|
+
let r = t.startsWith("#") ? t.slice(1) : t;
|
|
9
|
+
return r = o(r), r.length === 8 && (r = r.slice(0, 6)), `#${r.toLowerCase()}`;
|
|
10
|
+
}
|
|
11
|
+
function s(n) {
|
|
12
|
+
const t = i(n);
|
|
13
|
+
return t ? {
|
|
14
|
+
"--os-casino-bg": t,
|
|
15
|
+
"--os-casino-bg-2": t
|
|
16
|
+
} : null;
|
|
17
|
+
}
|
|
18
|
+
export {
|
|
19
|
+
i as normalizeHexColor,
|
|
20
|
+
s as resolveBackgroundVars
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=background.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"background.js","sources":["../../../../src/components/os-leaderboard-casino/theme/background.ts"],"sourcesContent":["const HEX_COLOR =\n /^#?(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/;\n\nfunction expandShortHex(hex: string): string {\n if (hex.length !== 3) return hex;\n return hex\n .split('')\n .map((c) => c + c)\n .join('');\n}\n\n/** Normalize `#rgb`, `#rrggbb`, or `#rrggbbaa` to lowercase `#rrggbb`. */\nexport function normalizeHexColor(input: string): string | null {\n const trimmed = input.trim();\n if (!HEX_COLOR.test(trimmed)) return null;\n\n let hex = trimmed.startsWith('#') ? trimmed.slice(1) : trimmed;\n hex = expandShortHex(hex);\n if (hex.length === 8) hex = hex.slice(0, 6);\n\n return `#${hex.toLowerCase()}`;\n}\n\n/** Map a client hex background to host CSS custom properties. */\nexport function resolveBackgroundVars(\n background: string,\n): Record<string, string> | null {\n const bg = normalizeHexColor(background);\n if (!bg) return null;\n\n return {\n '--os-casino-bg': bg,\n '--os-casino-bg-2': bg,\n };\n}\n"],"names":["HEX_COLOR","expandShortHex","hex","c","normalizeHexColor","input","trimmed","resolveBackgroundVars","background","bg"],"mappings":"AAAA,MAAMA,IACJ;AAEF,SAASC,EAAeC,GAAqB;AAC3C,SAAIA,EAAI,WAAW,IAAUA,IACtBA,EACJ,MAAM,EAAE,EACR,IAAI,CAACC,MAAMA,IAAIA,CAAC,EAChB,KAAK,EAAE;AACZ;AAGO,SAASC,EAAkBC,GAA8B;AAC9D,QAAMC,IAAUD,EAAM,KAAA;AACtB,MAAI,CAACL,EAAU,KAAKM,CAAO,EAAG,QAAO;AAErC,MAAIJ,IAAMI,EAAQ,WAAW,GAAG,IAAIA,EAAQ,MAAM,CAAC,IAAIA;AACvD,SAAAJ,IAAMD,EAAeC,CAAG,GACpBA,EAAI,WAAW,UAASA,EAAI,MAAM,GAAG,CAAC,IAEnC,IAAIA,EAAI,YAAA,CAAa;AAC9B;AAGO,SAASK,EACdC,GAC+B;AAC/B,QAAMC,IAAKL,EAAkBI,CAAU;AACvC,SAAKC,IAEE;AAAA,IACL,kBAAkBA;AAAA,IAClB,oBAAoBA;AAAA,EAAA,IAJN;AAMlB;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { prizeIconSvg, renderPrizeIcon, } from '../services/icon.service.js';
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { QuizPrize } from '../types/data.js';
|
|
2
|
+
/** Prize tier that covers `rank` (inclusive range). */
|
|
3
|
+
export declare function prizeForRank(prizes: QuizPrize[], rank: number): QuizPrize | undefined;
|
|
4
|
+
export declare function isPodiumPrize(prize: QuizPrize): boolean;
|
|
5
|
+
export declare function podiumVariantForRank(rank: 1 | 2 | 3): 'gold' | 'silver' | 'bronze';
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Design tokens — "casino noir" glam.
|
|
3
|
+
* Champagne gold on deep noir, glassy surfaces, soft neon accents.
|
|
4
|
+
* Each color token reads an external `--os-casino-*` override first so
|
|
5
|
+
* consumers can theme the component from outside the shadow DOM.
|
|
6
|
+
*/
|
|
7
|
+
export declare const osLeaderboardCasinoTheme: import('lit').CSSResult;
|
|
8
|
+
/** Shared glass-card recipe used across sections. */
|
|
9
|
+
export declare const glassCard: import('lit').CSSResult;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { css as a } from "
|
|
1
|
+
import { css as a } from "../../../shared/vendor/lit-reactive-element-css-tag.js";
|
|
2
2
|
const o = a`
|
|
3
3
|
:host {
|
|
4
|
-
--bg: var(--os-casino-bg, #
|
|
5
|
-
--bg-2: var(--os-casino-bg-2, #
|
|
4
|
+
--bg: var(--os-casino-bg, #181622);
|
|
5
|
+
--bg-2: var(--os-casino-bg-2, #181622);
|
|
6
6
|
--surface: var(--os-casino-surface, rgba(26, 19, 42, 0.78));
|
|
7
7
|
--surface-solid: var(--os-casino-surface-solid, #1a132a);
|
|
8
8
|
--surface-2: var(--os-casino-surface-2, rgba(38, 28, 60, 0.85));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"styles.js","sources":["../../../../src/components/os-leaderboard-casino/theme/styles.ts"],"sourcesContent":["import { css } from '@lit/reactive-element/css-tag.js';\n\n/**\n * Design tokens — \"casino noir\" glam.\n * Champagne gold on deep noir, glassy surfaces, soft neon accents.\n * Each color token reads an external `--os-casino-*` override first so\n * consumers can theme the component from outside the shadow DOM.\n */\nexport const osLeaderboardCasinoTheme = css`\n :host {\n --bg: var(--os-casino-bg, #
|
|
1
|
+
{"version":3,"file":"styles.js","sources":["../../../../src/components/os-leaderboard-casino/theme/styles.ts"],"sourcesContent":["import { css } from '@lit/reactive-element/css-tag.js';\n\n/**\n * Design tokens — \"casino noir\" glam.\n * Champagne gold on deep noir, glassy surfaces, soft neon accents.\n * Each color token reads an external `--os-casino-*` override first so\n * consumers can theme the component from outside the shadow DOM.\n */\nexport const osLeaderboardCasinoTheme = css`\n :host {\n --bg: var(--os-casino-bg, #181622);\n --bg-2: var(--os-casino-bg-2, #181622);\n --surface: var(--os-casino-surface, rgba(26, 19, 42, 0.78));\n --surface-solid: var(--os-casino-surface-solid, #1a132a);\n --surface-2: var(--os-casino-surface-2, rgba(38, 28, 60, 0.85));\n --glass-blur: 14px;\n --radius-lg: 20px;\n --hairline: var(--os-casino-hairline, rgba(255, 255, 255, 0.07));\n --hairline-strong: var(--os-casino-hairline-strong, rgba(255, 255, 255, 0.13));\n --hairline-gold: var(--os-casino-hairline-gold, rgba(245, 196, 81, 0.22));\n\n --text: var(--os-casino-text, #f7f3ff);\n --text-dim: var(--os-casino-text-dim, #ab9fce);\n --text-faint: var(--os-casino-text-faint, #6e6394);\n\n --gold: var(--os-casino-gold, #f5c451);\n --gold-strong: var(--os-casino-gold-strong, #ffe093);\n --gold-deep: var(--os-casino-gold-deep, #c98f1d);\n --gold-soft: var(--os-casino-gold-soft, rgba(245, 196, 81, 0.13));\n --gold-glow: var(--os-casino-gold-glow, rgba(245, 196, 81, 0.38));\n --gold-gradient: var(\n --os-casino-gold-gradient,\n linear-gradient(\n 120deg,\n #8a5e10 0%,\n #f5c451 28%,\n #ffe9b0 50%,\n #f5c451 72%,\n #8a5e10 100%\n )\n );\n\n --silver: var(--os-casino-silver, #cfd6e4);\n --silver-soft: var(--os-casino-silver-soft, rgba(207, 214, 228, 0.12));\n --bronze: var(--os-casino-bronze, #d99a66);\n --bronze-soft: var(--os-casino-bronze-soft, rgba(217, 154, 102, 0.12));\n\n --violet: var(--os-casino-violet, #9d6bff);\n --violet-soft: var(--os-casino-violet-soft, rgba(157, 107, 255, 0.16));\n --green: var(--os-casino-green, #41e6a5);\n --green-soft: var(--os-casino-green-soft, rgba(65, 230, 165, 0.13));\n --cyan: var(--os-casino-cyan, #5fe6ff);\n --cyan-soft: var(--os-casino-cyan-soft, rgba(95, 230, 255, 0.13));\n --red: var(--os-casino-red, #ff5d7c);\n --red-soft: var(--os-casino-red-soft, rgba(255, 93, 124, 0.13));\n\n --radius: 20px;\n --radius-sm: 13px;\n --shadow: 0 22px 48px -24px rgba(0, 0, 0, 0.95);\n --shadow-gold: 0 12px 42px -16px var(--gold-glow);\n\n --font-display: var(--os-casino-font-display, 'Sora', system-ui, sans-serif);\n --font-body: var(--os-casino-font-body, 'Inter', system-ui, sans-serif);\n --font-mono: var(--os-casino-font-mono, ui-monospace, 'JetBrains Mono', monospace);\n\n font-family: var(--font-body);\n\n --transition-fast: 0.2s ease;\n\n --accent-2: var(--os-casino-accent-2, color-mix(in srgb, var(--violet) 28%, transparent));\n\n --panel-bg: linear-gradient(\n 120deg,\n color-mix(in srgb, var(--surface-solid) 94%, transparent),\n color-mix(in srgb, var(--surface) 88%, transparent)\n );\n --panel-border: color-mix(in srgb, var(--violet) 22%, var(--hairline));\n --panel-shadow: 0 18px 50px -28px color-mix(in srgb, black 90%, transparent);\n --panel-fade-start: color-mix(in srgb, var(--surface-solid) 94%, transparent);\n --panel-fade-end: color-mix(in srgb, var(--surface) 88%, transparent);\n }\n\n .section-header {\n display: flex;\n align-items: baseline;\n gap: 12px;\n margin-bottom: 12px;\n }\n\n .section-header:has(.strategy) {\n align-items: center;\n }\n\n .section-title {\n margin: 0;\n font-family: var(--font-display);\n font-size: 15px;\n font-weight: 800;\n letter-spacing: 0.02em;\n color: var(--text);\n }\n\n .player-name {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n min-width: 0;\n max-width: 100%;\n }\n\n .player-name .name {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-weight: 700;\n }\n\n .player-name .vip-badge {\n flex: none;\n display: inline-flex;\n align-items: center;\n gap: 3px;\n font-family: var(--font-body);\n font-size: 9.5px;\n font-weight: 800;\n letter-spacing: 0.08em;\n line-height: 1;\n text-transform: uppercase;\n color: var(--gold);\n border: 1px solid color-mix(in srgb, var(--gold) 45%, transparent);\n border-radius: 5px;\n padding: 1px 5px;\n background: transparent;\n vertical-align: middle;\n }\n\n .player-name .vip-badge svg {\n width: 10px;\n height: 10px;\n flex-shrink: 0;\n }\n\n .prize-icon {\n display: inline-grid;\n place-items: center;\n flex: none;\n width: 18px;\n height: 18px;\n vertical-align: -3px;\n }\n\n .prize-icon--inline {\n width: 14px;\n height: 14px;\n vertical-align: -2px;\n }\n\n .prize-entry {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n min-width: 0;\n max-width: 100%;\n }\n\n .prize-entry .prize-label {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n min-width: 0;\n }\n`;\n\n/** Shared glass-card recipe used across sections. */\nexport const glassCard = css`\n .glass {\n background: var(--surface);\n border: 1px solid var(--hairline);\n border-radius: var(--radius);\n box-shadow: var(--shadow);\n backdrop-filter: blur(var(--glass-blur));\n -webkit-backdrop-filter: blur(var(--glass-blur));\n }\n`;\n"],"names":["osLeaderboardCasinoTheme","css"],"mappings":";AAQO,MAAMA,IAA2BC;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAsKfA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { nothing, TemplateResult } from 'lit';
|
|
2
|
+
/** v0 vip badge — slim outline tag with crown + VIP label. */
|
|
3
|
+
export declare function vipBadge(vip?: boolean): TemplateResult | typeof nothing;
|
|
4
|
+
export declare function renderPlayerName(username: string, options?: {
|
|
5
|
+
vip?: boolean;
|
|
6
|
+
suffix?: TemplateResult | typeof nothing;
|
|
7
|
+
}): TemplateResult;
|