@xcpcio/board-app 0.52.0 → 0.53.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 (146) hide show
  1. package/dist/404.html +1 -1
  2. package/dist/assets/{Board-f05c0366.css → Board--Fj0eIxn.css} +1 -1
  3. package/dist/assets/Board-DVycq7Hb.js +1 -0
  4. package/dist/assets/ContestStateBadge-SaSIRVZw.js +1 -0
  5. package/dist/assets/ContestStateBadge-yOXRkC0c.css +1 -0
  6. package/dist/assets/DataSourceInput.vue_vue_type_script_setup_true_lang-ButnX5NG.js +1 -0
  7. package/dist/assets/Footer.vue_vue_type_script_setup_true_lang-DtriOyxw.js +1 -0
  8. package/dist/assets/NavBar-CTO09sVc.js +1 -0
  9. package/dist/assets/NavBar-K1-1c5jR.css +1 -0
  10. package/dist/assets/RightArrowIcon-93I3m1Dg.js +1 -0
  11. package/dist/assets/TheInput.vue_vue_type_script_setup_true_lang-Bstp0Uq6.js +1 -0
  12. package/dist/assets/Tooltip-VVqtpO6L.css +1 -0
  13. package/dist/assets/Tooltip.vue_vue_type_script_setup_true_lang-IVJ6kO8Y.js +27 -0
  14. package/dist/assets/{_...all_-85910c2a.js → _...all_-CajB1u6j.js} +2 -2
  15. package/dist/assets/_...all_-DkFLHLY4.js +1 -0
  16. package/dist/assets/_name_-CKcXFscu.js +1 -0
  17. package/dist/assets/_plugin-vue_export-helper-DlAUqK2U.js +1 -0
  18. package/dist/assets/about-Bt1E61e1.js +5 -0
  19. package/dist/assets/board-BuZxK-RS.js +1 -0
  20. package/dist/assets/board-layout-BDGSSQnD.js +1 -0
  21. package/dist/assets/constant-D5AETBoS.js +1 -0
  22. package/dist/assets/default-g2FZdb_E.js +1 -0
  23. package/dist/assets/en-DDlXf_8q.js +1 -0
  24. package/dist/assets/headless-AGI21K3d.js +1 -0
  25. package/dist/assets/home-CIo2SGx9.js +1 -0
  26. package/dist/assets/index-B0AiC33S.js +1 -0
  27. package/dist/assets/index-BJlHNlHk.js +198 -0
  28. package/dist/assets/{index-241beb5a.css → index-BP90wE2A.css} +1 -1
  29. package/dist/assets/index-BVqqkkh8.js +25 -0
  30. package/dist/assets/index-BerApwlM.css +1 -0
  31. package/dist/assets/index-Bqug296L.js +50 -0
  32. package/dist/assets/index-ByBDbX-Q.js +1 -0
  33. package/dist/assets/index-CDb5YJlm.js +1 -0
  34. package/dist/assets/index-Ci3FURub.css +5 -0
  35. package/dist/assets/index-CsD1PvIl.js +5 -0
  36. package/dist/assets/{index-c827bc8f.css → index-DRiWpQTB.css} +1 -1
  37. package/dist/assets/index-De6dfmWB.css +1 -0
  38. package/dist/assets/index-DtIE9gnq.js +1 -0
  39. package/dist/assets/index-eEOWm26O.js +1 -0
  40. package/dist/assets/index-layout-B9ZsHAPN.js +1 -0
  41. package/dist/assets/pagination-SF0231GF.js +3 -0
  42. package/dist/assets/route-block-B_A1xBdJ.js +1 -0
  43. package/dist/assets/test-BmgsMNrG.js +1 -0
  44. package/dist/assets/use-vmodel-DKmkNt1c.js +1 -0
  45. package/dist/assets/useQueryBoardData-MYqwKv9X.js +1 -0
  46. package/dist/assets/user-DVMgLOCG.js +1 -0
  47. package/dist/assets/virtual_pwa-register-G08q8i_v.js +1 -0
  48. package/dist/assets/workbox-window.prod.es5-D5gOYdM7.js +2 -0
  49. package/dist/assets/zh-CN-CNJkghp4.js +1 -0
  50. package/dist/index.html +1 -1
  51. package/dist/sw.js +1 -1
  52. package/package.json +51 -49
  53. package/src/auto-imports.d.ts +4 -2
  54. package/src/components/Balloon.vue +3 -2
  55. package/src/components/BalloonBlock.vue +1 -1
  56. package/src/components/ContestIndexUI.vue +3 -3
  57. package/src/components/Countdown.vue +3 -3
  58. package/src/components/NavBar.vue +1 -1
  59. package/src/components/Resolver.vue +112 -27
  60. package/src/components/SearchInput.vue +1 -1
  61. package/src/components/TheCheckbox.vue +1 -1
  62. package/src/components/TheCounter.vue +1 -1
  63. package/src/components/TheInput.vue +3 -3
  64. package/src/components/battle-of-giants/GiantsOptions.vue +5 -5
  65. package/src/components/battle-of-giants/GiantsScoreBoard.vue +1 -1
  66. package/src/components/board/AnimatedSubmissionBlock.vue +2 -2
  67. package/src/components/board/AnimatedSubmissionsModal.vue +1 -1
  68. package/src/components/board/Badge.vue +2 -2
  69. package/src/components/board/Board.vue +8 -8
  70. package/src/components/board/BoardTab.vue +1 -1
  71. package/src/components/board/BottomStatistics.vue +1 -1
  72. package/src/components/board/ContestStateBadge.vue +3 -3
  73. package/src/components/board/Export.vue +5 -5
  74. package/src/components/board/Modal.vue +4 -4
  75. package/src/components/board/ModalMenu.vue +2 -2
  76. package/src/components/board/OptionsModal.vue +4 -4
  77. package/src/components/board/ProblemBlock.vue +2 -2
  78. package/src/components/board/ProblemInfoModal.vue +3 -3
  79. package/src/components/board/Progress.vue +12 -9
  80. package/src/components/board/SecondLevelMenu.vue +2 -2
  81. package/src/components/board/Standings.vue +5 -5
  82. package/src/components/board/Statistics.vue +3 -3
  83. package/src/components/board/SubmissionsTable.vue +15 -15
  84. package/src/components/board/SubmissionsTableModal.vue +4 -4
  85. package/src/components/board/TeamAwards.vue +3 -3
  86. package/src/components/board/TeamInfoModal.vue +5 -5
  87. package/src/components/board/TeamProblemBlock.vue +5 -5
  88. package/src/components/board/TeamUI.vue +3 -3
  89. package/src/components/flowbite/Tooltip.vue +2 -2
  90. package/src/components/rating/Rating.vue +1 -1
  91. package/src/components/rating/RatingBadge.vue +1 -1
  92. package/src/components/rating/RatingIndexUI.vue +3 -3
  93. package/src/components/rating/RatingInfoModal.vue +4 -4
  94. package/src/components/rating/RatingTable.vue +4 -4
  95. package/src/components/rating/RatingUserUI.vue +2 -2
  96. package/src/components/table/TablePagination.vue +1 -1
  97. package/src/components.d.ts +1 -1
  98. package/src/composables/color.ts +2 -2
  99. package/src/composables/logo/index.ts +1 -1
  100. package/src/composables/pagination.ts +2 -2
  101. package/src/composables/rating.ts +1 -1
  102. package/src/composables/statistics.ts +1 -1
  103. package/src/composables/type.ts +4 -4
  104. package/src/composables/useQueryBoardData.ts +3 -2
  105. package/src/main.ts +9 -8
  106. package/src/modules/README.md +1 -1
  107. package/src/modules/i18n.ts +1 -1
  108. package/src/modules/nprogress.ts +1 -1
  109. package/src/modules/pinia.ts +1 -1
  110. package/src/modules/pwa.ts +1 -1
  111. package/src/modules/toast.ts +2 -2
  112. package/src/pages/index.vue +6 -6
  113. package/src/pages/rating/index.vue +2 -2
  114. package/src/shims.d.ts +10 -8
  115. package/src/styles/markdown.css +8 -11
  116. package/src/typed-router.d.ts +33 -0
  117. package/src/types.ts +1 -1
  118. package/tsconfig.json +18 -19
  119. package/vite.config.ts +32 -30
  120. package/dist/assets/Board-04b0589d.js +0 -1
  121. package/dist/assets/DataSourceInput.vue_vue_type_script_setup_true_lang-11e5a08c.js +0 -1
  122. package/dist/assets/TheInput.vue_vue_type_script_setup_true_lang-f91fd6e0.js +0 -1
  123. package/dist/assets/_...all_-905784b3.js +0 -1
  124. package/dist/assets/_name_-203db09f.js +0 -1
  125. package/dist/assets/about-d9d865e0.js +0 -11
  126. package/dist/assets/board-3f91f491.js +0 -1
  127. package/dist/assets/board-layout-967802f4.js +0 -1
  128. package/dist/assets/en-c9a8dbb5.js +0 -1
  129. package/dist/assets/headless-f3f3253c.js +0 -1
  130. package/dist/assets/home-3d9e3102.js +0 -1
  131. package/dist/assets/index-0095f855.js +0 -1
  132. package/dist/assets/index-1e2a1259.js +0 -236
  133. package/dist/assets/index-43f8e0d3.css +0 -5
  134. package/dist/assets/index-86ef642b.js +0 -1
  135. package/dist/assets/index-accb347c.css +0 -1
  136. package/dist/assets/index-b97b2d45.js +0 -1
  137. package/dist/assets/index-d51c6c02.js +0 -1
  138. package/dist/assets/index-layout-5a67cc99.js +0 -1
  139. package/dist/assets/pagination-6eac914a.js +0 -3
  140. package/dist/assets/query-ff21040c.js +0 -1
  141. package/dist/assets/test-5dd32cac.js +0 -1
  142. package/dist/assets/user-cd9a56f6.js +0 -1
  143. package/dist/assets/virtual_pwa-register-ff5720d1.js +0 -1
  144. package/dist/assets/workbox-window.prod.es5-c46a1faa.js +0 -2
  145. package/dist/assets/zh-CN-8e545f66.js +0 -1
  146. /package/dist/assets/{_...all_-c60acc8c.css → _..-8Wh-Y8sB.css} +0 -0
