@xcpcio/board-app 0.85.3 → 0.85.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/dist/404.html +1 -1
  2. package/dist/assets/{Balloon-B3cPN2yD.js → Balloon-BUgwq0Kx.js} +1 -1
  3. package/dist/assets/{Board-BpIhDrix.css → Board-BfbUwmvq.css} +1 -1
  4. package/dist/assets/{Board-CWwqX2IB.js → Board-D7hrVoFu.js} +57 -57
  5. package/dist/assets/{ContestStateBadge-CQOaPmT8.js → ContestStateBadge-Dt7AgnYd.js} +1 -1
  6. package/dist/assets/{Countdown-BvWlPnYq.js → Countdown-B97p6HbD.js} +1 -1
  7. package/dist/assets/{DataSourceInput-DCNrUj45.js → DataSourceInput-B67_jwrR.js} +1 -1
  8. package/dist/assets/{NavBar-t1eXyPKg.js → NavBar-CnD7iUz_.js} +1 -1
  9. package/dist/assets/{Resolver-D_GRj6HP.js → Resolver-DQ3kkz9L.js} +1 -1
  10. package/dist/assets/TheInput-D67yPyFW.js +1 -0
  11. package/dist/assets/{Tooltip-DPDTUI-s.js → Tooltip-BR6I8-SM.js} +1 -1
  12. package/dist/assets/_...all_-BDXlESlP.js +1 -0
  13. package/dist/assets/{_...all_-TFChZhkr.js → _...all_-Cek5Lnmd.js} +1 -1
  14. package/dist/assets/{balloon-BlTynoB_.js → balloon-DpIcef0j.js} +1 -1
  15. package/dist/assets/{board-A69GsfUB.js → board-KpBI6_ac.js} +1 -1
  16. package/dist/assets/{board-layout-mk2Y30Yp.js → board-layout-DD2-Z-AS.js} +1 -1
  17. package/dist/assets/constant-Dl-MmgU0.js +1 -0
  18. package/dist/assets/{countdown-DQRGLfdE.js → countdown-bqehvGJt.js} +1 -1
  19. package/dist/assets/{default-BNqFZJwJ.js → default-CSWSpjqo.js} +1 -1
  20. package/dist/assets/{index-C1jdVImx.css → index-4yhXaony.css} +1 -1
  21. package/dist/assets/{index-D57KOcpK.js → index-ClRmeGtV.js} +12 -12
  22. package/dist/assets/{index-layout-Cg_FpvvD.js → index-layout-Dxv-LU9c.js} +1 -1
  23. package/dist/assets/{pages-kJjvENga.js → pages-DyUshEIY.js} +2 -2
  24. package/dist/assets/{pagination-EIqoVe6M.js → pagination-2onPPYtS.js} +1 -1
  25. package/dist/assets/query-XskWvdZB.js +20 -0
  26. package/dist/assets/rank-Bk_Yo4wU.js +1 -0
  27. package/dist/assets/{rating-B3sXjXNN.js → rating-DSZOgEeb.js} +1 -1
  28. package/dist/assets/{resolver-Db22e0q8.js → resolver-DOjgimki.js} +1 -1
  29. package/dist/index.html +1 -1
  30. package/package.json +11 -11
  31. package/src/auto-imports.d.ts +2 -0
  32. package/src/components/board/TeamCard.vue +16 -8
  33. package/src/components/board/TeamUI.vue +16 -12
  34. package/src/components/board/Utility.vue +5 -3
  35. package/src/composables/constant.ts +5 -15
  36. package/src/composables/runtimeConfig.ts +21 -0
  37. package/src/composables/useQueryBoardData.ts +3 -2
  38. package/src/main.ts +2 -1
  39. package/src/modules/i18n.ts +2 -1
  40. package/src/pages/[...all].vue +6 -2
  41. package/src/pages/index.vue +2 -2
  42. package/src/shims.d.ts +15 -8
  43. package/src/types.ts +16 -0
  44. package/vite.config.ts +4 -0
  45. package/dist/assets/TheInput-Btyuor_6.js +0 -1
  46. package/dist/assets/_...all_-Chjz45WV.js +0 -1
  47. package/dist/assets/constant-YlOY-yXZ.js +0 -1
  48. package/dist/assets/query-CoPl3fiI.js +0 -20
  49. package/dist/assets/rank-Bjo0QJlM.js +0 -1
  50. /package/dist/assets/{_intlify-i18n-0-BmghNkij.js → virtual_intlify-i18n-0-BmghNkij.js} +0 -0
  51. /package/dist/assets/{_intlify-i18n-1-DzpDgiG5.js → virtual_intlify-i18n-1-DzpDgiG5.js} +0 -0
