mirror of
https://github.com/Buriburizaem0n/nezha-dash-v1.git
synced 2026-05-06 13:58:43 +00:00
feat: integrate custom branding, time-based themes, and LXGW font directly into frontend
This commit is contained in:
+1
-2
@@ -44,8 +44,7 @@ const MainApp: React.FC = () => {
|
|||||||
|
|
||||||
// 检测是否强制指定了主题颜色
|
// 检测是否强制指定了主题颜色
|
||||||
const forceTheme =
|
const forceTheme =
|
||||||
// @ts-expect-error ForceTheme is a global variable
|
window.ForceTheme as string !== "" ? window.ForceTheme : undefined;
|
||||||
(window.ForceTheme as string) !== "" ? window.ForceTheme : undefined;
|
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (forceTheme === "dark" || forceTheme === "light") {
|
if (forceTheme === "dark" || forceTheme === "light") {
|
||||||
|
|||||||
@@ -70,10 +70,8 @@ function Header() {
|
|||||||
|
|
||||||
const siteName = settingData?.data?.config?.site_name;
|
const siteName = settingData?.data?.config?.site_name;
|
||||||
|
|
||||||
// @ts-expect-error CustomLogo is a global variable
|
|
||||||
const customLogo = window.CustomLogo || "/apple-touch-icon.png";
|
const customLogo = window.CustomLogo || "/apple-touch-icon.png";
|
||||||
|
|
||||||
// @ts-expect-error CustomDesc is a global variable
|
|
||||||
const customDesc = window.CustomDesc || t("nezha");
|
const customDesc = window.CustomDesc || t("nezha");
|
||||||
|
|
||||||
const customMobileBackgroundImage =
|
const customMobileBackgroundImage =
|
||||||
@@ -208,7 +206,6 @@ type links = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
function Links() {
|
function Links() {
|
||||||
// @ts-expect-error CustomLinks is a global variable
|
|
||||||
const customLinks = window.CustomLinks as string;
|
const customLinks = window.CustomLinks as string;
|
||||||
|
|
||||||
const links: links[] | null = customLinks ? JSON.parse(customLinks) : null;
|
const links: links[] | null = customLinks ? JSON.parse(customLinks) : null;
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
@import "tailwindcss";
|
@import "tailwindcss";
|
||||||
|
@import url("https://cdn.jsdelivr.net/npm/lxgw-wenkai-screen-webfont@1.7.0/style.css");
|
||||||
|
|
||||||
@plugin "tailwindcss-animate";
|
@plugin "tailwindcss-animate";
|
||||||
|
|
||||||
@@ -189,6 +190,7 @@
|
|||||||
@layer base {
|
@layer base {
|
||||||
* {
|
* {
|
||||||
@apply border-border;
|
@apply border-border;
|
||||||
|
font-family: 'LXGW WenKai Screen', sans-serif !important;
|
||||||
}
|
}
|
||||||
html {
|
html {
|
||||||
@apply scroll-smooth;
|
@apply scroll-smooth;
|
||||||
@@ -199,6 +201,9 @@
|
|||||||
font-synthesis-weight: none;
|
font-synthesis-weight: none;
|
||||||
text-rendering: optimizeLegibility;
|
text-rendering: optimizeLegibility;
|
||||||
}
|
}
|
||||||
|
h1, h2, h3, h4, h5, h6 {
|
||||||
|
font-family: 'LXGW WenKai Screen', sans-serif !important;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@layer base {
|
@layer base {
|
||||||
@@ -381,3 +386,22 @@
|
|||||||
filter: blur(2px);
|
filter: blur(2px);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Custom background overlays */
|
||||||
|
.bg-cover::after {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
inset: 0;
|
||||||
|
pointer-events: none;
|
||||||
|
transition: backdrop-filter 0.3s ease, background 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dark .bg-cover::after {
|
||||||
|
backdrop-filter: blur(8px);
|
||||||
|
background: rgba(0, 0, 0, .6);
|
||||||
|
}
|
||||||
|
|
||||||
|
.light .bg-cover::after {
|
||||||
|
backdrop-filter: blur(0);
|
||||||
|
background: rgba(255, 255, 255, .3);
|
||||||
|
}
|
||||||
|
|||||||
@@ -0,0 +1,38 @@
|
|||||||
|
import { DateTime } from "luxon";
|
||||||
|
|
||||||
|
export function initCustomConfig() {
|
||||||
|
try {
|
||||||
|
const hour = DateTime.now().hour;
|
||||||
|
const isNight = hour >= 18 || hour < 6;
|
||||||
|
|
||||||
|
// Use default values if window variables are not already set (e.g. by backend custom_code)
|
||||||
|
// although the goal is to hardcode these for "consistency".
|
||||||
|
|
||||||
|
window.CustomBackgroundImage = isNight
|
||||||
|
? 'https://loohui.com/wp-content/uploads/images/background.jpg'
|
||||||
|
: 'https://loohui.com/wp-content/uploads/images/background_day.jpg';
|
||||||
|
|
||||||
|
window.CustomMobileBackgroundImage = window.CustomBackgroundImage;
|
||||||
|
window.ForceTheme = isNight ? 'dark' : 'light';
|
||||||
|
|
||||||
|
/* LOGO / 副标题 / 链接 */
|
||||||
|
window.CustomLogo = 'https://loohui.com/wp-content/uploads/images/pet.png';
|
||||||
|
window.CustomDesc = '树树皆秋色,山山唯落晖';
|
||||||
|
window.CustomLinks = JSON.stringify([
|
||||||
|
{ "link": "https://loohui.com/", "name": "返回Blog", "blank": false }
|
||||||
|
]);
|
||||||
|
|
||||||
|
// Handle internal redirects if needed
|
||||||
|
document.addEventListener('click', (e: MouseEvent) => {
|
||||||
|
const target = e.target as HTMLElement;
|
||||||
|
const a = target.closest('a');
|
||||||
|
if (a && a.href === 'https://loohui.com/') {
|
||||||
|
e.preventDefault();
|
||||||
|
window.location.href = a.href;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
} catch (e) {
|
||||||
|
console.error('[Nezha custom_config] crash:', e);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -12,9 +12,12 @@ import { SortProvider } from "./context/sort-provider";
|
|||||||
import { StatusProvider } from "./context/status-provider";
|
import { StatusProvider } from "./context/status-provider";
|
||||||
import { TooltipProvider } from "./context/tooltip-provider";
|
import { TooltipProvider } from "./context/tooltip-provider";
|
||||||
import { WebSocketProvider } from "./context/websocket-provider";
|
import { WebSocketProvider } from "./context/websocket-provider";
|
||||||
|
import { initCustomConfig } from "./lib/custom-config";
|
||||||
import "./i18n";
|
import "./i18n";
|
||||||
import "./index.css";
|
import "./index.css";
|
||||||
|
|
||||||
|
initCustomConfig();
|
||||||
|
|
||||||
const queryClient = new QueryClient();
|
const queryClient = new QueryClient();
|
||||||
|
|
||||||
const rootElement = document.getElementById("root");
|
const rootElement = document.getElementById("root");
|
||||||
|
|||||||
Vendored
+13
@@ -1 +1,14 @@
|
|||||||
/// <reference types="vite/client" />
|
/// <reference types="vite/client" />
|
||||||
|
|
||||||
|
interface Window {
|
||||||
|
CustomBackgroundImage: string;
|
||||||
|
CustomMobileBackgroundImage: string;
|
||||||
|
ForceTheme: string;
|
||||||
|
CustomLogo: string;
|
||||||
|
CustomDesc: string;
|
||||||
|
CustomLinks: string;
|
||||||
|
ForceShowServices: boolean;
|
||||||
|
ForceCardInline: boolean;
|
||||||
|
ForceShowMap: boolean;
|
||||||
|
ForcePeakCutEnabled: boolean;
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user