diff --git a/packages/ui-default/build/config/webpack.js b/packages/ui-default/build/config/webpack.js
index 81720fa7..74817675 100644
--- a/packages/ui-default/build/config/webpack.js
+++ b/packages/ui-default/build/config/webpack.js
@@ -130,30 +130,21 @@ export default function (env = {}) {
maxInitialRequests: 3,
automaticNameDelimiter: '-',
cacheGroups: {
- monaco: {
- test: /[\\/]monaco-editor[\\/]/,
- priority: 9,
- name: 'monaco',
- },
- vditor: {
- test: /[\\/]vditor[\\/]/,
- priority: 8,
- name: 'vditor',
- },
- echarts: {
- test: /[\\/]echarts[\\/]/,
- priority: 7,
- name: 'echarts',
- },
- graphql: {
- test: /[\\/](graphiql|codemirror)[\\/]/,
- priority: 6,
- name: 'gql-cm',
+ style: {
+ test: /\.(css|styl|less|sass|scss)$/,
+ priority: 99,
+ name: 'style',
},
vendors: {
test: /[\\/]node_modules[\\/].+\.([jt]sx?|json|yaml)$/,
priority: -10,
- name: 'vendors',
+ name(module) {
+ const packageName = module.context.match(/[\\/]node_modules[\\/](.*?)([\\/]|$)/)[1];
+ if (packageName === 'monaco-editor-nls') {
+ return `i.monaco.${module.userRequest.split('/').pop().split('.')[0]}`;
+ }
+ return `n.${packageName.replace('@', '')}`;
+ },
reuseExistingChunk: true,
},
default: {
diff --git a/packages/ui-default/components/autocomplete/components/AutoComplete.jsx b/packages/ui-default/components/autocomplete/components/AutoComplete.jsx
index b3c82864..92debe2d 100644
--- a/packages/ui-default/components/autocomplete/components/AutoComplete.jsx
+++ b/packages/ui-default/components/autocomplete/components/AutoComplete.jsx
@@ -5,7 +5,7 @@ import React, {
} from 'react';
import PropTypes from 'prop-types';
import { debounce } from 'lodash';
-import { Icon } from '@blueprintjs/core';
+import Icon from 'vj/components/react/IconComponent';
// eslint-disable-next-line prefer-arrow-callback
const AutoComplete = forwardRef(function AutoComplete(props, ref) {
@@ -199,7 +199,7 @@ const AutoComplete = forwardRef(function AutoComplete(props, ref) {
{multi && selected.map((item, idx) => (
{itemText(item)}
-
toggleItem(item)} />
+ toggleItem(item)} />
))}
{renderItem(item)}
-
+
))}
diff --git a/packages/ui-default/components/monaco/nls.js b/packages/ui-default/components/monaco/nls.js
index 61baef8a..61eac917 100644
--- a/packages/ui-default/components/monaco/nls.js
+++ b/packages/ui-default/components/monaco/nls.js
@@ -1,9 +1,5 @@
/* eslint-disable camelcase */
import en_GB from 'monaco-editor-nls/locale/en-gb.json';
-import zh_CN from 'monaco-editor-nls/locale/zh-hans.json';
-import zh_TW from 'monaco-editor-nls/locale/zh-hant.json';
-import ko from 'monaco-editor-nls/locale/ko.json';
-import i18n from 'vj/utils/i18n';
function _format(message, args) {
let result;
@@ -51,10 +47,3 @@ export function loadMessageBundle(file) {
export function config(opt) {
return loadMessageBundle;
}
-
-const languages = {
- zh_CN,
- zh_TW,
- ko,
-};
-if (languages[i18n('timeago_locale')]) setLocaleData(languages[i18n('timeago_locale')]);
diff --git a/packages/ui-default/hydro.ts b/packages/ui-default/hydro.ts
index dd2b2a30..ea0b89f6 100644
--- a/packages/ui-default/hydro.ts
+++ b/packages/ui-default/hydro.ts
@@ -4,6 +4,7 @@ import _ from 'lodash';
import Notification from 'vj/components/notification';
import PageLoader from 'vj/misc/PageLoader';
import delay from 'vj/utils/delay';
+import i18n from './i18n';
declare global {
interface Window {
@@ -36,6 +37,7 @@ function buildSequence(pages, type) {
async function load() {
for (const page of window.Hydro.preload) await eval(page); // eslint-disable-line no-eval
+ await i18n();
const pageLoader = new PageLoader();
const currentPageName = document.documentElement.getAttribute('data-page');
diff --git a/packages/ui-default/i18n.ts b/packages/ui-default/i18n.ts
new file mode 100644
index 00000000..4630f6cc
--- /dev/null
+++ b/packages/ui-default/i18n.ts
@@ -0,0 +1,14 @@
+import { setLocaleData } from 'vj/components/monaco/nls';
+
+export default async function load() {
+ let resource;
+ const lang = UserContext.viewLang;
+ if (lang === 'zh') {
+ resource = await import('monaco-editor-nls/locale/zh-hans.json');
+ } else if (lang === 'zh_TW') {
+ resource = await import('monaco-editor-nls/locale/zh-hant.json');
+ } else if (lang === 'ko') {
+ resource = await import('monaco-editor-nls/locale/ko.json');
+ }
+ if (resource) setLocaleData(resource);
+}
diff --git a/packages/ui-default/misc/icons/book.svg b/packages/ui-default/misc/icons/book.svg
new file mode 100644
index 00000000..ed043fe9
--- /dev/null
+++ b/packages/ui-default/misc/icons/book.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/ui-default/misc/icons/comparison.svg b/packages/ui-default/misc/icons/comparison.svg
new file mode 100644
index 00000000..013e3613
--- /dev/null
+++ b/packages/ui-default/misc/icons/comparison.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/ui-default/misc/icons/stopwatch.svg b/packages/ui-default/misc/icons/stopwatch.svg
new file mode 100644
index 00000000..6c005f11
--- /dev/null
+++ b/packages/ui-default/misc/icons/stopwatch.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/ui-default/package.json b/packages/ui-default/package.json
index ef087a0f..dc6ab211 100644
--- a/packages/ui-default/package.json
+++ b/packages/ui-default/package.json
@@ -1,6 +1,6 @@
{
"name": "@hydrooj/ui-default",
- "version": "4.27.10",
+ "version": "4.27.11",
"author": "undefined ",
"license": "AGPL-3.0",
"main": "hydro.js",
@@ -11,8 +11,8 @@
},
"devDependencies": {
"@blueprintjs/core": "^3.52.0",
- "@blueprintjs/icons": "^3.31.0",
"@hydrooj/utils": "workspace:*",
+ "@types/gulp-if": "^0.0.34",
"@types/jquery": "^3.5.10",
"@types/json-schema": "^7.0.9",
"@types/katex": "^0.11.1",
diff --git a/packages/ui-default/templates/problem_detail.html b/packages/ui-default/templates/problem_detail.html
index ee31ad76..f3aa33e1 100644
--- a/packages/ui-default/templates/problem_detail.html
+++ b/packages/ui-default/templates/problem_detail.html
@@ -50,10 +50,10 @@