package/dist/index.html CHANGED
@@ -1 +1 @@
1
- <!doctype html><html lang="en-US" dir="ltr"><head><meta charset="UTF-8"/><title>Board - XCPCIO</title><script>!function(e,t,a,n){e[n]=e[n]||[],e[n].push({"gtm.start":(new Date).getTime(),event:"gtm.js"});var g=t.getElementsByTagName(a)[0],m=t.createElement(a);m.async=!0,m.src="https://www.googletagmanager.com/gtm.js?id=GTM-WHLF55BJ",g.parentNode.insertBefore(m,g)}(window,document,"script","dataLayer")</script><link rel="icon" href="https://cdn.jsdelivr.net/npm/@xcpcio/board-app@0.85.3/dist/favicon.svg" type="image/svg+xml"/><link rel="mask-icon" href="https://cdn.jsdelivr.net/npm/@xcpcio/board-app@0.85.3/dist/balloon-512x512.svg" color="#00aba9"/><link rel="apple-touch-icon" href="https://cdn.jsdelivr.net/npm/@xcpcio/board-app@0.85.3/dist/balloon-192x192.png"/><meta name="msapplication-TileColor" content="#00aba9"/><meta name="author" content="Dup4"/><meta name="title" content="Board - XCPCIO"/><meta name="description" content="The ICPC Series Competition Leaderboard Visualization Engine."/><meta name="keywords" content="ICPC, Rank, Board, Leaderboard, ScoreBoard, Standings"/><meta property="og:site_name" content="XCPCIO"/><meta property="og:title" content="Board - XCPCIO"/><meta property="og:description" content="The ICPC Series Competition Leaderboard Visualization Engine."/><meta property="og:type" content="website"/><meta property="og:image" content="https://xcpcio.com/og.png"/><meta property="og:image:type" content="image/png"/><meta property="og:image:width" content="1200"/><meta property="og:image:height" content="630"/><meta name="twitter:title" content="Board - XCPCIO"/><meta name="twitter:description" content="The ICPC Series Competition Leaderboard Visualization Engine."/><meta name="twitter:card" content="summary_large_image"/><meta name="twitter:image" content="https://xcpcio.com/og.png"/><script>function normalizePath(_){for(;_.endsWith("/");)_=_.slice(0,-1);return`${_}/`}{let _="https://cdn.jsdelivr.net/npm/@xcpcio/board-app@0.85.3/dist";_=normalizePath(_),window.CDN_HOST=_,window.__toAssetUrl=_=>window.CDN_HOST+_}try{let _=__BASE_URL__;window.BASE_URL=_}catch(_){}try{let _=__DATA_HOST__;_=normalizePath(_),window.DATA_HOST=_}catch(_){window.DATA_HOST="/data/"}try{let _=__DATA_REGION__;window.DATA_REGION=_}catch(_){window.DATA_REGION="CN"}try{let _=__DEFAULT_LANG__;window.DEFAULT_LANG=_}catch(_){window.DEFAULT_LANG="en"}try{window.REFETCH_INTERVAL=Number(__REFETCH_INTERVAL__)}catch(_){window.REFETCH_INTERVAL=15e3}</script><script>!function(){localStorage.getItem("vueuse-color-scheme")||localStorage.setItem("vueuse-color-scheme","light");const e=window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches,o=localStorage.getItem("vueuse-color-scheme")||"auto";("dark"===o||e&&"light"!==o)&&document.documentElement.classList.toggle("dark",!0)}()</script><script type="module" crossorigin src="https://cdn.jsdelivr.net/npm/@xcpcio/board-app@0.85.3/dist/assets/index-D57KOcpK.js"></script><link rel="modulepreload" crossorigin href="https://cdn.jsdelivr.net/npm/@xcpcio/board-app@0.85.3/dist/assets/vue.runtime.esm-bundler-DTMOfGWR.js"><link rel="stylesheet" crossorigin href="https://cdn.jsdelivr.net/npm/@xcpcio/board-app@0.85.3/dist/assets/index-C1jdVImx.css"></head><body class="font-sans"><noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-WHLF55BJ" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript><div id="app"></div><noscript>This website requires JavaScript to function properly. Please enable JavaScript to continue.</noscript><script>try{var umamiJSUrl=__UMAMI_JS_URL__,umamiWebsiteId=__UMAMI_WEBSITE_ID__;!function(){var e=document.createElement("script");e.src=umamiJSUrl,e.defer=!0,e.setAttribute("data-website-id",umamiWebsiteId);var t=document.getElementsByTagName("script")[0];t.parentNode.insertBefore(e,t)}()}catch(e){}try{var baiduAnalyticsId=__BAIDU_ANALYTICS_ID__,_hmt=_hmt||[];!function(){var e=document.createElement("script");e.src=`https://hm.baidu.com/hm.js?${baiduAnalyticsId}`;var t=document.getElementsByTagName("script")[0];t.parentNode.insertBefore(e,t)}()}catch(e){}</script></body></html>
1
+ <!doctype html><html lang="en-US" dir="ltr"><head><meta charset="UTF-8"/><title>Board - XCPCIO</title><script>!function(e,t,a,n){e[n]=e[n]||[],e[n].push({"gtm.start":(new Date).getTime(),event:"gtm.js"});var g=t.getElementsByTagName(a)[0],m=t.createElement(a);m.async=!0,m.src="https://www.googletagmanager.com/gtm.js?id=GTM-WHLF55BJ",g.parentNode.insertBefore(m,g)}(window,document,"script","dataLayer")</script><link rel="icon" href="https://cdn.jsdelivr.net/npm/@xcpcio/board-app@0.85.4/dist/favicon.svg" type="image/svg+xml"/><link rel="mask-icon" href="https://cdn.jsdelivr.net/npm/@xcpcio/board-app@0.85.4/dist/balloon-512x512.svg" color="#00aba9"/><link rel="apple-touch-icon" href="https://cdn.jsdelivr.net/npm/@xcpcio/board-app@0.85.4/dist/balloon-192x192.png"/><meta name="msapplication-TileColor" content="#00aba9"/><meta name="author" content="Dup4"/><meta name="title" content="Board - XCPCIO"/><meta name="description" content="The ICPC Series Competition Leaderboard Visualization Engine."/><meta name="keywords" content="ICPC, Rank, Board, Leaderboard, ScoreBoard, Standings"/><meta property="og:site_name" content="XCPCIO"/><meta property="og:title" content="Board - XCPCIO"/><meta property="og:description" content="The ICPC Series Competition Leaderboard Visualization Engine."/><meta property="og:type" content="website"/><meta property="og:image" content="https://xcpcio.com/og.png"/><meta property="og:image:type" content="image/png"/><meta property="og:image:width" content="1200"/><meta property="og:image:height" content="630"/><meta name="twitter:title" content="Board - XCPCIO"/><meta name="twitter:description" content="The ICPC Series Competition Leaderboard Visualization Engine."/><meta name="twitter:card" content="summary_large_image"/><meta name="twitter:image" content="https://xcpcio.com/og.png"/><script>function normalizePath(_){for(;_.endsWith("/");)_=_.slice(0,-1);return`${_}/`}{let _="https://cdn.jsdelivr.net/npm/@xcpcio/board-app@0.85.4/dist";_=normalizePath(_),window.CDN_HOST=_,window.__toAssetUrl=_=>window.CDN_HOST+_}try{let _=__BASE_URL__;window.BASE_URL=_}catch(_){}try{let _=__DATA_HOST__;_=normalizePath(_),window.DATA_HOST=_}catch(_){window.DATA_HOST="/data/"}try{let _=__DATA_REGION__;window.DATA_REGION=_}catch(_){window.DATA_REGION="CN"}try{let _=__DEFAULT_LANG__;window.DEFAULT_LANG=_}catch(_){window.DEFAULT_LANG="en"}try{window.REFETCH_INTERVAL=Number(__REFETCH_INTERVAL__)}catch(_){window.REFETCH_INTERVAL=15e3}</script><script>!function(){localStorage.getItem("vueuse-color-scheme")||localStorage.setItem("vueuse-color-scheme","light");const e=window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches,o=localStorage.getItem("vueuse-color-scheme")||"auto";("dark"===o||e&&"light"!==o)&&document.documentElement.classList.toggle("dark",!0)}()</script><script type="module" crossorigin src="https://cdn.jsdelivr.net/npm/@xcpcio/board-app@0.85.4/dist/assets/index-ClRmeGtV.js"></script><link rel="modulepreload" crossorigin href="https://cdn.jsdelivr.net/npm/@xcpcio/board-app@0.85.4/dist/assets/vue.runtime.esm-bundler-DTMOfGWR.js"><link rel="stylesheet" crossorigin href="https://cdn.jsdelivr.net/npm/@xcpcio/board-app@0.85.4/dist/assets/index-4yhXaony.css"></head><body class="font-sans"><noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-WHLF55BJ" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript><div id="app"></div><noscript>This website requires JavaScript to function properly. Please enable JavaScript to continue.</noscript><script>try{var umamiJSUrl=__UMAMI_JS_URL__,umamiWebsiteId=__UMAMI_WEBSITE_ID__;!function(){var e=document.createElement("script");e.src=umamiJSUrl,e.defer=!0,e.setAttribute("data-website-id",umamiWebsiteId);var t=document.getElementsByTagName("script")[0];t.parentNode.insertBefore(e,t)}()}catch(e){}try{var baiduAnalyticsId=__BAIDU_ANALYTICS_ID__,_hmt=_hmt||[];!function(){var e=document.createElement("script");e.src=`https://hm.baidu.com/hm.js?${baiduAnalyticsId}`;var t=document.getElementsByTagName("script")[0];t.parentNode.insertBefore(e,t)}()}catch(e){}</script></body></html>
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@xcpcio/board-app",
3
3
  "type": "module",
