feat: add branding assets and favicon support across admin-web and desktop-client
Add NexaVPN logo images (full logo and mark-only variants) to admin-web and desktop-client public directories. Add favicon.ico and favicon.png to admin-web, and icon.png to desktop-client. Update index.html files to reference favicon assets. Add icon.png and icon.ico to desktop-client Tauri icons directory and configure bundle.icon in tauri.conf.json. Update Layout component to display logo in sidebar brand-block with
This commit is contained in:
@@ -14,9 +14,13 @@ export function Layout() {
|
||||
return (
|
||||
<div className="shell">
|
||||
<aside className="sidebar">
|
||||
<div>
|
||||
<p className="eyebrow">NexaVPN</p>
|
||||
<h1>Control Plane</h1>
|
||||
<div className="brand-block">
|
||||
<img className="brand-logo brand-logo-full" src="/NexaVPN_Logo.png" alt="NexaVPN" />
|
||||
<div className="brand-copy">
|
||||
<p className="eyebrow">NexaVPN</p>
|
||||
<h1>Control Plane</h1>
|
||||
<p className="brand-tagline">Remote access orchestration for your private WireGuard edge.</p>
|
||||
</div>
|
||||
</div>
|
||||
<nav className="nav">
|
||||
{items.map(([label, path]) => (
|
||||
@@ -32,9 +36,12 @@ export function Layout() {
|
||||
</aside>
|
||||
<main className="content">
|
||||
<header className="topbar">
|
||||
<div>
|
||||
<p className="eyebrow">Enterprise WireGuard</p>
|
||||
<h2>Self-hosted VPN management</h2>
|
||||
<div className="topbar-brand">
|
||||
<img className="brand-logo brand-logo-mark" src="/NexaVPN_Logo_Only.png" alt="NexaVPN mark" />
|
||||
<div>
|
||||
<p className="eyebrow">Enterprise WireGuard</p>
|
||||
<h2>Self-hosted VPN management</h2>
|
||||
</div>
|
||||
</div>
|
||||
<div className="pill">Secure by design</div>
|
||||
</header>
|
||||
|
||||
@@ -58,8 +58,13 @@ export function LoginPage({ onAuthenticated }: LoginPageProps) {
|
||||
return (
|
||||
<div className="auth-shell">
|
||||
<form className="auth-card" onSubmit={onSubmit}>
|
||||
<p className="eyebrow">NexaVPN Admin</p>
|
||||
<h2>{mode === "login" ? "Sign in" : "Create initial admin"}</h2>
|
||||
<div className="auth-brand">
|
||||
<img className="brand-logo brand-logo-full" src="/NexaVPN_Logo.png" alt="NexaVPN" />
|
||||
<div>
|
||||
<p className="eyebrow">NexaVPN Admin</p>
|
||||
<h2>{mode === "login" ? "Sign in" : "Create initial admin"}</h2>
|
||||
</div>
|
||||
</div>
|
||||
<p className="auth-copy">
|
||||
{mode === "login"
|
||||
? "Use your NexaVPN admin credentials."
|
||||
|
||||
@@ -61,6 +61,45 @@ button {
|
||||
backdrop-filter: blur(12px);
|
||||
}
|
||||
|
||||
.auth-brand,
|
||||
.brand-block,
|
||||
.topbar-brand {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 16px;
|
||||
}
|
||||
|
||||
.brand-block {
|
||||
align-items: flex-start;
|
||||
}
|
||||
|
||||
.brand-copy {
|
||||
display: grid;
|
||||
gap: 6px;
|
||||
}
|
||||
|
||||
.brand-tagline {
|
||||
margin: 0;
|
||||
color: var(--muted);
|
||||
max-width: 240px;
|
||||
line-height: 1.5;
|
||||
}
|
||||
|
||||
.brand-logo {
|
||||
display: block;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
.brand-logo-full {
|
||||
width: min(100%, 220px);
|
||||
}
|
||||
|
||||
.brand-logo-mark {
|
||||
width: 48px;
|
||||
border-radius: 14px;
|
||||
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.18);
|
||||
}
|
||||
|
||||
.auth-card label {
|
||||
display: grid;
|
||||
gap: 8px;
|
||||
@@ -258,6 +297,18 @@ button {
|
||||
border-bottom: 1px solid var(--line);
|
||||
}
|
||||
|
||||
.auth-brand,
|
||||
.brand-block,
|
||||
.topbar-brand,
|
||||
.page-header {
|
||||
align-items: flex-start;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.brand-logo-full {
|
||||
width: min(100%, 200px);
|
||||
}
|
||||
|
||||
.grid.two,
|
||||
.grid.three {
|
||||
grid-template-columns: 1fr;
|
||||
|
||||
Reference in New Issue
Block a user