Arsekl 3 years ago
commit
67f3800b26
98 changed files with 12127 additions and 0 deletions
  1. 1 0
      .env
  2. 21 0
      .gitignore
  3. 63 0
      .umirc.ts
  4. 12 0
      Dockerfile
  5. 46 0
      README.md
  6. 74 0
      package.json
  7. BIN
      public/favicon.ico
  8. BIN
      public/favicon.png
  9. 5 0
      public/mock/1.json
  10. 12 0
      public/mock/2.json
  11. 15 0
      public/mock/3.json
  12. 62 0
      public/mock/dataSource.json
  13. 88 0
      public/mock/folderTree.json
  14. BIN
      src/.sass-cache/28a7e104821cb614ea3923d4ee9d48c667252299/global.scssc
  15. BIN
      src/.sass-cache/31b9b8716863e79b69e689a9b340db2955903fe0/common.scssc
  16. BIN
      src/.sass-cache/31b9b8716863e79b69e689a9b340db2955903fe0/molecule.scssc
  17. BIN
      src/.sass-cache/31b9b8716863e79b69e689a9b340db2955903fe0/reset.scssc
  18. BIN
      src/.sass-cache/31b9b8716863e79b69e689a9b340db2955903fe0/theme.scssc
  19. BIN
      src/.sass-cache/31b9b8716863e79b69e689a9b340db2955903fe0/variables.scssc
  20. 160 0
      src/api/index.ts
  21. 95 0
      src/common/http.ts
  22. 44 0
      src/common/index.tsx
  23. 26 0
      src/components/cardModal/index.tsx
  24. 86 0
      src/components/drawer/index.tsx
  25. 20 0
      src/components/editor/config.ts
  26. 252 0
      src/components/editor/index.tsx
  27. 40 0
      src/components/editor/language/jsonlog.ts
  28. 15 0
      src/components/editor/style.scss
  29. 30 0
      src/components/logPane/index.tsx
  30. 125 0
      src/components/notification/index.tsx
  31. 23 0
      src/components/notification/notification.scss
  32. 9 0
      src/constant/index.ts
  33. 22 0
      src/extensions/action/index.ts
  34. 28 0
      src/extensions/action/keybindingAction.ts
  35. 68 0
      src/extensions/action/quickOpenAction.ts
  36. 30 0
      src/extensions/gitlab/index.ts
  37. 14 0
      src/extensions/i18n/index.ts
  38. 12 0
      src/extensions/i18n/zh-CN.json
  39. 20 0
      src/extensions/index.ts
  40. 205 0
      src/extensions/init.tsx
  41. 67 0
      src/extensions/menubar/index.ts
  42. 1 0
      src/extensions/oneDarkPro/.eslintignore
  43. 1 0
      src/extensions/oneDarkPro/.gitattributes
  44. 18 0
      src/extensions/oneDarkPro/.gitignore
  45. 20 0
      src/extensions/oneDarkPro/.vscodeignore
  46. 905 0
      src/extensions/oneDarkPro/CHANGELOG.md
  47. 21 0
      src/extensions/oneDarkPro/LICENSE.txt
  48. 240 0
      src/extensions/oneDarkPro/README.md
  49. BIN
      src/extensions/oneDarkPro/icon.png
  50. 8 0
      src/extensions/oneDarkPro/icon.svg
  51. 20 0
      src/extensions/oneDarkPro/index.ts
  52. 5 0
      src/extensions/oneDarkPro/nodemon.json
  53. 295 0
      src/extensions/oneDarkPro/package.json
  54. 14 0
      src/extensions/oneDarkPro/package.nls.json
  55. 14 0
      src/extensions/oneDarkPro/package.nls.zh-CN.json
  56. 41 0
      src/extensions/oneDarkPro/releaseNote.md
  57. 5 0
      src/extensions/oneDarkPro/renovate.json
  58. 2093 0
      src/extensions/oneDarkPro/themes/OneDark-Pro-darker.json
  59. 2157 0
      src/extensions/oneDarkPro/themes/OneDark-Pro-flat.json
  60. 2122 0
      src/extensions/oneDarkPro/themes/OneDark-Pro.json
  61. 10 0
      src/extensions/oneDarkPro/tsconfig.base.json
  62. 11 0
      src/extensions/oneDarkPro/tsconfig.json
  63. 36 0
      src/extensions/settings/index.ts
  64. 22 0
      src/extensions/theFirstExtension/base.tsx
  65. 38 0
      src/extensions/theFirstExtension/editorController.tsx
  66. 160 0
      src/extensions/theFirstExtension/folderTreeController.ts
  67. 38 0
      src/extensions/theFirstExtension/index.ts
  68. 20 0
      src/extensions/theFirstExtension/searchPaneController.ts
  69. 244 0
      src/global.css
  70. 2 0
      src/global.css.map
  71. 22 0
      src/global.scss
  72. 29 0
      src/layout/index.tsx
  73. 105 0
      src/pages/dev.tsx
  74. 102 0
      src/pages/index.tsx
  75. 7 0
      src/pages/logo.tsx
  76. 84 0
      src/pages/myMenuBar/index.tsx
  77. 38 0
      src/pages/myMenuBar/style.css
  78. 157 0
      src/pages/seec/result.tsx
  79. 55 0
      src/pages/welcome/hooks.ts
  80. 29 0
      src/pages/welcome/index.tsx
  81. 21 0
      src/pages/welcome/logo.tsx
  82. 35 0
      src/pages/welcome/name.tsx
  83. 183 0
      src/pages/workbench.tsx
  84. 87 0
      src/redux/action/action.ts
  85. 90 0
      src/redux/reducer/reducer.ts
  86. 13 0
      src/redux/store.ts
  87. 15 0
      src/services/auth.ts
  88. 6 0
      src/services/exam.ts
  89. 120 0
      src/services/logService.ts
  90. 120 0
      src/styles/common.scss
  91. 46 0
      src/styles/molecule.scss
  92. 143 0
      src/styles/reset.scss
  93. 7 0
      src/styles/theme.scss
  94. 6 0
      src/styles/variables.scss
  95. 7 0
      src/typings/index.d.ts
  96. 200 0
      src/utils/index.ts
  97. 24 0
      tailwind.config.js
  98. 25 0
      tsconfig.json

+ 1 - 0
.env

@@ -0,0 +1 @@
+INLINE_RUNTIME_CHUNK=false

+ 21 - 0
.gitignore

@@ -0,0 +1,21 @@
+# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
+
+# dependencies
+**/node_modules
+**/npm-debug.log*
+**/yarn-error.log
+**/yarn.lock
+**/package-lock.json
+
+# production
+**/dist
+**/build
+
+# misc
+.DS_Store
+
+# umi
+**/src/.umi
+**/src/.umi-production
+**/src/.umi-test
+**/.env.local

+ 63 - 0
.umirc.ts

@@ -0,0 +1,63 @@
+import { defineConfig } from 'umi';
+const MonacoWebpackPlugin = require('monaco-editor-webpack-plugin');
+
+export default defineConfig({
+    title: 'SEECODER | 软件工程学习系统',
+    favicon: '/favicon.ico',
+    hash: true,
+    ignoreMomentLocale: true,
+    targets: {
+        ios: false,
+    },
+    nodeModulesTransform: {
+        type: 'none',
+    },
+    dynamicImportSyntax: {},
+    routes: [
+        {
+            path:'/dev/:nameScope/:path/:ref',
+            component:'@/pages/dev'
+        },
+        {
+            path: '/',
+            component: '@/layout/index',
+            routes: [
+                {
+                    path: '/',
+                    component: '@/pages/index',
+                }
+            ],
+        }
+    ],
+    chainWebpack(memo, { env }) {
+        memo.output.globalObject('this').set('globalObject', 'this');
+        memo.plugin('monaco-editor').use(MonacoWebpackPlugin, [
+            {
+                languages: ['json'],
+            },
+        ]);
+
+        const isDev = env === 'development';
+        if (!isDev) {
+            // ignore *.worker.js hash
+            memo.output.set('filename', (pathData: any) => {
+                return pathData.chunk.name.endsWith('.worker')
+                    ? '[name].js'
+                    : `[name].[contenthash:8].js`;
+            });
+        }
+        return memo;
+    },
+    esbuild: {},
+    theme: {
+        'primary-color': '#3f87ff',
+        'border-radius-base': '0px',
+    },
+    proxy: {
+        '/api': {
+            'target':'http://localhost:8080',
+            'changeOrigin': true
+        }
+    },
+    tailwindcss: {},
+});

+ 12 - 0
Dockerfile

@@ -0,0 +1,12 @@
+FROM node:16-alpine as builder
+WORKDIR /code
+RUN yarn config set registry https://registry.npm.taobao.org/
+ADD package.json /code
+ADD yarn.lock /code
+RUN yarn install
+ADD . /code
+RUN yarn build --spa
+
+FROM nginx:1.19-alpine
+#COPY nginx.conf /etc/nginx/conf.d/seecoder.conf
+COPY --from=builder /code/dist/ /var/www/html/dist/

+ 46 - 0
README.md

