feat(ui): use the host as the browser tab title prefix
This commit is contained in:
@@ -3,7 +3,7 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<title>3x-ui · API Docs</title>
|
<title>API Docs</title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="message"></div>
|
<div id="message"></div>
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<title>3x-ui · Inbounds</title>
|
<title>Inbounds</title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="message"></div>
|
<div id="message"></div>
|
||||||
|
|||||||
+1
-1
@@ -3,7 +3,7 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<title>3x-ui</title>
|
<title>Overview</title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="message"></div>
|
<div id="message"></div>
|
||||||
|
|||||||
+1
-1
@@ -4,7 +4,7 @@
|
|||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<meta name="robots" content="noindex,nofollow" />
|
<meta name="robots" content="noindex,nofollow" />
|
||||||
<title>3x-ui — Sign in</title>
|
<title>Sign in</title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="message"></div>
|
<div id="message"></div>
|
||||||
|
|||||||
+1
-1
@@ -3,7 +3,7 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<title>3x-ui · Nodes</title>
|
<title>Nodes</title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="message"></div>
|
<div id="message"></div>
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<title>3x-ui · Settings</title>
|
<title>Settings</title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="message"></div>
|
<div id="message"></div>
|
||||||
|
|||||||
@@ -5,9 +5,11 @@ import 'ant-design-vue/dist/reset.css';
|
|||||||
import { setupAxios } from '@/api/axios-init.js';
|
import { setupAxios } from '@/api/axios-init.js';
|
||||||
import '@/composables/useTheme.js';
|
import '@/composables/useTheme.js';
|
||||||
import { i18n } from '@/i18n/index.js';
|
import { i18n } from '@/i18n/index.js';
|
||||||
|
import { applyDocumentTitle } from '@/utils';
|
||||||
import ApiDocsPage from '@/pages/api-docs/ApiDocsPage.vue';
|
import ApiDocsPage from '@/pages/api-docs/ApiDocsPage.vue';
|
||||||
|
|
||||||
setupAxios();
|
setupAxios();
|
||||||
|
applyDocumentTitle();
|
||||||
|
|
||||||
const messageContainer = document.getElementById('message');
|
const messageContainer = document.getElementById('message');
|
||||||
if (messageContainer) {
|
if (messageContainer) {
|
||||||
|
|||||||
@@ -5,9 +5,11 @@ import 'ant-design-vue/dist/reset.css';
|
|||||||
import { setupAxios } from '@/api/axios-init.js';
|
import { setupAxios } from '@/api/axios-init.js';
|
||||||
import '@/composables/useTheme.js';
|
import '@/composables/useTheme.js';
|
||||||
import { i18n } from '@/i18n/index.js';
|
import { i18n } from '@/i18n/index.js';
|
||||||
|
import { applyDocumentTitle } from '@/utils';
|
||||||
import InboundsPage from '@/pages/inbounds/InboundsPage.vue';
|
import InboundsPage from '@/pages/inbounds/InboundsPage.vue';
|
||||||
|
|
||||||
setupAxios();
|
setupAxios();
|
||||||
|
applyDocumentTitle();
|
||||||
|
|
||||||
const messageContainer = document.getElementById('message');
|
const messageContainer = document.getElementById('message');
|
||||||
if (messageContainer) {
|
if (messageContainer) {
|
||||||
|
|||||||
@@ -7,9 +7,11 @@ import { setupAxios } from '@/api/axios-init.js';
|
|||||||
// stored theme to <body>/<html> before Vue mounts.
|
// stored theme to <body>/<html> before Vue mounts.
|
||||||
import '@/composables/useTheme.js';
|
import '@/composables/useTheme.js';
|
||||||
import { i18n } from '@/i18n/index.js';
|
import { i18n } from '@/i18n/index.js';
|
||||||
|
import { applyDocumentTitle } from '@/utils';
|
||||||
import IndexPage from '@/pages/index/IndexPage.vue';
|
import IndexPage from '@/pages/index/IndexPage.vue';
|
||||||
|
|
||||||
setupAxios();
|
setupAxios();
|
||||||
|
applyDocumentTitle();
|
||||||
|
|
||||||
const messageContainer = document.getElementById('message');
|
const messageContainer = document.getElementById('message');
|
||||||
if (messageContainer) {
|
if (messageContainer) {
|
||||||
|
|||||||
@@ -7,9 +7,11 @@ import { setupAxios } from '@/api/axios-init.js';
|
|||||||
// stored theme to <body>/<html> before Vue renders anything.
|
// stored theme to <body>/<html> before Vue renders anything.
|
||||||
import '@/composables/useTheme.js';
|
import '@/composables/useTheme.js';
|
||||||
import { i18n } from '@/i18n/index.js';
|
import { i18n } from '@/i18n/index.js';
|
||||||
|
import { applyDocumentTitle } from '@/utils';
|
||||||
import LoginPage from '@/pages/login/LoginPage.vue';
|
import LoginPage from '@/pages/login/LoginPage.vue';
|
||||||
|
|
||||||
setupAxios();
|
setupAxios();
|
||||||
|
applyDocumentTitle();
|
||||||
|
|
||||||
// Toasts attach to a #message div the page provides — keeps theme
|
// Toasts attach to a #message div the page provides — keeps theme
|
||||||
// styling in sync with the rest of the panel.
|
// styling in sync with the rest of the panel.
|
||||||
|
|||||||
@@ -5,9 +5,11 @@ import 'ant-design-vue/dist/reset.css';
|
|||||||
import { setupAxios } from '@/api/axios-init.js';
|
import { setupAxios } from '@/api/axios-init.js';
|
||||||
import '@/composables/useTheme.js';
|
import '@/composables/useTheme.js';
|
||||||
import { i18n } from '@/i18n/index.js';
|
import { i18n } from '@/i18n/index.js';
|
||||||
|
import { applyDocumentTitle } from '@/utils';
|
||||||
import NodesPage from '@/pages/nodes/NodesPage.vue';
|
import NodesPage from '@/pages/nodes/NodesPage.vue';
|
||||||
|
|
||||||
setupAxios();
|
setupAxios();
|
||||||
|
applyDocumentTitle();
|
||||||
|
|
||||||
const messageContainer = document.getElementById('message');
|
const messageContainer = document.getElementById('message');
|
||||||
if (messageContainer) {
|
if (messageContainer) {
|
||||||
|
|||||||
@@ -7,9 +7,11 @@ import { setupAxios } from '@/api/axios-init.js';
|
|||||||
// stored theme to <body>/<html> before Vue mounts.
|
// stored theme to <body>/<html> before Vue mounts.
|
||||||
import '@/composables/useTheme.js';
|
import '@/composables/useTheme.js';
|
||||||
import { i18n } from '@/i18n/index.js';
|
import { i18n } from '@/i18n/index.js';
|
||||||
|
import { applyDocumentTitle } from '@/utils';
|
||||||
import SettingsPage from '@/pages/settings/SettingsPage.vue';
|
import SettingsPage from '@/pages/settings/SettingsPage.vue';
|
||||||
|
|
||||||
setupAxios();
|
setupAxios();
|
||||||
|
applyDocumentTitle();
|
||||||
|
|
||||||
const messageContainer = document.getElementById('message');
|
const messageContainer = document.getElementById('message');
|
||||||
if (messageContainer) {
|
if (messageContainer) {
|
||||||
|
|||||||
@@ -5,9 +5,11 @@ import 'ant-design-vue/dist/reset.css';
|
|||||||
import { setupAxios } from '@/api/axios-init.js';
|
import { setupAxios } from '@/api/axios-init.js';
|
||||||
import '@/composables/useTheme.js';
|
import '@/composables/useTheme.js';
|
||||||
import { i18n } from '@/i18n/index.js';
|
import { i18n } from '@/i18n/index.js';
|
||||||
|
import { applyDocumentTitle } from '@/utils';
|
||||||
import XrayPage from '@/pages/xray/XrayPage.vue';
|
import XrayPage from '@/pages/xray/XrayPage.vue';
|
||||||
|
|
||||||
setupAxios();
|
setupAxios();
|
||||||
|
applyDocumentTitle();
|
||||||
|
|
||||||
const messageContainer = document.getElementById('message');
|
const messageContainer = document.getElementById('message');
|
||||||
if (messageContainer) {
|
if (messageContainer) {
|
||||||
|
|||||||
@@ -75,6 +75,13 @@ export class HttpUtil {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function applyDocumentTitle() {
|
||||||
|
const host = window.location.hostname;
|
||||||
|
if (!host) return;
|
||||||
|
const current = document.title.trim();
|
||||||
|
document.title = current ? `${host} - ${current}` : host;
|
||||||
|
}
|
||||||
|
|
||||||
export class PromiseUtil {
|
export class PromiseUtil {
|
||||||
static async sleep(timeout) {
|
static async sleep(timeout) {
|
||||||
await new Promise(resolve => {
|
await new Promise(resolve => {
|
||||||
|
|||||||
+1
-1
@@ -3,7 +3,7 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<title>3x-ui · Xray</title>
|
<title>Xray Config</title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="message"></div>
|
<div id="message"></div>
|
||||||
|
|||||||
Reference in New Issue
Block a user