@xcpcio/board-app 0.26.1 → 0.28.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 (52) hide show
  1. package/dist/assets/{_...all_-f6dd53aa.css → Board-96bc5ecc.css} +1 -1
  2. package/dist/assets/Board-ebc7d2d2.js +3 -0
  3. package/dist/assets/DataSourceInput.vue_vue_type_script_setup_true_lang-983c0ef5.js +1 -0
  4. package/dist/assets/TheInput.vue_vue_type_script_setup_true_lang-6ed50735.js +1 -0
  5. package/dist/assets/_...all_-51e55631.js +1 -0
  6. package/dist/assets/_name_-735452d1.js +1 -0
  7. package/dist/assets/{about-94580762.js → about-c67fc7ea.js} +1 -1
  8. package/dist/assets/board-55f2cfd1.js +1 -0
  9. package/dist/assets/board-layout-9c68b45b.js +1 -0
  10. package/dist/assets/headless-a3c0debd.js +1 -0
  11. package/dist/assets/home-45ae8111.js +1 -0
  12. package/dist/assets/index-1418cfa7.js +205 -0
  13. package/dist/assets/index-65e6de07.js +1 -0
  14. package/dist/assets/{index-00889800.css → index-a0a089d2.css} +2 -2
  15. package/dist/assets/index-layout-3ce68075.js +1 -0
  16. package/dist/assets/test-09be4a74.js +1 -0
  17. package/dist/assets/useQueryBoardData-5ec632a5.js +1 -0
  18. package/dist/assets/user-901b4c74.js +1 -0
  19. package/dist/assets/virtual_pwa-register-033c41ee.js +1 -0
  20. package/dist/index.html +122 -1
  21. package/dist/sw.js +1 -1
  22. package/package.json +4 -4
  23. package/src/components/ContestIndexUI.vue +18 -12
  24. package/src/components/Footer.vue +44 -40
  25. package/src/components/board/BoardTab.vue +2 -2
  26. package/src/components/board/SubmissionsTable.vue +15 -23
  27. package/src/components/flowbite/Tooltip.css +172 -0
  28. package/src/components/flowbite/Tooltip.vue +62 -0
  29. package/src/components.d.ts +1 -0
  30. package/src/composables/useQueryBoardData.ts +5 -0
  31. package/src/pages/[...all].vue +0 -10
  32. package/src/pages/board.vue +8 -0
  33. package/uno.config.ts +5 -0
  34. package/dist/about.html +0 -11
  35. package/dist/assets/DataSourceInput.vue_vue_type_script_setup_true_lang-6fc6f8ea.js +0 -1
  36. package/dist/assets/TheInput.vue_vue_type_script_setup_true_lang-4ea0bd97.js +0 -1
  37. package/dist/assets/_...all_-cf83185b.js +0 -3
  38. package/dist/assets/_name_-58c24204.js +0 -1
  39. package/dist/assets/app-21014468.js +0 -205
  40. package/dist/assets/board-layout-430c688d.js +0 -1
  41. package/dist/assets/headless-4d39b6f3.js +0 -1
  42. package/dist/assets/home-401b6bdc.js +0 -1
  43. package/dist/assets/index-95c5e1ae.js +0 -1
  44. package/dist/assets/index-layout-bb5b04eb.js +0 -1
  45. package/dist/assets/test-5e95874d.js +0 -1
  46. package/dist/assets/user-57f2ad93.js +0 -1
  47. package/dist/assets/virtual_pwa-register-8d09e89c.js +0 -1
  48. package/dist/balloon.html +0 -1
  49. package/dist/robots.txt +0 -4
  50. package/dist/sitemap.xml +0 -1
  51. package/dist/ssr-manifest.json +0 -834
  52. package/dist/test.html +0 -1
