feat: integrate robot logo into web admin and Flutter app

- Add logo.svg (green robot character) to project root
- Web admin: replace text "IT" badge with SVG logo in sidebar
- Web admin: add logo image to login, register, invite pages
- Web admin: add SVG favicon and apple-touch-icon metadata
- Flutter: add flutter_svg dependency, replace text "IT0" with logo on login page

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
hailin 2026-02-22 06:17:08 -08:00
parent 660616b08b
commit 2f228e4591
11 changed files with 161 additions and 6 deletions

View File

@ -0,0 +1,33 @@
<svg width="64" height="64" viewBox="90 30 220 290" fill="none" xmlns="http://www.w3.org/2000/svg">
<!-- Antenna stick -->
<line x1="200" y1="88" x2="200" y2="58" stroke="#3CC98C" stroke-width="7" stroke-linecap="round"/>
<!-- Antenna ball -->
<circle cx="200" cy="50" r="12" fill="#3CC98C"/>
<!-- Ear left -->
<rect x="108" y="148" width="20" height="46" rx="10" fill="#3CC98C"/>
<!-- Ear right -->
<rect x="272" y="148" width="20" height="46" rx="10" fill="#3CC98C"/>
<!-- Head -->
<rect x="120" y="88" width="160" height="144" rx="46" fill="#3CC98C"/>
<!-- Left eye white -->
<rect x="156" y="144" width="32" height="32" rx="10" fill="#ffffff"/>
<!-- Left pupil -->
<rect x="164" y="152" width="14" height="14" rx="4" fill="#2a5e45"/>
<!-- Right eye white -->
<rect x="212" y="144" width="32" height="32" rx="10" fill="#ffffff"/>
<!-- Right pupil -->
<rect x="220" y="152" width="14" height="14" rx="4" fill="#2a5e45"/>
<!-- Smile -->
<path d="M 172 200 Q 200 228 228 200" stroke="#ffffff" stroke-width="6" fill="none" stroke-linecap="round"/>
<!-- Body -->
<rect x="152" y="244" width="96" height="56" rx="12" fill="#3CC98C"/>
<!-- Tie -->
<rect x="192" y="244" width="16" height="30" rx="5" fill="#ffffff"/>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -0,0 +1,39 @@
<svg width="400" height="400" viewBox="0 0 400 400" fill="none" xmlns="http://www.w3.org/2000/svg">
<!-- Background -->
<rect width="400" height="400" fill="#ffffff"/>
<!-- Antenna stick -->
<line x1="200" y1="88" x2="200" y2="58" stroke="#3CC98C" stroke-width="7" stroke-linecap="round"/>
<!-- Antenna ball -->
<circle cx="200" cy="50" r="12" fill="#3CC98C"/>
<!-- Ear left -->
<rect x="108" y="148" width="20" height="46" rx="10" fill="#3CC98C"/>
<!-- Ear right -->
<rect x="272" y="148" width="20" height="46" rx="10" fill="#3CC98C"/>
<!-- Head -->
<rect x="120" y="88" width="160" height="144" rx="46" fill="#3CC98C"/>
<!-- Left eye white -->
<rect x="156" y="144" width="32" height="32" rx="10" fill="#ffffff"/>
<!-- Left pupil -->
<rect x="164" y="152" width="14" height="14" rx="4" fill="#2a5e45"/>
<!-- Right eye white -->
<rect x="212" y="144" width="32" height="32" rx="10" fill="#ffffff"/>
<!-- Right pupil -->
<rect x="220" y="152" width="14" height="14" rx="4" fill="#2a5e45"/>
<!-- Smile -->
<path d="M 172 200 Q 200 228 228 200" stroke="#ffffff" stroke-width="6" fill="none" stroke-linecap="round"/>
<!-- Body -->
<rect x="152" y="244" width="96" height="56" rx="12" fill="#3CC98C"/>
<!-- Tie -->
<rect x="192" y="244" width="16" height="30" rx="5" fill="#ffffff"/>
<!-- Text -->
<text x="200" y="340" text-anchor="middle" font-family="'Helvetica Neue', Arial, sans-serif" font-size="24" font-weight="700" letter-spacing="6" fill="#3CC98C">AI AGENT</text>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -111,6 +111,7 @@ export default function AcceptInvitePage() {
return (
<div className="w-full max-w-md p-8 space-y-6 bg-card rounded-lg border">
<div className="text-center">
<img src="/icons/logo.svg" alt="IT0" className="w-20 h-20 mx-auto mb-2" />
<h1 className="text-3xl font-bold">{t('appTitle')}</h1>
<p className="text-muted-foreground mt-2">{t('inviteTitle')}</p>
</div>

View File

@ -53,6 +53,7 @@ export default function LoginPage() {
return (
<div className="w-full max-w-md p-8 space-y-6 bg-card rounded-lg border">
<div className="text-center">
<img src="/icons/logo.svg" alt="IT0" className="w-20 h-20 mx-auto mb-2" />
<h1 className="text-3xl font-bold">{t('appTitle')}</h1>
<p className="text-muted-foreground mt-2">{t('adminConsole')}</p>
</div>

View File

@ -71,6 +71,7 @@ export default function RegisterPage() {
return (
<div className="w-full max-w-md p-8 space-y-6 bg-card rounded-lg border">
<div className="text-center">
<img src="/icons/logo.svg" alt="IT0" className="w-20 h-20 mx-auto mb-2" />
<h1 className="text-3xl font-bold">{t('appTitle')}</h1>
<p className="text-muted-foreground mt-2">{t('createAccount')}</p>
</div>

View File

@ -8,6 +8,7 @@ const inter = Inter({ subsets: ['latin'] });
export const metadata: Metadata = {
title: 'IT0 Admin Console',
description: 'IT Operations Intelligent Agent - Administration Console',
icons: { icon: '/icons/favicon.svg', apple: '/icons/logo.svg' },
};
export default function RootLayout({

View File

@ -167,9 +167,7 @@ export function Sidebar() {
{/* Logo area */}
<div className={cn('border-b flex items-center', collapsed ? 'px-3 py-4 justify-center' : 'px-4 py-4')}>
<div className="flex items-center gap-2.5 min-w-0">
<div className="w-8 h-8 rounded-lg bg-primary/15 flex items-center justify-center shrink-0">
<span className="text-primary font-bold text-sm">IT</span>
</div>
<img src="/icons/favicon.svg" alt="IT0" className="w-8 h-8 shrink-0" />
{!collapsed && (
<div className="min-w-0">
<h1 className="text-sm font-semibold tracking-tight truncate">{t('appName')}</h1>

View File

@ -0,0 +1,39 @@
<svg width="400" height="400" viewBox="0 0 400 400" fill="none" xmlns="http://www.w3.org/2000/svg">
<!-- Background -->
<rect width="400" height="400" fill="#ffffff"/>
<!-- Antenna stick -->
<line x1="200" y1="88" x2="200" y2="58" stroke="#3CC98C" stroke-width="7" stroke-linecap="round"/>
<!-- Antenna ball -->
<circle cx="200" cy="50" r="12" fill="#3CC98C"/>
<!-- Ear left -->
<rect x="108" y="148" width="20" height="46" rx="10" fill="#3CC98C"/>
<!-- Ear right -->
<rect x="272" y="148" width="20" height="46" rx="10" fill="#3CC98C"/>
<!-- Head -->
<rect x="120" y="88" width="160" height="144" rx="46" fill="#3CC98C"/>
<!-- Left eye white -->
<rect x="156" y="144" width="32" height="32" rx="10" fill="#ffffff"/>
<!-- Left pupil -->
<rect x="164" y="152" width="14" height="14" rx="4" fill="#2a5e45"/>
<!-- Right eye white -->
<rect x="212" y="144" width="32" height="32" rx="10" fill="#ffffff"/>
<!-- Right pupil -->
<rect x="220" y="152" width="14" height="14" rx="4" fill="#2a5e45"/>
<!-- Smile -->
<path d="M 172 200 Q 200 228 228 200" stroke="#ffffff" stroke-width="6" fill="none" stroke-linecap="round"/>
<!-- Body -->
<rect x="152" y="244" width="96" height="56" rx="12" fill="#3CC98C"/>
<!-- Tie -->
<rect x="192" y="244" width="16" height="30" rx="5" fill="#ffffff"/>
<!-- Text -->
<text x="200" y="340" text-anchor="middle" font-family="'Helvetica Neue', Arial, sans-serif" font-size="24" font-weight="700" letter-spacing="6" fill="#3CC98C">AI AGENT</text>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -1,5 +1,6 @@
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:go_router/go_router.dart';
import '../../../../core/theme/app_colors.dart';
import '../../data/providers/auth_provider.dart';
@ -30,9 +31,10 @@ class _LoginPageState extends ConsumerState<LoginPage> {
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
const Text(
'IT0',
style: TextStyle(fontSize: 48, fontWeight: FontWeight.bold),
SvgPicture.asset(
'assets/icons/logo.svg',
width: 100,
height: 100,
),
const SizedBox(height: 8),
const Text(

View File

@ -34,6 +34,7 @@ dependencies:
# UI
fl_chart: ^0.67.0
flutter_markdown: ^0.7.0
flutter_svg: ^2.0.10+1
# Push Notifications
firebase_core: ^2.27.0

39
logo.svg Normal file
View File

@ -0,0 +1,39 @@
<svg width="400" height="400" viewBox="0 0 400 400" fill="none" xmlns="http://www.w3.org/2000/svg">
<!-- Background -->
<rect width="400" height="400" fill="#ffffff"/>
<!-- Antenna stick -->
<line x1="200" y1="88" x2="200" y2="58" stroke="#3CC98C" stroke-width="7" stroke-linecap="round"/>
<!-- Antenna ball -->
<circle cx="200" cy="50" r="12" fill="#3CC98C"/>
<!-- Ear left -->
<rect x="108" y="148" width="20" height="46" rx="10" fill="#3CC98C"/>
<!-- Ear right -->
<rect x="272" y="148" width="20" height="46" rx="10" fill="#3CC98C"/>
<!-- Head -->
<rect x="120" y="88" width="160" height="144" rx="46" fill="#3CC98C"/>
<!-- Left eye white -->
<rect x="156" y="144" width="32" height="32" rx="10" fill="#ffffff"/>
<!-- Left pupil -->
<rect x="164" y="152" width="14" height="14" rx="4" fill="#2a5e45"/>
<!-- Right eye white -->
<rect x="212" y="144" width="32" height="32" rx="10" fill="#ffffff"/>
<!-- Right pupil -->
<rect x="220" y="152" width="14" height="14" rx="4" fill="#2a5e45"/>
<!-- Smile -->
<path d="M 172 200 Q 200 228 228 200" stroke="#ffffff" stroke-width="6" fill="none" stroke-linecap="round"/>
<!-- Body -->
<rect x="152" y="244" width="96" height="56" rx="12" fill="#3CC98C"/>
<!-- Tie -->
<rect x="192" y="244" width="16" height="30" rx="5" fill="#ffffff"/>
<!-- Text -->
<text x="200" y="340" text-anchor="middle" font-family="'Helvetica Neue', Arial, sans-serif" font-size="24" font-weight="700" letter-spacing="6" fill="#3CC98C">AI AGENT</text>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB