@xcpcio/board-app 0.24.3 → 0.26.0

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 (35) hide show
  1. package/dist/about.html +2 -2
  2. package/dist/assets/{DataSourceInput.vue_vue_type_script_setup_true_lang-bdd603c5.js → DataSourceInput.vue_vue_type_script_setup_true_lang-b63d8c0a.js} +1 -1
  3. package/dist/assets/{TheInput.vue_vue_type_script_setup_true_lang-19d39372.js → TheInput.vue_vue_type_script_setup_true_lang-01db0210.js} +1 -1
  4. package/dist/assets/_...all_-ccdf65e0.js +3 -0
  5. package/dist/assets/{_...all_-65bba7d0.css → _...all_-f6dd53aa.css} +1 -1
  6. package/dist/assets/{_name_-82a33e88.js → _name_-41975e46.js} +1 -1
  7. package/dist/assets/{about-6cc32222.js → about-ed4e51a8.js} +1 -1
  8. package/dist/assets/{app-a6c41ce5.js → app-229ad629.js} +13 -13
  9. package/dist/assets/{board-layout-a5587489.js → board-layout-22e4dc7d.js} +1 -1
  10. package/dist/assets/en-644e039f.js +1 -0
  11. package/dist/assets/{headless-13d3a223.js → headless-254ddfda.js} +1 -1
  12. package/dist/assets/{home-6560de4b.js → home-ff1bf49b.js} +1 -1
  13. package/dist/assets/{index-da8e69bb.css → index-00889800.css} +2 -2
  14. package/dist/assets/index-4ec61f53.js +1 -0
  15. package/dist/assets/{index-layout-f4d3ebfe.js → index-layout-d88ea34a.js} +1 -1
  16. package/dist/assets/{test-4090a9c4.js → test-0bd7427d.js} +1 -1
  17. package/dist/assets/{user-5e01721a.js → user-b4f3ed5d.js} +1 -1
  18. package/dist/assets/{virtual_pwa-register-af30bbb9.js → virtual_pwa-register-123217d5.js} +1 -1
  19. package/dist/assets/{zh-CN-534ed2df.js → zh-CN-44b801f0.js} +1 -1
  20. package/dist/balloon.html +1 -1
  21. package/dist/index.html +1 -1
  22. package/dist/sitemap.xml +1 -1
  23. package/dist/ssr-manifest.json +405 -129
  24. package/dist/sw.js +1 -1
  25. package/dist/test.html +1 -1
  26. package/package.json +3 -3
  27. package/src/components/Balloon.vue +2 -2
  28. package/src/components/BalloonBlock.vue +5 -6
  29. package/src/components/board/Board.vue +7 -1
  30. package/src/components/board/BoardTab.vue +153 -0
  31. package/src/components/board/Progress.vue +9 -7
  32. package/src/components.d.ts +1 -0
  33. package/dist/assets/_...all_-76798627.js +0 -3
  34. package/dist/assets/en-4a3e0074.js +0 -1
  35. package/dist/assets/index-4ddb0930.js +0 -1
