Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/MHSanaei/3x-ui.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/web/html
diff options
context:
space:
mode:
Diffstat (limited to 'web/html')
-rw-r--r--web/html/inbounds.html144
-rw-r--r--web/html/index.html137
-rw-r--r--web/html/login.html469
-rw-r--r--web/html/settings.html61
-rw-r--r--web/html/xray.html37
5 files changed, 46 insertions, 802 deletions
diff --git a/web/html/inbounds.html b/web/html/inbounds.html
index 58a4e5a5..54535e46 100644
--- a/web/html/inbounds.html
+++ b/web/html/inbounds.html
@@ -1,150 +1,8 @@
{{ template "page/head_start" .}}
-<style>
- .ant-table:not(.ant-table-expanded-row .ant-table) {
- outline: 1px solid #f0f0f0;
- outline-offset: -1px;
- border-radius: 1rem;
- overflow-x: hidden;
- }
- .dark .ant-table:not(.ant-table-expanded-row .ant-table) {
- outline-color: var(--dark-color-table-ring);
- }
- .ant-table .ant-table-content .ant-table-scroll .ant-table-body {
- overflow-y: hidden;
- }
- .ant-table .ant-table-content .ant-table-tbody tr:last-child .ant-table-wrapper {
- margin:-10px 22px !important;
- }
- .ant-table .ant-table-content .ant-table-tbody tr:last-child .ant-table-wrapper .ant-table {
- border-bottom-left-radius: 1rem;
- border-bottom-right-radius: 1rem;
- }
- .ant-table .ant-table-content .ant-table-tbody tr:last-child tr:last-child td {
- border-bottom-color: transparent;
- }
- .ant-table .ant-table-tbody tr:last-child.ant-table-expanded-row .ant-table-wrapper .ant-table-tbody>tr:last-child>td:first-child {
- border-bottom-left-radius: 6px;
- }
- .ant-table .ant-table-tbody tr:last-child.ant-table-expanded-row .ant-table-wrapper .ant-table-tbody>tr:last-child>td:last-child {
- border-bottom-right-radius: 6px;
- }
- @media (min-width: 769px) {
- .ant-layout-content {
- margin: 24px 16px;
- }
- }
- @media (max-width: 768px) {
- .ant-card-body {
- padding: .5rem;
- }
- .ant-table .ant-table-content .ant-table-tbody tr:last-child .ant-table-wrapper {
- margin:-10px 2px !important;
- }
- }
- .dark .ant-switch-small:not(.ant-switch-checked) {
- background-color: var(--dark-color-surface-100) !important;
- }
- .ant-custom-popover-title {
- display: flex;
- align-items: center;
- gap: 10px;
- margin: 5px 0;
- }
- .ant-col-sm-24 {
- margin: 0.5rem -2rem 0.5rem 2rem;
- }
- tr.hideExpandIcon .ant-table-row-expand-icon {
- display: none;
- }
- .infinite-tag {
- padding: 0 5px;
- border-radius: 2rem;
- min-width: 50px;
- min-height: 22px;
- }
- .infinite-bar .ant-progress-inner .ant-progress-bg {
- background-color: #F2EAF1;
- border: #D5BED2 solid 1px;
- }
- .dark .infinite-bar .ant-progress-inner .ant-progress-bg {
- background-color: #7a316f !important;
- border: #7a316f solid 1px;
- }
- .ant-collapse {
- margin: 5px 0;
- }
- .info-large-tag {
- max-width: 200px;
- overflow: hidden;
- }
- .client-comment {
- font-size: 12px;
- opacity: 0.75;
- cursor: help;
- }
- .client-email {
- font-weight: 500;
- }
- .client-popup-item {
- display: flex;
- align-items: center;
- gap: 5px;
- }
- .online-animation .ant-badge-status-dot {
- animation: onlineAnimation 1.2s linear infinite;
- }
- @keyframes onlineAnimation {
- 0%,
- 50%,
- 100% {
- transform: scale(1);
- opacity: 1;
- }
- 10% {
- transform: scale(1.5);
- opacity: .2;
- }
- }
- .tr-table-box {
- display: flex;
- gap: 4px;
- justify-content: center;
- align-items: center;
- }
- .tr-table-rt {
- flex-basis: 70px;
- min-width: 70px;
- text-align: end;
- }
- .tr-table-lt {
- flex-basis: 70px;
- min-width: 70px;
- text-align: start;
- }
- .tr-table-bar {
- flex-basis: 160px;
- min-width: 60px;
- }
- .tr-infinity-ch {
- font-size: 14pt;
- max-height: 24px;
- display: inline-flex;
- align-items: center;
- }
- .ant-table-expanded-row .ant-table .ant-table-body {
- overflow-x: hidden;
- }
- .ant-table-expanded-row .ant-table-tbody>tr>td {
- padding: 10px 2px;
- }
- .ant-table-expanded-row .ant-table-thead>tr>th {
- padding: 12px 2px;
- }
-</style>
{{ template "page/head_end" .}}
{{ template "page/body_start" .}}
-<a-layout id="app" v-cloak :class="themeSwitcher.currentTheme">
+<a-layout id="app" v-cloak :class="themeSwitcher.currentTheme + ' inbounds-page'">
<a-sidebar></a-sidebar>
<a-layout id="content-layout">
<a-layout-content>
diff --git a/web/html/index.html b/web/html/index.html
index 5d5c3b1d..6f691876 100644
--- a/web/html/index.html
+++ b/web/html/index.html
@@ -1,73 +1,4 @@
{{ template "page/head_start" .}}
-<style>
- @media (min-width: 769px) {
- .ant-layout-content {
- margin: 24px 16px;
- }
- }
- .ant-card-dark h2 {
- color: var(--dark-color-text-primary);
- }
- .ant-backup-list-item {
- gap: 10px;
- }
- .ant-version-list-item {
- --padding: 12px;
- padding: var(--padding) !important;
- gap: var(--padding);
- }
- .dark .ant-version-list-item svg{
- color: var(--dark-color-text-primary);
- }
- .dark .ant-backup-list-item svg,
- .dark .ant-badge-status-text,
- .dark .ant-card-extra {
- color: var(--dark-color-text-primary);
- }
- .dark .ant-card-actions>li {
- color: rgba(255, 255, 255, 0.55);
- }
- .dark .ant-radio-inner {
- background-color: var(--dark-color-surface-100);
- border-color: var(--dark-color-surface-600);
- }
- .dark .ant-radio-checked .ant-radio-inner {
- border-color: var(--color-primary-100);
- }
- .dark .ant-backup-list,
- .dark .ant-version-list,
- .dark .ant-card-actions,
- .dark .ant-card-actions>li:not(:last-child) {
- border-color: var(--dark-color-stroke);
- }
- .ant-card-actions {
- background: transparent;
- }
- .ip-hidden {
- -webkit-user-select: none;
- -moz-user-select: none;
- user-select: none;
- filter: blur(10px);
- }
- .running-animation .ant-badge-status-dot {
- animation: runningAnimation 1.2s linear infinite;
- }
- .running-animation .ant-badge-status-processing:after {
- border-color: var(--color-primary-100);
- }
- @keyframes runningAnimation {
- 0%,
- 50%,
- 100% {
- transform: scale(1);
- opacity: 1;
- }
- 10% {
- transform: scale(1.5);
- opacity: .2;
- }
- }
-</style>
{{ template "page/head_end" .}}
{{ template "page/body_start" .}}
@@ -77,7 +8,7 @@
<a-layout-content>
<a-spin :spinning="loadingStates.spinning" :delay="200" :tip="loadingTip">
<transition name="list" appear>
- <a-alert type="error" v-if="showAlert && loadingStates.fetched" :style="{ marginBottom: '10px' }"
+ <a-alert type="error" v-if="showAlert && loadingStates.fetched" class="mb-10"
message='{{ i18n "secAlertTitle" }}'
color="red"
description='{{ i18n "secAlertSsl" }}'
@@ -87,7 +18,7 @@
<transition name="list" appear>
<template>
<a-row v-if="!loadingStates.fetched">
- <a-card :style="{ textAlign: 'center', padding: '30px 0', marginTop: '10px', background: 'transparent', border: 'none' }">
+ <a-card class="card-placeholder text-center">
<a-spin tip='{{ i18n "loading" }}'></a-spin>
</a-card>
</a-row>
@@ -97,7 +28,7 @@
<a-row :gutter="[0, isMobile ? 16 : 0]">
<a-col :sm="24" :md="12">
<a-row>
- <a-col :span="12" :style="{ textAlign: 'center' }">
+ <a-col :span="12" class="text-center">
<a-progress type="dashboard" status="normal"
:stroke-color="status.cpu.color"
:percent="status.cpu.percent"></a-progress>
@@ -112,7 +43,7 @@
</a-tooltip>
</div>
</a-col>
- <a-col :span="12" :style="{ textAlign: 'center' }">
+ <a-col :span="12" class="text-center">
<a-progress type="dashboard" status="normal"
:stroke-color="status.mem.color"
:percent="status.mem.percent"></a-progress>
@@ -124,7 +55,7 @@
</a-col>
<a-col :sm="24" :md="12">
<a-row>
- <a-col :span="12" :style="{ textAlign: 'center' }">
+ <a-col :span="12" class="text-center">
<a-progress type="dashboard" status="normal"
:stroke-color="status.swap.color"
:percent="status.swap.percent"></a-progress>
@@ -132,7 +63,7 @@
<b>{{ i18n "pages.index.swap" }}:</b> [[ SizeFormatter.sizeFormat(status.swap.current) ]] / [[ SizeFormatter.sizeFormat(status.swap.total) ]]
</div>
</a-col>
- <a-col :span="12" :style="{ textAlign: 'center' }">
+ <a-col :span="12" class="text-center">
<a-progress type="dashboard" status="normal"
:stroke-color="status.disk.color"
:percent="status.disk.percent"></a-progress>
@@ -167,31 +98,31 @@
<span>{{ i18n "pages.index.xrayErrorPopoverTitle" }}</span>
</a-col>
<a-col>
- <a-icon type="bars" :style="{ cursor: 'pointer', float: 'right' }" @click="openLogs()"></a-icon>
+ <a-icon type="bars" class="cursor-pointer float-right" @click="openLogs()"></a-icon>
</a-col>
</a-row>
</span>
<template slot="content">
- <span :style="{ maxWidth: '400px' }" v-for="line in status.xray.errorMsg.split('\n')">[[ line ]]</span>
+ <span class="max-w-400" v-for="line in status.xray.errorMsg.split('\n')">[[ line ]]</span>
</template>
<a-badge :text="status.xray.stateMsg" :color="status.xray.color"/>
</a-popover>
</template>
</template>
<template #actions>
- <a-space v-if="app.ipLimitEnable" direction="horizontal" @click="openXrayLogs()" :style="{ justifyContent: 'center' }">
+ <a-space v-if="app.ipLimitEnable" direction="horizontal" @click="openXrayLogs()" class="jc-center">
<a-icon type="bars"></a-icon>
<span v-if="!isMobile">{{ i18n "pages.index.logs" }}</span>
</a-space>
- <a-space direction="horizontal" @click="stopXrayService" :style="{ justifyContent: 'center' }">
+ <a-space direction="horizontal" @click="stopXrayService" class="jc-center">
<a-icon type="poweroff"></a-icon>
<span v-if="!isMobile">{{ i18n "pages.index.stopXray" }}</span>
</a-space>
- <a-space direction="horizontal" @click="restartXrayService" :style="{ justifyContent: 'center' }">
+ <a-space direction="horizontal" @click="restartXrayService" class="jc-center">
<a-icon type="reload"></a-icon>
<span v-if="!isMobile">{{ i18n "pages.index.restartXray" }}</span>
</a-space>
- <a-space direction="horizontal" @click="openSelectV2rayVersion" :style="{ justifyContent: 'center' }">
+ <a-space direction="horizontal" @click="openSelectV2rayVersion" class="jc-center">
<a-icon type="tool"></a-icon>
<span v-if="!isMobile">
[[ status.xray.version != 'Unknown' ? `v${status.xray.version}` : '{{ i18n "pages.index.xraySwitch" }}' ]]
@@ -203,15 +134,15 @@
<a-col :sm="24" :lg="12">
<a-card title='{{ i18n "menu.link" }}' hoverable>
<template #actions>
- <a-space direction="horizontal" @click="openLogs()" :style="{ justifyContent: 'center' }">
+ <a-space direction="horizontal" @click="openLogs()" class="jc-center">
<a-icon type="bars"></a-icon>
<span v-if="!isMobile">{{ i18n "pages.index.logs" }}</span>
</a-space>
- <a-space direction="horizontal" @click="openConfig" :style="{ justifyContent: 'center' }">
+ <a-space direction="horizontal" @click="openConfig" class="jc-center">
<a-icon type="control"></a-icon>
<span v-if="!isMobile">{{ i18n "pages.index.config" }}</span>
</a-space>
- <a-space direction="horizontal" @click="openBackup" :style="{ justifyContent: 'center' }">
+ <a-space direction="horizontal" @click="openBackup" class="jc-center">
<a-icon type="cloud-server"></a-icon>
<span v-if="!isMobile">{{ i18n "pages.index.backup" }}</span>
</a-space>
@@ -314,7 +245,7 @@
<template #title>
{{ i18n "pages.index.toggleIpVisibility" }}
</template>
- <a-icon :type="showIp ? 'eye' : 'eye-invisible'" :style="{ fontSize: '1rem' }" @click="showIp = !showIp"></a-icon>
+ <a-icon :type="showIp ? 'eye' : 'eye-invisible'" class="fs-1rem" @click="showIp = !showIp"></a-icon>
</a-tooltip>
</template>
<a-row :class="showIp ? 'ip-visible' : 'ip-hidden'" :gutter="isMobile ? [8,8] : 0">
@@ -365,8 +296,8 @@
@ok="() => versionModal.visible = false" :class="themeSwitcher.currentTheme" footer="">
<a-collapse default-active-key="1">
<a-collapse-panel key="1" header='Xray'>
- <a-alert type="warning" :style="{ marginBottom: '12px', width: '100%' }" message='{{ i18n "pages.index.xraySwitchClickDesk" }}' show-icon></a-alert>
- <a-list class="ant-version-list" bordered :style="{ width: '100%' }">
+ <a-alert type="warning" class="mb-12 w-100" message='{{ i18n "pages.index.xraySwitchClickDesk" }}' show-icon></a-alert>
+ <a-list class="ant-version-list w-100" bordered>
<a-list-item class="ant-version-list-item" v-for="version, index in versionModal.versions">
<a-tag :color="index % 2 == 0 ? 'purple' : 'green'">[[ version ]]</a-tag>
<a-radio :class="themeSwitcher.currentTheme" :checked="version === `v${status.xray.version}`" @click="switchV2rayVersion(version)"></a-radio>
@@ -374,15 +305,13 @@
</a-list>
</a-collapse-panel>
<a-collapse-panel key="2" header='Geofiles'>
- <a-list class="ant-version-list" bordered :style="{ width: '100%' }">
+ <a-list class="ant-version-list w-100" bordered>
<a-list-item class="ant-version-list-item" v-for="file, index in ['geosite.dat', 'geoip.dat', 'geosite_IR.dat', 'geoip_IR.dat', 'geosite_RU.dat', 'geoip_RU.dat']">
<a-tag :color="index % 2 == 0 ? 'purple' : 'green'">[[ file ]]</a-tag>
- <a-icon type="reload" @click="updateGeofile(file)" :style="{ marginRight: '8px' }"/>
+ <a-icon type="reload" @click="updateGeofile(file)" class="mr-8"/>
</a-list-item>
</a-list>
- <div style="margin-top: 5px; display: flex; justify-content: flex-end;">
- <a-button @click="updateGeofile('')">{{ i18n "pages.index.geofilesUpdateAll" }}</a-button>
- </div>
+ <div class="mt-5 d-flex justify-end"><a-button @click="updateGeofile('')">{{ i18n "pages.index.geofilesUpdateAll" }}</a-button></div>
</a-collapse-panel>
</a-collapse>
</a-modal>
@@ -394,15 +323,15 @@
{{ i18n "pages.index.logs" }}
<a-icon :spin="logModal.loading"
type="sync"
- :style="{ verticalAlign: 'middle', marginLeft: '10px' }"
+ class="va-middle ml-10"
:disabled="logModal.loading"
@click="openLogs()">
</a-icon>
</template>
<a-form layout="inline">
- <a-form-item :style="{ marginRight: '0.5rem' }">
+ <a-form-item class="mr-05">
<a-input-group compact>
- <a-select size="small" v-model="logModal.rows" :style="{ width: '70px' }"
+ <a-select size="small" v-model="logModal.rows" class="w-70"
@change="openLogs()" :dropdown-class-name="themeSwitcher.currentTheme">
<a-select-option value="10">10</a-select-option>
<a-select-option value="20">20</a-select-option>
@@ -410,7 +339,7 @@
<a-select-option value="100">100</a-select-option>
<a-select-option value="500">500</a-select-option>
</a-select>
- <a-select size="small" v-model="logModal.level" :style="{ width: '95px' }"
+ <a-select size="small" v-model="logModal.level" class="w-95"
@change="openLogs()" :dropdown-class-name="themeSwitcher.currentTheme">
<a-select-option value="debug">Debug</a-select-option>
<a-select-option value="info">Info</a-select-option>
@@ -423,11 +352,11 @@
<a-form-item>
<a-checkbox v-model="logModal.syslog" @change="openLogs()">SysLog</a-checkbox>
</a-form-item>
- <a-form-item :style="{ float: 'right' }">
+ <a-form-item style="float: right;">
<a-button type="primary" icon="download" @click="FileManager.downloadTextFile(logModal.logs?.join('\n'), 'x-ui.log')"></a-button>
</a-form-item>
</a-form>
- <div class="ant-input" :style="{ height: 'auto', maxHeight: '500px', overflow: 'auto', marginTop: '0.5rem' }" v-html="logModal.formattedLogs"></div>
+ <div class="ant-input log-container" v-html="logModal.formattedLogs"></div>
</a-modal>
<a-modal id="xraylog-modal"
v-model="xraylogModal.visible"
@@ -439,15 +368,15 @@
{{ i18n "pages.index.logs" }}
<a-icon :spin="xraylogModal.loading"
type="sync"
- :style="{ verticalAlign: 'middle', marginLeft: '10px' }"
+ class="va-middle ml-10"
:disabled="xraylogModal.loading"
@click="openXrayLogs()">
</a-icon>
</template>
<a-form layout="inline">
- <a-form-item :style="{ marginRight: '0.5rem' }">
+ <a-form-item class="mr-05">
<a-input-group compact>
- <a-select size="small" v-model="xraylogModal.rows" :style="{ width: '70px' }"
+ <a-select size="small" v-model="xraylogModal.rows" class="w-70"
@change="openXrayLogs()" :dropdown-class-name="themeSwitcher.currentTheme">
<a-select-option value="10">10</a-select-option>
<a-select-option value="20">20</a-select-option>
@@ -465,11 +394,11 @@
<a-checkbox v-model="xraylogModal.showBlocked" @change="openXrayLogs()">Blocked</a-checkbox>
<a-checkbox v-model="xraylogModal.showProxy" @change="openXrayLogs()">Proxy</a-checkbox>
</a-form-item>
- <a-form-item :style="{ float: 'right' }">
+ <a-form-item style="float: right;">
<a-button type="primary" icon="download" @click="FileManager.downloadTextFile(xraylogModal.logs?.join('\n'), 'x-ui.log')"></a-button>
</a-form-item>
</a-form>
- <div class="ant-input" :style="{ height: 'auto', maxHeight: '500px', overflow: 'auto', marginTop: '0.5rem' }" v-html="xraylogModal.formattedLogs"></div>
+ <div class="ant-input log-container" v-html="xraylogModal.formattedLogs"></div>
</a-modal>
<a-modal id="backup-modal"
v-model="backupModal.visible"
@@ -477,7 +406,7 @@
:closable="true"
footer=""
:class="themeSwitcher.currentTheme">
- <a-list class="ant-backup-list" bordered :style="{ width: '100%' }">
+ <a-list class="ant-backup-list w-100" bordered>
<a-list-item class="ant-backup-list-item">
<a-list-item-meta>
<template #title>{{ i18n "pages.index.exportDatabase" }}</template>
diff --git a/web/html/login.html b/web/html/login.html
index 968aa0bc..b561b732 100644
--- a/web/html/login.html
+++ b/web/html/login.html
@@ -1,456 +1,10 @@
{{ template "page/head_start" .}}
-<style>
- html * {
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
- }
-
- h1 {
- text-align: center;
- /*margin: 20px 0 50px 0;*/
- height: 110px;
- }
-
- .ant-form-item-children .ant-btn,
- .ant-input {
- height: 50px;
- border-radius: 30px;
- }
-
- .ant-input-group-addon {
- border-radius: 0 30px 30px 0;
- width: 50px;
- font-size: 18px;
- }
-
- .ant-input-affix-wrapper .ant-input-prefix {
- left: 23px;
- }
-
- .ant-input-affix-wrapper .ant-input:not(:first-child) {
- padding-left: 50px;
- }
-
- .centered {
- display: flex;
- text-align: center;
- align-items: center;
- justify-content: center;
- width: 100%;
- }
-
- .title {
- font-size: 2rem;
- margin-block-end: 2rem;
- }
-
- .title b {
- font-weight: bold !important;
- }
-
- #app {
- overflow: hidden;
- }
-
- #login {
- animation: charge 0.5s both;
- background-color: #fff;
- border-radius: 2rem;
- padding: 4rem 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);
- }
-
- @keyframes charge {
- from {
- transform: translateY(5rem);
- opacity: 0;
- }
-
- to {
- transform: translateY(0);
- opacity: 1;
- }
- }
-
- .under {
- background-color: #c7ebe2;
- z-index: 0;
- }
-
- .dark .under {
- background-color: var(--dark-color-login-wave);
- }
-
- .dark #login {
- background-color: var(--dark-color-surface-100);
- }
-
- .dark h1 {
- color: rgba(255, 255, 255);
- }
-
- .ant-btn-primary-login {
- width: 100%;
- }
-
- .ant-btn-primary-login:focus,
- .ant-btn-primary-login:hover {
- color: #fff;
- background-color: #006655;
- border-color: #006655;
- background-image: linear-gradient(270deg,
- rgba(123, 199, 77, 0) 30%,
- #009980,
- rgba(123, 199, 77, 0) 100%);
- background-repeat: no-repeat;
- animation: ma-bg-move ease-in-out 5s infinite;
- background-position-x: -500px;
- width: 95%;
- animation-delay: -0.5s;
- box-shadow: 0 2px 0 rgba(0, 0, 0, 0.045);
- }
-
- .ant-btn-primary-login.active,
- .ant-btn-primary-login:active {
- color: #fff;
- background-color: #006655;
- border-color: #006655;
- }
-
- @keyframes ma-bg-move {
- 0% {
- background-position: -500px 0;
- }
-
- 50% {
- background-position: 1000px 0;
- }
-
- 100% {
- background-position: 1000px 0;
- }
- }
-
- .wave-btn-bg {
- position: relative;
- border-radius: 25px;
- width: 100%;
- transition: all 0.3s cubic-bezier(.645, .045, .355, 1);
- }
-
- .dark .wave-btn-bg {
- color: #fff;
- position: relative;
- background-color: #0a7557;
- border: 2px double transparent;
- background-origin: border-box;
- background-clip: padding-box, border-box;
- background-size: 300%;
- width: 100%;
- z-index: 1;
- }
-
- .dark .wave-btn-bg:hover {
- animation: wave-btn-tara 4s ease infinite;
- }
-
- .dark .wave-btn-bg-cl {
- background-image: linear-gradient(rgba(13, 14, 33, 0), rgba(13, 14, 33, 0)),
- radial-gradient(circle at left top, #006655, #009980, #006655) !important;
- border-radius: 3em;
- }
-
- .dark .wave-btn-bg-cl:hover {
- width: 95%;
- }
-
- .dark .wave-btn-bg-cl:before {
- position: absolute;
- content: "";
- top: -5px;
- left: -5px;
- bottom: -5px;
- right: -5px;
- z-index: -1;
- background: inherit;
- background-size: inherit;
- border-radius: 4em;
- opacity: 0;
- transition: 0.5s;
- }
-
- .dark .wave-btn-bg-cl:hover::before {
- opacity: 1;
- filter: blur(20px);
- animation: wave-btn-tara 8s linear infinite;
- }
-
- @keyframes wave-btn-tara {
- to {
- background-position: 300%;
- }
- }
-
- .dark .ant-btn-primary-login {
- font-size: 14px;
- color: #fff;
- text-align: center;
- background-image: linear-gradient(rgba(13, 14, 33, 0.45),
- rgba(13, 14, 33, 0.35));
- border-radius: 2rem;
- border: none;
- outline: none;
- background-color: transparent;
- height: 46px;
- position: relative;
- white-space: nowrap;
- cursor: pointer;
- touch-action: manipulation;
- padding: 0 15px;
- width: 100%;
- animation: none;
- background-position-x: 0;
- box-shadow: none;
- }
-
- .waves-header {
- position: fixed;
- width: 100%;
- text-align: center;
- background-color: #dbf5ed;
- color: white;
- z-index: -1;
- }
-
- .dark .waves-header {
- background-color: var(--dark-color-login-background);
- }
-
- .waves-inner-header {
- height: 50vh;
- width: 100%;
- margin: 0;
- padding: 0;
- }
-
- .waves {
- position: relative;
- width: 100%;
- height: 15vh;
- margin-bottom: -8px;
- /*Fix for safari gap*/
- min-height: 100px;
- max-height: 150px;
- }
-
- .parallax>use {
- animation: move-forever 25s cubic-bezier(0.55, 0.5, 0.45, 0.5) infinite;
- }
-
- .dark .parallax>use {
- fill: var(--dark-color-login-wave);
- }
-
- .parallax>use:nth-child(1) {
- animation-delay: -2s;
- animation-duration: 4s;
- opacity: 0.2;
- }
-
- .parallax>use:nth-child(2) {
- animation-delay: -3s;
- animation-duration: 7s;
- opacity: 0.4;
- }
-
- .parallax>use:nth-child(3) {
- animation-delay: -4s;
- animation-duration: 10s;
- opacity: 0.6;
- }
-
- .parallax>use:nth-child(4) {
- animation-delay: -5s;
- animation-duration: 13s;
- }
-
- @keyframes move-forever {
- 0% {
- transform: translate3d(-90px, 0, 0);
- }
-
- 100% {
- transform: translate3d(85px, 0, 0);
- }
- }
-
- @media (max-width: 768px) {
- .waves {
- height: 40px;
- min-height: 40px;
- }
- }
-
- .words-wrapper {
- width: 100%;
- display: inline-block;
- position: relative;
- text-align: center;
- }
-
- .words-wrapper b {
- width: 100%;
- display: inline-block;
- position: absolute;
- left: 0;
- top: 0;
- }
-
- .words-wrapper b.is-visible {
- position: relative;
- }
-
- .headline.zoom .words-wrapper {
- -webkit-perspective: 300px;
- -moz-perspective: 300px;
- perspective: 300px;
- }
-
- .headline {
- display: flex;
- justify-content: center;
- align-items: center;
- }
-
- .headline.zoom b {
- opacity: 0;
- }
-
- .headline.zoom b.is-visible {
- opacity: 1;
- -webkit-animation: zoom-in 0.8s;
- -moz-animation: zoom-in 0.8s;
- animation: cubic-bezier(0.215, 0.610, 0.355, 1.000) zoom-in 0.8s;
- }
-
- .headline.zoom b.is-hidden {
- -webkit-animation: zoom-out 0.8s;
- -moz-animation: zoom-out 0.8s;
- animation: cubic-bezier(0.215, 0.610, 0.355, 1.000) zoom-out 0.4s;
- }
-
- @-webkit-keyframes zoom-in {
- 0% {
- opacity: 0;
- -webkit-transform: translateZ(100px);
- }
-
- 100% {
- opacity: 1;
- -webkit-transform: translateZ(0);
- }
- }
-
- @-moz-keyframes zoom-in {
- 0% {
- opacity: 0;
- -moz-transform: translateZ(100px);
- }
-
- 100% {
- opacity: 1;
- -moz-transform: translateZ(0);
- }
- }
-
- @keyframes zoom-in {
- 0% {
- opacity: 0;
- -webkit-transform: translateZ(100px);
- -moz-transform: translateZ(100px);
- -ms-transform: translateZ(100px);
- -o-transform: translateZ(100px);
- transform: translateZ(100px);
- }
-
- 100% {
- opacity: 1;
- -webkit-transform: translateZ(0);
- -moz-transform: translateZ(0);
- -ms-transform: translateZ(0);
- -o-transform: translateZ(0);
- transform: translateZ(0);
- }
- }
-
- @-webkit-keyframes zoom-out {
- 0% {
- opacity: 1;
- -webkit-transform: translateZ(0);
- }
-
- 100% {
- opacity: 0;
- -webkit-transform: translateZ(-100px);
- }
- }
-
- @-moz-keyframes zoom-out {
- 0% {
- opacity: 1;
- -moz-transform: translateZ(0);
- }
-
- 100% {
- opacity: 0;
- -moz-transform: translateZ(-100px);
- }
- }
-
- @keyframes zoom-out {
- 0% {
- opacity: 1;
- -webkit-transform: translateZ(0);
- -moz-transform: translateZ(0);
- -ms-transform: translateZ(0);
- -o-transform: translateZ(0);
- transform: translateZ(0);
- }
-
- 100% {
- opacity: 0;
- -webkit-transform: translateZ(-100px);
- -moz-transform: translateZ(-100px);
- -ms-transform: translateZ(-100px);
- -o-transform: translateZ(-100px);
- transform: translateZ(-100px);
- }
- }
-
- .setting-section {
- position: absolute;
- top: 0;
- right: 0;
- padding: 22px;
- }
-
- .ant-space-item .ant-switch {
- margin: 2px 0 4px;
- }
-</style>
{{ template "page/head_end" .}}
{{ template "page/body_start" .}}
-<a-layout id="app" v-cloak :class="themeSwitcher.currentTheme">
+<a-layout id="app" v-cloak :class="themeSwitcher.currentTheme + ' login-app'">
<transition name="list" appear>
- <a-layout-content class="under" :style="{ minHeight: '0' }">
+ <a-layout-content class="under min-h-100vh">
<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"
@@ -466,11 +20,10 @@
</g>
</svg>
</div>
- <a-row type="flex" justify="center" align="middle"
- :style="{ height: '100%', overflow: 'auto', overflowX: 'hidden' }">
- <a-col :xs="22" :sm="12" :md="10" :lg="8" :xl="6" :xxl="5" id="login" :style="{ margin: '3rem 0' }">
+ <a-row type="flex" justify="center" align="middle" class="h-100 overflow-hidden-auto">
+ <a-col :xs="22" :sm="12" :md="10" :lg="8" :xl="6" :xxl="5" id="login" class="my-3rem">
<template v-if="!loadingStates.fetched">
- <div :style="{ textAlign: 'center' }">
+ <div class="text-center">
<a-spin size="large" />
</div>
</template>
@@ -482,7 +35,7 @@
<a-space direction="vertical" :size="10">
<a-theme-switch-login></a-theme-switch-login>
<span>{{ i18n "pages.settings.language" }}</span>
- <a-select ref="selectLang" :style="{ width: '100%' }" v-model="lang"
+ <a-select ref="selectLang" class="w-100" v-model="lang"
@change="LanguageManager.setLanguage(lang)" :dropdown-class-name="themeSwitcher.currentTheme">
<a-select-option :value="l.value" label="English" v-for="l in LanguageManager.supportedLanguages">
<span role="img" aria-label="l.name" v-text="l.icon"></span>
@@ -511,26 +64,24 @@
<a-form-item>
<a-input autocomplete="username" name="username" v-model.trim="user.username"
placeholder='{{ i18n "username" }}' autofocus required>
- <a-icon slot="prefix" type="user" :style="{ fontSize: '1rem' }"></a-icon>
+ <a-icon slot="prefix" type="user" class="fs-1rem"></a-icon>
</a-input>
</a-form-item>
<a-form-item>
<a-input-password autocomplete="password" name="password" v-model.trim="user.password"
placeholder='{{ i18n "password" }}' required>
- <a-icon slot="prefix" type="lock" :style="{ fontSize: '1rem' }"></a-icon>
+ <a-icon slot="prefix" type="lock" class="fs-1rem"></a-icon>
</a-input-password>
</a-form-item>
<a-form-item v-if="twoFactorEnable">
<a-input autocomplete="one-time-code" name="twoFactorCode" v-model.trim="user.twoFactorCode"
placeholder='{{ i18n "twoFactorCode" }}' required>
- <a-icon slot="prefix" type="key" :style="{ fontSize: '1rem' }"></a-icon>
+ <a-icon slot="prefix" type="key" class="fs-1rem"></a-icon>
</a-input>
</a-form-item>
<a-form-item>
<a-row justify="center" class="centered">
- <div
- :style="{ height: '50px', marginTop: '1rem', ...loadingStates.spinning ? { width: '52px' } : { display: 'inline-block' } }"
- class="wave-btn-bg wave-btn-bg-cl">
+ <div class="wave-btn-bg wave-btn-bg-cl h-50px mt-1rem" :style="loadingStates.spinning ? 'width: 52px' : 'display: inline-block'">
<a-button class="ant-btn-primary-login" type="primary" :loading="loadingStates.spinning"
:icon="loadingStates.spinning ? 'poweroff' : undefined" html-type="submit">
[[ loadingStates.spinning ? '' : '{{ i18n "login" }}' ]]
diff --git a/web/html/settings.html b/web/html/settings.html
index 3b6e81a1..0c88f518 100644
--- a/web/html/settings.html
+++ b/web/html/settings.html
@@ -1,67 +1,8 @@
{{ template "page/head_start" .}}
-<style>
- @media (min-width: 769px) {
- .ant-layout-content {
- margin: 24px 16px;
- }
- }
- @media (max-width: 768px) {
- .ant-tabs-nav .ant-tabs-tab {
- margin: 0;
- padding: 12px .5rem;
- }