@@ -0,0 +1,46 @@
+# Getting Started with Create React App
+
+This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app).
+
+## Available Scripts
+
+In the project directory, you can run:
+
+### `yarn start`
+
+Runs the app in the development mode.\
+Open [http://localhost:3000](http://localhost:3000) to view it in the browser.
+
+The page will reload if you make edits.\
+You will also see any lint errors in the console.
+
+### `yarn test`
+
+Launches the test runner in the interactive watch mode.\
+See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information.
+
+### `yarn build`
+
+Builds the app for production to the `build` folder.\
+It correctly bundles React in production mode and optimizes the build for the best performance.
+
+The build is minified and the filenames include the hashes.\
+Your app is ready to be deployed!
+
+See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information.
+
+### `yarn eject`
+
+**Note: this is a one-way operation. Once you `eject`, you can’t go back!**
+
+If you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project.
+
+Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own.
+
+You don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it.
+
+## Learn More
+
+You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started).
+
+To learn React, check out the [React documentation](https://reactjs.org/).

+ 74 - 0
package.json

@@ -0,0 +1,74 @@
+{
+  "name": "molecule-demo",
+  "version": "0.1.0",
+  "private": true,
+  "dependencies": {
+    "@ant-design/pro-components": "^2.3.20",
+    "@ant-design/icons": "^4.7.0",
+    "@dtinsight/molecule": "^1.2.0",
+    "@gitbeaker/browser": "^35.7.0",
+    "@testing-library/jest-dom": "^5.11.4",
+    "@testing-library/react": "^11.1.0",
+    "@testing-library/user-event": "^12.1.10",
+    "@types/jest": "^26.0.15",
+    "@types/node": "^12.0.0",
+    "@types/react": "^18.0.15",
+    "@types/react-dom": "^18.0.6",
+    "@types/redux-logger": "^3.0.9",
+    "@codingame/monaco-jsonrpc": "0.3.1",
+    "@codingame/monaco-languageclient": "0.17.4",
+    "reconnecting-websocket": "4.4.0",
+    "monaco-editor": "0.30.1",
+    "antd": "^4.22.3",
+    "classnames": "^2.3.1",
+    "react": "^18.2.0",
+    "react-dom": "^18.2.0",
+    "react-redux": "^8.0.2",
+    "react-router-dom": "6",
+    "react-scripts": "4.0.3",
+    "redux": "^4.2.0",
+    "redux-logger": "^3.0.6",
+    "styled-components": "^5.3.3",
+    "typescript": "^4.1.2",
+    "umi": "^3.5.20",
+    "web-vitals": "^1.0.1",
+    "whatwg-fetch": "^3.6.2",
+    "xterm-for-react": "^1.0.4"
+  },
+  "scripts": {
+    "start": "cross-env PORT=3000 umi dev",
+    "build": "umi build",
+    "postinstall": "umi generate tmp"
+  },
+  "eslintConfig": {
+    "extends": [
+      "react-app",
+      "react-app/jest"
+    ]
+  },
+  "browserslist": {
+    "production": [
+      ">0.2%",
+      "not dead",
+      "not op_mini all"
+    ],
+    "development": [
+      "last 1 chrome version",
+      "last 1 firefox version",
+      "last 1 safari version"
+    ]
+  },
+  "devDependencies": {
+    "cross-env": "^7.0.3",
+    "@types/lodash": "^4.14.176",
+    "@types/styled-components": "^5.1.15",
+    "@umijs/fabric": "2.7.0",
+    "@umijs/plugin-esbuild": "^1.4.1",
+    "@umijs/plugin-sass": "^1.1.1",
+    "@umijs/preset-react": "1.x",
+    "monaco-editor-webpack-plugin": "^6.0.0",
+    "react-app-rewired": "^2.1.8",
+    "umi-plugin-tailwindcss": "^3.2.1"
+  },
+  "homepage": "./"
+}

BIN
public/favicon.ico


BIN
public/favicon.png


File diff suppressed because it is too large
+ 5 - 0
public/mock/1.json


File diff suppressed because it is too large
+ 12 - 0
public/mock/2.json


+ 15 - 0
public/mock/3.json

@@ -0,0 +1,15 @@
+{
+  "id":6463,
+  "name":"TestWholeProcess",
+  "startAt":1664035200,
+  "endAt":1664467200,
+  "status":"CLOSED",
+  "creator":{"id":271,"username":"kenny67nju"},
+  "joined":true,
+  "courseId":45,
+  "url":"https://coder.seec.seecoder.cn/kenny67nju/af30ab2d4f1f41a1b4ddc725175ce584",
+  "problems":[{"id":110,"name":"plus2","type":"JAVA","description":"plus2"}],
+  "result":{"id":6464,"score":0},
+  "created_at":1664078630,
+  "course":"PortalTestCoder1"
+}

+ 62 - 0
public/mock/dataSource.json

@@ -0,0 +1,62 @@
+{
+    "code": 200,
+    "message": "success",
+    "data": {
+        "id": 0,
+        "name": "DataSource",
+        "fileType": "RootFolder",
+        "isLeaf": false,
+        "data": "",
+        "children": [
+            {
+                "id": 5,
+                "name": "Relations",
+                "isLeaf": false,
+                "fileType": "Folder",
+                "children": [{
+                    "id": 11,
+                    "name": "database1.mysql",
+                    "icon": "database",
+                    "fileType": "File",
+                    "isLeaf": true
+                }, {
+                    "id": 12,
+                    "icon": "database",
+                    "name": "database2.oracle",
+                    "isLeaf": true
+                }, {
+                    "id": 13,
+                    "icon": "database",
+                    "name": "database3.postgresql",
+                    "isLeaf": true,
+                    "fileType": "File"
+                }]
+            },
+            {
+                "id": 1,
+                "name": "source1",
+                "icon": "database",
+                "fileType": "File",
+                "isLeaf": true
+            }, {
+                "id": 2,
+                "name": "source2",
+                "icon": "database",
+                "fileType": "File",
+                "isLeaf": true
+            }, {
+                "id": 3,
+                "icon": "database",
+                "name": "source3",
+                "fileType": "File",
+                "isLeaf": true
+            }, {
+                "id": 4,
+                "name": "source4",
+                "icon": "database",
+                "fileType": "File",
+                "isLeaf": true
+            }
+        ]
+    }
+}

+ 88 - 0
public/mock/folderTree.json

@@ -0,0 +1,88 @@
+{
+    "code": 200,
+    "message": "success",
+    "data": {
+        "id": 0,
+        "isEditable": false,
+        "name": "Molecule-Demo",
+        "fileType": "RootFolder",
+        "location": "Molecule-Demo",
+        "isLeaf": false,
+        "data": "",
+        "children": [
+            {
+                "id": 1,
+                "name": "test.js",
+                "location": "Molecule-Demo/test.js",
+                "fileType": "File",
+                "isLeaf": true,
+                "isEditable": false,
+                "data": { "language": "javascript", "value": "console.log('Hello World');" }
+            }, {
+                "id": 2,
+                "name": "test.py",
+                "fileType": "File",
+                "location": "Molecule-Demo/test.py",
+                "isLeaf": true,
+                "isEditable": false,
+                "data": { "language": "python", "value": "for letter in 'Python':     # 第一个实例\n   print(\"当前字母: %s\" % letter)\n \nfruits = ['banana', 'apple',  'mango']\nfor fruit in fruits:        # 第二个实例\n   print ('当前水果: %s'% fruit)\n \nprint (\"Good bye!\")" }
+            }, {
+                "id": 3,
+                "name": "index.html",
+                "fileType": "File",
+                "location": "Molecule-Demo/index.html",
+                "isLeaf": true,
+                "isEditable": false,
+                "data": { "language": "html", "value": "<div id=\"molecule\">Hello Molecule</div>" }
+            }, {
+                "id": 4,
+                "name": "test.json",
+                "fileType": "File",
+                "location": "Molecule-Demo/test.json",
+                "isLeaf": true,
+                "isEditable": false,
+                "data": { "language": "json", "value": "{ \"language\": \"json\", \"value\": \"{}\" }" }
+            }, {
+                "id": 5,
+                "name": "Sub Folder",
+                "isLeaf": false,
+                "fileType": "Folder",
+                "isEditable": false,
+                "location": "Molecule-Demo/Sub Folder",
+                "children": [{
+                    "id": 11,
+                    "name": "test.js",
+                    "fileType": "File",
+                    "isEditable": false,
+                    "location": "Molecule-Demo/Sub Folder/test.js",
+                    "isLeaf": true,
+                    "data": { "language": "javascript", "value": "console.log('Hello World');" }
+                }, {
+                    "id": 12,
+                    "name": "test.css",
+                    "isEditable": false,
+                    "location": "Molecule-Demo/Sub Folder/test.css",
+                    "isLeaf": true,
+                    "fileType": "File",
+                    "data": { "language": "css", "value": "mo { background-color: var(--workbenchBackground); color: var(--foreground); }" }
+                }, {
+                    "id": 13,
+                    "name": "index.html",
+                    "isEditable": false,
+                    "location": "Molecule-Demo/Sub Folder/index.html",
+                    "isLeaf": true,
+                    "fileType": "File",
+                    "data": { "language": "html", "value": "<div id=\"molecule\">Hello Molecule</div>" }
+                }, {
+                    "id": 14,
+                    "name": "test.json",
+                    "isEditable": false,
+                    "location": "Molecule-Demo/Sub Folder/test.json",
+                    "isLeaf": true,
+                    "fileType": "File",
+                    "data": { "language": "json", "value": "{ \"language\": \"json\", \"value\": \"{}\" }" }
+                }]
+            }
+        ]
+    }
+}

BIN
src/.sass-cache/28a7e104821cb614ea3923d4ee9d48c667252299/global.scssc


BIN
src/.sass-cache/31b9b8716863e79b69e689a9b340db2955903fe0/common.scssc


BIN
src/.sass-cache/31b9b8716863e79b69e689a9b340db2955903fe0/molecule.scssc


BIN
src/.sass-cache/31b9b8716863e79b69e689a9b340db2955903fe0/reset.scssc


BIN
src/.sass-cache/31b9b8716863e79b69e689a9b340db2955903fe0/theme.scssc


BIN
src/.sass-cache/31b9b8716863e79b69e689a9b340db2955903fe0/variables.scssc


File diff suppressed because it is too large
+ 160 - 0
src/api/index.ts


+ 95 - 0
src/common/http.ts

@@ -0,0 +1,95 @@
+import 'whatwg-fetch';
+import {store} from "@/redux/store";
+import {jumpToLogin} from "@/services/auth";
+import {getCookie} from "@/utils";
+
+class Http {
+
+    get(url: any, params?: any) {
+        const newUrl = params ? this.build(url, params) : url;
+        return this.request(newUrl, {
+            method: 'GET',
+        });
+    }
+
+    post(url: any, body?: any) {
+        const options: any = { method: 'POST' };
+        options.headers = this.defaultHeader()
+        if (body) options.body = JSON.stringify(body);
+        return this.request(url, options);
+    }
+
+    postAsFormData(url: any, params: any) {
+        const options: any = { method: 'POST' };
+        options.headers = this.defaultHeader()
+        if (params) options.body = this.buildFormData(params);
+        return this.request(url, options);
+    }
+
+    postForm(url: any, form: any) {
+        const options: any = { method: 'POST' };
+        options.headers = this.defaultHeader()
+        if (form) options.body = new FormData(form);
+        return this.request(url, options);
+    }
+
+    request(url: any, options: RequestInit) {
+        options.credentials = 'same-origin';
+        if (!getCookie('token')) {
+            jumpToLogin()
+        }
+        options.headers = {
+            Authorization: getCookie('token') as string,
+            ...options.headers,
+        };
+        return (
+            fetch(url, options)
+                .then((response: any) => {
+                    return response.json();
+                })
+                .then((res) => {
+                    if (res.err === 401) jumpToLogin()
+                    return res;
+                })
+                .catch((err: any) => {
+                    return err;
+                })
+        );
+    }
+
+    defaultHeader() {
+        const header: any = {
+            Accept: '*/*',
+            'Content-Type': 'application/json',
+        };
+        return header;
+    }
+
+    build(url: any, params: any) {
+        const ps: any = [];
+        if (params) {
+            for (const p in params) {
+                if (p) {
+                    ps.push(p + '=' + encodeURIComponent(params[p]));
+                }
+            }
+        }
+        return url + '?' + ps.join('&');
+    }
+
+    buildFormData(params: any) {
+        if (params) {
+            const data = new FormData();
+            for (const p in params) {
+                if (p) {
+                    data.append(p, params[p]);
+                }
+            }
+            return data;
+        }
+    }
+}
+
+const httpUtils = new Http();
+
+export default httpUtils;

+ 44 - 0
src/common/index.tsx

@@ -0,0 +1,44 @@
+import {IEditorTab, IFolderTreeNodeProps} from '@dtinsight/molecule/esm/model';
+import Editor from '../components/editor'
+
+export function transformToEditorTab(item: IFolderTreeNodeProps): IEditorTab {
+    if (item.readOnly) return {
+        ...item,
+        id: item.id?.toString(),
+        breadcrumb: item.location
+            ? item.location
+                .split('/')
+                .map((local: string, index, array) => ({id: array.slice(0, index+1).join('/'), name: local}))
+            : [],
+        renderPane: () => {
+            return (<Editor
+                language={item.data.language}
+                value={item.data.value}
+                sync
+                options={{
+                    automaticLayout: true,
+                    readOnly: true,
+                    wordWrap: 'on',
+                    contextmenu: false,
+                    scrollBeyondLastLine: true,
+                    minimap: {
+                        enabled: false,
+                    },
+                }}
+            />)
+        }
+    }
+    else return {
+        ...item,
+        id: item.id?.toString(),
+        data: {
+            path: item.location,
+            ...(item.data || {}),
+        },
+        breadcrumb: item.location
+            ? item.location
+                .split('/')
+                .map((local: string, index, array) => ({id: array.slice(0, index+1).join('/'), name: local}))
+            : []
+    };
+}

+ 26 - 0
src/components/cardModal/index.tsx

@@ -0,0 +1,26 @@
+import {Card, Modal} from "antd";
+import LogPane from "@/components/logPane";
+
+interface ICardModalProps {
+    title: string;
+    open: boolean;
+    text: string;
+}
+
+export default ({
+    title,
+    open,
+    text
+}: ICardModalProps) => {
+    return (
+        <Modal
+            title = {title}
+            open= {open}
+            centered
+            footer={null}
+            style={{height: '50vh',
+                minHeight: '480px'}}>
+            <LogPane value={text} />
+        </Modal>
+    )
+}

+ 86 - 0
src/components/drawer/index.tsx

@@ -0,0 +1,86 @@
+import { useLayoutEffect, useState } from 'react';
+import { history } from 'umi';
+import type { DrawerProps } from 'antd';
+import { Drawer } from 'antd';
+import React from 'react';
+
+interface CustomDrawerProps extends DrawerProps {
+    id: string;
+    renderContent?: () => React.ReactNode;
+    update?: boolean;
+}
+
+const defaultConfig: DrawerProps = {
+    width: '80%',
+};
+
+const removePopUpMenu = () => {
+    const remove = () => {
+        const tips = document.querySelectorAll<HTMLDivElement>('.mxPopupMenu');
+        if (tips) {
+            tips.forEach((o) => {
+                // eslint-disable-next-line no-param-reassign
+                o.style.visibility = 'hidden';
+            });
+        }
+    };
+    setTimeout(remove, 500);
+};
+
+const drawerListeners: Record<
+    string,
+    (renderContent: CustomDrawerProps['renderContent'], props: Partial<DrawerProps>) => void
+    > = {};
+
+export function updateDrawer({ id, renderContent, ...restProps }: CustomDrawerProps) {
+    drawerListeners[id](renderContent, restProps);
+}
+
+export default function CustomDrawer({ id, renderContent, ...restProps }: CustomDrawerProps) {
+    const [, setForceRender] = useState(false);
+    const [drawerConfig, setConfig] = useState(restProps);
+
+    const [childrenRender, setChildrenRender] = useState<CustomDrawerProps['renderContent']>(
+        () => renderContent,
+    );
+
+    const forceRender = (
+        contentFn?: CustomDrawerProps['renderContent'],
+        {
+            update = false,
+            ...restDrawerProps
+        }: Omit<CustomDrawerProps, 'renderContent' | 'id'> = {},
+    ) => {
+        setConfig((config) =>
+            update ? { ...config, ...restDrawerProps } : { ...restDrawerProps },
+        );
+        if (contentFn) {
+            setChildrenRender(() => contentFn);
+        }
+        setForceRender((f) => !f);
+    };
+
+    useLayoutEffect(() => {
+        drawerListeners[id] = forceRender;
+    }, []);
+
+    const handleCloseDrawer = () => {
+        history.push({
+            query: {},
+        });
+        drawerListeners[id](() => null, { visible: false });
+        removePopUpMenu();
+    };
+
+    return (
+        <Drawer
+            getContainer={() => document.querySelector('.mo-mainBench') || document.body}
+            style={{ position: 'absolute' }}
+            onClose={handleCloseDrawer}
+            {...defaultConfig}
+            {...drawerConfig}
+        >
+            {childrenRender && childrenRender()}
+        </Drawer>
+    );
+}

+ 20 - 0
src/components/editor/config.ts

@@ -0,0 +1,20 @@
+import type { editor } from '@dtinsight/molecule/esm/monaco';
+
+export const defaultOptions: editor.IStandaloneEditorConstructionOptions = {
+    language: 'typescript',
+    readOnly: false,
+    contextmenu: false,
+    autoIndent: 'brackets',
+    automaticLayout: true,
+    showFoldingControls: 'always',
+    folding: true,
+    foldingStrategy: 'auto',
+    suggestFontSize: 12,
+    fontSize: 12,
+    suggest: {
+        showIcons: false,
+    },
+    wordWrap: 'on',
+    fixedOverflowWidgets: true,
+    renderControlCharacters: true,
+};

+ 252 - 0
src/components/editor/index.tsx

@@ -0,0 +1,252 @@
+import type {CSSProperties} from 'react';
+import {useEffect, useRef} from 'react';
+import * as monaco from '@dtinsight/molecule/esm/monaco';
+import classNames from 'classnames';
+import {defaultOptions} from './config';
+import './language/jsonlog';
+import './style.scss';
+
+interface IEditorProps {
+    className?: string;
+    style?: CSSProperties;
+    value?: string;
+    language?: string;
+    sync?: boolean;
+    options?: monaco.editor.IStandaloneEditorConstructionOptions;
+    cursorPosition?: monaco.IPosition;
+    placeholder?: string;
+    onChange?: (value: string, instance: monaco.editor.IStandaloneCodeEditor) => void;
+    onBlur?: (value: string) => void;
+    onFocus?: (value: string) => void;
+    onCursorSelection?: (value: string) => void;
+}
+
+export default function Editor({
+                                   className,
+                                   style,
+                                   options,
+                                   value,
+                                   sync,
+                                   language,
+                                   cursorPosition,
+                                   placeholder,
+                                   onChange,
+                                   onBlur,
+                                   onFocus,
+                                   onCursorSelection,
+                               }: IEditorProps) {
+    const container = useRef<HTMLDivElement>(null);
+    const monacoEditor = useRef<monaco.editor.IStandaloneCodeEditor>();
+    const placeholderDOM = useRef<HTMLPreElement>(null);
+
+    const initMonaco = () => {
+        if (container.current) {
+            const editorOptions = {
+                ...defaultOptions,
+                ...options,
+                value,
+                language: language || 'sql',
+            };
+
+            monacoEditor.current = monaco.editor.create(container.current, editorOptions);
+
+            handleShowPlaceholder(value);
+
+            if (monacoEditor.current && cursorPosition) {
+                monacoEditor.current.setPosition(cursorPosition);
+                monacoEditor.current.focus();
+                monacoEditor.current.revealPosition(
+                    cursorPosition,
+                    monaco.editor.ScrollType.Immediate,
+                );
+            }
+
+            initEditor();
+            registerCommands();
+        }
+    };
+
+    /**
+     * TODO: I don't why lost these commands, it should be figure it out after a while
+     */
+    const registerCommands = () => {
+        if (monacoEditor.current) {
+            monacoEditor.current.addCommand(monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyZ, () => {
+                monacoEditor.current?.trigger('editor', 'undo', null);
+            });
+
+            monacoEditor.current.addCommand(monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyA, () => {
+                monacoEditor.current?.trigger('editor', 'editor.action.selectAll', null);
+            });
+
+            monacoEditor.current.addCommand(
+                monaco.KeyMod.CtrlCmd | monaco.KeyMod.Shift | monaco.KeyCode.KeyA,
+                () => {
+                    monacoEditor.current?.trigger('editor', 'redo', null);
+                },
+            );
+
+            // disabled these global commands in editor
+            monacoEditor.current.addCommand(monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyF, () => {
+            });
+            monacoEditor.current.addCommand(monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyK, () => {
+            });
+            monacoEditor.current.addCommand(monaco.KeyMod.CtrlCmd | monaco.KeyCode.Comma, () => {
+            });
+            monacoEditor.current.addCommand(
+                monaco.KeyMod.CtrlCmd | monaco.KeyMod.Shift | monaco.KeyCode.KeyP,
+                () => {
+                },
+            );
+        }
+    };
+
+    const initEditorEvent = () => {
+        if (monacoEditor.current) {
+            monacoEditor.current.onDidChangeModelContent(() => {
+                const newValue = monacoEditor.current!.getValue();
+                if (onChange) {
+                    onChange(newValue, monacoEditor.current!);
+                }
+                handleShowPlaceholder(newValue);
+            });
+
+            monacoEditor.current.onDidBlurEditorText(() => {
+                if (onBlur) {
+                    const val = monacoEditor.current!.getValue();
+                    onBlur(val);
+                }
+            });
+
+            monacoEditor.current.onDidBlurEditorWidget(() => {
+                handleShowPlaceholder(monacoEditor.current!.getValue());
+            });
+
+            monacoEditor.current.onDidFocusEditorText(() => {
+                if (onFocus) {
+                    const val = monacoEditor.current!.getValue();
+                    onFocus(val);
+                }
+            });
+
+            monacoEditor.current.onDidChangeCursorSelection(() => {
+                const ranges = monacoEditor.current!.getSelections() || [];
+                const model = monacoEditor.current!.getModel();
+                let selectionContent = '';
+                if (model) {
+                    for (let i = 0; i < ranges.length; i += 1) {
+                        selectionContent += model.getValueInRange(ranges[i]);
+                    }
+                }
+                if (onCursorSelection) {
+                    onCursorSelection(selectionContent);
+                }
+            });
+            /**
+             * 改变contextMenu的定位为fixed,避免容器内overflow:hidden属性截断contextMenu
+             */
+            monacoEditor.current.onContextMenu((e) => {
+                const contextMenuElement = monacoEditor.current
+                    ?.getDomNode()
+                    ?.querySelector<HTMLElement>('.monaco-menu-container');
+
+                if (contextMenuElement) {
+                    const posY =
+                        e.event.posy + contextMenuElement.clientHeight > window.innerHeight
+                            ? e.event.posy - contextMenuElement.clientHeight
+                            : e.event.posy;
+
+                    const posX =
+                        e.event.posx + contextMenuElement.clientWidth > window.innerWidth
+                            ? e.event.posx - contextMenuElement.clientWidth
+                            : e.event.posx;
+
+                    contextMenuElement.style.position = 'fixed';
+                    contextMenuElement.style.top = `${Math.max(0, Math.floor(posY))}px`;
+                    contextMenuElement.style.left = `${Math.max(0, Math.floor(posX))}px`;
+                }
+            });
+        }
+    };
+
+    const initEditor = () => {
+        initEditorEvent();
+    };
+
+    const handleShowPlaceholder = (val?: string) => {
+        if (!val) {
+            placeholderDOM.current!.style.display = 'initial';
+        } else {
+            placeholderDOM.current!.style.display = 'none';
+        }
+    };
+
+    const destroyMonaco = () => {
+        if (monacoEditor.current) {
+            monacoEditor.current.dispose();
+        }
+    };
+
+    useEffect(() => {
+        if (monacoEditor.current) {
+            if (sync) {
+                /**
+                 * value更新, 并且含有sync同步标记,则更新编辑器值
+                 */
+                const editorText = value || '';
+                monacoEditor.current.setValue(editorText);
+                handleShowPlaceholder(editorText);
+
+                const currentLanguage = monacoEditor.current.getModel()?.getLanguageId();
+                const isScrollToBottom = currentLanguage?.endsWith('log');
+                if (isScrollToBottom) {
+                    monacoEditor.current.revealLineInCenterIfOutsideViewport(
+                        monacoEditor.current.getModel()!.getLineCount(),
+                    );
+                }
+            }
+        }
+    }, [value]);
+
+    useEffect(() => {
+        if (monacoEditor.current) {
+            monaco.editor.setModelLanguage(monacoEditor.current.getModel()!, language || 'ini');
+        }
+    }, [language]);
+
+    useEffect(() => {
+        if (monacoEditor.current && options) {
+            monacoEditor.current.updateOptions(options);
+        }
+    }, [options]);
+
+    useEffect(() => {
+        initMonaco();
+
+        return () => {
+            destroyMonaco();
+        };
+    }, []);
+
+    return (
+        <div
+            className={classNames('code-editor', className)}
+            style={{
+                position: 'relative',
+                minHeight: '400px',
+                height: '100%',
+                width: '100%',
+                ...style,
+            }}
+            ref={container}
+        >
+			<pre
+                ref={placeholderDOM}
+                className="dt-placeholder"
+                style={{fontSize: options?.fontSize || 12}}
+            >
+				{placeholder}
+			</pre>
+        </div>
+    );
+}

+ 40 - 0
src/components/editor/language/jsonlog.ts

@@ -0,0 +1,40 @@
+import * as monaco from '@dtinsight/molecule/esm/monaco';
+
+const jsonlog = 'jsonlog';
+
+// register json log for view json data with log informations
+monaco.languages.register({ id: jsonlog });
+monaco.languages.setMonarchTokensProvider(jsonlog, {
+    tokenizer: {
+        root: [
+            // split
+            [/^===========.*/, { token: 'comment' }],
+            [/[;,.]/, 'delimiter'],
+
+            // string
+            [/"/, { token: 'string.quote', bracket: '@open', next: '@string' }],
+
+            // numbers
+            [/\d*\.\d+([eE][-+]?\d+)?/, 'number.float'],
+            [/0[xX][0-9a-fA-F]+/, 'number.hex'],
+            [/\d+.*/, 'number'],
+
+            // boolean
+            [/false|true/, 'keyword'],
+
+            // chinese character
+            [/[\u4e00-\u9fa5]+/, 'keyword'],
+
+            // error message
+            [/<error.*/, 'error-token'],
+            [/<warning.*/, 'warn-token'],
+            [/<info.*/, 'info-token'],
+            [/\[[a-zA-Z 0-9:]+\]/, 'comment'],
+        ],
+        string: [
+            [/[^\\"]+/, 'string'],
+            [/\\./, 'string.escape.invalid'],
+            [/"/, { token: 'string.quote', bracket: '@close', next: '@pop' }],
+        ],
+    },
+});

+ 15 - 0
src/components/editor/style.scss

@@ -0,0 +1,15 @@
+.dt-placeholder {
+  position: absolute;
+  top: 0;
+  left: 65px;
+  z-index: 1;
+  display: none;
+  width: calc(100% - 75px);
+  height: 100%;
+  overflow: hidden;
+  color: var(--input-placeholderForeground);
+  font-style: italic;
+  white-space: pre-line;
+  opacity: 0.6;
+  pointer-events: none;
+}

+ 30 - 0
src/components/logPane/index.tsx

@@ -0,0 +1,30 @@
+import Editor from '../editor';
+
+interface ILogEditorProps {
+    value: string
+}
+
+export default ({
+    value
+}: ILogEditorProps) => {
+
+
+    return (
+        <Editor
+            language="jsonlog"
+            value={value}
+            sync
+            options={{
+                automaticLayout: true,
+                readOnly: true,
+                wordWrap: 'on',
+                contextmenu: false,
+                scrollBeyondLastLine: true,
+                lineNumbers: 'off',
+                minimap: {
+                    enabled: false,
+                },
+            }}
+        />
+    );
+}

+ 125 - 0
src/components/notification/index.tsx

@@ -0,0 +1,125 @@
+import { CheckCircleOutlined, CloseCircleOutlined , ExclamationOutlined} from '@ant-design/icons';
+import molecule from '@dtinsight/molecule';
+import { notification as antNotification } from 'antd';
+import type { ArgsProps } from 'antd/lib/notification';
+import './notification.scss';
+
+type INotificationConfigs = Pick<ArgsProps, 'message'> & { key: string };
+
+class Index {
+    private assertNotExistNotification(key: string) {
+        const { data } = molecule.notification.getState();
+        return !data?.find((n) => n.id === key);
+    }
+    private showNotification() {
+        const { showNotifications } = molecule.notification.getState();
+        if (!showNotifications) {
+            molecule.notification.toggleNotification();
+        }
+    }
+    private highlightNotification(key: string) {
+        const notificationItem = document.getElementById(key)?.parentElement;
+        if (notificationItem) {
+            notificationItem.tabIndex = 0;
+            notificationItem.focus();
+        }
+    }
+    /**
+     * Add a notification both in antd and molecule
+     */
+    openWithMolecule(config: INotificationConfigs) {
+        const { showNotifications } = molecule.notification.getState();
+        // the antd's notification pops up only when the molecule's notification invisible
+        if (!showNotifications) {
+            antNotification.open({
+                key: config.key,
+                message: config.message,
+                placement: 'bottomRight',
+                className: 'dt-notification',
+                duration: 8,
+                closeIcon: <></>,
+                onClose() {},
+                onClick: () => {
+                    antNotification.close(config.key);
+                    this.showNotification();
+                    setTimeout(() => {
+                        this.highlightNotification(config.key);
+                    }, 0);
+                },
+            });
+        }
+
+        if (this.assertNotExistNotification(config.key)) {
+            molecule.notification.add([
+                {
+                    id: config.key,
+                    value: '',
+                    render() {
+                        return config.message;
+                    },
+                },
+            ]);
+        }
+    }
+
+    /**
+     * Open a notification both in antd and molecule in bottomRight with danger icon
+     */
+    error({ key, message }: { key: string; message: string }) {
+        this.openWithMolecule({
+            key,
+            message: (
+                <>
+                    <CloseCircleOutlined
+                        style={{
+                            color: 'var(--editorError-foreground)',
+                            marginRight: 5,
+                        }}
+                    />
+                    <span id={key} title={message}>
+						{message}
+					</span>
+                </>
+            ),
+        });
+    }
+
+    info({ key, message }: { key: string; message: string }) {
+        this.openWithMolecule({
+            key,
+            message: (
+                <>
+                    <ExclamationOutlined
+                        style={{
+                            color: '#1890ff',
+                            marginRight: 5,
+                        }}
+                    />
+                    <span id={key} title={message}>
+						{message}
+					</span>
+                </>
+            ),
+        });
+    }
+
+    success({ key, message }: { key: string; message: string }) {
+        this.openWithMolecule({
+            key,
+            message: (
+                <>
+                    <CheckCircleOutlined
+                        style={{
+                            color: 'var(--terminal-ansiBrightGreen)',
+                            marginRight: 5,
+                        }}
+                    />
+                    <span id={key} title={message}>
+						{message}
+					</span>
+                </>
+            ),
+        });
+    }
+}
+export default new Index();

+ 23 - 0
src/components/notification/notification.scss

@@ -0,0 +1,23 @@
+@import '../../styles/variables.scss';
+
+.dt-notification.ant-notification-notice {
+  padding: 5px 13px;
+  cursor: pointer;
+
+  .ant-notification-notice-message {
+    margin-bottom: 0;
+    overflow: hidden;
+    font-size: $font-size;
+    white-space: nowrap;
+    text-overflow: ellipsis;
+  }
+
+  .ant-notification-notice-close {
+    top: 6px;
+    right: 14px;
+  }
+
+  &:hover {
+    background-color: var(--button-hoverBackground);
+  }
+}

+ 9 - 0
src/constant/index.ts

@@ -0,0 +1,9 @@
+export enum ID_COLLECTIONS{
+    COLOR_THEME_ID = 'colorTheme',
+    OUTPUT_LOG_ID = 'panel.output.log',
+}
+
+export enum DRAWER_MENU_ENUM {
+    RESULT = 'result',
+    SUBMIT = 'submit'
+}

+ 22 - 0
src/extensions/action/index.ts

@@ -0,0 +1,22 @@
+
+import { IExtension } from '@dtinsight/molecule/esm/model/extension';
+import { IExtensionService } from '@dtinsight/molecule/esm/services';
+
+import { KeybindingAction } from './keybindingAction';
+import { QuickOpenAction } from './quickOpenAction';
+
+export class ActionExtension implements IExtension {
+
+    id: string = 'actionExtension';
+    name: string = 'Action Extension';
+
+    activate(extensionCtx: IExtensionService): void {
+        // Register the Action
+        extensionCtx.registerAction(QuickOpenAction);
+        extensionCtx.registerAction(KeybindingAction);
+    }
+
+    dispose(extensionCtx: IExtensionService): void {
+        throw new Error('Method not implemented.');
+    }
+}

+ 28 - 0
src/extensions/action/keybindingAction.ts

@@ -0,0 +1,28 @@
+import { KeybindingWeight } from "@dtinsight/molecule/esm/monaco/common";
+import { KeyCode, KeyMod } from "@dtinsight/molecule/esm/monaco";
+import { Action2 } from '@dtinsight/molecule/esm/monaco/action';
+//@ts-ignore
+import { KeyChord } from 'monaco-editor/esm/vs/base/common/keyCodes';
+
+export class KeybindingAction extends Action2 {
+
+    static readonly ID = 'AutoSave';
+
+    constructor() {
+        super({
+            id: KeybindingAction.ID,
+            precondition: undefined,
+            f1: false, // Not show in the Command Palette
+            keybinding: {
+                weight: KeybindingWeight.WorkbenchContrib,
+                when: undefined,
+                primary: KeyChord(KeyMod.CtrlCmd | KeyCode.KeyS)
+            },
+        })
+    }
+
+    run(accessor: any, ...args: any[]) {
+        alert('Save success!');
+        // do something
+    }
+}

+ 68 - 0
src/extensions/action/quickOpenAction.ts

@@ -0,0 +1,68 @@
+import { KeybindingWeight } from "@dtinsight/molecule/esm/monaco/common";
+import { KeyCode, KeyMod } from "@dtinsight/molecule/esm/monaco";
+import { Action2 } from '@dtinsight/molecule/esm/monaco/action';
+import {
+    IQuickInputService,
+    //@ts-ignore
+} from 'monaco-editor/esm/vs/platform/quickinput/common/quickInput';
+//@ts-ignore
+import { KeyChord } from 'monaco-editor/esm/vs/base/common/keyCodes';
+
+import molecule from '@dtinsight/molecule';
+import { debounce } from "lodash";
+
+import API from '../../api';
+import { transformToEditorTab } from '../../common';
+
+export class QuickOpenAction extends Action2 {
+
+    static readonly ID = 'QuickOpenFile';
+    static readonly LABEL = 'Search files by name';
+
+    constructor() {
+        super({
+            id: QuickOpenAction.ID,
+            label: QuickOpenAction.LABEL,
+            title: QuickOpenAction.LABEL,
+            alias: QuickOpenAction.LABEL,
+            precondition: undefined,
+            f1: true, // Whether show the QuickOpenFile in Command Palette
+            keybinding: {
+                weight: KeybindingWeight.WorkbenchContrib,
+                when: undefined,
+                primary: KeyChord(KeyMod.CtrlCmd | KeyCode.KeyP)
+            },
+        })
+    }
+
+    run(accessor: any, ...args: any[]) {
+        const quickInputService = accessor.get(IQuickInputService);
+
+        const quickPick = quickInputService.createQuickPick();
+        quickPick.items = [];
+        quickPick.placeholder = QuickOpenAction.LABEL;
+
+        quickPick.activeItems = [];
+        quickPick.canSelectMany = false;
+
+        const queryPick = debounce((value) => {
+            API.query(value).then(res => {
+                quickPick.items = res.map(item => {
+                    item.label = item.name;
+                    return item;
+                });
+            });
+        }, 300);
+
+        quickPick.onDidChangeValue(queryPick);
+
+        quickPick.onDidAccept((i: any) => {
+            const item = quickPick.activeItems[0];
+            if (item) {
+                molecule.editor.open(transformToEditorTab(item));
+            }
+            quickPick.hide();
+        });
+        quickPick.show();
+    }
+}

+ 30 - 0
src/extensions/gitlab/index.ts

@@ -0,0 +1,30 @@
+import molecule from '@dtinsight/molecule';
+import { IExtension } from '@dtinsight/molecule/esm/model/extension';
+import { IExtensionService } from '@dtinsight/molecule/esm/services';
+import {jumpToLogin} from "@/services/auth";
+import Api from "@/api";
+
+const GoToGitlabExtensionID = 'GoToGitlabExtension';
+
+export const GoToGitlabExtension: IExtension = {
+
+    id: GoToGitlabExtensionID,
+    name: 'Go To Github',
+
+    activate(extensionCtx: IExtensionService): void {
+        molecule.activityBar.add({
+            id: GoToGitlabExtensionID,
+            icon: 'source-control',
+        });
+
+        molecule.activityBar.onClick(async (id) => {
+            if (id === GoToGitlabExtensionID) {
+                const res = await Api.current()
+            }
+        })
+    },
+
+    dispose(extensionCtx: IExtensionService): void {
+        molecule.activityBar.remove(GoToGitlabExtensionID);
+    }
+}

+ 14 - 0
src/extensions/i18n/index.ts

@@ -0,0 +1,14 @@
+import { IContributeType, IExtension } from "@dtinsight/molecule/esm/model";
+
+const zhCN = require('./zh-CN.json');
+const locales = [zhCN];
+
+export const ExtendLocales: IExtension = {
+    id: 'ExtendLocales',
+    name: 'Extend locales',
+    contributes: {
+        [IContributeType.Languages]: locales,
+    },
+    activate() {},
+    dispose() {},
+};

+ 12 - 0
src/extensions/i18n/zh-CN.json

@@ -0,0 +1,12 @@
+{
+    "id": "custom-zh-CN",
+    "name": "简体中文 - 自定义",
+    "inherit": "zh-CN",
+    "source": {
+        "menu.file": "文件",
+        "menu.newFile": "新建任务",
+        "demo.running": "运行",
+        "demo.dataSourceManagement": "数据源管理",
+        "demo.terminal": "终端"
+    }
+}

+ 20 - 0
src/extensions/index.ts

@@ -0,0 +1,20 @@
+import { IExtension } from '@dtinsight/molecule/esm/model';
+import { FirstExtension } from './theFirstExtension';
+import { OneDarkPro } from './oneDarkPro';
+import { SettingsExtension } from './settings';
+import { MenuBarExtension } from './menubar';
+import { ActionExtension } from './action';
+import { GoToGitlabExtension } from './gitlab';
+import InitializeExtension from "./init";
+
+const extensions: IExtension[] = [
+    new FirstExtension(),
+    new SettingsExtension(),
+    new MenuBarExtension(),
+    new ActionExtension(),
+    GoToGitlabExtension,
+    OneDarkPro,
+    new InitializeExtension(),
+];
+
+export default extensions;

+ 205 - 0
src/extensions/init.tsx

@@ -0,0 +1,205 @@
+import molecule from "@dtinsight/molecule";
+import {ColorThemeMode, IActivityMenuItemProps} from "@dtinsight/molecule/esm/model";
+import {DRAWER_MENU_ENUM, ID_COLLECTIONS} from "../constant";
+import {UniqueId} from "@dtinsight/molecule/esm/common/types";
+import {IExtension} from "@dtinsight/molecule/esm/model/extension";
+import LogPane from "@/components/logPane";
+import {store} from "@/redux/store";
+import {jumpToLogin} from "@/services/auth";
+import Api from "@/api";
+import {history} from "umi";
+import notification from "@/components/notification";
+import {deleteCookie, getQuestion, goToLogin, updateAccountContext} from "@/utils";
+import {loadUser} from "@/redux/action/action";
+import {QuickTogglePanelAction} from "@dtinsight/molecule/esm/monaco/quickTogglePanelAction";
+import {Button} from "antd";
+import {jumpToCoder} from "@/services/exam";
+import classNames from "classnames";
+
+function loadStyles(url: string) {
+    const link = document.createElement('link');
+    link.rel = 'stylesheet';
+    link.type = 'text/css';
+    link.href = url;
+    link.id = 'antd_dark';
+    if (!document.getElementById('antd_dark')) {
+        const head = document.getElementsByTagName('head')[0];
+        head.appendChild(link);
+    }
+}
+
+function removeStyles() {
+    const darkStyle = document.querySelector('#antd_dark');
+    darkStyle?.remove();
+}
+
+export default class InitializeExtension implements IExtension {
+    id: UniqueId = 'initialize';
+    name: string = 'initialize';
+
+    activate(): void {
+        const { CONTEXT_MENU_SEARCH } = molecule.builtin.getConstants();
+        molecule.activityBar.remove([CONTEXT_MENU_SEARCH!]);
+        initializeColorTheme();
+        initMenuBar();
+        initLogin();
+        initializeEntry();
+        initExpandCollapse();
+        initExplorer();
+        // 默认不展示 Panel
+    }
+
+    dispose(): void {
+        throw new Error('Method not implemented.');
+    }
+}
+
+function initializeColorTheme() {
+    const defaultThemeId = localStorage.getItem(ID_COLLECTIONS.COLOR_THEME_ID);
+    const defaultTheme = defaultThemeId && molecule.colorTheme.getThemeById(defaultThemeId);
+    if (defaultTheme) {
+        molecule.colorTheme.setTheme(defaultTheme.id);
+    } else {
+        molecule.colorTheme.setTheme('One Dark Pro');
+    }
+
+    const currentThemeMode = molecule.colorTheme.getColorThemeMode();
+    if (currentThemeMode === ColorThemeMode.dark) {
+        loadStyles('https://unpkg.com/antd@4.20.3/dist/antd.dark.css');
+    }
+    document.documentElement.setAttribute('data-prefers-color', currentThemeMode);
+
+    molecule.colorTheme.onChange((_, nextTheme, themeMode) => {
+        localStorage.setItem(ID_COLLECTIONS.COLOR_THEME_ID, nextTheme.id);
+        document.documentElement.setAttribute('data-prefers-color', themeMode);
+
+        if (themeMode === ColorThemeMode.dark) {
+            loadStyles('https://unpkg.com/antd@4.20.3/dist/antd.dark.css');
+        } else {
+            removeStyles();
+        }
+    });
+}
+
+function initMenuBar() {
+    molecule.menuBar.remove('Run');
+    molecule.menuBar.remove('Help');
+    molecule.menuBar.remove('workbench.action.quickCreateFile')
+    molecule.menuBar.remove(QuickTogglePanelAction.ID)
+    molecule.layout.setMenuBarMode('horizontal');
+    const state = molecule.menuBar.getState();
+    const nextData = state.data.concat();
+    nextData.splice(1, 0, {
+        id: 'seec',
+        name: 'Seec',
+        data: [
+            {
+                id: DRAWER_MENU_ENUM.RESULT,
+                name: 'Result'
+            },
+            {
+                id: DRAWER_MENU_ENUM.SUBMIT,
+                name: 'Submit'
+            }
+        ],
+    });
+    molecule.menuBar.setState({
+        data: nextData,
+    });
+}
+
+function initExpandCollapse() {
+    const { SAMPLE_FOLDER_PANEL_ID, EDITOR_PANEL_ID } = molecule.builtin.getConstants();
+    molecule.explorer.setExpandedPanels([EDITOR_PANEL_ID!, SAMPLE_FOLDER_PANEL_ID!]);
+}
+
+function initExplorer() {
+    const explorerData = molecule.explorer.getState().data?.concat() || [];
+    const { SAMPLE_FOLDER_PANEL_ID, EDITOR_PANEL_ID } = molecule.builtin.getConstants();
+    const folderTreePane = explorerData.find((item) => item.id === SAMPLE_FOLDER_PANEL_ID);
+    const editorTreePane = explorerData.find((item) => item.id === EDITOR_PANEL_ID)
+    if (editorTreePane?.toolbar) {
+        editorTreePane.toolbar[0] = editorTreePane.toolbar[2]
+        editorTreePane.toolbar.pop()
+        editorTreePane.toolbar.pop()
+    }
+    if (folderTreePane?.toolbar) {
+        folderTreePane.toolbar[0] = folderTreePane.toolbar[2]
+        folderTreePane.toolbar[1] = folderTreePane.toolbar[3]
+        folderTreePane.toolbar.pop()
+        folderTreePane.toolbar.pop()
+    }
+    molecule.explorer.setState({
+        data: explorerData,
+    });
+    molecule.explorer.onPanelToolbarClick((panel, toolbarId) => {
+        if (toolbarId === "refresh" && store.getState().loadQuestion.examId)
+            getQuestion(store.getState().loadQuestion.examId as unknown as string, store.getState().loadQuestion.codeList![0].questionId as unknown as string)
+    })
+    molecule.explorer.onCollapseAllFolders(() => {
+        molecule.folderTree.setExpandKeys([]);
+    });
+    molecule.editorTree.onCloseSaved((groupId) => {
+        molecule.editor.closeAll(groupId);
+    });
+    molecule.folderTree.setFileContextMenu([])
+    molecule.folderTree.setFolderContextMenu([])
+    const folderTreeState = molecule.folderTree.getState()
+    const folderTree = folderTreeState?.folderTree
+    if (folderTree && folderTreeState && folderTree.contextMenu) folderTree.contextMenu = []
+    console.log(molecule.folderTree.getState())
+}
+
+function initializeEntry() {
+    molecule.folderTree.setEntry(
+        <div className={classNames('mt-20px', 'text-center')}>
+            {'Go to '}
+            <Button
+                type="link"
+                onClick={() => jumpToCoder()}
+                style={{padding: 0}}
+            >
+                Coder
+            </Button>
+            {' to select an exam'}
+        </div>,
+    );
+}
+
+function initLogin() {
+    const userName = store.getState().loadUser.username
+    updateAccountContext(
+        userName?
+            [
+                {
+                    id: 'username',
+                    disabled: !!userName,
+                    icon: 'person',
+                    name: userName,
+            },
+                {
+                    id: 'divider',
+                    type: 'divider',
+                },
+                {
+                    id: 'logout',
+                    icon: 'log-out',
+                    name: 'Log Out',
+                    onClick: () => {
+                        store.dispatch(loadUser({}))
+                        deleteCookie('token')
+                        window.location.reload();
+                    }
+                }]
+            :[
+                {
+                id: 'login',
+                name: 'Log In',
+                icon: 'log-in',
+                onClick: () => {
+                    goToLogin();
+                    },
+                }
+            ]
+    );
+}

+ 67 - 0
src/extensions/menubar/index.ts

@@ -0,0 +1,67 @@
+import molecule from '@dtinsight/molecule';
+import {IExtension, IMenuBarItem} from '@dtinsight/molecule/esm/model';
+import {IExtensionService} from '@dtinsight/molecule/esm/services';
+import {DRAWER_MENU_ENUM} from "@/constant";
+import {history} from "umi";
+import {QuickTogglePanelAction} from "@dtinsight/molecule/esm/monaco/quickTogglePanelAction";
+import {jumpToCoder} from "@/services/exam";
+import api from "@/api";
+import {store} from "@/redux/store";
+import {message} from "antd";
+import notification from "@/components/notification";
+
+function handleMenuBarEvents() {
+    molecule.menuBar.onSelect((menuId) => {
+        switch (menuId) {
+            case DRAWER_MENU_ENUM.RESULT:
+                history.push({
+                    query: {
+                        drawer: menuId,
+                    },
+                });
+                break;
+            case DRAWER_MENU_ENUM.SUBMIT:
+                const examId = store.getState().loadQuestion.examId
+                if (!examId) message.error("Please select an exam")
+                else {
+                    const questionId = store.getState().loadQuestion.codeList![0].questionId
+                    api.updateOnlineCodeByExamIdAndQuestionId(examId!, questionId!, {
+                        code: store.getState().loadQuestion.codeList![0].editable!
+                    }).then(r => {
+                        console.log(r)
+                        if (r.err === 0) message.success("Success")
+                        else {
+                            message.error("Failure")
+                            notification.error({key: "SubmitError", message: r.msg})
+                        }
+                    }).catch(r => message.error("Failure"))
+                }
+                break;
+            case 'Open': {
+                jumpToCoder()
+                break;
+            }
+            default:
+                break;
+        }
+    });
+}
+
+export class MenuBarExtension implements IExtension {
+
+    id: string = 'MyMenubar';
+    name: string = 'MyMenu Bar';
+
+    activate(extensionCtx: IExtensionService): void {
+        const hidden = molecule.layout.togglePanelVisibility();
+        // molecule.menuBar.update(QuickTogglePanelAction.ID, {
+        //     icon: hidden ? '' : 'check',
+        // });
+        handleMenuBarEvents()
+    }
+
+
+    dispose() {
+        molecule.menuBar.reset();
+    }
+}

+ 1 - 0
src/extensions/oneDarkPro/.eslintignore

@@ -0,0 +1 @@
+out/

+ 1 - 0
src/extensions/oneDarkPro/.gitattributes

@@ -0,0 +1 @@
+*.scss linguist-language=TypeScript;

+ 18 - 0
src/extensions/oneDarkPro/.gitignore

@@ -0,0 +1,18 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+
+# Dependency directories
+node_modules/
+
+# Build output
+out/
+styles/
+
+# Auto-generated theme file
+!temp/.gitkeep
+flag.txt
+*.vsix

+ 20 - 0
src/extensions/oneDarkPro/.vscodeignore

@@ -0,0 +1,20 @@
+!node_modules
+temp/flag.txt
+*.vsix
+
+# Source
+.github/
+.vscode/
+out/**/*.js.map
+scripts/
+scss/
+src/
+screenshots/
+
+# Dev config files
+.eslintignore
+.gitignore
+nodemon.json
+renovate.json
+**/tsconfig*.json
+

+ 905 - 0
src/extensions/oneDarkPro/CHANGELOG.md

@@ -0,0 +1,905 @@
+# CHANGELOG
+## 3.13.2 | 2021.10.06
+- Improve C/C++ semantic highlight [#395](https://github.com/Binaryify/OneDark-Pro/issues/395)
+
+## 3.13.1 | 2021.10.03
+- Improve Python highlight [#632](https://github.com/Binaryify/OneDark-Pro/pull/632)
+
+## 3.13.0 | 2021.09.30
+- Enable your extension to run on VS Code for the web [#601](https://github.com/Binaryify/OneDark-Pro/pull/601) [#581](https://github.com/Binaryify/OneDark-Pro/issues/581)
+
+- Fixed setting sometime doesn't work problem [#606](https://github.com/Binaryify/OneDark-Pro/issues/606)
+
+## 3.12.1 | 2021.09.26
+- Fixed One Dark Pro Darker theme's markdown style no apply problem
+
+## 3.12.0 | 2021.09.19
+- Dynamically loading themes files, add `Starfall Ocean` in built-in themes [#605](https://github.com/Binaryify/OneDark-Pro/issues/605)
+
+- Add variables colors settings [#605](https://github.com/Binaryify/OneDark-Pro/issues/605)
+
+- One Dark Pro Flat/One Dark Pro Darker support set `Bold & Italics` [#606](https://github.com/Binaryify/OneDark-Pro/issues/606)
+
+- Support `Inlay hints` [#603](https://github.com/Binaryify/OneDark-Pro/issues/603)
+## 3.11.4 | 2021.08.19
+- Added darker theme option [#585](https://github.com/Binaryify/OneDark-Pro/pull/585) 
+
+## 3.11.3 | 2021.08.06
+- Fixed Markdown style was missing under the Flat theme
+
+## 3.11.2 | 2021.07.28
+- Update README.MD
+
+## 3.11.1 | 2021.07.19
+- Remove highlight for currently focused tab and add custom `tab.activeBorder` color code snippet in README.md [#565](https://github.com/Binaryify/OneDark-Pro/issues/565)
+
+## 3.11.0 | 2021.07.18
+- Support virtual workspaces [#546](https://github.com/Binaryify/OneDark-Pro/issues/546)
+
+- Build script generate flat theme now
+
+- Add highlight for currently focused tab[#565](https://github.com/Binaryify/OneDark-Pro/issues/565)
+
+## 3.10.16 | 2021.07.15
+- Update CodeStream logo [#566](https://github.com/Binaryify/OneDark-Pro/pull/566)
+
+## 3.10.15 | 2021.07.12
+- Fixed checkbox visible issue [#563](https://github.com/Binaryify/OneDark-Pro/issues/563)
+## 3.10.14 | 2021.05.05
+- Improve JavaScript highlight [#538](https://github.com/Binaryify/OneDark-Pro/issues/538)
+
+- Add secondary button styles [#541](https://github.com/Binaryify/OneDark-Pro/issues/541)
+
+- Support Workspace Trust [#544](https://github.com/Binaryify/OneDark-Pro/issues/544)
+
+- Improve editorOverviewRuler [#540](https://github.com/Binaryify/OneDark-Pro/issues/540)
+
+## 3.10.13 | 2021.04.13
+- Fixed PHP highlight error [#533](https://github.com/Binaryify/OneDark-Pro/issues/533)
+
+## 3.10.12 | 2021.04.10
+- Improve minimap gutter indicators [#534](https://github.com/Binaryify/OneDark-Pro/issues/534)
+
+- Improve PHP highlight [#533](https://github.com/Binaryify/OneDark-Pro/issues/533)
+
+## 3.10.11 | 2021.04.07
+- Improve Dart/Flutter semantic highlighting [#394](https://github.com/Binaryify/OneDark-Pro/issues/394)
+
+## 3.10.10 | 2021.04.06
+- Fix Python semantic highlighting error [#439]
+
+- Improve Dart/Flutter semantic highlighting [#394](https://github.com/Binaryify/OneDark-Pro/issues/394)
+
+- Added new gutter colors to shadow theme [#530](https://github.com/Binaryify/OneDark-Pro/pull/530)
+
+## 3.10.9 | 2021.04.04
+- Fix Python semantic highlighting error [#439](https://github.com/Binaryify/OneDark-Pro/issues/439)
+
+## 3.10.7 | 2021.04.04
+- Change default theme sidebar background back and improve color [#528](https://github.com/Binaryify/OneDark-Pro/issues/528)
+
+- Improve gutter indicators highlight color [#529](https://github.com/Binaryify/OneDark-Pro/issues/529)
+
+- Improve Welcome page/Interface Overview/Playground UI [#369](https://github.com/Binaryify/OneDark-Pro/issues/369)
+
+
+## 3.10.4 | 2021.04.03
+- Improve focus border highlight [#527](https://github.com/Binaryify/OneDark-Pro/issues/527)
+
+## 3.10.1 | 2021.04.03
+- Make default theme sidebar more flat
+ 
+- Improve flat theme
+
+## 3.9.15 | 2021.02.16
+- Add shadow theme[#512](https://github.com/Binaryify/OneDark-Pro/pull/512)
+
+## 3.9.13 | 2021.01.28
+- Fixed [#502](https://github.com/Binaryify/OneDark-Pro/issues/502)
+
+## 3.9.12 | 2020.12.19
+- Improve C# color highlight [#493](https://github.com/Binaryify/OneDark-Pro/issues/493)
+
+- Improve Elixir color highlight [#495](https://github.com/Binaryify/OneDark-Pro/pull/495)
+
+## 3.9.11 | 2020.11.25
+- Update editorLineNumber.activeForeground color [#487](https://github.com/Binaryify/OneDark-Pro/issues/487)
+
+## 3.9.10 | 2020.11.25
+- Add editorLineNumber.activeForeground highlight [#487](https://github.com/Binaryify/OneDark-Pro/issues/487)
+
+- Update license
+
+## 3.9.7 | 2020.11.21
+- Update screenshots and docs
+
+## 3.9.6 | 2020.11.16
+- Fixed golang syntax highlighting error  [#482](https://github.com/Binaryify/OneDark-Pro/issues/482)
+
+## 3.9.5 | 2020.11.15
+- Update docs and screenshots
+
+## 3.9.3 | 2020.10.07
+- Improve Elixir highlight [#464](https://github.com/Binaryify/OneDark-Pro/issues/464)
+
+## 3.9.2 | 2020.10.05
+- Update screenshots
+
+## 3.9.1 | 2020.10.03
+- Fixed iffy wording on command pallet commands [#458](https://github.com/Binaryify/OneDark-Pro/pull/458)
+
+## 3.9.0 | 2020.09.25
+- Add oneDarkProFlat theme [#453](https://github.com/Binaryify/OneDark-Pro/pull/453)
+
+## 3.8.7 | 2020.08.29
+- Fixed JavaScript operator color error [#407](https://github.com/Binaryify/OneDark-Pro/issues/407)
+- Fixed [#412](https://github.com/Binaryify/OneDark-Pro/issues/412)
+
+## 3.8.5 | 2020.07.20
+- Add black color theme support [#410](https://github.com/Binaryify/OneDark-Pro/pull/410)
+- Fixed config don't work issue [#366](https://github.com/Binaryify/OneDark-Pro/issues/366)
+
+## 3.8.4 | 2020.07.19
+- Improve markdown image css
+
+## 3.8.3 | 2020.07.06
+- Fixed rust highlight color error [#404](https://github.com/Binaryify/OneDark-Pro/issues/404)
+
+## 3.8.2 | 2020.06.21
+- Improve terminal color
+
+## 3.8.1 | 2020.06.20
+- Improve panel section header background color [#400](https://github.com/Binaryify/OneDark-Pro/issues/400)
+
+## 3.8.0 | 2020.06.13
+- Support toggle markdown style in setting
+
+## 3.7.3 | 2020.06.11
+- Support markdown preview color highlight 
+
+## 3.7.1 | 2020.05.22
+- Improve terminal selection background color highlight
+
+## 3.7.0 | 2020.05.20
+- Improve terminal color highlight [#382](https://github.com/Binaryify/OneDark-Pro/issues/382)
+
+- Improve Rust highlight [#393](https://github.com/Binaryify/OneDark-Pro/issues/393)
+
+## 3.6.2 | 2020.05.18
+- Update README.MD
+
+## 3.6.1 | 2020.05.14
+- Fixed C/C++ variables highlight error [#390](https://github.com/Binaryify/OneDark-Pro/issues/390)
+## 3.6.0 | 2020.05.13
+- Revert markdown preview color highlight support change
+
+## 3.5.5 | 2020.05.12
+- Limit markdown preview style in dark mode
+
+## 3.5.0 | 2020.05.09
+- Add markdown preview color highlight support
+
+## 3.4.0 | 2020.05.06
+### Breaking change
+- Enable semantic highlighting by default [#386](https://github.com/Binaryify/OneDark-Pro/issues/386)  
+You could set `"editor.semanticHighlighting.enabled": false` in your `setting.json` to close this setting
+
+## 3.3.1 | 2020.04.22
+- Fixed terminal color error
+
+## 3.3.0 | 2020.04.21
+- Update terminal color
+
+## 3.2.5 | 2020.03.31
+- Fixed broken images url
+
+## 3.2.4 | 2020.03.18
+- Update debug status bar background [#374](https://github.com/Binaryify/OneDark-Pro/issues/374)
+
+## 3.2.3 | 2020.02.20
+- Fixed embedded YAML list dash highlight error[#370](https://github.com/Binaryify/OneDark-Pro/issues/370)
+
+## 3.2.2 | 2020.02.04
+- Highlight diff to-file [#376](https://github.com/Binaryify/OneDark-Pro/pull/376)
+
+## 3.2.1 | 2019.12.10
+- Fixed [#362](https://github.com/Binaryify/OneDark-Pro/issues/362)
+
+## 3.2.0 | 2019.11.29
+- Won't prompt to reload after extension update when using default config
+
+- Remove update notification
+
+## 3.1.2 | 2019.11.25
+- Fixed template expression highlight error [#358](https://github.com/Binaryify/OneDark-Pro/issues/358)
+
+## 3.1.1 | 2019.11.24
+- Fixed i18n error 
+
+## 3.1.0 | 2019.11.24
+- Fixed rust highlight error [#356](https://github.com/Binaryify/OneDark-Pro/issues/356)
+
+- Fixed jsx highlight error [#358](https://github.com/Binaryify/OneDark-Pro/issues/358)
+
+- Show open changelog button on notification in the bottom right corne
+
+- Support commands to set/cancel `bold`, `italic`, `vivid` 
+
+## 3.0.3 | 2019.11.18
+- Fixed the file name error 
+
+## 3.0.1 | 2019.11.18
+- Fixed work tree selected background color error
+
+- Fixed CHANGELOG.MD date error
+
+## 3.0.0 | 2019.11.17
+- Refactoring with TypeScript
+
+- Support dynamic theme  
+
+- Support switch to other editor theme  (Solarized, Nord, Panda, Ayu, VS Code(dark))
+
+- Support switch `bold`, `italic`, `vivid` 
+
+### More
+- Read [release note](https://github.com/Binaryify/OneDark-Pro/blob/master/releaseNote.md)
+
+
+## 2.28.3 | 2019.10.28
+- Improve comparison operators incorrectly highlight [#346](https://github.com/Binaryify/OneDark-Pro/issues/346)
+
+## 2.28.2 | 2019.10.07
+- Update logo [#343](https://github.com/Binaryify/OneDark-Pro/pull/343)
+
+## 2.28.1 | 2019.10.06
+
+- Improve [#305](https://github.com/Binaryify/OneDark-Pro/issues/305)
+
+- Merge [#336](https://github.com/Binaryify/OneDark-Pro/pull/336) [#337](https://github.com/Binaryify/OneDark-Pro/pull/337) [#338](https://github.com/Binaryify/OneDark-Pro/pull/338) [#339](https://github.com/Binaryify/OneDark-Pro/pull/339) [#341](https://github.com/Binaryify/OneDark-Pro/pull/341)
+
+## 2.27.2 | 2019.09.19
+
+- Fixed HTML highlight error
+
+## 2.27.1 | 2019.08.26
+
+- Fixed highlight error
+
+## 2.27.0 | 2019.08.22
+
+- Support Unison highlight[#326](https://github.com/Binaryify/OneDark-Pro/pull/326)
+
+## 2.26.3 | 2019.08.08
+
+- Fixed ts if/for/while statements highlight error [#325](https://github.com/Binaryify/OneDark-Pro/issues/325)
+
+- Fixed subclass highlight error [#320](https://github.com/Binaryify/OneDark-Pro/issues/320)
+
+## 2.26.2 | 2019.08.03
+
+- Change warning color to #d19a66 [#324](https://github.com/Binaryify/OneDark-Pro/issues/324)
+
+## 2.26.1 | 2019.08.03
+
+- Update warning Colors [#324](https://github.com/Binaryify/OneDark-Pro/issues/324)
+
+## 2.26.0 | 2019.07.11
+
+- Changes constant.character.format.placeholder.other.python to whisky for better string formatting visibility in python [#319](https://github.com/Binaryify/OneDark-Pro/pull/319)
+
+- Support Markdown underscore-style headers [#312](https://github.com/Binaryify/OneDark-Pro/issues/312)
+
+- Fix java highlight [#316](https://github.com/Binaryify/OneDark-Pro/pull/316)
+
+  The changes :
+
+  1. `@` on annotation is now white (this is same in Typescript)
+  2. `instanceof` is now highlighted
+  3. `List<String>` is now standardized. The bracket is forced to white and the type has now the same color of type (this is same in Typescript)
+  4. `ConfigurationSection[]` have now right type color
+
+> Thanks for [@holdenkilbride](https://github.com/holdenkilbride) [@orblazer](https://github.com/orblazer) [@Huxpro](https://github.com/Huxpro)
+
+## 2.25.3 | 2019.07.04
+
+- Fixed C++ highlight error [#313](https://github.com/Binaryify/OneDark-Pro/issues/313)
+
+## 2.25.1 | 2019.07.03
+
+- Fixed `keyof` in typescript highlight error
+
+## 2.25.0 | 2019.06.29
+
+- Improve menu foreground & active tab foreground via:[#299](https://github.com/Binaryify/OneDark-Pro/issues/299)
+
+## 2.24.1 | 2019.06.04
+
+- Improve XI language support via:[#309](https://github.com/Binaryify/OneDark-Pro/pull/309)
+
+## 2.24.0 | 2019.06.02
+
+- Add XI language support via:[#308](https://github.com/Binaryify/OneDark-Pro/pull/308)
+
+## 2.23.2 | 2019.05.27
+
+- Improve peek background-color
+
+## 2.23.1 | 2019.05.24
+
+- Fix keyword delete highlight error
+
+## 2.23.0 | 2019.05.10
+
+- Improve Haskell highlight
+
+## 2.22.1 | 2019.05.05
+
+- Update README.MD images
+
+## 2.22.0 | 2019.05.03
+
+- Add support for statusBarItem.remoteBackground via:[#302](https://github.com/Binaryify/OneDark-Pro/pull/302)
+
+## 2.21.0 | 2019.03.24
+
+- Make Rust type colors consistent with other languages [#298](https://github.com/Binaryify/OneDark-Pro/pull/298)
+
+## 2.20.5 | 2019.03.15
+
+- Fix two regressions in PHP coloring
+
+## 2.20.4 | 2019.03.14
+
+- Restore Python default foreground color
+
+## 2.20.2 | 2019.03.13
+
+- Improve Rust syntax
+
+- Improve default foreground color
+
+- Definitely improve Python highlight 😃
+
+## 2.19.3 | 2019.03.11
+
+- Improve Rust syntax highlight
+
+## 2.19.2 | 2019.03.06
+
+- Improve C++, Markdown syntax highlight
+
+## 2.19.0
+
+- Improve `this`, `super` highlight [#287](https://github.com/Binaryify/OneDark-Pro/pull/287)
+
+## 2.18.2
+
+- Update README.MD
+
+## 2.18.1
+
+- Add OneDark-Pro-bold style
+
+## 2.17.7
+
+- Fix border in dropdown appearing without focus
+
+## 2.17.6 | 2018.10.25
+
+- Change focus from `#F8FAFD` to `#464646` to dim the color
+
+## 2.17.5
+
+- Change focus from `#21252b` to `#F8FAFD` to improve accessibility in GUIs
+
+## 2.17.4 | 2018.10.14
+
+- Improve markdown support
+- Improve editor dropdown color
+
+## 2.17.3 | 2018.10.05
+
+- Improve elixir support #262
+- Improve flow support #222
+
+## 2.17.1 | 2018.10.04
+
+- Rewrite syntax highlight file, simplified color, update docs
+
+## 2.16.7 | 2018.10.04
+
+Improve Ruby and FlowJS support
+
+## 2.16.6 | 2018.09.12
+
+- Edit editor tab highlighting to be the `#282c34` color to be consistent across the theme
+- Improve Python italics support
+
+## 2.16.3 | 2018.9.09
+
+- Change: Separate editor styles and syntax highlighting
+
+## 2.16.1 | 2018.9.06
+
+- Made units red again
+- Adjusted colours of operators (+ compound operators) to be consistent, such as `++`, `--` and `*=` etc.
+- Improve Punctuation (some)
+- Improve some syntax highlighting for languages:
+  - Clojure (globals, symbols and constants)
+  - CSS/SCSS/LESS (Colour Operators such as \* / + -)
+  - CoffeeScript (Brung some colours closer to JavaScript, for consistency)
+  - Ini (Highlighted default text so it's visible as values rather than plain text)
+  - Go (Package Name highlighting)
+  - Groovy (Better function and variable highlighting)
+  - HLSL (More keywords, semantics highlighted)
+  - Makefile (Prerequisities highlighting, text colour treated as values inputted, highlighted)
+  - Markdown (Better Lists and Links and Image highlighting)
+  - R (Correct Function highlighting)
+  - SQL (Variables Highlighting, Bracketed Text Highlighting)
+  - Swift (Type Highlighting)
+  - Visual Basic (Type Highlighting)
+
+## 2.15.4 | 2018.8.09
+
+- Change C/C++ comments from bold to italic to make more unified #242
+
+## 2.15.3 | 2018.7.31
+
+- Change C/C++ comments from italic to bold
+- Fix php Static class variable highlight error
+- Fix C/C++ right shift highlight error
+
+## 2.15.1 | 2018.7.05
+
+- Fix CSS color highlight error
+- Revert changes to fix YAML unquoted strings
+
+## 2.15.0 | 2018.7.02
+
+- Made units (px, em.. etc) red to distinguish between the value itself and the units: easier readability
+- Made pseudo-elements/classes bluish in order to distinguish it from classes (which are the same color in CSS/LESS/SASS)
+- Made escaped characters (such as &apos; &copy; etc) red to see them easily, especially in Pug (jade) files where brackets and classes are essentially the same color
+- The String literal in JS/TS \${} is now purply for easier readability
+- All Comments are now italic
+- Changes to TypeScript/JavaScript (possibly other languages too) syntax highlighting:
+  - Classes now all Yellow (except in TS in the case of App.getSmth(), as both normal objects and classes use the same code internally, meaning highlighting would be weird)
+  - Property names in `js let app = { hello: "world"}` now red, to match selector (eg: `js app.hello`) and themselves
+  - Optional operator `ts ?:` now purple too
+
+## 2.14.0 | 2018.6.14
+
+- Change terminal ANSI color to match syntax color
+- Improve tab
+
+## 2.13.6 | 2018.5.17
+
+- Add Contributors
+
+## 2.13.5 | 2018.5.04
+
+- Improve go&elm highlight
+- Support Highlighted indent guides
+- Hide blue border around file explorer when focused
+
+## 2.13.4 | 2018.3.12
+
+- Updated `.vsixmanifest` to contain the latest and correct data.
+- Updated `LICENSE` copyright date.
+- Deleted `vsc-extension-quickstart.md` which was auto-generated.
+- Updated `name` in themes to match the correct theme name.
+- Minor changes in `docs/index.html`.
+- Minor changes in `README.md` and `docs/*.md` files.
+- Added `galleryBanner` in `package.json` to match theme colors.
+- Revert back original terminal coloring like it was before.
+
+## 2.13.3 | 2018.3.11
+
+- Updated cursor color. [#189](https://github.com/Binaryify/OneDark-Pro/issues/189)
+- Removed all terminal colors. [#195](https://github.com/Binaryify/OneDark-Pro/issues/195)
+
+## 2.13.2 | 2018.3.11
+
+- Updated color of the currently active line and active line number in the editor.
+
+## 2.13.1 | 2018.3.10
+
+- Updated border colors for editor highlights.
+
+## 2.13.0 | 2018.3.08
+
+- Fixed `findMatchBackground` coloring.
+- New color for the line number of the currently active line in the editor.
+- Deleted old `notification.background` color because of the new Notification Center.
+- New border colors for editor highlight which improves readability while searching.
+- Add some edgeSyntax syntax support
+
+## 2.12.8 | 2018.3.06
+
+Improve integrated terminal colors
+
+## 2.12.7 | 2018.3.05
+
+Update integrated terminal colors with One Dark color
+
+## 2.12.6 | 2018.2.28
+
+String Interpolation for visual grepping fixes #191
+
+## 2.12.5 | 2018.2.24
+
+Improve bracket visibility
+
+Improve line highlight background and scrollbar slider background
+
+Fix weird PHP behavior when an interface extends a PHP interface
+thanks for @nicovak @jens1o @svipben
+
+## 2.12.4 | 2018.2.11
+
+Improve React component tags highlight color
+
+## 2.12.3 | 2018.2.08
+
+Improve colors for Editor Tabs
+
+## 2.12.2 | 2018.1.16
+
+improve cursor color
+
+## 2.12.0 | 2018.1.15
+
+improve cursor color & selection background color
+
+## 2.11.1 | 2018.1.1
+
+import C# highlight color
+[#169 @ritwickdey](https://github.com/Binaryify/OneDark-Pro/issues/169) Happy
+New Year~
+
+## 2.11.0 | 2017.12.14
+
+Improve status bar debugging color
+
+## 2.10.23 | 2017.11.25
+
+Fix `use Test\ClassNameA as ClassNameAAliased;` in php
+
+## 2.10.22 | 2017.11.17
+
+Improve markdown inline code highlight
+
+## 2.10.21 | 2017.11.16
+
+Improve markdown inline code highlight
+
+## 2.10.20 | 2017.11.10
+
+Fix some PHP highlight
+
+## 2.10.19 | 2017.11.09
+
+Improve terminal & regexp color
+
+## 2.10.18 | 2017.11.05
+
+Improve terminal color
+
+## 2.10.17 | 2017.10.17
+
+Fix a typo in comment color code
+
+## 2.10.15 | 2017.10.07
+
+Improve comment highlight
+
+## 2.10.14 | 2017.10.06
+
+Update docs
+
+## 2.10.13 | 2017.10.05
+
+Changed comment to be brighter
+
+## 2.10.12 | 2017.9.23
+
+Add TS primitive/builtin types support in TSX
+
+## 2.10.11 | 2017.9.6
+
+fix Python string color inconsistency issue
+[@jens1o](https://github.com/jens1o)\
+[PR:142](https://github.com/Binaryify/OneDark-Pro/pull/142)
+
+## 2.10.10 | 2017.8.24
+
+Reset more styles [@jens1o](https://github.com/jens1o)\
+[PR:139](https://github.com/Binaryify/OneDark-Pro/pull/139)
+
+## 2.10.9 | 2017.8.21
+
+Improve diff highlight
+
+## 2.10.8 | 2017.8.12
+
+Improve java highlight
+
+## 2.10.7 | 2017.8.2
+
+Add php screenshot
+
+## 2.10.6 | 2017.7.31
+
+Make JS Math constants to be in sync with Atom, fix (S)CSS selectors font style
+error
+
+## 2.10.3 | 2017.7.29
+
+Fix php array() syntax, fix the vivid theme file path error
+
+## 2.10.0 | 2017.7.28
+
+Support basic markdown syntax when using vscode-todo, fix generic types in
+phpdoc, improve JavaScript constants color, add a vivid theme
+
+## 2.9.8 | 2017.7.22
+
+Support PHP types in documentations
+
+## 2.9.7 | 2017.7.19
+
+Improve selected variable highlight
+contributor:[@bardiarastin](https://github.com/bardiarastin) on issue
+[#119](https://github.com/Binaryify/OneDark-Pro/issues/119)
+
+## 2.9.5 | 2017.7.18
+
+Increase the contrast of the selected text
+
+## 2.9.4 | 2017.7.15
+
+Reset PHP round bracket in method parameters
+
+## 2.9.3 | 2017.7.12
+
+reset PHP function call labels
+
+## 2.9.2 | 2017.7.11
+
+Improve js/ts keyword 'import' highlight
+
+## 2.9.1 | 2017.7.1
+
+Improve PHP support, fix icon format error
+
+## 2.8.9 | 2017.6.22
+
+Improve badge background & background color of 'Go to next error or warning'
+(Keyboard shortcut: F8) popup, add support.variable.property.process &
+debugToolBar background & support.variable.object.node support
+
+## 2.8.8 | 2017.6.20
+
+Improve ruler color, improve comment fontStyle, improve peek implementation
+match highlight background-color
+
+## 2.8.7 | 2017.6.19
+
+Add jsx/tsx support, improve the color of warning/error squiggles, improve ruler
+color
+
+## 2.8.6 | 2017.6.13
+
+Support js/ts for-of operator, support PHP nowdoc, support void keyword, add
+bold and italics support for Markdown
+
+## 2.8.5 | 2017.6.6
+
+Fix js/ts key-value separator highlight error
+
+## 2.8.4 | 2017.6.2
+
+Rollback for the issue [#87](https://github.com/Binaryify/OneDark-Pro/issues/87)
+
+## 2.8.3 | 2017.6.2
+
+improve JS/TS object-literal key highlight
+
+## 2.8.2 | 2017.6.1
+
+improve C highlight
+
+## 2.8.1 | 2017.5.29
+
+support void keyword, support ternary operators, support bitwise operators,
+support is an expression in typescript
+
+## 2.8.0 | 2017.5.22
+
+resolve issue #48 #65 #66 #69 #70, support PHP comparison, add support for
+arithmetic operators, add support for PHP regex operators, support heredoc PHP
+operator
+
+## 2.7.8 | 2017.5.17
+
+improve block cursor contrast background-color
+
+## 2.7.7 | 2017.5.16
+
+Fix this expand selection error, modified/added activityBar colors, added
+scrollBar colors
+
+## 2.7.5 | 2017.5.14
+
+Support php-parser constants, improve activity bar badge color, fix this expand
+selection error
+
+## 2.7.4 | 2017.5.11
+
+Few more workbench colour fixes, Update diffEditor.insertedTextBackground
+
+## 2.7.3 | 2017.5.10
+
+New logo and window color additions and tweaks
+[https://github.com/Binaryify/OneDark-Pro/pull/51](https://github.com/Binaryify/OneDark-Pro/pull/51)
+
+## 2.7.2 | 2017.5.9
+
+add support for PHP's goto, update docs
+
+## 2.7.1 | 2017.5.7
+
+added custom colors for the sidebar, statusBar, list, input boxes, etc.
+
+## 2.7.0 | 2017.5.5
+
+Change the theme file format. Add workbench support, improve ts support, update
+document
+
+## 2.6.3 | 2017.5.2
+
+Make displayName and label be the same to avoid confusion, for the reason
+[https://github.com/Binaryify/OneDark-Pro/issues/41](https://github.com/Binaryify/OneDark-Pro/issues/41)
+
+## 2.6.0 | 2017.5.1
+
+rename to "OneDark Pro" for the reason
+[https://github.com/Binaryify/OneDark-Pro/issues/40](https://github.com/Binaryify/OneDark-Pro/issues/40)
+
+## 2.5.3 | 2017.4.24
+
+fix C++ heightlight error
+
+## 2.5.2 | 2017.4.21
+
+added support for other class namespaces outside use
+
+## 2.5.0 | 2017.4.15
+
+Added PHP function-call object and static
+
+## 2.4.16 | 2017.4.12
+
+improve php & C# SUPPORT
+
+## 2.4.15 | 2017.4.10
+
+support PHP constants and normalize array in double-quoted strings, add keywords,
+rename
+
+## 2.4.6 | 2017.4.9
+
+add DOCS
+
+## 2.4.4 | 2017.4.9
+
+improve PHP support
+
+## 2.4.3 | 2017.4.8
+
+improve python types support & C++ support
+
+## 2.4.1 | 2017.4.8
+
+improve python types support
+
+## 2.4.0 | 2017.4.7
+
+improve python logical & variable parameter support
+
+## 2.3.9 | 2017.4.7
+
+improve python support
+
+## 2.3.8 | 2017.4.7
+
+improve document
+
+## 2.3.7 | 2017.4.7
+
+improve C++ support
+
+## 2.3.6 | 2017.4.6
+
+improve PHP dollar sign & logical operator height light
+
+## 2.3.5 | 2017.3.31
+
+improve JavaScript 'instanceof' & 'process' height light
+
+## 2.3.4 | 2017.3.29
+
+improve Java height light
+
+## 2.3.3
+
+add php call-function height light
+
+## 2.3.2
+
+update icon
+
+## 2.3.1
+
+improve js module height light
+
+## 2.3.0
+
+improve README.MD
+
+## 2.2.9
+
+add css/scss property value hight light
+
+## 2.2.8
+
+improve js 'this' height light
+
+## 2.2.7
+
+improve js variable property, js object-literal key, constant.js and math height
+light, remove the notice
+
+## 2.2.6
+
+add README.MD notice
+
+## 2.2.5
+
+remove js operator accessor hight light
+
+## 2.2.4
+
+push changelog to CHANGELOG.md
+
+## 2.2.3
+
+improve css's id & class & color name height light
+
+## 2.2.2
+
+improve README.MD, add changelog
+
+## 2.2.1
+
+add js module hight light, add changelog
+
+## 2.2.0
+
+add js operator logical hight light
+
+## 2.1.9
+
+add js console height light
+
+## 2.1.8
+
+add java support
+
+## 2.1.7
+
+fix diff height light error
+
+## 2.1.6
+
+improve js operator

+ 21 - 0
src/extensions/oneDarkPro/LICENSE.txt

@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2013-2021 Binaryify
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.

+ 240 - 0
src/extensions/oneDarkPro/README.md

@@ -0,0 +1,240 @@
+# [One Dark Pro](https://marketplace.visualstudio.com/items?itemName=zhuangtongfa.Material-theme)
+
+Atom's iconic One Dark theme, and one of the most installed [themes](https://marketplace.visualstudio.com/search?target=VSCode&category=Themes&sortBy=Installs) for VS Code!
+
+[![Preview in vscode.dev](https://img.shields.io/badge/preview%20in-vscode.dev-blue)](https://vscode.dev/theme/zhuangtongfa.Material-theme)
+
+## SPONSORS
+
+[![bloop](./screenshots/bloop_small.png)](https://bloop.ai/?utm_source=vscmarket&utm_campaign=onedarkpro&utm_medium=banner)
+
+Bored of trawling through the docs? Get JS and TS code examples from documentation and Open Source right in your IDE
+[Learn more](https://bloop.ai/?utm_source=vscmarket&utm_campaign=onedarkpro&utm_medium=banner).
+<br><br>
+
+[![codestream](https://alt-images.codestream.com/codestream_logo_pkief_material.png)](https://sponsorlink.codestream.com/?utm_source=vscmarket&utm_campaign=onedarkpro&utm_medium=banner)
+
+Eliminate context switching and costly distractions. Create and merge PRs and perform code reviews from inside your IDE while using jump-to-definition, your keybindings, and other IDE favorites.
+[Learn more](https://sponsorlink.codestream.com/?utm_source=vscmarket&utm_campaign=onedarkpro&utm_medium=banner).
+
+## SCREENSHOT
+
+![ScreenShot](https://cdn.jsdelivr.net/gh/binaryify/onedark-pro/screenshots/normal.png)
+
+### Italic
+
+![ScreenShot](https://cdn.jsdelivr.net/gh/binaryify/onedark-pro/screenshots/italic.png)
+
+### Default theme
+
+![ScreenShot](https://cdn.jsdelivr.net/gh/binaryify/onedark-pro/screenshots/editor1.png)
+
+### Flat theme
+
+![ScreenShot](https://cdn.jsdelivr.net/gh/binaryify/onedark-pro/screenshots/editorflat.png)
+
+### Darker theme
+
+![ScreenShot](./screenshots/editordarker.png)
+
+### Terminal
+
+![ScreenShot](https://cdn.jsdelivr.net/gh/binaryify/onedark-pro/screenshots/terminal.png)
+
+### Setting
+
+![ScreenShot](https://cdn.jsdelivr.net/gh/binaryify/onedark-pro/screenshots/setting.png)
+
+### Built in themes
+
+![built-in themes](https://cdn.jsdelivr.net/gh/binaryify/onedark-pro/screenshots/built-in-themes.png)
+
+### Notice
+
+Setting only support default theme(One Dark Pro).
+
+## Markdown preview style
+
+![Markdown](https://cdn.jsdelivr.net/gh/binaryify/onedark-pro/screenshots/markdown.png)
+You can toggle whether to use markdown style in vscode setting (default use)
+
+
+### Suggest Editor Settings
+```
+ "editor.fontSize": 20,
+ "editor.lineHeight": 30,
+ "editor.fontFamily": "JetBrains Mono",
+```
+JetBrains Mono Download: https://www.jetbrains.com/lp/mono
+
+### Tweaks & theming
+
+If you want to play around with new colors, use the setting
+`workbench.colorCustomizations` to customize the currently selected theme. For
+example, you can add this snippet in your "settings.json" file:
+
+```json
+"workbench.colorCustomizations": {
+  "tab.activeBackground": "#282c34",
+  "activityBar.background": "#282c34",
+  "sideBar.background": "#282c34",
+  "tab.activeBorder": "#d19a66",
+}
+```
+
+or use the setting `editor.tokenColorCustomizations`
+
+```json
+"editor.tokenColorCustomizations": {
+  "[One Dark Pro]": {
+    "textMateRules": [
+      {
+        "scope": ["source.python"],
+        "settings": {
+          "foreground": "#e06c75"
+        }
+      }
+    ]
+  }
+}
+```
+
+#### Italic
+
+You could set this in your setting.json to make code be italic
+
+```json
+"editor.tokenColorCustomizations": {
+    "textMateRules": [
+      {
+        "name": "italic font",
+        "scope": [
+          "comment",
+          "keyword",
+          "storage",
+          "keyword.control",
+          "keyword.control.from",
+          "keyword.control.flow",
+          "keyword.operator.new",
+          "keyword.control.import",
+          "keyword.control.export",
+          "keyword.control.default",
+          "keyword.control.trycatch",
+          "keyword.control.conditional",
+          "storage.type",
+          "storage.type.class",
+          "storage.modifier.tsx",
+          "storage.type.function",
+          "storage.modifier.async",
+          "variable.language",
+          "variable.language.this",
+          "variable.language.super",
+          "meta.class",
+          "meta.var.expr",
+          "constant.language.null",
+          "support.type.primitive",
+          "entity.name.method.js",
+          "entity.other.attribute-name",
+          "punctuation.definition.comment",
+          "text.html.basic entity.other.attribute-name",
+          "tag.decorator.js entity.name.tag.js",
+          "tag.decorator.js punctuation.definition.tag.js",
+          "source.js constant.other.object.key.js string.unquoted.label.js",
+        ],
+        "settings": {
+          "fontStyle": "italic",
+        }
+      },
+    ]
+  }
+```
+
+[more info](https://binaryify.github.io/OneDark-Pro)
+
+## Python & Pylance users
+Python users I recommend using [Pylance](https://marketplace.visualstudio.com/items?itemName=ms-python.vscode-pylance) extension for fast, feature-rich language support.  
+
+Semantic colors can be customized in settings.json by associating the Pylance semantic token types and modifiers with the desired colors.
+
+- Semantic token types
+
+  - class, enum
+  - parameter, variable, property, enumMember
+  - function, member
+  - module
+  - intrinsic
+  - magicFunction (dunder methods)
+  - selfParameter, clsParameter
+
+- Semantic token modifiers
+  - declaration
+  - readonly, static, abstract
+  - async
+  - typeHint, typeHintComment
+  - decorator
+  - builtin
+
+The [scope inspector](https://code.visualstudio.com/api/language-extensions/syntax-highlight-guide#scope-inspector) tool allows you to explore what semantic tokens are present in a source file and what theme rules they match to.
+
+Example of customizing semantic colors in settings.json:
+
+```jsonc
+{
+  "editor.semanticTokenColorCustomizations": {
+    "[One Dark Pro]": {
+      // Apply to this theme only
+      "enabled": true,
+      "rules": {
+        "magicFunction:python": "#ee0000",
+        "function.declaration:python": "#990000",
+        "*.decorator:python": "#0000dd",
+        "*.typeHint:python": "#5500aa",
+        "*.typeHintComment:python": "#aaaaaa",
+        "parameter:python": "#aaaaaa"
+      }
+    }
+  }
+}
+```
+
+Please check the official documentation,
+[Theme Color Reference](https://code.visualstudio.com/docs/getstarted/theme-color-reference) and
+[Theme Color](https://code.visualstudio.com/docs/getstarted/themes), for more helpful information.
+
+[More info](https://code.visualstudio.com/updates/v1_15#_user-definable-syntax-highlighting-colors)
+
+## CHANGELOG
+
+[CHANGELOG.MD](https://github.com/Binaryify/OneDark-Pro/blob/master/CHANGELOG.md)
+
+## DOCS & CONTRIBUTE
+
+This document
+([https://binaryify.github.io/OneDark-Pro/](https://binaryify.github.io/OneDark-Pro/))
+includes instructions on how to install and edit the theme.
+
+To help with documentation, first fork and clone this repository.
+
+`cd` to the `OneDark-Pro` folder
+
+Run `yarn`
+
+Then run
+`npm run docs` to serve the documentation
+locally at `localhost:3000`.
+
+### Contributors
+
+This project exists thanks to all the people who contribute.
+[![Contributors](https://opencollective.com/OneDark-Pro/contributors.svg?width=890)](https://github.com/Binaryify/OneDark-Pro/graphs/contributors)
+
+### Backers
+
+<a href="https://opencollective.com/onedark-pro#backers" target="_blank"><img src="https://opencollective.com/onedark-pro/backers.svg?width=890"></a>
+
+### Sponsors
+
+Support this project by becoming a sponsor. Your logo will show up here with a link to your website.
+<a href="https://opencollective.com/onedark-pro#sponsor" target="_blank">
+<img src="https://opencollective.com/onedark-pro/sponsor.svg?width=890">
+</a>

BIN
src/extensions/oneDarkPro/icon.png


+ 8 - 0
src/extensions/oneDarkPro/icon.svg

@@ -0,0 +1,8 @@
+<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 512 512">
+  <defs/>
+  <circle cx="256" cy="256" r="256" fill="#2D323B"/>
+  <circle cx="256" cy="256" r="24" fill="#CB81DA"/>
+  <path fill="#CB81DA" fill-rule="evenodd" d="M165 170c4 32 16 72 38 113 21 42 46 76 70 97 12 11 24 18 34 22s18 3 24 0c5-3 10-9 13-18 3-10 3-23 2-38-3-31-14-69-34-109a6 6 0 0111-5c20 41 32 81 35 113 1 16 1 30-3 42-3 11-9 21-19 26s-22 4-34 0c-11-4-24-13-37-24-25-23-51-58-73-100s-35-84-39-118c-2-17-1-32 2-44s9-22 20-27c9-6 21-5 33-1 11 5 24 13 36 24a6 6 0 01-8 9c-11-11-23-18-32-21-10-4-18-4-24-1s-11 10-13 20c-3 10-4 24-2 40z" clip-rule="evenodd"/>
+  <path fill="#CB81DA" fill-rule="evenodd" d="M100 268c6 7 16 14 29 20a6 6 0 01-5 11c-14-7-25-14-33-23-8-8-12-18-12-29 1-11 7-21 17-29s23-14 39-20c33-10 76-15 124-13 47 2 90 12 121 26 16 7 29 15 38 23 8 9 14 20 13 31 0 10-6 20-14 27-9 8-20 14-34 19a6 6 0 11-5-11c14-5 24-10 31-17 7-6 10-12 10-19 1-6-2-14-10-21-7-8-19-15-34-21-29-13-70-23-117-25-46-2-88 3-119 13-15 5-27 11-35 18-9 6-12 13-13 20 0 6 3 13 9 20z" clip-rule="evenodd"/>
+  <path fill="#CB81DA" fill-rule="evenodd" d="M189 396c10-3 22-9 35-18a6 6 0 116 10c-13 10-26 16-38 19s-24 2-33-4-14-16-16-29c-2-12-1-28 2-44 8-33 26-73 52-113s56-72 84-92c13-9 27-16 39-19 12-4 24-3 34 3 9 6 14 17 16 29 2 13 1 28-3 44a6 6 0 01-12-2c4-16 5-29 3-40-2-10-5-17-11-21s-14-4-24-2c-10 3-22 9-35 18-26 19-56 50-81 89-26 38-43 77-50 109-3 15-4 29-3 39 2 11 6 18 12 21 5 4 13 5 23 3z" clip-rule="evenodd"/>
+</svg>

+ 20 - 0
src/extensions/oneDarkPro/index.ts

@@ -0,0 +1,20 @@
+import { IExtension } from "@dtinsight/molecule/esm/model";
+
+const OneDarkPro: IExtension = require('./package.json');
+const themes = [
+    require('./themes/OneDark-Pro.json'),
+    require('./themes/OneDark-Pro-flat.json'),
+    require('./themes/OneDark-Pro-darker.json'),
+];
+
+const packageThemes = OneDarkPro.contributes?.themes || [];
+
+OneDarkPro.contributes!.themes = packageThemes.map((theme, index) => {
+    theme.id = theme.label;
+    theme = Object.assign({}, theme, themes[index]);
+    return theme;
+});
+
+OneDarkPro.id = 'OneDarkPro';
+
+export { OneDarkPro };

+ 5 - 0
src/extensions/oneDarkPro/nodemon.json

@@ -0,0 +1,5 @@
+{
+  "watch": ["src"],
+  "ext": "ts",
+  "exec": "ts-node"
+}

+ 295 - 0
src/extensions/oneDarkPro/package.json

@@ -0,0 +1,295 @@
+{
+  "name": "material-theme",
+  "displayName": "One Dark Pro",
+  "description": "Atom‘s iconic One Dark theme for Visual Studio Code",
+  "version": "3.13.2",
+  "publisher": "zhuangtongfa",
+  "license": "MIT",
+  "bugs": {
+    "url": "https://github.com/Binaryify/OneDark-Pro/issues"
+  },
+  "homepage": "https://binaryify.github.io/OneDark-Pro/",
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/Binaryify/OneDark-Pro"
+  },
+  "engines": {
+    "vscode": "^1.59.0"
+  },
+  "activationEvents": [
+    "*"
+  ],
+  "main": "./out/extension.js",
+  "browser": "./out/web/extension.js",
+  "categories": [
+    "Themes"
+  ],
+  "extensionKind": [
+    "ui",
+    "workspace"
+  ],
+  "scripts": {
+    "docs": "docsify serve docs",
+    "build:theme": "ts-node --project scripts/tsconfig.json scripts/generate-theme.ts",
+    "build:ts": "tsc -p src",
+    "build": "yarn build:sass && yarn build:theme && yarn build:ts",
+    "lint": "eslint . --ext .ts",
+    "watch:theme": "nodemon ./scripts/generate-theme.ts",
+    "watch:ts": "yarn build:ts -w",
+    "vscode:prepublish": "yarn build && yarn package-web",
+    "package": "vsce package",
+    "build:sass": "yarn sass --no-source-map scss:styles && yarn sass --no-source-map scss:styles/origin",
+    "compile-web": "webpack --config ./build/web-extension.webpack.config.js",
+    "watch-web": "webpack --watch --config ./build/web-extension.webpack.config.js",
+    "package-web": "webpack --mode production --devtool hidden-source-map --config ./build/web-extension.webpack.config.js"
+  },
+  "prettier": {
+    "singleQuote": true,
+    "semi": false
+  },
+  "contributes": {
+    "markdown.previewStyles": [
+      "./styles/base-inside.css",
+      "./styles/markdown-inside.css",
+      "./styles/atom-one-dark-inside.css"
+    ],
+    "commands": [
+      {
+        "command": "oneDarkPro.showChangelog",
+        "title": "%description.oneDarkPro.showChangelog%",
+        "category": "OneDark Pro"
+      },
+      {
+        "command": "oneDarkPro.setVivid",
+        "title": "%description.oneDarkPro.setVivid%",
+        "category": "OneDark Pro"
+      },
+      {
+        "command": "oneDarkPro.cancelVivid",
+        "title": "%description.oneDarkPro.cancelVivid%",
+        "category": "OneDark Pro"
+      },
+      {
+        "command": "oneDarkPro.setItalic",
+        "title": "%description.oneDarkPro.setItalic%",
+        "category": "OneDark Pro"
+      },
+      {
+        "command": "oneDarkPro.cancelItalic",
+        "title": "%description.oneDarkPro.cancelItalic%",
+        "category": "OneDark Pro"
+      },
+      {
+        "command": "oneDarkPro.setBold",
+        "title": "%description.oneDarkPro.setBold%",
+        "category": "OneDark Pro"
+      },
+      {
+        "command": "oneDarkPro.cancelBold",
+        "title": "%description.oneDarkPro.cancelBold%",
+        "category": "OneDark Pro"
+      }
+    ],
+    "themes": [
+      {
+        "label": "One Dark Pro",
+        "uiTheme": "vs-dark",
+        "path": "./themes/OneDark-Pro.json"
+      },
+      {
+        "label": "One Dark Pro Flat",
+        "uiTheme": "vs-dark",
+        "path": "./themes/OneDark-Pro-flat.json"
+      },
+      {
+        "label": "One Dark Pro Darker",
+        "uiTheme": "vs-dark",
+        "path": "./themes/OneDark-Pro-darker.json"
+      }
+    ],
+    "configuration": {
+      "title": "One Dark Pro",
+      "properties": {
+        "oneDarkPro.editorTheme": {
+          "type": "string",
+          "default": "One Dark Pro",
+          "markdownDescription": "%description.oneDarkPro.editorTheme%",
+          "enum": [
+            "One Dark Pro",
+            "One Dark Pro Flat",
+            "Nord",
+            "Solarized",
+            "Solarized Flat",
+            "Shadow",
+            "Panda",
+            "Ayu",
+            "VS Code",
+            "Just Black",
+            "One Dark Pro Darker",
+            "Ocean",
+            "Tokyo"
+          ]
+        },
+        "oneDarkPro.italic": {
+          "type": "boolean",
+          "default": true,
+          "description": "%description.oneDarkPro.italic%"
+        },
+        "oneDarkPro.vivid": {
+          "type": "boolean",
+          "default": false,
+          "markdownDescription": "%description.oneDarkPro.vivid%"
+        },
+        "oneDarkPro.bold": {
+          "type": "boolean",
+          "default": false,
+          "markdownDescription": "%description.oneDarkPro.bold%"
+        },
+        "oneDarkPro.markdownStyle": {
+          "type": "boolean",
+          "default": true,
+          "description": "%description.oneDarkPro.markdownStyle%"
+        },
+        "oneDarkPro.color": {
+          "type": "object",
+          "scope": "resource",
+          "default": {
+            "chalky": "",
+            "coral": "",
+            "dark": "",
+            "error": "",
+            "fountainBlue": "",
+            "green": "",
+            "invalid": "",
+            "lightDark": "",
+            "lightWhite": "",
+            "malibu": "",
+            "purple": "",
+            "whiskey": "",
+            "deepRed": ""
+          },
+          "properties": {
+            "chalky": {
+              "type": "string",
+              "default": ""
+            },
+            "coral": {
+              "type": "string",
+              "default": ""
+            },
+            "dark": {
+              "type": "string",
+              "default": ""
+            },
+            "error": {
+              "type": "string",
+              "default": ""
+            },
+            "fountainBlue": {
+              "type": "string",
+              "default": ""
+            },
+            "green": {
+              "type": "string",
+              "default": ""
+            },
+            "invalid": {
+              "type": "string",
+              "default": ""
+            },
+            "lightDark": {
+              "type": "string",
+              "default": ""
+            },
+            "lightWhite": {
+              "type": "string",
+              "default": ""
+            },
+            "malibu": {
+              "type": "string",
+              "default": ""
+            },
+            "purple": {
+              "type": "string",
+              "default": ""
+            },
+            "whiskey": {
+              "type": "string",
+              "default": ""
+            },
+            "deepRed": {
+              "type": "string",
+              "default": ""
+            }
+          },
+          "additionalProperties": false,
+          "markdownDescription": "Code highlight color, read more [docs](https://binaryify.github.io/OneDark-Pro/#/?id=highlight-color-custom)"
+        }
+      }
+    }
+  },
+  "icon": "icon.png",
+  "keywords": [
+    "one dark",
+    "onedark",
+    "one dark pro",
+    "onedark pro",
+    "theme",
+    "atom"
+  ],
+  "devDependencies": {
+    "@mskelton/eslint-config": "6.1.0",
+    "@mskelton/prettier-config": "5.1.0",
+    "@types/node": "14.17.20",
+    "@types/vscode": "1.59.0",
+    "@typescript-eslint/eslint-plugin": "4.32.0",
+    "all-contributors-cli": "6.20.0",
+    "docsify-cli": "4.4.3",
+    "eslint": "7.32.0",
+    "eslint-plugin-html": "6.2.0",
+    "eslint-plugin-prettier": "3.4.1",
+    "eslint-plugin-sort": "1.5.0",
+    "nodemon": "1.19.4",
+    "path-browserify": "1.0.1",
+    "prettier": "2.4.1",
+    "process": "0.11.10",
+    "sass": "1.42.1",
+    "ts-loader": "9.2.6",
+    "typescript": "4.4.3",
+    "util": "0.12.4",
+    "webpack": "5.56.0",
+    "webpack-cli": "4.8.0",
+    "ts-node": "10.2.1",
+    "vsce": "1.100.1"
+  },
+  "galleryBanner": {
+    "color": "#2d323b",
+    "theme": "dark"
+  },
+  "dependencies": {
+    "marked": "^3.0.0"
+  },
+  "capabilities": {
+    "untrustedWorkspaces": {
+      "supported": true
+    },
+    "virtualWorkspaces": true
+  },
+  "badges": [
+    {
+      "url": "https://vsmarketplacebadge.apphb.com/version/zhuangtongfa.Material-theme.svg",
+      "href": "https://marketplace.visualstudio.com/items/zhuangtongfa.Material-theme",
+      "description": "Extension version"
+    },
+    {
+      "url": "https://vsmarketplacebadge.apphb.com/installs/zhuangtongfa.Material-theme.svg",
+      "href": "https://marketplace.visualstudio.com/items/zhuangtongfa.Material-theme",
+      "description": "Extension installs"
+    },
+    {
+      "url": "https://vsmarketplacebadge.apphb.com/rating/zhuangtongfa.Material-theme.svg",
+      "href": "https://marketplace.visualstudio.com/items/zhuangtongfa.Material-theme",
+      "description": "Extension Rating"
+    }
+  ]
+}

+ 14 - 0
src/extensions/oneDarkPro/package.nls.json

@@ -0,0 +1,14 @@
+{
+  "description.oneDarkPro.editorTheme": "Switch to different editor theme",
+  "description.oneDarkPro.italic": "Toggle italics on some scopes",
+  "description.oneDarkPro.vivid": "Toggle vivid colors",
+  "description.oneDarkPro.bold": "Toggle bold on some scopes",
+  "description.oneDarkPro.showChangelog": "Show changelog",
+  "description.oneDarkPro.setVivid": "Turn on vivid colors",
+  "description.oneDarkPro.cancelVivid": "Turn off vivid colors",
+  "description.oneDarkPro.setBold": "Turn on bold code on some scopes",
+  "description.oneDarkPro.cancelBold": "Turn off bold code on some scopes",
+  "description.oneDarkPro.setItalic": "Turn on italic code on some scopes",
+  "description.oneDarkPro.cancelItalic": "Turn off italic code on some scopes",
+  "description.oneDarkPro.markdownStyle": "Toggle Markdown style"
+}

+ 14 - 0
src/extensions/oneDarkPro/package.nls.zh-CN.json

@@ -0,0 +1,14 @@
+{
+    "description.oneDarkPro.editorTheme": "设置不同编辑器主题",
+    "description.oneDarkPro.italic": "设置部分代码为斜体",
+    "description.oneDarkPro.vivid": "设置色彩为 vivid",
+    "description.oneDarkPro.bold": "设置部分代码为粗体",
+    "description.oneDarkPro.showChangelog": "打开变更日志",
+    "description.oneDarkPro.setVivid": "设置色彩为 vivid",
+    "description.oneDarkPro.cancelVivid": "取消设置色彩为 vivid",
+    "description.oneDarkPro.setBold": "设置部分代码为粗体",
+    "description.oneDarkPro.cancelBold": "取消设置部分代码为粗体",
+    "description.oneDarkPro.setItalic": "设置部分代码为斜体",
+    "description.oneDarkPro.cancelItalic": "取消设置部分代码为斜体",
+    "description.oneDarkPro.markdownStyle": "使用内置的 Markdown 样式"
+}

+ 41 - 0
src/extensions/oneDarkPro/releaseNote.md

@@ -0,0 +1,41 @@
+# ReleaseNote
+## v3.0 Feature
+- This version become a dynamic theme, have some breaking change(a little), support switch to other editor theme(Solarized, Nord, Panda, Ayu, VS Code(dark)), switch `bold`, `italic`, `vivid` in one theme  
+
+- The old `Onedark Pro bold`, `Onedark Pro vivid` theme can't use now, but you can switch that in VS Code's setting(support multiple, no more mutual exclusion)
+
+![image.png](https://i.loli.net/2019/11/17/JYnl9HRaKzVbyQO.png)
+
+![image.png](https://i.loli.net/2019/11/17/pRuzNfX8Kg5T3vo.png)
+
+## Notice
+- After change the config, the new theme file will generate, for let the new theme file effect, you should reload VS Code
+
+![image.png](https://i.loli.net/2019/11/17/UTciHtgyx8K9mAk.png)
+
+### Theme 
+- One Dark Pro
+![image.png](https://i.loli.net/2019/11/17/gui51SGOKnaHFAb.png)
+
+- Solarized
+![image.png](https://i.loli.net/2019/11/17/jvYmPp7n9KWBVqZ.png)
+
+- Solarized Flat
+![image.png](https://i.loli.net/2019/11/17/sAhjUufVDw5N8rp.png)
+
+- Nord
+![image.png](https://i.loli.net/2019/11/17/QJodmtke8P1rNjE.png)
+
+- Panda
+![image.png](https://i.loli.net/2019/11/17/lpq6tvywL9hOSBj.png)
+
+- Ayu
+![image.png](https://i.loli.net/2019/11/23/txfJHVmKsyrnU2Y.png)
+
+- VS Code(dark)
+![image.png](https://i.loli.net/2019/11/17/nhCmQI4M6wclWzi.png)
+
+
+
+
+

+ 5 - 0
src/extensions/oneDarkPro/renovate.json

@@ -0,0 +1,5 @@
+{
+  "extends": [
+    "config:base"
+  ]
+}

+ 2093 - 0
src/extensions/oneDarkPro/themes/OneDark-Pro-darker.json

@@ -0,0 +1,2093 @@
+{
+  "name": "One Dark Pro",
+  "type": "dark",
+  "semanticHighlighting": true,
+  "semanticTokenColors": {
+    "enumMember": {
+      "foreground": "#56b6c2"
+    },
+    "variable.constant": {
+      "foreground": "#d19a66"
+    },
+    "variable.defaultLibrary": {
+      "foreground": "#e5c07b"
+    },
+    "variable:dart": {
+      "foreground": "#d19a66"
+    },
+    "property:dart": {
+      "foreground": "#d19a66"
+    },
+    "annotation:dart": {
+      "foreground": "#d19a66"
+    },
+    "parameter.label:dart": {
+      "foreground": "#abb2bf"
+    }
+  },
+  "tokenColors": [
+    {
+      "name": "unison punctuation",
+      "scope": "punctuation.definition.delayed.unison,punctuation.definition.list.begin.unison,punctuation.definition.list.end.unison,punctuation.definition.ability.begin.unison,punctuation.definition.ability.end.unison,punctuation.operator.assignment.as.unison,punctuation.separator.pipe.unison,punctuation.separator.delimiter.unison,punctuation.definition.hash.unison",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "haskell variable generic-type",
+      "scope": "variable.other.generic-type.haskell",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "haskell storage type",
+      "scope": "storage.type.haskell",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "support.variable.magic.python",
+      "scope": "support.variable.magic.python",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "punctuation.separator.parameters.python",
+      "scope": "punctuation.separator.period.python,punctuation.separator.element.python,punctuation.parenthesis.begin.python,punctuation.parenthesis.end.python",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "variable.parameter.function.language.special.self.python",
+      "scope": "variable.parameter.function.language.special.self.python",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "variable.parameter.function.language.special.cls.python",
+      "scope": "variable.parameter.function.language.special.cls.python",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "storage.modifier.lifetime.rust",
+      "scope": "storage.modifier.lifetime.rust",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "support.function.std.rust",
+      "scope": "support.function.std.rust",
+      "settings": {
+        "foreground": "#61afef"
+      }
+    },
+    {
+      "name": "entity.name.lifetime.rust",
+      "scope": "entity.name.lifetime.rust",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "variable.language.rust",
+      "scope": "variable.language.rust",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "support.constant.edge",
+      "scope": "support.constant.edge",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "regexp constant character-class",
+      "scope": "constant.other.character-class.regexp",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "regexp operator.quantifier",
+      "scope": "keyword.operator.quantifier.regexp",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "punctuation.definition",
+      "scope": "punctuation.definition.string.begin,punctuation.definition.string.end",
+      "settings": {
+        "foreground": "#98c379"
+      }
+    },
+    {
+      "name": "Text",
+      "scope": "variable.parameter.function",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "Comment Markup Link",
+      "scope": "comment markup.link",
+      "settings": {
+        "foreground": "#5c6370"
+      }
+    },
+    {
+      "name": "markup diff",
+      "scope": "markup.changed.diff",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "diff",
+      "scope": "meta.diff.header.from-file,meta.diff.header.to-file,punctuation.definition.from-file.diff,punctuation.definition.to-file.diff",
+      "settings": {
+        "foreground": "#61afef"
+      }
+    },
+    {
+      "name": "inserted.diff",
+      "scope": "markup.inserted.diff",
+      "settings": {
+        "foreground": "#98c379"
+      }
+    },
+    {
+      "name": "deleted.diff",
+      "scope": "markup.deleted.diff",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "c++ function",
+      "scope": "meta.function.c,meta.function.cpp",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "c++ block",
+      "scope": "punctuation.section.block.begin.bracket.curly.cpp,punctuation.section.block.end.bracket.curly.cpp,punctuation.terminator.statement.c,punctuation.section.block.begin.bracket.curly.c,punctuation.section.block.end.bracket.curly.c,punctuation.section.parens.begin.bracket.round.c,punctuation.section.parens.end.bracket.round.c,punctuation.section.parameters.begin.bracket.round.c,punctuation.section.parameters.end.bracket.round.c",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "js/ts punctuation separator key-value",
+      "scope": "punctuation.separator.key-value",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "js/ts import keyword",
+      "scope": "keyword.operator.expression.import",
+      "settings": {
+        "foreground": "#61afef"
+      }
+    },
+    {
+      "name": "math js/ts",
+      "scope": "support.constant.math",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "math property js/ts",
+      "scope": "support.constant.property.math",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "js/ts variable.other.constant",
+      "scope": "variable.other.constant",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "java type",
+      "scope": [
+        "storage.type.annotation.java",
+        "storage.type.object.array.java"
+      ],
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "java source",
+      "scope": "source.java",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "java modifier.import",
+      "scope": "punctuation.section.block.begin.java,punctuation.section.block.end.java,punctuation.definition.method-parameters.begin.java,punctuation.definition.method-parameters.end.java,meta.method.identifier.java,punctuation.section.method.begin.java,punctuation.section.method.end.java,punctuation.terminator.java,punctuation.section.class.begin.java,punctuation.section.class.end.java,punctuation.section.inner-class.begin.java,punctuation.section.inner-class.end.java,meta.method-call.java,punctuation.section.class.begin.bracket.curly.java,punctuation.section.class.end.bracket.curly.java,punctuation.section.method.begin.bracket.curly.java,punctuation.section.method.end.bracket.curly.java,punctuation.separator.period.java,punctuation.bracket.angle.java,punctuation.definition.annotation.java,meta.method.body.java",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "java modifier.import",
+      "scope": "meta.method.java",
+      "settings": {
+        "foreground": "#61afef"
+      }
+    },
+    {
+      "name": "java modifier.import",
+      "scope": "storage.modifier.import.java,storage.type.java,storage.type.generic.java",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "java instanceof",
+      "scope": "keyword.operator.instanceof.java",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "java variable.name",
+      "scope": "meta.definition.variable.name.java",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "operator logical",
+      "scope": "keyword.operator.logical",
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "operator bitwise",
+      "scope": "keyword.operator.bitwise",
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "operator channel",
+      "scope": "keyword.operator.channel",
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "support.constant.property-value.scss",
+      "scope": "support.constant.property-value.scss,support.constant.property-value.css",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "CSS/SCSS/LESS Operators",
+      "scope": "keyword.operator.css,keyword.operator.scss,keyword.operator.less",
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "css color standard name",
+      "scope": "support.constant.color.w3c-standard-color-name.css,support.constant.color.w3c-standard-color-name.scss",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "css comma",
+      "scope": "punctuation.separator.list.comma.css",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "css attribute-name.id",
+      "scope": "support.constant.color.w3c-standard-color-name.css",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "css property-name",
+      "scope": "support.type.vendored.property-name.css",
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "js/ts module",
+      "scope": "support.module.node,support.type.object.module,support.module.node",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "entity.name.type.module",
+      "scope": "entity.name.type.module",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "js variable readwrite",
+      "scope": "variable.other.readwrite,meta.object-literal.key,support.variable.property,support.variable.object.process,support.variable.object.node",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "js/ts json",
+      "scope": "support.constant.json",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "js/ts Keyword",
+      "scope": [
+        "keyword.operator.expression.instanceof",
+        "keyword.operator.new",
+        "keyword.operator.ternary",
+        "keyword.operator.optional",
+        "keyword.operator.expression.keyof"
+      ],
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "js/ts console",
+      "scope": "support.type.object.console",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "js/ts support.variable.property.process",
+      "scope": "support.variable.property.process",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "js console function",
+      "scope": "entity.name.function,support.function.console",
+      "settings": {
+        "foreground": "#61afef"
+      }
+    },
+    {
+      "name": "keyword.operator.misc.rust",
+      "scope": "keyword.operator.misc.rust",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "keyword.operator.sigil.rust",
+      "scope": "keyword.operator.sigil.rust",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "operator",
+      "scope": "keyword.operator.delete",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "js dom",
+      "scope": "support.type.object.dom",
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "js dom variable",
+      "scope": "support.variable.dom,support.variable.property.dom",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "keyword.operator",
+      "scope": "keyword.operator.arithmetic,keyword.operator.comparison,keyword.operator.decrement,keyword.operator.increment,keyword.operator.relational",
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "C operator assignment",
+      "scope": "keyword.operator.assignment.c,keyword.operator.comparison.c,keyword.operator.c,keyword.operator.increment.c,keyword.operator.decrement.c,keyword.operator.bitwise.shift.c,keyword.operator.assignment.cpp,keyword.operator.comparison.cpp,keyword.operator.cpp,keyword.operator.increment.cpp,keyword.operator.decrement.cpp,keyword.operator.bitwise.shift.cpp",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "Punctuation",
+      "scope": "punctuation.separator.delimiter",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "Other punctuation .c",
+      "scope": "punctuation.separator.c,punctuation.separator.cpp",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "C type posix-reserved",
+      "scope": "support.type.posix-reserved.c,support.type.posix-reserved.cpp",
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "keyword.operator.sizeof.c",
+      "scope": "keyword.operator.sizeof.c,keyword.operator.sizeof.cpp",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "python parameter",
+      "scope": "variable.parameter.function.language.python",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "python type",
+      "scope": "support.type.python",
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "python logical",
+      "scope": "keyword.operator.logical.python",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "pyCs",
+      "scope": "variable.parameter.function.python",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "python block",
+      "scope": "punctuation.definition.arguments.begin.python,punctuation.definition.arguments.end.python,punctuation.separator.arguments.python,punctuation.definition.list.begin.python,punctuation.definition.list.end.python",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "python function-call.generic",
+      "scope": "meta.function-call.generic.python",
+      "settings": {
+        "foreground": "#61afef"
+      }
+    },
+    {
+      "name": "python placeholder reset to normal string",
+      "scope": "constant.character.format.placeholder.other.python",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "Operators",
+      "scope": "keyword.operator",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "Compound Assignment Operators",
+      "scope": "keyword.operator.assignment.compound",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "Compound Assignment Operators js/ts",
+      "scope": "keyword.operator.assignment.compound.js,keyword.operator.assignment.compound.ts",
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "Keywords",
+      "scope": "keyword",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "Namespaces",
+      "scope": "entity.name.namespace",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "Variables",
+      "scope": "variable",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "Variables",
+      "scope": "variable.c",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "Language variables",
+      "scope": "variable.language",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "Java Variables",
+      "scope": "token.variable.parameter.java",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "Java Imports",
+      "scope": "import.storage.java",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "Packages",
+      "scope": "token.package.keyword",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "Packages",
+      "scope": "token.package",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "Functions",
+      "scope": [
+        "entity.name.function",
+        "meta.require",
+        "support.function.any-method",
+        "variable.function"
+      ],
+      "settings": {
+        "foreground": "#61afef"
+      }
+    },
+    {
+      "name": "Classes",
+      "scope": "entity.name.type.namespace",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "Classes",
+      "scope": "support.class, entity.name.type.class",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "Class name",
+      "scope": "entity.name.class.identifier.namespace.type",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "Class name",
+      "scope": [
+        "entity.name.class",
+        "variable.other.class.js",
+        "variable.other.class.ts"
+      ],
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "Class name php",
+      "scope": "variable.other.class.php",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "Type Name",
+      "scope": "entity.name.type",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "Keyword Control",
+      "scope": "keyword.control",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "Control Elements",
+      "scope": "control.elements, keyword.operator.less",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "Methods",
+      "scope": "keyword.other.special-method",
+      "settings": {
+        "foreground": "#61afef"
+      }
+    },
+    {
+      "name": "Storage",
+      "scope": "storage",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "Storage JS TS",
+      "scope": "token.storage",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "Source Js Keyword Operator Delete,source Js Keyword Operator In,source Js Keyword Operator Of,source Js Keyword Operator Instanceof,source Js Keyword Operator New,source Js Keyword Operator Typeof,source Js Keyword Operator Void",
+      "scope": "keyword.operator.expression.delete,keyword.operator.expression.in,keyword.operator.expression.of,keyword.operator.expression.instanceof,keyword.operator.new,keyword.operator.expression.typeof,keyword.operator.expression.void",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "Java Storage",
+      "scope": "token.storage.type.java",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "Support",
+      "scope": "support.function",
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "Support type",
+      "scope": "support.type.property-name",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "Support type",
+      "scope": "support.constant.property-value",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "Support type",
+      "scope": "support.constant.font-name",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "Meta tag",
+      "scope": "meta.tag",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "Strings",
+      "scope": "string",
+      "settings": {
+        "foreground": "#98c379"
+      }
+    },
+    {
+      "name": "Constant other symbol",
+      "scope": "constant.other.symbol",
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "Integers",
+      "scope": "constant.numeric",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "Constants",
+      "scope": "constant",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "Constants",
+      "scope": "punctuation.definition.constant",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "Tags",
+      "scope": "entity.name.tag",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "Attributes",
+      "scope": "entity.other.attribute-name",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "Attribute IDs",
+      "scope": "entity.other.attribute-name.id",
+      "settings": {
+        "fontStyle": "normal",
+        "foreground": "#61afef"
+      }
+    },
+    {
+      "name": "Attribute class",
+      "scope": "entity.other.attribute-name.class.css",
+      "settings": {
+        "fontStyle": "normal",
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "Selector",
+      "scope": "meta.selector",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "Headings",
+      "scope": "markup.heading",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "Headings",
+      "scope": "markup.heading punctuation.definition.heading, entity.name.section",
+      "settings": {
+        "foreground": "#61afef"
+      }
+    },
+    {
+      "name": "Units",
+      "scope": "keyword.other.unit",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "Bold",
+      "scope": "markup.bold,todo.bold",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "Bold",
+      "scope": "punctuation.definition.bold",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "markup Italic",
+      "scope": "markup.italic, punctuation.definition.italic,todo.emphasis",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "emphasis md",
+      "scope": "emphasis md",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "[VSCODE-CUSTOM] Markdown headings",
+      "scope": "entity.name.section.markdown",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "[VSCODE-CUSTOM] Markdown heading Punctuation Definition",
+      "scope": "punctuation.definition.heading.markdown",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "punctuation.definition.list.begin.markdown",
+      "scope": "punctuation.definition.list.begin.markdown",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "[VSCODE-CUSTOM] Markdown heading setext",
+      "scope": "markup.heading.setext",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "[VSCODE-CUSTOM] Markdown Punctuation Definition Bold",
+      "scope": "punctuation.definition.bold.markdown",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "[VSCODE-CUSTOM] Markdown Inline Raw",
+      "scope": "markup.inline.raw.markdown",
+      "settings": {
+        "foreground": "#98c379"
+      }
+    },
+    {
+      "name": "[VSCODE-CUSTOM] Markdown Inline Raw",
+      "scope": "markup.inline.raw.string.markdown",
+      "settings": {
+        "foreground": "#98c379"
+      }
+    },
+    {
+      "name": "[VSCODE-CUSTOM] Markdown Inline Raw punctuation",
+      "scope": "punctuation.definition.raw.markdown",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "[VSCODE-CUSTOM] Markdown List Punctuation Definition",
+      "scope": "punctuation.definition.list.markdown",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "[VSCODE-CUSTOM] Markdown Punctuation Definition String",
+      "scope": [
+        "punctuation.definition.string.begin.markdown",
+        "punctuation.definition.string.end.markdown",
+        "punctuation.definition.metadata.markdown"
+      ],
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "beginning.punctuation.definition.list.markdown",
+      "scope": [
+        "beginning.punctuation.definition.list.markdown"
+      ],
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "[VSCODE-CUSTOM] Markdown Punctuation Definition Link",
+      "scope": "punctuation.definition.metadata.markdown",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "[VSCODE-CUSTOM] Markdown Underline Link/Image",
+      "scope": "markup.underline.link.markdown,markup.underline.link.image.markdown",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "[VSCODE-CUSTOM] Markdown Link Title/Description",
+      "scope": "string.other.link.title.markdown,string.other.link.description.markdown",
+      "settings": {
+        "foreground": "#61afef"
+      }
+    },
+    {
+      "name": "[VSCODE-CUSTOM] Asciidoc Inline Raw",
+      "scope": "markup.raw.monospace.asciidoc",
+      "settings": {
+        "foreground": "#98c379"
+      }
+    },
+    {
+      "name": "[VSCODE-CUSTOM] Asciidoc Inline Raw Punctuation Definition",
+      "scope": "punctuation.definition.asciidoc",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "[VSCODE-CUSTOM] Asciidoc List Punctuation Definition",
+      "scope": "markup.list.asciidoc",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "[VSCODE-CUSTOM] Asciidoc underline link",
+      "scope": "markup.link.asciidoc,markup.other.url.asciidoc",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "[VSCODE-CUSTOM] Asciidoc link name",
+      "scope": "string.unquoted.asciidoc,markup.other.url.asciidoc",
+      "settings": {
+        "foreground": "#61afef"
+      }
+    },
+    {
+      "name": "Regular Expressions",
+      "scope": "string.regexp",
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "Escape Characters",
+      "scope": "constant.character.escape",
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "Embedded",
+      "scope": "punctuation.section.embedded, variable.interpolation",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "Embedded",
+      "scope": "punctuation.section.embedded.begin,punctuation.section.embedded.end",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "illegal",
+      "scope": "invalid.illegal",
+      "settings": {
+        "foreground": "#ffffff"
+      }
+    },
+    {
+      "name": "illegal",
+      "scope": "invalid.illegal.bad-ampersand.html",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "Broken",
+      "scope": "invalid.broken",
+      "settings": {
+        "foreground": "#ffffff"
+      }
+    },
+    {
+      "name": "Deprecated",
+      "scope": "invalid.deprecated",
+      "settings": {
+        "foreground": "#ffffff"
+      }
+    },
+    {
+      "name": "Unimplemented",
+      "scope": "invalid.unimplemented",
+      "settings": {
+        "foreground": "#ffffff"
+      }
+    },
+    {
+      "name": "Source Json Meta Structure Dictionary Json > String Quoted Json",
+      "scope": "source.json meta.structure.dictionary.json > string.quoted.json",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "Source Json Meta Structure Dictionary Json > String Quoted Json > Punctuation String",
+      "scope": "source.json meta.structure.dictionary.json > string.quoted.json > punctuation.string",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "Source Json Meta Structure Dictionary Json > Value Json > String Quoted Json,source Json Meta Structure Array Json > Value Json > String Quoted Json,source Json Meta Structure Dictionary Json > Value Json > String Quoted Json > Punctuation,source Json Meta Structure Array Json > Value Json > String Quoted Json > Punctuation",
+      "scope": "source.json meta.structure.dictionary.json > value.json > string.quoted.json,source.json meta.structure.array.json > value.json > string.quoted.json,source.json meta.structure.dictionary.json > value.json > string.quoted.json > punctuation,source.json meta.structure.array.json > value.json > string.quoted.json > punctuation",
+      "settings": {
+        "foreground": "#98c379"
+      }
+    },
+    {
+      "name": "Source Json Meta Structure Dictionary Json > Constant Language Json,source Json Meta Structure Array Json > Constant Language Json",
+      "scope": "source.json meta.structure.dictionary.json > constant.language.json,source.json meta.structure.array.json > constant.language.json",
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "[VSCODE-CUSTOM] JSON Property Name",
+      "scope": "support.type.property-name.json",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "[VSCODE-CUSTOM] JSON Punctuation for Property Name",
+      "scope": "support.type.property-name.json punctuation",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "laravel blade tag",
+      "scope": "text.html.laravel-blade source.php.embedded.line.html entity.name.tag.laravel-blade",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "laravel blade @",
+      "scope": "text.html.laravel-blade source.php.embedded.line.html support.constant.laravel-blade",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "use statement for other classes",
+      "scope": "support.other.namespace.use.php,support.other.namespace.use-as.php,entity.other.alias.php,meta.interface.php",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "error suppression",
+      "scope": "keyword.operator.error-control.php",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "php instanceof",
+      "scope": "keyword.operator.type.php",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "style double quoted array index normal begin",
+      "scope": "punctuation.section.array.begin.php",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "style double quoted array index normal end",
+      "scope": "punctuation.section.array.end.php",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "php illegal.non-null-typehinted",
+      "scope": "invalid.illegal.non-null-typehinted.php",
+      "settings": {
+        "foreground": "#f44747"
+      }
+    },
+    {
+      "name": "php types",
+      "scope": "storage.type.php,meta.other.type.phpdoc.php,keyword.other.type.php,keyword.other.array.phpdoc.php",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "php call-function",
+      "scope": "meta.function-call.php,meta.function-call.object.php,meta.function-call.static.php",
+      "settings": {
+        "foreground": "#61afef"
+      }
+    },
+    {
+      "name": "php function-resets",
+      "scope": "punctuation.definition.parameters.begin.bracket.round.php,punctuation.definition.parameters.end.bracket.round.php,punctuation.separator.delimiter.php,punctuation.section.scope.begin.php,punctuation.section.scope.end.php,punctuation.terminator.expression.php,punctuation.definition.arguments.begin.bracket.round.php,punctuation.definition.arguments.end.bracket.round.php,punctuation.definition.storage-type.begin.bracket.round.php,punctuation.definition.storage-type.end.bracket.round.php,punctuation.definition.array.begin.bracket.round.php,punctuation.definition.array.end.bracket.round.php,punctuation.definition.begin.bracket.round.php,punctuation.definition.end.bracket.round.php,punctuation.definition.begin.bracket.curly.php,punctuation.definition.end.bracket.curly.php,punctuation.definition.section.switch-block.end.bracket.curly.php,punctuation.definition.section.switch-block.start.bracket.curly.php,punctuation.definition.section.switch-block.begin.bracket.curly.php,punctuation.definition.section.switch-block.end.bracket.curly.php",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "support php constants",
+      "scope": "support.constant.core.rust",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "support php constants",
+      "scope": "support.constant.ext.php,support.constant.std.php,support.constant.core.php,support.constant.parser-token.php",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "php goto",
+      "scope": "entity.name.goto-label.php,support.other.php",
+      "settings": {
+        "foreground": "#61afef"
+      }
+    },
+    {
+      "name": "php logical/bitwise operator",
+      "scope": "keyword.operator.logical.php,keyword.operator.bitwise.php,keyword.operator.arithmetic.php",
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "php regexp operator",
+      "scope": "keyword.operator.regexp.php",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "php comparison",
+      "scope": "keyword.operator.comparison.php",
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "php heredoc/nowdoc",
+      "scope": "keyword.operator.heredoc.php,keyword.operator.nowdoc.php",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "python function decorator @",
+      "scope": "meta.function.decorator.python",
+      "settings": {
+        "foreground": "#61afef"
+      }
+    },
+    {
+      "name": "python function support",
+      "scope": "support.token.decorator.python,meta.function.decorator.identifier.python",
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "parameter function js/ts",
+      "scope": "function.parameter",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "brace function",
+      "scope": "function.brace",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "parameter function ruby cs",
+      "scope": "function.parameter.ruby, function.parameter.cs",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "constant.language.symbol.ruby",
+      "scope": "constant.language.symbol.ruby",
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "rgb-value",
+      "scope": "rgb-value",
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "rgb value",
+      "scope": "inline-color-decoration rgb-value",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "rgb value less",
+      "scope": "less rgb-value",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "sass selector",
+      "scope": "selector.sass",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "ts primitive/builtin types",
+      "scope": "support.type.primitive.ts,support.type.builtin.ts,support.type.primitive.tsx,support.type.builtin.tsx",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "block scope",
+      "scope": "block.scope.end,block.scope.begin",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "cs storage type",
+      "scope": "storage.type.cs",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "cs local variable",
+      "scope": "entity.name.variable.local.cs",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "scope": "token.info-token",
+      "settings": {
+        "foreground": "#61afef"
+      }
+    },
+    {
+      "scope": "token.warn-token",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "scope": "token.error-token",
+      "settings": {
+        "foreground": "#f44747"
+      }
+    },
+    {
+      "scope": "token.debug-token",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "String interpolation",
+      "scope": [
+        "punctuation.definition.template-expression.begin",
+        "punctuation.definition.template-expression.end",
+        "punctuation.section.embedded"
+      ],
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "Reset JavaScript string interpolation expression",
+      "scope": [
+        "meta.template.expression"
+      ],
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "Import module JS",
+      "scope": [
+        "keyword.operator.module"
+      ],
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "js Flowtype",
+      "scope": [
+        "support.type.type.flowtype"
+      ],
+      "settings": {
+        "foreground": "#61afef"
+      }
+    },
+    {
+      "name": "js Flow",
+      "scope": [
+        "support.type.primitive"
+      ],
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "js class prop",
+      "scope": [
+        "meta.property.object"
+      ],
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "js func parameter",
+      "scope": [
+        "variable.parameter.function.js"
+      ],
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "js template literals begin",
+      "scope": [
+        "keyword.other.template.begin"
+      ],
+      "settings": {
+        "foreground": "#98c379"
+      }
+    },
+    {
+      "name": "js template literals end",
+      "scope": [
+        "keyword.other.template.end"
+      ],
+      "settings": {
+        "foreground": "#98c379"
+      }
+    },
+    {
+      "name": "js template literals variable braces begin",
+      "scope": [
+        "keyword.other.substitution.begin"
+      ],
+      "settings": {
+        "foreground": "#98c379"
+      }
+    },
+    {
+      "name": "js template literals variable braces end",
+      "scope": [
+        "keyword.other.substitution.end"
+      ],
+      "settings": {
+        "foreground": "#98c379"
+      }
+    },
+    {
+      "name": "js operator.assignment",
+      "scope": [
+        "keyword.operator.assignment"
+      ],
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "go operator",
+      "scope": [
+        "keyword.operator.assignment.go"
+      ],
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "go operator",
+      "scope": [
+        "keyword.operator.arithmetic.go",
+        "keyword.operator.address.go"
+      ],
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "Go package name",
+      "scope": [
+        "entity.name.package.go"
+      ],
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "elm prelude",
+      "scope": [
+        "support.type.prelude.elm"
+      ],
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "elm constant",
+      "scope": [
+        "support.constant.elm"
+      ],
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "template literal",
+      "scope": [
+        "punctuation.quasi.element"
+      ],
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "html/pug (jade) escaped characters and entities",
+      "scope": [
+        "constant.character.entity"
+      ],
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "styling css pseudo-elements/classes to be able to differentiate from classes which are the same colour",
+      "scope": [
+        "entity.other.attribute-name.pseudo-element",
+        "entity.other.attribute-name.pseudo-class"
+      ],
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "Clojure globals",
+      "scope": [
+        "entity.global.clojure"
+      ],
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "Clojure symbols",
+      "scope": [
+        "meta.symbol.clojure"
+      ],
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "Clojure constants",
+      "scope": [
+        "constant.keyword.clojure"
+      ],
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "CoffeeScript Function Argument",
+      "scope": [
+        "meta.arguments.coffee",
+        "variable.parameter.function.coffee"
+      ],
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "Ini Default Text",
+      "scope": [
+        "source.ini"
+      ],
+      "settings": {
+        "foreground": "#98c379"
+      }
+    },
+    {
+      "name": "Makefile prerequisities",
+      "scope": [
+        "meta.scope.prerequisites.makefile"
+      ],
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "Makefile text colour",
+      "scope": [
+        "source.makefile"
+      ],
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "Groovy import names",
+      "scope": [
+        "storage.modifier.import.groovy"
+      ],
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "Groovy Methods",
+      "scope": [
+        "meta.method.groovy"
+      ],
+      "settings": {
+        "foreground": "#61afef"
+      }
+    },
+    {
+      "name": "Groovy Variables",
+      "scope": [
+        "meta.definition.variable.name.groovy"
+      ],
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "Groovy Inheritance",
+      "scope": [
+        "meta.definition.class.inherited.classes.groovy"
+      ],
+      "settings": {
+        "foreground": "#98c379"
+      }
+    },
+    {
+      "name": "HLSL Semantic",
+      "scope": [
+        "support.variable.semantic.hlsl"
+      ],
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "HLSL Types",
+      "scope": [
+        "support.type.texture.hlsl",
+        "support.type.sampler.hlsl",
+        "support.type.object.hlsl",
+        "support.type.object.rw.hlsl",
+        "support.type.fx.hlsl",
+        "support.type.object.hlsl"
+      ],
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "SQL Variables",
+      "scope": [
+        "text.variable",
+        "text.bracketed"
+      ],
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "types",
+      "scope": [
+        "support.type.swift",
+        "support.type.vb.asp"
+      ],
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "heading 1, keyword",
+      "scope": [
+        "entity.name.function.xi"
+      ],
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "heading 2, callable",
+      "scope": [
+        "entity.name.class.xi"
+      ],
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "heading 3, property",
+      "scope": [
+        "constant.character.character-class.regexp.xi"
+      ],
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "heading 4, type, class, interface",
+      "scope": [
+        "constant.regexp.xi"
+      ],
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "heading 5, enums, preprocessor, constant, decorator",
+      "scope": [
+        "keyword.control.xi"
+      ],
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "heading 6, number",
+      "scope": [
+        "invalid.xi"
+      ],
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "string",
+      "scope": [
+        "beginning.punctuation.definition.quote.markdown.xi"
+      ],
+      "settings": {
+        "foreground": "#98c379"
+      }
+    },
+    {
+      "name": "comments",
+      "scope": [
+        "beginning.punctuation.definition.list.markdown.xi"
+      ],
+      "settings": {
+        "foreground": "#7f848e"
+      }
+    },
+    {
+      "name": "link",
+      "scope": [
+        "constant.character.xi"
+      ],
+      "settings": {
+        "foreground": "#61afef"
+      }
+    },
+    {
+      "name": "accent",
+      "scope": [
+        "accent.xi"
+      ],
+      "settings": {
+        "foreground": "#61afef"
+      }
+    },
+    {
+      "name": "wikiword",
+      "scope": [
+        "wikiword.xi"
+      ],
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "language operators like '+', '-' etc",
+      "scope": [
+        "constant.other.color.rgb-value.xi"
+      ],
+      "settings": {
+        "foreground": "#ffffff"
+      }
+    },
+    {
+      "name": "elements to dim",
+      "scope": [
+        "punctuation.definition.tag.xi"
+      ],
+      "settings": {
+        "foreground": "#5c6370"
+      }
+    },
+    {
+      "name": "C++/C#",
+      "scope": [
+        "entity.name.label.cs",
+        "entity.name.scope-resolution.function.call",
+        "entity.name.scope-resolution.function.definition"
+      ],
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "Markdown underscore-style headers",
+      "scope": [
+        "entity.name.label.cs",
+        "markup.heading.setext.1.markdown",
+        "markup.heading.setext.2.markdown"
+      ],
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "meta.brace.square",
+      "scope": [
+        " meta.brace.square"
+      ],
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "Comments",
+      "scope": "comment, punctuation.definition.comment",
+      "settings": {
+        "foreground": "#7f848e"
+      }
+    },
+    {
+      "name": "[VSCODE-CUSTOM] Markdown Quote",
+      "scope": "markup.quote.markdown",
+      "settings": {
+        "foreground": "#5c6370"
+      }
+    },
+    {
+      "name": "punctuation.definition.block.sequence.item.yaml",
+      "scope": "punctuation.definition.block.sequence.item.yaml",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "scope": [
+        "constant.language.symbol.elixir",
+        "constant.language.symbol.double-quoted.elixir"
+      ],
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "scope": [
+        "entity.name.variable.parameter.cs"
+      ],
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "scope": [
+        "entity.name.variable.field.cs"
+      ],
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "Deleted",
+      "scope": "markup.deleted",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "Inserted",
+      "scope": "markup.inserted",
+      "settings": {
+        "foreground": "#98c379"
+      }
+    },
+    {
+      "name": "Underline",
+      "scope": "markup.underline",
+      "settings": {
+        "fontStyle": "underline"
+      }
+    },
+    {
+      "name": "punctuation.section.embedded.begin.php",
+      "scope": [
+        "punctuation.section.embedded.begin.php",
+        "punctuation.section.embedded.end.php"
+      ],
+      "settings": {
+        "foreground": "#BE5046"
+      }
+    },
+    {
+      "name": "support.other.namespace.php",
+      "scope": [
+        "support.other.namespace.php"
+      ],
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "variable.other.object",
+      "scope": [
+        "variable.other.object"
+      ],
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "variable.other.constant.property",
+      "scope": [
+        "variable.other.constant.property"
+      ],
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "entity.other.inherited-class",
+      "scope": [
+        "entity.other.inherited-class"
+      ],
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    }
+  ],
+  "colors": {
+    "activityBar.background": "#23272e",
+    "activityBar.foreground": "#d7dae0",
+    "activityBarBadge.background": "#4d78cc",
+    "activityBarBadge.foreground": "#f8fafd",
+    "badge.background": "#23272e",
+    "button.background": "#404754",
+    "button.secondaryBackground": "#30333d",
+    "button.secondaryForeground": "#c0bdbd",
+    "checkbox.border": "#404754",
+    "debugToolBar.background": "#1e2227",
+    "descriptionForeground": "#abb2bf",
+    "diffEditor.insertedTextBackground": "#00809b33",
+    "dropdown.background": "#1e2227",
+    "dropdown.border": "#1e2227",
+    "editor.background": "#23272e",
+    "editor.findMatchBackground": "#42557b",
+    "editor.findMatchBorder": "#457dff",
+    "editor.findMatchHighlightBackground": "#6199ff2f",
+    "editor.foreground": "#abb2bf",
+    "editorInlayHint.foreground": "#abb2bf",
+    "editorInlayHint.background": "#2c313c",
+    "editor.lineHighlightBackground": "#2c313c",
+    "editorLineNumber.activeForeground": "#abb2bf",
+    "editorGutter.addedBackground": "#109868",
+    "editorGutter.deletedBackground": "#9A353D",
+    "editorGutter.modifiedBackground": "#948B60",
+    "editorOverviewRuler.addedBackground": "#109868",
+    "editorOverviewRuler.deletedBackground": "#9A353D",
+    "editorOverviewRuler.modifiedBackground": "#948B60",
+    "editor.selectionBackground": "#67769660",
+    "editor.selectionHighlightBackground": "#ffffff10",
+    "editor.selectionHighlightBorder": "#dddddd",
+    "editor.wordHighlightBackground": "#d2e0ff2f",
+    "editor.wordHighlightBorder": "#7f848e",
+    "editor.wordHighlightStrongBackground": "#abb2bf26",
+    "editor.wordHighlightStrongBorder": "#7f848e",
+    "editorActiveLineNumber.foreground": "#737984",
+    "editorBracketMatch.background": "#515a6b",
+    "editorBracketMatch.border": "#515a6b",
+    "editorCursor.background": "#ffffffc9",
+    "editorCursor.foreground": "#528bff",
+    "editorError.foreground": "#c24038",
+    "editorGroup.background": "#181a1f",
+    "editorGroup.border": "#181a1f",
+    "editorGroupHeader.tabsBackground": "#1e2227",
+    "editorHoverWidget.background": "#1e2227",
+    "editorHoverWidget.border": "#181a1f",
+    "editorIndentGuide.activeBackground": "#c8c8c859",
+    "editorIndentGuide.background": "#3b4048",
+    "editorLineNumber.foreground": "#495162",
+    "editorMarkerNavigation.background": "#1e2227",
+    "editorRuler.foreground": "#abb2bf26",
+    "editorSuggestWidget.background": "#1e2227",
+    "editorSuggestWidget.border": "#181a1f",
+    "editorSuggestWidget.selectedBackground": "#2c313a",
+    "editorWarning.foreground": "#d19a66",
+    "editorWhitespace.foreground": "#3b4048",
+    "editorWidget.background": "#1e2227",
+    "focusBorder": "#3e4452",
+    "gitDecoration.ignoredResourceForeground": "#636b78",
+    "input.background": "#1d1f23",
+    "list.activeSelectionBackground": "#2c313a",
+    "list.activeSelectionForeground": "#d7dae0",
+    "list.focusBackground": "#323842",
+    "list.focusForeground": "#f0f0f0",
+    "list.highlightForeground": "#c5c5c5",
+    "list.hoverBackground": "#2c313a",
+    "list.hoverForeground": "#fff",
+    "list.inactiveSelectionBackground": "#323842",
+    "list.inactiveSelectionForeground": "#d7dae0",
+    "list.warningForeground": "#d19a66",
+    "menu.foreground": "#abb2bf",
+    "menu.separatorBackground": "#343a45",
+    "minimapGutter.addedBackground": "#109868",
+    "minimapGutter.deletedBackground": "#9A353D",
+    "minimapGutter.modifiedBackground": "#948B60",
+    "panelSectionHeader.background": "#1e2227",
+    "peekViewEditor.background": "#1b1d23",
+    "peekViewEditor.matchHighlightBackground": "#29244b",
+    "peekViewResult.background": "#22262b",
+    "scrollbar.shadow": "#23252c",
+    "scrollbarSlider.activeBackground": "#747d9180",
+    "scrollbarSlider.background": "#4e566660",
+    "scrollbarSlider.hoverBackground": "#5a637580",
+    "settings.focusedRowBackground": "#23272e",
+    "settings.headerForeground": "#fff",
+    "sideBar.background": "#1e2227",
+    "sideBar.foreground": "#abb2bf",
+    "sideBarSectionHeader.background": "#23272e",
+    "sideBarSectionHeader.foreground": "#abb2bf",
+    "statusBar.background": "#1e2227",
+    "statusBar.debuggingBackground": "#cc6633",
+    "statusBar.debuggingBorder": "#66017a",
+    "statusBar.debuggingForeground": "#ffffff",
+    "statusBar.foreground": "#9da5b4",
+    "statusBar.noFolderBackground": "#1e2227",
+    "statusBarItem.hoverBackground": "#2c313a",
+    "statusBarItem.remoteBackground": "#4d78cc",
+    "statusBarItem.remoteForeground": "#f8fafd",
+    "tab.activeBackground": "#23272e",
+    "tab.activeForeground": "#dcdcdc",
+    "tab.border": "#181a1f",
+    "tab.hoverBackground": "#323842",
+    "tab.inactiveBackground": "#1e2227",
+    "tab.unfocusedHoverBackground": "#323842",
+    "terminal.ansiBlack": "#3f4451",
+    "terminal.ansiBlue": "#4aa5f0",
+    "terminal.ansiBrightBlack": "#4f5666",
+    "terminal.ansiBrightBlue": "#4dc4ff",
+    "terminal.ansiBrightCyan": "#4cd1e0",
+    "terminal.ansiBrightGreen": "#a5e075",
+    "terminal.ansiBrightMagenta": "#de73ff",
+    "terminal.ansiBrightRed": "#ff616e",
+    "terminal.ansiBrightWhite": "#d7dae0",
+    "terminal.ansiBrightYellow": "#f0a45d",
+    "terminal.ansiCyan": "#42b3c2",
+    "terminal.ansiGreen": "#8cc265",
+    "terminal.ansiMagenta": "#c162de",
+    "terminal.ansiRed": "#e05561",
+    "terminal.ansiWhite": "#e6e6e6",
+    "terminal.ansiYellow": "#d18f52",
+    "terminal.background": "#23272e",
+    "terminal.border": "#abb2bf",
+    "terminal.foreground": "#abb2bf",
+    "terminal.selectionBackground": "#abb2bf30",
+    "textBlockQuote.background": "#2e3440",
+    "textBlockQuote.border": "#4b5362",
+    "textLink.foreground": "#61afef",
+    "textPreformat.foreground": "#d19a66",
+    "titleBar.activeBackground": "#23272e",
+    "titleBar.activeForeground": "#9da5b4",
+    "titleBar.inactiveBackground": "#1e2227",
+    "titleBar.inactiveForeground": "#6b717d",
+    "walkThrough.embeddedEditorBackground": "#2e3440",
+    "welcomePage.buttonHoverBackground": "#404754"
+  }
+}

+ 2157 - 0
src/extensions/oneDarkPro/themes/OneDark-Pro-flat.json

@@ -0,0 +1,2157 @@
+{
+  "name": "One Dark Pro",
+  "type": "dark",
+  "semanticHighlighting": true,
+  "semanticTokenColors": {
+    "enumMember": {
+      "foreground": "#56b6c2"
+    },
+    "variable.constant": {
+      "foreground": "#d19a66"
+    },
+    "variable.defaultLibrary": {
+      "foreground": "#e5c07b"
+    },
+    "variable:dart": {
+      "foreground": "#d19a66"
+    },
+    "property:dart": {
+      "foreground": "#d19a66"
+    },
+    "annotation:dart": {
+      "foreground": "#d19a66"
+    },
+    "parameter.label:dart": {
+      "foreground": "#abb2bf"
+    }
+  },
+  "tokenColors": [
+    {
+      "name": "unison punctuation",
+      "scope": "punctuation.definition.delayed.unison,punctuation.definition.list.begin.unison,punctuation.definition.list.end.unison,punctuation.definition.ability.begin.unison,punctuation.definition.ability.end.unison,punctuation.operator.assignment.as.unison,punctuation.separator.pipe.unison,punctuation.separator.delimiter.unison,punctuation.definition.hash.unison",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "haskell variable generic-type",
+      "scope": "variable.other.generic-type.haskell",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "haskell storage type",
+      "scope": "storage.type.haskell",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "support.variable.magic.python",
+      "scope": "support.variable.magic.python",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "punctuation.separator.parameters.python",
+      "scope": "punctuation.separator.period.python,punctuation.separator.element.python,punctuation.parenthesis.begin.python,punctuation.parenthesis.end.python",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "variable.parameter.function.language.special.self.python",
+      "scope": "variable.parameter.function.language.special.self.python",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "variable.parameter.function.language.special.cls.python",
+      "scope": "variable.parameter.function.language.special.cls.python",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "storage.modifier.lifetime.rust",
+      "scope": "storage.modifier.lifetime.rust",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "support.function.std.rust",
+      "scope": "support.function.std.rust",
+      "settings": {
+        "foreground": "#61afef"
+      }
+    },
+    {
+      "name": "entity.name.lifetime.rust",
+      "scope": "entity.name.lifetime.rust",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "variable.language.rust",
+      "scope": "variable.language.rust",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "support.constant.edge",
+      "scope": "support.constant.edge",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "regexp constant character-class",
+      "scope": "constant.other.character-class.regexp",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "regexp operator.quantifier",
+      "scope": "keyword.operator.quantifier.regexp",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "punctuation.definition",
+      "scope": "punctuation.definition.string.begin,punctuation.definition.string.end",
+      "settings": {
+        "foreground": "#98c379"
+      }
+    },
+    {
+      "name": "Text",
+      "scope": "variable.parameter.function",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "Comment Markup Link",
+      "scope": "comment markup.link",
+      "settings": {
+        "foreground": "#5c6370"
+      }
+    },
+    {
+      "name": "markup diff",
+      "scope": "markup.changed.diff",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "diff",
+      "scope": "meta.diff.header.from-file,meta.diff.header.to-file,punctuation.definition.from-file.diff,punctuation.definition.to-file.diff",
+      "settings": {
+        "foreground": "#61afef"
+      }
+    },
+    {
+      "name": "inserted.diff",
+      "scope": "markup.inserted.diff",
+      "settings": {
+        "foreground": "#98c379"
+      }
+    },
+    {
+      "name": "deleted.diff",
+      "scope": "markup.deleted.diff",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "c++ function",
+      "scope": "meta.function.c,meta.function.cpp",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "c++ block",
+      "scope": "punctuation.section.block.begin.bracket.curly.cpp,punctuation.section.block.end.bracket.curly.cpp,punctuation.terminator.statement.c,punctuation.section.block.begin.bracket.curly.c,punctuation.section.block.end.bracket.curly.c,punctuation.section.parens.begin.bracket.round.c,punctuation.section.parens.end.bracket.round.c,punctuation.section.parameters.begin.bracket.round.c,punctuation.section.parameters.end.bracket.round.c",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "js/ts punctuation separator key-value",
+      "scope": "punctuation.separator.key-value",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "js/ts import keyword",
+      "scope": "keyword.operator.expression.import",
+      "settings": {
+        "foreground": "#61afef"
+      }
+    },
+    {
+      "name": "math js/ts",
+      "scope": "support.constant.math",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "math property js/ts",
+      "scope": "support.constant.property.math",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "js/ts variable.other.constant",
+      "scope": "variable.other.constant",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "java type",
+      "scope": [
+        "storage.type.annotation.java",
+        "storage.type.object.array.java"
+      ],
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "java source",
+      "scope": "source.java",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "java modifier.import",
+      "scope": "punctuation.section.block.begin.java,punctuation.section.block.end.java,punctuation.definition.method-parameters.begin.java,punctuation.definition.method-parameters.end.java,meta.method.identifier.java,punctuation.section.method.begin.java,punctuation.section.method.end.java,punctuation.terminator.java,punctuation.section.class.begin.java,punctuation.section.class.end.java,punctuation.section.inner-class.begin.java,punctuation.section.inner-class.end.java,meta.method-call.java,punctuation.section.class.begin.bracket.curly.java,punctuation.section.class.end.bracket.curly.java,punctuation.section.method.begin.bracket.curly.java,punctuation.section.method.end.bracket.curly.java,punctuation.separator.period.java,punctuation.bracket.angle.java,punctuation.definition.annotation.java,meta.method.body.java",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "java modifier.import",
+      "scope": "meta.method.java",
+      "settings": {
+        "foreground": "#61afef"
+      }
+    },
+    {
+      "name": "java modifier.import",
+      "scope": "storage.modifier.import.java,storage.type.java,storage.type.generic.java",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "java instanceof",
+      "scope": "keyword.operator.instanceof.java",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "java variable.name",
+      "scope": "meta.definition.variable.name.java",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "operator logical",
+      "scope": "keyword.operator.logical",
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "operator bitwise",
+      "scope": "keyword.operator.bitwise",
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "operator channel",
+      "scope": "keyword.operator.channel",
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "support.constant.property-value.scss",
+      "scope": "support.constant.property-value.scss,support.constant.property-value.css",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "CSS/SCSS/LESS Operators",
+      "scope": "keyword.operator.css,keyword.operator.scss,keyword.operator.less",
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "css color standard name",
+      "scope": "support.constant.color.w3c-standard-color-name.css,support.constant.color.w3c-standard-color-name.scss",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "css comma",
+      "scope": "punctuation.separator.list.comma.css",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "css attribute-name.id",
+      "scope": "support.constant.color.w3c-standard-color-name.css",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "css property-name",
+      "scope": "support.type.vendored.property-name.css",
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "js/ts module",
+      "scope": "support.module.node,support.type.object.module,support.module.node",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "entity.name.type.module",
+      "scope": "entity.name.type.module",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "js variable readwrite",
+      "scope": "variable.other.readwrite,meta.object-literal.key,support.variable.property,support.variable.object.process,support.variable.object.node",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "js/ts json",
+      "scope": "support.constant.json",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "js/ts Keyword",
+      "scope": [
+        "keyword.operator.expression.instanceof",
+        "keyword.operator.new",
+        "keyword.operator.ternary",
+        "keyword.operator.optional",
+        "keyword.operator.expression.keyof"
+      ],
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "js/ts console",
+      "scope": "support.type.object.console",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "js/ts support.variable.property.process",
+      "scope": "support.variable.property.process",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "js console function",
+      "scope": "entity.name.function,support.function.console",
+      "settings": {
+        "foreground": "#61afef"
+      }
+    },
+    {
+      "name": "keyword.operator.misc.rust",
+      "scope": "keyword.operator.misc.rust",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "keyword.operator.sigil.rust",
+      "scope": "keyword.operator.sigil.rust",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "operator",
+      "scope": "keyword.operator.delete",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "js dom",
+      "scope": "support.type.object.dom",
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "js dom variable",
+      "scope": "support.variable.dom,support.variable.property.dom",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "keyword.operator",
+      "scope": "keyword.operator.arithmetic,keyword.operator.comparison,keyword.operator.decrement,keyword.operator.increment,keyword.operator.relational",
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "C operator assignment",
+      "scope": "keyword.operator.assignment.c,keyword.operator.comparison.c,keyword.operator.c,keyword.operator.increment.c,keyword.operator.decrement.c,keyword.operator.bitwise.shift.c,keyword.operator.assignment.cpp,keyword.operator.comparison.cpp,keyword.operator.cpp,keyword.operator.increment.cpp,keyword.operator.decrement.cpp,keyword.operator.bitwise.shift.cpp",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "Punctuation",
+      "scope": "punctuation.separator.delimiter",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "Other punctuation .c",
+      "scope": "punctuation.separator.c,punctuation.separator.cpp",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "C type posix-reserved",
+      "scope": "support.type.posix-reserved.c,support.type.posix-reserved.cpp",
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "keyword.operator.sizeof.c",
+      "scope": "keyword.operator.sizeof.c,keyword.operator.sizeof.cpp",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "python parameter",
+      "scope": "variable.parameter.function.language.python",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "python type",
+      "scope": "support.type.python",
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "python logical",
+      "scope": "keyword.operator.logical.python",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "pyCs",
+      "scope": "variable.parameter.function.python",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "python block",
+      "scope": "punctuation.definition.arguments.begin.python,punctuation.definition.arguments.end.python,punctuation.separator.arguments.python,punctuation.definition.list.begin.python,punctuation.definition.list.end.python",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "python function-call.generic",
+      "scope": "meta.function-call.generic.python",
+      "settings": {
+        "foreground": "#61afef"
+      }
+    },
+    {
+      "name": "python placeholder reset to normal string",
+      "scope": "constant.character.format.placeholder.other.python",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "Operators",
+      "scope": "keyword.operator",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "Compound Assignment Operators",
+      "scope": "keyword.operator.assignment.compound",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "Compound Assignment Operators js/ts",
+      "scope": "keyword.operator.assignment.compound.js,keyword.operator.assignment.compound.ts",
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "Keywords",
+      "scope": "keyword",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "Namespaces",
+      "scope": "entity.name.namespace",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "Variables",
+      "scope": "variable",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "Variables",
+      "scope": "variable.c",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "Language variables",
+      "scope": "variable.language",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "Java Variables",
+      "scope": "token.variable.parameter.java",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "Java Imports",
+      "scope": "import.storage.java",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "Packages",
+      "scope": "token.package.keyword",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "Packages",
+      "scope": "token.package",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "Functions",
+      "scope": [
+        "entity.name.function",
+        "meta.require",
+        "support.function.any-method",
+        "variable.function"
+      ],
+      "settings": {
+        "fontStyle": "bold",
+        "foreground": "#61afef"
+      }
+    },
+    {
+      "name": "Classes",
+      "scope": "entity.name.type.namespace",
+      "settings": {
+        "fontStyle": "bold",
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "Classes",
+      "scope": "support.class, entity.name.type.class",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "Class name",
+      "scope": "entity.name.class.identifier.namespace.type",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "Class name",
+      "scope": [
+        "entity.name.class",
+        "variable.other.class.js",
+        "variable.other.class.ts"
+      ],
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "Class name php",
+      "scope": "variable.other.class.php",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "Type Name",
+      "scope": "entity.name.type",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "Keyword Control",
+      "scope": "keyword.control",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "Control Elements",
+      "scope": "control.elements, keyword.operator.less",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "Methods",
+      "scope": "keyword.other.special-method",
+      "settings": {
+        "foreground": "#61afef"
+      }
+    },
+    {
+      "name": "Storage",
+      "scope": "storage",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "Storage JS TS",
+      "scope": "token.storage",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "Source Js Keyword Operator Delete,source Js Keyword Operator In,source Js Keyword Operator Of,source Js Keyword Operator Instanceof,source Js Keyword Operator New,source Js Keyword Operator Typeof,source Js Keyword Operator Void",
+      "scope": "keyword.operator.expression.delete,keyword.operator.expression.in,keyword.operator.expression.of,keyword.operator.expression.instanceof,keyword.operator.new,keyword.operator.expression.typeof,keyword.operator.expression.void",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "Java Storage",
+      "scope": "token.storage.type.java",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "Support",
+      "scope": "support.function",
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "Support type",
+      "scope": "support.type.property-name",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "Support type",
+      "scope": "support.constant.property-value",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "Support type",
+      "scope": "support.constant.font-name",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "Meta tag",
+      "scope": "meta.tag",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "Strings",
+      "scope": "string",
+      "settings": {
+        "foreground": "#98c379"
+      }
+    },
+    {
+      "name": "Constant other symbol",
+      "scope": "constant.other.symbol",
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "Integers",
+      "scope": "constant.numeric",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "Constants",
+      "scope": "constant",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "Constants",
+      "scope": "punctuation.definition.constant",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "Tags",
+      "scope": "entity.name.tag",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "Attributes",
+      "scope": "entity.other.attribute-name",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "Attribute IDs",
+      "scope": "entity.other.attribute-name.id",
+      "settings": {
+        "fontStyle": "normal",
+        "foreground": "#61afef"
+      }
+    },
+    {
+      "name": "Attribute class",
+      "scope": "entity.other.attribute-name.class.css",
+      "settings": {
+        "fontStyle": "normal",
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "Selector",
+      "scope": "meta.selector",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "Headings",
+      "scope": "markup.heading",
+      "settings": {
+        "fontStyle": "bold",
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "Headings",
+      "scope": "markup.heading punctuation.definition.heading, entity.name.section",
+      "settings": {
+        "foreground": "#61afef"
+      }
+    },
+    {
+      "name": "Units",
+      "scope": "keyword.other.unit",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "Bold",
+      "scope": "markup.bold,todo.bold",
+      "settings": {
+        "fontStyle": "bold",
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "Bold",
+      "scope": "punctuation.definition.bold",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "markup Italic",
+      "scope": "markup.italic, punctuation.definition.italic,todo.emphasis",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "emphasis md",
+      "scope": "emphasis md",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "[VSCODE-CUSTOM] Markdown headings",
+      "scope": "entity.name.section.markdown",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "[VSCODE-CUSTOM] Markdown heading Punctuation Definition",
+      "scope": "punctuation.definition.heading.markdown",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "punctuation.definition.list.begin.markdown",
+      "scope": "punctuation.definition.list.begin.markdown",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "[VSCODE-CUSTOM] Markdown heading setext",
+      "scope": "markup.heading.setext",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "[VSCODE-CUSTOM] Markdown Punctuation Definition Bold",
+      "scope": "punctuation.definition.bold.markdown",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "[VSCODE-CUSTOM] Markdown Inline Raw",
+      "scope": "markup.inline.raw.markdown",
+      "settings": {
+        "foreground": "#98c379"
+      }
+    },
+    {
+      "name": "[VSCODE-CUSTOM] Markdown Inline Raw",
+      "scope": "markup.inline.raw.string.markdown",
+      "settings": {
+        "foreground": "#98c379"
+      }
+    },
+    {
+      "name": "[VSCODE-CUSTOM] Markdown Inline Raw punctuation",
+      "scope": "punctuation.definition.raw.markdown",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "[VSCODE-CUSTOM] Markdown List Punctuation Definition",
+      "scope": "punctuation.definition.list.markdown",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "[VSCODE-CUSTOM] Markdown Punctuation Definition String",
+      "scope": [
+        "punctuation.definition.string.begin.markdown",
+        "punctuation.definition.string.end.markdown",
+        "punctuation.definition.metadata.markdown"
+      ],
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "beginning.punctuation.definition.list.markdown",
+      "scope": [
+        "beginning.punctuation.definition.list.markdown"
+      ],
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "[VSCODE-CUSTOM] Markdown Punctuation Definition Link",
+      "scope": "punctuation.definition.metadata.markdown",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "[VSCODE-CUSTOM] Markdown Underline Link/Image",
+      "scope": "markup.underline.link.markdown,markup.underline.link.image.markdown",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "[VSCODE-CUSTOM] Markdown Link Title/Description",
+      "scope": "string.other.link.title.markdown,string.other.link.description.markdown",
+      "settings": {
+        "foreground": "#61afef"
+      }
+    },
+    {
+      "name": "[VSCODE-CUSTOM] Asciidoc Inline Raw",
+      "scope": "markup.raw.monospace.asciidoc",
+      "settings": {
+        "foreground": "#98c379"
+      }
+    },
+    {
+      "name": "[VSCODE-CUSTOM] Asciidoc Inline Raw Punctuation Definition",
+      "scope": "punctuation.definition.asciidoc",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "[VSCODE-CUSTOM] Asciidoc List Punctuation Definition",
+      "scope": "markup.list.asciidoc",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "[VSCODE-CUSTOM] Asciidoc underline link",
+      "scope": "markup.link.asciidoc,markup.other.url.asciidoc",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "[VSCODE-CUSTOM] Asciidoc link name",
+      "scope": "string.unquoted.asciidoc,markup.other.url.asciidoc",
+      "settings": {
+        "foreground": "#61afef"
+      }
+    },
+    {
+      "name": "Regular Expressions",
+      "scope": "string.regexp",
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "Escape Characters",
+      "scope": "constant.character.escape",
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "Embedded",
+      "scope": "punctuation.section.embedded, variable.interpolation",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "Embedded",
+      "scope": "punctuation.section.embedded.begin,punctuation.section.embedded.end",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "illegal",
+      "scope": "invalid.illegal",
+      "settings": {
+        "foreground": "#ffffff"
+      }
+    },
+    {
+      "name": "illegal",
+      "scope": "invalid.illegal.bad-ampersand.html",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "Broken",
+      "scope": "invalid.broken",
+      "settings": {
+        "foreground": "#ffffff"
+      }
+    },
+    {
+      "name": "Deprecated",
+      "scope": "invalid.deprecated",
+      "settings": {
+        "foreground": "#ffffff"
+      }
+    },
+    {
+      "name": "Unimplemented",
+      "scope": "invalid.unimplemented",
+      "settings": {
+        "foreground": "#ffffff"
+      }
+    },
+    {
+      "name": "Source Json Meta Structure Dictionary Json > String Quoted Json",
+      "scope": "source.json meta.structure.dictionary.json > string.quoted.json",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "Source Json Meta Structure Dictionary Json > String Quoted Json > Punctuation String",
+      "scope": "source.json meta.structure.dictionary.json > string.quoted.json > punctuation.string",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "Source Json Meta Structure Dictionary Json > Value Json > String Quoted Json,source Json Meta Structure Array Json > Value Json > String Quoted Json,source Json Meta Structure Dictionary Json > Value Json > String Quoted Json > Punctuation,source Json Meta Structure Array Json > Value Json > String Quoted Json > Punctuation",
+      "scope": "source.json meta.structure.dictionary.json > value.json > string.quoted.json,source.json meta.structure.array.json > value.json > string.quoted.json,source.json meta.structure.dictionary.json > value.json > string.quoted.json > punctuation,source.json meta.structure.array.json > value.json > string.quoted.json > punctuation",
+      "settings": {
+        "foreground": "#98c379"
+      }
+    },
+    {
+      "name": "Source Json Meta Structure Dictionary Json > Constant Language Json,source Json Meta Structure Array Json > Constant Language Json",
+      "scope": "source.json meta.structure.dictionary.json > constant.language.json,source.json meta.structure.array.json > constant.language.json",
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "[VSCODE-CUSTOM] JSON Property Name",
+      "scope": "support.type.property-name.json",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "[VSCODE-CUSTOM] JSON Punctuation for Property Name",
+      "scope": "support.type.property-name.json punctuation",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "laravel blade tag",
+      "scope": "text.html.laravel-blade source.php.embedded.line.html entity.name.tag.laravel-blade",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "laravel blade @",
+      "scope": "text.html.laravel-blade source.php.embedded.line.html support.constant.laravel-blade",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "use statement for other classes",
+      "scope": "support.other.namespace.use.php,support.other.namespace.use-as.php,entity.other.alias.php,meta.interface.php",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "error suppression",
+      "scope": "keyword.operator.error-control.php",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "php instanceof",
+      "scope": "keyword.operator.type.php",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "style double quoted array index normal begin",
+      "scope": "punctuation.section.array.begin.php",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "style double quoted array index normal end",
+      "scope": "punctuation.section.array.end.php",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "php illegal.non-null-typehinted",
+      "scope": "invalid.illegal.non-null-typehinted.php",
+      "settings": {
+        "foreground": "#f44747"
+      }
+    },
+    {
+      "name": "php types",
+      "scope": "storage.type.php,meta.other.type.phpdoc.php,keyword.other.type.php,keyword.other.array.phpdoc.php",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "php call-function",
+      "scope": "meta.function-call.php,meta.function-call.object.php,meta.function-call.static.php",
+      "settings": {
+        "foreground": "#61afef"
+      }
+    },
+    {
+      "name": "php function-resets",
+      "scope": "punctuation.definition.parameters.begin.bracket.round.php,punctuation.definition.parameters.end.bracket.round.php,punctuation.separator.delimiter.php,punctuation.section.scope.begin.php,punctuation.section.scope.end.php,punctuation.terminator.expression.php,punctuation.definition.arguments.begin.bracket.round.php,punctuation.definition.arguments.end.bracket.round.php,punctuation.definition.storage-type.begin.bracket.round.php,punctuation.definition.storage-type.end.bracket.round.php,punctuation.definition.array.begin.bracket.round.php,punctuation.definition.array.end.bracket.round.php,punctuation.definition.begin.bracket.round.php,punctuation.definition.end.bracket.round.php,punctuation.definition.begin.bracket.curly.php,punctuation.definition.end.bracket.curly.php,punctuation.definition.section.switch-block.end.bracket.curly.php,punctuation.definition.section.switch-block.start.bracket.curly.php,punctuation.definition.section.switch-block.begin.bracket.curly.php,punctuation.definition.section.switch-block.end.bracket.curly.php",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "support php constants",
+      "scope": "support.constant.core.rust",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "support php constants",
+      "scope": "support.constant.ext.php,support.constant.std.php,support.constant.core.php,support.constant.parser-token.php",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "php goto",
+      "scope": "entity.name.goto-label.php,support.other.php",
+      "settings": {
+        "foreground": "#61afef"
+      }
+    },
+    {
+      "name": "php logical/bitwise operator",
+      "scope": "keyword.operator.logical.php,keyword.operator.bitwise.php,keyword.operator.arithmetic.php",
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "php regexp operator",
+      "scope": "keyword.operator.regexp.php",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "php comparison",
+      "scope": "keyword.operator.comparison.php",
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "php heredoc/nowdoc",
+      "scope": "keyword.operator.heredoc.php,keyword.operator.nowdoc.php",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "python function decorator @",
+      "scope": "meta.function.decorator.python",
+      "settings": {
+        "foreground": "#61afef"
+      }
+    },
+    {
+      "name": "python function support",
+      "scope": "support.token.decorator.python,meta.function.decorator.identifier.python",
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "parameter function js/ts",
+      "scope": "function.parameter",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "brace function",
+      "scope": "function.brace",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "parameter function ruby cs",
+      "scope": "function.parameter.ruby, function.parameter.cs",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "constant.language.symbol.ruby",
+      "scope": "constant.language.symbol.ruby",
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "rgb-value",
+      "scope": "rgb-value",
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "rgb value",
+      "scope": "inline-color-decoration rgb-value",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "rgb value less",
+      "scope": "less rgb-value",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "sass selector",
+      "scope": "selector.sass",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "ts primitive/builtin types",
+      "scope": "support.type.primitive.ts,support.type.builtin.ts,support.type.primitive.tsx,support.type.builtin.tsx",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "block scope",
+      "scope": "block.scope.end,block.scope.begin",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "cs storage type",
+      "scope": "storage.type.cs",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "cs local variable",
+      "scope": "entity.name.variable.local.cs",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "scope": "token.info-token",
+      "settings": {
+        "foreground": "#61afef"
+      }
+    },
+    {
+      "scope": "token.warn-token",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "scope": "token.error-token",
+      "settings": {
+        "foreground": "#f44747"
+      }
+    },
+    {
+      "scope": "token.debug-token",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "String interpolation",
+      "scope": [
+        "punctuation.definition.template-expression.begin",
+        "punctuation.definition.template-expression.end",
+        "punctuation.section.embedded"
+      ],
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "Reset JavaScript string interpolation expression",
+      "scope": [
+        "meta.template.expression"
+      ],
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "Import module JS",
+      "scope": [
+        "keyword.operator.module"
+      ],
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "js Flowtype",
+      "scope": [
+        "support.type.type.flowtype"
+      ],
+      "settings": {
+        "foreground": "#61afef"
+      }
+    },
+    {
+      "name": "js Flow",
+      "scope": [
+        "support.type.primitive"
+      ],
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "js class prop",
+      "scope": [
+        "meta.property.object"
+      ],
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "js func parameter",
+      "scope": [
+        "variable.parameter.function.js"
+      ],
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "js template literals begin",
+      "scope": [
+        "keyword.other.template.begin"
+      ],
+      "settings": {
+        "foreground": "#98c379"
+      }
+    },
+    {
+      "name": "js template literals end",
+      "scope": [
+        "keyword.other.template.end"
+      ],
+      "settings": {
+        "foreground": "#98c379"
+      }
+    },
+    {
+      "name": "js template literals variable braces begin",
+      "scope": [
+        "keyword.other.substitution.begin"
+      ],
+      "settings": {
+        "foreground": "#98c379"
+      }
+    },
+    {
+      "name": "js template literals variable braces end",
+      "scope": [
+        "keyword.other.substitution.end"
+      ],
+      "settings": {
+        "foreground": "#98c379"
+      }
+    },
+    {
+      "name": "js operator.assignment",
+      "scope": [
+        "keyword.operator.assignment"
+      ],
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "go operator",
+      "scope": [
+        "keyword.operator.assignment.go"
+      ],
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "go operator",
+      "scope": [
+        "keyword.operator.arithmetic.go",
+        "keyword.operator.address.go"
+      ],
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "Go package name",
+      "scope": [
+        "entity.name.package.go"
+      ],
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "elm prelude",
+      "scope": [
+        "support.type.prelude.elm"
+      ],
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "elm constant",
+      "scope": [
+        "support.constant.elm"
+      ],
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "template literal",
+      "scope": [
+        "punctuation.quasi.element"
+      ],
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "html/pug (jade) escaped characters and entities",
+      "scope": [
+        "constant.character.entity"
+      ],
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "styling css pseudo-elements/classes to be able to differentiate from classes which are the same colour",
+      "scope": [
+        "entity.other.attribute-name.pseudo-element",
+        "entity.other.attribute-name.pseudo-class"
+      ],
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "Clojure globals",
+      "scope": [
+        "entity.global.clojure"
+      ],
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "Clojure symbols",
+      "scope": [
+        "meta.symbol.clojure"
+      ],
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "Clojure constants",
+      "scope": [
+        "constant.keyword.clojure"
+      ],
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "CoffeeScript Function Argument",
+      "scope": [
+        "meta.arguments.coffee",
+        "variable.parameter.function.coffee"
+      ],
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "Ini Default Text",
+      "scope": [
+        "source.ini"
+      ],
+      "settings": {
+        "foreground": "#98c379"
+      }
+    },
+    {
+      "name": "Makefile prerequisities",
+      "scope": [
+        "meta.scope.prerequisites.makefile"
+      ],
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "Makefile text colour",
+      "scope": [
+        "source.makefile"
+      ],
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "Groovy import names",
+      "scope": [
+        "storage.modifier.import.groovy"
+      ],
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "Groovy Methods",
+      "scope": [
+        "meta.method.groovy"
+      ],
+      "settings": {
+        "foreground": "#61afef"
+      }
+    },
+    {
+      "name": "Groovy Variables",
+      "scope": [
+        "meta.definition.variable.name.groovy"
+      ],
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "Groovy Inheritance",
+      "scope": [
+        "meta.definition.class.inherited.classes.groovy"
+      ],
+      "settings": {
+        "foreground": "#98c379"
+      }
+    },
+    {
+      "name": "HLSL Semantic",
+      "scope": [
+        "support.variable.semantic.hlsl"
+      ],
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "HLSL Types",
+      "scope": [
+        "support.type.texture.hlsl",
+        "support.type.sampler.hlsl",
+        "support.type.object.hlsl",
+        "support.type.object.rw.hlsl",
+        "support.type.fx.hlsl",
+        "support.type.object.hlsl"
+      ],
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "SQL Variables",
+      "scope": [
+        "text.variable",
+        "text.bracketed"
+      ],
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "types",
+      "scope": [
+        "support.type.swift",
+        "support.type.vb.asp"
+      ],
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "heading 1, keyword",
+      "scope": [
+        "entity.name.function.xi"
+      ],
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "heading 2, callable",
+      "scope": [
+        "entity.name.class.xi"
+      ],
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "heading 3, property",
+      "scope": [
+        "constant.character.character-class.regexp.xi"
+      ],
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "heading 4, type, class, interface",
+      "scope": [
+        "constant.regexp.xi"
+      ],
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "heading 5, enums, preprocessor, constant, decorator",
+      "scope": [
+        "keyword.control.xi"
+      ],
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "heading 6, number",
+      "scope": [
+        "invalid.xi"
+      ],
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "string",
+      "scope": [
+        "beginning.punctuation.definition.quote.markdown.xi"
+      ],
+      "settings": {
+        "foreground": "#98c379"
+      }
+    },
+    {
+      "name": "comments",
+      "scope": [
+        "beginning.punctuation.definition.list.markdown.xi"
+      ],
+      "settings": {
+        "foreground": "#7f848e"
+      }
+    },
+    {
+      "name": "link",
+      "scope": [
+        "constant.character.xi"
+      ],
+      "settings": {
+        "foreground": "#61afef"
+      }
+    },
+    {
+      "name": "accent",
+      "scope": [
+        "accent.xi"
+      ],
+      "settings": {
+        "foreground": "#61afef"
+      }
+    },
+    {
+      "name": "wikiword",
+      "scope": [
+        "wikiword.xi"
+      ],
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "language operators like '+', '-' etc",
+      "scope": [
+        "constant.other.color.rgb-value.xi"
+      ],
+      "settings": {
+        "foreground": "#ffffff"
+      }
+    },
+    {
+      "name": "elements to dim",
+      "scope": [
+        "punctuation.definition.tag.xi"
+      ],
+      "settings": {
+        "foreground": "#5c6370"
+      }
+    },
+    {
+      "name": "C++/C#",
+      "scope": [
+        "entity.name.label.cs",
+        "entity.name.scope-resolution.function.call",
+        "entity.name.scope-resolution.function.definition"
+      ],
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "Markdown underscore-style headers",
+      "scope": [
+        "entity.name.label.cs",
+        "markup.heading.setext.1.markdown",
+        "markup.heading.setext.2.markdown"
+      ],
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "meta.brace.square",
+      "scope": [
+        " meta.brace.square"
+      ],
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "Comments",
+      "scope": "comment, punctuation.definition.comment",
+      "settings": {
+        "foreground": "#7f848e"
+      }
+    },
+    {
+      "name": "[VSCODE-CUSTOM] Markdown Quote",
+      "scope": "markup.quote.markdown",
+      "settings": {
+        "foreground": "#5c6370"
+      }
+    },
+    {
+      "name": "punctuation.definition.block.sequence.item.yaml",
+      "scope": "punctuation.definition.block.sequence.item.yaml",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "scope": [
+        "constant.language.symbol.elixir",
+        "constant.language.symbol.double-quoted.elixir"
+      ],
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "scope": [
+        "entity.name.variable.parameter.cs"
+      ],
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "scope": [
+        "entity.name.variable.field.cs"
+      ],
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "Deleted",
+      "scope": "markup.deleted",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "Inserted",
+      "scope": "markup.inserted",
+      "settings": {
+        "foreground": "#98c379"
+      }
+    },
+    {
+      "name": "Underline",
+      "scope": "markup.underline",
+      "settings": {
+        "fontStyle": "underline"
+      }
+    },
+    {
+      "name": "punctuation.section.embedded.begin.php",
+      "scope": [
+        "punctuation.section.embedded.begin.php",
+        "punctuation.section.embedded.end.php"
+      ],
+      "settings": {
+        "foreground": "#BE5046"
+      }
+    },
+    {
+      "name": "support.other.namespace.php",
+      "scope": [
+        "support.other.namespace.php"
+      ],
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "variable.other.object",
+      "scope": [
+        "variable.other.object"
+      ],
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "variable.other.constant.property",
+      "scope": [
+        "variable.other.constant.property"
+      ],
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "entity.other.inherited-class",
+      "scope": [
+        "entity.other.inherited-class"
+      ],
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "Markup: Heading",
+      "scope": "markup.heading",
+      "settings": {
+        "fontStyle": "bold"
+      }
+    },
+    {
+      "name": "Markup: Strong",
+      "scope": "markup.bold",
+      "settings": {
+        "fontStyle": "bold"
+      }
+    },
+    {
+      "name": "Sections",
+      "scope": "entity.name.section",
+      "settings": {
+        "fontStyle": "bold"
+      }
+    },
+    {
+      "name": "CSS: Important Keyword",
+      "scope": "keyword.other.important",
+      "settings": {
+        "fontStyle": "bold"
+      }
+    },
+    {
+      "name": "markup.bold.markdown",
+      "scope": "markup.bold.markdown",
+      "settings": {
+        "fontStyle": "bold"
+      }
+    }
+  ],
+  "colors": {
+    "activityBar.background": "#282c34",
+    "activityBar.foreground": "#c7ccd6",
+    "activityBarBadge.background": "#21252b",
+    "activityBarBadge.foreground": "#f8fafd",
+    "badge.background": "#21252b",
+    "breadcrumbPicker.background": "#21252b",
+    "button.background": "#404754",
+    "button.secondaryBackground": "#30333d",
+    "button.secondaryForeground": "#c0bdbd",
+    "checkbox.border": "#404754",
+    "debugToolBar.background": "#21252b",
+    "descriptionForeground": "#abb2bf",
+    "diffEditor.insertedTextBackground": "#00809b33",
+    "dropdown.background": "#21252b",
+    "dropdown.border": "#21252b",
+    "dropdown.listBackground": "#21252b",
+    "editor.background": "#282c34",
+    "editor.findMatchBackground": "#42557b",
+    "editor.findMatchBorder": "#457dff",
+    "editor.findMatchHighlightBackground": "#6199ff2f",
+    "editor.foreground": "#abb2bf",
+    "editorInlayHint.foreground": "#abb2bf",
+    "editorInlayHint.background": "#2c313c",
+    "editor.lineHighlightBackground": "#2c313c",
+    "editorLineNumber.activeForeground": "#abb2bf",
+    "editorGutter.addedBackground": "#109868",
+    "editorGutter.deletedBackground": "#9A353D",
+    "editorGutter.modifiedBackground": "#948B60",
+    "editorOverviewRuler.addedBackground": "#109868",
+    "editorOverviewRuler.deletedBackground": "#9A353D",
+    "editorOverviewRuler.modifiedBackground": "#948B60",
+    "editor.selectionBackground": "#67769660",
+    "editor.selectionHighlightBackground": "#404859",
+    "editor.selectionHighlightBorder": "#404859",
+    "editor.wordHighlightBackground": "#d2e0ff2f",
+    "editor.wordHighlightBorder": "#7f848e",
+    "editor.wordHighlightStrongBackground": "#abb2bf26",
+    "editor.wordHighlightStrongBorder": "#7f848e",
+    "editorActiveLineNumber.foreground": "#737984",
+    "editorBracketMatch.background": "#515a6b",
+    "editorBracketMatch.border": "#515a6b",
+    "editorCursor.background": "#ffffffc9",
+    "editorCursor.foreground": "#f0f0f0",
+    "editorError.foreground": "#c24038",
+    "editorGroup.background": "#181a1f",
+    "editorGroup.border": "#23252c",
+    "editorGroup.emptyBackground": "#282c34",
+    "editorGroupHeader.tabsBackground": "#282c34",
+    "editorHoverWidget.background": "#21252b",
+    "editorHoverWidget.border": "#181a1f",
+    "editorIndentGuide.activeBackground": "#495169",
+    "editorIndentGuide.background": "#343a45",
+    "editorLineNumber.foreground": "#495162",
+    "editorLink.activeForeground": "#f0f0f0",
+    "editorMarkerNavigation.background": "#21252b",
+    "editorOverviewRuler.border": "#282c34",
+    "editorRuler.foreground": "#abb2bf26",
+    "editorSuggestWidget.background": "#21252b",
+    "editorSuggestWidget.border": "#181a1f",
+    "editorSuggestWidget.selectedBackground": "#2c313a",
+    "editorWarning.foreground": "#d19a66",
+    "editorWhitespace.foreground": "#3b4048",
+    "editorWidget.background": "#21252b",
+    "focusBorder": "#3e4452",
+    "gitDecoration.ignoredResourceForeground": "#636b78",
+    "input.background": "#21252b",
+    "list.activeSelectionBackground": "#2c313a",
+    "list.activeSelectionForeground": "#d7dae0",
+    "list.focusBackground": "#323842",
+    "list.focusForeground": "#f0f0f0",
+    "list.highlightForeground": "#c5c5c5",
+    "list.hoverBackground": "#2c313a",
+    "list.hoverForeground": "#abb2bf",
+    "list.inactiveSelectionBackground": "#323842",
+    "list.inactiveSelectionForeground": "#d7dae0",
+    "list.warningForeground": "#d19a66",
+    "listFilterWidget.background": "#21252b",
+    "menu.foreground": "#abb2bf",
+    "menu.separatorBackground": "#343a45",
+    "menubar.selectionBackground": "#323842",
+    "menubar.selectionForeground": "#f0f0f0",
+    "minimapGutter.addedBackground": "#109868",
+    "minimapGutter.deletedBackground": "#9A353D",
+    "minimapGutter.modifiedBackground": "#948B60",
+    "notificationLink.foreground": "#f0f0f0",
+    "notifications.foreground": "#969aa4",
+    "panel.background": "#282c34",
+    "panel.border": "#23252c",
+    "panelInput.border": "#23252c",
+    "panelSection.dropBackground": "#323842a8",
+    "panelSectionHeader.background": "#21252b",
+    "panelTitle.activeBorder": "#f0f0f0",
+    "panelTitle.activeForeground": "#f0f0f0",
+    "panelTitle.inactiveForeground": "#abb2bf",
+    "peekViewEditor.background": "#1b1d23",
+    "peekViewEditor.matchHighlightBackground": "#29244b",
+    "peekViewResult.background": "#22262b",
+    "progressBar.background": "#f0f0f0",
+    "scrollbar.shadow": "#23252c",
+    "scrollbarSlider.activeBackground": "#747d9180",
+    "scrollbarSlider.background": "#4e566660",
+    "scrollbarSlider.hoverBackground": "#5a637580",
+    "settings.focusedRowBackground": "#282c34",
+    "settings.headerForeground": "#fff",
+    "sideBar.background": "#282c34",
+    "sideBar.border": "#23252c",
+    "sideBar.dropBackground": "#323842a8",
+    "sideBar.foreground": "#969aa4",
+    "sideBarSectionHeader.background": "#282c34",
+    "sideBarSectionHeader.foreground": "#abb2bf",
+    "sideBarTitle.foreground": "#abb2bf",
+    "statusBar.background": "#282c34",
+    "statusBar.debuggingBackground": "#171c22",
+    "statusBar.debuggingBorder": "#171c22",
+    "statusBar.debuggingForeground": "#f0f0f0",
+    "statusBar.foreground": "#969aa4",
+    "statusBar.noFolderBackground": "#21252b",
+    "statusBarItem.hoverBackground": "#2c313a",
+    "statusBarItem.remoteBackground": "#282c34",
+    "statusBarItem.remoteForeground": "#f8fafd",
+    "tab.activeBackground": "#282c34",
+    "tab.activeBorder": "#f0f0f0",
+    "tab.activeForeground": "#dcdcdc",
+    "tab.border": "#282c34",
+    "tab.hoverBackground": "#323842",
+    "tab.inactiveBackground": "#282c34",
+    "tab.unfocusedHoverBackground": "#323842",
+    "terminal.ansiBlack": "#3f4451",
+    "terminal.ansiBlue": "#4aa5f0",
+    "terminal.ansiBrightBlack": "#4f5666",
+    "terminal.ansiBrightBlue": "#4dc4ff",
+    "terminal.ansiBrightCyan": "#4cd1e0",
+    "terminal.ansiBrightGreen": "#a5e075",
+    "terminal.ansiBrightMagenta": "#de73ff",
+    "terminal.ansiBrightRed": "#ff616e",
+    "terminal.ansiBrightWhite": "#d7dae0",
+    "terminal.ansiBrightYellow": "#f0a45d",
+    "terminal.ansiCyan": "#42b3c2",
+    "terminal.ansiGreen": "#8cc265",
+    "terminal.ansiMagenta": "#c162de",
+    "terminal.ansiRed": "#e05561",
+    "terminal.ansiWhite": "#e6e6e6",
+    "terminal.ansiYellow": "#d18f52",
+    "terminal.background": "#282c34",
+    "terminal.border": "#abb2bf",
+    "terminal.foreground": "#abb2bf",
+    "terminal.selectionBackground": "#abb2bf30",
+    "textLink.activeForeground": "#f0f0f0",
+    "textBlockQuote.background": "#2e3440",
+    "textBlockQuote.border": "#4b5362",
+    "textLink.foreground": "#f0f0f0",
+    "textPreformat.foreground": "#d19a66",
+    "titleBar.activeBackground": "#282c34",
+    "titleBar.activeForeground": "#9da5b4",
+    "titleBar.inactiveBackground": "#21252b",
+    "titleBar.inactiveForeground": "#6b717d",
+    "tree.indentGuidesStroke": "#343a45",
+    "widget.shadow": "#23252c",
+    "walkThrough.embeddedEditorBackground": "#2e3440",
+    "welcomePage.buttonHoverBackground": "#404754"
+  }
+}

+ 2122 - 0
src/extensions/oneDarkPro/themes/OneDark-Pro.json

@@ -0,0 +1,2122 @@
+{
+  "name": "One Dark Pro",
+  "type": "dark",
+  "semanticHighlighting": true,
+  "semanticTokenColors": {
+    "enumMember": {
+      "foreground": "#56b6c2"
+    },
+    "variable.constant": {
+      "foreground": "#d19a66"
+    },
+    "variable.defaultLibrary": {
+      "foreground": "#e5c07b"
+    },
+    "variable:dart": {
+      "foreground": "#d19a66"
+    },
+    "property:dart": {
+      "foreground": "#d19a66"
+    },
+    "annotation:dart": {
+      "foreground": "#d19a66"
+    },
+    "parameter.label:dart": {
+      "foreground": "#abb2bf"
+    }
+  },
+  "tokenColors": [
+    {
+      "name": "unison punctuation",
+      "scope": "punctuation.definition.delayed.unison,punctuation.definition.list.begin.unison,punctuation.definition.list.end.unison,punctuation.definition.ability.begin.unison,punctuation.definition.ability.end.unison,punctuation.operator.assignment.as.unison,punctuation.separator.pipe.unison,punctuation.separator.delimiter.unison,punctuation.definition.hash.unison",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "haskell variable generic-type",
+      "scope": "variable.other.generic-type.haskell",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "haskell storage type",
+      "scope": "storage.type.haskell",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "support.variable.magic.python",
+      "scope": "support.variable.magic.python",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "punctuation.separator.parameters.python",
+      "scope": "punctuation.separator.period.python,punctuation.separator.element.python,punctuation.parenthesis.begin.python,punctuation.parenthesis.end.python",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "variable.parameter.function.language.special.self.python",
+      "scope": "variable.parameter.function.language.special.self.python",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "variable.parameter.function.language.special.cls.python",
+      "scope": "variable.parameter.function.language.special.cls.python",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "storage.modifier.lifetime.rust",
+      "scope": "storage.modifier.lifetime.rust",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "support.function.std.rust",
+      "scope": "support.function.std.rust",
+      "settings": {
+        "foreground": "#61afef"
+      }
+    },
+    {
+      "name": "entity.name.lifetime.rust",
+      "scope": "entity.name.lifetime.rust",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "variable.language.rust",
+      "scope": "variable.language.rust",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "support.constant.edge",
+      "scope": "support.constant.edge",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "regexp constant character-class",
+      "scope": "constant.other.character-class.regexp",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "regexp operator.quantifier",
+      "scope": "keyword.operator.quantifier.regexp",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "punctuation.definition",
+      "scope": "punctuation.definition.string.begin,punctuation.definition.string.end",
+      "settings": {
+        "foreground": "#98c379"
+      }
+    },
+    {
+      "name": "Text",
+      "scope": "variable.parameter.function",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "Comment Markup Link",
+      "scope": "comment markup.link",
+      "settings": {
+        "foreground": "#5c6370"
+      }
+    },
+    {
+      "name": "markup diff",
+      "scope": "markup.changed.diff",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "diff",
+      "scope": "meta.diff.header.from-file,meta.diff.header.to-file,punctuation.definition.from-file.diff,punctuation.definition.to-file.diff",
+      "settings": {
+        "foreground": "#61afef"
+      }
+    },
+    {
+      "name": "inserted.diff",
+      "scope": "markup.inserted.diff",
+      "settings": {
+        "foreground": "#98c379"
+      }
+    },
+    {
+      "name": "deleted.diff",
+      "scope": "markup.deleted.diff",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "c++ function",
+      "scope": "meta.function.c,meta.function.cpp",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "c++ block",
+      "scope": "punctuation.section.block.begin.bracket.curly.cpp,punctuation.section.block.end.bracket.curly.cpp,punctuation.terminator.statement.c,punctuation.section.block.begin.bracket.curly.c,punctuation.section.block.end.bracket.curly.c,punctuation.section.parens.begin.bracket.round.c,punctuation.section.parens.end.bracket.round.c,punctuation.section.parameters.begin.bracket.round.c,punctuation.section.parameters.end.bracket.round.c",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "js/ts punctuation separator key-value",
+      "scope": "punctuation.separator.key-value",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "js/ts import keyword",
+      "scope": "keyword.operator.expression.import",
+      "settings": {
+        "foreground": "#61afef"
+      }
+    },
+    {
+      "name": "math js/ts",
+      "scope": "support.constant.math",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "math property js/ts",
+      "scope": "support.constant.property.math",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "js/ts variable.other.constant",
+      "scope": "variable.other.constant",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "java type",
+      "scope": [
+        "storage.type.annotation.java",
+        "storage.type.object.array.java"
+      ],
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "java source",
+      "scope": "source.java",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "java modifier.import",
+      "scope": "punctuation.section.block.begin.java,punctuation.section.block.end.java,punctuation.definition.method-parameters.begin.java,punctuation.definition.method-parameters.end.java,meta.method.identifier.java,punctuation.section.method.begin.java,punctuation.section.method.end.java,punctuation.terminator.java,punctuation.section.class.begin.java,punctuation.section.class.end.java,punctuation.section.inner-class.begin.java,punctuation.section.inner-class.end.java,meta.method-call.java,punctuation.section.class.begin.bracket.curly.java,punctuation.section.class.end.bracket.curly.java,punctuation.section.method.begin.bracket.curly.java,punctuation.section.method.end.bracket.curly.java,punctuation.separator.period.java,punctuation.bracket.angle.java,punctuation.definition.annotation.java,meta.method.body.java",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "java modifier.import",
+      "scope": "meta.method.java",
+      "settings": {
+        "foreground": "#61afef"
+      }
+    },
+    {
+      "name": "java modifier.import",
+      "scope": "storage.modifier.import.java,storage.type.java,storage.type.generic.java",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "java instanceof",
+      "scope": "keyword.operator.instanceof.java",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "java variable.name",
+      "scope": "meta.definition.variable.name.java",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "operator logical",
+      "scope": "keyword.operator.logical",
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "operator bitwise",
+      "scope": "keyword.operator.bitwise",
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "operator channel",
+      "scope": "keyword.operator.channel",
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "support.constant.property-value.scss",
+      "scope": "support.constant.property-value.scss,support.constant.property-value.css",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "CSS/SCSS/LESS Operators",
+      "scope": "keyword.operator.css,keyword.operator.scss,keyword.operator.less",
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "css color standard name",
+      "scope": "support.constant.color.w3c-standard-color-name.css,support.constant.color.w3c-standard-color-name.scss",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "css comma",
+      "scope": "punctuation.separator.list.comma.css",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "css attribute-name.id",
+      "scope": "support.constant.color.w3c-standard-color-name.css",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "css property-name",
+      "scope": "support.type.vendored.property-name.css",
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "js/ts module",
+      "scope": "support.module.node,support.type.object.module,support.module.node",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "entity.name.type.module",
+      "scope": "entity.name.type.module",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "js variable readwrite",
+      "scope": "variable.other.readwrite,meta.object-literal.key,support.variable.property,support.variable.object.process,support.variable.object.node",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "js/ts json",
+      "scope": "support.constant.json",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "js/ts Keyword",
+      "scope": [
+        "keyword.operator.expression.instanceof",
+        "keyword.operator.new",
+        "keyword.operator.ternary",
+        "keyword.operator.optional",
+        "keyword.operator.expression.keyof"
+      ],
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "js/ts console",
+      "scope": "support.type.object.console",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "js/ts support.variable.property.process",
+      "scope": "support.variable.property.process",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "js console function",
+      "scope": "entity.name.function,support.function.console",
+      "settings": {
+        "foreground": "#61afef"
+      }
+    },
+    {
+      "name": "keyword.operator.misc.rust",
+      "scope": "keyword.operator.misc.rust",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "keyword.operator.sigil.rust",
+      "scope": "keyword.operator.sigil.rust",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "operator",
+      "scope": "keyword.operator.delete",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "js dom",
+      "scope": "support.type.object.dom",
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "js dom variable",
+      "scope": "support.variable.dom,support.variable.property.dom",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "keyword.operator",
+      "scope": "keyword.operator.arithmetic,keyword.operator.comparison,keyword.operator.decrement,keyword.operator.increment,keyword.operator.relational",
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "C operator assignment",
+      "scope": "keyword.operator.assignment.c,keyword.operator.comparison.c,keyword.operator.c,keyword.operator.increment.c,keyword.operator.decrement.c,keyword.operator.bitwise.shift.c,keyword.operator.assignment.cpp,keyword.operator.comparison.cpp,keyword.operator.cpp,keyword.operator.increment.cpp,keyword.operator.decrement.cpp,keyword.operator.bitwise.shift.cpp",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "Punctuation",
+      "scope": "punctuation.separator.delimiter",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "Other punctuation .c",
+      "scope": "punctuation.separator.c,punctuation.separator.cpp",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "C type posix-reserved",
+      "scope": "support.type.posix-reserved.c,support.type.posix-reserved.cpp",
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "keyword.operator.sizeof.c",
+      "scope": "keyword.operator.sizeof.c,keyword.operator.sizeof.cpp",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "python parameter",
+      "scope": "variable.parameter.function.language.python",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "python type",
+      "scope": "support.type.python",
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "python logical",
+      "scope": "keyword.operator.logical.python",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "pyCs",
+      "scope": "variable.parameter.function.python",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "python block",
+      "scope": "punctuation.definition.arguments.begin.python,punctuation.definition.arguments.end.python,punctuation.separator.arguments.python,punctuation.definition.list.begin.python,punctuation.definition.list.end.python",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "python function-call.generic",
+      "scope": "meta.function-call.generic.python",
+      "settings": {
+        "foreground": "#61afef"
+      }
+    },
+    {
+      "name": "python placeholder reset to normal string",
+      "scope": "constant.character.format.placeholder.other.python",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "Operators",
+      "scope": "keyword.operator",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "Compound Assignment Operators",
+      "scope": "keyword.operator.assignment.compound",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "Compound Assignment Operators js/ts",
+      "scope": "keyword.operator.assignment.compound.js,keyword.operator.assignment.compound.ts",
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "Keywords",
+      "scope": "keyword",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "Namespaces",
+      "scope": "entity.name.namespace",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "Variables",
+      "scope": "variable",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "Variables",
+      "scope": "variable.c",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "Language variables",
+      "scope": "variable.language",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "Java Variables",
+      "scope": "token.variable.parameter.java",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "Java Imports",
+      "scope": "import.storage.java",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "Packages",
+      "scope": "token.package.keyword",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "Packages",
+      "scope": "token.package",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "Functions",
+      "scope": [
+        "entity.name.function",
+        "meta.require",
+        "support.function.any-method",
+        "variable.function"
+      ],
+      "settings": {
+        "foreground": "#61afef"
+      }
+    },
+    {
+      "name": "Classes",
+      "scope": "entity.name.type.namespace",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "Classes",
+      "scope": "support.class, entity.name.type.class",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "Class name",
+      "scope": "entity.name.class.identifier.namespace.type",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "Class name",
+      "scope": [
+        "entity.name.class",
+        "variable.other.class.js",
+        "variable.other.class.ts"
+      ],
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "Class name php",
+      "scope": "variable.other.class.php",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "Type Name",
+      "scope": "entity.name.type",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "Keyword Control",
+      "scope": "keyword.control",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "Control Elements",
+      "scope": "control.elements, keyword.operator.less",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "Methods",
+      "scope": "keyword.other.special-method",
+      "settings": {
+        "foreground": "#61afef"
+      }
+    },
+    {
+      "name": "Storage",
+      "scope": "storage",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "Storage JS TS",
+      "scope": "token.storage",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "Source Js Keyword Operator Delete,source Js Keyword Operator In,source Js Keyword Operator Of,source Js Keyword Operator Instanceof,source Js Keyword Operator New,source Js Keyword Operator Typeof,source Js Keyword Operator Void",
+      "scope": "keyword.operator.expression.delete,keyword.operator.expression.in,keyword.operator.expression.of,keyword.operator.expression.instanceof,keyword.operator.new,keyword.operator.expression.typeof,keyword.operator.expression.void",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "Java Storage",
+      "scope": "token.storage.type.java",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "Support",
+      "scope": "support.function",
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "Support type",
+      "scope": "support.type.property-name",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "Support type",
+      "scope": "support.constant.property-value",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "Support type",
+      "scope": "support.constant.font-name",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "Meta tag",
+      "scope": "meta.tag",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "Strings",
+      "scope": "string",
+      "settings": {
+        "foreground": "#98c379"
+      }
+    },
+    {
+      "name": "Constant other symbol",
+      "scope": "constant.other.symbol",
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "Integers",
+      "scope": "constant.numeric",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "Constants",
+      "scope": "constant",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "Constants",
+      "scope": "punctuation.definition.constant",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "Tags",
+      "scope": "entity.name.tag",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "Attributes",
+      "scope": "entity.other.attribute-name",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "Attribute IDs",
+      "scope": "entity.other.attribute-name.id",
+      "settings": {
+        "fontStyle": "normal",
+        "foreground": "#61afef"
+      }
+    },
+    {
+      "name": "Attribute class",
+      "scope": "entity.other.attribute-name.class.css",
+      "settings": {
+        "fontStyle": "normal",
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "Selector",
+      "scope": "meta.selector",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "Headings",
+      "scope": "markup.heading",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "Headings",
+      "scope": "markup.heading punctuation.definition.heading, entity.name.section",
+      "settings": {
+        "foreground": "#61afef"
+      }
+    },
+    {
+      "name": "Units",
+      "scope": "keyword.other.unit",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "Bold",
+      "scope": "markup.bold,todo.bold",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "Bold",
+      "scope": "punctuation.definition.bold",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "markup Italic",
+      "scope": "markup.italic, punctuation.definition.italic,todo.emphasis",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "emphasis md",
+      "scope": "emphasis md",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "[VSCODE-CUSTOM] Markdown headings",
+      "scope": "entity.name.section.markdown",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "[VSCODE-CUSTOM] Markdown heading Punctuation Definition",
+      "scope": "punctuation.definition.heading.markdown",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "punctuation.definition.list.begin.markdown",
+      "scope": "punctuation.definition.list.begin.markdown",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "[VSCODE-CUSTOM] Markdown heading setext",
+      "scope": "markup.heading.setext",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "[VSCODE-CUSTOM] Markdown Punctuation Definition Bold",
+      "scope": "punctuation.definition.bold.markdown",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "[VSCODE-CUSTOM] Markdown Inline Raw",
+      "scope": "markup.inline.raw.markdown",
+      "settings": {
+        "foreground": "#98c379"
+      }
+    },
+    {
+      "name": "[VSCODE-CUSTOM] Markdown Inline Raw",
+      "scope": "markup.inline.raw.string.markdown",
+      "settings": {
+        "foreground": "#98c379"
+      }
+    },
+    {
+      "name": "[VSCODE-CUSTOM] Markdown Inline Raw punctuation",
+      "scope": "punctuation.definition.raw.markdown",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "[VSCODE-CUSTOM] Markdown List Punctuation Definition",
+      "scope": "punctuation.definition.list.markdown",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "[VSCODE-CUSTOM] Markdown Punctuation Definition String",
+      "scope": [
+        "punctuation.definition.string.begin.markdown",
+        "punctuation.definition.string.end.markdown",
+        "punctuation.definition.metadata.markdown"
+      ],
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "beginning.punctuation.definition.list.markdown",
+      "scope": [
+        "beginning.punctuation.definition.list.markdown"
+      ],
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "[VSCODE-CUSTOM] Markdown Punctuation Definition Link",
+      "scope": "punctuation.definition.metadata.markdown",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "[VSCODE-CUSTOM] Markdown Underline Link/Image",
+      "scope": "markup.underline.link.markdown,markup.underline.link.image.markdown",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "[VSCODE-CUSTOM] Markdown Link Title/Description",
+      "scope": "string.other.link.title.markdown,string.other.link.description.markdown",
+      "settings": {
+        "foreground": "#61afef"
+      }
+    },
+    {
+      "name": "[VSCODE-CUSTOM] Asciidoc Inline Raw",
+      "scope": "markup.raw.monospace.asciidoc",
+      "settings": {
+        "foreground": "#98c379"
+      }
+    },
+    {
+      "name": "[VSCODE-CUSTOM] Asciidoc Inline Raw Punctuation Definition",
+      "scope": "punctuation.definition.asciidoc",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "[VSCODE-CUSTOM] Asciidoc List Punctuation Definition",
+      "scope": "markup.list.asciidoc",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "[VSCODE-CUSTOM] Asciidoc underline link",
+      "scope": "markup.link.asciidoc,markup.other.url.asciidoc",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "[VSCODE-CUSTOM] Asciidoc link name",
+      "scope": "string.unquoted.asciidoc,markup.other.url.asciidoc",
+      "settings": {
+        "foreground": "#61afef"
+      }
+    },
+    {
+      "name": "Regular Expressions",
+      "scope": "string.regexp",
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "Escape Characters",
+      "scope": "constant.character.escape",
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "Embedded",
+      "scope": "punctuation.section.embedded, variable.interpolation",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "Embedded",
+      "scope": "punctuation.section.embedded.begin,punctuation.section.embedded.end",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "illegal",
+      "scope": "invalid.illegal",
+      "settings": {
+        "foreground": "#ffffff"
+      }
+    },
+    {
+      "name": "illegal",
+      "scope": "invalid.illegal.bad-ampersand.html",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "Broken",
+      "scope": "invalid.broken",
+      "settings": {
+        "foreground": "#ffffff"
+      }
+    },
+    {
+      "name": "Deprecated",
+      "scope": "invalid.deprecated",
+      "settings": {
+        "foreground": "#ffffff"
+      }
+    },
+    {
+      "name": "Unimplemented",
+      "scope": "invalid.unimplemented",
+      "settings": {
+        "foreground": "#ffffff"
+      }
+    },
+    {
+      "name": "Source Json Meta Structure Dictionary Json > String Quoted Json",
+      "scope": "source.json meta.structure.dictionary.json > string.quoted.json",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "Source Json Meta Structure Dictionary Json > String Quoted Json > Punctuation String",
+      "scope": "source.json meta.structure.dictionary.json > string.quoted.json > punctuation.string",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "Source Json Meta Structure Dictionary Json > Value Json > String Quoted Json,source Json Meta Structure Array Json > Value Json > String Quoted Json,source Json Meta Structure Dictionary Json > Value Json > String Quoted Json > Punctuation,source Json Meta Structure Array Json > Value Json > String Quoted Json > Punctuation",
+      "scope": "source.json meta.structure.dictionary.json > value.json > string.quoted.json,source.json meta.structure.array.json > value.json > string.quoted.json,source.json meta.structure.dictionary.json > value.json > string.quoted.json > punctuation,source.json meta.structure.array.json > value.json > string.quoted.json > punctuation",
+      "settings": {
+        "foreground": "#98c379"
+      }
+    },
+    {
+      "name": "Source Json Meta Structure Dictionary Json > Constant Language Json,source Json Meta Structure Array Json > Constant Language Json",
+      "scope": "source.json meta.structure.dictionary.json > constant.language.json,source.json meta.structure.array.json > constant.language.json",
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "[VSCODE-CUSTOM] JSON Property Name",
+      "scope": "support.type.property-name.json",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "[VSCODE-CUSTOM] JSON Punctuation for Property Name",
+      "scope": "support.type.property-name.json punctuation",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "laravel blade tag",
+      "scope": "text.html.laravel-blade source.php.embedded.line.html entity.name.tag.laravel-blade",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "laravel blade @",
+      "scope": "text.html.laravel-blade source.php.embedded.line.html support.constant.laravel-blade",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "use statement for other classes",
+      "scope": "support.other.namespace.use.php,support.other.namespace.use-as.php,entity.other.alias.php,meta.interface.php",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "error suppression",
+      "scope": "keyword.operator.error-control.php",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "php instanceof",
+      "scope": "keyword.operator.type.php",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "style double quoted array index normal begin",
+      "scope": "punctuation.section.array.begin.php",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "style double quoted array index normal end",
+      "scope": "punctuation.section.array.end.php",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "php illegal.non-null-typehinted",
+      "scope": "invalid.illegal.non-null-typehinted.php",
+      "settings": {
+        "foreground": "#f44747"
+      }
+    },
+    {
+      "name": "php types",
+      "scope": "storage.type.php,meta.other.type.phpdoc.php,keyword.other.type.php,keyword.other.array.phpdoc.php",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "php call-function",
+      "scope": "meta.function-call.php,meta.function-call.object.php,meta.function-call.static.php",
+      "settings": {
+        "foreground": "#61afef"
+      }
+    },
+    {
+      "name": "php function-resets",
+      "scope": "punctuation.definition.parameters.begin.bracket.round.php,punctuation.definition.parameters.end.bracket.round.php,punctuation.separator.delimiter.php,punctuation.section.scope.begin.php,punctuation.section.scope.end.php,punctuation.terminator.expression.php,punctuation.definition.arguments.begin.bracket.round.php,punctuation.definition.arguments.end.bracket.round.php,punctuation.definition.storage-type.begin.bracket.round.php,punctuation.definition.storage-type.end.bracket.round.php,punctuation.definition.array.begin.bracket.round.php,punctuation.definition.array.end.bracket.round.php,punctuation.definition.begin.bracket.round.php,punctuation.definition.end.bracket.round.php,punctuation.definition.begin.bracket.curly.php,punctuation.definition.end.bracket.curly.php,punctuation.definition.section.switch-block.end.bracket.curly.php,punctuation.definition.section.switch-block.start.bracket.curly.php,punctuation.definition.section.switch-block.begin.bracket.curly.php,punctuation.definition.section.switch-block.end.bracket.curly.php",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "support php constants",
+      "scope": "support.constant.core.rust",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "support php constants",
+      "scope": "support.constant.ext.php,support.constant.std.php,support.constant.core.php,support.constant.parser-token.php",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "php goto",
+      "scope": "entity.name.goto-label.php,support.other.php",
+      "settings": {
+        "foreground": "#61afef"
+      }
+    },
+    {
+      "name": "php logical/bitwise operator",
+      "scope": "keyword.operator.logical.php,keyword.operator.bitwise.php,keyword.operator.arithmetic.php",
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "php regexp operator",
+      "scope": "keyword.operator.regexp.php",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "php comparison",
+      "scope": "keyword.operator.comparison.php",
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "php heredoc/nowdoc",
+      "scope": "keyword.operator.heredoc.php,keyword.operator.nowdoc.php",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "python function decorator @",
+      "scope": "meta.function.decorator.python",
+      "settings": {
+        "foreground": "#61afef"
+      }
+    },
+    {
+      "name": "python function support",
+      "scope": "support.token.decorator.python,meta.function.decorator.identifier.python",
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "parameter function js/ts",
+      "scope": "function.parameter",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "brace function",
+      "scope": "function.brace",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "parameter function ruby cs",
+      "scope": "function.parameter.ruby, function.parameter.cs",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "constant.language.symbol.ruby",
+      "scope": "constant.language.symbol.ruby",
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "rgb-value",
+      "scope": "rgb-value",
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "rgb value",
+      "scope": "inline-color-decoration rgb-value",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "rgb value less",
+      "scope": "less rgb-value",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "sass selector",
+      "scope": "selector.sass",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "ts primitive/builtin types",
+      "scope": "support.type.primitive.ts,support.type.builtin.ts,support.type.primitive.tsx,support.type.builtin.tsx",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "block scope",
+      "scope": "block.scope.end,block.scope.begin",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "cs storage type",
+      "scope": "storage.type.cs",
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "cs local variable",
+      "scope": "entity.name.variable.local.cs",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "scope": "token.info-token",
+      "settings": {
+        "foreground": "#61afef"
+      }
+    },
+    {
+      "scope": "token.warn-token",
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "scope": "token.error-token",
+      "settings": {
+        "foreground": "#f44747"
+      }
+    },
+    {
+      "scope": "token.debug-token",
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "String interpolation",
+      "scope": [
+        "punctuation.definition.template-expression.begin",
+        "punctuation.definition.template-expression.end",
+        "punctuation.section.embedded"
+      ],
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "Reset JavaScript string interpolation expression",
+      "scope": [
+        "meta.template.expression"
+      ],
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "Import module JS",
+      "scope": [
+        "keyword.operator.module"
+      ],
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "js Flowtype",
+      "scope": [
+        "support.type.type.flowtype"
+      ],
+      "settings": {
+        "foreground": "#61afef"
+      }
+    },
+    {
+      "name": "js Flow",
+      "scope": [
+        "support.type.primitive"
+      ],
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "js class prop",
+      "scope": [
+        "meta.property.object"
+      ],
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "js func parameter",
+      "scope": [
+        "variable.parameter.function.js"
+      ],
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "js template literals begin",
+      "scope": [
+        "keyword.other.template.begin"
+      ],
+      "settings": {
+        "foreground": "#98c379"
+      }
+    },
+    {
+      "name": "js template literals end",
+      "scope": [
+        "keyword.other.template.end"
+      ],
+      "settings": {
+        "foreground": "#98c379"
+      }
+    },
+    {
+      "name": "js template literals variable braces begin",
+      "scope": [
+        "keyword.other.substitution.begin"
+      ],
+      "settings": {
+        "foreground": "#98c379"
+      }
+    },
+    {
+      "name": "js template literals variable braces end",
+      "scope": [
+        "keyword.other.substitution.end"
+      ],
+      "settings": {
+        "foreground": "#98c379"
+      }
+    },
+    {
+      "name": "js operator.assignment",
+      "scope": [
+        "keyword.operator.assignment"
+      ],
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "go operator",
+      "scope": [
+        "keyword.operator.assignment.go"
+      ],
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "go operator",
+      "scope": [
+        "keyword.operator.arithmetic.go",
+        "keyword.operator.address.go"
+      ],
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "Go package name",
+      "scope": [
+        "entity.name.package.go"
+      ],
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "elm prelude",
+      "scope": [
+        "support.type.prelude.elm"
+      ],
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "elm constant",
+      "scope": [
+        "support.constant.elm"
+      ],
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "template literal",
+      "scope": [
+        "punctuation.quasi.element"
+      ],
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "html/pug (jade) escaped characters and entities",
+      "scope": [
+        "constant.character.entity"
+      ],
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "styling css pseudo-elements/classes to be able to differentiate from classes which are the same colour",
+      "scope": [
+        "entity.other.attribute-name.pseudo-element",
+        "entity.other.attribute-name.pseudo-class"
+      ],
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "Clojure globals",
+      "scope": [
+        "entity.global.clojure"
+      ],
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "Clojure symbols",
+      "scope": [
+        "meta.symbol.clojure"
+      ],
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "Clojure constants",
+      "scope": [
+        "constant.keyword.clojure"
+      ],
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "CoffeeScript Function Argument",
+      "scope": [
+        "meta.arguments.coffee",
+        "variable.parameter.function.coffee"
+      ],
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "Ini Default Text",
+      "scope": [
+        "source.ini"
+      ],
+      "settings": {
+        "foreground": "#98c379"
+      }
+    },
+    {
+      "name": "Makefile prerequisities",
+      "scope": [
+        "meta.scope.prerequisites.makefile"
+      ],
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "Makefile text colour",
+      "scope": [
+        "source.makefile"
+      ],
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "Groovy import names",
+      "scope": [
+        "storage.modifier.import.groovy"
+      ],
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "Groovy Methods",
+      "scope": [
+        "meta.method.groovy"
+      ],
+      "settings": {
+        "foreground": "#61afef"
+      }
+    },
+    {
+      "name": "Groovy Variables",
+      "scope": [
+        "meta.definition.variable.name.groovy"
+      ],
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "Groovy Inheritance",
+      "scope": [
+        "meta.definition.class.inherited.classes.groovy"
+      ],
+      "settings": {
+        "foreground": "#98c379"
+      }
+    },
+    {
+      "name": "HLSL Semantic",
+      "scope": [
+        "support.variable.semantic.hlsl"
+      ],
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "HLSL Types",
+      "scope": [
+        "support.type.texture.hlsl",
+        "support.type.sampler.hlsl",
+        "support.type.object.hlsl",
+        "support.type.object.rw.hlsl",
+        "support.type.fx.hlsl",
+        "support.type.object.hlsl"
+      ],
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "SQL Variables",
+      "scope": [
+        "text.variable",
+        "text.bracketed"
+      ],
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "types",
+      "scope": [
+        "support.type.swift",
+        "support.type.vb.asp"
+      ],
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "heading 1, keyword",
+      "scope": [
+        "entity.name.function.xi"
+      ],
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "heading 2, callable",
+      "scope": [
+        "entity.name.class.xi"
+      ],
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "heading 3, property",
+      "scope": [
+        "constant.character.character-class.regexp.xi"
+      ],
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "heading 4, type, class, interface",
+      "scope": [
+        "constant.regexp.xi"
+      ],
+      "settings": {
+        "foreground": "#c678dd"
+      }
+    },
+    {
+      "name": "heading 5, enums, preprocessor, constant, decorator",
+      "scope": [
+        "keyword.control.xi"
+      ],
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "name": "heading 6, number",
+      "scope": [
+        "invalid.xi"
+      ],
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "string",
+      "scope": [
+        "beginning.punctuation.definition.quote.markdown.xi"
+      ],
+      "settings": {
+        "foreground": "#98c379"
+      }
+    },
+    {
+      "name": "comments",
+      "scope": [
+        "beginning.punctuation.definition.list.markdown.xi"
+      ],
+      "settings": {
+        "foreground": "#7f848e"
+      }
+    },
+    {
+      "name": "link",
+      "scope": [
+        "constant.character.xi"
+      ],
+      "settings": {
+        "foreground": "#61afef"
+      }
+    },
+    {
+      "name": "accent",
+      "scope": [
+        "accent.xi"
+      ],
+      "settings": {
+        "foreground": "#61afef"
+      }
+    },
+    {
+      "name": "wikiword",
+      "scope": [
+        "wikiword.xi"
+      ],
+      "settings": {
+        "foreground": "#d19a66"
+      }
+    },
+    {
+      "name": "language operators like '+', '-' etc",
+      "scope": [
+        "constant.other.color.rgb-value.xi"
+      ],
+      "settings": {
+        "foreground": "#ffffff"
+      }
+    },
+    {
+      "name": "elements to dim",
+      "scope": [
+        "punctuation.definition.tag.xi"
+      ],
+      "settings": {
+        "foreground": "#5c6370"
+      }
+    },
+    {
+      "name": "C++/C#",
+      "scope": [
+        "entity.name.label.cs",
+        "entity.name.scope-resolution.function.call",
+        "entity.name.scope-resolution.function.definition"
+      ],
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "Markdown underscore-style headers",
+      "scope": [
+        "entity.name.label.cs",
+        "markup.heading.setext.1.markdown",
+        "markup.heading.setext.2.markdown"
+      ],
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "meta.brace.square",
+      "scope": [
+        " meta.brace.square"
+      ],
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "Comments",
+      "scope": "comment, punctuation.definition.comment",
+      "settings": {
+        "fontStyle": "italic",
+        "foreground": "#7f848e"
+      }
+    },
+    {
+      "name": "[VSCODE-CUSTOM] Markdown Quote",
+      "scope": "markup.quote.markdown",
+      "settings": {
+        "foreground": "#5c6370"
+      }
+    },
+    {
+      "name": "punctuation.definition.block.sequence.item.yaml",
+      "scope": "punctuation.definition.block.sequence.item.yaml",
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "scope": [
+        "constant.language.symbol.elixir",
+        "constant.language.symbol.double-quoted.elixir"
+      ],
+      "settings": {
+        "foreground": "#56b6c2"
+      }
+    },
+    {
+      "scope": [
+        "entity.name.variable.parameter.cs"
+      ],
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "scope": [
+        "entity.name.variable.field.cs"
+      ],
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "Deleted",
+      "scope": "markup.deleted",
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "Inserted",
+      "scope": "markup.inserted",
+      "settings": {
+        "foreground": "#98c379"
+      }
+    },
+    {
+      "name": "Underline",
+      "scope": "markup.underline",
+      "settings": {
+        "fontStyle": "underline"
+      }
+    },
+    {
+      "name": "punctuation.section.embedded.begin.php",
+      "scope": [
+        "punctuation.section.embedded.begin.php",
+        "punctuation.section.embedded.end.php"
+      ],
+      "settings": {
+        "foreground": "#BE5046"
+      }
+    },
+    {
+      "name": "support.other.namespace.php",
+      "scope": [
+        "support.other.namespace.php"
+      ],
+      "settings": {
+        "foreground": "#abb2bf"
+      }
+    },
+    {
+      "name": "variable.other.object",
+      "scope": [
+        "variable.other.object"
+      ],
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "variable.other.constant.property",
+      "scope": [
+        "variable.other.constant.property"
+      ],
+      "settings": {
+        "foreground": "#e06c75"
+      }
+    },
+    {
+      "name": "entity.other.inherited-class",
+      "scope": [
+        "entity.other.inherited-class"
+      ],
+      "settings": {
+        "foreground": "#e5c07b"
+      }
+    },
+    {
+      "name": "js/ts italic",
+      "scope": "entity.other.attribute-name.js,entity.other.attribute-name.ts,entity.other.attribute-name.jsx,entity.other.attribute-name.tsx,variable.parameter,variable.language.super",
+      "settings": {
+        "fontStyle": "italic"
+      }
+    },
+    {
+      "name": "comment",
+      "scope": "comment.line.double-slash,comment.block.documentation",
+      "settings": {
+        "fontStyle": "italic"
+      }
+    },
+    {
+      "name": "Python Keyword Control",
+      "scope": "keyword.control.import.python,keyword.control.flow.python",
+      "settings": {
+        "fontStyle": "italic"
+      }
+    },
+    {
+      "name": "markup.italic.markdown",
+      "scope": "markup.italic.markdown",
+      "settings": {
+        "fontStyle": "italic"
+      }
+    }
+  ],
+  "colors": {
+    "activityBar.background": "#282c34",
+    "activityBar.foreground": "#d7dae0",
+    "activityBarBadge.background": "#4d78cc",
+    "activityBarBadge.foreground": "#f8fafd",
+    "badge.background": "#282c34",
+    "button.background": "#404754",
+    "button.secondaryBackground": "#30333d",
+    "button.secondaryForeground": "#c0bdbd",
+    "checkbox.border": "#404754",
+    "debugToolBar.background": "#21252b",
+    "descriptionForeground": "#abb2bf",
+    "diffEditor.insertedTextBackground": "#00809b33",
+    "dropdown.background": "#21252b",
+    "dropdown.border": "#21252b",
+    "editor.background": "#282c34",
+    "editor.findMatchBackground": "#42557b",
+    "editor.findMatchBorder": "#457dff",
+    "editor.findMatchHighlightBackground": "#6199ff2f",
+    "editor.foreground": "#abb2bf",
+    "editorInlayHint.foreground": "#abb2bf",
+    "editorInlayHint.background": "#2c313c",
+    "editor.lineHighlightBackground": "#2c313c",
+    "editorLineNumber.activeForeground": "#abb2bf",
+    "editorGutter.addedBackground": "#109868",
+    "editorGutter.deletedBackground": "#9A353D",
+    "editorGutter.modifiedBackground": "#948B60",
+    "editorOverviewRuler.addedBackground": "#109868",
+    "editorOverviewRuler.deletedBackground": "#9A353D",
+    "editorOverviewRuler.modifiedBackground": "#948B60",
+    "editor.selectionBackground": "#67769660",
+    "editor.selectionHighlightBackground": "#ffffff10",
+    "editor.selectionHighlightBorder": "#dddddd",
+    "editor.wordHighlightBackground": "#d2e0ff2f",
+    "editor.wordHighlightBorder": "#7f848e",
+    "editor.wordHighlightStrongBackground": "#abb2bf26",
+    "editor.wordHighlightStrongBorder": "#7f848e",
+    "editorActiveLineNumber.foreground": "#737984",
+    "editorBracketMatch.background": "#515a6b",
+    "editorBracketMatch.border": "#515a6b",
+    "editorCursor.background": "#ffffffc9",
+    "editorCursor.foreground": "#528bff",
+    "editorError.foreground": "#c24038",
+    "editorGroup.background": "#181a1f",
+    "editorGroup.border": "#181a1f",
+    "editorGroupHeader.tabsBackground": "#21252b",
+    "editorHoverWidget.background": "#21252b",
+    "editorHoverWidget.border": "#181a1f",
+    "editorIndentGuide.activeBackground": "#c8c8c859",
+    "editorIndentGuide.background": "#3b4048",
+    "editorLineNumber.foreground": "#495162",
+    "editorMarkerNavigation.background": "#21252b",
+    "editorRuler.foreground": "#abb2bf26",
+    "editorSuggestWidget.background": "#21252b",
+    "editorSuggestWidget.border": "#181a1f",
+    "editorSuggestWidget.selectedBackground": "#2c313a",
+    "editorWarning.foreground": "#d19a66",
+    "editorWhitespace.foreground": "#3b4048",
+    "editorWidget.background": "#21252b",
+    "focusBorder": "#3e4452",
+    "gitDecoration.ignoredResourceForeground": "#636b78",
+    "input.background": "#1d1f23",
+    "list.activeSelectionBackground": "#2c313a",
+    "list.activeSelectionForeground": "#d7dae0",
+    "list.focusBackground": "#323842",
+    "list.focusForeground": "#f0f0f0",
+    "list.highlightForeground": "#c5c5c5",
+    "list.hoverBackground": "#2c313a",
+    "list.hoverForeground": "#fff",
+    "list.inactiveSelectionBackground": "#323842",
+    "list.inactiveSelectionForeground": "#d7dae0",
+    "list.warningForeground": "#d19a66",
+    "menu.foreground": "#abb2bf",
+    "menu.separatorBackground": "#343a45",
+    "minimapGutter.addedBackground": "#109868",
+    "minimapGutter.deletedBackground": "#9A353D",
+    "minimapGutter.modifiedBackground": "#948B60",
+    "panelSectionHeader.background": "#21252b",
+    "peekViewEditor.background": "#1b1d23",
+    "peekViewEditor.matchHighlightBackground": "#29244b",
+    "peekViewResult.background": "#22262b",
+    "scrollbar.shadow": "#23252c",
+    "scrollbarSlider.activeBackground": "#747d9180",
+    "scrollbarSlider.background": "#4e566660",
+    "scrollbarSlider.hoverBackground": "#5a637580",
+    "settings.focusedRowBackground": "#282c34",
+    "settings.headerForeground": "#fff",
+    "sideBar.background": "#21252b",
+    "sideBar.foreground": "#abb2bf",
+    "sideBarSectionHeader.background": "#282c34",
+    "sideBarSectionHeader.foreground": "#abb2bf",
+    "statusBar.background": "#21252b",
+    "statusBar.debuggingBackground": "#cc6633",
+    "statusBar.debuggingBorder": "#66017a",
+    "statusBar.debuggingForeground": "#ffffff",
+    "statusBar.foreground": "#9da5b4",
+    "statusBar.noFolderBackground": "#21252b",
+    "statusBarItem.hoverBackground": "#2c313a",
+    "statusBarItem.remoteBackground": "#4d78cc",
+    "statusBarItem.remoteForeground": "#f8fafd",
+    "tab.activeBackground": "#282c34",
+    "tab.activeForeground": "#dcdcdc",
+    "tab.border": "#181a1f",
+    "tab.hoverBackground": "#323842",
+    "tab.inactiveBackground": "#21252b",
+    "tab.unfocusedHoverBackground": "#323842",
+    "terminal.ansiBlack": "#3f4451",
+    "terminal.ansiBlue": "#4aa5f0",
+    "terminal.ansiBrightBlack": "#4f5666",
+    "terminal.ansiBrightBlue": "#4dc4ff",
+    "terminal.ansiBrightCyan": "#4cd1e0",
+    "terminal.ansiBrightGreen": "#a5e075",
+    "terminal.ansiBrightMagenta": "#de73ff",
+    "terminal.ansiBrightRed": "#ff616e",
+    "terminal.ansiBrightWhite": "#d7dae0",
+    "terminal.ansiBrightYellow": "#f0a45d",
+    "terminal.ansiCyan": "#42b3c2",
+    "terminal.ansiGreen": "#8cc265",
+    "terminal.ansiMagenta": "#c162de",
+    "terminal.ansiRed": "#e05561",
+    "terminal.ansiWhite": "#e6e6e6",
+    "terminal.ansiYellow": "#d18f52",
+    "terminal.background": "#282c34",
+    "terminal.border": "#abb2bf",
+    "terminal.foreground": "#abb2bf",
+    "terminal.selectionBackground": "#abb2bf30",
+    "textBlockQuote.background": "#2e3440",
+    "textBlockQuote.border": "#4b5362",
+    "textLink.foreground": "#61afef",
+    "textPreformat.foreground": "#d19a66",
+    "titleBar.activeBackground": "#282c34",
+    "titleBar.activeForeground": "#9da5b4",
+    "titleBar.inactiveBackground": "#21252b",
+    "titleBar.inactiveForeground": "#6b717d",
+    "walkThrough.embeddedEditorBackground": "#2e3440",
+    "welcomePage.buttonHoverBackground": "#404754"
+  }
+}

+ 10 - 0
src/extensions/oneDarkPro/tsconfig.base.json

@@ -0,0 +1,10 @@
+{
+  "compilerOptions": {
+    "module": "commonjs",
+    "preserveWatchOutput": true,
+    "sourceMap": true,
+    "strict": false,
+    "target": "es6",
+    "resolveJsonModule": true
+  }
+}

+ 11 - 0
src/extensions/oneDarkPro/tsconfig.json

@@ -0,0 +1,11 @@
+{
+  "files": [],
+  "references": [
+    {
+      "path": "./src"
+    },
+    {
+      "path": "./scripts"
+    }
+  ]
+}

+ 36 - 0
src/extensions/settings/index.ts

@@ -0,0 +1,36 @@
+import molecule from '@dtinsight/molecule';
+import { IExtension } from '@dtinsight/molecule/esm/model';
+import { IExtensionService } from '@dtinsight/molecule/esm/molecule.api';
+
+export const customSettings = {
+    demo: {
+        id: 'test'
+    }
+}
+
+export class SettingsExtension implements IExtension {
+
+    id: string = 'ExtendSettings';
+    name: string = 'Extend Settings';
+
+    appendSettingsItems() {
+        molecule.settings.append(customSettings);
+    }
+
+    handleSettingsChange() {
+        const panel = molecule.panel;
+        molecule.settings.onChangeSettings((settings: any) => {
+            panel.appendOutput('The settings changed: \n');
+            panel.appendOutput(JSON.stringify(settings));
+            alert('Settings changed:' + settings.demo?.id)
+        })
+    }
+
+    activate(extensionCtx: IExtensionService): void {
+        this.appendSettingsItems();
+        this.handleSettingsChange();
+    }
+
+    dispose(extensionCtx: IExtensionService): void {
+    }
+}

+ 22 - 0
src/extensions/theFirstExtension/base.tsx

@@ -0,0 +1,22 @@
+import {IEditorTab, IStatusBarItem} from '@dtinsight/molecule/esm/model';
+import {Alert} from "antd";
+
+export const LOADING_TAB_ID = 'Loading'
+export const STATUS_BAR_LANGUAGE: IStatusBarItem = {
+    id: 'LanguageStatus',
+    sortIndex: 3,
+}
+
+export const LoadingTab: IEditorTab = {
+    id: LOADING_TAB_ID,
+    name: 'Loading Project',
+    renderPane: () => {
+        return (
+            <div style={{margin: "auto", width: "50%"}}>
+                <Alert message="Loading Project"
+                       description="Please wait before the initiation is over"
+                       type="info"/>
+            </div>
+);
+    },
+};

+ 38 - 0
src/extensions/theFirstExtension/editorController.tsx

@@ -0,0 +1,38 @@
+import molecule from "@dtinsight/molecule";
+import Welcome from "../../pages/welcome";
+import {store} from "@/redux/store";
+import {loadQuestion} from "@/redux/action/action";
+
+export function setEntry() {
+    molecule.editor.setEntry(<Welcome/>)
+}
+
+export function activateEditCallback() {
+    molecule.editor.onUpdateTab((tab) => {
+        console.log(tab.id)
+        console.log(tab.data)
+        const nextFileValue = molecule.editor.editorInstance?.getModel()?.getValue()
+        const tabId = molecule.editor.getState().current?.tab?.id
+        if (nextFileValue && tabId) {
+            const node = molecule.folderTree.get(tabId)
+            if (node){
+                const prevFileValue = node.data.value
+                const location = node.location
+                if (prevFileValue !== nextFileValue) {
+                    node.data.value = nextFileValue
+                    molecule.folderTree.update(node)
+                    const question = store.getState().loadQuestion
+                    if (question.codeList && question.codeList[0].editable && location) {
+                        question.codeList[0].editable[location] = nextFileValue
+                        store.dispatch(loadQuestion(question))
+                    }
+                    console.log('value update')
+                }
+            }
+        }
+    })
+}
+
+export function activateLanguageService() {
+
+}

+ 160 - 0
src/extensions/theFirstExtension/folderTreeController.ts

@@ -0,0 +1,160 @@
+import molecule from '@dtinsight/molecule';
+import {
+    BuiltInEditorTabDataType,
+    FileTypes,
+    Float, IEditorTab,
+    IFolderTreeNodeProps,
+    TreeNodeModel
+} from '@dtinsight/molecule/esm/model';
+import { transformToEditorTab } from '../../common';
+
+import {cloneDeep, forEach} from 'lodash';
+import API from '../../api';
+import {LoadingTab, STATUS_BAR_LANGUAGE} from './base';
+import {folderTree} from "@dtinsight/molecule/esm/molecule.api";
+import {store} from "../../redux/store";
+import notification from "../../components/notification";
+import {message} from "antd";
+
+const extToLang:{[prop:string]: string} = {
+    'html': 'html',
+    'js': 'javascript',
+    'ts': 'typescript',
+    'java': 'java',
+    'py': 'python',
+    'cpp': 'cpp',
+    'json': 'json',
+    'xml': 'xml',
+}
+
+export async function initFolderTree() {
+    store.subscribe(async () => {
+        if (store.getState().loadProject.isLoading) {
+            const groups = molecule.editor.getState().groups
+            const hide = message.loading('Please wait, Project is loading...', 0)
+            const res = await API.getFolderTree();
+            hide()
+            groups?.forEach((group) => {
+                molecule.editor.closeAll(group.id)
+            })
+            if (res.id === 'error') {
+                message.error(res.data.description)
+            }
+            else message.success('Loading is Complete')
+            if (!store.getState().loadProject.isLoading && store.getState().loadProject.isValid) {
+                const folderTreeData = cloneDeep(res);
+                molecule.folderTree.reset();
+                molecule.folderTree.add(folderTreeData);
+            }
+        }
+    })
+}
+
+export function handleSelectFolderTree() {
+    molecule.folderTree.onSelectFile((file: IFolderTreeNodeProps) => {
+        molecule.editor.open(transformToEditorTab(file))
+        updateStatusBarLanguage(file.data.language);
+    });
+}
+
+export  function handleRenameFile(){
+    molecule.folderTree.onUpdateFileName(file => {
+        const {name, id, location, data} = file
+        const frag = name!.split('.');
+        const parentNode = molecule.folderTree.getParentNode(id);
+        let count = -1;
+        if (parentNode && parentNode.children){
+            parentNode.children.forEach(((value) => value.name === name?count++:count+=0))
+        }
+        if (count>0) frag![0] = frag![0] + `(${count})`;
+        const newName = frag.join('.');
+        const ext = frag[frag.length-1];
+        const newLang = extToLang[ext] || 'file'
+        const newLoc = location?.split('/') || [];
+        newLoc[newLoc.length - 1] = newName;
+        const newLocation = newLoc.join('/');
+        const newFile = {
+            ...file,
+            id,
+            name: newName,
+            location: newLocation,
+            isEditable: false,
+            data: {
+                ...data,
+                language: newLang
+            }
+        };
+        folderTree.update(newFile);
+        const groupId = molecule.editor.getGroupIdByTab(id.toString());
+        const isValidGroupId = !!groupId || groupId === 0;
+        if (isValidGroupId) {
+            const prevTab =
+                molecule.editor.getTabById<BuiltInEditorTabDataType>(
+                    id.toString(),
+                    groupId
+                );
+            const newTab: IEditorTab = { id: id.toString(), name , breadcrumb: transformToEditorTab(newFile).breadcrumb};
+            const prevTabData = prevTab?.data;
+            newTab.data = { ...prevTabData, language: newLang};
+            if (molecule.editor.getState().current?.activeTab === id.toString()) {
+                updateStatusBarLanguage(newLang);
+            }
+            molecule.editor.updateTab(newTab);
+        }
+    })
+}
+
+export function handleNewFile(){
+    molecule.folderTree.onCreate((type, nodeId) => {
+        if (type == 'Folder'){
+            molecule.folderTree.add(
+                new TreeNodeModel({
+                    id: `${nodeId}_${new Date().getTime()}`,
+                    name: '',
+                    isLeaf: false,
+                    fileType: FileTypes.Folder,
+                    isEditable: true,
+                    data: {
+                    }
+                }), nodeId
+            );
+        }
+        else {
+            molecule.folderTree.add(
+                new TreeNodeModel({
+                    id: `${nodeId}_${new Date().getTime()}`,
+                    name: '',
+                    isLeaf: type === FileTypes.File,
+                    fileType: type,
+                    isEditable: true,
+                    data: {
+                    }
+                }), nodeId
+            );
+        }
+    })
+}
+export function updateStatusBarLanguage(language: string) {
+    if (!language) return;
+    language = language.toUpperCase();
+    const languageStatusItem = molecule.statusBar.getStatusBarItem(STATUS_BAR_LANGUAGE.id, Float.right);
+    if (languageStatusItem) {
+        languageStatusItem.name = language;
+        molecule.statusBar.update(languageStatusItem, Float.right);
+    } else {
+        molecule.statusBar.add(Object.assign({}, STATUS_BAR_LANGUAGE, { name: language } ), Float.right);
+    }
+}
+
+export function handleStatusBarLanguage() {
+    const moleculeEditor = molecule.editor;
+    moleculeEditor.onSelectTab((tabId, groupId) => {
+        if (!groupId) return;
+        const group = moleculeEditor.getGroupById(groupId);
+        if (!group) return;
+        const tab: any = moleculeEditor.getTabById(tabId, group.id!);
+        if (tab) {
+            updateStatusBarLanguage(tab.data!.language!);
+        }
+    })
+}

+ 38 - 0
src/extensions/theFirstExtension/index.ts

@@ -0,0 +1,38 @@
+
+import { IExtension } from '@dtinsight/molecule/esm/model/extension';
+import { IExtensionService } from '@dtinsight/molecule/esm/services';
+import * as folderTreeController from './folderTreeController';
+import * as searchPaneController from './searchPaneController';
+import * as editorController from './editorController'
+import molecule from "@dtinsight/molecule";
+import Welcome from "../../pages/welcome";
+import React from "react";
+export class FirstExtension implements IExtension {
+
+    id: string = '';
+    name: string = '';
+
+    constructor(
+        id: string = 'TheFirstExtension', 
+        name: string = 'The First Extension'
+    ) {
+        this.id = id;
+        this.name = name;
+    }
+
+    activate(extensionCtx: IExtensionService): void {
+        folderTreeController.initFolderTree();
+        folderTreeController.handleSelectFolderTree();
+        folderTreeController.handleRenameFile();
+        folderTreeController.handleNewFile();
+        folderTreeController.handleStatusBarLanguage();
+        editorController.setEntry();
+        editorController.activateEditCallback();
+        searchPaneController.handleSearchEvent();
+        searchPaneController.handleSelectSearchResult();
+    }
+
+    dispose(extensionCtx: IExtensionService): void {
+        throw new Error('Method not implemented.');
+    }
+}

+ 20 - 0
src/extensions/theFirstExtension/searchPaneController.ts

@@ -0,0 +1,20 @@
+import molecule from '@dtinsight/molecule';
+import API from '../../api';
+import { transformToEditorTab } from '../../common';
+
+export function handleSelectSearchResult() {
+    molecule.search.onResultClick((item) => {
+        molecule.editor.open(transformToEditorTab(item));
+    });
+}
+
+export function handleSearchEvent() {
+    molecule.search.onSearch(async (value, replaceValue, config) => {
+        if (!value) return;
+
+        const res = await API.search(value);
+        if (res.message === 'success') {
+            molecule.search.setResult(res.data.children);
+        }
+    });
+}

+ 244 - 0
src/global.css

@@ -0,0 +1,244 @@
+/* Some styles used for multiply components */
+.split-text {
+  float: left;
+  padding: 0 5px; }
+
+.task_offline_message {
+  margin-bottom: 10px;
+  padding: 10px;
+  color: #666;
+  font-size: 12px;
+  background-color: #eef6fe; }
+
+.no-padding-modal .ant-modal-body {
+  padding: 0;
+  font-size: 12px;
+  line-height: 1.5; }
+
+.ope-statistics {
+  display: flex;
+  flex: none;
+  flex-wrap: nowrap;
+  overflow-x: scroll;
+  font-weight: bold; }
+  .ope-statistics span {
+    height: 32px;
+    margin: 0 8px;
+    font-size: 12px;
+    line-height: 23px;
+    white-space: nowrap; }
+
+.status_overview_basic_block, .status_overview_fail_font, .status_overview_running_font, .status_overview_grey_font, .status_overview_yellow_font, .status_overview_finished_font, .status_overview_count_font {
+  display: inline-block;
+  padding: 4px 20px;
+  font-weight: 400;
+  border-radius: 30px; }
+
+.status_overview_fail_font {
+  color: #ef5350;
+  background: #ffe9e9; }
+
+.status_overview_running_font {
+  color: #2491f7;
+  background: #def; }
+
+.status_overview_grey_font {
+  color: #94a8c6;
+  background: #e6e9f2; }
+
+.status_overview_yellow_font {
+  color: #f5a623;
+  background: #f9f3de; }
+
+.status_overview_finished_font {
+  color: #00a755;
+  background: #cdf7e2; }
+
+.status_overview_count_font {
+  color: #333;
+  background: #f2f2f2; }
+
+.dt-refresh.ant-btn {
+  width: 32px;
+  height: 32px;
+  padding: 0;
+  color: var(--problemsInfoIcon-foreground);
+  line-height: 32px;
+  background: var(--editor-background);
+  border: none;
+  border-radius: 0;
+  box-shadow: 0 2px 6px 0 var(--minimapSlider-hoverBackground); }
+
+.modal-body-nopadding .ant-modal-body {
+  padding: 0; }
+
+.modal-body--height100 .ant-modal-content {
+  height: 100%; }
+  .modal-body--height100 .ant-modal-content .ant-modal-body {
+    height: 528px; }
+
+.ellipsis {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap; }
+
+.codicon-sync::before {
+  color: #cbcb41; }
+
+.codicon-code::before {
+  color: #53beda; }
+
+/* Reset some ant design styles */
+[data-prefers-color='dark'] .ant-tooltip-inner,
+[data-prefers-color='dark'] .ant-dropdown-menu,
+[data-prefers-color='dark'] .ant-table-filter-dropdown-btns,
+[data-prefers-color='dark'] .ant-table-filter-dropdown,
+[data-prefers-color='dark'] .ant-select-dropdown {
+  color: var(--menu-foreground);
+  background: var(--menu-background); }
+[data-prefers-color='dark'] .ant-tooltip-arrow-content {
+  --antd-arrow-background-color: var(--menu-background); }
+[data-prefers-color='dark'] .ant-drawer-header,
+[data-prefers-color='dark'] .ant-drawer-body,
+[data-prefers-color='dark'] .ant-modal-header,
+[data-prefers-color='dark'] .ant-modal-body,
+[data-prefers-color='dark'] .ant-modal-footer,
+[data-prefers-color='dark'] .ant-modal-content,
+[data-prefers-color='dark'] .ant-table-footer,
+[data-prefers-color='dark'] .ant-table-container,
+[data-prefers-color='dark'] .ant-drawer .ant-table tbody > tr > td.ant-table-cell-fix-left,
+[data-prefers-color='dark'] .ant-drawer .ant-table tbody > tr > td.ant-table-cell-fix-right,
+[data-prefers-color='dark'] .ant-table-cell-fix-right,
+[data-prefers-color='dark'] .ant-table-cell-fix-left,
+[data-prefers-color='dark'] .ant-drawer .ant-table,
+[data-prefers-color='dark'] .ant-modal .ant-table,
+[data-prefers-color='dark'] .ant-card,
+[data-prefers-color='dark'] .ant-pro-card-body,
+[data-prefers-color='dark'] .ant-table-filter-trigger:hover,
+[data-prefers-color='dark'] .ant-popover-inner,
+[data-prefers-color='dark'] .ant-popover-arrow-content::before,
+[data-prefers-color='dark'] .ant-message-notice-content {
+  background: var(--editorGroupHeader-tabsBackground); }
+[data-prefers-color='dark'] .ant-drawer .ant-table thead > tr > th,
+[data-prefers-color='dark'] .ant-table-thead > tr > th,
+[data-prefers-color='dark'] .ant-table-small .ant-table-thead > tr > th,
+[data-prefers-color='dark'] .ant-modal .ant-table.ant-table-small thead > tr > th,
+[data-prefers-color='dark'] .ant-drawer .ant-table tbody > tr.ant-table-row:hover > td,
+[data-prefers-color='dark'] .ant-modal .ant-table tbody > tr.ant-table-row:hover > td,
+[data-prefers-color='dark'] .ant-table-tbody > tr.ant-table-placeholder:hover > td,
+[data-prefers-color='dark'] .ant-table-tbody > tr.ant-table-row:hover > td,
+[data-prefers-color='dark'] .ant-table-tbody > tr > td.ant-table-cell-row-hover,
+[data-prefers-color='dark'] .ant-table-tbody > tr.ant-table-row-selected > td,
+[data-prefers-color='dark'] .ant-drawer .ant-table tbody > tr.ant-table-row-selected > td.ant-table-cell-fix-left,
+[data-prefers-color='dark'] .ant-drawer .ant-table tbody > tr.ant-table-row-selected > td.ant-table-cell-fix-right,
+[data-prefers-color='dark'] .ant-descriptions-bordered .ant-descriptions-item-label {
+  background: var(--editor-background); }
+[data-prefers-color='dark'] .ant-notification-notice {
+  background: var(--notifications-background); }
+
+[data-prefers-color] .ant-form-item-label > label,
+[data-prefers-color] .ant-form label,
+[data-prefers-color] .ant-select,
+[data-prefers-color] .ant-input,
+[data-prefers-color] .ant-input-affix-wrapper,
+[data-prefers-color] .ant-input-group-addon,
+[data-prefers-color] .ant-input-number,
+[data-prefers-color] .ant-select-item,
+[data-prefers-color] .ant-empty,
+[data-prefers-color] .ant-form-item,
+[data-prefers-color] .ant-picker-dropdown,
+[data-prefers-color] .ant-btn,
+[data-prefers-color] .ant-picker-input > input,
+[data-prefers-color] .ant-table,
+[data-prefers-color] .ant-checkbox-wrapper,
+[data-prefers-color] .ant-tooltip,
+[data-prefers-color] .ant-table-cell,
+[data-prefers-color] .ant-descriptions-item-label,
+[data-prefers-color] .ant-descriptions-item-content,
+[data-prefers-color] .ant-radio-button-wrapper,
+[data-prefers-color] .ant-dropdown-menu-item,
+[data-prefers-color] .ant-dropdown-menu-submenu-title,
+[data-prefers-color] .ant-form-item-explain,
+[data-prefers-color] .ant-form-item-extra,
+[data-prefers-color] .ant-modal-confirm-body .ant-modal-confirm-content,
+[data-prefers-color] .ant-picker,
+[data-prefers-color] .ant-input-number-group-addon,
+[data-prefers-color] .ant-collapse,
+[data-prefers-color] .ant-form,
+[data-prefers-color] .ant-select-dropdown,
+[data-prefers-color] .ant-tabs-tab,
+[data-prefers-color] .ant-badge-status-text {
+  font-size: 12px; }
+[data-prefers-color] .ant-input {
+  line-height: calc(14 / 12 * 1.5715); }
+[data-prefers-color] .ant-breadcrumb a,
+[data-prefers-color] .ant-breadcrumb > span:last-child {
+  color: var(--breadcrumb-foreground); }
+  [data-prefers-color] .ant-breadcrumb a:hover,
+  [data-prefers-color] .ant-breadcrumb > span:last-child:hover {
+    color: var(--breadcrumb-focusForeground); }
+
+.ant-tooltip-inner {
+  max-width: 300px; }
+
+.ant-collapse.ant-collapse-borderless {
+  background: transparent; }
+
+.mo-sidebar__pane *[class^='ant-'] {
+  transition: none !important; }
+
+.mo-statusBar a:hover {
+  color: inherit; }
+
+.mo-workbench .ant-tree-show-line .ant-tree-indent-unit::before {
+  border-right-color: var(--tree-indentGuidesStroke); }
+.mo-workbench .ant-tree-switcher-leaf-line::before {
+  border-right-color: var(--tree-indentGuidesStroke); }
+.mo-workbench .ant-tree-switcher-leaf-line::after {
+  border-bottom-color: var(--tree-indentGuidesStroke); }
+
+.mo-menuBar--horizontal {
+  height: 32px;
+  background: var(--activityBar-background); }
+  .mo-menuBar--horizontal > .mo-menu {
+    height: 32px;
+    color: var(--activityBar-inactiveForeground);
+    background: inherit; }
+
+.mo-editor__group .mo-tab__item:hover {
+  background-color: var(--tab-hoverBackground); }
+
+.mo-tab__item__status,
+.mo-tab__item__op {
+  color: inherit; }
+  .mo-tab__item__status:hover,
+  .mo-tab__item__op:hover {
+    color: inherit; }
+
+.mo-editor__group-breadcrumb {
+  color: var(--breadcrumb-foreground); }
+  .mo-editor__group-breadcrumb .mo-breadcrumb__item:hover {
+    color: var(--breadcrumb-focusForeground);
+    opacity: 1; }
+
+.mo-notification__item:focus {
+  background: var(--list-hoverBackground);
+  outline: 1px solid var(--list-focusOutline); }
+
+.mo-statusBar__item > a:empty {
+  padding: 0; }
+
+body {
+  margin: 0;
+  padding: 0;
+  overflow: hidden; }
+
+code {
+  padding: 2px 5px;
+  font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', monospace;
+  background: var(--textBlockQuote-background); }
+
+#root {
+  height: 100%; }
+
+/*# sourceMappingURL=global.css.map */

File diff suppressed because it is too large
+ 2 - 0
src/global.css.map


+ 22 - 0
src/global.scss

@@ -0,0 +1,22 @@
+@import './styles/common.scss';
+@import './styles/theme.scss';
+@import './styles/reset.scss';
+@import './styles/molecule.scss';
+@import './styles/variables.scss';
+
+body {
+	margin: 0;
+	padding: 0;
+	// prevent scroll on body
+	overflow: hidden;
+}
+
+code {
+	padding: 2px 5px;
+	font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', monospace;
+	background: var(--textBlockQuote-background);
+}
+
+#root {
+	height: 100%;
+}

+ 29 - 0
src/layout/index.tsx

@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import zhCN from 'antd/lib/locale/zh_CN';
+import { ConfigProvider, message } from 'antd';
+
+message.config({
+	top: 20,
+	duration: 2,
+});
+
+export default function Layout(props: { children: React.ReactElement }) {
+	return <ConfigProvider locale={zhCN}>{props.children}</ConfigProvider>;
+}

+ 105 - 0
src/pages/dev.tsx

@@ -0,0 +1,105 @@
+import React, {useEffect, useLayoutEffect} from 'react';
+import {useParams} from "react-router-dom";
+import {Provider} from "react-redux";
+
+import molecule, { create} from '@dtinsight/molecule';
+import '@dtinsight/molecule/esm/style/mo.css';
+
+import extensions from '../extensions';
+import MyWorkbench from './workbench';
+import {store} from "@/redux/store";
+import {loadingProject} from "@/redux/action/action";
+import {DRAWER_MENU_ENUM} from "@/constant";
+import CustomDrawer, {updateDrawer} from "@/components/drawer";
+import {Breadcrumb} from "antd";
+import Layout from "@/layout";
+import {history} from "@@/core/history";
+
+(window as any).__DEVELOPMENT__ = false;
+
+const moleculeInst = create({
+  extensions,
+})
+
+moleculeInst.onBeforeInit(() => {
+    molecule.builtin.inactiveModule('builtInExplorerOutlinePanel')
+    molecule.builtin.inactiveModule('builtInOutputPanel');
+    molecule.builtin.inactiveModule('builtInPanelProblems')
+    molecule.builtin.inactiveModule('builtInStatusProblems');
+})
+
+const CustomWorkbench = () => moleculeInst.render(<MyWorkbench />)
+
+function Dev(){
+    const openDrawer = (drawerId: string) => {
+        switch (drawerId) {
+            case DRAWER_MENU_ENUM.RESULT:
+                updateDrawer({
+                    id: 'root',
+                    visible: true,
+                    title: (
+                        <Breadcrumb>
+                            <Breadcrumb.Item>Result</Breadcrumb.Item>
+                        </Breadcrumb>
+                    ),
+
+                    renderContent: () => {
+                        return (
+                            <Layout>
+                                <div>
+                                    test
+                                </div>
+                            </Layout>
+                        );
+                    },
+                })
+        }
+    }
+    useLayoutEffect(() => {
+        if (history.location.query?.drawer) {
+            openDrawer(history.location.query?.drawer as string);
+        }
+
+        const unlisten = history.listen((route) => {
+            if (route.query?.drawer) {
+                openDrawer(route.query?.drawer as string);
+            }
+        });
+        return unlisten;
+    }, []);
+
+    useEffect(() => {
+        function handleBeforeLeave(e: BeforeUnloadEvent) {
+            const { groups } = molecule.editor.getState();
+            if (groups?.length) {
+                // refer to: https://developer.mozilla.org/en-US/docs/Web/API/BeforeUnloadEvent
+                // prettier-ignore
+                // eslint-disable-next-line no-useless-escape
+                const confirmationMessage = '\o/';
+                e.preventDefault();
+                (e || window.event).returnValue = confirmationMessage; // Gecko + IE
+                return confirmationMessage; // Webkit, Safari, Chrome
+            }
+        }
+        window.addEventListener('beforeunload', handleBeforeLeave);
+
+        return () => window.removeEventListener('beforeunload', handleBeforeLeave);
+    }, []);
+    let param = useParams() as {
+        nameScope: string,
+            path: string,
+            ref: string
+    }
+    useEffect(() => {
+        store.dispatch(loadingProject(param))
+        console.log(param)
+    }, [])
+    return (
+        <Provider store={store}>
+            <CustomWorkbench />
+            <CustomDrawer id="root" renderContent={() => null}/>
+        </Provider>
+    )
+}
+
+export default Dev;

+ 102 - 0
src/pages/index.tsx

@@ -0,0 +1,102 @@
+import molecule, { create } from '@dtinsight/molecule';
+import  Workbench  from './workbench';
+import extensions from "@/extensions";
+import CustomDrawer, {updateDrawer} from "@/components/drawer";
+import {DRAWER_MENU_ENUM} from "@/constant";
+import {Breadcrumb} from "antd";
+import {history} from "umi";
+import Layout from "@/layout";
+import {useEffect, useLayoutEffect} from "react";
+import notification from "@/components/notification";
+import {getCookie, getQuestion, goToLogin, setCookie} from "@/utils";
+import Result from "@/pages/seec/result";
+
+const moInstance = create({
+    extensions,
+});
+
+moInstance.onBeforeInit(() => {
+    molecule.builtin.inactiveModule('builtInExplorerOutlinePanel')
+    molecule.builtin.inactiveModule('builtInOutputPanel');
+    molecule.builtin.inactiveModule('builtInPanelProblems')
+    molecule.builtin.inactiveModule('builtInStatusProblems');
+    molecule.builtin.inactiveModule('quickCreateFileAction')
+    molecule.builtin.inactiveModule('FOLDER_PANEL_CONTEXT_MENU')
+    molecule.builtin.inactiveModule('FILE_CONTEXT_MENU')
+})
+const MoleculeProvider = () => moInstance.render(<Workbench />);
+export default function HomePage() {
+    useEffect(() => {
+        if (!getCookie('token')) {
+            notification.error({key: 'unLogin', message:'Not Logged In'})
+        } else goToLogin()
+    }, []);
+    const openDrawer = (drawerId: string) => {
+        switch (drawerId) {
+            case DRAWER_MENU_ENUM.RESULT:
+                updateDrawer({
+                    id: 'root',
+                    visible: true,
+                    title: (
+                        <Breadcrumb>
+                            <Breadcrumb.Item>Result</Breadcrumb.Item>
+                        </Breadcrumb>
+                    ),
+
+                    renderContent: () => {
+                        return (
+                            <Result />
+                        );
+                    },
+                })
+        }
+    }
+    useLayoutEffect(() => {
+        if (history.location.query?.drawer) {
+            openDrawer(history.location.query?.drawer as string);
+        }
+        if (history.location.query?.id_token) {
+            setCookie('token', history.location.query?.id_token as string)
+            history.push('/')
+        }
+        if (history.location.query?.examId && history.location.query?.questionId) {
+            getQuestion(history.location.query?.examId as string, history.location.query?.questionId as string)
+            history.push('/')
+        }
+        const unlisten = history.listen((route) => {
+            if (route.query?.drawer) {
+                openDrawer(route.query?.drawer as string);
+            }
+            if (history.location.query?.id_token) {
+                setCookie('token', history.location.query?.id_token as string)
+                history.push('/')
+            }
+        });
+        return unlisten;
+    }, []);
+
+    useEffect(() => {
+        function handleBeforeLeave(e: BeforeUnloadEvent) {
+            const { groups } = molecule.editor.getState();
+            if (groups?.length) {
+                // refer to: https://developer.mozilla.org/en-US/docs/Web/API/BeforeUnloadEvent
+                // prettier-ignore
+                // eslint-disable-next-line no-useless-escape
+                const confirmationMessage = '\o/';
+                e.preventDefault();
+                (e || window.event).returnValue = confirmationMessage; // Gecko + IE
+                return confirmationMessage; // Webkit, Safari, Chrome
+            }
+        }
+        window.addEventListener('beforeunload', handleBeforeLeave);
+
+        return () => window.removeEventListener('beforeunload', handleBeforeLeave);
+    }, []);
+
+    return (
+        <div>
+            <MoleculeProvider/>
+            <CustomDrawer id="root" renderContent={() => null}/>
+        </div>
+    )
+}

File diff suppressed because it is too large
+ 7 - 0
src/pages/logo.tsx


+ 84 - 0
src/pages/myMenuBar/index.tsx

@@ -0,0 +1,84 @@
+import 'reflect-metadata';
+import { container } from 'tsyringe';
+import React, { useCallback, useEffect } from 'react';
+
+import { connect } from '@dtinsight/molecule/esm/react';
+import { MenuBarController } from '@dtinsight/molecule/esm/controller/menuBar';
+
+import { IMenuBar, IMenuBarItem } from '@dtinsight/molecule/esm/model/workbench/menuBar';
+import { IMenuBarController } from '@dtinsight/molecule/esm/controller/menuBar';
+import { IMenuProps, Menu, MenuMode } from '@dtinsight/molecule/esm/components';
+import { KeybindingHelper } from '@dtinsight/molecule/esm/services/keybinding';
+import { MenuBarService } from '@dtinsight/molecule/esm/services';
+
+import './style.css';
+import styled from 'styled-components';
+
+const menuBarService = container.resolve(MenuBarService);
+const menuBarController = container.resolve(MenuBarController);
+
+const Logo = styled.img`
+    height: 25px;
+    margin: 0 12px;
+`
+
+export function MenuBar(props: IMenuBar & IMenuBarController) {
+    const { data, onClick, updateFocusinEle } = props;
+
+    const addKeybindingForData = (
+        rawData: IMenuBarItem[] = []
+    ): IMenuProps[] => {
+        const resData: IMenuProps[] = rawData.concat();
+        const stack = [...resData];
+        while (stack.length) {
+            const head = stack.pop();
+            if (head) {
+                if (head?.data) {
+                    stack.push(...head.data);
+                } else {
+                    const simplyKeybinding =
+                        KeybindingHelper.queryGlobalKeybinding(head.id!) || [];
+                    if (simplyKeybinding.length) {
+                        head.keybinding = KeybindingHelper.convertSimpleKeybindingToString(
+                            simplyKeybinding
+                        );
+                    }
+                }
+            }
+        }
+        return resData;
+    };
+
+    const handleClick = (e: React.MouseEvent, item: IMenuBarItem) => {
+        onClick?.(e, item);
+    };
+
+    const handleSaveFocusinEle = useCallback((e: FocusEvent) => {
+        updateFocusinEle?.(e.target as HTMLElement | null);
+    }, [updateFocusinEle]);
+
+    useEffect(() => {
+        document.body.addEventListener('focusin', handleSaveFocusinEle);
+        return () => {
+            document.body.removeEventListener('focusin', handleSaveFocusinEle);
+        };
+    }, [ handleSaveFocusinEle ]);
+
+    return (
+        <div className="myMenuBar">
+            <Logo alt="logo" src="logo192.png"/>
+            <Menu
+                role="menu"
+                mode={MenuMode.Horizontal}
+                trigger="click"
+                onClick={handleClick}
+                style={{ width: '100%' }}
+                data={addKeybindingForData(data)}
+            />
+        </div>
+    );
+}
+
+const MyMenuBarView = connect(menuBarService, MenuBar, menuBarController);
+
+export default MyMenuBarView;

+ 38 - 0
src/pages/myMenuBar/style.css

@@ -0,0 +1,38 @@
+.myMolecule .mo-mainBench {
+    height: calc(100% - 25px);
+}
+
+.myMenuBar {
+    height: 25px;
+    width: 100%;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    background: var(--activityBar-background);
+}
+
+.myMenuBar > .mo-menu {
+    box-shadow: none;
+    background: var(--activityBar-background);
+    color: var(--foreground);
+}
+
+.myMenuBar .mo-menu__item:hover {
+    background-color: auto !important;
+    border-color: auto !important;
+    color: auto !important;
+}
+
+.myMenuBar > .mo-menu--horizontal .mo-menu__item {
+    min-width: auto;
+}
+
+.myMenuBar > .mo-menu--horizontal > .mo-menu__item > .mo-menu__content>.mo-menu__label {
+    padding: 0 1em;
+    flex: none;
+    font-size: 12px;
+}
+
+.myMenuBar > .mo-menu--horizontal > .mo-menu__item > .mo-menu__content> .mo-menu__indicator {
+    display: none;
+}

+ 157 - 0
src/pages/seec/result.tsx

@@ -0,0 +1,157 @@
+import api, {BuildStatus, CommitSerializer, ExamSerializer, ReceivedData, ResultSerializer} from "@/api";
+import {ProColumns, ProTable} from "@ant-design/pro-components";
+import {Button, Card, Descriptions, message, Modal, Tag, Tooltip} from "antd";
+import {useEffect, useRef, useState} from "react";
+import CardModal from "@/components/cardModal";
+import LogPane from "@/components/logPane";
+import {SyncOutlined} from "@ant-design/icons";
+import {store} from "@/redux/store";
+
+interface IRecordProps {
+    id?: number
+    number?: number
+    status?: BuildStatus
+    consoleOutput?: string
+    score?: number
+    commit?: {
+        id?: number
+        createdAt?: number
+    }
+    failures?: Array<IFailureListProps>
+}
+
+interface IFailureListProps {
+    name?: string
+    details?: string
+    trace?: string
+}
+
+function buildStatusToTagType(status?: BuildStatus) {
+    switch (status) {
+        case 'RUNNING':
+            return 'processing'
+        case 'SUCCESS':
+            return 'success'
+        case 'UNSTABLE':
+            return 'warning'
+        case 'FAILURE':
+        case 'TIMEOUT':
+            return 'error'
+    }
+    return 'default'
+}
+
+const columns: ProColumns<IFailureListProps>[] = [
+    {
+        title: 'Failure Test Case',
+        dataIndex: 'name',
+        key: 'name'
+    },
+]
+export default () => {
+    const [record, setRecord] = useState<IRecordProps>({})
+    const [logModalVisible, setLogModalVisible] = useState(false)
+    const [loading, setLoading] = useState<boolean>(false);
+    const handleRefresh = async () => {
+        const examId = store.getState().loadQuestion.examId
+        if (!examId) message.error("Please select an exam")
+        else {
+            const hide = message.loading('Please wait, Result is loading...', 0)
+            setLoading(true)
+            const exam: ReceivedData<ExamSerializer> = await api.getByExamId(examId!)
+            const resultId = exam.res?.result?.id
+            const examResult: ReceivedData<ResultSerializer> = await api.getByResultId(resultId!)
+            const commits = examResult.res?.commits
+            // commits!.find((commit => commit.created_at === examResult.res?.lastCommitAt))
+            const commit = commits![0]
+            if (commit.finished) {
+                const commitId = commit.id
+                const commitResult: ReceivedData<CommitSerializer> = await api.getByCommitId(commitId!)
+                const recordId = commitResult.res?.records![0].id
+                const data = await api.getByRecordId(recordId!) as ReceivedData<IRecordProps>
+                if (data.err === 0) setRecord(data.res || {})
+                else {
+                    message.error('Error while searching result')
+                }
+                console.log(data)
+            } else {
+                message.info("Program is running...")
+            }
+            setLoading(false)
+            hide()
+        }
+    };
+
+    useEffect(() => {
+        (async () => { await handleRefresh()})()
+    }, [])
+    const showConsoleOutput = () => {
+        setLogModalVisible(true)
+    }
+
+    const hideConsoleOutput = () => {
+        setLogModalVisible(false)
+    }
+
+    return (
+        <div>
+            <ProTable<IFailureListProps>
+                rowKey="name"
+                columns={columns}
+                toolbar={{
+                    actions: [
+                        <Button type = "primary" disabled={loading} onClick={() => showConsoleOutput()}>
+                            Console
+                        </Button>,
+                        <Button loading={loading}>
+                            <SyncOutlined onClick={() => handleRefresh()} />
+                        </Button>
+                    ]
+                }}
+                dataSource={record.failures}
+                tableExtraRender={(_, data) => (
+                    <Card>
+                        <Descriptions size="small" column={3}>
+                            <Descriptions.Item label="Status">
+                                <Tag color={buildStatusToTagType(record.status)}>
+                                    {record.status}
+                                </Tag>
+                            </Descriptions.Item>
+                            <Descriptions.Item label="Failure Case">{data.length}</Descriptions.Item>
+                            <Descriptions.Item label="Score">
+                            <span>
+                                {record.score}
+                            </span>
+                            </Descriptions.Item>
+                        </Descriptions>
+                    </Card>
+                )}
+                pagination={{
+                    pageSize: 10
+                }}
+                expandable={{
+                    expandedRowRender: record => <Card>
+                        <p>
+                            {record.trace}
+                        </p>
+                    </Card>
+                }}
+                search={false}
+                options={false}
+            />
+
+            <Modal
+                title = 'Console Output'
+                onCancel={hideConsoleOutput}
+                open= {logModalVisible}
+                centered
+                footer={null}
+                width={800}
+
+            >
+                <LogPane value={record.consoleOutput || 'Nothing Here'} />
+            </Modal>
+        </div>
+
+    )
+}

+ 55 - 0
src/pages/welcome/hooks.ts

@@ -0,0 +1,55 @@
+import { localize } from '@dtinsight/molecule/esm/i18n/localize';
+import { constants } from '@dtinsight/molecule/esm/services/builtinService/const';
+import { KeybindingHelper } from '@dtinsight/molecule/esm/services/keybinding';
+import { useEffect, useState } from 'react';
+
+const KEYBINDINGS = () => [
+    {
+        id: constants.ACTION_QUICK_COMMAND,
+        name: localize('menu.commandPalette', 'Command Palette'),
+    },
+    {
+        id: constants.ACTION_QUICK_ACCESS_SETTINGS,
+        name: localize('menu.settings', 'Settings'),
+    },
+    {
+        id: constants.ACTION_SELECT_THEME,
+        name: localize('menu.colorTheme', 'Color Theme'),
+    },
+];
+
+export const useGetKeys = () => {
+    const [keys, setKeys] = useState<
+        {
+            keybindings: string;
+            id: string;
+            name: any;
+        }[]
+    >([]);
+
+    useEffect(() => {
+        const res = KEYBINDINGS()
+            .map((acessCommand) => {
+                const simpleKeybindings =
+                    KeybindingHelper.queryGlobalKeybinding(acessCommand.id);
+                if (simpleKeybindings?.length) {
+                    const keybindings =
+                        KeybindingHelper.convertSimpleKeybindingToString(
+                            simpleKeybindings
+                        );
+                    return { ...acessCommand, keybindings };
+                }
+                return null;
+            })
+            .filter(Boolean);
+        setKeys(
+            res as {
+                keybindings: string;
+                id: string;
+                name: any;
+            }[]
+        );
+    }, []);
+
+    return keys;
+};

+ 29 - 0
src/pages/welcome/index.tsx

@@ -0,0 +1,29 @@
+import React from 'react';
+import Logo from './logo';
+import { prefixClaName } from '@dtinsight/molecule/esm/common/className';
+import { useGetKeys } from './hooks';
+
+export default function Welcome() {
+    const keys = useGetKeys();
+
+    return (
+        <div className={prefixClaName('welcome')}>
+            <Logo className="logo" />
+            <h1 className="title">SEEC</h1>
+            <div className="keybindings">
+                <ul>
+                    {keys.map((item) => {
+                        return (
+                            <li className="keys" key={item.id}>
+                                <span>{item.name}</span>
+                                <span>
+                                    {item.keybindings.split('').join(' ')}
+                                </span>
+                            </li>
+                        );
+                    })}
+                </ul>
+            </div>
+        </div>
+    );
+}

File diff suppressed because it is too large
+ 21 - 0
src/pages/welcome/logo.tsx


+ 35 - 0
src/pages/welcome/name.tsx

@@ -0,0 +1,35 @@
+import React from 'react';
+
+export default function () {
+    return (
+        <span>
+            <svg width="132" height="24" viewBox="0 0 132 24">
+                <g
+                    fill="none"
+                    fillRule="evenodd"
+                    stroke="none"
+                    strokeWidth="1"
+                    fontFamily="GEETYPE-TakaLineGB-Flash-Heavy, GEETYPE-TakaLineGB-Flash"
+                    fontSize="24"
+                    fontWeight="800"
+                    letterSpacing="2.667"
+                    opacity="0.48"
+                >
+                    <g
+                        fill="#A2A2A2"
+                        fillRule="nonzero"
+                        transform="translate(-654 -304)"
+                    >
+                        <g transform="translate(654 304)">
+                            <text>
+                                <tspan x="1.097" y="21">
+                                    SEECODER
+                                </tspan>
+                            </text>
+                        </g>
+                    </g>
+                </g>
+            </svg>
+        </span>
+    );
+}

+ 183 - 0
src/pages/workbench.tsx

@@ -0,0 +1,183 @@
+import 'reflect-metadata';
+import { container } from 'tsyringe';
+import React from 'react';
+
+import { EditorView } from '@dtinsight/molecule/esm//workbench/editor';
+import { SidebarView, Sidebar } from '@dtinsight/molecule/esm//workbench/sidebar';
+import { ActivityBarView } from '@dtinsight/molecule/esm/workbench/activityBar';
+import { StatusBarView } from '@dtinsight/molecule/esm//workbench/statusBar';
+import { MenuBarView } from '@dtinsight/molecule/esm/workbench/menuBar';
+import { PanelView } from '@dtinsight/molecule/esm/workbench/panel';
+
+import { ID_APP } from '@dtinsight/molecule/esm/common/id';
+import { APP_PREFIX } from '@dtinsight/molecule/esm/common/const';
+import { classNames, getFontInMac, prefixClaName, getBEMModifier, getBEMElement } from '@dtinsight/molecule/esm/common/className';
+
+import { connect } from '@dtinsight/molecule/esm/react';
+
+import { ILayoutController, LayoutController } from '@dtinsight/molecule/esm/controller/layout';
+import { LayoutService } from '@dtinsight/molecule/esm/services';
+import { ILayout, MenuBarMode } from '@dtinsight/molecule/esm/model/workbench/layout';
+import { IWorkbench } from '@dtinsight/molecule/esm/model/workbench';
+import { Display, Pane, SplitPane } from '@dtinsight/molecule/esm/components';
+
+import Logo from './logo';
+
+const defaultClassName = prefixClaName('menuBar');
+const horizontalClassName = getBEMModifier(
+    defaultClassName,
+    'horizontal'
+);
+const logoClassName = getBEMElement(horizontalClassName, 'logo');
+const logoContentClassName = getBEMElement(logoClassName, 'content');
+const mainBenchClassName = prefixClaName('mainBench');
+const workbenchClassName = prefixClaName('workbench');
+const compositeBarClassName = prefixClaName('compositeBar');
+const appClassName = classNames(APP_PREFIX, getFontInMac());
+const workbenchWithHorizontalMenuBarClassName = getBEMModifier(
+    workbenchClassName,
+    'with-horizontal-menuBar'
+);
+const withHiddenStatusBar = getBEMModifier(
+    workbenchClassName,
+    'with-hidden-statusBar'
+);
+const displayActivityBarClassName = getBEMElement(
+    workbenchClassName,
+    'display-activityBar'
+);
+
+const layoutController = container.resolve(LayoutController);
+const layoutService = container.resolve(LayoutService);
+
+function WorkbenchView(props: IWorkbench & ILayout & ILayoutController) {
+    const {
+        activityBar,
+        menuBar,
+        panel,
+        sidebar,
+        statusBar,
+        onPaneSizeChange,
+        onHorizontalPaneSizeChange,
+        splitPanePos,
+        horizontalSplitPanePos,
+    } = props;
+
+    const getSizes = () => {
+        if (panel.hidden) {
+            return ['100%', 0];
+        }
+        if (panel.panelMaximized) {
+            return [0, '100%'];
+        }
+        return horizontalSplitPanePos;
+    };
+
+    const isMenuBarVertical =
+        !menuBar.hidden && menuBar.mode === MenuBarMode.vertical;
+    const isMenuBarHorizontal =
+        !menuBar.hidden && menuBar.mode === MenuBarMode.horizontal;
+    const horizontalMenuBar = isMenuBarHorizontal
+        ? workbenchWithHorizontalMenuBarClassName
+        : null;
+    const hideStatusBar = statusBar.hidden ? withHiddenStatusBar : null;
+    const workbenchFinalClassName = classNames(
+        workbenchClassName,
+        horizontalMenuBar,
+        hideStatusBar
+    );
+
+    const handleSideBarChanged = (sizes: number[]) => {
+        if (sidebar.hidden) {
+            const clientSize = sizes[1];
+            const sidebarSize = splitPanePos[0];
+            if (typeof sidebarSize === 'string') {
+                // the sideBar size is still a default value
+                const numbSize = parseInt(sidebarSize, 10);
+                onPaneSizeChange?.([numbSize, clientSize - numbSize]);
+            } else {
+                onPaneSizeChange?.([sidebarSize, clientSize - sidebarSize]);
+            }
+        } else {
+            onPaneSizeChange?.(sizes);
+        }
+    };
+
+    const handleEditorChanged = (sizes: number[]) => {
+        if (panel.hidden) {
+            // get the non-zero size means current client size
+            const clientSize = sizes.find((s) => s)!;
+            const panelSize = horizontalSplitPanePos[1];
+            if (typeof panelSize === 'string') {
+                // the editor size is still a default value
+                const editorPercent =
+                    parseInt(horizontalSplitPanePos[0] as string, 10) / 100;
+                const numbericSize = clientSize * editorPercent;
+                onHorizontalPaneSizeChange?.([
+                    numbericSize,
+                    clientSize - numbericSize,
+                ]);
+            } else {
+                onHorizontalPaneSizeChange?.([
+                    clientSize - panelSize,
+                    panelSize,
+                ]);
+            }
+        } else {
+            onHorizontalPaneSizeChange?.(sizes);
+        }
+    };
+
+    return (
+        <div id={ID_APP} className={classNames(appClassName, 'myMolecule')} tabIndex={0}>
+            <div className={workbenchFinalClassName}>
+                <Display visible={isMenuBarHorizontal}>
+                    <MenuBarView mode={MenuBarMode.horizontal} logo={<Logo className={logoContentClassName} />}/>
+                </Display>
+                <div className={mainBenchClassName}>
+                    <div className={compositeBarClassName}>
+                        <Display visible={isMenuBarVertical}>
+                            <MenuBarView mode={MenuBarMode.vertical} />
+                        </Display>
+                        <Display
+                            visible={!activityBar.hidden}
+                            className={displayActivityBarClassName}
+                        >
+                            <ActivityBarView />
+                        </Display>
+                    </div>
+                    <SplitPane
+                        sizes={sidebar.hidden ? [0, '100%'] : splitPanePos}
+                        split="vertical"
+                        allowResize={[false, true]}
+                        onChange={handleSideBarChanged}
+                    >
+                        <Pane minSize={170} maxSize="80%">
+                            <SidebarView />
+                        </Pane>
+                        <SplitPane
+                            sizes={getSizes()}
+                            allowResize={[false, true]}
+                            split="horizontal"
+                            onChange={handleEditorChanged}
+                        >
+                            <Pane minSize="10%" maxSize="80%">
+                                <EditorView />
+                            </Pane>
+                            <PanelView />
+                        </SplitPane>
+                    </SplitPane>
+                </div>
+            </div>
+            <Display visible={!statusBar.hidden}>
+                <StatusBarView />
+            </Display>
+        </div>
+    );
+}
+
+export default connect(
+    layoutService,
+    WorkbenchView,
+    layoutController
+);

+ 87 - 0
src/redux/action/action.ts

@@ -0,0 +1,87 @@
+export const LOADING_PROJECT = "LOADING_PROJECT"
+
+export const LOAD_SUCCESS = "LOAD_SUCCESS"
+
+export const LOAD_ERROR = "LOAD_ERROR"
+
+export const LOAD_USER = "LOAD_USER"
+
+export const LOAD_QUESTION = "LOAD_QUESTION"
+
+export type UserRole =
+    | 'STUDENT'
+    | 'TEACHER'
+    | 'ADMIN'
+    | 'HR'
+    | 'STAFF'
+    | 'SEEC'
+    | 'SEECX'
+    | 'ASSISTANT'
+
+export interface UserSerializer {
+    id?: number
+    score?: number
+    username?: string
+    email?: string
+    phone?: string
+    role?: UserRole
+}
+
+export interface CodeSerializer {
+    examId?: number
+    fetchAt?: number
+    startAt?: number
+    endAt?: number
+    codeList?: Array<NestedCodeItemVO>
+}
+
+export interface NestedCodeItemVO {
+    questionId?: number
+    language?: string
+    projectName?: string
+    editable?: {
+        [key: string]: string
+    }
+    uneditable?: {
+        [key: string]: string
+    }
+}
+
+export function loadingProject(projectInfo: {
+    nameScope: string,
+    path: string,
+    ref: string
+}) {
+    return {
+        type: LOADING_PROJECT,
+        projectInfo
+    }
+}
+
+export function loadSuccess() {
+    return {
+        type: LOAD_SUCCESS
+    }
+}
+
+export function loadError(reason: any) {
+    return {
+        type: LOAD_ERROR,
+        reason
+    }
+}
+
+export function loadUser(userInfo: UserSerializer) {
+    return {
+        type: LOAD_USER,
+        userInfo
+    }
+}
+
+export function loadQuestion(questionInfo: CodeSerializer) {
+    return {
+        type: LOAD_QUESTION,
+        questionInfo
+    }
+}
+

+ 90 - 0
src/redux/reducer/reducer.ts

@@ -0,0 +1,90 @@
+import { combineReducers } from 'redux'
+import {
+    CodeSerializer,
+    LOAD_ERROR,
+    LOAD_QUESTION,
+    LOAD_SUCCESS,
+    LOAD_USER,
+    LOADING_PROJECT,
+    UserSerializer
+} from "../action/action";
+export type IState = {
+    isLoading: boolean,
+    isValid: boolean,
+    nameScope?: string,
+    path?: string,
+    ref?: string
+}
+function loadProject(state = {
+    isLoading: false,
+    isValid: false
+}, action: {
+    type: string,
+    projectInfo?: {
+        nameScope: string,
+        path: string,
+        ref: string
+    },
+    reason?: any
+}): IState{
+    switch (action.type) {
+        case LOADING_PROJECT:
+            return Object.assign({}, state, {
+                isLoading: true,
+                isValid: false,
+                nameScope: action.projectInfo!.nameScope,
+                path: action.projectInfo!.path,
+                ref: action.projectInfo!.ref
+            })
+        case LOAD_SUCCESS:
+            return Object.assign({}, state, {
+                isLoading: false,
+                isValid: true
+            })
+        case LOAD_ERROR:
+            return Object.assign({}, state, {
+                isLoading: false,
+                isValid: false,
+                reason: action.reason
+            })
+        default:
+            return state
+    }
+}
+
+function loadUser(state: UserSerializer = {}, action: {
+    type: string,
+    userInfo: UserSerializer
+}) {
+    switch (action.type) {
+        case LOAD_USER:
+            return Object.assign({}, state, {
+                ...action.userInfo
+            })
+        default:
+            return state
+    }
+}
+
+function loadQuestion(state: CodeSerializer = {}, action: {
+    type: string,
+    questionInfo: CodeSerializer
+}) {
+    switch (action.type) {
+        case LOAD_QUESTION:
+            return Object.assign({}, state, {
+                ...action.questionInfo
+            })
+        default:
+            return state
+    }
+}
+
+const rootReducer = combineReducers({
+        loadProject,
+        loadUser,
+        loadQuestion
+    }
+)
+
+export default rootReducer

+ 13 - 0
src/redux/store.ts

@@ -0,0 +1,13 @@
+import {createLogger} from "redux-logger";
+import {applyMiddleware, createStore} from "redux";
+import rootReducer from "./reducer/reducer";
+
+const logger =  createLogger()
+export function configureStore( initState?: object ){
+    return createStore(
+        rootReducer,
+        initState,
+        applyMiddleware(logger))
+}
+
+export const store = configureStore()

+ 15 - 0
src/services/auth.ts

@@ -0,0 +1,15 @@
+const portal = 'https://p.seec.seecoder.cn'
+
+export const getLoginUrl = () => {
+    const location = window.location
+    return `${portal}/interaction?client_id=seec-mooc&redirect_uri=${encodeURIComponent(
+        location.origin + '/'
+    )}&scope=openid`
+}
+
+/**
+ * 跳转到登陆界面
+ */
+export const jumpToLogin = () => {
+    window.location.href = getLoginUrl()
+}

+ 6 - 0
src/services/exam.ts

@@ -0,0 +1,6 @@
+const coder = 'https://coder.seec.seecoder.cn'
+
+
+export const jumpToCoder = () => {
+    window.location.href = coder
+}

+ 120 - 0
src/services/logService.ts

@@ -0,0 +1,120 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { Component } from '@dtinsight/molecule/esm/react';
+import moment from 'moment';
+
+export interface ITaskResultService {
+    /**
+     * 增量添加日志信息
+     *
+     * 自动添加换行标识符
+     */
+    appendLogs: (key: string, log: string) => void;
+    /**
+     * 清除任务执行的日志信息
+     */
+    clearLogs: (key: string) => void;
+    /**
+     * 任务执行结果
+     */
+    setResult: (key: `${string}-${string}`, result: any) => void;
+    /**
+     * 清除执行结果
+     */
+    clearResult: (key: string) => void;
+}
+
+/**
+ * 输出固定格式的日志前缀
+ * @example `[14:00:01] <error> xxxx`
+ */
+export function createLog(log: string, type: string = 'info') {
+    return `[${moment().format('HH:mm:ss')}] <${type}> ${log}`;
+}
+
+/**
+ * 生成固定格式的 title
+ * @example `=====title=====`
+ * @example `===============`
+ */
+export function createTitle(title = '') {
+    const baseLength = 15;
+    const offsetLength = Math.floor((1.5 * title.length) / 2);
+    const arr = new Array(Math.max(baseLength - offsetLength, 5));
+    const wraptext = arr.join('=');
+    return `${wraptext}${title}${wraptext}`;
+}
+
+export function createLinkMark(attrs: Record<string, string | null>) {
+    return `${window.location.origin}${attrs.href}`;
+}
+export interface IResultStates {
+    /**
+     * 存储不同任务执行的日志结果
+     */
+    logs: Record<string, string>;
+    /**
+     * 任务执行结果
+     * @key 前者为 tabId,后者为基于 sqlText 生成的 md5 码
+     */
+    results: Record<`${string}-${string}`, string[][]>;
+}
+
+class ResultService extends Component<IResultStates> implements ITaskResultService {
+    protected state: IResultStates;
+
+    constructor() {
+        super();
+        this.state = {
+            logs: {},
+            results: {},
+        };
+    }
+
+    public setResult(key: `${string}-${string}`, res: any) {
+        const nextResults = this.state.results;
+        nextResults[key] = res;
+        this.setState({ results: { ...nextResults } });
+    }
+
+    public clearResult(key: string) {
+        const nextResults = this.state.results;
+        Reflect.deleteProperty(nextResults, key);
+        this.setState({ results: { ...nextResults } });
+    }
+
+    public appendLogs(key: string, log: string) {
+        const nextLogs = this.state.logs;
+        nextLogs[key] = nextLogs[key] || '';
+        nextLogs[key] += `${log}\n`;
+        this.setState({
+            logs: { ...nextLogs },
+        });
+    }
+
+    public clearLogs(key: string) {
+        const nextLogs = this.state.logs;
+        nextLogs[key] = '';
+        this.setState({
+            logs: { ...nextLogs },
+        });
+    }
+}
+
+export default new ResultService();

+ 120 - 0
src/styles/common.scss

@@ -0,0 +1,120 @@
+/* Some styles used for multiply components */
+.split-text {
+	float: left;
+	padding: 0 5px;
+}
+
+.task_offline_message {
+	margin-bottom: 10px;
+	padding: 10px;
+	color: #666;
+	font-size: 12px;
+	background-color: #eef6fe;
+}
+
+.no-padding-modal {
+	.ant-modal-body {
+		padding: 0;
+		font-size: 12px;
+		line-height: 1.5;
+	}
+}
+
+.ope-statistics {
+	display: flex;
+	flex: none;
+	flex-wrap: nowrap;
+	overflow-x: scroll;
+	font-weight: bold;
+
+	span {
+		height: 32px;
+		margin: 0 8px;
+		font-size: 12px;
+		line-height: 23px;
+		white-space: nowrap;
+	}
+}
+
+.status_overview_basic_block {
+	display: inline-block;
+	padding: 4px 20px;
+	font-weight: 400;
+	border-radius: 30px;
+}
+
+.status_overview_fail_font {
+	@extend .status_overview_basic_block;
+
+	color: #ef5350;
+	background: #ffe9e9;
+}
+
+.status_overview_running_font {
+	@extend .status_overview_basic_block;
+
+	color: #2491f7;
+	background: #def;
+}
+
+.status_overview_grey_font {
+	@extend .status_overview_basic_block;
+
+	color: #94a8c6;
+	background: #e6e9f2;
+}
+
+.status_overview_yellow_font {
+	@extend .status_overview_basic_block;
+
+	color: #f5a623;
+	background: #f9f3de;
+}
+
+.status_overview_finished_font {
+	@extend .status_overview_basic_block;
+
+	color: #00a755;
+	background: #cdf7e2;
+}
+
+.status_overview_count_font {
+	@extend .status_overview_basic_block;
+
+	color: #333;
+	background: #f2f2f2;
+}
+
+.dt-refresh.ant-btn {
+	width: 32px;
+	height: 32px;
+	padding: 0;
+	color: var(--problemsInfoIcon-foreground);
+	line-height: 32px;
+	background: var(--editor-background);
+	border: none;
+	border-radius: 0;
+	box-shadow: 0 2px 6px 0 var(--minimapSlider-hoverBackground);
+}
+
+.modal-body-nopadding {
+	.ant-modal-body {
+		padding: 0;
+	}
+}
+
+// 全链路图
+.modal-body--height100 {
+	.ant-modal-content {
+		height: 100%;
+		.ant-modal-body {
+			height: 528px;
+		}
+	}
+}
+
+.ellipsis{
+	overflow: hidden;
+    text-overflow: ellipsis;
+	white-space: nowrap;
+}

+ 46 - 0
src/styles/molecule.scss

@@ -0,0 +1,46 @@
+@import './variables.scss';
+
+.mo-menuBar--horizontal {
+	height: $menuBar-size;
+	background: var(--activityBar-background);
+
+	> .mo-menu {
+		height: $menuBar-size;
+		color: var(--activityBar-inactiveForeground);
+		background: inherit;
+	}
+}
+
+// only the tabs in editor should have hover styles
+.mo-editor__group {
+	.mo-tab__item:hover {
+		background-color: var(--tab-hoverBackground);
+	}
+}
+
+.mo-tab__item__status,
+.mo-tab__item__op {
+	color: inherit;
+
+	&:hover {
+		color: inherit;
+	}
+}
+
+.mo-editor__group-breadcrumb {
+	color: var(--breadcrumb-foreground);
+
+	.mo-breadcrumb__item:hover {
+		color: var(--breadcrumb-focusForeground);
+		opacity: 1;
+	}
+}
+
+.mo-notification__item:focus {
+	background: var(--list-hoverBackground);
+	outline: 1px solid var(--list-focusOutline);
+}
+
+.mo-statusBar__item > a:empty {
+	padding: 0;
+}

+ 143 - 0
src/styles/reset.scss

@@ -0,0 +1,143 @@
+/* Reset some ant design styles */
+@import './variables.scss';
+
+[data-prefers-color='dark'] {
+	.ant-tooltip-inner,
+	.ant-dropdown-menu,
+	.ant-table-filter-dropdown-btns,
+	.ant-table-filter-dropdown,
+	.ant-select-dropdown {
+		color: var(--menu-foreground);
+		background: var(--menu-background);
+	}
+
+	.ant-tooltip-arrow-content {
+		--antd-arrow-background-color: var(--menu-background);
+	}
+
+	.ant-drawer-header,
+	.ant-drawer-body,
+	.ant-modal-header,
+	.ant-modal-body,
+	.ant-modal-footer,
+	.ant-modal-content,
+	.ant-table-footer,
+	.ant-table-container,
+	.ant-drawer .ant-table tbody > tr > td.ant-table-cell-fix-left,
+	.ant-drawer .ant-table tbody > tr > td.ant-table-cell-fix-right,
+	.ant-table-cell-fix-right,
+	.ant-table-cell-fix-left,
+	.ant-drawer .ant-table,
+	.ant-modal .ant-table,
+	.ant-card,
+	.ant-pro-card-body,
+	.ant-table-filter-trigger:hover,
+	.ant-popover-inner,
+	.ant-popover-arrow-content::before,
+	.ant-message-notice-content {
+		background: var(--editorGroupHeader-tabsBackground);
+	}
+
+	.ant-drawer .ant-table thead > tr > th,
+	.ant-table-thead > tr > th,
+	.ant-table-small .ant-table-thead > tr > th,
+	.ant-modal .ant-table.ant-table-small thead > tr > th,
+	.ant-drawer .ant-table tbody > tr.ant-table-row:hover > td,
+	.ant-modal .ant-table tbody > tr.ant-table-row:hover > td,
+	.ant-table-tbody > tr.ant-table-placeholder:hover > td,
+	.ant-table-tbody > tr.ant-table-row:hover > td,
+	.ant-table-tbody > tr > td.ant-table-cell-row-hover,
+	.ant-table-tbody > tr.ant-table-row-selected > td,
+	.ant-drawer .ant-table tbody > tr.ant-table-row-selected > td.ant-table-cell-fix-left,
+	.ant-drawer .ant-table tbody > tr.ant-table-row-selected > td.ant-table-cell-fix-right,
+	.ant-descriptions-bordered .ant-descriptions-item-label {
+		background: var(--editor-background);
+	}
+
+	.ant-notification-notice {
+		background: var(--notifications-background);
+	}
+}
+
+[data-prefers-color] {
+	.ant-form-item-label > label,
+	.ant-form label,
+	.ant-select,
+	.ant-input,
+	.ant-input-affix-wrapper,
+	.ant-input-group-addon,
+	.ant-input-number,
+	.ant-select-item,
+	.ant-empty,
+	.ant-form-item,
+	.ant-picker-dropdown,
+	.ant-btn,
+	.ant-picker-input > input,
+	.ant-table,
+	.ant-checkbox-wrapper,
+	.ant-tooltip,
+	.ant-table-cell,
+	.ant-descriptions-item-label,
+	.ant-descriptions-item-content,
+	.ant-radio-button-wrapper,
+	.ant-dropdown-menu-item,
+	.ant-dropdown-menu-submenu-title,
+	.ant-form-item-explain,
+	.ant-form-item-extra,
+	.ant-modal-confirm-body .ant-modal-confirm-content,
+	.ant-picker,
+	.ant-input-number-group-addon,
+	.ant-collapse,
+	.ant-form,
+	.ant-select-dropdown,
+	.ant-tabs-tab,
+	.ant-badge-status-text {
+		font-size: $font-size;
+	}
+
+	.ant-input {
+		line-height: calc(14 / 12 * 1.5715);
+	}
+
+	.ant-breadcrumb a,
+	.ant-breadcrumb > span:last-child {
+		color: var(--breadcrumb-foreground);
+
+		&:hover {
+			color: var(--breadcrumb-focusForeground);
+		}
+	}
+}
+
+.ant-tooltip-inner {
+	max-width: 300px;
+}
+
+.ant-collapse.ant-collapse-borderless {
+	background: transparent;
+}
+
+// reset the transition property for antd components in force
+// for ant compoents should hidden immediately when visibility changed
+.mo-sidebar__pane *[class^='ant-'] {
+	transition: none !important;
+}
+
+// reset the hover color of A tag inside statusBar, which is polluted by Antd global style css
+.mo-statusBar a:hover {
+	color: inherit;
+}
+
+.mo-workbench {
+	.ant-tree-show-line .ant-tree-indent-unit::before {
+		border-right-color: var(--tree-indentGuidesStroke);
+	}
+
+	.ant-tree-switcher-leaf-line::before {
+		border-right-color: var(--tree-indentGuidesStroke);
+	}
+
+	.ant-tree-switcher-leaf-line::after {
+		border-bottom-color: var(--tree-indentGuidesStroke);
+	}
+}

+ 7 - 0
src/styles/theme.scss

@@ -0,0 +1,7 @@
+.codicon-sync::before {
+	color: #cbcb41;
+}
+
+.codicon-code::before {
+	color: #53beda;
+}

+ 6 - 0
src/styles/variables.scss

@@ -0,0 +1,6 @@
+$menuBar-size: 32px;
+$statusBar-size: 22px;
+$font-size: 12px;
+$base-font-color: var(--foreground);
+// 主要背景色
+$main-color: #3f87ff;

+ 7 - 0
src/typings/index.d.ts

@@ -0,0 +1,7 @@
+type DataSourceType = {
+    id: string;
+    name: string;
+    type: string;
+    jdbcUrl: string;
+    updateTime: string;
+}

+ 200 - 0
src/utils/index.ts

@@ -0,0 +1,200 @@
+import Api from "@/api";
+import {store} from "@/redux/store";
+import {loadQuestion, loadUser} from "@/redux/action/action";
+import {history} from "@@/core/history";
+import notification from "@/components/notification";
+import {IActivityMenuItemProps, IFolderTreeNodeProps} from "@dtinsight/molecule/esm/model";
+import molecule from "@dtinsight/molecule";
+import {jumpToLogin} from "@/services/auth";
+import ex from "umi/dist";
+import {message} from "antd";
+
+export function setCookie(name: string, value: string) {
+    const expires = new Date();
+    expires.setTime(expires.getTime() + 24 * 60 * 60 * 1000);
+    document.cookie = name + "=" + escape(value) + ";expires=" + expires.toUTCString();
+}
+
+export function getCookie(name: string) {
+    const arr = document.cookie.match(new RegExp(`(^| )${name}=([^;]*)(;|$)`));
+    if (arr != null) {
+        return unescape(decodeURI(arr[2]));
+    }
+    return null;
+}
+
+export function deleteCookie(name: string, domain?: string, path: string = '/') {
+    const d = new Date(0);
+    const cookieDomain = domain ? `; domain=${domain}` : '';
+    document.cookie = `${name}=; expires=${d.toUTCString()}${cookieDomain}; path=${path}`;
+}
+
+export function updateAccountContext(contextMenu: IActivityMenuItemProps[]) {
+    const nextData = molecule.activityBar.getState().data || [];
+    const {ACTIVITY_BAR_GLOBAL_ACCOUNT} = molecule.builtin.getConstants();
+    const target = nextData.find((item) => item.id === ACTIVITY_BAR_GLOBAL_ACCOUNT);
+    if (target) {
+        target.contextMenu = contextMenu;
+    }
+    molecule.activityBar.setState({data: nextData});
+}
+
+export function goToLogin() {
+    if (!store.getState().loadUser.username) {
+        Api.current().then(response => {
+            if (response.err === 0) {
+                store.dispatch(loadUser(response.res))
+                history.push('/')
+                const userName = store.getState().loadUser.username
+                updateAccountContext([
+                    {
+                        id: 'username',
+                        disabled: !!userName,
+                        icon: 'person',
+                        name: userName,
+                    },
+                    {
+                        id: 'divider',
+                        type: 'divider',
+                    },
+                    {
+                        id: 'logout',
+                        icon: 'log-out',
+                        name: '登出',
+                        onClick: () => {
+                            store.dispatch(loadUser({}))
+                            deleteCookie('token')
+                            window.location.reload();
+                        }
+                    }])
+            }
+            return response;
+        }).then(response => {
+            if (response.err) {
+                notification.error({key: 'loginError', message: response.msg})
+            }
+        }).catch(reason => {
+                console.log(reason)
+                notification.error({key: 'loginError', message: reason})
+            }
+        )
+    }
+}
+
+const extToLang: { [prop: string]: string } = {
+    'html': 'html',
+    'js': 'javascript',
+    'ts': 'typescript',
+    'java': 'java',
+    'py': 'python',
+    'cpp': 'cpp',
+    'json': 'json',
+    'xml': 'xml',
+}
+let id = 1
+function generateFileNodes(
+    nodes: IFolderTreeNodeProps[],
+    pathList: string[],
+    filename: string,
+    readOnly: boolean,
+    files: {
+        [key: string]: string
+    },
+): IFolderTreeNodeProps[] {
+    if (pathList.length === 0) {
+        return nodes
+    }
+    const sameNode = nodes.find((node) => node.name === pathList[0])
+    if (pathList.length === 1 && sameNode) {
+        return nodes
+    } else if (pathList.length === 1 && !sameNode) {
+        const frag = filename!.split('.');
+        const lang = extToLang[frag[frag.length - 1]] || 'file'
+        return [...nodes, {
+            id: id++,
+            name: pathList[0],
+            location: filename,
+            fileType: "File",
+            readOnly: readOnly,
+            isLeaf: true,
+            data: {
+                language: lang,
+                value: files[filename]
+            },
+            icon: readOnly ? 'file' : 'file-code'
+        }]
+    } else if (sameNode) {
+        sameNode.children = generateFileNodes(
+            sameNode.children ?? [],
+            pathList.slice(1),
+            filename,
+            readOnly,
+            files,
+        )
+        return nodes
+    } else {
+        return [
+            ...nodes,
+            {
+                id: id++,
+                icon: 'folder',
+                name: pathList[0],
+                fileType: "Folder",
+                isLeaf: false,
+                children: generateFileNodes([], pathList.slice(1), filename, readOnly, files)
+            }
+        ]
+    }
+}
+export function getQuestion(examId: string, questionId: string) {
+    const hide = message.loading("Loading...", 0)
+    const regPos = /^[0-9]+/;
+    if (regPos.test(examId) && regPos.test(questionId)) {
+        Api.getQuestion(examId as unknown as number, questionId as unknown as number).then(
+            response => {
+                hide()
+                if (response.err === 0) {
+                    store.dispatch(loadQuestion(response.res))
+                    const question = response.res.codeList[0]
+                    const editableFiles = [...Object.keys(question.editable)]
+                    const editable = editableFiles.reduce<IFolderTreeNodeProps[]>((nodes, filename) => {
+                        const filePathList = filename
+                            .split('/')
+                            .filter((name) => name.length > 0)
+                        return generateFileNodes(nodes, filePathList, filename, false, question.editable)
+                    }, [])
+                    const unEditableFiles = [...Object.keys(question.uneditable)]
+                    const unEditable = unEditableFiles.reduce<IFolderTreeNodeProps[]>((nodes, filename) => {
+                        const filePathList = filename
+                            .split('/')
+                            .filter((name) => name.length > 0)
+                        return generateFileNodes(nodes, filePathList, filename, true, question.uneditable)
+                    }, [])
+                    const files: IFolderTreeNodeProps = {
+                        id: 0,
+                        readOnly: false,
+                        name: question.projectName,
+                        fileType: "RootFolder",
+                        location: question.projectName,
+                        isLeaf: false,
+                        data: "",
+                        children: [...editable, ...unEditable]
+                    }
+                    molecule.folderTree.add(files)
+                    message.success('Loading is Complete')
+                }
+                return response;
+            }).then(response => {
+                if (response.err) {
+                    notification.error({key: 'QuestionError', message: response.msg})
+                }
+            }
+        ).catch(reason => {
+                console.log(reason)
+                notification.error({key: 'QuestionError', message: reason})
+            }
+        )
+    } else {
+        notification.error({key: 'ParamError', message: "Parameter Error"})
+    }
+}

+ 24 - 0
tailwind.config.js

@@ -0,0 +1,24 @@
+module.exports = {
+    // mode: 'jit',
+    // jit document: https://tailwindcss.com/docs/just-in-time-mode
+    purge: ['./src/**/*.html', './src/**/*.tsx', './src/**/*.ts'],
+    darkMode: false, // or 'media' or 'class'
+    theme: {
+        extend: {
+            spacing: {
+                '5px': '5px',
+                '10px': '10px',
+                '20px': '20px',
+            },
+            colors: {
+                ccc: '#ccc',
+                ddd: '#ddd',
+            },
+        },
+    },
+    variants: {
+        extend: {},
+    },
+    plugins: [],
+};
+

+ 25 - 0
tsconfig.json

@@ -0,0 +1,25 @@
+{
+  "compilerOptions": {
+    "target": "esnext",
+    "module": "esnext",
+    "moduleResolution": "node",
+    "resolveJsonModule": true,
+    "importHelpers": true,
+    "jsx": "react-jsx",
+    "esModuleInterop": true,
+    "sourceMap": true,
+    "baseUrl": "./",
+    "strict": true,
+    "paths": {
+      "@/*": ["src/*"],
+      "@@/*": ["src/.umi/*"]
+    },
+    "typeRoots": ["node_modules/@types", "node_modules/@typed-mxgraph"],
+    "experimentalDecorators": true,
+    "emitDecoratorMetadata": true,
+    "allowSyntheticDefaultImports": true
+  },
+  "include": [
+    "src"
+  ]
+}

Some files were not shown because too many files changed in this diff