@@ -0,0 +1 @@
1
+ const o={};export{o as b};
@@ -0,0 +1 @@
1
+ import{_ as p}from"./TheInput.vue_vue_type_script_setup_true_lang-Bstp0Uq6.js";import{d as c,p as f,H as _,u as b,o as h,c as v,b as e,k as a,h as s,a as x,z as y,O as g}from"./index-Bqug296L.js";import{u as k}from"./user-DVMgLOCG.js";import{b as l}from"./route-block-B_A1xBdJ.js";import"./use-vmodel-DKmkNt1c.js";const V={flex:"","flex-col":"","justify-center":"","items-center":""},w={"text-sm":"","opacity-75":""},I={"w-48":""},B={class:"hidden",for:"input"},C=["disabled"],N=c({name:"IndexPage",__name:"test",setup(R){const i=k(),o=f(i.savedName),u=_();function r(){o.value&&u.push(`/hi/${encodeURIComponent(o.value)}`)}const{t:n}=b();return(U,t)=>{const d=p;return h(),v("div",V,[t[1]||(t[1]=e("div",{"text-4xl":""},[e("div",{"i-carbon-campsite":""})],-1)),t[2]||(t[2]=e("p",null,[e("a",{rel:"noreferrer",href:"https://github.com/antfu/vitesse",target:"_blank"}," Vitesse ")],-1)),e("p",null,[e("em",w,a(s(n)("intro.desc")),1)]),t[3]||(t[3]=e("div",{"py-4":""},null,-1)),e("div",I,[x(d,{modelValue:s(o),"onUpdate:modelValue":t[0]||(t[0]=m=>y(o)?o.value=m:null),placeholder:s(n)("intro.whats-your-name"),autocomplete:"false",onKeydown:g(r,["enter"])},null,8,["modelValue","placeholder"]),e("label",B,a(s(n)("intro.whats-your-name")),1)]),e("div",null,[e("button",{"m-3":"","text-sm":"",btn:"",disabled:!s(o),onClick:r},a(s(n)("button.go")),9,C)])])}}});typeof l=="function"&&l(N);export{N as default};
@@ -0,0 +1 @@
1
+ import{aw as c,ax as r}from"./index-Bqug296L.js";const d=(...p)=>{const s=c().proxy.$props,t=Object.create(null);for(const e of p)if(typeof e=="string")t[e]=r(s,e,void 0,{eventName:`update:${e}`,passive:!0});else{const[o,n=o,a=`update:${o}`,u={}]=e;t[o]=r(s,n,void 0,{eventName:a,passive:!0,...u})}return t};export{d as _};
@@ -0,0 +1 @@
1
+ var at=r=>{throw TypeError(r)};var K=(r,t,s)=>t.has(r)||at("Cannot "+s);var e=(r,t,s)=>(K(r,t,"read from private field"),s?s.call(r):t.get(r)),b=(r,t,s)=>t.has(r)?at("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(r):t.set(r,s),l=(r,t,s,i)=>(K(r,t,"write to private field"),i?i.call(r,s):t.set(r,s),s),f=(r,t,s)=>(K(r,t,"access private method"),s);import{u as mt}from"./index-CDb5YJlm.js";import{a4 as gt,a5 as ot,a6 as w,a7 as G,a8 as B,a9 as Ot,aa as ht,ab as ut,ac as Ct,ad as St,ae as wt,af as ct,ag as It,ah as Tt,ai as Et,aj as Qt,g as vt,ak as Dt,al as Ft,C as W,am as lt,an as Ut,ao as dt,ap as jt}from"./index-Bqug296L.js";import{a as xt}from"./constant-D5AETBoS.js";var v,n,k,m,D,M,T,S,N,A,L,F,U,E,_,u,$,Y,H,J,X,Z,q,tt,yt,bt,Pt=(bt=class extends gt{constructor(t,s){super();b(this,u);b(this,v);b(this,n);b(this,k);b(this,m);b(this,D);b(this,M);b(this,T);b(this,S);b(this,N);b(this,A);b(this,L);b(this,F);b(this,U);b(this,E);b(this,_,new Set);this.options=s,l(this,v,t),l(this,S,null),l(this,T,ot()),this.options.experimental_prefetchInRender||e(this,T).reject(new Error("experimental_prefetchInRender feature flag is not enabled")),this.bindMethods(),this.setOptions(s)}bindMethods(){this.refetch=this.refetch.bind(this)}onSubscribe(){this.listeners.size===1&&(e(this,n).addObserver(this),ft(e(this,n),this.options)?f(this,u,$).call(this):this.updateResult(),f(this,u,X).call(this))}onUnsubscribe(){this.hasListeners()||this.destroy()}shouldFetchOnReconnect(){return et(e(this,n),this.options,this.options.refetchOnReconnect)}shouldFetchOnWindowFocus(){return et(e(this,n),this.options,this.options.refetchOnWindowFocus)}destroy(){this.listeners=new Set,f(this,u,Z).call(this),f(this,u,q).call(this),e(this,n).removeObserver(this)}setOptions(t,s){const i=this.options,o=e(this,n);if(this.options=e(this,v).defaultQueryOptions(t),this.options.enabled!==void 0&&typeof this.options.enabled!="boolean"&&typeof this.options.enabled!="function"&&typeof w(this.options.enabled,e(this,n))!="boolean")throw new Error("Expected enabled to be a boolean or a callback that returns a boolean");f(this,u,tt).call(this),e(this,n).setOptions(this.options),i._defaulted&&!G(this.options,i)&&e(this,v).getQueryCache().notify({type:"observerOptionsUpdated",query:e(this,n),observer:this});const a=this.hasListeners();a&&pt(e(this,n),o,this.options,i)&&f(this,u,$).call(this),this.updateResult(s),a&&(e(this,n)!==o||w(this.options.enabled,e(this,n))!==w(i.enabled,e(this,n))||B(this.options.staleTime,e(this,n))!==B(i.staleTime,e(this,n)))&&f(this,u,Y).call(this);const c=f(this,u,H).call(this);a&&(e(this,n)!==o||w(this.options.enabled,e(this,n))!==w(i.enabled,e(this,n))||c!==e(this,E))&&f(this,u,J).call(this,c)}getOptimisticResult(t){const s=e(this,v).getQueryCache().build(e(this,v),t),i=this.createResult(s,t);return At(this,i)&&(l(this,m,i),l(this,M,this.options),l(this,D,e(this,n).state)),i}getCurrentResult(){return e(this,m)}trackResult(t,s){const i={};return Object.keys(t).forEach(o=>{Object.defineProperty(i,o,{configurable:!1,enumerable:!0,get:()=>(this.trackProp(o),s==null||s(o),t[o])})}),i}trackProp(t){e(this,_).add(t)}getCurrentQuery(){return e(this,n)}refetch({...t}={}){return this.fetch({...t})}fetchOptimistic(t){const s=e(this,v).defaultQueryOptions(t),i=e(this,v).getQueryCache().build(e(this,v),s);return i.isFetchingOptimistic=!0,i.fetch().then(()=>this.createResult(i,s))}fetch(t){return f(this,u,$).call(this,{...t,cancelRefetch:t.cancelRefetch??!0}).then(()=>(this.updateResult(),e(this,m)))}createResult(t,s){var nt;const i=e(this,n),o=this.options,a=e(this,m),c=e(this,D),p=e(this,M),R=t!==i?t.state:e(this,k),{state:g}=t;let d={...g},Q=!1,h;if(s._optimisticResults){const O=this.hasListeners(),z=!O&&ft(t,s),Rt=O&&pt(t,i,s,o);(z||Rt)&&(d={...d,...wt(g.data,t.options)}),s._optimisticResults==="isRestoring"&&(d.fetchStatus="idle")}let{error:I,errorUpdatedAt:j,status:C}=d;if(s.select&&d.data!==void 0)if(a&&d.data===(c==null?void 0:c.data)&&s.select===e(this,N))h=e(this,A);else try{l(this,N,s.select),h=s.select(d.data),h=ct(a==null?void 0:a.data,h,s),l(this,A,h),l(this,S,null)}catch(O){l(this,S,O)}else h=d.data;if(s.placeholderData!==void 0&&h===void 0&&C==="pending"){let O;if(a!=null&&a.isPlaceholderData&&s.placeholderData===(p==null?void 0:p.placeholderData))O=a.data;else if(O=typeof s.placeholderData=="function"?s.placeholderData((nt=e(this,L))==null?void 0:nt.state.data,e(this,L)):s.placeholderData,s.select&&O!==void 0)try{O=s.select(O),l(this,S,null)}catch(z){l(this,S,z)}O!==void 0&&(C="success",h=ct(a==null?void 0:a.data,O,s),Q=!0)}e(this,S)&&(I=e(this,S),h=e(this,A),j=Date.now(),C="error");const x=d.fetchStatus==="fetching",P=C==="pending",V=C==="error",it=P&&x,rt=h!==void 0;return{status:C,fetchStatus:d.fetchStatus,isPending:P,isSuccess:C==="success",isError:V,isInitialLoading:it,isLoading:it,data:h,dataUpdatedAt:d.dataUpdatedAt,error:I,errorUpdatedAt:j,failureCount:d.fetchFailureCount,failureReason:d.fetchFailureReason,errorUpdateCount:d.errorUpdateCount,isFetched:d.dataUpdateCount>0||d.errorUpdateCount>0,isFetchedAfterMount:d.dataUpdateCount>R.dataUpdateCount||d.errorUpdateCount>R.errorUpdateCount,isFetching:x,isRefetching:x&&!P,isLoadingError:V&&!rt,isPaused:d.fetchStatus==="paused",isPlaceholderData:Q,isRefetchError:V&&rt,isStale:st(t,s),refetch:this.refetch,promise:e(this,T)}}updateResult(t){const s=e(this,m),i=this.createResult(e(this,n),this.options);if(l(this,D,e(this,n).state),l(this,M,this.options),e(this,D).data!==void 0&&l(this,L,e(this,n)),G(i,s))return;if(this.options.experimental_prefetchInRender){const c=R=>{i.status==="error"?R.reject(i.error):i.data!==void 0&&R.resolve(i.data)},p=()=>{const R=l(this,T,i.promise=ot());c(R)},y=e(this,T);switch(y.status){case"pending":c(y);break;case"fulfilled":(i.status==="error"||i.data!==y.value)&&p();break;case"rejected":(i.status!=="error"||i.error!==y.reason)&&p();break}}l(this,m,i);const o={},a=()=>{if(!s)return!0;const{notifyOnChangeProps:c}=this.options,p=typeof c=="function"?c():c;if(p==="all"||!p&&!e(this,_).size)return!0;const y=new Set(p??e(this,_));return this.options.throwOnError&&y.add("error"),Object.keys(e(this,m)).some(R=>{const g=R;return e(this,m)[g]!==s[g]&&y.has(g)})};(t==null?void 0:t.listeners)!==!1&&a()&&(o.listeners=!0),f(this,u,yt).call(this,{...o,...t})}onQueryUpdate(){this.updateResult(),this.hasListeners()&&f(this,u,X).call(this)}},v=new WeakMap,n=new WeakMap,k=new WeakMap,m=new WeakMap,D=new WeakMap,M=new WeakMap,T=new WeakMap,S=new WeakMap,N=new WeakMap,A=new WeakMap,L=new WeakMap,F=new WeakMap,U=new WeakMap,E=new WeakMap,_=new WeakMap,u=new WeakSet,$=function(t){f(this,u,tt).call(this);let s=e(this,n).fetch(this.options,t);return t!=null&&t.throwOnError||(s=s.catch(Ot)),s},Y=function(){f(this,u,Z).call(this);const t=B(this.options.staleTime,e(this,n));if(ht||e(this,m).isStale||!ut(t))return;const i=Ct(e(this,m).dataUpdatedAt,t)+1;l(this,F,setTimeout(()=>{e(this,m).isStale||this.updateResult()},i))},H=function(){return(typeof this.options.refetchInterval=="function"?this.options.refetchInterval(e(this,n)):this.options.refetchInterval)??!1},J=function(t){f(this,u,q).call(this),l(this,E,t),!(ht||w(this.options.enabled,e(this,n))===!1||!ut(e(this,E))||e(this,E)===0)&&l(this,U,setInterval(()=>{(this.options.refetchIntervalInBackground||St.isFocused())&&f(this,u,$).call(this)},e(this,E)))},X=function(){f(this,u,Y).call(this),f(this,u,J).call(this,f(this,u,H).call(this))},Z=function(){e(this,F)&&(clearTimeout(e(this,F)),l(this,F,void 0))},q=function(){e(this,U)&&(clearInterval(e(this,U)),l(this,U,void 0))},tt=function(){const t=e(this,v).getQueryCache().build(e(this,v),this.options);if(t===e(this,n))return;const s=e(this,n);l(this,n,t),l(this,k,t.state),this.hasListeners()&&(s==null||s.removeObserver(this),t.addObserver(this))},yt=function(t){It.batch(()=>{t.listeners&&this.listeners.forEach(s=>{s(e(this,m))}),e(this,v).getQueryCache().notify({query:e(this,n),type:"observerResultsUpdated"})})},bt);function Mt(r,t){return w(t.enabled,r)!==!1&&r.state.data===void 0&&!(r.state.status==="error"&&t.retryOnMount===!1)}function ft(r,t){return Mt(r,t)||r.state.data!==void 0&&et(r,t,t.refetchOnMount)}function et(r,t,s){if(w(t.enabled,r)!==!1){const i=typeof s=="function"?s(r):s;return i==="always"||i!==!1&&st(r,t)}return!1}function pt(r,t,s,i){return(r!==t||w(i.enabled,r)===!1)&&(!s.suspense||r.state.status!=="error")&&st(r,s)}function st(r,t){return w(t.enabled,r)!==!1&&r.isStaleByTime(B(t.staleTime,r))}function At(r,t){return!G(r.getCurrentResult(),t)}function Lt(r=""){if(!Tt())throw new Error("vue-query hooks can only be used inside setup() function or functions that support injection context.");const t=Qt(r),s=Et(t);if(!s)throw new Error("No 'queryClient' found in Vue context, use 'VueQueryPlugin' to properly initialize the library.");return s}function _t(r,t,s){const i=Lt(),o=vt(()=>{const h=Dt(t);typeof h.enabled=="function"&&(h.enabled=h.enabled());const I=i.defaultQueryOptions(h);return I._optimisticResults=i.isRestoring.value?"isRestoring":"optimistic",I}),a=new r(i,o.value),c=Ft(a.getCurrentResult());let p=()=>{};W(i.isRestoring,h=>{h||(p(),p=a.subscribe(I=>{lt(c,I)}))},{immediate:!0});const y=()=>{a.setOptions(o.value),lt(c,a.getCurrentResult())};W(o,y),Ut(()=>{p()});const R=(...h)=>(y(),c.refetch(...h)),g=()=>new Promise((h,I)=>{let j=()=>{};const C=()=>{if(o.value.enabled!==!1){a.setOptions(o.value);const x=a.getOptimisticResult(o.value);x.isStale?(j(),a.fetchOptimistic(o.value).then(h,P=>{dt(o.value.throwOnError,[P,a.getCurrentQuery()])?I(P):h(a.getCurrentResult())})):(j(),h(x))}};C(),j=W(o,C)});W(()=>c.error,h=>{if(c.isError&&!c.isFetching&&dt(o.value.throwOnError,[h,a.getCurrentQuery()]))throw h});const Q=jt(c);for(const h in c)typeof c[h]=="function"&&(Q[h]=c[h]);return Q.suspense=g,Q.refetch=R,Q}function $t(r,t){return _t(Pt,r)}function Gt(){return mt("data-source","",{transform:String})}function Yt(){return mt("battle-of-giants","",{transform:String})}const kt=3;async function Nt(r,t){const s=r.startsWith("/")?r.slice(1):r;let i=`${window.DATA_HOST}${s}`;r.startsWith("http")&&(i=r),i.endsWith("/")&&(i=i.slice(0,-1));const o=await fetch(`${i}/config.json?t=${t??0}`),a=await fetch(`${i}/team.json?t=${t??0}`),c=await fetch(`${i}/run.json?t=${t??0}`),{status:p,statusText:y}=o;if(p>=300||p<200)throw new Error(`fetch data failed. [status=${p}] [statusText=${y}]`);return Promise.all([o.json(),a.json(),c.json()]).then(g=>({contest:g[0],teams:g[1],submissions:g[2]}))}function Ht(r,t,s=!1){let i=3e4,o=i;const a=vt(()=>Math.floor(t.value.getTime()/1e3/10));return xt.value==="I18N"&&(i=10*1e3,o=i),s&&(i=Number.POSITIVE_INFINITY,o=!1),$t({queryKey:[r,a.value],queryFn:()=>Nt(r,a.value),retry:kt,staleTime:i,refetchInterval:o})}export{Yt as a,Gt as g,Ht as u};
@@ -0,0 +1 @@
1
+ import{au as m,p as r,g as t}from"./index-Bqug296L.js";const l=m("user",()=>{const e=r(""),s=r(new Set),u=t(()=>Array.from(s.value)),o=t(()=>u.value.filter(a=>a!==e.value));function n(a){e.value&&s.value.add(e.value),e.value=a}return{setNewName:n,otherNames:o,savedName:e}});export{l as u};
@@ -0,0 +1 @@
1
+ import{_ as u}from"./index-Bqug296L.js";function _(c={}){const{immediate:o=!1,onNeedRefresh:p,onOfflineReady:a,onRegistered:r,onRegisteredSW:s,onRegisterError:t}=c;let i,n;const d=async(e=!0)=>{await n};async function l(){if("serviceWorker"in navigator){if(i=await u(async()=>{const{Workbox:e}=await import("./workbox-window.prod.es5-D5gOYdM7.js");return{Workbox:e}},[],import.meta.url).then(({Workbox:e})=>new e("/sw.js",{scope:"/",type:"classic"})).catch(e=>{t==null||t(e)}),!i)return;i.addEventListener("activated",e=>{(e.isUpdate||e.isExternal)&&window.location.reload()}),i.addEventListener("installed",e=>{e.isUpdate||a==null||a()}),i.register({immediate:o}).then(e=>{s?s("/sw.js",e):r==null||r(e)}).catch(e=>{t==null||t(e)})}}return n=l(),d}export{_ as registerSW};
@@ -0,0 +1,2 @@
1
+ try{self["workbox:window:7.0.0"]&&_()}catch{}function E(n,r){return new Promise(function(t){var i=new MessageChannel;i.port1.onmessage=function(c){t(c.data)},n.postMessage(r,[i.port2])})}function W(n){var r=function(t,i){if(typeof t!="object"||!t)return t;var c=t[Symbol.toPrimitive];if(c!==void 0){var h=c.call(t,i);if(typeof h!="object")return h;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(n,"string");return typeof r=="symbol"?r:r+""}function k(n,r){for(var t=0;t<r.length;t++){var i=r[t];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(n,W(i.key),i)}}function P(n,r){return P=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,i){return t.__proto__=i,t},P(n,r)}function j(n,r){(r==null||r>n.length)&&(r=n.length);for(var t=0,i=new Array(r);t<r;t++)i[t]=n[t];return i}function L(n,r){var t=typeof Symbol<"u"&&n[Symbol.iterator]||n["@@iterator"];if(t)return(t=t.call(n)).next.bind(t);if(Array.isArray(n)||(t=function(c,h){if(c){if(typeof c=="string")return j(c,h);var l=Object.prototype.toString.call(c).slice(8,-1);return l==="Object"&&c.constructor&&(l=c.constructor.name),l==="Map"||l==="Set"?Array.from(c):l==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(l)?j(c,h):void 0}}(n))||r){t&&(n=t);var i=0;return function(){return i>=n.length?{done:!0}:{done:!1,value:n[i++]}}}throw new TypeError(`Invalid attempt to iterate non-iterable instance.
2
+ In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}try{self["workbox:core:7.0.0"]&&_()}catch{}var w=function(){var n=this;this.promise=new Promise(function(r,t){n.resolve=r,n.reject=t})};function b(n,r){var t=location.href;return new URL(n,t).href===new URL(r,t).href}var g=function(n,r){this.type=n,Object.assign(this,r)};function d(n,r,t){return t?r?r(n):n:(n&&n.then||(n=Promise.resolve(n)),r?n.then(r):n)}function O(){}var x={type:"SKIP_WAITING"};function S(n,r){return n&&n.then?n.then(O):Promise.resolve()}var U=function(n){function r(v,u){var e,o;return u===void 0&&(u={}),(e=n.call(this)||this).nn={},e.tn=0,e.rn=new w,e.en=new w,e.on=new w,e.un=0,e.an=new Set,e.cn=function(){var s=e.fn,a=s.installing;e.tn>0||!b(a.scriptURL,e.sn.toString())||performance.now()>e.un+6e4?(e.vn=a,s.removeEventListener("updatefound",e.cn)):(e.hn=a,e.an.add(a),e.rn.resolve(a)),++e.tn,a.addEventListener("statechange",e.ln)},e.ln=function(s){var a=e.fn,f=s.target,p=f.state,m=f===e.vn,y={sw:f,isExternal:m,originalEvent:s};!m&&e.mn&&(y.isUpdate=!0),e.dispatchEvent(new g(p,y)),p==="installed"?e.wn=self.setTimeout(function(){p==="installed"&&a.waiting===f&&e.dispatchEvent(new g("waiting",y))},200):p==="activating"&&(clearTimeout(e.wn),m||e.en.resolve(f))},e.yn=function(s){var a=e.hn,f=a!==navigator.serviceWorker.controller;e.dispatchEvent(new g("controlling",{isExternal:f,originalEvent:s,sw:a,isUpdate:e.mn})),f||e.on.resolve(a)},e.gn=(o=function(s){var a=s.data,f=s.ports,p=s.source;return d(e.getSW(),function(){e.an.has(p)&&e.dispatchEvent(new g("message",{data:a,originalEvent:s,ports:f,sw:p}))})},function(){for(var s=[],a=0;a<arguments.length;a++)s[a]=arguments[a];try{return Promise.resolve(o.apply(this,s))}catch(f){return Promise.reject(f)}}),e.sn=v,e.nn=u,navigator.serviceWorker.addEventListener("message",e.gn),e}var t,i;i=n,(t=r).prototype=Object.create(i.prototype),t.prototype.constructor=t,P(t,i);var c,h,l=r.prototype;return l.register=function(v){var u=(v===void 0?{}:v).immediate,e=u!==void 0&&u;try{var o=this;return d(function(s,a){var f=s();return f&&f.then?f.then(a):a(f)}(function(){if(!e&&document.readyState!=="complete")return S(new Promise(function(s){return window.addEventListener("load",s)}))},function(){return o.mn=!!navigator.serviceWorker.controller,o.dn=o.pn(),d(o.bn(),function(s){o.fn=s,o.dn&&(o.hn=o.dn,o.en.resolve(o.dn),o.on.resolve(o.dn),o.dn.addEventListener("statechange",o.ln,{once:!0}));var a=o.fn.waiting;return a&&b(a.scriptURL,o.sn.toString())&&(o.hn=a,Promise.resolve().then(function(){o.dispatchEvent(new g("waiting",{sw:a,wasWaitingBeforeRegister:!0}))}).then(function(){})),o.hn&&(o.rn.resolve(o.hn),o.an.add(o.hn)),o.fn.addEventListener("updatefound",o.cn),navigator.serviceWorker.addEventListener("controllerchange",o.yn),o.fn})}))}catch(s){return Promise.reject(s)}},l.update=function(){try{return this.fn?d(S(this.fn.update())):d()}catch(v){return Promise.reject(v)}},l.getSW=function(){return this.hn!==void 0?Promise.resolve(this.hn):this.rn.promise},l.messageSW=function(v){try{return d(this.getSW(),function(u){return E(u,v)})}catch(u){return Promise.reject(u)}},l.messageSkipWaiting=function(){this.fn&&this.fn.waiting&&E(this.fn.waiting,x)},l.pn=function(){var v=navigator.serviceWorker.controller;return v&&b(v.scriptURL,this.sn.toString())?v:void 0},l.bn=function(){try{var v=this;return d(function(u,e){try{var o=u()}catch(s){return e(s)}return o&&o.then?o.then(void 0,e):o}(function(){return d(navigator.serviceWorker.register(v.sn,v.nn),function(u){return v.un=performance.now(),u})},function(u){throw u}))}catch(u){return Promise.reject(u)}},c=r,(h=[{key:"active",get:function(){return this.en.promise}},{key:"controlling",get:function(){return this.on.promise}}])&&k(c.prototype,h),Object.defineProperty(c,"prototype",{writable:!1}),c}(function(){function n(){this.Pn=new Map}var r=n.prototype;return r.addEventListener=function(t,i){this.jn(t).add(i)},r.removeEventListener=function(t,i){this.jn(t).delete(i)},r.dispatchEvent=function(t){t.target=this;for(var i,c=L(this.jn(t.type));!(i=c()).done;)(0,i.value)(t)},r.jn=function(t){return this.Pn.has(t)||this.Pn.set(t,new Set),this.Pn.get(t)},n}());export{U as Workbox,g as WorkboxEvent,E as messageSW};
@@ -0,0 +1 @@
1
+ const t={button:{about:{t:0,b:{t:2,i:[{t:3}],s:"关于"}},back:{t:0,b:{t:2,i:[{t:3}],s:"返回"}},go:{t:0,b:{t:2,i:[{t:3}],s:"确定"}},home:{t:0,b:{t:2,i:[{t:3}],s:"首页"}},confirm:{t:0,b:{t:2,i:[{t:3}],s:"确认"}},cancel:{t:0,b:{t:2,i:[{t:3}],s:"取消"}},toggle_dark:{t:0,b:{t:2,i:[{t:3}],s:"切换深色模式"}},toggle_langs:{t:0,b:{t:2,i:[{t:3}],s:"切换语言"}}},intro:{desc:{t:0,b:{t:2,i:[{t:3}],s:"固执己见的 Vite 项目模板"}},"dynamic-route":{t:0,b:{t:2,i:[{t:3}],s:"动态路由演示"}},hi:{t:0,b:{t:2,i:[{t:3,v:"你好,"},{t:4,k:"name"}]}},aka:{t:0,b:{t:2,i:[{t:3}],s:"也叫"}},"whats-your-name":{t:0,b:{t:2,i:[{t:3}],s:"输入你的名字"}}},"not-found":{t:0,b:{t:2,i:[{t:3}],s:"未找到页面"}},common:{loading:{t:0,b:{t:2,i:[{t:3}],s:"加载中"}},colon:{t:0,b:{t:2,i:[{t:3}],s:":"}}},index:{start:{t:0,b:{t:2,i:[{t:3}],s:"开始时间"}},duration:{t:0,b:{t:2,i:[{t:3}],s:"持续时长"}}},type_menu:{rank:{t:0,b:{t:2,i:[{t:3}],s:"排名"}},submissions:{t:0,b:{t:2,i:[{t:3}],s:"提交"}},statistics:{t:0,b:{t:2,i:[{t:3}],s:"统计"}},balloon:{t:0,b:{t:2,i:[{t:3}],s:"气球"}},export:{t:0,b:{t:2,i:[{t:3}],s:"导出"}},resolver:{t:0,b:{t:2,i:[{t:3}],s:"滚榜"}},options:{t:0,b:{t:2,i:[{t:3}],s:"选项"}},awards:{t:0,b:{t:2,i:[{t:3}],s:"奖项"}},utility:{t:0,b:{t:2,i:[{t:3}],s:"工具"}},countdown:{t:0,b:{t:2,i:[{t:3}],s:"倒计时"}}},standings:{start_time:{t:0,b:{t:2,i:[{t:3}],s:"开始时间"}},end_time:{t:0,b:{t:2,i:[{t:3}],s:"结束时间"}},elapsed:{t:0,b:{t:2,i:[{t:3}],s:"当前时间"}},remaining:{t:0,b:{t:2,i:[{t:3}],s:"剩余时间"}},place:{t:0,b:{t:2,i:[{t:3}],s:"Place"}},team:{t:0,b:{t:2,i:[{t:3}],s:"Team"}},solved:{t:0,b:{t:2,i:[{t:3}],s:"Solved"}},penalty:{t:0,b:{t:2,i:[{t:3}],s:"Penalty"}},dirt:{t:0,b:{t:2,i:[{t:3}],s:"Dirt"}},se:{t:0,b:{t:2,i:[{t:3}],s:"SE"}},statistics:{submitted:{t:0,b:{t:2,i:[{t:3}],s:"Submitted"}},attempted:{t:0,b:{t:2,i:[{t:3}],s:"Attempted"}},accepted:{t:0,b:{t:2,i:[{t:3}],s:"Accepted"}},dirt:{t:0,b:{t:2,i:[{t:3}],s:"Dirt"}},se:{t:0,b:{t:2,i:[{t:3}],s:"SE"}},first_solved:{t:0,b:{t:2,i:[{t:3}],s:"First Solved"}},last_solved:{t:0,b:{t:2,i:[{t:3}],s:"Last Solved"}},head_data:{problems:{t:0,b:{t:2,i:[{t:3}],s:"题目数"}},teams:{t:0,b:{t:2,i:[{t:3}],s:"队伍数"}},submissions:{t:0,b:{t:2,i:[{t:3}],s:"提交数"}}}},options:{calculation_of_penalty:{t:0,b:{t:2,i:[{t:3}],s:"罚时计算方式"}},in_minutes:{t:0,b:{t:2,i:[{t:3}],s:"精确到分钟进行累加"}},in_seconds:{t:0,b:{t:2,i:[{t:3}],s:"精确到秒进行累加"}},accumulate_in_seconds_and_finally_to_the_minute:{t:0,b:{t:2,i:[{t:3}],s:"精确到秒进行累加,最后精确到分钟"}}}},submissions:{total_submissions:{t:0,b:{t:2,i:[{t:3}],s:"总提交数"}}}};export{t as default};
package/dist/index.html CHANGED
@@ -1 +1 @@
1
- <!doctype html><html lang="en"><head><meta charset="UTF-8"><link rel="apple-touch-icon" href="https://cdn.jsdelivr.net/npm/@xcpcio/board-app@0.52.0/dist/balloon-192x192.png"><link rel="mask-icon" href="https://cdn.jsdelivr.net/npm/@xcpcio/board-app@0.52.0/dist/balloon-512x512.svg" color="#00aba9"><meta name="msapplication-TileColor" content="#00aba9"><script>function normalizePath(_){for(;_.endsWith("/");)_=_.slice(0,-1);return`${_}/`}{let _="https://cdn.jsdelivr.net/npm/@xcpcio/board-app@0.52.0/dist";_=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"}try{let _=__DEFAULT_LANG__;window.DEFAULT_LANG=_}catch(_){window.DEFAULT_LANG="en"}</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.52.0/dist/assets/index-1e2a1259.js"></script><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@xcpcio/board-app@0.52.0/dist/assets/index-43f8e0d3.css"><link rel="manifest" href="/manifest.webmanifest"></head><body class="font-sans"><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 plausibleJSUrl=__PLAUSIBLE_JS_URL__,plausibleDataDomain=__PLAUSIBLE_DATA_DOMAIN__;!function(){var e=document.createElement("script");e.src=plausibleJSUrl,e.defer=!0,e.setAttribute("data-domain",plausibleDataDomain);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){}try{var googleAnalyticsId=__GOOGLE_ANALYTICS_ID__;!function(){var e,t,a,r,c,n;location.port||(e=window,t=document,a="script",r="ga",e.GoogleAnalyticsObject=r,e[r]=e[r]||function(){(e[r].q=e[r].q||[]).push(arguments)},e[r].l=1*new Date,c=t.createElement(a),n=t.getElementsByTagName(a)[0],c.async=1,c.src="//www.google-analytics.com/analytics.js",n.parentNode.insertBefore(c,n),ga("create",`${googleAnalyticsId}`,"auto"),ga("send","pageview"))}()}catch(e){}</script></body></html>
1
+ <!doctype html><html lang="en"><head><meta charset="UTF-8"><link rel="apple-touch-icon" href="https://cdn.jsdelivr.net/npm/@xcpcio/board-app@0.53.0/dist/balloon-192x192.png"><link rel="mask-icon" href="https://cdn.jsdelivr.net/npm/@xcpcio/board-app@0.53.0/dist/balloon-512x512.svg" color="#00aba9"><meta name="msapplication-TileColor" content="#00aba9"><script>function normalizePath(_){for(;_.endsWith("/");)_=_.slice(0,-1);return`${_}/`}{let _="https://cdn.jsdelivr.net/npm/@xcpcio/board-app@0.53.0/dist";_=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"}try{let _=__DEFAULT_LANG__;window.DEFAULT_LANG=_}catch(_){window.DEFAULT_LANG="en"}</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.53.0/dist/assets/index-Bqug296L.js"></script><link rel="stylesheet" crossorigin href="https://cdn.jsdelivr.net/npm/@xcpcio/board-app@0.53.0/dist/assets/index-Ci3FURub.css"><link rel="manifest" href="/manifest.webmanifest"></head><body class="font-sans"><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 plausibleJSUrl=__PLAUSIBLE_JS_URL__,plausibleDataDomain=__PLAUSIBLE_DATA_DOMAIN__;!function(){var e=document.createElement("script");e.src=plausibleJSUrl,e.defer=!0,e.setAttribute("data-domain",plausibleDataDomain);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){}try{var googleAnalyticsId=__GOOGLE_ANALYTICS_ID__;!function(){var e,t,a,r,c,n;location.port||(e=window,t=document,a="script",r="ga",e.GoogleAnalyticsObject=r,e[r]=e[r]||function(){(e[r].q=e[r].q||[]).push(arguments)},e[r].l=1*new Date,c=t.createElement(a),n=t.getElementsByTagName(a)[0],c.async=1,c.src="//www.google-analytics.com/analytics.js",n.parentNode.insertBefore(c,n),ga("create",`${googleAnalyticsId}`,"auto"),ga("send","pageview"))}()}catch(e){}</script></body></html>
package/dist/sw.js CHANGED
@@ -1 +1 @@
1
- if(!self.define){let s,e={};const l=(l,n)=>(l=new URL(l+".js",n).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=(n,i)=>{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(n.map((s=>t[s]||a(s)))).then((s=>(i(...s),u)))}}define(["./workbox-86deb690"],(function(s){"use strict";self.skipWaiting(),s.clientsClaim(),s.precacheAndRoute([{url:"assets/_...all_-85910c2a.js",revision:null},{url:"assets/_...all_-905784b3.js",revision:null},{url:"assets/_...all_-c60acc8c.css",revision:null},{url:"assets/_name_-203db09f.js",revision:null},{url:"assets/about-d9d865e0.js",revision:null},{url:"assets/Board-04b0589d.js",revision:null},{url:"assets/board-3f91f491.js",revision:null},{url:"assets/Board-f05c0366.css",revision:null},{url:"assets/board-layout-967802f4.js",revision:null},{url:"assets/DataSourceInput.vue_vue_type_script_setup_true_lang-11e5a08c.js",revision:null},{url:"assets/en-c9a8dbb5.js",revision:null},{url:"assets/headless-f3f3253c.js",revision:null},{url:"assets/home-3d9e3102.js",revision:null},{url:"assets/index-0095f855.js",revision:null},{url:"assets/index-1e2a1259.js",revision:null},{url:"assets/index-241beb5a.css",revision:null},{url:"assets/index-43f8e0d3.css",revision:null},{url:"assets/index-86ef642b.js",revision:null},{url:"assets/index-accb347c.css",revision:null},{url:"assets/index-b97b2d45.js",revision:null},{url:"assets/index-c827bc8f.css",revision:null},{url:"assets/index-d51c6c02.js",revision:null},{url:"assets/index-layout-5a67cc99.js",revision:null},{url:"assets/pagination-6eac914a.js",revision:null},{url:"assets/query-ff21040c.js",revision:null},{url:"assets/test-5dd32cac.js",revision:null},{url:"assets/TheInput.vue_vue_type_script_setup_true_lang-f91fd6e0.js",revision:null},{url:"assets/user-cd9a56f6.js",revision:null},{url:"assets/virtual_pwa-register-ff5720d1.js",revision:null},{url:"assets/workbox-window.prod.es5-c46a1faa.js",revision:null},{url:"assets/zh-CN-8e545f66.js",revision:null},{url:"index.html",revision:"671e920b2390887ab04c90fb1b9ce93e"},{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,n)=>(l=new URL(l+".js",n).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=(n,i)=>{const r=s||("document"in self?document.currentScript.src:"")||location.href;if(e[r])return;let u={};const t=s=>l(s,r),o={module:{uri:r},exports:u,require:t};e[r]=Promise.all(n.map((s=>o[s]||t(s)))).then((s=>(i(...s),u)))}}define(["./workbox-86deb690"],(function(s){"use strict";self.skipWaiting(),s.clientsClaim(),s.precacheAndRoute([{url:"assets/_..-8Wh-Y8sB.css",revision:null},{url:"assets/_...all_-CajB1u6j.js",revision:null},{url:"assets/_...all_-DkFLHLY4.js",revision:null},{url:"assets/_name_-CKcXFscu.js",revision:null},{url:"assets/_plugin-vue_export-helper-DlAUqK2U.js",revision:null},{url:"assets/about-Bt1E61e1.js",revision:null},{url:"assets/Board--Fj0eIxn.css",revision:null},{url:"assets/board-BuZxK-RS.js",revision:null},{url:"assets/Board-DVycq7Hb.js",revision:null},{url:"assets/board-layout-BDGSSQnD.js",revision:null},{url:"assets/constant-D5AETBoS.js",revision:null},{url:"assets/ContestStateBadge-SaSIRVZw.js",revision:null},{url:"assets/ContestStateBadge-yOXRkC0c.css",revision:null},{url:"assets/DataSourceInput.vue_vue_type_script_setup_true_lang-ButnX5NG.js",revision:null},{url:"assets/default-g2FZdb_E.js",revision:null},{url:"assets/en-DDlXf_8q.js",revision:null},{url:"assets/Footer.vue_vue_type_script_setup_true_lang-DtriOyxw.js",revision:null},{url:"assets/headless-AGI21K3d.js",revision:null},{url:"assets/home-CIo2SGx9.js",revision:null},{url:"assets/index-B0AiC33S.js",revision:null},{url:"assets/index-BerApwlM.css",revision:null},{url:"assets/index-BJlHNlHk.js",revision:null},{url:"assets/index-BP90wE2A.css",revision:null},{url:"assets/index-Bqug296L.js",revision:null},{url:"assets/index-BVqqkkh8.js",revision:null},{url:"assets/index-ByBDbX-Q.js",revision:null},{url:"assets/index-CDb5YJlm.js",revision:null},{url:"assets/index-Ci3FURub.css",revision:null},{url:"assets/index-CsD1PvIl.js",revision:null},{url:"assets/index-De6dfmWB.css",revision:null},{url:"assets/index-DRiWpQTB.css",revision:null},{url:"assets/index-DtIE9gnq.js",revision:null},{url:"assets/index-eEOWm26O.js",revision:null},{url:"assets/index-layout-B9ZsHAPN.js",revision:null},{url:"assets/NavBar-CTO09sVc.js",revision:null},{url:"assets/NavBar-K1-1c5jR.css",revision:null},{url:"assets/pagination-SF0231GF.js",revision:null},{url:"assets/RightArrowIcon-93I3m1Dg.js",revision:null},{url:"assets/route-block-B_A1xBdJ.js",revision:null},{url:"assets/test-BmgsMNrG.js",revision:null},{url:"assets/TheInput.vue_vue_type_script_setup_true_lang-Bstp0Uq6.js",revision:null},{url:"assets/Tooltip-VVqtpO6L.css",revision:null},{url:"assets/Tooltip.vue_vue_type_script_setup_true_lang-IVJ6kO8Y.js",revision:null},{url:"assets/use-vmodel-DKmkNt1c.js",revision:null},{url:"assets/useQueryBoardData-MYqwKv9X.js",revision:null},{url:"assets/user-DVMgLOCG.js",revision:null},{url:"assets/virtual_pwa-register-G08q8i_v.js",revision:null},{url:"assets/workbox-window.prod.es5-D5gOYdM7.js",revision:null},{url:"assets/zh-CN-CNJkghp4.js",revision:null},{url:"index.html",revision:"d01af31ce7e3e46b2ddcaf54b5668aa1"},{url:"balloon2-192x192.png",revision:"c857ae6d9dfae118ab4397d4358422bd"},{url:"balloon2-512x512.png",revision:"065594f4f743fe3884793c03d3fe7d9e"},{url:"favicon.svg",revision:"5a744f4ccbb122d4a0575be779ddcd43"},{url:"safari-pinned-tab.svg",revision:"5eaf74d1c43d30e0af743b68a3f48504"},{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.52.0",
4
+ "version": "0.53.0",
5
5
  "description": "XCPCIO Board App",
6
6
  "author": "Dup4 <lyuzhi.pan@gmail.com>",
7
7
  "license": "MIT",
@@ -21,85 +21,87 @@
21
21
  "Standings"
22
22
  ],
23
23
  "files": [
24
- "src",
24
+ "./*.{js,ts,json}",
25
25
  "dist",
26
26
  "public",
27
- "./*.{js,ts,json}"
27
+ "src"
28
28
  ],
29
29
  "engines": {
30
- "node": ">=16"
30
+ "node": ">=18"
31
31
  },
32
32
  "dependencies": {
33
- "@tanstack/vue-query": "^5.56.2",
34
- "@unhead/vue": "^1.11.6",
35
- "@unocss/reset": "^0.53.6",
36
- "@vueuse/components": "^10.11.1",
37
- "@vueuse/core": "^10.11.1",
38
- "@vueuse/head": "^1.3.1",
39
- "@vueuse/router": "^10.11.1",
33
+ "@tanstack/vue-query": "^5.59.6",
34
+ "@unhead/vue": "^1.11.7",
35
+ "@unocss/reset": "^0.63.4",
36
+ "@vueuse/components": "^11.1.0",
37
+ "@vueuse/core": "^11.1.0",
38
+ "@vueuse/head": "^2.0.0",
39
+ "@vueuse/router": "^11.1.0",
40
40
  "dayjs": "^1.11.13",
41
41
  "file-saver": "^2.0.5",
42
- "floating-vue": "2.0.0-beta.24",
43
- "flowbite": "^1.8.1",
42
+ "floating-vue": "5.2.2",
43
+ "flowbite": "^2.5.2",
44
+ "gsap": "^3.12.5",
44
45
  "highcharts": "^11.4.8",
45
- "highcharts-vue": "^1.4.3",
46
+ "highcharts-vue": "^2.0.1",
46
47
  "lodash": "^4.17.21",
47
48
  "nprogress": "^0.2.0",
48
- "pinia": "^2.2.2",
49
+ "pinia": "^2.2.4",
49
50
  "sleep-promise": "^9.1.0",
50
- "vue": "^3.5.10",
51
+ "vue": "^3.5.11",
51
52
  "vue-demi": "^0.14.10",
52
- "vue-i18n": "^9.14.1",
53
+ "vue-i18n": "^10.0.4",
53
54
  "vue-router": "^4.4.5",
54
55
  "vue-search-select": "^3.2.0",
55
56
  "vue-toast-notification": "^3.1.3",
56
- "@xcpcio/core": "0.52.0",
57
- "@xcpcio/types": "0.52.0"
57
+ "@xcpcio/core": "0.53.0",
58
+ "@xcpcio/types": "0.53.0"
58
59
  },
59
60
  "devDependencies": {
60
- "@antfu/eslint-config": "^0.39.8",
61
- "@iconify/json": "^2.2.253",
62
- "@intlify/unplugin-vue-i18n": "^0.12.3",
61
+ "@antfu/eslint-config": "^3.7.3",
62
+ "@iconify/json": "^2.2.258",
63
+ "@intlify/unplugin-vue-i18n": "^5.2.0",
64
+ "@shikijs/markdown-it": "^1.22.0",
63
65
  "@types/file-saver": "^2.0.7",
64
- "@types/lodash": "^4.17.9",
66
+ "@types/lodash": "^4.17.10",
65
67
  "@types/markdown-it-link-attributes": "^3.0.5",
66
68
  "@types/nprogress": "^0.2.3",
67
- "@unocss/eslint-config": "^0.53.6",
68
- "@vitejs/plugin-vue": "^4.6.2",
69
- "@vue-macros/volar": "^0.12.3",
69
+ "@unocss/eslint-config": "^0.63.4",
70
+ "@vitejs/plugin-vue": "^5.1.4",
71
+ "@vue-macros/volar": "^0.30.3",
70
72
  "@vue/test-utils": "^2.4.6",
71
- "critters": "^0.0.19",
73
+ "critters": "^0.0.24",
72
74
  "cross-env": "^7.0.3",
73
- "cypress": "^12.17.4",
75
+ "cypress": "^13.15.0",
74
76
  "cypress-vite": "^1.5.0",
75
- "eslint": "^8.57.1",
76
- "eslint-plugin-cypress": "^2.15.2",
77
+ "eslint": "^9.12.0",
78
+ "eslint-plugin-cypress": "^3.5.0",
79
+ "eslint-plugin-format": "^0.1.2",
77
80
  "https-localhost": "^4.7.1",
78
81
  "less": "^4.2.0",
79
82
  "markdown-it-link-attributes": "^4.0.1",
80
- "markdown-it-shiki": "^0.9.0",
81
- "shiki": "^0.14.7",
82
- "taze": "^0.11.4",
83
- "typescript": "^5.6.2",
84
- "unocss": "^0.53.6",
85
- "unplugin-auto-import": "^0.16.7",
86
- "unplugin-vue-components": "^0.25.2",
87
- "unplugin-vue-macros": "^2.12.2",
88
- "vite": "^4.5.5",
89
- "vite-bundle-visualizer": "^0.8.1",
83
+ "rollup": "^4.24.0",
84
+ "shiki": "^1.22.0",
85
+ "taze": "^0.17.2",
86
+ "typescript": "^5.6.3",
87
+ "unocss": "^0.63.4",
88
+ "unplugin-auto-import": "^0.18.3",
89
+ "unplugin-vue-components": "^0.27.4",
90
+ "unplugin-vue-macros": "^2.12.3",
91
+ "unplugin-vue-markdown": "^0.26.2",
92
+ "unplugin-vue-router": "^0.10.8",
93
+ "vite": "^5.4.8",
94
+ "vite-bundle-visualizer": "^1.2.1",
90
95
  "vite-plugin-html": "^3.2.2",
91
- "vite-plugin-inspect": "^0.7.42",
92
- "vite-plugin-pages": "^0.31.0",
93
- "vite-plugin-pwa": "^0.16.7",
94
- "vite-plugin-vue-component-preview": "^1.1.7",
95
- "vite-plugin-vue-devtools": "^0.5.1",
96
- "vite-plugin-vue-layouts": "^0.8.0",
97
- "vite-plugin-vue-markdown": "^0.23.8",
96
+ "vite-plugin-inspect": "^0.8.7",
97
+ "vite-plugin-pwa": "^0.20.5",
98
+ "vite-plugin-vue-devtools": "^7.4.6",
99
+ "vite-plugin-vue-layouts": "^0.11.0",
98
100
  "vite-plugin-webfont-dl": "^3.9.5",
99
101
  "vite-ssg": "^0.23.8",
100
- "vite-ssg-sitemap": "^0.5.1",
102
+ "vite-ssg-sitemap": "^0.8.1",
101
103
  "vitest": "^2.1.2",
102
- "vue-tsc": "^1.8.27",
104
+ "vue-tsc": "^2.1.6",
103
105
  "workbox-build": "^7.1.1",
104
106
  "workbox-window": "^7.1.0"
105
107
  },
@@ -3,6 +3,7 @@
3
3
  // @ts-nocheck
4
4
  // noinspection JSUnusedGlobalSymbols
5
5
  // Generated by unplugin-auto-import
6
+ // biome-ignore lint: disable
6
7
  export {}
7
8
  declare global {
8
9
  const BALLOON_TITLE_SUFFIX: typeof import('./composables/constant')['BALLOON_TITLE_SUFFIX']
@@ -217,7 +218,7 @@ declare global {
217
218
  const useIntervalFn: typeof import('@vueuse/core')['useIntervalFn']
218
219
  const useKeyModifier: typeof import('@vueuse/core')['useKeyModifier']
219
220
  const useLastChanged: typeof import('@vueuse/core')['useLastChanged']
220
- const useLink: typeof import('vue-router')['useLink']
221
+ const useLink: typeof import('vue-router/auto')['useLink']
221
222
  const useLocalStorage: typeof import('@vueuse/core')['useLocalStorage']
222
223
  const useLocalStorageForFilterOrganizations: typeof import('./composables/useLocalStorage')['useLocalStorageForFilterOrganizations']
223
224
  const useLocalStorageForFilterTeams: typeof import('./composables/useLocalStorage')['useLocalStorageForFilterTeams']
@@ -340,6 +341,7 @@ declare global {
340
341
  // for vue template auto import
341
342
  import { UnwrapRef } from 'vue'
342
343
  declare module 'vue' {
344
+ interface GlobalComponents {}
343
345
  interface ComponentCustomProperties {
344
346
  readonly BALLOON_TITLE_SUFFIX: UnwrapRef<typeof import('./composables/constant')['BALLOON_TITLE_SUFFIX']>
345
347
  readonly CDN_HOST: UnwrapRef<typeof import('./composables/constant')['CDN_HOST']>
@@ -545,7 +547,7 @@ declare module 'vue' {
545
547
  readonly useIntervalFn: UnwrapRef<typeof import('@vueuse/core')['useIntervalFn']>
546
548
  readonly useKeyModifier: UnwrapRef<typeof import('@vueuse/core')['useKeyModifier']>
547
549
  readonly useLastChanged: UnwrapRef<typeof import('@vueuse/core')['useLastChanged']>
548
- readonly useLink: UnwrapRef<typeof import('vue-router')['useLink']>
550
+ readonly useLink: UnwrapRef<typeof import('vue-router/auto')['useLink']>
549
551
  readonly useLocalStorage: UnwrapRef<typeof import('@vueuse/core')['useLocalStorage']>
550
552
  readonly useLocalStorageForFilterOrganizations: UnwrapRef<typeof import('./composables/useLocalStorage')['useLocalStorageForFilterOrganizations']>
551
553
  readonly useLocalStorageForFilterTeams: UnwrapRef<typeof import('./composables/useLocalStorage')['useLocalStorageForFilterTeams']>
@@ -1,12 +1,12 @@
1
1
  <script setup lang="ts">
2
- import { Balloon, Rank, createContest, createSubmissions, createTeams } from "@xcpcio/core";
3
2
  import type { Contest, Submissions, Teams } from "@xcpcio/core";
4
3
  import type { Contest as IContest, Submissions as ISubmissions, Teams as ITeams } from "@xcpcio/types";
4
+ import { Balloon, createContest, createSubmissions, createTeams, Rank } from "@xcpcio/core";
5
5
 
6
6
  import { BALLOON_TITLE_SUFFIX } from "~/composables/constant";
7
7
 
8
8
  const props = defineProps<{
9
- dataSourceUrl: string,
9
+ dataSourceUrl: string;
10
10
  }>();
11
11
 
12
12
  const title = useTitle(BALLOON_TITLE_SUFFIX);
@@ -43,6 +43,7 @@ watch(data, async () => {
43
43
  }, { immediate: true });
44
44
 
45
45
  const balloons = computed(() => {
46
+ // eslint-disable-next-line vue/no-side-effects-in-computed-properties
46
47
  return rank.value.balloons.sort(Balloon.compare).reverse().slice(0, 256);
47
48
  });
48
49
  </script>
@@ -3,7 +3,7 @@ import type { Balloon, Team } from "@xcpcio/core";
3
3
 
4
4
  const props = defineProps<{
5
5
  index: number;
6
- balloon: Balloon,
6
+ balloon: Balloon;
7
7
  }>();
8
8
 
9
9
  const index = computed(() => props.index);
@@ -1,13 +1,13 @@
1
1
  <script setup lang="ts">
2
- import { useElementVisibility } from "@vueuse/core";
3
-
4
2
  import type { ContestIndex } from "@xcpcio/core";
3
+
4
+ import { useElementVisibility } from "@vueuse/core";
5
5
  import { getImageSource } from "@xcpcio/core";
6
6
 
7
7
  import { getLogoFromPreset } from "~/composables/logo";
8
8
 
9
9
  const props = defineProps<{
10
- data: ContestIndex
10
+ data: ContestIndex;
11
11
  }>();
12
12
 
13
13
  const { t } = useI18n();
@@ -1,11 +1,11 @@
1
1
  <script setup lang="ts">
2
- import { createContest } from "@xcpcio/core";
3
2
  import type { Contest } from "@xcpcio/core";
4
- import { ContestState } from "@xcpcio/types";
5
3
  import type { Contest as IContest } from "@xcpcio/types";
4
+ import { createContest } from "@xcpcio/core";
5
+ import { ContestState } from "@xcpcio/types";
6
6
 
7
7
  const props = defineProps<{
8
- dataSourceUrl: string,
8
+ dataSourceUrl: string;
9
9
  }>();
10
10
 
11
11
  const { t } = useI18n();
@@ -3,7 +3,7 @@ import { GITHUB_URL, XCPCIO_HOME } from "@xcpcio/types";
3
3
  import { availableLocales, loadLanguageAsync } from "~/modules/i18n";
4
4
 
5
5
  const props = defineProps<{
6
- width?: string,
6
+ width?: string;
7
7
  }>();
8
8
 
9
9
  const { t, locale } = useI18n();
@@ -1,17 +1,23 @@
1
1
  <script setup lang="ts">
2
- import { onKeyUp } from "@vueuse/core";
3
- import { ResolverVue, createContest, createSubmissions, createTeams } from "@xcpcio/core";
4
2
  import type { Contest, Submissions, Teams } from "@xcpcio/core";
5
3
  import type { Contest as IContest, Submissions as ISubmissions, Teams as ITeams } from "@xcpcio/types";
4
+ import { onKeyUp } from "@vueuse/core";
5
+ import { createContest, createSubmissions, createTeams, ResolverVue } from "@xcpcio/core";
6
+ import { gsap } from "gsap";
7
+ import { ScrollToPlugin } from "gsap/ScrollToPlugin";
6
8
 
7
9
  const props = defineProps<{
8
- dataSourceUrl: string,
10
+ dataSourceUrl: string;
9
11
  }>();
10
12
 
13
+ gsap.registerPlugin(ScrollToPlugin);
14
+
11
15
  const title = useTitle(RESOLVER_TITLE_SUFFIX);
12
16
  const { t } = useI18n();
13
17
 
14
18
  const firstLoaded = ref(false);
19
+ const startFirstScroll = ref(false);
20
+ const finishedFirstScroll = ref(false);
15
21
  const contest = ref({} as Contest);
16
22
  const teams = ref([] as Teams);
17
23
  const submissions = ref([] as Submissions);
@@ -46,17 +52,86 @@ onKeyStroke([" "], (e) => {
46
52
  });
47
53
 
48
54
  onKeyUp(["n", " "], () => {
55
+ if (!finishedFirstScroll.value) {
56
+ startFirstScroll.value = true;
57
+ return;
58
+ }
59
+
49
60
  resolver.value.next();
50
61
  }, { dedupe: true });
51
62
 
52
63
  onKeyUp(["r"], () => {
53
64
  resolver.value.rewind();
54
65
  }, { dedupe: true });
66
+
67
+ onKeyUp(["w"], () => {
68
+ resolver.value.currentIndex--;
69
+ });
70
+
71
+ onKeyUp(["s"], () => {
72
+ resolver.value.currentIndex++;
73
+ });
74
+
75
+ const resolverRef = ref<HTMLElement | null>(null);
76
+ const currentRowRef = ref<HTMLElement | null>(null);
77
+
78
+ onMounted(() => {
79
+ watch(() => startFirstScroll.value, async () => {
80
+ if (finishedFirstScroll.value) {
81
+ return;
82
+ }
83
+
84
+ if (!startFirstScroll.value) {
85
+ return;
86
+ }
87
+
88
+ if (resolverRef.value) {
89
+ const scrollHeight = resolverRef.value.scrollHeight;
90
+ const clientHeight = resolverRef.value.clientHeight;
91
+
92
+ gsap.to(resolverRef.value, {
93
+ duration: Math.round(resolver.value.teams.length * 0.5),
94
+ scrollTop: scrollHeight - clientHeight,
95
+ ease: "power1.inOut",
96
+ onComplete: () => {
97
+ finishedFirstScroll.value = true;
98
+ },
99
+ });
100
+ }
101
+ }, { immediate: true });
102
+
103
+ watch(() => resolver.value.currentIndex, async () => {
104
+ if (!finishedFirstScroll.value) {
105
+ return;
106
+ }
107
+
108
+ if (resolverRef.value && currentRowRef.value) {
109
+ const containerRect = resolverRef.value.getBoundingClientRect();
110
+ const containerHeight = containerRect.height;
111
+ const rowRect = currentRowRef.value.getBoundingClientRect();
112
+ const rowHeight = rowRect.height;
113
+
114
+ // 计算选中行应该在的位置(距离底部2行)
115
+ const targetPosition = containerHeight - 3 * rowHeight;
116
+
117
+ // 计算当前选中行相对于容器顶部的位置
118
+ const currentPosition = rowRect.top - containerRect.top;
119
+
120
+ // 计算需要滚动的距离
121
+ const scrollDistance = (currentPosition - targetPosition);
122
+
123
+ gsap.to(resolverRef.value, {
124
+ duration: 2.5,
125
+ ease: "power1.out",
126
+ scrollTop: `+=${scrollDistance}`,
127
+ });
128
+ }
129
+ }, { flush: "post" });
130
+ });
55
131
  </script>
56
132
 
57
133
  <template>
58
134
  <div
59
-
60
135
  text-gray-200
61
136
  w-screen h-screen
62
137
  >
@@ -81,32 +156,42 @@ onKeyUp(["r"], () => {
81
156
  <div
82
157
  v-else
83
158
  >
84
- <div
85
- class="bg-resolver-bg-1"
86
- flex flex-col
87
- justify-between
88
- font-mono
89
- >
90
- <TransitionGroup
91
- name="resolver"
92
- tag="ul"
159
+ <div>
160
+ <div
161
+ class="bg-resolver-bg-1"
162
+ flex flex-col justify-between
163
+ font-mono
164
+ w-screen h-screen
165
+ overflow-hidden
93
166
  >
94
- <template
95
- v-for="(team, index) in resolver.teams"
96
- :key="team.id"
167
+ <div
168
+ ref="resolverRef"
169
+ h-full
170
+ overflow-y-auto
97
171
  >
98
- <div
99
- position-relative
100
- :class="[team.id === resolver.currentTeamId ? 'z-999' : 'z-0']"
172
+ <TransitionGroup
173
+ name="resolver"
174
+ tag="ul"
101
175
  >
102
- <ResolverTeamRow
103
- :index="index"
104
- :team="team"
105
- :resolver="resolver"
106
- />
107
- </div>
108
- </template>
109
- </TransitionGroup>
176
+ <template
177
+ v-for="(team, index) in resolver.teams"
178
+ :key="team.id"
179
+ >
180
+ <div
181
+ :ref="(el) => { if (index === resolver.currentIndex) { currentRowRef = el as HTMLElement; } }"
182
+ :class="[team.id === resolver.currentTeamId ? 'z-999' : 'z-0']"
183
+ position-relative
184
+ >
185
+ <ResolverTeamRow
186
+ :index="index"
187
+ :team="team"
188
+ :resolver="resolver"
189
+ />
190
+ </div>
191
+ </template>
192
+ </TransitionGroup>
193
+ </div>
194
+ </div>
110
195
  </div>
111
196
  </div>
112
197
  </div>
@@ -1,6 +1,6 @@
1
1
  <script setup lang="ts">
2
2
  const { modelValue } = defineModels<{
3
- modelValue: string | null
3
+ modelValue: string | null;
4
4
  }>();
5
5
 
6
6
  const inputEl = $ref<HTMLInputElement>();
@@ -1,6 +1,6 @@
1
1
  <script setup lang="ts">
2
2
  const { modelValue } = defineModels<{
3
- modelValue: boolean
3
+ modelValue: boolean;
4
4
  }>();
5
5
  </script>
6
6
 
@@ -1,6 +1,6 @@
1
1
  <script setup lang="ts">
2
2
  const props = defineProps<{
3
- initial: number
3
+ initial: number;
4
4
  }>();
5
5
 
6
6
  const { count, inc, dec } = useCounter(props.initial);
@@ -1,11 +1,11 @@
1
1
  <script setup lang="ts">
2
2
  const props = defineProps<{
3
- textAlign?: "left" | "center" | "right"
4
- textType?: "text" | "number"
3
+ textAlign?: "left" | "center" | "right";
4
+ textType?: "text" | "number";
5
5
  }>();
6
6
 
7
7
  const { modelValue } = defineModels<{
8
- modelValue: string | number
8
+ modelValue: string | number;
9
9
  }>();
10
10
  </script>
11
11
 
@@ -1,12 +1,12 @@
1
1
  <script setup lang="ts">
2
- import { MultiSelect } from "vue-search-select";
3
2
  import { type Giants, GiantsType, type Rank, type SelectOptionItem } from "@xcpcio/core";
3
+ import { MultiSelect } from "vue-search-select";
4
4
 
5
5
  const props = defineProps<{
6
- rank: Rank,
7
- orgOptions: SelectOptionItem[],
8
- teamsOptions: SelectOptionItem[],
9
- giants: Giants,
6
+ rank: Rank;
7
+ orgOptions: SelectOptionItem[];
8
+ teamsOptions: SelectOptionItem[];
9
+ giants: Giants;
10
10
  }>();
11
11
 
12
12
  const emit = defineEmits([
@@ -2,7 +2,7 @@
2
2
  import type { BattleOfGiants } from "@xcpcio/core/index";
3
3
 
4
4
  const props = defineProps<{
5
- battleOfGiants: BattleOfGiants
5
+ battleOfGiants: BattleOfGiants;
6
6
  }>();
7
7
 
8
8
  const battleOfGiants = computed(() => props.battleOfGiants);