4
- "version": "0.85.3",
4
+ "version": "0.85.4",
5
5
  "description": "The ICPC Series Competition Leaderboard Visualization Engine",
6
6
  "author": "Dup4 <hi@dup4.com>",
7
7
  "license": "MIT",
@@ -50,16 +50,16 @@
50
50
  "sleep-promise": "^9.1.0",
51
51
  "vue": "^3.5.38",
52
52
  "vue-demi": "^0.14.10",
53
- "vue-i18n": "^11.4.5",
53
+ "vue-i18n": "^11.4.6",
54
54
  "vue-router": "^5.1.0",
55
55
  "vue-search-select": "^3.2.0",
56
56
  "vue-toast-notification": "^3.1.3",
57
- "@xcpcio/core": "0.85.3",
58
- "@xcpcio/types": "0.85.3"
57
+ "@xcpcio/core": "0.85.4",
58
+ "@xcpcio/types": "0.85.4"
59
59
  },
60
60
  "devDependencies": {
61
- "@iconify/json": "^2.2.486",
62
- "@intlify/unplugin-vue-i18n": "^11.2.3",
61
+ "@iconify/json": "^2.2.488",
62
+ "@intlify/unplugin-vue-i18n": "^11.2.4",
63
63
  "@shikijs/markdown-it": "^4.2.0",
64
64
  "@types/file-saver": "^2.0.7",
65
65
  "@types/lodash": "^4.17.24",
@@ -71,15 +71,15 @@
71
71
  "critters": "^0.0.25",
72
72
  "cross-env": "^10.1.0",
73
73
  "cypress": "^15.17.0",
74
- "cypress-vite": "^1.10.0",
74
+ "cypress-vite": "^1.10.1",
75
75
  "eslint": "^10.5.0",
76
76
  "eslint-plugin-cypress": "^6.4.1",
77
77
  "eslint-plugin-format": "^2.0.1",
78
78
  "git-repo-info": "^2.1.1",
79
79
  "https-localhost": "^4.7.1",
80
- "less": "^4.6.4",
80
+ "less": "^4.6.6",
81
81
  "markdown-it-link-attributes": "^4.0.1",
82
- "rollup": "^4.62.0",
82
+ "rollup": "^4.62.2",
83
83
  "shiki": "^4.2.0",
84
84
  "taze": "^19.14.1",
85
85
  "typescript": "^6.0.3",
@@ -93,12 +93,12 @@
93
93
  "vite-bundle-visualizer": "^1.2.1",
94
94
  "vite-plugin-html": "^3.2.2",
95
95
  "vite-plugin-inspect": "^11.4.1",
96
- "vite-plugin-vue-devtools": "^8.1.2",
96
+ "vite-plugin-vue-devtools": "^8.1.3",
97
97
  "vite-plugin-vue-layouts": "^0.11.0",
98
98
  "vite-plugin-webfont-dl": "^3.12.0",
99
99
  "vite-ssg": "^28.3.0",
100
100
  "vite-ssg-sitemap": "^0.10.0",
101
- "vitest": "^4.1.8",
101
+ "vitest": "^4.1.9",
102
102
  "vue-tsc": "^3.3.5"
103
103
  },