package/dist/index.html CHANGED
@@ -1 +1,122 @@
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.1/dist/balloon-192x192.png"><link rel="mask-icon" href="https://cdn.jsdelivr.net/npm/@xcpcio/board-app@0.26.1/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.1/dist/assets/app-21014468.js"></script><link rel="manifest" href="/manifest.webmanifest"><style></style><link rel="modulepreload" crossorigin href="/assets/index-layout-bb5b04eb.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"><!--[--><header class="header z-40 sm:w-[1024px] lg:w-screen" data-v-a79e7085><button title="Scroll to top" fixed bottom-6 right-6 z-100 h-10 w-10 rounded-full transition duration-300 print:hidden hover-bg-hex-8883 hover:op100 class="op0! pointer-events-none" data-v-a79e7085><div i-ri-arrow-up-line data-v-a79e7085></div></button><nav class="nav" text-xl data-v-a79e7085><div class="spacer" data-v-a79e7085></div><div class="right" print:op0 data-v-a79e7085><a aria-current="page" href="/" class="router-link-active router-link-exact-active" icon-btn title="Home" focusable="false" data-v-a79e7085><div i-ion-balloon-sharp data-v-a79e7085></div></a><a icon-btn title="Change languages" data-v-a79e7085><div i-carbon-language data-v-a79e7085></div></a><a icon-btn title="Toggle dark mode" data-v-a79e7085><div i="carbon-sun dark:carbon-moon" data-v-a79e7085></div></a><a icon-btn rel="noreferrer" href="https://github.com/xcpcio/xcpcio" target="_blank" title="GitHub" data-v-a79e7085><div i-carbon-logo-github data-v-a79e7085></div></a></div></nav></header><main class="lg:mt-[-52px]" py-2 text-gray-700 dark:text-gray-200><!----><footer mt-8 py-4 md:py-8 lg:py-10 w-full flex justify-center items-center class="sm:w-[1024px] lg:w-screen"><div text-center w-full><a aria-current="page" href="/" class="router-link-active router-link-exact-active" 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 aria-current="page" href="/" class="router-link-active router-link-exact-active" 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_41nllool_7xic5b" 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_sa6158xf_7xic5e" 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 aria-current="page" href="/" class="router-link-active router-link-exact-active" hover:underline>XCPCIO™</a>. All Rights Reserved.</span></div></footer></main><!--]--></div><script>window.__INITIAL_STATE__='{"pinia":{}}'</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>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <!-- <meta name="viewport" content="width=device-width, initial-scale=1.0"> -->
6
+ <link rel="apple-touch-icon" href="https://cdn.jsdelivr.net/npm/@xcpcio/board-app@0.28.0/dist/balloon-192x192.png">
7
+ <link rel="mask-icon" href="https://cdn.jsdelivr.net/npm/@xcpcio/board-app@0.28.0/dist/balloon-512x512.svg" color="#00aba9">
8
+ <meta name="msapplication-TileColor" content="#00aba9">
9
+ <script>
10
+ function normalizePath(path) {
11
+ while (path.endsWith("/")) {
12
+ path = path.slice(0, -1);
13
+ }
14
+ return `${path}/`;
15
+ }
16
+
17
+ {
18
+ let CDN_HOST = "__CDN_HOST__";
19
+ CDN_HOST = normalizePath(CDN_HOST);
20
+ window.CDN_HOST = CDN_HOST;
21
+ }
22
+
23
+ try {
24
+ let DATA_HOST = __DATA_HOST__;
25
+ DATA_HOST = normalizePath(DATA_HOST);
26
+ window.DATA_HOST = DATA_HOST;
27
+ } catch (e) {
28
+ window.DATA_HOST = "/data/";
29
+ }
30
+
31
+ try {
32
+ let DATA_REGION = __DATA_REGION__;
33
+ window.DATA_REGION = DATA_REGION;
34
+ } catch (e) {
35
+ window.DATA_REGION = "CN";
36
+ }
37
+ </script>
38
+ <script>
39
+ (function () {
40
+ const prefersDark = window.matchMedia && window.matchMedia("(prefers-color-scheme: dark)").matches;
41
+ const setting = localStorage.getItem("vueuse-color-scheme") || "auto";
42
+ if (setting === "dark" || (prefersDark && setting !== "light")) {
43
+ document.documentElement.classList.toggle("dark", true);
44
+ }
45
+ })();
46
+ </script>
47
+ <script type="module" crossorigin src="https://cdn.jsdelivr.net/npm/@xcpcio/board-app@0.28.0/dist/assets/index-1418cfa7.js"></script>
48
+ <link rel="manifest" href="/manifest.webmanifest"><style></style></head>
49
+ <body class="font-sans">
50
+ <div id="app"></div>
51
+
52
+ <noscript>This website requires JavaScript to function properly. Please enable JavaScript to continue.</noscript>
53
+ <script>
54
+ try {
55
+ var umamiJSUrl = __UMAMI_JS_URL__;
56
+ var umamiWebsiteId = __UMAMI_WEBSITE_ID__;
57
+ (function () {
58
+ var script = document.createElement("script");
59
+ script.src = umamiJSUrl;
60
+ script.defer = true;
61
+ script.setAttribute("data-website-id", umamiWebsiteId);
62
+ var s = document.getElementsByTagName("script")[0];
63
+ s.parentNode.insertBefore(script, s);
64
+ })();
65
+ } catch (e) {}
66
+
67
+ try {
68
+ var plausibleJSUrl = __PLAUSIBLE_JS_URL__;
69
+ var plausibleDataDomain = __PLAUSIBLE_DATA_DOMAIN__;
70
+ (function () {
71
+ var script = document.createElement("script");
72
+ script.src = plausibleJSUrl;
73
+ script.defer = true;
74
+ script.setAttribute("data-domain", plausibleDataDomain);
75
+ var s = document.getElementsByTagName("script")[0];
76
+ s.parentNode.insertBefore(script, s);
77
+ })();
78
+ } catch (e) {}
79
+
80
+ try {
81
+ var baiduAnalyticsId = __BAIDU_ANALYTICS_ID__;
82
+ var _hmt = _hmt || [];
83
+ (function () {
84
+ var hm = document.createElement("script");
85
+ hm.src = `https://hm.baidu.com/hm.js?${baiduAnalyticsId}`;
86
+ var s = document.getElementsByTagName("script")[0];
87
+ s.parentNode.insertBefore(hm, s);
88
+ })();
89
+ } catch (e) {}
90
+
91
+ try {
92
+ var googleAnalyticsId = __GOOGLE_ANALYTICS_ID__;
93
+ (function () {
94
+ if (!location.port) {
95
+ (function (i, s, o, g, r, a, m) {
96
+ i["GoogleAnalyticsObject"] = r;
97
+ (i[r] =
98
+ i[r] ||
99
+ function () {
100
+ (i[r].q = i[r].q || []).push(arguments);
101
+ }),
102
+ (i[r].l = 1 * new Date());
103
+ (a = s.createElement(o)), (m = s.getElementsByTagName(o)[0]);
104
+ a.async = 1;
105
+ a.src = g;
106
+ m.parentNode.insertBefore(a, m);
107
+ })(
108
+ window,
109
+ document,
110
+ "script",
111
+ "//www.google-analytics.com/analytics.js",
112
+ "ga"
113
+ );
114
+ ga("create", `${googleAnalyticsId}`, "auto");
115
+ ga("send", "pageview");
116
+ }
117
+ })();
118
+ } catch (e) {}
119
+ </script>
120
+
121
+ </body>
122
+ </html>
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 t=s=>l(s,r),a={module:{uri:r},exports:u,require:t};e[r]=Promise.all(i.map((s=>a[s]||t(s)))).then((s=>(n(...s),u)))}}define(["./workbox-b8d87ee1"],(function(s){"use strict";self.skipWaiting(),s.clientsClaim(),s.precacheAndRoute([{url:"about.html",revision:"d938561988fbf3104e0b31aa9e4a2bc1"},{url:"assets/_...all_-cf83185b.js",revision:null},{url:"assets/_...all_-f6dd53aa.css",revision:null},{url:"assets/_name_-58c24204.js",revision:null},{url:"assets/about-94580762.js",revision:null},{url:"assets/app-21014468.js",revision:null},{url:"assets/board-layout-430c688d.js",revision:null},{url:"assets/DataSourceInput.vue_vue_type_script_setup_true_lang-6fc6f8ea.js",revision:null},{url:"assets/en-644e039f.js",revision:null},{url:"assets/headless-4d39b6f3.js",revision:null},{url:"assets/home-401b6bdc.js",revision:null},{url:"assets/index-00889800.css",revision:null},{url:"assets/index-95c5e1ae.js",revision:null},{url:"assets/index-layout-bb5b04eb.js",revision:null},{url:"assets/test-5e95874d.js",revision:null},{url:"assets/TheInput.vue_vue_type_script_setup_true_lang-4ea0bd97.js",revision:null},{url:"assets/user-57f2ad93.js",revision:null},{url:"assets/virtual_pwa-register-8d09e89c.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:"6bbc39347b6afd40a71f3dcb5c4bc0ac"},{url:"index.html",revision:"d061c4d0ec28103a37250d1248587ef9"},{url:"test.html",revision:"fd33f2dea27eb2db073de93005863ff6"},{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 s,e={};const l=(l,r)=>(l=new URL(l+".js",r).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=(r,n)=>{const i=s||("document"in self?document.currentScript.src:"")||location.href;if(e[i])return;let u={};const t=s=>l(s,i),a={module:{uri:i},exports:u,require:t};e[i]=Promise.all(r.map((s=>a[s]||t(s)))).then((s=>(n(...s),u)))}}define(["./workbox-b8d87ee1"],(function(s){"use strict";self.skipWaiting(),s.clientsClaim(),s.precacheAndRoute([{url:"assets/_...all_-51e55631.js",revision:null},{url:"assets/_name_-735452d1.js",revision:null},{url:"assets/about-c67fc7ea.js",revision:null},{url:"assets/board-55f2cfd1.js",revision:null},{url:"assets/Board-96bc5ecc.css",revision:null},{url:"assets/Board-ebc7d2d2.js",revision:null},{url:"assets/board-layout-9c68b45b.js",revision:null},{url:"assets/DataSourceInput.vue_vue_type_script_setup_true_lang-983c0ef5.js",revision:null},{url:"assets/en-644e039f.js",revision:null},{url:"assets/headless-a3c0debd.js",revision:null},{url:"assets/home-45ae8111.js",revision:null},{url:"assets/index-1418cfa7.js",revision:null},{url:"assets/index-65e6de07.js",revision:null},{url:"assets/index-a0a089d2.css",revision:null},{url:"assets/index-layout-3ce68075.js",revision:null},{url:"assets/test-09be4a74.js",revision:null},{url:"assets/TheInput.vue_vue_type_script_setup_true_lang-6ed50735.js",revision:null},{url:"assets/useQueryBoardData-5ec632a5.js",revision:null},{url:"assets/user-901b4c74.js",revision:null},{url:"assets/virtual_pwa-register-033c41ee.js",revision:null},{url:"assets/workbox-window.prod.es5-a7b12eab.js",revision:null},{url:"assets/zh-CN-44b801f0.js",revision:null},{url:"index.html",revision:"5d68ede782784fb523585eb7ad242015"},{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")))}));
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@xcpcio/board-app",
3
3
  "type": "module",
