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
diff options
context:
space:
mode:
authorMHSanaei <ho3ein.sanaei@gmail.com>2026-05-04 14:20:24 +0300
committerMHSanaei <ho3ein.sanaei@gmail.com>2026-05-04 14:20:24 +0300
commite19061d513b8c4fb2207b4a553a96ea086089612 (patch)
tree8a05450f0f6d3e8a2a182976b1a38bf5cca824ea /web
parent51e2fb6dbfb6f3f21b3f578c15c3dc0d47c4a66e (diff)
TLS: Remove ECH Force Query
Diffstat (limited to 'web')
-rw-r--r--web/assets/js/model/inbound.js4
-rw-r--r--web/html/common/page.html65
-rw-r--r--web/html/component/aClientTable.html87
-rw-r--r--web/html/component/aCustomStatistic.html18
-rw-r--r--web/html/component/aPersianDatepicker.html5
-rw-r--r--web/html/component/aSettingListItem.html4
-rw-r--r--web/html/component/aSidebar.html7
-rw-r--r--web/html/component/aTableSortable.html19
-rw-r--r--web/html/component/aThemeSwitch.html6
-rw-r--r--web/html/form/client.html127
-rw-r--r--web/html/form/outbound.html993
-rw-r--r--web/html/form/protocol/dokodemo.html4
-rw-r--r--web/html/form/protocol/http.html5
-rw-r--r--web/html/form/protocol/hysteria.html10
-rw-r--r--web/html/form/protocol/shadowsocks.html44
-rw-r--r--web/html/form/protocol/socks.html49
-rw-r--r--web/html/form/protocol/trojan.html62
-rw-r--r--web/html/form/protocol/tun.html60
-rw-r--r--web/html/form/protocol/vless.html203
-rw-r--r--web/html/form/protocol/vmess.html4
-rw-r--r--web/html/form/sniffing.html30
-rw-r--r--web/html/form/stream/external_proxy.html60
-rw-r--r--web/html/form/stream/stream_finalmask.html698
-rw-r--r--web/html/form/stream/stream_grpc.html8
-rw-r--r--web/html/form/stream/stream_httpupgrade.html49
-rw-r--r--web/html/form/stream/stream_hysteria.html80
-rw-r--r--web/html/form/stream/stream_kcp.html40
-rw-r--r--web/html/form/stream/stream_settings.html18
-rw-r--r--web/html/form/stream/stream_sockopt.html79
-rw-r--r--web/html/form/stream/stream_tcp.html121
-rw-r--r--web/html/form/stream/stream_ws.html44
-rw-r--r--web/html/form/stream/stream_xhttp.html172
-rw-r--r--web/html/form/tls_settings.html41
-rw-r--r--web/html/inbounds.html597
-rw-r--r--web/html/index.html399
-rw-r--r--web/html/login.html22
-rw-r--r--web/html/modals/client_bulk_modal.html116
-rw-r--r--web/html/modals/client_modal.html69
-rw-r--r--web/html/modals/dns_presets_modal.html15
-rw-r--r--web/html/modals/inbound_info_modal.html41
-rw-r--r--web/html/modals/inbound_modal.html32
-rw-r--r--web/html/modals/nord_modal.html69
-rw-r--r--web/html/modals/prompt_modal.html19
-rw-r--r--web/html/modals/qrcode_modal.html39
-rw-r--r--web/html/modals/text_modal.html6
-rw-r--r--web/html/modals/two_factor_modal.html58
-rw-r--r--web/html/modals/warp_modal.html22
-rw-r--r--web/html/modals/xray_balancer_modal.html37
-rw-r--r--web/html/modals/xray_dns_modal.html18
-rw-r--r--web/html/modals/xray_fakedns_modal.html17
-rw-r--r--web/html/modals/xray_outbound_modal.html54
-rw-r--r--web/html/modals/xray_reverse_modal.html94
-rw-r--r--web/html/modals/xray_rule_modal.html31
-rw-r--r--web/html/settings.html237
-rw-r--r--web/html/settings/panel/general.html21
-rw-r--r--web/html/settings/panel/subscription/general.html18
-rw-r--r--web/html/settings/panel/subscription/subpage.html13
-rw-r--r--web/html/settings/xray/balancers.html8
-rw-r--r--web/html/settings/xray/basics.html105
-rw-r--r--web/html/settings/xray/dns.html3
-rw-r--r--web/html/settings/xray/outbounds.html51
-rw-r--r--web/html/xray.html1130
62 files changed, 3146 insertions, 3411 deletions
diff --git a/web/assets/js/model/inbound.js b/web/assets/js/model/inbound.js
index f695d251..9531f19b 100644
--- a/web/assets/js/model/inbound.js
+++ b/web/assets/js/model/inbound.js
@@ -697,7 +697,6 @@ class TlsStreamSettings extends XrayCommonClass {
certificates = [new TlsStreamSettings.Cert()],
alpn = [ALPN_OPTION.H2, ALPN_OPTION.HTTP1],
echServerKeys = '',
- echForceQuery = 'none',
settings = new TlsStreamSettings.Settings()
) {
super();
@@ -711,7 +710,6 @@ class TlsStreamSettings extends XrayCommonClass {
this.certs = certificates;
this.alpn = alpn;
this.echServerKeys = echServerKeys;
- this.echForceQuery = echForceQuery;
this.settings = settings;
}
@@ -744,7 +742,6 @@ class TlsStreamSettings extends XrayCommonClass {
certs,
json.alpn,
json.echServerKeys,
- json.echForceQuery,
settings,
);
}
@@ -761,7 +758,6 @@ class TlsStreamSettings extends XrayCommonClass {
certificates: TlsStreamSettings.toJsonArray(this.certs),
alpn: this.alpn,
echServerKeys: this.echServerKeys,
- echForceQuery: this.echForceQuery,
settings: this.settings,
};
}
diff --git a/web/html/common/page.html b/web/html/common/page.html
index 058682d5..47b2b654 100644
--- a/web/html/common/page.html
+++ b/web/html/common/page.html
@@ -1,6 +1,7 @@
{{ define "page/head_start" }}
<!DOCTYPE html>
<html>
+
<head>
<meta charset="UTF-8">
<meta name="renderer" content="webkit">
@@ -12,6 +13,7 @@
[v-cloak] {
display: none;
}
+
/* vazirmatn-regular - arabic_latin_latin-ext */
@font-face {
font-display: swap;
@@ -21,10 +23,11 @@
src: url('{{ .base_path }}assets/Vazirmatn-UI-NL-Regular.woff2') format('woff2');
unicode-range: U+0600-06FF, U+200C-200E, U+2010-2011, U+204F, U+2E41, U+FB50-FDFF, U+FE80-FEFC, U+0030-0039;
}
+
body {
font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Vazirmatn', 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
}
-
+
/* mobile touch scrolling for tabs */
@media (max-width: 576px) {
.ant-tabs-nav-container {
@@ -34,59 +37,69 @@
overscroll-behavior-x: contain;
white-space: nowrap;
max-width: 100%;
- padding: 0 !important; /* Remove padding for arrows */
+ padding: 0 !important;
+ /* Remove padding for arrows */
}
+
.ant-tabs-nav-wrap {
overflow: visible !important;
padding: 0 !important;
}
+
.ant-tabs-nav-scroll {
overflow: visible !important;
box-shadow: none !important;
}
+
.ant-tabs-nav {
- display: flex !important;
- transform: none !important; /* Disable JS transform */
- width: auto !important;
- margin: 0 !important;
+ display: flex !important;
+ transform: none !important;
+ /* Disable JS transform */
+ width: auto !important;
+ margin: 0 !important;
}
+
.ant-tabs-tab-prev,
.ant-tabs-tab-next {
- display: none !important; /* Hide arrows */
+ display: none !important;
+ /* Hide arrows */
}
+
.ant-tabs-nav-container::-webkit-scrollbar {
display: none;
}
}
</style>
<title>{{ .host }} – {{ i18n .title}}</title>
-{{ end }}
+ {{ end }}
-{{ define "page/head_end" }}
+ {{ define "page/head_end" }}
</head>
{{ end }}
{{ define "page/body_start" }}
+
<body>
<div id="message"></div>
-{{ end }}
+ {{ end }}
-{{ define "page/body_scripts" }}
-<script src="{{ .base_path }}assets/vue/vue.min.js?{{ .cur_ver }}"></script>
-<script src="{{ .base_path }}assets/moment/moment.min.js"></script>
-<script src="{{ .base_path }}assets/ant-design-vue/antd.min.js"></script>
-<script src="{{ .base_path }}assets/axios/axios.min.js?{{ .cur_ver }}"></script>
-<script src="{{ .base_path }}assets/qs/qs.min.js"></script>
-<script src="{{ .base_path }}assets/js/axios-init.js?{{ .cur_ver }}"></script>
-<script src="{{ .base_path }}assets/js/util/index.js?{{ .cur_ver }}"></script>
-<script>
- const basePath = '{{ .base_path }}';
- axios.defaults.baseURL = basePath;
-</script>
-<script src="{{ .base_path }}assets/js/websocket.js?{{ .cur_ver }}"></script>
-{{ end }}
-
-{{ define "page/body_end" }}
+ {{ define "page/body_scripts" }}
+ <script src="{{ .base_path }}assets/vue/vue.min.js?{{ .cur_ver }}"></script>
+ <script src="{{ .base_path }}assets/moment/moment.min.js"></script>
+ <script src="{{ .base_path }}assets/ant-design-vue/antd.min.js"></script>
+ <script src="{{ .base_path }}assets/axios/axios.min.js?{{ .cur_ver }}"></script>
+ <script src="{{ .base_path }}assets/qs/qs.min.js"></script>
+ <script src="{{ .base_path }}assets/js/axios-init.js?{{ .cur_ver }}"></script>
+ <script src="{{ .base_path }}assets/js/util/index.js?{{ .cur_ver }}"></script>
+ <script>
+ const basePath = '{{ .base_path }}';
+ axios.defaults.baseURL = basePath;
+ </script>
+ <script src="{{ .base_path }}assets/js/websocket.js?{{ .cur_ver }}"></script>
+ {{ end }}
+
+ {{ define "page/body_end" }}
</body>
+
</html>
{{ end }} \ No newline at end of file
diff --git a/web/html/component/aClientTable.html b/web/html/component/aClientTable.html
index 0e32d45c..6e525396 100644
--- a/web/html/component/aClientTable.html
+++ b/web/html/component/aClientTable.html
@@ -2,30 +2,39 @@
<template slot="actions" slot-scope="text, client, index">
<a-tooltip>
<template slot="title">{{ i18n "qrCode" }}</template>
- <a-icon :style="{ fontSize: '22px', marginInlineStart: '14px' }" class="normal-icon" type="qrcode" v-if="record.hasLink()" @click="showQrcode(record.id,client);"></a-icon>
+ <a-icon :style="{ fontSize: '22px', marginInlineStart: '14px' }" class="normal-icon" type="qrcode"
+ v-if="record.hasLink()" @click="showQrcode(record.id,client);"></a-icon>
</a-tooltip>
<a-tooltip>
<template slot="title">{{ i18n "pages.client.edit" }}</template>
- <a-icon :style="{ fontSize: '22px' }" class="normal-icon" type="edit" @click="openEditClient(record.id,client);"></a-icon>
+ <a-icon :style="{ fontSize: '22px' }" class="normal-icon" type="edit"
+ @click="openEditClient(record.id,client);"></a-icon>
</a-tooltip>
<a-tooltip>
<template slot="title">{{ i18n "info" }}</template>
- <a-icon :style="{ fontSize: '22px' }" class="normal-icon" type="info-circle" @click="showInfo(record.id,client);"></a-icon>
+ <a-icon :style="{ fontSize: '22px' }" class="normal-icon" type="info-circle"
+ @click="showInfo(record.id,client);"></a-icon>
</a-tooltip>
<a-tooltip>
<template slot="title">{{ i18n "pages.inbounds.resetTraffic" }}</template>
- <a-popconfirm @confirm="resetClientTraffic(client,record.id,false)" title='{{ i18n "pages.inbounds.resetTrafficContent"}}' :overlay-class-name="themeSwitcher.currentTheme" ok-text='{{ i18n "reset"}}' cancel-text='{{ i18n "cancel"}}'>
+ <a-popconfirm @confirm="resetClientTraffic(client,record.id,false)"
+ title='{{ i18n "pages.inbounds.resetTrafficContent"}}' :overlay-class-name="themeSwitcher.currentTheme"
+ ok-text='{{ i18n "reset"}}' cancel-text='{{ i18n "cancel"}}'>
<a-icon slot="icon" type="question-circle-o" :style="{ color: 'var(--color-primary-100)'}"></a-icon>
- <a-icon :style="{ fontSize: '22px', cursor: 'pointer' }" class="normal-icon" type="retweet" v-if="client.email.length > 0"></a-icon>
+ <a-icon :style="{ fontSize: '22px', cursor: 'pointer' }" class="normal-icon" type="retweet"
+ v-if="client.email.length > 0"></a-icon>
</a-popconfirm>
</a-tooltip>
<a-tooltip>
<template slot="title">
<span :style="{ color: '#FF4D4F' }"> {{ i18n "delete"}}</span>
</template>
- <a-popconfirm @confirm="delClient(record.id,client,false)" title='{{ i18n "pages.inbounds.deleteClientContent"}}' :overlay-class-name="themeSwitcher.currentTheme" ok-text='{{ i18n "delete"}}' ok-type="danger" cancel-text='{{ i18n "cancel"}}'>
+ <a-popconfirm @confirm="delClient(record.id,client,false)" title='{{ i18n "pages.inbounds.deleteClientContent"}}'
+ :overlay-class-name="themeSwitcher.currentTheme" ok-text='{{ i18n "delete"}}' ok-type="danger"
+ cancel-text='{{ i18n "cancel"}}'>
<a-icon slot="icon" type="question-circle-o" :style="{ color: '#e04141' }"></a-icon>
- <a-icon :style="{ fontSize: '22px', cursor: 'pointer' }" class="delete-icon" type="delete" v-if="isRemovable(record.id)"></a-icon>
+ <a-icon :style="{ fontSize: '22px', cursor: 'pointer' }" class="delete-icon" type="delete"
+ v-if="isRemovable(record.id)"></a-icon>
</a-popconfirm>
</a-tooltip>
</template>
@@ -34,7 +43,7 @@
</template>
<template slot="online" slot-scope="text, client, index">
<a-popover :overlay-class-name="themeSwitcher.currentTheme">
- <template slot="content" >
+ <template slot="content">
{{ i18n "lastOnline" }}: [[ formatLastOnline(client.email) ]]
</template>
<template v-if="client.enable && isClientOnline(client.email)">
@@ -53,7 +62,8 @@
<template v-else-if="!client.enable">{{ i18n "disabled" }}</template>
<template v-else-if="client.enable && isClientOnline(client.email)">{{ i18n "online" }}</template>
</template>
- <a-badge :class="isClientOnline(client.email)? 'online-animation' : ''" :color="client.enable ? statsExpColor(record, client.email) : themeSwitcher.isDarkTheme ? '#2c3950' : '#bcbcbc'"></a-badge>
+ <a-badge :class="isClientOnline(client.email)? 'online-animation' : ''"
+ :color="client.enable ? statsExpColor(record, client.email) : themeSwitcher.isDarkTheme ? '#2c3950' : '#bcbcbc'"></a-badge>
</a-tooltip>
<a-space direction="vertical" :size="2">
<span class="client-email">[[ client.email ]]</span>
@@ -87,10 +97,13 @@
<tr class="tr-table-box">
<td class="tr-table-rt"> [[ SizeFormatter.sizeFormat(getSumStats(record, client.email)) ]] </td>
<td class="tr-table-bar" v-if="!client.enable">
- <a-progress :stroke-color="themeSwitcher.isDarkTheme ? 'rgb(72 84 105)' : '#bcbcbc'" :show-info="false" :percent="statsProgress(record, client.email)" />
+ <a-progress :stroke-color="themeSwitcher.isDarkTheme ? 'rgb(72 84 105)' : '#bcbcbc'" :show-info="false"
+ :percent="statsProgress(record, client.email)" />
</td>
<td class="tr-table-bar" v-else-if="client.totalGB > 0">
- <a-progress :stroke-color="clientStatsColor(record, client.email)" :show-info="false" :status="isClientDepleted(record, client.email)? 'exception' : ''" :percent="statsProgress(record, client.email)" />
+ <a-progress :stroke-color="clientStatsColor(record, client.email)" :show-info="false"
+ :status="isClientDepleted(record, client.email)? 'exception' : ''"
+ :percent="statsProgress(record, client.email)" />
</td>
<td v-else class="infinite-bar tr-table-bar">
<a-progress :show-info="false" :percent="100"></a-progress>
@@ -118,7 +131,8 @@
<tr class="tr-table-box">
<td class="tr-table-rt"> [[ IntlUtil.formatRelativeTime(client.expiryTime) ]] </td>
<td class="infinite-bar tr-table-bar">
- <a-progress :show-info="false" :status="isClientDepleted(record, client.email)? 'exception' : ''" :percent="expireProgress(client.expiryTime, client.reset)" />
+ <a-progress :show-info="false" :status="isClientDepleted(record, client.email)? 'exception' : ''"
+ :percent="expireProgress(client.expiryTime, client.reset)" />
</td>
<td class="tr-table-lt">[[ client.reset + "d" ]]</td>
</tr>
@@ -131,11 +145,16 @@
<span v-if="client.expiryTime < 0">{{ i18n "pages.client.delayedStart" }}</span>
<span v-else>[[ IntlUtil.formatDate(client.expiryTime) ]]</span>
</template>
- <a-tag :style="{ minWidth: '50px', border: 'none' }" :color="ColorUtils.userExpiryColor(app.expireDiff, client, themeSwitcher.isDarkTheme)"> [[ IntlUtil.formatRelativeTime(client.expiryTime) ]] </a-tag>
+ <a-tag :style="{ minWidth: '50px', border: 'none' }"
+ :color="ColorUtils.userExpiryColor(app.expireDiff, client, themeSwitcher.isDarkTheme)"> [[
+ IntlUtil.formatRelativeTime(client.expiryTime) ]] </a-tag>
</a-popover>
- <a-tag v-else :color="ColorUtils.userExpiryColor(app.expireDiff, client, themeSwitcher.isDarkTheme)" :style="{ border: 'none' }" class="infinite-tag">
+ <a-tag v-else :color="ColorUtils.userExpiryColor(app.expireDiff, client, themeSwitcher.isDarkTheme)"
+ :style="{ border: 'none' }" class="infinite-tag">
<svg height="10px" width="14px" viewBox="0 0 640 512" fill="currentColor">
- <path d="M484.4 96C407 96 349.2 164.1 320 208.5C290.8 164.1 233 96 155.6 96C69.75 96 0 167.8 0 256s69.75 160 155.6 160C233.1 416 290.8 347.9 320 303.5C349.2 347.9 407 416 484.4 416C570.3 416 640 344.2 640 256S570.3 96 484.4 96zM155.6 368C96.25 368 48 317.8 48 256s48.25-112 107.6-112c67.75 0 120.5 82.25 137.1 112C276 285.8 223.4 368 155.6 368zM484.4 368c-67.75 0-120.5-82.25-137.1-112C364 226.2 416.6 144 484.4 144C543.8 144 592 194.2 592 256S543.8 368 484.4 368z" fill="currentColor"></path>
+ <path
+ d="M484.4 96C407 96 349.2 164.1 320 208.5C290.8 164.1 233 96 155.6 96C69.75 96 0 167.8 0 256s69.75 160 155.6 160C233.1 416 290.8 347.9 320 303.5C349.2 347.9 407 416 484.4 416C570.3 416 640 344.2 640 256S570.3 96 484.4 96zM155.6 368C96.25 368 48 317.8 48 256s48.25-112 107.6-112c67.75 0 120.5 82.25 137.1 112C276 285.8 223.4 368 155.6 368zM484.4 368c-67.75 0-120.5-82.25-137.1-112C364 226.2 416.6 144 484.4 144C543.8 144 592 194.2 592 256S543.8 368 484.4 368z"
+ fill="currentColor"></path>
</svg>
</a-tag>
</template>
@@ -165,7 +184,8 @@
<span :style="{ color: '#FF4D4F' }"> {{ i18n "delete"}}</span>
</a-menu-item>
<a-menu-item>
- <a-switch v-model="client.enable" size="small" @change="switchEnableClient(record.id, client, $event)"></a-switch>
+ <a-switch v-model="client.enable" size="small"
+ @change="switchEnableClient(record.id, client, $event)"></a-switch>
{{ i18n "enable"}}
</a-menu-item>
</a-menu>
@@ -179,9 +199,11 @@
<td colspan="3" :style="{ textAlign: 'center' }">{{ i18n "pages.inbounds.traffic" }}</td>
</tr>
<tr>
- <td width="80px" :style="{ margin: '0', textAlign: 'right', fontSize: '1em' }"> [[ SizeFormatter.sizeFormat(getUpStats(record, client.email) + getDownStats(record, client.email)) ]] </td>
+ <td width="80px" :style="{ margin: '0', textAlign: 'right', fontSize: '1em' }"> [[
+ SizeFormatter.sizeFormat(getUpStats(record, client.email) + getDownStats(record, client.email)) ]] </td>
<td width="120px" v-if="!client.enable">
- <a-progress :stroke-color="themeSwitcher.isDarkTheme ? 'rgb(72 84 105)' : '#bcbcbc'" :show-info="false" :percent="statsProgress(record, client.email)" />
+ <a-progress :stroke-color="themeSwitcher.isDarkTheme ? 'rgb(72 84 105)' : '#bcbcbc'" :show-info="false"
+ :percent="statsProgress(record, client.email)" />
</td>
<td width="120px" v-else-if="client.totalGB > 0">
<a-popover :overlay-class-name="themeSwitcher.currentTheme">
@@ -197,11 +219,14 @@
</tr>
</table>
</template>
- <a-progress :stroke-color="clientStatsColor(record, client.email)" :show-info="false" :status="isClientDepleted(record, client.email)? 'exception' : ''" :percent="statsProgress(record, client.email)" />
+ <a-progress :stroke-color="clientStatsColor(record, client.email)" :show-info="false"
+ :status="isClientDepleted(record, client.email)? 'exception' : ''"
+ :percent="statsProgress(record, client.email)" />
</a-popover>
</td>
<td width="120px" v-else class="infinite-bar">
- <a-progress :stroke-color="themeSwitcher.isDarkTheme ? '#2c1e32':'#F2EAF1'" :show-info="false" :percent="100"></a-progress>
+ <a-progress :stroke-color="themeSwitcher.isDarkTheme ? '#2c1e32':'#F2EAF1'" :show-info="false"
+ :percent="100"></a-progress>
</td>
<td width="80px">
<template v-if="client.totalGB > 0">[[ client._totalGB + "GB" ]]</template>
@@ -216,14 +241,16 @@
</tr>
<tr>
<template v-if="client.expiryTime !=0 && client.reset >0">
- <td width="80px" :style="{ margin: '0', textAlign: 'right', fontSize: '1em' }"> [[ IntlUtil.formatRelativeTime(client.expiryTime) ]] </td>
+ <td width="80px" :style="{ margin: '0', textAlign: 'right', fontSize: '1em' }"> [[
+ IntlUtil.formatRelativeTime(client.expiryTime) ]] </td>
<td width="120px" class="infinite-bar">
<a-popover :overlay-class-name="themeSwitcher.currentTheme">
<template slot="content">
<span v-if="client.expiryTime < 0">{{ i18n "pages.client.delayedStart" }}</span>
<span v-else>[[ IntlUtil.formatDate(client.expiryTime) ]]</span>
</template>
- <a-progress :show-info="false" :status="isClientDepleted(record, client.email)? 'exception' : ''" :percent="expireProgress(client.expiryTime, client.reset)" />
+ <a-progress :show-info="false" :status="isClientDepleted(record, client.email)? 'exception' : ''"
+ :percent="expireProgress(client.expiryTime, client.reset)" />
</a-popover>
</td>
<td width="60px">[[ client.reset + "d" ]]</td>
@@ -235,11 +262,16 @@
<span v-if="client.expiryTime < 0">{{ i18n "pages.client.delayedStart" }}</span>
<span v-else>[[ IntlUtil.formatDate(client.expiryTime) ]]</span>
</template>
- <a-tag :style="{ minWidth: '50px', border: 'none' }" :color="ColorUtils.userExpiryColor(app.expireDiff, client, themeSwitcher.isDarkTheme)"> [[ IntlUtil.formatRelativeTime(client.expiryTime) ]] </a-tag>
+ <a-tag :style="{ minWidth: '50px', border: 'none' }"
+ :color="ColorUtils.userExpiryColor(app.expireDiff, client, themeSwitcher.isDarkTheme)"> [[
+ IntlUtil.formatRelativeTime(client.expiryTime) ]] </a-tag>
</a-popover>
- <a-tag v-else :color="client.enable ? 'purple' : themeSwitcher.isDarkTheme ? '#2c3950' : '#bcbcbc'" class="infinite-tag">
+ <a-tag v-else :color="client.enable ? 'purple' : themeSwitcher.isDarkTheme ? '#2c3950' : '#bcbcbc'"
+ class="infinite-tag">
<svg height="10px" width="14px" viewBox="0 0 640 512" fill="currentColor">
- <path d="M484.4 96C407 96 349.2 164.1 320 208.5C290.8 164.1 233 96 155.6 96C69.75 96 0 167.8 0 256s69.75 160 155.6 160C233.1 416 290.8 347.9 320 303.5C349.2 347.9 407 416 484.4 416C570.3 416 640 344.2 640 256S570.3 96 484.4 96zM155.6 368C96.25 368 48 317.8 48 256s48.25-112 107.6-112c67.75 0 120.5 82.25 137.1 112C276 285.8 223.4 368 155.6 368zM484.4 368c-67.75 0-120.5-82.25-137.1-112C364 226.2 416.6 144 484.4 144C543.8 144 592 194.2 592 256S543.8 368 484.4 368z" fill="currentColor"></path>
+ <path
+ d="M484.4 96C407 96 349.2 164.1 320 208.5C290.8 164.1 233 96 155.6 96C69.75 96 0 167.8 0 256s69.75 160 155.6 160C233.1 416 290.8 347.9 320 303.5C349.2 347.9 407 416 484.4 416C570.3 416 640 344.2 640 256S570.3 96 484.4 96zM155.6 368C96.25 368 48 317.8 48 256s48.25-112 107.6-112c67.75 0 120.5 82.25 137.1 112C276 285.8 223.4 368 155.6 368zM484.4 368c-67.75 0-120.5-82.25-137.1-112C364 226.2 416.6 144 484.4 144C543.8 144 592 194.2 592 256S543.8 368 484.4 368z"
+ fill="currentColor"></path>
</svg>
</a-tag>
</template>
@@ -248,7 +280,8 @@
</table>
</template>
<a-badge>
- <a-icon v-if="!client.enable" slot="count" type="pause-circle" theme="filled" :style="{ color: themeSwitcher.isDarkTheme ? '#2c3950' : '#bcbcbc' }"></a-icon>
+ <a-icon v-if="!client.enable" slot="count" type="pause-circle" theme="filled"
+ :style="{ color: themeSwitcher.isDarkTheme ? '#2c3950' : '#bcbcbc' }"></a-icon>