@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,15 @@
1
+ import { TemplateResult } from 'lit';
2
+ import { OsLeaderboardCasinoClimbSection } from '../../types/sections.js';
3
+ export interface ClimbSectionHost {
4
+ section: OsLeaderboardCasinoClimbSection;
5
+ climbTitle: string;
6
+ pointsLabel: string;
7
+ trendClass: string;
8
+ pointsToNextLabel: string;
9
+ nextTierRank: number;
10
+ nextTierLabel: string;
11
+ progressPct: number;
12
+ renderName(): TemplateResult;
13
+ renderTrend(): TemplateResult;
14
+ renderNextTierPrizeIcon(): TemplateResult;
15
+ }
@@ -0,0 +1,5 @@
1
+ import { TemplateResult } from 'lit';
2
+ import { OsLeaderboardCasinoEventItem } from '../../../types/sections.js';
3
+ export type EventIconName = 'boost' | 'gift' | 'bolt' | 'fire' | 'star' | 'clock';
4
+ export declare const eventIcon: (name: EventIconName) => TemplateResult;
5
+ export declare function resolveEventIcon(event: OsLeaderboardCasinoEventItem): TemplateResult | string;
@@ -0,0 +1,16 @@
1
+ import { LitElement, nothing } from 'lit';
2
+ import { OsLeaderboardCasinoEventsSection } from '../../types/sections.js';
3
+ /** Promotional events — v0 Glass Glow (icon chip, fade rotation). */
4
+ export declare class OsLeaderboardCasinoEvents extends LitElement {
5
+ static styles: import('lit').CSSResult[];
6
+ section: OsLeaderboardCasinoEventsSection;
7
+ private index;
8
+ private timer?;
9
+ connectedCallback(): void;
10
+ disconnectedCallback(): void;
11
+ updated(changed: Map<string, unknown>): void;
12
+ private startRotation;
13
+ private stopRotation;
14
+ private goTo;
15
+ render(): typeof nothing | import('lit').TemplateResult<1>;
16
+ }
@@ -0,0 +1,8 @@
1
+ import { TemplateResult } from 'lit';
2
+ import { OsLeaderboardCasinoEventsSection } from '../../types/sections.js';
3
+ export interface EventsBannerHost {
4
+ section: OsLeaderboardCasinoEventsSection;
5
+ showDots: boolean;
6
+ renderSlides(): TemplateResult;
7
+ renderDots(): TemplateResult;
8
+ }
@@ -6,6 +6,7 @@ import { scss as u } from "../../../../shared/lib/lit/scss.js";
6
6
  import { DEFAULT_EVENTS_ROTATE_MS as b } from "../../constants/defaults.js";
7
7
  import { OS_LEADERBOARD_CASINO_EVENTS as _ } from "../../constants/tags.js";
8
8
  import { osLeaderboardCasinoTheme as $ } from "../../theme/styles.js";
9
+ import "lit/directives/unsafe-svg.js";
9
10
  import { resolveEventIcon as g } from "./components/event-icons.js";
10
11
  import E from "./events-banner.scss.js";
