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:
parent
660616b08b
commit
2f228e4591
|
|
@ -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 |
|
|
@ -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 |
|
|
@ -111,6 +111,7 @@ export default function AcceptInvitePage() {
|
||||||
return (
|
return (
|
||||||
<div className="w-full max-w-md p-8 space-y-6 bg-card rounded-lg border">
|
<div className="w-full max-w-md p-8 space-y-6 bg-card rounded-lg border">
|
||||||
<div className="text-center">
|
<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>
|
<h1 className="text-3xl font-bold">{t('appTitle')}</h1>
|
||||||
<p className="text-muted-foreground mt-2">{t('inviteTitle')}</p>
|
<p className="text-muted-foreground mt-2">{t('inviteTitle')}</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -53,6 +53,7 @@ export default function LoginPage() {
|
||||||
return (
|
return (
|
||||||
<div className="w-full max-w-md p-8 space-y-6 bg-card rounded-lg border">
|
<div className="w-full max-w-md p-8 space-y-6 bg-card rounded-lg border">
|
||||||
<div className="text-center">
|
<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>
|
<h1 className="text-3xl font-bold">{t('appTitle')}</h1>
|
||||||
<p className="text-muted-foreground mt-2">{t('adminConsole')}</p>
|
<p className="text-muted-foreground mt-2">{t('adminConsole')}</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -71,6 +71,7 @@ export default function RegisterPage() {
|
||||||
return (
|
return (
|
||||||
<div className="w-full max-w-md p-8 space-y-6 bg-card rounded-lg border">
|
<div className="w-full max-w-md p-8 space-y-6 bg-card rounded-lg border">
|
||||||
<div className="text-center">
|
<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>
|
<h1 className="text-3xl font-bold">{t('appTitle')}</h1>
|
||||||
<p className="text-muted-foreground mt-2">{t('createAccount')}</p>
|
<p className="text-muted-foreground mt-2">{t('createAccount')}</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@ const inter = Inter({ subsets: ['latin'] });
|
||||||
export const metadata: Metadata = {
|
export const metadata: Metadata = {
|
||||||
title: 'IT0 Admin Console',
|
title: 'IT0 Admin Console',
|
||||||
description: 'IT Operations Intelligent Agent - Administration Console',
|
description: 'IT Operations Intelligent Agent - Administration Console',
|
||||||
|
icons: { icon: '/icons/favicon.svg', apple: '/icons/logo.svg' },
|
||||||
};
|
};
|
||||||
|
|
||||||
export default function RootLayout({
|
export default function RootLayout({
|
||||||
|
|
|
||||||
|
|
@ -167,9 +167,7 @@ export function Sidebar() {
|
||||||
{/* Logo area */}
|
{/* Logo area */}
|
||||||
<div className={cn('border-b flex items-center', collapsed ? 'px-3 py-4 justify-center' : 'px-4 py-4')}>
|
<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="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">
|
<img src="/icons/favicon.svg" alt="IT0" className="w-8 h-8 shrink-0" />
|
||||||
<span className="text-primary font-bold text-sm">IT</span>
|
|
||||||
</div>
|
|
||||||
{!collapsed && (
|
{!collapsed && (
|
||||||
<div className="min-w-0">
|
<div className="min-w-0">
|
||||||
<h1 className="text-sm font-semibold tracking-tight truncate">{t('appName')}</h1>
|
<h1 className="text-sm font-semibold tracking-tight truncate">{t('appName')}</h1>
|
||||||
|
|
|
||||||
|
|
@ -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 |
|
|
@ -1,5 +1,6 @@
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||||
|
import 'package:flutter_svg/flutter_svg.dart';
|
||||||
import 'package:go_router/go_router.dart';
|
import 'package:go_router/go_router.dart';
|
||||||
import '../../../../core/theme/app_colors.dart';
|
import '../../../../core/theme/app_colors.dart';
|
||||||
import '../../data/providers/auth_provider.dart';
|
import '../../data/providers/auth_provider.dart';
|
||||||
|
|
@ -30,9 +31,10 @@ class _LoginPageState extends ConsumerState<LoginPage> {
|
||||||
child: Column(
|
child: Column(
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
children: [
|
children: [
|
||||||
const Text(
|
SvgPicture.asset(
|
||||||
'IT0',
|
'assets/icons/logo.svg',
|
||||||
style: TextStyle(fontSize: 48, fontWeight: FontWeight.bold),
|
width: 100,
|
||||||
|
height: 100,
|
||||||
),
|
),
|
||||||
const SizedBox(height: 8),
|
const SizedBox(height: 8),
|
||||||
const Text(
|
const Text(
|
||||||
|
|
|
||||||
|
|
@ -34,6 +34,7 @@ dependencies:
|
||||||
# UI
|
# UI
|
||||||
fl_chart: ^0.67.0
|
fl_chart: ^0.67.0
|
||||||
flutter_markdown: ^0.7.0
|
flutter_markdown: ^0.7.0
|
||||||
|
flutter_svg: ^2.0.10+1
|
||||||
|
|
||||||
# Push Notifications
|
# Push Notifications
|
||||||
firebase_core: ^2.27.0
|
firebase_core: ^2.27.0
|
||||||
|
|
|
||||||
|
|
@ -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 |
Loading…
Reference in New Issue