package/dist/sw.js CHANGED
@@ -1 +1 @@
1
- if(!self.define){let s,e={};const l=(l,i)=>(l=new URL(l+".js",i).href,e[l]||new Promise((e=>{if("document"in self){const s=document.createElement("script");s.src=l,s.onload=e,document.head.appendChild(s)}else s=l,importScripts(l),e()})).then((()=>{let s=e[l];if(!s)throw new Error(`Module ${l} didn’t register its module`);return s})));self.define=(i,n)=>{const r=s||("document"in self?document.currentScript.src:"")||location.href;if(e[r])return;let u={};const a=s=>l(s,r),t={module:{uri:r},exports:u,require:a};e[r]=Promise.all(i.map((s=>t[s]||a(s)))).then((s=>(n(...s),u)))}}define(["./workbox-b8d87ee1"],(function(s){"use strict";self.skipWaiting(),s.clientsClaim(),s.precacheAndRoute([{url:"about.html",revision:"ace88e4572687267a1acb0c69a05ffeb"},{url:"assets/_...all_-65bba7d0.css",revision:null},{url:"assets/_...all_-76798627.js",revision:null},{url:"assets/_name_-82a33e88.js",revision:null},{url:"assets/about-6cc32222.js",revision:null},{url:"assets/app-a6c41ce5.js",revision:null},{url:"assets/board-layout-a5587489.js",revision:null},{url:"assets/DataSourceInput.vue_vue_type_script_setup_true_lang-bdd603c5.js",revision:null},{url:"assets/en-4a3e0074.js",revision:null},{url:"assets/headless-13d3a223.js",revision:null},{url:"assets/home-6560de4b.js",revision:null},{url:"assets/index-4ddb0930.js",revision:null},{url:"assets/index-da8e69bb.css",revision:null},{url:"assets/index-layout-f4d3ebfe.js",revision:null},{url:"assets/test-4090a9c4.js",revision:null},{url:"assets/TheInput.vue_vue_type_script_setup_true_lang-19d39372.js",revision:null},{url:"assets/user-5e01721a.js",revision:null},{url:"assets/virtual_pwa-register-af30bbb9.js",revision:null},{url:"assets/workbox-window.prod.es5-a7b12eab.js",revision:null},{url:"assets/zh-CN-534ed2df.js",revision:null},{url:"balloon.html",revision:"f485a2f28c070ac1700c41bd7c83f399"},{url:"index.html",revision:"2ab2b801130a3d0b77e29a61c61f3f48"},{url:"test.html",revision:"8364e51632fb751f7581dd9199827c19"},{url:"favicon.svg",revision:"5a744f4ccbb122d4a0575be779ddcd43"},{url:"safari-pinned-tab.svg",revision:"5eaf74d1c43d30e0af743b68a3f48504"},{url:"balloon2-192x192.png",revision:"c857ae6d9dfae118ab4397d4358422bd"},{url:"balloon2-512x512.png",revision:"065594f4f743fe3884793c03d3fe7d9e"},{url:"manifest.webmanifest",revision:"3082e8d8ebc9619c6c1055ff243a02a8"}],{}),s.cleanupOutdatedCaches(),s.registerRoute(new s.NavigationRoute(s.createHandlerBoundToURL("index.html")))}));
1
+ if(!self.define){let e,s={};const l=(l,i)=>(l=new URL(l+".js",i).href,s[l]||new Promise((s=>{if("document"in self){const e=document.createElement("script");e.src=l,e.onload=s,document.head.appendChild(e)}else e=l,importScripts(l),s()})).then((()=>{let e=s[l];if(!e)throw new Error(`Module ${l} didn’t register its module`);return e})));self.define=(i,n)=>{const r=e||("document"in self?document.currentScript.src:"")||location.href;if(s[r])return;let u={};const t=e=>l(e,r),a={module:{uri:r},exports:u,require:t};s[r]=Promise.all(i.map((e=>a[e]||t(e)))).then((e=>(n(...e),u)))}}define(["./workbox-b8d87ee1"],(function(e){"use strict";self.skipWaiting(),e.clientsClaim(),e.precacheAndRoute([{url:"about.html",revision:"d485ee3168acf5e6186b8b63a81da132"},{url:"assets/_...all_-ccdf65e0.js",revision:null},{url:"assets/_...all_-f6dd53aa.css",revision:null},{url:"assets/_name_-41975e46.js",revision:null},{url:"assets/about-ed4e51a8.js",revision:null},{url:"assets/app-229ad629.js",revision:null},{url:"assets/board-layout-22e4dc7d.js",revision:null},{url:"assets/DataSourceInput.vue_vue_type_script_setup_true_lang-b63d8c0a.js",revision:null},{url:"assets/en-644e039f.js",revision:null},{url:"assets/headless-254ddfda.js",revision:null},{url:"assets/home-ff1bf49b.js",revision:null},{url:"assets/index-00889800.css",revision:null},{url:"assets/index-4ec61f53.js",revision:null},{url:"assets/index-layout-d88ea34a.js",revision:null},{url:"assets/test-0bd7427d.js",revision:null},{url:"assets/TheInput.vue_vue_type_script_setup_true_lang-01db0210.js",revision:null},{url:"assets/user-b4f3ed5d.js",revision:null},{url:"assets/virtual_pwa-register-123217d5.js",revision:null},{url:"assets/workbox-window.prod.es5-a7b12eab.js",revision:null},{url:"assets/zh-CN-44b801f0.js",revision:null},{url:"balloon.html",revision:"6905add912497b05896d4c794bd4bead"},{url:"index.html",revision:"d29bab4c1a83515d7987ec2469c63312"},{url:"test.html",revision:"30f873fefdfe20ee8827d817d7ef703b"},{url:"favicon.svg",revision:"5a744f4ccbb122d4a0575be779ddcd43"},{url:"safari-pinned-tab.svg",revision:"5eaf74d1c43d30e0af743b68a3f48504"},{url:"balloon2-192x192.png",revision:"c857ae6d9dfae118ab4397d4358422bd"},{url:"balloon2-512x512.png",revision:"065594f4f743fe3884793c03d3fe7d9e"},{url:"manifest.webmanifest",revision:"3082e8d8ebc9619c6c1055ff243a02a8"}],{}),e.cleanupOutdatedCaches(),e.registerRoute(new e.NavigationRoute(e.createHandlerBoundToURL("index.html")))}));
package/dist/test.html CHANGED
@@ -1 +1 @@
1
- <!DOCTYPE html><html lang="en" data-critters-container><head><meta charset="UTF-8"><!-- <meta name="viewport" content="width=device-width, initial-scale=1.0"> --><link rel="apple-touch-icon" href="https://cdn.jsdelivr.net/npm/@xcpcio/board-app@0.24.3/dist/balloon-192x192.png"><link rel="mask-icon" href="https://cdn.jsdelivr.net/npm/@xcpcio/board-app@0.24.3/dist/balloon-512x512.svg" color="#00aba9"><meta name="msapplication-TileColor" content="#00aba9"><script>function normalizePath(_){for(;_.endsWith("/");)_=_.slice(0,-1);return _+"/"}{let _="__CDN_HOST__";_=normalizePath(_),window.CDN_HOST=_}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"}</script><script>!function(){var e=window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches,t=localStorage.getItem("vueuse-color-scheme")||"auto";("dark"===t||e&&"light"!==t)&&document.documentElement.classList.toggle("dark",!0)}()</script><script type="module" async crossorigin src="https://cdn.jsdelivr.net/npm/@xcpcio/board-app@0.24.3/dist/assets/app-a6c41ce5.js"></script><link rel="manifest" href="/manifest.webmanifest"><style></style><link rel="modulepreload" crossorigin href="/assets/home-6560de4b.js"><link rel="modulepreload" crossorigin href="/assets/test-4090a9c4.js"><title>Board - XCPCIO</title><meta name="description" content="XCPCIO-Board 主要收录 *CPC 系列竞赛的榜单。"><meta name="keywords" content="icpc, ccpc, rank, board, standings"><meta name="theme-color" content="#ffffff"><link rel="icon" type="image/svg+xml" href="/favicon.svg"></head><body class="font-sans"><div id="app" data-server-rendered="true"><main px-4 py-10 text="center gray-700 dark:gray-200"><div flex flex-col justify-center items-center><div text-4xl><div i-carbon-campsite></div></div><p><a rel="noreferrer" href="https://github.com/antfu/vitesse" target="_blank">Vitesse</a></p><p><em text-sm opacity-75>Opinionated Vite Starter Template</em></p><div py-4></div><div w-48><input id="input" value type="text" placeholder="What's your name?" autocomplete="false" p="x-4 y-2" w-full text="center" bg="transparent" border="~ rounded gray-200 dark:gray-700" outline="none active:none"><label class="hidden" for="input">What's your name?</label></div><div><button m-3 text-sm btn disabled="disabled">GO</button></div></div><footer mt-8 py-4 md:py-8 lg:py-10 w-full flex justify-center items-center><div text-center w-full><a href="/" class flex items-center justify-center text-2xl font-semibold text-gray-900 dark:text-white><div i-ion-balloon-sharp mr-4 h-8></div>Get more balloons</a><p my-6 text-gray-500 dark:text-gray-400 w-full flex justify-center>Open-source project of ICPC/CCPC Standings.</p><ul mb-6 w-full flex flex-wrap items-center justify-center text-gray-900 dark:text-white><li><a href="/" class mr-4 md:mr-6 hover:underline>Home</a></li><li><div class="v-popper v-popper--theme-tooltip" w-inherit><!--[--><!--[--><a href="https://github.com/xcpcio/xcpcio" class="mr-4 md:mr-6 hover:underline" rel="noreferrer" target="_blank" title="GitHub">GitHub</a><!--]--><div id="popper_1vvkpjor_17h6rl" class="v-popper__popper v-popper--theme-tooltip v-popper__popper--hidden v-popper__popper--hide-to" style="position:absolute;transform:translate3d(0,0,0)" aria-hidden="true" data-popper-placement><div class="v-popper__backdrop"></div><div class="v-popper__wrapper" style><div class="v-popper__inner"><!----></div><div class="v-popper__arrow-container" style="left:0;top:0"><div class="v-popper__arrow-outer"></div><div class="v-popper__arrow-inner"></div></div></div></div><!--]--></div></li><li><div class="v-popper v-popper--theme-tooltip" w-inherit><!--[--><!--[--><a href="mailto:hi@dup4.com" mr-4 md:mr-6 hover:underline>Contact</a><!--]--><div id="popper_5she32xz_17h6rl" class="v-popper__popper v-popper--theme-tooltip v-popper__popper--hidden v-popper__popper--hide-to" style="position:absolute;transform:translate3d(0,0,0)" aria-hidden="true" data-popper-placement><div class="v-popper__backdrop"></div><div class="v-popper__wrapper" style><div class="v-popper__inner"><!----></div><div class="v-popper__arrow-container" style="left:0;top:0"><div class="v-popper__arrow-outer"></div><div class="v-popper__arrow-inner"></div></div></div></div><!--]--></div></li></ul><span text-sm text-gray-500 sm:text-center dark:text-gray-400 w-full>© 2020-PRESENT <a href="/" class hover:underline>XCPCIO™</a>. All Rights Reserved.</span></div></footer><div mx-auto mt-5 text-center text-sm opacity-50>[Home Layout]</div></main></div><script>window.__INITIAL_STATE__='{"pinia":{"user":{"savedName":""}}}'</script><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"),t=(e.src=umamiJSUrl,e.defer=!0,e.setAttribute("data-website-id",umamiWebsiteId),document.getElementsByTagName("script")[0]);t.parentNode.insertBefore(e,t)}()}catch(e){}try{var plausibleJSUrl=__PLAUSIBLE_JS_URL__,plausibleDataDomain=__PLAUSIBLE_DATA_DOMAIN__;!function(){var e=document.createElement("script"),t=(e.src=plausibleJSUrl,e.defer=!0,e.setAttribute("data-domain",plausibleDataDomain),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"),t=(e.src="https://hm.baidu.com/hm.js?"+baiduAnalyticsId,document.getElementsByTagName("script")[0]);t.parentNode.insertBefore(e,t)}()}catch(e){}try{var googleAnalyticsId=__GOOGLE_ANALYTICS_ID__;!function(){var e,t,a,r;location.port||(e=window,r=document,t="script",a="ga",e.GoogleAnalyticsObject=a,e.ga=e.ga||function(){(e.ga.q=e.ga.q||[]).push(arguments)},e.ga.l=+new Date,a=r.createElement(t),r=r.getElementsByTagName(t)[0],a.async=1,a.src="//www.google-analytics.com/analytics.js",r.parentNode.insertBefore(a,r),ga("create",""+googleAnalyticsId,"auto"),ga("send","pageview"))}()}catch(e){}</script></body></html>
1
+ <!DOCTYPE html><html lang="en" data-critters-container><head><meta charset="UTF-8"><!-- <meta name="viewport" content="width=device-width, initial-scale=1.0"> --><link rel="apple-touch-icon" href="https://cdn.jsdelivr.net/npm/@xcpcio/board-app@0.26.0/dist/balloon-192x192.png"><link rel="mask-icon" href="https://cdn.jsdelivr.net/npm/@xcpcio/board-app@0.26.0/dist/balloon-512x512.svg" color="#00aba9"><meta name="msapplication-TileColor" content="#00aba9"><script>function normalizePath(_){for(;_.endsWith("/");)_=_.slice(0,-1);return _+"/"}{let _="__CDN_HOST__";_=normalizePath(_),window.CDN_HOST=_}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"}</script><script>!function(){var e=window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches,t=localStorage.getItem("vueuse-color-scheme")||"auto";("dark"===t||e&&"light"!==t)&&document.documentElement.classList.toggle("dark",!0)}()</script><script type="module" async crossorigin src="https://cdn.jsdelivr.net/npm/@xcpcio/board-app@0.26.0/dist/assets/app-229ad629.js"></script><link rel="manifest" href="/manifest.webmanifest"><style></style><link rel="modulepreload" crossorigin href="/assets/home-ff1bf49b.js"><link rel="modulepreload" crossorigin href="/assets/test-0bd7427d.js"><title>Board - XCPCIO</title><meta name="description" content="XCPCIO-Board 主要收录 *CPC 系列竞赛的榜单。"><meta name="keywords" content="icpc, ccpc, rank, board, standings"><meta name="theme-color" content="#ffffff"><link rel="icon" type="image/svg+xml" href="/favicon.svg"></head><body class="font-sans"><div id="app" data-server-rendered="true"><main px-4 py-10 text="center gray-700 dark:gray-200"><div flex flex-col justify-center items-center><div text-4xl><div i-carbon-campsite></div></div><p><a rel="noreferrer" href="https://github.com/antfu/vitesse" target="_blank">Vitesse</a></p><p><em text-sm opacity-75>Opinionated Vite Starter Template</em></p><div py-4></div><div w-48><input id="input" value type="text" placeholder="What's your name?" autocomplete="false" p="x-4 y-2" w-full text="center" bg="transparent" border="~ rounded gray-200 dark:gray-700" outline="none active:none"><label class="hidden" for="input">What's your name?</label></div><div><button m-3 text-sm btn disabled="disabled">GO</button></div></div><footer mt-8 py-4 md:py-8 lg:py-10 w-full flex justify-center items-center><div text-center w-full><a href="/" class flex items-center justify-center text-2xl font-semibold text-gray-900 dark:text-white><div i-ion-balloon-sharp mr-4 h-8></div>Get more balloons</a><p my-6 text-gray-500 dark:text-gray-400 w-full flex justify-center>Open-source project of ICPC/CCPC Standings.</p><ul mb-6 w-full flex flex-wrap items-center justify-center text-gray-900 dark:text-white><li><a href="/" class mr-4 md:mr-6 hover:underline>Home</a></li><li><div class="v-popper v-popper--theme-tooltip" w-inherit><!--[--><!--[--><a href="https://github.com/xcpcio/xcpcio" class="mr-4 md:mr-6 hover:underline" rel="noreferrer" target="_blank" title="GitHub">GitHub</a><!--]--><div id="popper_rxbafghz_7vyb8a" class="v-popper__popper v-popper--theme-tooltip v-popper__popper--hidden v-popper__popper--hide-to" style="position:absolute;transform:translate3d(0,0,0)" aria-hidden="true" data-popper-placement><div class="v-popper__backdrop"></div><div class="v-popper__wrapper" style><div class="v-popper__inner"><!----></div><div class="v-popper__arrow-container" style="left:0;top:0"><div class="v-popper__arrow-outer"></div><div class="v-popper__arrow-inner"></div></div></div></div><!--]--></div></li><li><div class="v-popper v-popper--theme-tooltip" w-inherit><!--[--><!--[--><a href="mailto:hi@dup4.com" mr-4 md:mr-6 hover:underline>Contact</a><!--]--><div id="popper_ky093qny_7vyb8b" class="v-popper__popper v-popper--theme-tooltip v-popper__popper--hidden v-popper__popper--hide-to" style="position:absolute;transform:translate3d(0,0,0)" aria-hidden="true" data-popper-placement><div class="v-popper__backdrop"></div><div class="v-popper__wrapper" style><div class="v-popper__inner"><!----></div><div class="v-popper__arrow-container" style="left:0;top:0"><div class="v-popper__arrow-outer"></div><div class="v-popper__arrow-inner"></div></div></div></div><!--]--></div></li></ul><span text-sm text-gray-500 sm:text-center dark:text-gray-400 w-full>© 2020-PRESENT <a href="/" class hover:underline>XCPCIO™</a>. All Rights Reserved.</span></div></footer><div mx-auto mt-5 text-center text-sm opacity-50>[Home Layout]</div></main></div><script>window.__INITIAL_STATE__='{"pinia":{"user":{"savedName":""}}}'</script><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"),t=(e.src=umamiJSUrl,e.defer=!0,e.setAttribute("data-website-id",umamiWebsiteId),document.getElementsByTagName("script")[0]);t.parentNode.insertBefore(e,t)}()}catch(e){}try{var plausibleJSUrl=__PLAUSIBLE_JS_URL__,plausibleDataDomain=__PLAUSIBLE_DATA_DOMAIN__;!function(){var e=document.createElement("script"),t=(e.src=plausibleJSUrl,e.defer=!0,e.setAttribute("data-domain",plausibleDataDomain),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"),t=(e.src="https://hm.baidu.com/hm.js?"+baiduAnalyticsId,document.getElementsByTagName("script")[0]);t.parentNode.insertBefore(e,t)}()}catch(e){}try{var googleAnalyticsId=__GOOGLE_ANALYTICS_ID__;!function(){var e,t,a,r;location.port||(e=window,r=document,t="script",a="ga",e.GoogleAnalyticsObject=a,e.ga=e.ga||function(){(e.ga.q=e.ga.q||[]).push(arguments)},e.ga.l=+new Date,a=r.createElement(t),r=r.getElementsByTagName(t)[0],a.async=1,a.src="//www.google-analytics.com/analytics.js",r.parentNode.insertBefore(a,r),ga("create",""+googleAnalyticsId,"auto"),ga("send","pageview"))}()}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.24.3",
4
+ "version": "0.26.0",
5
5
  "description": "XCPCIO Board App",