4
- "version": "0.26.1",
4
+ "version": "0.28.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.26.1",
57
- "@xcpcio/types": "0.26.1"
56
+ "@xcpcio/core": "0.28.0",
57
+ "@xcpcio/types": "0.28.0"
58
58
  },
59
59
  "devDependencies": {
60
60
  "@antfu/eslint-config": "^0.39.8",
@@ -104,7 +104,7 @@
104
104
  "workbox-window": "^7.0.0"
105
105
  },
106
106
  "scripts": {
107
- "build": "vite-ssg build",
107
+ "build": "vite build",
108
108
  "dev": "vite --port 3333",
109
109
  "lint": "eslint .",
110
110
  "lint:fix": "eslint --fix .",
@@ -61,21 +61,27 @@ onUnmounted(() => {
61
61
  >
62
62
  </div>
63
63
 
64
- <VTooltip
64
+ <div
65
+ class="title"
65
66
  w-inherit
66
67
  >
67
- <div
68
- class="title"
69
- overflow-hidden
70
- text-2xl truncate
71
- >
72
- {{ contest.name }}
73
- </div>
68
+ <Tooltip>
69
+ <div
70
+ overflow-hidden
71
+ text-2xl truncate
72
+ >
73
+ {{ contest.name }}
74
+ </div>
74
75
 
75
- <template #popper>
76
- {{ contest.name }}
77
- </template>
78
- </VTooltip>
76
+ <template #popper>
77
+ <div
78
+ text-lg
79
+ >
80
+ {{ contest.name }}
81
+ </div>
82
+ </template>
83
+ </Tooltip>
84
+ </div>
79
85
  </div>
80
86
 
81
87
  <div flex items-end>
@@ -73,53 +73,57 @@ const dataRegion = computed(() => {
73
73
  </li>
74
74
 
75
75
  <li>
76
- <VTooltip
77
- w-inherit
76
+ <div
77
+ mr-4 md:mr-6
78
78
  >
79
- <a
80
- :href="GITHUB_URL"
81
- class="mr-4 md:mr-6 hover:underline"
82
- rel="noreferrer"
83
- target="_blank"
84
- title="GitHub"
85
- >
86
- GitHub
87
- </a>
88
-
89
- <template #popper>
90
- <div
91
- flex justify-center
92
- flex-col
79
+ <Tooltip>
80
+ <a
81
+ :href="GITHUB_URL"
82
+ hover:underline
83
+ rel="noreferrer"
84
+ target="_blank"
85
+ title="GitHub"
93
86
  >
94
- <div>Tag: {{ VERSION }}</div>
95
- <div>Sha: {{ GITHUB_SHA }}</div>
96
- </div>
97
- </template>
98
- </VTooltip>
87
+ GitHub
88
+ </a>
89
+
90
+ <template #popper>
91
+ <div
92
+ flex justify-center items-start
93
+ flex-col
94
+ >
95
+ <div>Tag: {{ VERSION }}</div>
96
+ <div>Sha: {{ GITHUB_SHA }}</div>
97
+ </div>
98
+ </template>
99
+ </Tooltip>
100
+ </div>
99
101
  </li>
100
102
 
101
103
  <li>
102
- <VTooltip
103
- w-inherit
104
+ <div
105
+ mr-4 md:mr-6
104
106
  >
105
- <a
106
- href="mailto:hi@dup4.com"
107
- mr-4 md:mr-6 hover:underline
108
- >
109
- Contact
110
- </a>
111
-
112
- <template #popper>
113
- <div
114
- flex justify-center
115
- flex-col
107
+ <Tooltip>
108
+ <a
109
+ href="mailto:hi@dup4.com"
110
+ hover:underline
116
111
  >
117
- <div>CDN Host: {{ cdnHost }}</div>
118
- <div>DATA Host: {{ dataHost }}</div>
119
- <div>Data Region: {{ dataRegion }}</div>
120
- </div>
121
- </template>
122
- </VTooltip>
112
+ Contact
113
+ </a>
114
+
115
+ <template #popper>
116
+ <div
117
+ flex justify-center items-start
118
+ flex-col
119
+ >
120
+ <div>CDN Host: {{ cdnHost }}</div>
121
+ <div>DATA Host: {{ dataHost }}</div>
122
+ <div>Data Region: {{ dataRegion }}</div>
123
+ </div>
124
+ </template>
125
+ </Tooltip>
126
+ </div>
123
127
  </li>
124
128
  </ul>
125
129
 
@@ -79,7 +79,7 @@ onMounted(() => {
79
79
  flex
80
80
  >
81
81
  <div>
82
- <VTooltip
82
+ <Tooltip
83
83
  w-inherit
84
84
  >
85
85
  <div>
@@ -98,7 +98,7 @@ onMounted(() => {
98
98
  </div>
99
99
  </div>
100
100
  </template>
101
- </VTooltip>
101
+ </Tooltip>
102
102
  </div>
103
103
 
104
104
  <div
@@ -38,18 +38,6 @@ const currentSubmissions = computed(() => {
38
38
 
39
39
  const notShowing = ref(false);
40
40
 
41
- function getSubmitTime(
42
- timeDiff: number,
43
- ): string {
44
- const h = Math.floor(timeDiff / 3600);
45
- const m = Math.floor(timeDiff % 3600 / 60);
46
- const s = timeDiff % 60;
47
-
48
- const f = (x: number) => x.toString().padStart(2, "0");
49
-
50
- return `${f(h)}:${f(m)}:${f(s)}`;
51
- }
52
-
53
41
  function getProblemLabelColorClass(s: Submission) {
54
42
  const defaultClass = "bg-primary-100 text-primary-800 dark:bg-primary-900 dark:text-primary-300";
55
43
 
@@ -192,7 +180,7 @@ function getProblemLabelColorStyle(s: Submission) {
192
180
  Status
193
181
  </th>
194
182
  <th
195
- v-if="notShowing"
183
+ v-if="rank.contest.options.submissionHasTimeField"
196
184
  scope="col"
197
185
  class="px-4 py-3"
198
186
  >
@@ -206,7 +194,7 @@ function getProblemLabelColorStyle(s: Submission) {
206
194
  Memory
207
195
  </th>
208
196
  <th
209
- v-if="notShowing"
197
+ v-if="rank.contest.options.submissionHasLanguageField"
210
198
  scope="col"
211
199
  class="px-4 py-3"
212
200
  >
@@ -263,12 +251,11 @@ function getProblemLabelColorStyle(s: Submission) {
263
251
  </td>
264
252
 
265
253
  <td
266
- v-if="notShowing"
254
+ v-if="rank.contest.options.submissionHasTimeField"
267
255
  class="whitespace-nowrap px-4 py-2 text-gray-900 dark:text-white"
268
256
  >
269
- <div class="flex items-center">
270
- <div class="mr-2 inline-block h-4 w-4 rounded-full bg-red-700" />
271
- 95
257
+ <div flex items-center>
258
+ {{ `${s.time ?? 0} ms` }}
272
259
  </div>
273
260
  </td>
274
261
 
@@ -280,17 +267,22 @@ function getProblemLabelColorStyle(s: Submission) {
280
267
  </td>
281
268
 
282
269
  <td
283
- v-if="notShowing"
270
+ v-if="rank.contest.options.submissionHasLanguageField"
284
271
  class="whitespace-nowrap px-4 py-2 text-gray-900 dark:text-white"
285
272
  >
286
- <div class="flex items-center">
287
- <span class="ml-1 text-gray-500 dark:text-gray-400">5.0</span>
273
+ <div flex items-center>
274
+ {{ s.language }}
288
275
  </div>
289
276
  </td>
290
277
 
291
278
  <td class="whitespace-nowrap px-4 py-2 text-gray-900 dark:text-white">
292
- <div class="flex items-center">
293
- {{ getSubmitTime(s.timestamp) }}
279
+ <div flex items-center>
280
+ <Tooltip>
281
+ {{ s.timestampDisplayFormatWithSecond }}
282
+ <template #popper>
283
+ {{ s.timestampDisplayFormatWithMilliSecond }}
284
+ </template>
285
+ </Tooltip>
294
286
  </div>
295
287
  </td>
296
288
  </tr>
@@ -0,0 +1,172 @@
1
+ .tooltip-arrow,.tooltip-arrow:before {
2
+ position: absolute;
3
+ width: 8px;
4
+ height: 8px;
5
+ background: inherit;
6
+ }
7
+
8
+ .tooltip-arrow {
9
+ visibility: hidden;
10
+ }
11
+
12
+ .tooltip-arrow:before {
13
+ content: "";
14
+ visibility: visible;
15
+ transform: rotate(45deg);
16
+ }
17
+
18
+ [data-tooltip-style^='light'] + .tooltip > .tooltip-arrow:before {
19
+ border-style: solid;
20
+ border-color: #e5e7eb;
21
+ }
22
+
23
+ [data-tooltip-style^='light'] + .tooltip[data-popper-placement^='top'] > .tooltip-arrow:before {
24
+ border-bottom-width: 1px;
25
+ border-right-width: 1px;
26
+ }
27
+
28
+ [data-tooltip-style^='light'] + .tooltip[data-popper-placement^='right'] > .tooltip-arrow:before {
29
+ border-bottom-width: 1px;
30
+ border-left-width: 1px;
31
+ }
32
+
33
+ [data-tooltip-style^='light'] + .tooltip[data-popper-placement^='bottom'] > .tooltip-arrow:before {
34
+ border-top-width: 1px;
35
+ border-left-width: 1px;
36
+ }
37
+
38
+ [data-tooltip-style^='light'] + .tooltip[data-popper-placement^='left'] > .tooltip-arrow:before {
39
+ border-top-width: 1px;
40
+ border-right-width: 1px;
41
+ }
42
+
43
+ .tooltip[data-popper-placement^='top'] > .tooltip-arrow {
44
+ bottom: -4px;
45
+ }
46
+
47
+ .tooltip[data-popper-placement^='bottom'] > .tooltip-arrow {
48
+ top: -4px;
49
+ }
50
+
51
+ .tooltip[data-popper-placement^='left'] > .tooltip-arrow {
52
+ right: -4px;
53
+ }
54
+
55
+ .tooltip[data-popper-placement^='right'] > .tooltip-arrow {
56
+ left: -4px;
57
+ }
58
+
59
+ .tooltip.invisible > .tooltip-arrow:before {
60
+ visibility: hidden;
61
+ }
62
+
63
+ [data-popper-arrow],[data-popper-arrow]:before {
64
+ position: absolute;
65
+ width: 8px;
66
+ height: 8px;
67
+ background: inherit;
68
+ }
69
+
70
+ [data-popper-arrow] {
71
+ visibility: hidden;
72
+ }
73
+
74
+ [data-popper-arrow]:before {
75
+ content: "";
76
+ visibility: visible;
77
+ transform: rotate(45deg);
78
+ }
79
+
80
+ [data-popper-arrow]:after {
81
+ content: "";
82
+ visibility: visible;
83
+ transform: rotate(45deg);
84
+ position: absolute;
85
+ width: 9px;
86
+ height: 9px;
87
+ background: inherit;
88
+ }
89
+
90
+ [role="tooltip"] > [data-popper-arrow]:before {
91
+ border-style: solid;
92
+ border-color: #e5e7eb;
93
+ }
94
+
95
+ .dark [role="tooltip"] > [data-popper-arrow]:before {
96
+ border-style: solid;
97
+ border-color: #4b5563;
98
+ }
99
+
100
+ [role="tooltip"] > [data-popper-arrow]:after {
101
+ border-style: solid;
102
+ border-color: #e5e7eb;
103
+ }
104
+
105
+ .dark [role="tooltip"] > [data-popper-arrow]:after {
106
+ border-style: solid;
107
+ border-color: #4b5563;
108
+ }
109
+
110
+ [data-popover][role="tooltip"][data-popper-placement^='top'] > [data-popper-arrow]:before {
111
+ border-bottom-width: 1px;
112
+ border-right-width: 1px;
113
+ }
114
+
115
+ [data-popover][role="tooltip"][data-popper-placement^='top'] > [data-popper-arrow]:after {
116
+ border-bottom-width: 1px;
117
+ border-right-width: 1px;
118
+ }
119
+
120
+ [data-popover][role="tooltip"][data-popper-placement^='right'] > [data-popper-arrow]:before {
121
+ border-bottom-width: 1px;
122
+ border-left-width: 1px;
123
+ }
124
+
125
+ [data-popover][role="tooltip"][data-popper-placement^='right'] > [data-popper-arrow]:after {
126
+ border-bottom-width: 1px;
127
+ border-left-width: 1px;
128
+ }
129
+
130
+ [data-popover][role="tooltip"][data-popper-placement^='bottom'] > [data-popper-arrow]:before {
131
+ border-top-width: 1px;
132
+ border-left-width: 1px;
133
+ }
134
+
135
+ [data-popover][role="tooltip"][data-popper-placement^='bottom'] > [data-popper-arrow]:after {
136
+ border-top-width: 1px;
137
+ border-left-width: 1px;
138
+ }
139
+
140
+ [data-popover][role="tooltip"][data-popper-placement^='left'] > [data-popper-arrow]:before {
141
+ border-top-width: 1px;
142
+ border-right-width: 1px;
143
+ }
144
+
145
+ [data-popover][role="tooltip"][data-popper-placement^='left'] > [data-popper-arrow]:after {
146
+ border-top-width: 1px;
147
+ border-right-width: 1px;
148
+ }
149
+
150
+ [data-popover][role="tooltip"][data-popper-placement^='top'] > [data-popper-arrow] {
151
+ bottom: -5px;
152
+ }
153
+
154
+ [data-popover][role="tooltip"][data-popper-placement^='bottom'] > [data-popper-arrow] {
155
+ top: -5px;
156
+ }
157
+
158
+ [data-popover][role="tooltip"][data-popper-placement^='left'] > [data-popper-arrow] {
159
+ right: -5px;
160
+ }
161
+
162
+ [data-popover][role="tooltip"][data-popper-placement^='right'] > [data-popper-arrow] {
163
+ left: -5px;
164
+ }
165
+
166
+ [role="tooltip"].invisible > [data-popper-arrow]:before {
167
+ visibility: hidden;
168
+ }
169
+
170
+ [role="tooltip"].invisible > [data-popper-arrow]:after {
171
+ visibility: hidden;
172
+ }
@@ -0,0 +1,62 @@
1
+ <script setup lang="ts">
2
+ import { Tooltip } from "flowbite";
3
+ import type { TooltipInterface, TooltipOptions } from "flowbite";
4
+
5
+ import "./Tooltip.css";
6
+
7
+ const props = defineProps<{
8
+ placement?: "left" | "right" | "top" | "bottom" | "auto",
9
+ }>();
10
+
11
+ const tooltipTargetEl = ref(null);
12
+ const tooltipTriggerEl = ref(null);
13
+
14
+ // eslint-disable-next-line unused-imports/no-unused-vars
15
+ let tooltip: TooltipInterface | null = null;
16
+
17
+ const placement = computed(() => {
18
+ return props.placement ?? "auto";
19
+ });
20
+
21
+ onMounted(() => {
22
+ if (tooltipTargetEl.value && tooltipTriggerEl.value) {
23
+ const options: TooltipOptions = {
24
+ placement: placement.value as unknown as undefined,
25
+ triggerType: "hover",
26
+ };
27
+
28
+ tooltip = new Tooltip(tooltipTargetEl.value, tooltipTriggerEl.value, options);
29
+ }
30
+ });
31
+ </script>
32
+
33
+ <template>
34
+ <div>
35
+ <div
36
+ ref="tooltipTriggerEl"
37
+ >
38
+ <slot />
39
+ </div>
40
+
41
+ <div
42
+ ref="tooltipTargetEl"
43
+ role="tooltip"
44
+ class="tooltip inline-block absolute invisible px-3 py-2 transition-opacity duration-300 shadow-sm opacity-0"
45
+ z-9999
46
+ rounded
47
+ text-base text-white font-medium
48
+ bg-gray-900 dark:bg-gray-700
49
+ >
50
+ <div>
51
+ <slot
52
+ name="popper"
53
+ />
54
+ </div>
55
+
56
+ <div
57
+ class="tooltip-arrow"
58
+ data-popper-arrow
59
+ />
60
+ </div>
61
+ </div>
62
+ </template>
@@ -45,6 +45,7 @@ declare module 'vue' {
45
45
  TeamUI: typeof import('./components/board/TeamUI.vue')['default']
46
46
  TheCounter: typeof import('./components/TheCounter.vue')['default']
47
47
  TheInput: typeof import('./components/TheInput.vue')['default']
48
+ Tooltip: typeof import('./components/flowbite/Tooltip.vue')['default']
48
49
  Utility: typeof import('./components/board/Utility.vue')['default']
49
50
  }
50
51
  }