diff options
| author | Tara Rostami <132676256+TaraRostami@users.noreply.github.com> | 2024-02-28 14:05:01 +0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-02-28 14:05:01 +0300 |
| commit | 836ee29b786fd3ab3958f0984e5b02e6a89976cf (patch) | |
| tree | 1836b33075cfb63ec29b0c6568e95dfb9149e204 /web/html | |
| parent | 806b57f9597d57c786c26472aa948fdee81ea7fa (diff) | |
Optimize Dark Theme & Ultra Dark (#1889)
---------
Co-authored-by: MHSanaei <ho3ein.sanaei@gmail.com>
Co-authored-by: Alireza Ahmadi <alireza7@gmail.com>
Diffstat (limited to 'web/html')
| -rw-r--r-- | web/html/login.html | 203 | ||||
| -rw-r--r-- | web/html/xui/common_sider.html | 20 | ||||
| -rw-r--r-- | web/html/xui/component/themeSwitch.html | 30 | ||||
| -rw-r--r-- | web/html/xui/index.html | 22 | ||||
| -rw-r--r-- | web/html/xui/xray.html | 6 |
5 files changed, 152 insertions, 129 deletions
diff --git a/web/html/login.html b/web/html/login.html index fc38166b..7655c66f 100644 --- a/web/html/login.html +++ b/web/html/login.html @@ -49,6 +49,9 @@ border-radius: 2rem; padding: 3rem; transition: all 0.3s; + user-select:none; + -webkit-user-select:none; + -moz-user-select: none; } #login:hover { box-shadow: 0 2px 8px rgba(0, 0, 0, 0.09); @@ -68,10 +71,10 @@ z-index: 0; } .dark .under { - background-color: #0f2d32; + background-color: var(--dark-color-login-wave); } .dark #login { - background-color: #101113; + background-color: var(--dark-color-surface-100); } .dark h1 { color: rgba(255, 255, 255); @@ -199,7 +202,7 @@ z-index: -1; } .dark .waves-header { - background-color: #0a2227; + background-color: var(--dark-color-login-background); } .waves-inner-header { height: 50vh; @@ -219,7 +222,7 @@ animation: move-forever 25s cubic-bezier(0.55, 0.5, 0.45, 0.5) infinite; } .dark .parallax > use { - fill: #0f2d32; + fill: var(--dark-color-login-wave); } .parallax > use:nth-child(1) { animation-delay: -2s; @@ -373,98 +376,106 @@ } </style> <body> -<a-layout id="app" v-cloak :class="themeSwitcher.currentTheme"> - <transition name="list" appear> - <a-layout-content class="under" style="min-height: 0;"> - <div class="waves-header"> - <div class="waves-inner-header"></div> - <svg class="waves" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" - viewBox="0 24 150 28" preserveAspectRatio="none" shape-rendering="auto"> - <defs> - <path id="gentle-wave" d="M-160 44c30 0 58-18 88-18s 58 18 88 18 58-18 88-18 58 18 88 18 v44h-352z" /> - </defs> - <g class="parallax"> - <use xlink:href="#gentle-wave" x="48" y="0" fill="rgba(0, 135, 113, 0.08)" /> - <use xlink:href="#gentle-wave" x="48" y="3" fill="rgba(0, 135, 113, 0.08)" /> - <use xlink:href="#gentle-wave" x="48" y="5" fill="rgba(0, 135, 113, 0.08)" /> - <use xlink:href="#gentle-wave" x="48" y="7" fill="#c7ebe2" /> - </g> - </svg> - </div> - <a-row type="flex" justify="center" align="middle" style="height: 100%; overflow: auto;"> - <a-col :xs="22" :sm="20" :md="14" :lg="10" :xl="8" :xxl="6" id="login" style="margin: 3rem 0;"> - <a-row type="flex" justify="center"> - <a-col style="width: 100%;"> - <h1 class="title headline zoom"> - <span class="words-wrapper"> - <b class="is-visible">{{ i18n "pages.login.title" }}</b> - <b>Hello!</b> - </span> - </h1> - </a-col> - </a-row> - <a-row type="flex" justify="center"> - <a-col span="24"> - <a-form> - <a-form-item> - <a-input v-model.trim="user.username" placeholder='{{ i18n "username" }}' - @keydown.enter.native="login" autofocus> - <a-icon slot="prefix" type="user" style="font-size: 16px;" /> - </a-input> - </a-form-item> - <a-form-item> - <password-input icon="lock" v-model.trim="user.password" placeholder='{{ i18n "password" }}' - @keydown.enter.native="login"> - </password-input> - </a-form-item> - <a-form-item v-if="secretEnable"> - <password-input icon="key" v-model.trim="user.loginSecret" placeholder='{{ i18n "secretToken" }}' - @keydown.enter.native="login"> - </password-input> - </a-input> - </a-form-item> - <a-form-item> - <a-row justify="center" class="centered"> - <div class="wave-btn-bg wave-btn-bg-cl" - :style="loading ? { width: '52px' } : { display: 'inline-block' }"> - <a-button class="ant-btn-primary-login" type="primary" :loading="loading" @click="login" - :icon="loading ? 'poweroff' : undefined"> - [[ loading ? '' : '{{ i18n "login" }}' ]] - </a-button> - </div> - </a-row> - </a-form-item> - <a-form-item> - <a-row justify="center" class="centered"> - <a-col :span="24"> - <a-select ref="selectLang" v-model="lang" @change="setLang(lang)" style="width: 150px;" - :dropdown-class-name="themeSwitcher.currentTheme"> - <a-select-option :value="l.value" label="English" v-for="l in supportLangs"> - <span role="img" aria-label="l.name" v-text="l.icon"></span> - <span v-text="l.name"></span> - </a-select-option> - </a-select> - </a-col> - </a-row> - </a-form-item> - <a-form-item> - <a-row justify="center" class="centered"> - <a-col> - <a-icon type="bulb" :theme="themeSwitcher.isDarkTheme ? 'filled' : 'outlined'"></a-icon> - </a-col> - <a-col> - <theme-switch /> - </a-col> - </a-row> - </a-form-item> - </a-form> - </a-col> - </a-row> - </a-col> - </a-row> - </a-layout-content> - </transition> -</a-layout> + <a-layout id="app" v-cloak :class="themeSwitcher.currentTheme"> + <transition name="list" appear> + <a-layout-content class="under" style="min-height: 0;"> + <div class="waves-header"> + <div class="waves-inner-header"></div> + <svg class="waves" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" + viewBox="0 24 150 28" preserveAspectRatio="none" shape-rendering="auto"> + <defs> + <path id="gentle-wave" d="M-160 44c30 0 58-18 88-18s 58 18 88 18 58-18 88-18 58 18 88 18 v44h-352z" /> + </defs> + <g class="parallax"> + <use xlink:href="#gentle-wave" x="48" y="0" fill="rgba(0, 135, 113, 0.08)" /> + <use xlink:href="#gentle-wave" x="48" y="3" fill="rgba(0, 135, 113, 0.08)" /> + <use xlink:href="#gentle-wave" x="48" y="5" fill="rgba(0, 135, 113, 0.08)" /> + <use xlink:href="#gentle-wave" x="48" y="7" fill="#c7ebe2" /> + </g> + </svg> + </div> + <a-row type="flex" justify="center" align="middle" style="height: 100%; overflow: auto;"> + <a-col :xs="22" :sm="20" :md="14" :lg="10" :xl="8" :xxl="6" id="login" style="margin: 3rem 0;"> + <a-row type="flex" justify="center"> + <a-col style="width: 100%;"> + <h1 class="title headline zoom"> + <span class="words-wrapper"> + <b class="is-visible">{{ i18n "pages.login.hello" }}</b> + <b>{{ i18n "pages.login.title" }}</b> + </span> + </h1> + </a-col> + </a-row> + <a-row type="flex" justify="center"> + <a-col span="24"> + <a-form> + <a-form-item> + <a-input v-model.trim="user.username" placeholder='{{ i18n "username" }}' + @keydown.enter.native="login" autofocus> + <a-icon slot="prefix" type="user" style="font-size: 16px;"></a-icon> + </a-input> + </a-form-item> + <a-form-item> + <password-input icon="lock" v-model.trim="user.password" + placeholder='{{ i18n "password" }}' + @keydown.enter.native="login"> + </password-input> + </a-form-item> + <a-form-item v-if="secretEnable"> + <password-input icon="key" v-model.trim="user.loginSecret" + placeholder='{{ i18n "secretToken" }}' + @keydown.enter.native="login"> + </password-input> + </a-form-item> + <a-form-item> + <a-row justify="center" class="centered"> + <div style="height: 50px;" class="wave-btn-bg wave-btn-bg-cl" + :style="loading ? { width: '52px' } : { display: 'inline-block' }"> + <a-button class="ant-btn-primary-login" type="primary" + :loading="loading" @click="login" + :icon="loading ? 'poweroff' : undefined"> + [[ loading ? '' : '{{ i18n "login" }}' ]] + </a-button> + </div> + </a-row> + </a-form-item> + <a-form-item> + <a-row justify="center" class="centered"> + <a-col :span="24"> + <a-select ref="selectLang" v-model="lang" + @change="setLang(lang)" style="width: 150px;" + :dropdown-class-name="themeSwitcher.currentTheme"> + <a-select-option :value="l.value" label="English" v-for="l in supportLangs"> + <span role="img" aria-label="l.name" v-text="l.icon"></span> + <span v-text="l.name"></span> + </a-select-option> + </a-select> + </a-col> + </a-row> + </a-form-item> + <a-form-item> + <a-row justify="center" class="centered"> + <a-col> + <a-icon type="bulb" :theme="themeSwitcher.isDarkTheme ? 'filled' : 'outlined'"></a-icon> + </a-col> + <a-col> + <theme-switch></theme-switch> + <a-checkbox v-if="themeSwitcher.isDarkTheme" style="padding-left: 1rem; vertical-align: middle;" + :checked="themeSwitcher.isUltra" + @click="themeSwitcher.toggleUltra()"> + Ultra + </a-checkbox> + </a-col> + </a-row> + </a-form-item> + </a-form> + </a-col> + </a-row> + </a-col> + </a-row> + </a-layout-content> + </transition> + </a-layout> {{template "js" .}} {{template "component/themeSwitcher" .}} {{template "component/password" .}} diff --git a/web/html/xui/common_sider.html b/web/html/xui/common_sider.html index 13d5bd49..78b833b9 100644 --- a/web/html/xui/common_sider.html +++ b/web/html/xui/common_sider.html @@ -15,10 +15,6 @@ <a-icon type="tool"></a-icon> <span><b>{{ i18n "menu.xray"}}</b></span> </a-menu-item> -<!--<a-menu-item key="{{ .base_path }}panel/clients">--> -<!-- <a-icon type="laptop"></a-icon>--> -<!-- <span>Client</span>--> -<!--</a-menu-item>--> <a-menu-item key="{{ .base_path }}logout"> <a-icon type="logout"></a-icon> <span><b>{{ i18n "menu.logout"}}</b></span> @@ -31,7 +27,13 @@ <a-menu :theme="themeSwitcher.currentTheme" mode="inline" selected-keys=""> <a-menu-item mode="inline"> <a-icon type="bulb" :theme="themeSwitcher.isDarkTheme ? 'filled' : 'outlined'"></a-icon> - <theme-switch /> + <theme-switch> + </theme-switch> + <a-checkbox v-if="themeSwitcher.isDarkTheme" style="padding-left: 1rem; vertical-align: middle;" + :checked="themeSwitcher.isUltra" + @click="themeSwitcher.toggleUltra()"> + Ultra + </a-checkbox> </a-menu-item> </a-menu> <a-menu :theme="themeSwitcher.currentTheme" mode="inline" :selected-keys="['{{ .request_uri }}']" @@ -50,7 +52,13 @@ <a-menu :theme="themeSwitcher.currentTheme" mode="inline" selected-keys=""> <a-menu-item mode="inline"> <a-icon type="bulb" :theme="themeSwitcher.isDarkTheme ? 'filled' : 'outlined'"></a-icon> - <theme-switch /> + <theme-switch> + </theme-switch> + <a-checkbox v-if="themeSwitcher.isDarkTheme" style="padding-left: 1rem; vertical-align: middle;" + :checked="themeSwitcher.isUltra" + @click="themeSwitcher.toggleUltra()"> + Ultra + </a-checkbox> </a-menu-item> </a-menu> <a-menu :theme="themeSwitcher.currentTheme" mode="inline" :selected-keys="['{{ .request_uri }}']" diff --git a/web/html/xui/component/themeSwitch.html b/web/html/xui/component/themeSwitch.html index 9ca080d9..2301da94 100644 --- a/web/html/xui/component/themeSwitch.html +++ b/web/html/xui/component/themeSwitch.html @@ -10,32 +10,48 @@ <script> function createThemeSwitcher() { const isDarkTheme = localStorage.getItem('dark-mode') === 'true'; + const isUltra = localStorage.getItem('isUltraDarkThemeEnabled') === 'true'; + if (isUltra) { + document.documentElement.setAttribute('data-theme', 'ultra-dark'); + } const theme = isDarkTheme ? 'dark' : 'light'; - document.querySelector('body').setAttribute('class', theme) + document.querySelector('body').setAttribute('class', theme); return { isDarkTheme, + isUltra, get currentTheme() { return this.isDarkTheme ? 'dark' : 'light'; }, toggleTheme() { this.isDarkTheme = !this.isDarkTheme; localStorage.setItem('dark-mode', this.isDarkTheme); - document.querySelector('body').setAttribute('class', this.isDarkTheme ? 'dark' : 'light') + document.querySelector('body').setAttribute('class', this.isDarkTheme ? 'dark' : 'light'); document.getElementById('message').className = themeSwitcher.currentTheme; }, + toggleUltra() { + this.isUltra = !this.isUltra; + if (this.isUltra) { + document.documentElement.setAttribute('data-theme', 'ultra-dark'); + } else { + document.documentElement.removeAttribute('data-theme'); + } + localStorage.setItem('isUltraDarkThemeEnabled', this.isUltra.toString()); + } }; } - const themeSwitcher = createThemeSwitcher(); - Vue.component('theme-switch', { props: [], template: `{{template "component/themeSwitchTemplate"}}`, - data: () => ({ themeSwitcher }), + data: () => ({ + themeSwitcher + }), mounted() { - this.$message.config({getContainer: () => document.getElementById('message')}); + this.$message.config({ + getContainer: () => document.getElementById('message') + }); document.getElementById('message').className = themeSwitcher.currentTheme; } }); </script> -{{end}}
\ No newline at end of file +{{end}} diff --git a/web/html/xui/index.html b/web/html/xui/index.html index 90c45b85..fe867214 100644 --- a/web/html/xui/index.html +++ b/web/html/xui/index.html @@ -10,23 +10,11 @@ margin-inline: 0.3rem; } } - .ant-col-sm-24 { margin-top: 10px; } - .ant-card-dark h2 { - color: hsla(0, 0%, 100%, .65); - } - - .dark .ant-card-hoverable:hover, - .dark .ant-space-item > .ant-tabs:hover { - transform: scale(0.987); - outline-color: #40434d; - } - - .dark .ant-card-bordered { - outline: 2px solid var(--dark-color-background); + color: var(--dark-color-text-primary); } </style> @@ -104,8 +92,8 @@ <a-col :sm="24" :lg="12"> <a-card hoverable> <b>{{ i18n "pages.index.operationHours" }}:</b> - <a-tag color="green">Xray [[ formatSecond(status.appStats.uptime) ]]</a-tag> - <a-tag color="green">OS [[ formatSecond(status.uptime) ]]</a-tag> + <a-tag :color="status.xray.color">Xray: [[ formatSecond(status.appStats.uptime) ]]</a-tag> + <a-tag color="green">OS: [[ formatSecond(status.uptime) ]]</a-tag> </a-card> </a-col> <a-col :sm="24" :lg="12"> @@ -153,10 +141,10 @@ <a-card hoverable> <b>{{ i18n "usage"}}:</b> <a-tag color="green"> - RAM [[ sizeFormat(status.appStats.mem) ]] + RAM: [[ sizeFormat(status.appStats.mem) ]] </a-tag> <a-tag color="green"> - Threads [[ status.appStats.threads ]] + Threads: [[ status.appStats.threads ]] </a-tag> </a-card> </a-col> diff --git a/web/html/xui/xray.html b/web/html/xui/xray.html index 5afa77c8..35f5cad7 100644 --- a/web/html/xui/xray.html +++ b/web/html/xui/xray.html @@ -74,8 +74,8 @@ </transition> <a-space direction="vertical"> <a-card hoverable style="margin-bottom: .5rem;"> - <a-row> - <a-col :xs="24" :sm="8" style="padding: 4px;"> + <a-row style="display: flex; flex-wrap: wrap; align-items: center;"> + <a-col :xs="24" :sm="10" style="padding: 4px;"> <a-space direction="horizontal"> <a-button type="primary" :disabled="saveBtnDisable" @click="updateXraySetting">{{ i18n "pages.xray.save" }}</a-button> <a-button type="danger" :disabled="!saveBtnDisable" @click="restartXray">{{ i18n "pages.xray.restart" }}</a-button> @@ -89,7 +89,7 @@ </a-popover> </a-space> </a-col> - <a-col :xs="24" :sm="16"> + <a-col :xs="24" :sm="14"> <template> <div> <a-back-top :target="() => document.getElementById('content-layout')" visibility-height="200"> |