104
104
  "scripts": {
@@ -60,6 +60,7 @@ declare global {
60
60
  const getMedalColor: typeof import('./composables/color').getMedalColor
61
61
  const getProblemChart: typeof import('./composables/statistics').getProblemChart
62
62
  const getRatingGraphOptions: typeof import('./composables/rating').getRatingGraphOptions
63
+ const getRuntimeConfig: typeof import('./composables/runtimeConfig').getRuntimeConfig
63
64
  const getStandingsStatusColor: typeof import('./composables/color').getStandingsStatusColor
64
65
  const getSubmitChart: typeof import('./composables/statistics').getSubmitChart
65
66
  const getTeamChart: typeof import('./composables/statistics').getTeamChart
@@ -430,6 +431,7 @@ declare module 'vue' {
430
431
  readonly getMedalColor: UnwrapRef<typeof import('./composables/color')['getMedalColor']>
431
432
  readonly getProblemChart: UnwrapRef<typeof import('./composables/statistics')['getProblemChart']>
432
433
  readonly getRatingGraphOptions: UnwrapRef<typeof import('./composables/rating')['getRatingGraphOptions']>
434
+ readonly getRuntimeConfig: UnwrapRef<typeof import('./composables/runtimeConfig')['getRuntimeConfig']>
433
435
  readonly getStandingsStatusColor: UnwrapRef<typeof import('./composables/color')['getStandingsStatusColor']>
434
436
  readonly getSubmitChart: UnwrapRef<typeof import('./composables/statistics')['getSubmitChart']>
435
437
  readonly getTeamChart: UnwrapRef<typeof import('./composables/statistics')['getTeamChart']>
@@ -48,18 +48,26 @@ const isGirl = computed(() => team.value.isGirl);
48
48
  >
49
49
  <template v-if="isVisible">
50
50
  <div flex="~ items-center gap-3" mb="2">
51
- <img
51
+ <div
52
52
  v-if="team.organization?.logo"
53
- :src="getImageSource(team.organization.logo, DATA_HOST)"
54
- alt="org logo"
55
- class="h-12 w-12"
53
+ class="h-12 w-12 flex items-center justify-center bg-transparent"
56
54
  >
57
- <img
55
+ <img
56
+ :src="getImageSource(team.organization.logo, DATA_HOST)"
57
+ alt="org logo"
58
+ class="max-h-12 max-w-full object-contain mx-auto h-full w-auto block"
59
+ >
60
+ </div>
61
+ <div
58
62
  v-if="team.badge"
59
- :src="getImageSource(team.badge, DATA_HOST)"
60
- alt="team badge"
61
- class="h-12 w-12"
63
+ class="h-12 w-12 flex items-center justify-center bg-transparent"
62
64
  >
65
+ <img
66
+ :src="getImageSource(team.badge, DATA_HOST)"
67
+ alt="team badge"
68
+ class="max-h-12 max-w-full object-contain mx-auto h-full w-auto block"
69
+ >
70
+ </div>
63
71
  <div flex="1 ~ col" min-w-0>
64
72
  <Tooltip placement="top">
65
73
  <div
@@ -104,13 +104,15 @@ function isRenderByVisible() {
104
104
  :class="[getStandClassName(team)]"
105
105
  >
106
106
  <div
107
- v-if="team?.organization?.logo"
108
- class="absolute left-0 top-0 bottom-0 flex items-center px-1"
107
+ class="absolute left-0 top-0 bottom-0 flex items-center justify-center px-1 w-12"
109
108
  >
110
- <Badge
111
- :image="team?.organization?.logo"
112
- width-class="h-full w-auto"
113
- />
109
+ <div class="flex items-center justify-center w-full h-full">
110
+ <Badge
111
+ v-if="team?.organization?.logo"
112
+ :image="team?.organization?.logo"
113
+ width-class="max-h-full max-w-full object-contain mx-auto"
114
+ />
115
+ </div>
114
116
  </div>
115
117
  <div flex flex-1 :class="team?.organization?.logo ? 'pl-10' : ''">
116
118
  <div
@@ -149,13 +151,15 @@ function isRenderByVisible() {
149
151
  :class="[getStandClassName(team)]"
150
152
  >
151
153
  <div
152
- v-if="team.badge"
153
- class="absolute left-0 top-0 bottom-0 flex items-center px-1"
154
+ class="absolute left-0 top-0 bottom-0 flex items-center justify-center px-1 w-12"
154
155
  >
155
- <Badge
156
- :image="team.badge"
157
- width-class="h-full w-auto"
158
- />
156
+ <div class="flex items-center justify-center w-full h-full">
157
+ <Badge
158
+ v-if="team.badge"
159
+ :image="team.badge"
160
+ width-class="max-h-full max-w-full object-contain mx-auto"
161
+ />
162
+ </div>
159
163
  </div>
160
164
  <div
161
165
  flex items-center justify-center
@@ -1,5 +1,6 @@
1
1
  <script setup lang="ts">
2
2
  import type { Rank } from "@xcpcio/core";
3
+ import { getRuntimeConfig } from "@board/composables/runtimeConfig";
3
4
 
4
5
  const props = defineProps<{
5
6
  rank: Rank;
@@ -10,9 +11,10 @@ const { t } = useI18n();
10
11
  const route = useRoute();
11
12
  const router = useRouter();
12
13
  const component = useQueryForComponent();
14
+ const dataSource = getRuntimeConfig().dataSource;
13
15
 
14
16
  function goResolver() {
15
- if (window.DATA_SOURCE) {
17
+ if (dataSource) {
16
18
  component.value = "resolver";
17
19
  } else {
18
20
  router.push(`/resolver/?data-source=${route.path}`);
@@ -20,7 +22,7 @@ function goResolver() {
20
22
  }
21
23
 
22
24
  function goBalloon() {
23
- if (window.DATA_SOURCE) {
25
+ if (dataSource) {
24
26
  component.value = "balloon";
25
27
  } else {
26
28
  router.push(`/balloon/?data-source=${route.path}`);
@@ -28,7 +30,7 @@ function goBalloon() {
28
30
  }
29
31
 
30
32
  function goCountdown() {
31
- if (window.DATA_SOURCE) {
33
+ if (dataSource) {
32
34
  component.value = "countdown";
33
35
  } else {
34
36
  router.push(`/countdown/?data-source=${route.path}`);
@@ -1,3 +1,5 @@
1
+ import { getRuntimeConfig } from "./runtimeConfig";
2
+
1
3
  export const APP_VERSION = __APP_VERSION__;
2
4
  export const GITHUB_URL = __GITHUB_URL__;
3
5
  export const GITHUB_SHA = __GITHUB_SHA__;
@@ -11,19 +13,11 @@ export const COUNTDOWN_TITLE_SUFFIX = "Countdown - XCPCIO";
11
13
  export const SUBMISSION_TITLE_SUFFIX = "Submission - XCPCIO";
12
14
 
13
15
  export const CDN_HOST = computed(() => {
14
- if (!window) {
15
- return "";
16
- }
17
-
18
- return window.CDN_HOST;
16
+ return getRuntimeConfig().cdnHost ?? "";
19
17
  });
20
18
 
21
19
  export const DATA_HOST = computed(() => {
22
- if (!window) {
23
- return "";
24
- }
25
-
26
- return window.DATA_HOST;
20
+ return getRuntimeConfig().dataHost ?? "";
27
21
  });
28
22
 
29
23
  export const RATING_DATA_HOST = computed(() => {
@@ -32,9 +26,5 @@ export const RATING_DATA_HOST = computed(() => {
32
26
  });
33
27
 
34
28
  export const DATA_REGION = computed(() => {
35
- if (!window) {
36
- return "";
37
- }
38
-
39
- return window.DATA_REGION;
29
+ return getRuntimeConfig().dataRegion ?? "";
40
30
  });
@@ -0,0 +1,21 @@
1
+ import type { RuntimeConfig } from "@board/types";
2
+
3
+ export function getRuntimeConfig(): RuntimeConfig {
4
+ if (typeof window === "undefined") {
5
+ return {};
6
+ }
7
+
8
+ const config = window.RUNTIME_CONFIG ?? {};
9
+
10
+ return {
11
+ pageType: config.pageType,
12
+ component: config.component,
13
+ dataSource: config.dataSource ?? window.DATA_SOURCE,
14
+ baseUrl: config.baseUrl ?? window.BASE_URL,
15
+ cdnHost: config.cdnHost ?? window.CDN_HOST,
16
+ dataHost: config.dataHost ?? window.DATA_HOST,
17
+ dataRegion: config.dataRegion ?? window.DATA_REGION,
18
+ defaultLang: config.defaultLang ?? window.DEFAULT_LANG,
19
+ refetchInterval: config.refetchInterval ?? window.REFETCH_INTERVAL,
20
+ };
21
+ }
@@ -1,5 +1,6 @@
1
1
  import type { Contest, Submissions, Teams } from "@xcpcio/types";
2
2
  import { useQuery } from "@tanstack/vue-query";
3
+ import { getRuntimeConfig } from "./runtimeConfig";
3
4
 
4
5
  export interface BoardData {
5
6
  contest: Contest;
@@ -47,7 +48,7 @@ async function fetchAndAssignSeatMap(contest: Contest, baseUrl: string): Promise
47
48
 
48
49
  async function fetch_board_data(target: string): Promise<BoardData> {
49
50
  const endpoint = target.startsWith("/") ? target.slice(1) : target;
50
- let prefix = `${window.DATA_HOST}${endpoint}`;
51
+ let prefix = `${getRuntimeConfig().dataHost ?? ""}${endpoint}`;
51
52
  const options = {
52
53
  allInOne: false,
53
54
  };
@@ -97,7 +98,7 @@ async function fetch_board_data(target: string): Promise<BoardData> {
97
98
  export function useQueryBoardData(target: string, queryOnce = false) {
98
99
  const retry = 3;
99
100
  const staleTime = 30_000;
100
- let refetchInterval: number | false = window.REFETCH_INTERVAL;
101
+ let refetchInterval: number | false = getRuntimeConfig().refetchInterval ?? 15_000;
101
102
 
102
103
  if (queryOnce) {
103
104
  refetchInterval = false;
package/src/main.ts CHANGED
@@ -8,6 +8,7 @@ import { ViteSSG } from "vite-ssg";
8
8
  import { routes } from "vue-router/auto-routes";
9
9
  // import Previewer from 'virtual:vue-component-preview'
10
10
  import App from "./App.vue";
11
+ import { getRuntimeConfig } from "./composables/runtimeConfig";
11
12
 
12
13
  import "floating-vue/dist/style.css";
13
14
  import "vue-search-select/dist/VueSearchSelect.css";
@@ -24,7 +25,7 @@ export const createApp = ViteSSG(
24
25
  App,
25
26
  {
26
27
  routes: setupLayouts(routes),
27
- base: window.BASE_URL ?? import.meta.env.BASE_URL,
28
+ base: getRuntimeConfig().baseUrl ?? import.meta.env.BASE_URL,
28
29
  },
29
30
  (ctx) => {
30
31
  // install all modules under `modules/`
@@ -1,5 +1,6 @@
1
1
  import type { UserModule } from "@board/types";
2
2
  import type { Locale } from "vue-i18n";
3
+ import { getRuntimeConfig } from "@board/composables/runtimeConfig";
3
4
  import { createI18n } from "vue-i18n";
4
5
 
5
6
  // Import i18n resources
@@ -48,5 +49,5 @@ export async function loadLanguageAsync(lang: string): Promise<Locale> {
48
49
 
49
50
  export const install: UserModule = async ({ app }) => {
50
51
  app.use(i18n);
51
- await loadLanguageAsync(window.DEFAULT_LANG);
52
+ await loadLanguageAsync(getRuntimeConfig().defaultLang ?? "en");
52
53
  };
@@ -1,6 +1,9 @@
1
1
  <script setup lang="ts">
2
+ import { getRuntimeConfig } from "@board/composables/runtimeConfig";
3
+
2
4
  const { t } = useI18n();
3
5
  const route = useRoute();
6
+ const runtimeConfig = getRuntimeConfig();
4
7
 
5
8
  const contestTypes = [
6
9
  "camp",
@@ -10,8 +13,9 @@ const contestTypes = [
10
13
  ];
11
14
 
12
15
  const isNotFound = !contestTypes.some(c => route.fullPath.startsWith(`/${c}`));
13
- const component = useQueryForComponent();
14
- const dataSource = window.DATA_SOURCE;
16
+ const queryComponent = useQueryForComponent();
17
+ const component = computed(() => runtimeConfig.component ?? queryComponent.value);
18
+ const dataSource = runtimeConfig.dataSource;
15
19
  </script>
16
20
 
17
21
  <template>
@@ -4,7 +4,7 @@ import type { Lang } from "@xcpcio/types";
4
4
 
5
5
  import ContestIndexUI from "@board/components/ContestIndexUI.vue";
6
6
  import SearchInput from "@board/components/SearchInput.vue";
7
- import { TITLE_SUFFIX } from "@board/composables/constant";
7
+ import { DATA_HOST, TITLE_SUFFIX } from "@board/composables/constant";
8
8
 
9
9
  import { useFetch } from "@vueuse/core";
10
10
  import { createContestIndexList } from "@xcpcio/core";
@@ -19,7 +19,7 @@ const now = useNow();
19
19
  const nowMinutes = computed(() => Math.floor(now.value.getTime() / FETCH_INTERVAL));
20
20
 
21
21
  function genURL() {
22
- return `${window.DATA_HOST}index/contest_list.json?t=${nowMinutes.value}`;
22
+ return `${DATA_HOST.value}index/contest_list.json?t=${nowMinutes.value}`;
23
23
  }
24
24
  const url = ref(genURL());
25
25
 
package/src/shims.d.ts CHANGED
@@ -1,11 +1,16 @@
1
- declare interface Window {
2
- BASE_URL?: string;
3
- CDN_HOST: string;
4
- DATA_HOST: string;
5
- DATA_REGION: string;
6
- DEFAULT_LANG: string;
7
- REFETCH_INTERVAL: number;
8
- DATA_SOURCE?: string;
1
+ import type { RuntimeConfig } from "./types";
2
+
3
+ declare global {
4
+ interface Window {
5
+ RUNTIME_CONFIG?: RuntimeConfig;
6
+ BASE_URL?: string;
7
+ CDN_HOST: string;
8
+ DATA_HOST: string;
9
+ DATA_REGION: string;
10
+ DEFAULT_LANG: string;
11
+ REFETCH_INTERVAL: number;
12
+ DATA_SOURCE?: string;
13
+ }
9
14
  }
10
15
 
11
16
  // with vite-plugin-vue-markdown, markdown files can be treated as Vue components
@@ -16,6 +21,8 @@ declare module "*.md" {
16
21
  export default component;
17
22
  }
18
23
 
24
+ export {};
25
+
19
26
  declare module "*.vue" {
20
27
  import type { DefineComponent } from "vue";
21
28
 
package/src/types.ts CHANGED
@@ -1,3 +1,19 @@
1
1
  import type { ViteSSGContext } from "vite-ssg";
2
2
 
3
3
  export type UserModule = (ctx: ViteSSGContext) => void;
4
+
5
+ export type RuntimePageType = "index" | "contest" | "custom";
6
+
7
+ export type RuntimeComponent = "board" | "resolver" | "balloon" | "countdown";
8
+
9
+ export interface RuntimeConfig {
10
+ pageType?: RuntimePageType;
11
+ component?: RuntimeComponent;
12
+ dataSource?: string;
13
+ baseUrl?: string;
14
+ cdnHost?: string;
15
+ dataHost?: string;
16
+ dataRegion?: string;
17
+ defaultLang?: string;
18
+ refetchInterval?: number;
19
+ }
package/vite.config.ts CHANGED
@@ -172,6 +172,10 @@ export default defineConfig({
172
172
  noExternal: [/vue-i18n/],
173
173
  },
174
174
 
175
+ optimizeDeps: {
176
+ exclude: ["vue-i18n"],
177
+ },
178
+
175
179
  server: {
176
180
  host: true,
177
181
  proxy: {
@@ -1 +0,0 @@
1
- import{$ as e,D as t,E as n,F as r,G as i,H as a,O as o,T as s,X as c,Z as l,a as u,c as d,ct as f,et as p,it as m,m as h,rt as g,tt as _,ut as v,v as y,x as b}from"./vue.runtime.esm-bundler-DTMOfGWR.js";import{A as x,C as S,D as C,E as w,F as T,I as E,M as D,N as O,O as k,P as A,S as j,T as M,b as N,j as P,k as F,w as I,x as L,y as R}from"./index-D57KOcpK.js";import{l as z}from"./query-CoPl3fiI.js";var B=class extends E{constructor(e,t){super(),this.options=t,this.#e=e,this.#s=null,this.#o=I(),this.bindMethods(),this.setOptions(t)}#e;#t=void 0;#n=void 0;#r=void 0;#i;#a;#o;#s;#c;#l;#u;#d;#f;#p;#m=new Set;bindMethods(){this.refetch=this.refetch.bind(this)}onSubscribe(){this.listeners.size===1&&(this.#t.addObserver(this),H(this.#t,this.options)?this.#h():this.updateResult(),this.#y())}onUnsubscribe(){this.hasListeners()||this.destroy()}shouldFetchOnReconnect(){return U(this.#t,this.options,this.options.refetchOnReconnect)}shouldFetchOnWindowFocus(){return U(this.#t,this.options,this.options.refetchOnWindowFocus)}destroy(){this.listeners=new Set,this.#b(),this.#x(),this.#t.removeObserver(this)}setOptions(e){let t=this.options,n=this.#t;if(this.options=this.#e.defaultQueryOptions(e),this.options.enabled!==void 0&&typeof this.options.enabled!=`boolean`&&typeof this.options.enabled!=`function`&&typeof F(this.options.enabled,this.#t)!=`boolean`)throw Error(`Expected enabled to be a boolean or a callback that returns a boolean`);this.#S(),this.#t.setOptions(this.options),t._defaulted&&!P(this.options,t)&&this.#e.getQueryCache().notify({type:`observerOptionsUpdated`,query:this.#t,observer:this});let r=this.hasListeners();r&&W(this.#t,n,this.options,t)&&this.#h(),this.updateResult(),r&&(this.#t!==n||F(this.options.enabled,this.#t)!==F(t.enabled,this.#t)||x(this.options.staleTime,this.#t)!==x(t.staleTime,this.#t))&&this.#g();let i=this.#_();r&&(this.#t!==n||F(this.options.enabled,this.#t)!==F(t.enabled,this.#t)||i!==this.#p)&&this.#v(i)}getOptimisticResult(e){let t=this.#e.getQueryCache().build(this.#e,e),n=this.createResult(t,e);return K(this,n)&&(this.#r=n,this.#a=this.options,this.#i=this.#t.state),n}getCurrentResult(){return this.#r}trackResult(e,t){return new Proxy(e,{get:(e,n)=>(this.trackProp(n),t?.(n),n===`promise`&&(this.trackProp(`data`),!this.options.experimental_prefetchInRender&&this.#o.status===`pending`&&this.#o.reject(Error(`experimental_prefetchInRender feature flag is not enabled`))),Reflect.get(e,n))})}trackProp(e){this.#m.add(e)}getCurrentQuery(){return this.#t}refetch({...e}={}){return this.fetch({...e})}fetchOptimistic(e){let t=this.#e.defaultQueryOptions(e),n=this.#e.getQueryCache().build(this.#e,t);return n.fetch().then(()=>this.createResult(n,t))}fetch(e){return this.#h({...e,cancelRefetch:e.cancelRefetch??!0}).then(()=>(this.updateResult(),this.#r))}#h(e){this.#S();let t=this.#t.fetch(this.options,e);return e?.throwOnError||(t=t.catch(C)),t}#g(){this.#b();let e=x(this.options.staleTime,this.#t);if(M.isServer()||this.#r.isStale||!w(e))return;let t=O(this.#r.dataUpdatedAt,e)+1;this.#d=A.setTimeout(()=>{this.#r.isStale||this.updateResult()},t)}#_(){return(typeof this.options.refetchInterval==`function`?this.options.refetchInterval(this.#t):this.options.refetchInterval)??!1}#v(e){this.#x(),this.#p=e,!(M.isServer()||F(this.options.enabled,this.#t)===!1||!w(this.#p)||this.#p===0)&&(this.#f=A.setInterval(()=>{(this.options.refetchIntervalInBackground||T.isFocused())&&this.#h()},this.#p))}#y(){this.#g(),this.#v(this.#_())}#b(){this.#d!==void 0&&(A.clearTimeout(this.#d),this.#d=void 0)}#x(){this.#f!==void 0&&(A.clearInterval(this.#f),this.#f=void 0)}createResult(e,t){let n=this.#t,r=this.options,i=this.#r,a=this.#i,o=this.#a,s=e===n?this.#n:e.state,{state:c}=e,l={...c},u=!1,d;if(t._optimisticResults){let i=this.hasListeners(),a=!i&&H(e,t),o=i&&W(e,n,t,r);(a||o)&&(l={...l,...j(c.data,e.options)}),t._optimisticResults===`isRestoring`&&(l.fetchStatus=`idle`)}let{error:f,errorUpdatedAt:p,status:m}=l;d=l.data;let h=!1;if(t.placeholderData!==void 0&&d===void 0&&m===`pending`){let e;i?.isPlaceholderData&&t.placeholderData===o?.placeholderData?(e=i.data,h=!0):e=typeof t.placeholderData==`function`?t.placeholderData(this.#u?.state.data,this.#u):t.placeholderData,e!==void 0&&(m=`success`,d=k(i?.data,e,t),u=!0)}if(t.select&&d!==void 0&&!h)if(i&&d===a?.data&&t.select===this.#c)d=this.#l;else try{this.#c=t.select,d=t.select(d),d=k(i?.data,d,t),this.#l=d,this.#s=null}catch(e){this.#s=e}this.#s&&(f=this.#s,d=this.#l,p=Date.now(),m=`error`);let g=l.fetchStatus===`fetching`,_=m===`pending`,v=m===`error`,y=_&&g,b=d!==void 0,x={status:m,fetchStatus:l.fetchStatus,isPending:_,isSuccess:m===`success`,isError:v,isInitialLoading:y,isLoading:y,data:d,dataUpdatedAt:l.dataUpdatedAt,error:f,errorUpdatedAt:p,failureCount:l.fetchFailureCount,failureReason:l.fetchFailureReason,errorUpdateCount:l.errorUpdateCount,isFetched:e.isFetched(),isFetchedAfterMount:l.dataUpdateCount>s.dataUpdateCount||l.errorUpdateCount>s.errorUpdateCount,isFetching:g,isRefetching:g&&!_,isLoadingError:v&&!b,isPaused:l.fetchStatus===`paused`,isPlaceholderData:u,isRefetchError:v&&b,isStale:G(e,t),refetch:this.refetch,promise:this.#o,isEnabled:F(t.enabled,e)!==!1};if(this.options.experimental_prefetchInRender){let t=x.data!==void 0,r=x.status===`error`&&!t,i=e=>{r?e.reject(x.error):t&&e.resolve(x.data)},a=()=>{i(this.#o=x.promise=I())},o=this.#o;switch(o.status){case`pending`:e.queryHash===n.queryHash&&i(o);break;case`fulfilled`:(r||x.data!==o.value)&&a();break;case`rejected`:(!r||x.error!==o.reason)&&a();break}}return x}updateResult(){let e=this.#r,t=this.createResult(this.#t,this.options);this.#i=this.#t.state,this.#a=this.options,this.#i.data!==void 0&&(this.#u=this.#t),!P(t,e)&&(this.#r=t,this.#C({listeners:(()=>{if(!e)return!0;let{notifyOnChangeProps:t}=this.options,n=typeof t==`function`?t():t;if(n===`all`||!n&&!this.#m.size)return!0;let r=new Set(n??this.#m);return this.options.throwOnError&&r.add(`error`),Object.keys(this.#r).some(t=>{let n=t;return this.#r[n]!==e[n]&&r.has(n)})})()}))}#S(){let e=this.#e.getQueryCache().build(this.#e,this.options);if(e===this.#t)return;let t=this.#t;this.#t=e,this.#n=e.state,this.hasListeners()&&(t?.removeObserver(this),e.addObserver(this))}onQueryUpdate(){this.updateResult(),this.hasListeners()&&this.#y()}#C(e){S.batch(()=>{e.listeners&&this.listeners.forEach(e=>{e(this.#r)}),this.#e.getQueryCache().notify({query:this.#t,type:`observerResultsUpdated`})})}};function V(e,t){return F(t.enabled,e)!==!1&&e.state.data===void 0&&!(e.state.status===`error`&&F(t.retryOnMount,e)===!1)}function H(e,t){return V(e,t)||e.state.data!==void 0&&U(e,t,t.refetchOnMount)}function U(e,t,n){if(F(t.enabled,e)!==!1&&x(t.staleTime,e)!==`static`){let r=typeof n==`function`?n(e):n;return r===`always`||r!==!1&&G(e,t)}return!1}function W(e,t,n,r){return(e!==t||F(r.enabled,e)===!1)&&(!n.suspense||e.state.status!==`error`)&&G(e,n)}function G(e,t){return F(t.enabled,e)!==!1&&e.isStaleByTime(x(t.staleTime,e))}function K(e,t){return!P(e.getCurrentResult(),t)}n();function q(e=``){if(!s())throw Error(`vue-query hooks can only be used inside setup() function or functions that support injection context.`);let n=t(N(e));if(!n)throw Error(`No 'queryClient' found in Vue context, use 'VueQueryPlugin' to properly initialize the library.`);return n}n(),c();function J(t,n,r){let i=r||q(),o=h(()=>{let e=n;typeof e==`function`&&(e=e());let t=R(e);typeof t.enabled==`function`&&(t.enabled=t.enabled());let r=i.defaultQueryOptions(t);return r._optimisticResults=i.isRestoring?.value?`isRestoring`:`optimistic`,r}),s=new t(i,o.value),c=o.value.shallow?g(s.getCurrentResult()):p(s.getCurrentResult()),l=()=>{};i.isRestoring&&a(i.isRestoring,e=>{e||(l(),l=s.subscribe(e=>{L(c,e)}))},{immediate:!0});let u=()=>{s.setOptions(o.value),L(c,s.getCurrentResult())};a(o,u),e(()=>{l()});let d=(...e)=>(u(),c.refetch(...e)),v=()=>new Promise((e,t)=>{let n=()=>{},r=()=>{if(o.value.enabled!==!1){s.setOptions(o.value);let r=s.getOptimisticResult(o.value);r.isStale?(n(),s.fetchOptimistic(o.value).then(e,n=>{D(o.value.throwOnError,[n,s.getCurrentQuery()])?t(n):e(s.getCurrentResult())})):(n(),e(r))}};r(),n=a(o,r)});a(()=>c.error,e=>{if(c.isError&&!c.isFetching&&D(o.value.throwOnError,[e,s.getCurrentQuery()]))throw e});let y=f(o.value.shallow?m(c):_(c));for(let e in c)typeof c[e]==`function`&&(y[e]=c[e]);return y.suspense=v,y.refetch=d,y}function Y(e,t){return J(B,e,t)}function X(e){return typeof e==`object`&&!!e&&`url`in e}async function Z(e,t){if(!e?.organizations||!X(e.organizations))return;let{url:n}=e.organizations,r=n;n.startsWith(`http`)||(r=`${t}/${n}`);let i=await fetch(r);i.ok&&(e.organizations=await i.json())}async function Q(e,t){if(!e?.seat_map||!X(e.seat_map))return;let{url:n}=e.seat_map,r=n;n.startsWith(`http`)||(r=`${t}/${n}`);let i=await fetch(r);i.ok&&(e.seat_map=await i.json())}async function $(e){let t=e.startsWith(`/`)?e.slice(1):e,n=`${window.DATA_HOST}${t}`,r={allInOne:!1};n.includes(`#`)&&(r.allInOne=new URLSearchParams(n.split(`#`)[1]).get(`allInOne`)===`true`,n=n.split(`#`)[0]),e.startsWith(`http`)&&(n=e),n.endsWith(`/`)&&(n=n.slice(0,-1));let i=r.allInOne?[await fetch(n)]:[await fetch(`${n}/config.json`),await fetch(`${n}/team.json`),await fetch(`${n}/run.json`)],{status:a,statusText:o}=i[0];if(a>=400||a<200)throw Error(`fetch data failed. [status=${a}] [statusText=${o}]`);let s=await Promise.all(i.map(e=>e.json()));if(r.allInOne)return s[0];let c=s[0];return await Z(c,n),await Q(c,n),{contest:c,teams:s[1],submissions:s[2]}}function ee(e,t=!1){let n=window.REFETCH_INTERVAL;return t&&(n=!1),Y({queryKey:[e],queryFn:()=>$(e),retry:3,staleTime:3e4,refetchInterval:n})}n(),c(),u();var te=[`type`,`text`],ne=b({__name:`TheInput`,props:{textAlign:null,textType:null,modelValue:null},emits:[`update:modelValue`],setup(e){let t=e,{modelValue:n}=z(`modelValue`);return(e,a)=>i((r(),y(`input`,o({id:`input`,"onUpdate:modelValue":a[0]||=e=>l(n)?n.value=e:null},e.$attrs,{type:t.textType??`text`,text:t.textAlign??`center`,p:`x-4 y-2`,"w-full":``,bg:`transparent`,border:`~ rounded gray-200 dark:gray-700`,outline:`none active:none`}),null,16,te)),[[d,v(n)]])}});export{ee as n,ne as t};
@@ -1 +0,0 @@
1
- import{E as e,F as t,It as n,V as r,W as i,X as a,_ as o,b as s,g as c,h as l,ut as u,v as d,vt as f,x as p,y as m}from"./vue.runtime.esm-bundler-DTMOfGWR.js";import{V as h,_ as g,v as _}from"./index-D57KOcpK.js";import{n as v}from"./query-CoPl3fiI.js";import{t as y}from"./Board-CWwqX2IB.js";import{t as b}from"./Resolver-D_GRj6HP.js";import{t as x}from"./Countdown-BvWlPnYq.js";import{t as S}from"./Balloon-B3cPN2yD.js";import{t as C}from"./route-block-ChiJXsfH.js";e(),a(),f();var w=p({__name:`GoBack`,setup(e){let a=_(),{t:o}=h();return(e,c)=>{let f=r(`RouterLink`);return t(),d(`div`,null,[l(`div`,{class:`m-3 text-sm btn`,onClick:c[0]||=e=>u(a).back()},n(u(o)(`button.back`)),1),s(f,{class:`m-3 text-sm btn`,to:`/`},{default:i(()=>[m(n(u(o)(`button.home`)),1)]),_:1})])}}});e(),a(),f();var T={key:0},E={key:1,class:`flex flex-col items-center`},D={key:2},O=p({__name:`[...all]`,setup(e){let{t:r}=h(),i=g(),a=![`camp`,`icpc`,`ccpc`,`provincial-contest`].some(e=>i.fullPath.startsWith(`/${e}`)),f=v(),p=window.DATA_SOURCE;return(e,i)=>{let h=y,g=b,_=S,v=x,C=w;return u(p)?(t(),d(`div`,T,[u(f)===`board`?(t(),c(h,{key:0,"data-source-url":u(p)},null,8,[`data-source-url`])):u(f)===`resolver`?(t(),c(g,{key:1,"data-source-url":u(p)},null,8,[`data-source-url`])):u(f)===`balloon`?(t(),c(_,{key:2,"data-source-url":u(p)},null,8,[`data-source-url`])):u(f)===`countdown`?(t(),c(v,{key:3,"data-source-url":u(p)},null,8,[`data-source-url`])):o(``,!0)])):a?(t(),d(`div`,E,[i[0]||=l(`div`,{"text-4xl":``},[l(`div`,{"i-carbon-warning":``})],-1),m(` `+n(u(r)(`not-found`))+` `,1),s(C)])):(t(),d(`div`,D,[s(h)]))}}});typeof C==`function`&&C(O);var k=O;export{k as default};
@@ -1 +0,0 @@
1
- import{E as e,m as t}from"./vue.runtime.esm-bundler-DTMOfGWR.js";e();var n=`0.85.3`,r=`https://github.com/xcpcio/xcpcio`,i=`e93e9921e1`,a=`https://xcpcio.com`,o=`Board - XCPCIO`,s=`Rating - XCPCIO`,c=`Balloon - XCPCIO`,l=`Resolver - XCPCIO`,u=`Countdown - XCPCIO`,d=t(()=>window?window.CDN_HOST:``),f=t(()=>window?window.DATA_HOST:``),p=t(()=>f.value.replace(`/data/`,`/rating-data/`)),m=t(()=>window?window.DATA_REGION:``);export{f as a,r as c,l as d,o as f,u as i,p as l,c as n,m as o,a as p,d as r,i as s,n as t,s as u};