11
12
  var x = Object.defineProperty, R = Object.getOwnPropertyDescriptor, p = (t, e, n, s) => {
@@ -1 +1 @@
1
- {"version":3,"file":"events-banner.js","sources":["../../../../../src/components/os-leaderboard-casino/sections/events-banner/events-banner.ts"],"sourcesContent":["import { LitElement, html, nothing } from 'lit';\nimport { keyed } from 'lit/directives/keyed.js';\nimport { property, state } from 'lit/decorators.js';\nimport { Component } from '@oddsmith/lib/lit/component.js';\nimport { scss } from '@oddsmith/lib/lit/scss.js';\nimport { DEFAULT_EVENTS_ROTATE_MS } from '@os-leaderboard-casino/constants/defaults.js';\nimport { OS_LEADERBOARD_CASINO_EVENTS } from '@os-leaderboard-casino/constants/tags.js';\nimport { osLeaderboardCasinoTheme } from '@os-leaderboard-casino/theme/index.js';\nimport type { OsLeaderboardCasinoEventsSection } from '@os-leaderboard-casino/types/sections.js';\nimport { resolveEventIcon } from './components/event-icons.js';\nimport styles from './events-banner.scss?inline';\n\n/** Promotional events — v0 Glass Glow (icon chip, fade rotation). */\n@Component({ selector: OS_LEADERBOARD_CASINO_EVENTS })\nexport class OsLeaderboardCasinoEvents extends LitElement {\n static styles = [osLeaderboardCasinoTheme, scss(styles)];\n\n @property({ attribute: false })\n section!: OsLeaderboardCasinoEventsSection;\n\n @state()\n private index = 0;\n\n private timer?: ReturnType<typeof setInterval>;\n\n connectedCallback(): void {\n super.connectedCallback();\n this.startRotation();\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n this.stopRotation();\n }\n\n updated(changed: Map<string, unknown>) {\n if (changed.has('section')) {\n this.index = 0;\n this.startRotation();\n }\n }\n\n private startRotation() {\n this.stopRotation();\n const count = this.section?.events?.length ?? 0;\n if (count < 2) return;\n this.timer = setInterval(() => {\n this.index = (this.index + 1) % count;\n }, this.section?.rotateMs ?? DEFAULT_EVENTS_ROTATE_MS);\n }\n\n private stopRotation() {\n if (this.timer) clearInterval(this.timer);\n this.timer = undefined;\n }\n\n private goTo(index: number) {\n this.index = index;\n this.startRotation();\n }\n\n render() {\n const events = this.section?.events ?? [];\n if (!events.length) return nothing;\n\n const event = events[this.index];\n const accent = event.accent ?? 'gold';\n const icon = resolveEventIcon(event);\n\n return html`\n <div class=\"banner\" role=\"region\" aria-label=\"Promotions\" aria-live=\"polite\">\n <div class=\"chip accent-${accent}\">\n ${typeof icon === 'string' ? html`${icon}` : icon}\n </div>\n ${keyed(\n this.index,\n html`<div class=\"body\">\n <p class=\"title\">${event.title}</p>\n ${event.subtitle\n ? html`<p class=\"sub\">${event.subtitle}</p>`\n : nothing}\n </div>`,\n )}\n <div class=\"right\">\n <span class=\"tag accent-${accent}\">Event</span>\n ${events.length > 1\n ? html`<div class=\"dots\">\n ${events.map(\n (_, i) => html`<button\n type=\"button\"\n class=\"dot\"\n aria-current=${i === this.index ? 'true' : 'false'}\n aria-label=\"Show event ${i + 1}\"\n @click=${() => this.goTo(i)}\n ></button>`,\n )}\n </div>`\n : nothing}\n </div>\n </div>\n `;\n }\n}\n"],"names":["OsLeaderboardCasinoEvents","LitElement","changed","count","DEFAULT_EVENTS_ROTATE_MS","index","events","nothing","event","accent","icon","resolveEventIcon","html","keyed","_","osLeaderboardCasinoTheme","scss","styles","__decorateClass","property","state","Component","OS_LEADERBOARD_CASINO_EVENTS"],"mappings":";;;;;;;;;;;;;;;AAcO,IAAMA,IAAN,cAAwCC,EAAW;AAAA,EAAnD,cAAA;AAAA,UAAA,GAAA,SAAA,GAOL,KAAQ,QAAQ;AAAA,EAAA;AAAA,EAIhB,oBAA0B;AACxB,UAAM,kBAAA,GACN,KAAK,cAAA;AAAA,EACP;AAAA,EAEA,uBAA6B;AAC3B,UAAM,qBAAA,GACN,KAAK,aAAA;AAAA,EACP;AAAA,EAEA,QAAQC,GAA+B;AACrC,IAAIA,EAAQ,IAAI,SAAS,MACvB,KAAK,QAAQ,GACb,KAAK,cAAA;AAAA,EAET;AAAA,EAEQ,gBAAgB;AACtB,SAAK,aAAA;AACL,UAAMC,IAAQ,KAAK,SAAS,QAAQ,UAAU;AAC9C,IAAIA,IAAQ,MACZ,KAAK,QAAQ,YAAY,MAAM;AAC7B,WAAK,SAAS,KAAK,QAAQ,KAAKA;AAAA,IAClC,GAAG,KAAK,SAAS,YAAYC,CAAwB;AAAA,EACvD;AAAA,EAEQ,eAAe;AACrB,IAAI,KAAK,SAAO,cAAc,KAAK,KAAK,GACxC,KAAK,QAAQ;AAAA,EACf;AAAA,EAEQ,KAAKC,GAAe;AAC1B,SAAK,QAAQA,GACb,KAAK,cAAA;AAAA,EACP;AAAA,EAEA,SAAS;AACP,UAAMC,IAAS,KAAK,SAAS,UAAU,CAAA;AACvC,QAAI,CAACA,EAAO,OAAQ,QAAOC;AAE3B,UAAMC,IAAQF,EAAO,KAAK,KAAK,GACzBG,IAASD,EAAM,UAAU,QACzBE,IAAOC,EAAiBH,CAAK;AAEnC,WAAOI;AAAA;AAAA,kCAEuBH,CAAM;AAAA,YAC5B,OAAOC,KAAS,WAAWE,IAAOF,CAAI,KAAKA,CAAI;AAAA;AAAA,UAEjDG;AAAA,MACA,KAAK;AAAA,MACLD;AAAA,+BACqBJ,EAAM,KAAK;AAAA,cAC5BA,EAAM,WACJI,mBAAsBJ,EAAM,QAAQ,SACpCD,CAAO;AAAA;AAAA,IAAA,CAEd;AAAA;AAAA,oCAE2BE,CAAM;AAAA,YAC9BH,EAAO,SAAS,IACdM;AAAA,kBACIN,EAAO;AAAA,MACP,CAACQ,GAAG,MAAMF;AAAA;AAAA;AAAA,mCAGO,MAAM,KAAK,QAAQ,SAAS,OAAO;AAAA,6CACzB,IAAI,CAAC;AAAA,6BACrB,MAAM,KAAK,KAAK,CAAC,CAAC;AAAA;AAAA,IAAA,CAE9B;AAAA,wBAEHL,CAAO;AAAA;AAAA;AAAA;AAAA,EAInB;AACF;AAxFaP,EACJ,SAAS,CAACe,GAA0BC,EAAKC,CAAM,CAAC;AAGvDC,EAAA;AAAA,EADCC,EAAS,EAAE,WAAW,GAAA,CAAO;AAAA,GAHnBnB,EAIX,WAAA,WAAA,CAAA;AAGQkB,EAAA;AAAA,EADPE,EAAA;AAAM,GANIpB,EAOH,WAAA,SAAA,CAAA;AAPGA,IAANkB,EAAA;AAAA,EADNG,EAAU,EAAE,UAAUC,EAAA,CAA8B;AAAA,GACxCtB,CAAA;"}
1
+ {"version":3,"file":"events-banner.js","sources":["../../../../../src/components/os-leaderboard-casino/sections/events-banner/events-banner.ts"],"sourcesContent":["import { LitElement, html, nothing } from 'lit';\nimport { keyed } from 'lit/directives/keyed.js';\nimport { property, state } from 'lit/decorators.js';\nimport { Component } from '@oddsmith/lib/lit/component.js';\nimport { scss } from '@oddsmith/lib/lit/scss.js';\nimport { DEFAULT_EVENTS_ROTATE_MS } from '@os-leaderboard-casino/constants/defaults.js';\nimport { OS_LEADERBOARD_CASINO_EVENTS } from '@os-leaderboard-casino/constants/tags.js';\nimport { osLeaderboardCasinoTheme } from '@os-leaderboard-casino/theme/index.js';\nimport type { OsLeaderboardCasinoEventsSection } from '@os-leaderboard-casino/types/sections.js';\nimport { resolveEventIcon } from './components/event-icons.js';\nimport styles from './events-banner.scss?inline';\n\n/** Promotional events — v0 Glass Glow (icon chip, fade rotation). */\n@Component({ selector: OS_LEADERBOARD_CASINO_EVENTS })\nexport class OsLeaderboardCasinoEvents extends LitElement {\n static styles = [osLeaderboardCasinoTheme, scss(styles)];\n\n @property({ attribute: false })\n section!: OsLeaderboardCasinoEventsSection;\n\n @state()\n private index = 0;\n\n private timer?: ReturnType<typeof setInterval>;\n\n connectedCallback(): void {\n super.connectedCallback();\n this.startRotation();\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n this.stopRotation();\n }\n\n updated(changed: Map<string, unknown>) {\n if (changed.has('section')) {\n this.index = 0;\n this.startRotation();\n }\n }\n\n private startRotation() {\n this.stopRotation();\n const count = this.section?.events?.length ?? 0;\n if (count < 2) return;\n this.timer = setInterval(() => {\n this.index = (this.index + 1) % count;\n }, this.section?.rotateMs ?? DEFAULT_EVENTS_ROTATE_MS);\n }\n\n private stopRotation() {\n if (this.timer) clearInterval(this.timer);\n this.timer = undefined;\n }\n\n private goTo(index: number) {\n this.index = index;\n this.startRotation();\n }\n\n render() {\n const events = this.section?.events ?? [];\n if (!events.length) return nothing;\n\n const event = events[this.index];\n const accent = event.accent ?? 'gold';\n const icon = resolveEventIcon(event);\n\n return html`\n <div class=\"banner\" role=\"region\" aria-label=\"Promotions\" aria-live=\"polite\">\n <div class=\"chip accent-${accent}\">\n ${typeof icon === 'string' ? html`${icon}` : icon}\n </div>\n ${keyed(\n this.index,\n html`<div class=\"body\">\n <p class=\"title\">${event.title}</p>\n ${event.subtitle\n ? html`<p class=\"sub\">${event.subtitle}</p>`\n : nothing}\n </div>`,\n )}\n <div class=\"right\">\n <span class=\"tag accent-${accent}\">Event</span>\n ${events.length > 1\n ? html`<div class=\"dots\">\n ${events.map(\n (_, i) => html`<button\n type=\"button\"\n class=\"dot\"\n aria-current=${i === this.index ? 'true' : 'false'}\n aria-label=\"Show event ${i + 1}\"\n @click=${() => this.goTo(i)}\n ></button>`,\n )}\n </div>`\n : nothing}\n </div>\n </div>\n `;\n }\n}\n"],"names":["OsLeaderboardCasinoEvents","LitElement","changed","count","DEFAULT_EVENTS_ROTATE_MS","index","events","nothing","event","accent","icon","resolveEventIcon","html","keyed","_","osLeaderboardCasinoTheme","scss","styles","__decorateClass","property","state","Component","OS_LEADERBOARD_CASINO_EVENTS"],"mappings":";;;;;;;;;;;;;;;;AAcO,IAAMA,IAAN,cAAwCC,EAAW;AAAA,EAAnD,cAAA;AAAA,UAAA,GAAA,SAAA,GAOL,KAAQ,QAAQ;AAAA,EAAA;AAAA,EAIhB,oBAA0B;AACxB,UAAM,kBAAA,GACN,KAAK,cAAA;AAAA,EACP;AAAA,EAEA,uBAA6B;AAC3B,UAAM,qBAAA,GACN,KAAK,aAAA;AAAA,EACP;AAAA,EAEA,QAAQC,GAA+B;AACrC,IAAIA,EAAQ,IAAI,SAAS,MACvB,KAAK,QAAQ,GACb,KAAK,cAAA;AAAA,EAET;AAAA,EAEQ,gBAAgB;AACtB,SAAK,aAAA;AACL,UAAMC,IAAQ,KAAK,SAAS,QAAQ,UAAU;AAC9C,IAAIA,IAAQ,MACZ,KAAK,QAAQ,YAAY,MAAM;AAC7B,WAAK,SAAS,KAAK,QAAQ,KAAKA;AAAA,IAClC,GAAG,KAAK,SAAS,YAAYC,CAAwB;AAAA,EACvD;AAAA,EAEQ,eAAe;AACrB,IAAI,KAAK,SAAO,cAAc,KAAK,KAAK,GACxC,KAAK,QAAQ;AAAA,EACf;AAAA,EAEQ,KAAKC,GAAe;AAC1B,SAAK,QAAQA,GACb,KAAK,cAAA;AAAA,EACP;AAAA,EAEA,SAAS;AACP,UAAMC,IAAS,KAAK,SAAS,UAAU,CAAA;AACvC,QAAI,CAACA,EAAO,OAAQ,QAAOC;AAE3B,UAAMC,IAAQF,EAAO,KAAK,KAAK,GACzBG,IAASD,EAAM,UAAU,QACzBE,IAAOC,EAAiBH,CAAK;AAEnC,WAAOI;AAAA;AAAA,kCAEuBH,CAAM;AAAA,YAC5B,OAAOC,KAAS,WAAWE,IAAOF,CAAI,KAAKA,CAAI;AAAA;AAAA,UAEjDG;AAAA,MACA,KAAK;AAAA,MACLD;AAAA,+BACqBJ,EAAM,KAAK;AAAA,cAC5BA,EAAM,WACJI,mBAAsBJ,EAAM,QAAQ,SACpCD,CAAO;AAAA;AAAA,IAAA,CAEd;AAAA;AAAA,oCAE2BE,CAAM;AAAA,YAC9BH,EAAO,SAAS,IACdM;AAAA,kBACIN,EAAO;AAAA,MACP,CAACQ,GAAG,MAAMF;AAAA;AAAA;AAAA,mCAGO,MAAM,KAAK,QAAQ,SAAS,OAAO;AAAA,6CACzB,IAAI,CAAC;AAAA,6BACrB,MAAM,KAAK,KAAK,CAAC,CAAC;AAAA;AAAA,IAAA,CAE9B;AAAA,wBAEHL,CAAO;AAAA;AAAA;AAAA;AAAA,EAInB;AACF;AAxFaP,EACJ,SAAS,CAACe,GAA0BC,EAAKC,CAAM,CAAC;AAGvDC,EAAA;AAAA,EADCC,EAAS,EAAE,WAAW,GAAA,CAAO;AAAA,GAHnBnB,EAIX,WAAA,WAAA,CAAA;AAGQkB,EAAA;AAAA,EADPE,EAAA;AAAM,GANIpB,EAOH,WAAA,SAAA,CAAA;AAPGA,IAANkB,EAAA;AAAA,EADNG,EAAU,EAAE,UAAUC,EAAA,CAA8B;AAAA,GACxCtB,CAAA;"}
@@ -0,0 +1,10 @@
1
+ import { LitElement, nothing } from 'lit';
2
+ import { OsLeaderboardCasinoFooterSection } from '../../types/sections.js';
3
+ import { FooterSectionHost } from './footer-section.host.js';
4
+ export declare class OsLeaderboardCasinoFooter extends LitElement implements FooterSectionHost {
5
+ static styles: import('lit').CSSResult[];
6
+ section?: OsLeaderboardCasinoFooterSection;
7
+ text: string;
8
+ get displayText(): string;
9
+ render(): import('lit').TemplateResult | typeof nothing;
10
+ }
@@ -0,0 +1,3 @@
1
+ export interface FooterSectionHost {
2
+ displayText: string;
3
+ }
@@ -4,6 +4,7 @@ import { Component as O } from "../../../../shared/lib/lit/component.js";
4
4
  import { scss as c } from "../../../../shared/lib/lit/scss.js";
5
5
  import { OS_LEADERBOARD_CASINO_FOOTER as u } from "../../constants/tags.js";
6
6
  import { osLeaderboardCasinoTheme as _ } from "../../theme/styles.js";
7
+ import "lit/directives/unsafe-svg.js";
7
8
  import h from "./footer-section.html.js";
8
9
  import x from "./footer-section.scss.js";
9
10
  var y = Object.defineProperty, d = Object.getOwnPropertyDescriptor, m = (n, e, s, o) => {
@@ -1 +1 @@
1
- {"version":3,"file":"footer-section.js","sources":["../../../../../src/components/os-leaderboard-casino/sections/footer-section/footer-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_FOOTER } from '@os-leaderboard-casino/constants/tags.js';\nimport { osLeaderboardCasinoTheme } from '@os-leaderboard-casino/theme/index.js';\nimport type { OsLeaderboardCasinoFooterSection } from '@os-leaderboard-casino/types/sections.js';\nimport type { FooterSectionHost } from './footer-section.host.js';\nimport renderTemplate from './footer-section.html?lit-html';\nimport styles from './footer-section.scss?inline';\n\n@Component({ selector: OS_LEADERBOARD_CASINO_FOOTER })\nexport class OsLeaderboardCasinoFooter\n extends LitElement\n implements FooterSectionHost\n{\n static styles = [osLeaderboardCasinoTheme, scss(styles)];\n\n @property({ attribute: false })\n section?: OsLeaderboardCasinoFooterSection;\n\n @property({ type: String })\n text = '';\n\n get displayText(): string {\n return this.section?.text ?? this.text;\n }\n\n render() {\n if (!this.displayText) return nothing;\n return renderTemplate(this);\n }\n}\n"],"names":["OsLeaderboardCasinoFooter","LitElement","renderTemplate","nothing","osLeaderboardCasinoTheme","scss","styles","__decorateClass","property","Component","OS_LEADERBOARD_CASINO_FOOTER"],"mappings":";;;;;;;;;;;;;AAYO,IAAMA,IAAN,cACGC,EAEV;AAAA,EAHO,cAAA;AAAA,UAAA,GAAA,SAAA,GAUL,KAAA,OAAO;AAAA,EAAA;AAAA,EAEP,IAAI,cAAsB;AACxB,WAAO,KAAK,SAAS,QAAQ,KAAK;AAAA,EACpC;AAAA,EAEA,SAAS;AACP,WAAK,KAAK,cACHC,EAAe,IAAI,IADIC;AAAA,EAEhC;AACF;AApBaH,EAIJ,SAAS,CAACI,GAA0BC,EAAKC,CAAM,CAAC;AAGvDC,EAAA;AAAA,EADCC,EAAS,EAAE,WAAW,GAAA,CAAO;AAAA,GANnBR,EAOX,WAAA,WAAA,CAAA;AAGAO,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GATfR,EAUX,WAAA,QAAA,CAAA;AAVWA,IAANO,EAAA;AAAA,EADNE,EAAU,EAAE,UAAUC,EAAA,CAA8B;AAAA,GACxCV,CAAA;"}
1
+ {"version":3,"file":"footer-section.js","sources":["../../../../../src/components/os-leaderboard-casino/sections/footer-section/footer-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_FOOTER } from '@os-leaderboard-casino/constants/tags.js';\nimport { osLeaderboardCasinoTheme } from '@os-leaderboard-casino/theme/index.js';\nimport type { OsLeaderboardCasinoFooterSection } from '@os-leaderboard-casino/types/sections.js';\nimport type { FooterSectionHost } from './footer-section.host.js';\nimport renderTemplate from './footer-section.html?lit-html';\nimport styles from './footer-section.scss?inline';\n\n@Component({ selector: OS_LEADERBOARD_CASINO_FOOTER })\nexport class OsLeaderboardCasinoFooter\n extends LitElement\n implements FooterSectionHost\n{\n static styles = [osLeaderboardCasinoTheme, scss(styles)];\n\n @property({ attribute: false })\n section?: OsLeaderboardCasinoFooterSection;\n\n @property({ type: String })\n text = '';\n\n get displayText(): string {\n return this.section?.text ?? this.text;\n }\n\n render() {\n if (!this.displayText) return nothing;\n return renderTemplate(this);\n }\n}\n"],"names":["OsLeaderboardCasinoFooter","LitElement","renderTemplate","nothing","osLeaderboardCasinoTheme","scss","styles","__decorateClass","property","Component","OS_LEADERBOARD_CASINO_FOOTER"],"mappings":";;;;;;;;;;;;;;AAYO,IAAMA,IAAN,cACGC,EAEV;AAAA,EAHO,cAAA;AAAA,UAAA,GAAA,SAAA,GAUL,KAAA,OAAO;AAAA,EAAA;AAAA,EAEP,IAAI,cAAsB;AACxB,WAAO,KAAK,SAAS,QAAQ,KAAK;AAAA,EACpC;AAAA,EAEA,SAAS;AACP,WAAK,KAAK,cACHC,EAAe,IAAI,IADIC;AAAA,EAEhC;AACF;AApBaH,EAIJ,SAAS,CAACI,GAA0BC,EAAKC,CAAM,CAAC;AAGvDC,EAAA;AAAA,EADCC,EAAS,EAAE,WAAW,GAAA,CAAO;AAAA,GANnBR,EAOX,WAAA,WAAA,CAAA;AAGAO,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GATfR,EAUX,WAAA,QAAA,CAAA;AAVWA,IAANO,EAAA;AAAA,EADNE,EAAU,EAAE,UAAUC,EAAA,CAA8B;AAAA,GACxCV,CAAA;"}
@@ -0,0 +1 @@
1
+ export { resolveGameImage } from '../../../services/icon.service.js';
@@ -0,0 +1,20 @@
1
+ import { LitElement, nothing, TemplateResult } from 'lit';
2
+ import { OsLeaderboardCasinoGamesSection } from '../../types/sections.js';
3
+ import { GamesSectionHost } from './games-section.host.js';
4
+ /** Qualifying games — title + provider cards in a horizontal row. */
5
+ export declare class OsLeaderboardCasinoGames extends LitElement implements GamesSectionHost {
6
+ static styles: import('lit').CSSResult[];
7
+ private _slider?;
8
+ private _sliderMq?;
9
+ private readonly _onSliderMqChange;
10
+ section: OsLeaderboardCasinoGamesSection;
11
+ get sectionTitle(): string;
12
+ connectedCallback(): void;
13
+ disconnectedCallback(): void;
14
+ protected updated(): void;
15
+ private _destroySlider;
16
+ private _syncSlider;
17
+ private renderCard;
18
+ renderGames(): TemplateResult;
19
+ render(): TemplateResult | typeof nothing;
20
+ }
@@ -0,0 +1,7 @@
1
+ import { TemplateResult } from 'lit';
2
+ import { OsLeaderboardCasinoGamesSection } from '../../types/sections.js';
3
+ export interface GamesSectionHost {
4
+ section: OsLeaderboardCasinoGamesSection;
5
+ sectionTitle: string;
6
+ renderGames(): TemplateResult;
7
+ }
@@ -0,0 +1,12 @@
1
+ import { LitElement, nothing } from 'lit';
2
+ import { OsLeaderboardCasinoHeaderSection } from '../../types/sections.js';
3
+ import { HeaderSectionHost } from './header-section.host.js';
4
+ export declare class OsLeaderboardCasinoHeader extends LitElement implements HeaderSectionHost {
5
+ static styles: import('lit').CSSResult[];
6
+ section: OsLeaderboardCasinoHeaderSection;
7
+ get showBack(): boolean;
8
+ get backLabel(): string;
9
+ get showSubtitle(): boolean;
10
+ onBackClick(): void;
11
+ render(): import('lit').TemplateResult | typeof nothing;
12
+ }
@@ -0,0 +1,8 @@
1
+ import { OsLeaderboardCasinoHeaderSection } from '../../types/sections.js';
2
+ export interface HeaderSectionHost {
3
+ section: OsLeaderboardCasinoHeaderSection;
4
+ showBack: boolean;
5
+ backLabel: string;
6
+ showSubtitle: boolean;
7
+ onBackClick(): void;
8
+ }
@@ -0,0 +1,37 @@
1
+ import { LitElement, nothing } from 'lit';
2
+ import { LeaderboardStatus } from '../../types/data.js';
3
+ import { OsLeaderboardCasinoHeroSection } from '../../types/sections.js';
4
+ import { HeroSectionHost } from './hero-section.host.js';
5
+ /** Glam hero — golden ring, shimmer title, prize-pool headline, glowing countdown. */
6
+ export declare class OsLeaderboardCasinoHero extends LitElement implements HeroSectionHost {
7
+ static styles: import('lit').CSSResult[];
8
+ section: OsLeaderboardCasinoHeroSection;
9
+ private now;
10
+ /** Animated odometer value shown for `prizePoolValue`. */
11
+ private poolDisplay;
12
+ poolBump: boolean;
13
+ private timer?;
14
+ private poolRaf?;
15
+ private bumpTimer?;
16
+ get showBanner(): boolean;
17
+ get bannerUrl(): string;
18
+ get bannerAlt(): string;
19
+ get showStatus(): boolean;
20
+ get status(): LeaderboardStatus | undefined;
21
+ get statusLabel(): string;
22
+ get showActiveDot(): boolean;
23
+ get showDescription(): boolean;
24
+ get showPool(): boolean;
25
+ get poolValueLabel(): string;
26
+ get poolLabel(): string;
27
+ get showRising(): boolean;
28
+ connectedCallback(): void;
29
+ disconnectedCallback(): void;
30
+ willUpdate(changed: Map<string, unknown>): void;
31
+ /** Rolling count-up from the current display value to `target`. */
32
+ private animatePool;
33
+ private formatPool;
34
+ private get isFinished();
35
+ renderCountdown(): typeof nothing | import('lit').TemplateResult<1>;
36
+ render(): import('lit').TemplateResult | typeof nothing;
37
+ }
@@ -0,0 +1,20 @@
1
+ import { LitTemplate } from '../../../../shared/lib/lit/template.js';
2
+ import { LeaderboardStatus } from '../../types/data.js';
3
+ import { OsLeaderboardCasinoHeroSection } from '../../types/sections.js';
4
+ export interface HeroSectionHost {
5
+ section: OsLeaderboardCasinoHeroSection;
6
+ showBanner: boolean;
7
+ bannerUrl: string;
8
+ bannerAlt: string;
9
+ showStatus: boolean;
10
+ status: LeaderboardStatus | undefined;
11
+ statusLabel: string;
12
+ showActiveDot: boolean;
13
+ showDescription: boolean;
14
+ showPool: boolean;
15
+ poolBump: boolean;
16
+ poolValueLabel: string;
17
+ poolLabel: string;
18
+ showRising: boolean;
19
+ renderCountdown(): LitTemplate;
20
+ }
@@ -4,6 +4,7 @@ import { Component as b } from "../../../../shared/lib/lit/component.js";
4
4
  import { scss as y } from "../../../../shared/lib/lit/scss.js";
5
5
  import { OS_LEADERBOARD_CASINO_HERO as w } from "../../constants/tags.js";
6
6
  import { osLeaderboardCasinoTheme as D } from "../../theme/styles.js";
7
+ import "lit/directives/unsafe-svg.js";
7
8
  import g from "./hero-section.html.js";
8
9
  import T from "./hero-section.scss.js";
9
10
  var v = Object.defineProperty, A = Object.getOwnPropertyDescriptor, l = (t, e, s, i) => {
@@ -1 +1 @@
1
- {"version":3,"file":"hero-section.js","sources":["../../../../../src/components/os-leaderboard-casino/sections/hero-section/hero-section.ts"],"sourcesContent":["import { LitElement, html, nothing } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { Component } from '@oddsmith/lib/lit/component.js';\nimport { scss } from '@oddsmith/lib/lit/scss.js';\nimport { OS_LEADERBOARD_CASINO_HERO } from '@os-leaderboard-casino/constants/tags.js';\nimport { osLeaderboardCasinoTheme } from '@os-leaderboard-casino/theme/index.js';\nimport type { LeaderboardStatus } from '@os-leaderboard-casino/types/data.js';\nimport type { OsLeaderboardCasinoHeroSection } from '@os-leaderboard-casino/types/sections.js';\nimport type { HeroSectionHost } from './hero-section.host.js';\nimport renderTemplate from './hero-section.html?lit-html';\nimport styles from './hero-section.scss?inline';\n\ninterface CountdownParts {\n expired: boolean;\n days: number;\n hours: number;\n minutes: number;\n seconds: number;\n}\n\nfunction countdownTo(endTs: string, now = Date.now()): CountdownParts {\n const remaining = Math.floor((new Date(endTs).getTime() - now) / 1000);\n if (!Number.isFinite(remaining) || remaining <= 0) {\n return { expired: true, days: 0, hours: 0, minutes: 0, seconds: 0 };\n }\n return {\n expired: false,\n days: Math.floor(remaining / 86400),\n hours: Math.floor((remaining % 86400) / 3600),\n minutes: Math.floor((remaining % 3600) / 60),\n seconds: remaining % 60,\n };\n}\n\nconst STATUS_LABELS: Record<LeaderboardStatus, string> = {\n upcoming: 'Upcoming',\n active: 'Live',\n completed: 'Finished',\n cancelled: 'Cancelled',\n};\n\n/** Glam hero — golden ring, shimmer title, prize-pool headline, glowing countdown. */\n@Component({ selector: OS_LEADERBOARD_CASINO_HERO })\nexport class OsLeaderboardCasinoHero\n extends LitElement\n implements HeroSectionHost\n{\n static styles = [osLeaderboardCasinoTheme, scss(styles)];\n\n @property({ attribute: false })\n section!: OsLeaderboardCasinoHeroSection;\n\n @state()\n private now = Date.now();\n\n /** Animated odometer value shown for `prizePoolValue`. */\n @state()\n private poolDisplay: number | null = null;\n\n @state()\n poolBump = false;\n\n private timer?: ReturnType<typeof setInterval>;\n private poolRaf?: number;\n private bumpTimer?: ReturnType<typeof setTimeout>;\n\n get showBanner(): boolean {\n return Boolean(this.section?.bannerAsset?.url);\n }\n\n get bannerUrl(): string {\n return this.section?.bannerAsset?.url ?? '';\n }\n\n get bannerAlt(): string {\n return this.section?.bannerAsset?.label || '';\n }\n\n get showStatus(): boolean {\n return Boolean(this.section?.status);\n }\n\n get status(): LeaderboardStatus | undefined {\n return this.section?.status;\n }\n\n get statusLabel(): string {\n const status = this.section?.status;\n return status ? STATUS_LABELS[status] : '';\n }\n\n get showActiveDot(): boolean {\n return this.section?.status === 'active';\n }\n\n get showDescription(): boolean {\n return Boolean(this.section?.description);\n }\n\n get showPool(): boolean {\n return this.poolDisplay != null || Boolean(this.section?.prizePool);\n }\n\n get poolValueLabel(): string {\n if (this.poolDisplay != null) return this.formatPool(this.poolDisplay);\n return this.section?.prizePool ?? '';\n }\n\n get poolLabel(): string {\n return this.section?.prizePoolLabel ?? 'Total prize pool';\n }\n\n get showRising(): boolean {\n return this.poolDisplay != null;\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n this.timer = setInterval(() => {\n this.now = Date.now();\n }, 1000);\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n if (this.timer) clearInterval(this.timer);\n if (this.poolRaf) cancelAnimationFrame(this.poolRaf);\n if (this.bumpTimer) clearTimeout(this.bumpTimer);\n }\n\n willUpdate(changed: Map<string, unknown>) {\n if (!changed.has('section')) return;\n const target = this.section?.prizePoolValue;\n if (target == null) {\n this.poolDisplay = null;\n return;\n }\n if (this.poolDisplay == null) {\n this.poolDisplay = target;\n return;\n }\n if (target !== this.poolDisplay) this.animatePool(target);\n }\n\n /** Rolling count-up from the current display value to `target`. */\n private animatePool(target: number) {\n if (this.poolRaf) cancelAnimationFrame(this.poolRaf);\n const from = this.poolDisplay ?? target;\n const duration = 1100;\n const start = performance.now();\n const tick = (t: number) => {\n const p = Math.min(1, (t - start) / duration);\n const eased = 1 - Math.pow(1 - p, 3);\n this.poolDisplay = Math.round(from + (target - from) * eased);\n if (p < 1) this.poolRaf = requestAnimationFrame(tick);\n };\n this.poolRaf = requestAnimationFrame(tick);\n\n if (target > from) {\n this.poolBump = true;\n if (this.bumpTimer) clearTimeout(this.bumpTimer);\n this.bumpTimer = setTimeout(() => {\n this.poolBump = false;\n }, 650);\n }\n }\n\n private formatPool(value: number): string {\n try {\n return new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: this.section?.prizePoolCurrency ?? 'USD',\n maximumFractionDigits: 0,\n }).format(value);\n } catch {\n return value.toLocaleString();\n }\n }\n\n private get isFinished(): boolean {\n const status = this.section?.status;\n if (status === 'completed' || status === 'cancelled') return true;\n if (!this.section?.endTs) return false;\n return countdownTo(this.section.endTs, this.now).expired;\n }\n\n renderCountdown() {\n const endTs = this.section?.endTs;\n if (!endTs) return nothing;\n\n if (this.isFinished) {\n return html`<span class=\"ended\">🏁 Contest finished</span>`;\n }\n\n const c = countdownTo(endTs, this.now);\n const cell = (v: number, label: string) =>\n html`<div class=\"cell\">\n <b>${String(v).padStart(2, '0')}</b><span>${label}</span>\n </div>`;\n\n return html`\n <div class=\"countdown\">\n <span class=\"label\">Ends in</span>\n ${cell(c.days, 'days')}<span class=\"sep\">:</span>\n ${cell(c.hours, 'hours')}<span class=\"sep\">:</span>\n ${cell(c.minutes, 'min')}<span class=\"sep\">:</span>\n ${cell(c.seconds, 'sec')}\n </div>\n `;\n }\n\n render() {\n if (!this.section) return nothing;\n return renderTemplate(this);\n }\n}\n"],"names":["countdownTo","endTs","now","remaining","STATUS_LABELS","OsLeaderboardCasinoHero","LitElement","status","changed","target","from","duration","start","tick","t","p","eased","value","nothing","html","c","cell","v","label","renderTemplate","osLeaderboardCasinoTheme","scss","styles","__decorateClass","property","state","Component","OS_LEADERBOARD_CASINO_HERO"],"mappings":"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"}
1
+ {"version":3,"file":"hero-section.js","sources":["../../../../../src/components/os-leaderboard-casino/sections/hero-section/hero-section.ts"],"sourcesContent":["import { LitElement, html, nothing } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { Component } from '@oddsmith/lib/lit/component.js';\nimport { scss } from '@oddsmith/lib/lit/scss.js';\nimport { OS_LEADERBOARD_CASINO_HERO } from '@os-leaderboard-casino/constants/tags.js';\nimport { osLeaderboardCasinoTheme } from '@os-leaderboard-casino/theme/index.js';\nimport type { LeaderboardStatus } from '@os-leaderboard-casino/types/data.js';\nimport type { OsLeaderboardCasinoHeroSection } from '@os-leaderboard-casino/types/sections.js';\nimport type { HeroSectionHost } from './hero-section.host.js';\nimport renderTemplate from './hero-section.html?lit-html';\nimport styles from './hero-section.scss?inline';\n\ninterface CountdownParts {\n expired: boolean;\n days: number;\n hours: number;\n minutes: number;\n seconds: number;\n}\n\nfunction countdownTo(endTs: string, now = Date.now()): CountdownParts {\n const remaining = Math.floor((new Date(endTs).getTime() - now) / 1000);\n if (!Number.isFinite(remaining) || remaining <= 0) {\n return { expired: true, days: 0, hours: 0, minutes: 0, seconds: 0 };\n }\n return {\n expired: false,\n days: Math.floor(remaining / 86400),\n hours: Math.floor((remaining % 86400) / 3600),\n minutes: Math.floor((remaining % 3600) / 60),\n seconds: remaining % 60,\n };\n}\n\nconst STATUS_LABELS: Record<LeaderboardStatus, string> = {\n upcoming: 'Upcoming',\n active: 'Live',\n completed: 'Finished',\n cancelled: 'Cancelled',\n};\n\n/** Glam hero — golden ring, shimmer title, prize-pool headline, glowing countdown. */\n@Component({ selector: OS_LEADERBOARD_CASINO_HERO })\nexport class OsLeaderboardCasinoHero\n extends LitElement\n implements HeroSectionHost\n{\n static styles = [osLeaderboardCasinoTheme, scss(styles)];\n\n @property({ attribute: false })\n section!: OsLeaderboardCasinoHeroSection;\n\n @state()\n private now = Date.now();\n\n /** Animated odometer value shown for `prizePoolValue`. */\n @state()\n private poolDisplay: number | null = null;\n\n @state()\n poolBump = false;\n\n private timer?: ReturnType<typeof setInterval>;\n private poolRaf?: number;\n private bumpTimer?: ReturnType<typeof setTimeout>;\n\n get showBanner(): boolean {\n return Boolean(this.section?.bannerAsset?.url);\n }\n\n get bannerUrl(): string {\n return this.section?.bannerAsset?.url ?? '';\n }\n\n get bannerAlt(): string {\n return this.section?.bannerAsset?.label || '';\n }\n\n get showStatus(): boolean {\n return Boolean(this.section?.status);\n }\n\n get status(): LeaderboardStatus | undefined {\n return this.section?.status;\n }\n\n get statusLabel(): string {\n const status = this.section?.status;\n return status ? STATUS_LABELS[status] : '';\n }\n\n get showActiveDot(): boolean {\n return this.section?.status === 'active';\n }\n\n get showDescription(): boolean {\n return Boolean(this.section?.description);\n }\n\n get showPool(): boolean {\n return this.poolDisplay != null || Boolean(this.section?.prizePool);\n }\n\n get poolValueLabel(): string {\n if (this.poolDisplay != null) return this.formatPool(this.poolDisplay);\n return this.section?.prizePool ?? '';\n }\n\n get poolLabel(): string {\n return this.section?.prizePoolLabel ?? 'Total prize pool';\n }\n\n get showRising(): boolean {\n return this.poolDisplay != null;\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n this.timer = setInterval(() => {\n this.now = Date.now();\n }, 1000);\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n if (this.timer) clearInterval(this.timer);\n if (this.poolRaf) cancelAnimationFrame(this.poolRaf);\n if (this.bumpTimer) clearTimeout(this.bumpTimer);\n }\n\n willUpdate(changed: Map<string, unknown>) {\n if (!changed.has('section')) return;\n const target = this.section?.prizePoolValue;\n if (target == null) {\n this.poolDisplay = null;\n return;\n }\n if (this.poolDisplay == null) {\n this.poolDisplay = target;\n return;\n }\n if (target !== this.poolDisplay) this.animatePool(target);\n }\n\n /** Rolling count-up from the current display value to `target`. */\n private animatePool(target: number) {\n if (this.poolRaf) cancelAnimationFrame(this.poolRaf);\n const from = this.poolDisplay ?? target;\n const duration = 1100;\n const start = performance.now();\n const tick = (t: number) => {\n const p = Math.min(1, (t - start) / duration);\n const eased = 1 - Math.pow(1 - p, 3);\n this.poolDisplay = Math.round(from + (target - from) * eased);\n if (p < 1) this.poolRaf = requestAnimationFrame(tick);\n };\n this.poolRaf = requestAnimationFrame(tick);\n\n if (target > from) {\n this.poolBump = true;\n if (this.bumpTimer) clearTimeout(this.bumpTimer);\n this.bumpTimer = setTimeout(() => {\n this.poolBump = false;\n }, 650);\n }\n }\n\n private formatPool(value: number): string {\n try {\n return new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: this.section?.prizePoolCurrency ?? 'USD',\n maximumFractionDigits: 0,\n }).format(value);\n } catch {\n return value.toLocaleString();\n }\n }\n\n private get isFinished(): boolean {\n const status = this.section?.status;\n if (status === 'completed' || status === 'cancelled') return true;\n if (!this.section?.endTs) return false;\n return countdownTo(this.section.endTs, this.now).expired;\n }\n\n renderCountdown() {\n const endTs = this.section?.endTs;\n if (!endTs) return nothing;\n\n if (this.isFinished) {\n return html`<span class=\"ended\">🏁 Contest finished</span>`;\n }\n\n const c = countdownTo(endTs, this.now);\n const cell = (v: number, label: string) =>\n html`<div class=\"cell\">\n <b>${String(v).padStart(2, '0')}</b><span>${label}</span>\n </div>`;\n\n return html`\n <div class=\"countdown\">\n <span class=\"label\">Ends in</span>\n ${cell(c.days, 'days')}<span class=\"sep\">:</span>\n ${cell(c.hours, 'hours')}<span class=\"sep\">:</span>\n ${cell(c.minutes, 'min')}<span class=\"sep\">:</span>\n ${cell(c.seconds, 'sec')}\n </div>\n `;\n }\n\n render() {\n if (!this.section) return nothing;\n return renderTemplate(this);\n }\n}\n"],"names":["countdownTo","endTs","now","remaining","STATUS_LABELS","OsLeaderboardCasinoHero","LitElement","status","changed","target","from","duration","start","tick","t","p","eased","value","nothing","html","c","cell","v","label","renderTemplate","osLeaderboardCasinoTheme","scss","styles","__decorateClass","property","state","Component","OS_LEADERBOARD_CASINO_HERO"],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { LitElement, nothing } from 'lit';
2
+ import { OsLeaderboardCasinoLegalsSection } from '../../types/sections.js';
3
+ import { LegalsSectionHost } from './legals-section.host.js';
4
+ export declare class OsLeaderboardCasinoLegals extends LitElement implements LegalsSectionHost {
5
+ static styles: import('lit').CSSResult[];
6
+ section: OsLeaderboardCasinoLegalsSection;
7
+ private _activeLink;
8
+ private _dialog;
9
+ get dialogTitle(): string;
10
+ get dialogContent(): string;
11
+ renderDialogContent(): (string | import('lit').TemplateResult<1>)[];
12
+ protected updated(changedProps: Map<string, unknown>): void;
13
+ readonly onDialogClose: () => void;
14
+ readonly onDialogClick: (e: MouseEvent) => void;
15
+ private _onLinkClick;
16
+ renderLinks(): import('lit').TemplateResult<1>;
17
+ render(): import('lit').TemplateResult | typeof nothing;
18
+ }
@@ -0,0 +1,8 @@
1
+ import { TemplateResult } from 'lit';
2
+ export interface LegalsSectionHost {
3
+ dialogTitle: string;
4
+ renderDialogContent(): unknown[];
5
+ renderLinks(): TemplateResult;
6
+ readonly onDialogClose: () => void;
7
+ readonly onDialogClick: (e: MouseEvent) => void;
8
+ }
@@ -4,6 +4,7 @@ import { Component as u } from "../../../../shared/lib/lit/component.js";
4
4
  import { scss as f } from "../../../../shared/lib/lit/scss.js";
5
5
  import { OS_LEADERBOARD_CASINO_LEGALS as _ } from "../../constants/tags.js";
6
6
  import { osLeaderboardCasinoTheme as b } from "../../theme/styles.js";
7
+ import "lit/directives/unsafe-svg.js";
7
8
  import L from "./legals-section.html.js";
8
9
  import v from "./legals-section.scss.js";
9
10
  var k = Object.defineProperty, C = Object.getOwnPropertyDescriptor, a = (e, t, r, n) => {
@@ -1 +1 @@
1
- {"version":3,"file":"legals-section.js","sources":["../../../../../src/components/os-leaderboard-casino/sections/legals-section/legals-section.ts"],"sourcesContent":["import { LitElement, html, nothing } from 'lit';\nimport { property, state, query } from 'lit/decorators.js';\nimport { Component } from '@oddsmith/lib/lit/component.js';\nimport { scss } from '@oddsmith/lib/lit/scss.js';\nimport { OS_LEADERBOARD_CASINO_LEGALS } from '@os-leaderboard-casino/constants/tags.js';\nimport { osLeaderboardCasinoTheme } from '@os-leaderboard-casino/theme/index.js';\nimport type {\n OsLeaderboardCasinoLegalLink,\n OsLeaderboardCasinoLegalsSection,\n} from '@os-leaderboard-casino/types/sections.js';\nimport type { LegalsSectionHost } from './legals-section.host.js';\nimport renderTemplate from './legals-section.html?lit-html';\nimport styles from './legals-section.scss?inline';\n\nconst DEFAULT_DIALOG_CONTENT =\n 'This promotion is open to all registered players aged 18 or over. Participation is subject to the standard Terms & Conditions applicable to all promotions. Prize winnings are credited as bonus funds and are subject to a 20× wagering requirement before withdrawal. The leaderboard is updated in real time and rankings are final at the time the campaign ends. The operator reserves the right to amend or cancel this promotion at any time without prior notice. Responsible gambling tools are available in your account settings at all times.';\n\n@Component({ selector: OS_LEADERBOARD_CASINO_LEGALS })\nexport class OsLeaderboardCasinoLegals\n extends LitElement\n implements LegalsSectionHost\n{\n static styles = [osLeaderboardCasinoTheme, scss(styles)];\n\n @property({ attribute: false })\n section!: OsLeaderboardCasinoLegalsSection;\n\n @state()\n private _activeLink: OsLeaderboardCasinoLegalLink | null = null;\n\n @query('dialog')\n private _dialog!: HTMLDialogElement;\n\n get dialogTitle(): string {\n return this._activeLink?.label ?? '';\n }\n\n get dialogContent(): string {\n return this._activeLink?.content ?? DEFAULT_DIALOG_CONTENT;\n }\n\n renderDialogContent() {\n return this.dialogContent.split(/<br\\s*\\/?>/).flatMap((part, i, arr) =>\n i < arr.length - 1 ? [part, html`<br />`] : [part],\n );\n }\n\n protected updated(changedProps: Map<string, unknown>): void {\n super.updated(changedProps);\n if (changedProps.has('_activeLink')) {\n const dialog = this._dialog;\n if (!dialog) return;\n if (this._activeLink && !dialog.open) {\n dialog.showModal();\n } else if (!this._activeLink && dialog.open) {\n dialog.close();\n }\n }\n }\n\n readonly onDialogClose = () => {\n this._activeLink = null;\n };\n\n readonly onDialogClick = (e: MouseEvent) => {\n if (e.target === this._dialog) {\n this._activeLink = null;\n }\n };\n\n private _onLinkClick(link: OsLeaderboardCasinoLegalLink): void {\n if (link.type === 'external') {\n window.open(link.href ?? 'https://www.google.com', '_blank', 'noopener,noreferrer');\n } else {\n this._activeLink = link;\n }\n }\n\n renderLinks() {\n return html`${this.section.links.map(\n (link) =>\n html`<button\n class=\"legal-link\"\n type=\"button\"\n @click=${() => this._onLinkClick(link)}\n >${link.label}</button>`,\n )}`;\n }\n\n render() {\n if (!this.section?.links?.length) return nothing;\n return renderTemplate(this);\n }\n}\n"],"names":["DEFAULT_DIALOG_CONTENT","OsLeaderboardCasinoLegals","LitElement","part","i","arr","html","changedProps","dialog","link","renderTemplate","nothing","osLeaderboardCasinoTheme","scss","styles","__decorateClass","property","state","query","Component","OS_LEADERBOARD_CASINO_LEGALS"],"mappings":";;;;;;;;;;;;;AAcA,MAAMA,IACJ;AAGK,IAAMC,IAAN,cACGC,EAEV;AAAA,EAHO,cAAA;AAAA,UAAA,GAAA,SAAA,GAUL,KAAQ,cAAmD,MAgC3D,KAAS,gBAAgB,MAAM;AAC7B,WAAK,cAAc;AAAA,IACrB,GAEA,KAAS,gBAAgB,CAAC,MAAkB;AAC1C,MAAI,EAAE,WAAW,KAAK,YACpB,KAAK,cAAc;AAAA,IAEvB;AAAA,EAAA;AAAA,EAnCA,IAAI,cAAsB;AACxB,WAAO,KAAK,aAAa,SAAS;AAAA,EACpC;AAAA,EAEA,IAAI,gBAAwB;AAC1B,WAAO,KAAK,aAAa,WAAWF;AAAA,EACtC;AAAA,EAEA,sBAAsB;AACpB,WAAO,KAAK,cAAc,MAAM,YAAY,EAAE;AAAA,MAAQ,CAACG,GAAMC,GAAGC,MAC9DD,IAAIC,EAAI,SAAS,IAAI,CAACF,GAAMG,SAAY,IAAI,CAACH,CAAI;AAAA,IAAA;AAAA,EAErD;AAAA,EAEU,QAAQI,GAA0C;AAE1D,QADA,MAAM,QAAQA,CAAY,GACtBA,EAAa,IAAI,aAAa,GAAG;AACnC,YAAMC,IAAS,KAAK;AACpB,UAAI,CAACA,EAAQ;AACb,MAAI,KAAK,eAAe,CAACA,EAAO,OAC9BA,EAAO,UAAA,IACE,CAAC,KAAK,eAAeA,EAAO,QACrCA,EAAO,MAAA;AAAA,IAEX;AAAA,EACF;AAAA,EAYQ,aAAaC,GAA0C;AAC7D,IAAIA,EAAK,SAAS,aAChB,OAAO,KAAKA,EAAK,QAAQ,0BAA0B,UAAU,qBAAqB,IAElF,KAAK,cAAcA;AAAA,EAEvB;AAAA,EAEA,cAAc;AACZ,WAAOH,IAAO,KAAK,QAAQ,MAAM;AAAA,MAC/B,CAACG,MACCH;AAAA;AAAA;AAAA,mBAGW,MAAM,KAAK,aAAaG,CAAI,CAAC;AAAA,WACrCA,EAAK,KAAK;AAAA,IAAA,CAChB;AAAA,EACH;AAAA,EAEA,SAAS;AACP,WAAK,KAAK,SAAS,OAAO,SACnBC,EAAe,IAAI,IADeC;AAAA,EAE3C;AACF;AA3EaV,EAIJ,SAAS,CAACW,GAA0BC,EAAKC,CAAM,CAAC;AAGvDC,EAAA;AAAA,EADCC,EAAS,EAAE,WAAW,GAAA,CAAO;AAAA,GANnBf,EAOX,WAAA,WAAA,CAAA;AAGQc,EAAA;AAAA,EADPE,EAAA;AAAM,GATIhB,EAUH,WAAA,eAAA,CAAA;AAGAc,EAAA;AAAA,EADPG,EAAM,QAAQ;AAAA,GAZJjB,EAaH,WAAA,WAAA,CAAA;AAbGA,IAANc,EAAA;AAAA,EADNI,EAAU,EAAE,UAAUC,EAAA,CAA8B;AAAA,GACxCnB,CAAA;"}
1
+ {"version":3,"file":"legals-section.js","sources":["../../../../../src/components/os-leaderboard-casino/sections/legals-section/legals-section.ts"],"sourcesContent":["import { LitElement, html, nothing } from 'lit';\nimport { property, state, query } from 'lit/decorators.js';\nimport { Component } from '@oddsmith/lib/lit/component.js';\nimport { scss } from '@oddsmith/lib/lit/scss.js';\nimport { OS_LEADERBOARD_CASINO_LEGALS } from '@os-leaderboard-casino/constants/tags.js';\nimport { osLeaderboardCasinoTheme } from '@os-leaderboard-casino/theme/index.js';\nimport type {\n OsLeaderboardCasinoLegalLink,\n OsLeaderboardCasinoLegalsSection,\n} from '@os-leaderboard-casino/types/sections.js';\nimport type { LegalsSectionHost } from './legals-section.host.js';\nimport renderTemplate from './legals-section.html?lit-html';\nimport styles from './legals-section.scss?inline';\n\nconst DEFAULT_DIALOG_CONTENT =\n 'This promotion is open to all registered players aged 18 or over. Participation is subject to the standard Terms & Conditions applicable to all promotions. Prize winnings are credited as bonus funds and are subject to a 20× wagering requirement before withdrawal. The leaderboard is updated in real time and rankings are final at the time the campaign ends. The operator reserves the right to amend or cancel this promotion at any time without prior notice. Responsible gambling tools are available in your account settings at all times.';\n\n@Component({ selector: OS_LEADERBOARD_CASINO_LEGALS })\nexport class OsLeaderboardCasinoLegals\n extends LitElement\n implements LegalsSectionHost\n{\n static styles = [osLeaderboardCasinoTheme, scss(styles)];\n\n @property({ attribute: false })\n section!: OsLeaderboardCasinoLegalsSection;\n\n @state()\n private _activeLink: OsLeaderboardCasinoLegalLink | null = null;\n\n @query('dialog')\n private _dialog!: HTMLDialogElement;\n\n get dialogTitle(): string {\n return this._activeLink?.label ?? '';\n }\n\n get dialogContent(): string {\n return this._activeLink?.content ?? DEFAULT_DIALOG_CONTENT;\n }\n\n renderDialogContent() {\n return this.dialogContent.split(/<br\\s*\\/?>/).flatMap((part, i, arr) =>\n i < arr.length - 1 ? [part, html`<br />`] : [part],\n );\n }\n\n protected updated(changedProps: Map<string, unknown>): void {\n super.updated(changedProps);\n if (changedProps.has('_activeLink')) {\n const dialog = this._dialog;\n if (!dialog) return;\n if (this._activeLink && !dialog.open) {\n dialog.showModal();\n } else if (!this._activeLink && dialog.open) {\n dialog.close();\n }\n }\n }\n\n readonly onDialogClose = () => {\n this._activeLink = null;\n };\n\n readonly onDialogClick = (e: MouseEvent) => {\n if (e.target === this._dialog) {\n this._activeLink = null;\n }\n };\n\n private _onLinkClick(link: OsLeaderboardCasinoLegalLink): void {\n if (link.type === 'external') {\n window.open(link.href ?? 'https://www.google.com', '_blank', 'noopener,noreferrer');\n } else {\n this._activeLink = link;\n }\n }\n\n renderLinks() {\n return html`${this.section.links.map(\n (link) =>\n html`<button\n class=\"legal-link\"\n type=\"button\"\n @click=${() => this._onLinkClick(link)}\n >${link.label}</button>`,\n )}`;\n }\n\n render() {\n if (!this.section?.links?.length) return nothing;\n return renderTemplate(this);\n }\n}\n"],"names":["DEFAULT_DIALOG_CONTENT","OsLeaderboardCasinoLegals","LitElement","part","i","arr","html","changedProps","dialog","link","renderTemplate","nothing","osLeaderboardCasinoTheme","scss","styles","__decorateClass","property","state","query","Component","OS_LEADERBOARD_CASINO_LEGALS"],"mappings":";;;;;;;;;;;;;;AAcA,MAAMA,IACJ;AAGK,IAAMC,IAAN,cACGC,EAEV;AAAA,EAHO,cAAA;AAAA,UAAA,GAAA,SAAA,GAUL,KAAQ,cAAmD,MAgC3D,KAAS,gBAAgB,MAAM;AAC7B,WAAK,cAAc;AAAA,IACrB,GAEA,KAAS,gBAAgB,CAAC,MAAkB;AAC1C,MAAI,EAAE,WAAW,KAAK,YACpB,KAAK,cAAc;AAAA,IAEvB;AAAA,EAAA;AAAA,EAnCA,IAAI,cAAsB;AACxB,WAAO,KAAK,aAAa,SAAS;AAAA,EACpC;AAAA,EAEA,IAAI,gBAAwB;AAC1B,WAAO,KAAK,aAAa,WAAWF;AAAA,EACtC;AAAA,EAEA,sBAAsB;AACpB,WAAO,KAAK,cAAc,MAAM,YAAY,EAAE;AAAA,MAAQ,CAACG,GAAMC,GAAGC,MAC9DD,IAAIC,EAAI,SAAS,IAAI,CAACF,GAAMG,SAAY,IAAI,CAACH,CAAI;AAAA,IAAA;AAAA,EAErD;AAAA,EAEU,QAAQI,GAA0C;AAE1D,QADA,MAAM,QAAQA,CAAY,GACtBA,EAAa,IAAI,aAAa,GAAG;AACnC,YAAMC,IAAS,KAAK;AACpB,UAAI,CAACA,EAAQ;AACb,MAAI,KAAK,eAAe,CAACA,EAAO,OAC9BA,EAAO,UAAA,IACE,CAAC,KAAK,eAAeA,EAAO,QACrCA,EAAO,MAAA;AAAA,IAEX;AAAA,EACF;AAAA,EAYQ,aAAaC,GAA0C;AAC7D,IAAIA,EAAK,SAAS,aAChB,OAAO,KAAKA,EAAK,QAAQ,0BAA0B,UAAU,qBAAqB,IAElF,KAAK,cAAcA;AAAA,EAEvB;AAAA,EAEA,cAAc;AACZ,WAAOH,IAAO,KAAK,QAAQ,MAAM;AAAA,MAC/B,CAACG,MACCH;AAAA;AAAA;AAAA,mBAGW,MAAM,KAAK,aAAaG,CAAI,CAAC;AAAA,WACrCA,EAAK,KAAK;AAAA,IAAA,CAChB;AAAA,EACH;AAAA,EAEA,SAAS;AACP,WAAK,KAAK,SAAS,OAAO,SACnBC,EAAe,IAAI,IADeC;AAAA,EAE3C;AACF;AA3EaV,EAIJ,SAAS,CAACW,GAA0BC,EAAKC,CAAM,CAAC;AAGvDC,EAAA;AAAA,EADCC,EAAS,EAAE,WAAW,GAAA,CAAO;AAAA,GANnBf,EAOX,WAAA,WAAA,CAAA;AAGQc,EAAA;AAAA,EADPE,EAAA;AAAM,GATIhB,EAUH,WAAA,eAAA,CAAA;AAGAc,EAAA;AAAA,EADPG,EAAM,QAAQ;AAAA,GAZJjB,EAaH,WAAA,WAAA,CAAA;AAbGA,IAANc,EAAA;AAAA,EADNI,EAAU,EAAE,UAAUC,EAAA,CAA8B;AAAA,GACxCnB,CAAA;"}
@@ -0,0 +1,13 @@
1
+ import { LitElement, nothing } from 'lit';
2
+ import { OsLeaderboardCasinoLiveFeedSection } from '../../types/sections.js';
3
+ import { LiveFeedSectionHost } from './live-feed-section.host.js';
4
+ /** Glassy live activity rail with entrance animations. */
5
+ export declare class OsLeaderboardCasinoLiveFeed extends LitElement implements LiveFeedSectionHost {
6
+ static styles: import('lit').CSSResult[];
7
+ section: OsLeaderboardCasinoLiveFeedSection;
8
+ get feedTitle(): string;
9
+ get hasItems(): boolean;
10
+ private formatAmount;
11
+ renderEntries(): import('lit').TemplateResult<1>;
12
+ render(): import('lit').TemplateResult | typeof nothing;
13
+ }
@@ -0,0 +1,8 @@
1
+ import { TemplateResult } from 'lit';
2
+ import { OsLeaderboardCasinoLiveFeedSection } from '../../types/sections.js';
3
+ export interface LiveFeedSectionHost {
4
+ section: OsLeaderboardCasinoLiveFeedSection;
5
+ feedTitle: string;
6
+ hasItems: boolean;
7
+ renderEntries(): TemplateResult;
8
+ }
@@ -0,0 +1,3 @@
1
+ import { TemplateResult } from 'lit';
2
+ export type WinIconName = 'bag' | 'coin' | 'trophy' | 'fire' | 'gem' | 'bolt';
3
+ export declare function winIcon(name: WinIconName): TemplateResult;
@@ -0,0 +1,14 @@
1
+ import { OsLeaderboardCasinoMarqueeItem } from '../../types/sections.js';
2
+ import { WinIconName } from './components/win-icons.js';
3
+ export interface ParsedMarqueeWin {
4
+ user: string;
5
+ game: string;
6
+ gameId?: string;
7
+ big: boolean;
8
+ icon: WinIconName;
9
+ amount: number | null;
10
+ currency: string;
11
+ vip: boolean;
12
+ }
13
+ export declare function parseMarqueeItem(item: OsLeaderboardCasinoMarqueeItem, index: number): ParsedMarqueeWin;
14
+ export declare function formatWinAmount(amount: number | null, currency: string): string;
@@ -0,0 +1,42 @@
1
+ import { LitElement, nothing, TemplateResult } from 'lit';
2
+ import { OsLeaderboardCasinoMarqueeSection } from '../../types/sections.js';
3
+ import { MarqueeVariant } from './marquee-variants.js';
4
+ import { MarqueeSectionHost } from './marquee-section.host.js';
5
+ /** Infinitely-scrolling winners ticker — v0 variant ports + classic fallback. */
6
+ export declare class OsLeaderboardCasinoMarquee extends LitElement implements MarqueeSectionHost {
7
+ static styles: import('lit').CSSResult[];
8
+ section: OsLeaderboardCasinoMarqueeSection;
9
+ variant: MarqueeVariant;
10
+ private hudIndex;
11
+ private feedRows;
12
+ private hudTimer?;
13
+ private feedTimer?;
14
+ private feedCursor;
15
+ private feedKey;
16
+ get speedSec(): number;
17
+ connectedCallback(): void;
18
+ updated(changed: Map<string, unknown>): void;
19
+ disconnectedCallback(): void;
20
+ private syncVariantAttribute;
21
+ private parsedWins;
22
+ private startVariantTimers;
23
+ private stopVariantTimers;
24
+ private pushFeedRow;
25
+ private formatAmount;
26
+ private renderSeparator;
27
+ private renderItemIcon;
28
+ /** Uses shared VIP badge styles from theme (v0 outline tag). */
29
+ private renderMarqueeUser;
30
+ private renderClassicItem;
31
+ private renderClassicGroup;
32
+ renderTrack(): TemplateResult;
33
+ renderHudLabel(): TemplateResult | typeof nothing;
34
+ private renderTickerWin;
35
+ private renderTicker;
36
+ private renderHudStreamGroup;
37
+ private renderHud;
38
+ private renderBeltGroup;
39
+ private renderBelt;
40
+ private renderFeed;
41
+ render(): TemplateResult | typeof nothing;
42
+ }
@@ -0,0 +1,8 @@
1
+ import { TemplateResult } from 'lit';
2
+ import { OsLeaderboardCasinoMarqueeSection } from '../../types/sections.js';
3
+ export interface MarqueeSectionHost {
4
+ section: OsLeaderboardCasinoMarqueeSection;
5
+ speedSec: number;
6
+ renderHudLabel(): TemplateResult | typeof import('lit').nothing;
7
+ renderTrack(): TemplateResult;
8
+ }
@@ -0,0 +1,6 @@
1
+ /** Visual treatments for the winners ticker (v0 + legacy). */
2
+ export declare const MARQUEE_VARIANTS: readonly ["classic", "ticker", "feed", "hud", "belt"];
3
+ export type MarqueeVariant = (typeof MARQUEE_VARIANTS)[number];
4
+ /** Active variant — v0 seamless ticker from `v0-components/marquee-section`. */
5
+ export declare const ACTIVE_MARQUEE_VARIANT: MarqueeVariant;
6
+ export declare function isMarqueeVariant(value: string): value is MarqueeVariant;
@@ -0,0 +1,16 @@
1
+ import { LitElement } from 'lit';
2
+ export type MedalCoinVariant = 'gold' | 'silver' | 'bronze';
3
+ /** Layered rank coin for podium slots — themed via glam CSS tokens. */
4
+ export declare class OsLeaderboardCasinoMedalCoin extends LitElement {
5
+ static styles: import('lit').CSSResult[];
6
+ variant: MedalCoinVariant;
7
+ rank: number;
8
+ /** Optional label override (defaults to rank number). */
9
+ label?: string;
10
+ /** Pixel diameter — also sets `--coin-size` on the host. */
11
+ size: number;
12
+ protected willUpdate(): void;
13
+ private get displayLabel();
14
+ private get medalAriaLabel();
15
+ render(): import('lit').TemplateResult<1>;
16
+ }
@@ -0,0 +1,71 @@
1
+ import { LitElement as c, svg as m, html as y } from "lit";
2
+ import { property as a } from "lit/decorators.js";
3
+ import { Component as f } from "../../../../../../shared/lib/lit/component.js";
4
+ import { scss as d } from "../../../../../../shared/lib/lit/scss.js";
5
+ import { OS_LEADERBOARD_CASINO_MEDAL_COIN as h } from "../../../../constants/tags.js";
6
+ import { osLeaderboardCasinoTheme as v } from "../../../../theme/styles.js";
7
+ import "lit/directives/unsafe-svg.js";
8
+ import b from "./medal-coin.scss.js";
9
+ var g = Object.defineProperty, x = Object.getOwnPropertyDescriptor, t = (i, o, l, s) => {
10
+ for (var e = s > 1 ? void 0 : s ? x(o, l) : o, p = i.length - 1, n; p >= 0; p--)
11
+ (n = i[p]) && (e = (s ? n(o, l, e) : n(e)) || e);
12
+ return s && e && g(o, l, e), e;
13
+ };
14
+ let r = class extends c {
15
+ constructor() {
16
+ super(...arguments), this.variant = "gold", this.rank = 1, this.size = 52;
17
+ }
18
+ willUpdate() {
19
+ this.style.setProperty("--coin-size", `${this.size}px`);
20
+ }
21
+ get displayLabel() {
22
+ return this.label ?? String(this.rank);
23
+ }
24
+ get medalAriaLabel() {
25
+ return this.label ?? `Rank ${this.rank} medal`;
26
+ }
27
+ render() {
28
+ const i = this.displayLabel;
29
+ return y`
30
+ <svg viewBox="0 0 72 72" role="img" aria-label=${this.medalAriaLabel}>
31
+ <circle cx="36" cy="36" r="34" fill="var(--coin-edge)" />
32
+ <circle cx="36" cy="34" r="32" fill="var(--coin-face)" />
33
+ <circle
34
+ cx="36"
35
+ cy="34"
36
+ r="25"
37
+ fill="none"
38
+ stroke="var(--coin-ring)"
39
+ stroke-width="2"
40
+ opacity="0.55"
41
+ />
42
+ ${m`<text
43
+ class="rank-text"
44
+ x="36"
45
+ y="44"
46
+ text-anchor="middle"
47
+ >${i}</text>`}
48
+ </svg>
49
+ `;
50
+ }
51
+ };
52
+ r.styles = [v, d(b)];
53
+ t([
54
+ a({ type: String, reflect: !0 })
55
+ ], r.prototype, "variant", 2);
56
+ t([
57
+ a({ type: Number })
58
+ ], r.prototype, "rank", 2);
59
+ t([
60
+ a({ type: String })
61
+ ], r.prototype, "label", 2);
62
+ t([
63
+ a({ type: Number })
64
+ ], r.prototype, "size", 2);
65
+ r = t([
66
+ f({ selector: h })
67
+ ], r);
68
+ export {
69
+ r as OsLeaderboardCasinoMedalCoin
70
+ };
71
+ //# sourceMappingURL=medal-coin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"medal-coin.js","sources":["../../../../../../../src/components/os-leaderboard-casino/sections/prize-section/components/medal-coin/medal-coin.ts"],"sourcesContent":["import { LitElement, html, svg } 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_MEDAL_COIN } from '@os-leaderboard-casino/constants/tags.js';\nimport { osLeaderboardCasinoTheme } from '@os-leaderboard-casino/theme/index.js';\nimport styles from './medal-coin.scss?inline';\n\nexport type MedalCoinVariant = 'gold' | 'silver' | 'bronze';\n\n/** Layered rank coin for podium slots — themed via glam CSS tokens. */\n@Component({ selector: OS_LEADERBOARD_CASINO_MEDAL_COIN })\nexport class OsLeaderboardCasinoMedalCoin extends LitElement {\n static styles = [osLeaderboardCasinoTheme, scss(styles)];\n\n @property({ type: String, reflect: true })\n variant: MedalCoinVariant = 'gold';\n\n @property({ type: Number })\n rank = 1;\n\n /** Optional label override (defaults to rank number). */\n @property({ type: String })\n label?: string;\n\n /** Pixel diameter — also sets `--coin-size` on the host. */\n @property({ type: Number })\n size = 52;\n\n protected override willUpdate(): void {\n this.style.setProperty('--coin-size', `${this.size}px`);\n }\n\n private get displayLabel(): string {\n return this.label ?? String(this.rank);\n }\n\n private get medalAriaLabel(): string {\n return this.label ?? `Rank ${this.rank} medal`;\n }\n\n render() {\n const text = this.displayLabel;\n return html`\n <svg viewBox=\"0 0 72 72\" role=\"img\" aria-label=${this.medalAriaLabel}>\n <circle cx=\"36\" cy=\"36\" r=\"34\" fill=\"var(--coin-edge)\" />\n <circle cx=\"36\" cy=\"34\" r=\"32\" fill=\"var(--coin-face)\" />\n <circle\n cx=\"36\"\n cy=\"34\"\n r=\"25\"\n fill=\"none\"\n stroke=\"var(--coin-ring)\"\n stroke-width=\"2\"\n opacity=\"0.55\"\n />\n ${svg`<text\n class=\"rank-text\"\n x=\"36\"\n y=\"44\"\n text-anchor=\"middle\"\n >${text}</text>`}\n </svg>\n `;\n }\n}\n"],"names":["OsLeaderboardCasinoMedalCoin","LitElement","text","html","svg","osLeaderboardCasinoTheme","scss","styles","__decorateClass","property","Component","OS_LEADERBOARD_CASINO_MEDAL_COIN"],"mappings":";;;;;;;;;;;;;AAYO,IAAMA,IAAN,cAA2CC,EAAW;AAAA,EAAtD,cAAA;AAAA,UAAA,GAAA,SAAA,GAIL,KAAA,UAA4B,QAG5B,KAAA,OAAO,GAQP,KAAA,OAAO;AAAA,EAAA;AAAA,EAEY,aAAmB;AACpC,SAAK,MAAM,YAAY,eAAe,GAAG,KAAK,IAAI,IAAI;AAAA,EACxD;AAAA,EAEA,IAAY,eAAuB;AACjC,WAAO,KAAK,SAAS,OAAO,KAAK,IAAI;AAAA,EACvC;AAAA,EAEA,IAAY,iBAAyB;AACnC,WAAO,KAAK,SAAS,QAAQ,KAAK,IAAI;AAAA,EACxC;AAAA,EAEA,SAAS;AACP,UAAMC,IAAO,KAAK;AAClB,WAAOC;AAAA,uDAC4C,KAAK,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAYhEC;AAAA;AAAA;AAAA;AAAA;AAAA,aAKGF,CAAI,SAAS;AAAA;AAAA;AAAA,EAGxB;AACF;AArDaF,EACJ,SAAS,CAACK,GAA0BC,EAAKC,CAAM,CAAC;AAGvDC,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,QAAQ,SAAS,IAAM;AAAA,GAH9BT,EAIX,WAAA,WAAA,CAAA;AAGAQ,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GANfT,EAOX,WAAA,QAAA,CAAA;AAIAQ,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GAVfT,EAWX,WAAA,SAAA,CAAA;AAIAQ,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GAdfT,EAeX,WAAA,QAAA,CAAA;AAfWA,IAANQ,EAAA;AAAA,EADNE,EAAU,EAAE,UAAUC,EAAA,CAAkC;AAAA,GAC5CX,CAAA;"}
@@ -0,0 +1,5 @@
1
+ const o = ":host{display:inline-block;line-height:0;--coin-size: 52px}:host([variant=gold]){--coin-highlight: var(--gold-strong);--coin-face: var(--gold);--coin-edge: var(--gold-deep);--coin-ring: color-mix(in srgb, var(--gold-strong) 55%, transparent);--coin-shadow: drop-shadow(0 6px 16px rgba(0, 0, 0, .45));--coin-filter: drop-shadow(0 0 14px var(--gold-glow))}:host([variant=silver]){--coin-highlight: var(--silver);--coin-face: color-mix(in srgb, var(--silver) 78%, var(--surface-solid));--coin-edge: color-mix(in srgb, var(--silver) 52%, #5a6270);--coin-ring: color-mix(in srgb, var(--silver) 45%, transparent);--coin-shadow: drop-shadow(0 6px 14px rgba(0, 0, 0, .4));--coin-filter: none}:host([variant=bronze]){--coin-highlight: color-mix(in srgb, var(--bronze) 72%, #ffe8d4);--coin-face: var(--bronze);--coin-edge: color-mix(in srgb, var(--bronze) 62%, #6b4224);--coin-ring: color-mix(in srgb, var(--bronze) 45%, transparent);--coin-shadow: drop-shadow(0 6px 14px rgba(0, 0, 0, .4));--coin-filter: none}svg{display:block;width:var(--coin-size);height:var(--coin-size);filter:var(--coin-filter, var(--coin-shadow))}.rank-text{font-family:var(--font-display);font-size:calc(var(--coin-size) * .42 * var(--coin-text-scale, 1));font-weight:800;fill:#1a1208}";
2
+ export {
3
+ o as default
4
+ };
5
+ //# sourceMappingURL=medal-coin.scss.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"medal-coin.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}