6
6
  "author": "Dup4 <lyuzhi.pan@gmail.com>",
7
7
  "license": "MIT",
@@ -53,8 +53,8 @@
53
53
  "vue-router": "^4.2.4",
54
54
  "vue-search-select": "^3.1.2",
55
55
  "vue-toast-notification": "^3",
56
- "@xcpcio/core": "0.24.3",
57
- "@xcpcio/types": "0.24.3"
56
+ "@xcpcio/core": "0.26.0",
57
+ "@xcpcio/types": "0.26.0"
58
58
  },
59
59
  "devDependencies": {
60
60
  "@antfu/eslint-config": "^0.39.8",
@@ -85,11 +85,11 @@ onUnmounted(() => {
85
85
  flex flex-col justify-between
86
86
  >
87
87
  <template
88
- v-for="(b, ix) in balloons"
88
+ v-for="(b, index) in balloons"
89
89
  :key="b.key"
90
90
  >
91
91
  <BalloonBlock
92
- :index="ix"
92
+ :index="index"
93
93
  :balloon="b"
94
94
  />
95
95
  </template>
@@ -7,9 +7,8 @@ const props = defineProps<{
7
7
  balloon: Balloon,
8
8
  }>();
9
9
 
10
- const balloon = computed(() => {
11
- return props.balloon;
12
- });
10
+ const index = computed(() => props.index);
11
+ const balloon = computed(() => props.balloon);
13
12
 
14
13
  const el = ref(null);
15
14
  const isVisible = useElementVisibility(el);
@@ -42,18 +41,18 @@ function getColor(c: ThemeColor): string {
42
41
  h-24
43
42
  flex flex-row gap-x-4
44
43
  font-mono text-4xl
45
- :class="[props.index % 2 === 0 ? 'bg-resolver-bg-zero' : 'bg-resolver-bg-one']"
44
+ :class="[index % 2 === 0 ? 'bg-resolver-bg-zero' : 'bg-resolver-bg-one']"
46
45
  >
47
46
  <div
48
47
  w-20
49
48
  flex flex-shrink-0 justify-center items-center
50
49
  :style="{
51
- backgroundColor: getColor(balloon.problem!.balloonColor!.background_color),
50
+ backgroundColor: getColor(balloon.problem?.balloonColor?.background_color ?? 'rgba(0, 0, 0, 0.5)'),
52
51
  }"
53
52
  >
54
53
  <div
55
54
  :style="{
56
- color: getColor(balloon.problem!.balloonColor!.color),
55
+ color: getColor(balloon.problem?.balloonColor?.color ?? '#fff'),
57
56
  }"
58
57
  >
59
58
  {{ balloon.problem.label }}
@@ -325,9 +325,15 @@ const widthClass = "sm:w-[1260px] xl:w-screen";
325
325
  </div>
326
326
  </div>
327
327
 
328
+ <div mt-2>
329
+ <BoardTab
330
+ :rank="rank"
331
+ />
332
+ </div>
333
+
328
334
  <div
329
335
  :class="[widthClass]"
330
- mt-4
336
+ mt-2
331
337
  flex flex-row justify-center
332
338
  >
333
339
  <div class="w-[92%]">
@@ -0,0 +1,153 @@
1
+ <script setup lang="ts">
2
+ import type { Rank } from "@xcpcio/core";
3
+
4
+ import type { DropdownOptions } from "flowbite";
5
+ import { Dropdown } from "flowbite";
6
+ import { useToast } from "vue-toast-notification";
7
+
8
+ const props = defineProps<{
9
+ rank: Rank,
10
+ }>();
11
+
12
+ const rank = computed(() => props.rank);
13
+
14
+ const { t } = useI18n();
15
+ const $toast = useToast();
16
+ const { copy, isSupported } = useClipboard();
17
+
18
+ let dropdown: Dropdown | null = null;
19
+ const dropdownTargetEl = ref(null);
20
+ const dropdownTriggerEl = ref(null);
21
+
22
+ function preCheck() {
23
+ if (!window) {
24
+ return false;
25
+ }
26
+
27
+ if (!isSupported.value) {
28
+ $toast.warning("clipboard is not supported");
29
+ dropdown?.hide();
30
+ return false;
31
+ }
32
+
33
+ return true;
34
+ }
35
+
36
+ function postCall() {
37
+ $toast.success("copy success");
38
+ dropdown?.hide();
39
+ }
40
+
41
+ function copyLink() {
42
+ if (!preCheck()) {
43
+ return;
44
+ }
45
+
46
+ copy(window.location.href);
47
+ postCall();
48
+ }
49
+
50
+ function copyCode() {
51
+ if (!preCheck()) {
52
+ return;
53
+ }
54
+
55
+ const code = `<iframe src="${window.location.href}" border="0" frameborder="no" framespacing="0" allowfullscreen="true" style="width: 100%; height: 720px"></iframe>`;
56
+ copy(code);
57
+ postCall();
58
+ }
59
+
60
+ onMounted(() => {
61
+ {
62
+ if (dropdownTargetEl.value && dropdownTriggerEl.value) {
63
+ const options: DropdownOptions = {
64
+ placement: "right",
65
+ triggerType: "click",
66
+ offsetSkidding: 32,
67
+ offsetDistance: 5,
68
+ delay: 300,
69
+ };
70
+
71
+ dropdown = new Dropdown(dropdownTargetEl.value, dropdownTriggerEl.value, options);
72
+ }
73
+ }
74
+ });
75
+ </script>
76
+
77
+ <template>
78
+ <div
79
+ flex
80
+ >
81
+ <div>
82
+ <VTooltip
83
+ w-inherit
84
+ >
85
+ <div>
86
+ <div
87
+ i-material-symbols-info-outline
88
+ text-lg
89
+ />
90
+ </div>
91
+
92
+ <template #popper>
93
+ <div
94
+ flex
95
+ >
96
+ <div>
97
+ {{ t("standings.options.calculation_of_penalty") }}: {{ t(`standings.options.${rank.contest.options?.calculationOfPenalty}`) }}
98
+ </div>
99
+ </div>
100
+ </template>
101
+ </VTooltip>
102
+ </div>
103
+
104
+ <div
105
+ class="border-l-[1px] border-r-[1px]"
106
+ mx-2
107
+ h-6
108
+ border-color-black
109
+ dark:border-color-white
110
+ />
111
+
112
+ <div
113
+ flex
114
+ >
115
+ <div
116
+ ref="dropdownTriggerEl"
117
+ i-material-symbols-share
118
+ text-lg
119
+ cursor-pointer
120
+ />
121
+
122
+ <div
123
+ ref="dropdownTargetEl"
124
+ class="z-9999 hidden divide-y divide-gray-100 rounded shadow w-36"
125
+ bg-white
126
+ dark:bg-gray-700
127
+ >
128
+ <ul
129
+ class="py-2 text-sm text-gray-700 dark:text-gray-200"
130
+ >
131
+ <li>
132
+ <div
133
+ class="block px-4 py-2 hover:bg-gray-100 dark:hover:bg-gray-600 dark:hover:text-white"
134
+ cursor-pointer
135
+ @click="copyLink"
136
+ >
137
+ Copy Page Link
138
+ </div>
139
+ </li>
140
+ <li>
141
+ <div
142
+ class="block px-4 py-2 hover:bg-gray-100 dark:hover:bg-gray-600 dark:hover:text-white"
143
+ cursor-pointer
144
+ @click="copyCode"
145
+ >
146
+ Copy Page Code
147
+ </div>
148
+ </li>
149
+ </ul>
150
+ </div>
151
+ </div>
152
+ </div>
153
+ </template>
@@ -146,13 +146,15 @@ function barWidthInStyle() {
146
146
  }
147
147
 
148
148
  onMounted(() => {
149
- scroll.value.onmouseenter = () => {
150
- tooltip.value.classList.add("in");
151
- };
152
-
153
- scroll.value.onmouseleave = () => {
154
- tooltip.value.classList.remove("in");
155
- };
149
+ if (props.needScroll === true) {
150
+ scroll.value.onmouseenter = () => {
151
+ tooltip.value.classList.add("in");
152
+ };
153
+
154
+ scroll.value.onmouseleave = () => {
155
+ tooltip.value.classList.remove("in");
156
+ };
157
+ }
156
158
 
157
159
  if (progressRatio.value !== -1) {
158
160
  pauseUpdate.value = true;
@@ -11,6 +11,7 @@ declare module 'vue' {
11
11
  Balloon: typeof import('./components/Balloon.vue')['default']
12
12
  BalloonBlock: typeof import('./components/BalloonBlock.vue')['default']
13
13
  Board: typeof import('./components/board/Board.vue')['default']
14
+ BoardTab: typeof import('./components/board/BoardTab.vue')['default']
14
15
  BottomStatistics: typeof import('./components/board/BottomStatistics.vue')['default']
15
16
  ContestIndexUI: typeof import('./components/ContestIndexUI.vue')['default']
16
17
  ContestStateBadge: typeof import('./components/board/ContestStateBadge.vue')['default']