diff --git a/frontend/src/app.css b/frontend/src/app.css index f884de9..d2a0d18 100644 --- a/frontend/src/app.css +++ b/frontend/src/app.css @@ -1,233 +1,463 @@ -/* CSS Variables - Dark Theme */ :root { - --primary: #6366f1; - --primary-hover: #818cf8; - --background: #0f172a; - --surface: #1e293b; - --surface-hover: #334155; - --text: #f1f5f9; - --text-muted: #94a3b8; - --border: #334155; - --error: #ef4444; - --success: #22c55e; - --warning: #f59e0b; + /* Vibrant Color Palette - Hot Air Balloon Theme */ + --primary: #FF6B6B; /* Coral Red */ + --primary-hover: #FF5252; + --secondary: #4ECDC4; /* Teal */ + --accent-1: #FFE66D; /* Sunny Yellow */ + --accent-2: #95E1D3; /* Mint */ + --accent-3: #F38181; /* Salmon */ + --accent-4: #AA96DA; /* Lavender */ + --accent-5: #FCBAD3; /* Pink */ + --accent-6: #A8D8EA; /* Sky Blue */ + --accent-7: #FF9F43; /* Orange */ + --accent-8: #5F27CD; /* Purple */ + + /* Gradients */ + --gradient-sunset: linear-gradient(135deg, #FF6B6B 0%, #FFE66D 50%, #95E1D3 100%); + --gradient-balloon: linear-gradient(135deg, #FF6B6B 0%, #FCBAD3 50%, #AA96DA 100%); + --gradient-sky: linear-gradient(135deg, #A8D8EA 0%, #95E1D3 50%, #FFE66D 100%); + --gradient-aurora: linear-gradient(135deg, #5F27CD 0%, #4ECDC4 50%, #FFE66D 100%); + + /* Background */ + --background: #1A1A2E; /* Deep Space */ + --background-light: #16213E; + --surface: #0F3460; /* Ocean Blue */ + --surface-hover: #1A4B8C; + --surface-card: rgba(15, 52, 96, 0.8); + --border: rgba(78, 205, 196, 0.3); + --border-bright: #4ECDC4; + + /* Text */ + --text: #F7F7F7; + --text-muted: #B8B8D1; + --text-bright: #FFFFFF; + + /* Status Colors */ + --success: #95E1D3; + --danger: #FF6B6B; + --warning: #FFE66D; + --info: #A8D8EA; + + /* Layout */ + --sidebar-width: 280px; + --header-height: 70px; + + /* Shadows */ + --shadow-glow: 0 0 30px rgba(78, 205, 196, 0.3); + --shadow-card: 0 8px 32px rgba(0, 0, 0, 0.3); + --shadow-button: 0 4px 15px rgba(255, 107, 107, 0.4); } -/* Reset & Base */ -*, -*::before, -*::after { - box-sizing: border-box; - margin: 0; - padding: 0; +* { + margin: 0; + padding: 0; + box-sizing: border-box; } -html, -body { - height: 100%; - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif; - background-color: var(--background); - color: var(--text); - line-height: 1.5; +html, body { + height: 100%; + font-family: 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', sans-serif; + background: var(--background); + background-image: + radial-gradient(circle at 20% 80%, rgba(170, 150, 218, 0.15) 0%, transparent 50%), + radial-gradient(circle at 80% 20%, rgba(78, 205, 196, 0.15) 0%, transparent 50%), + radial-gradient(circle at 40% 40%, rgba(255, 107, 107, 0.1) 0%, transparent 40%); + color: var(--text); + line-height: 1.6; + overflow-x: hidden; } a { - color: var(--primary); - text-decoration: none; + color: var(--secondary); + text-decoration: none; + transition: all 0.3s ease; } a:hover { - color: var(--primary-hover); + color: var(--accent-1); + text-shadow: 0 0 10px rgba(255, 230, 109, 0.5); } -/* Utility Classes */ -.btn { - display: inline-flex; - align-items: center; - justify-content: center; - gap: 0.5rem; - padding: 0.625rem 1.25rem; - font-size: 0.875rem; - font-weight: 500; - border-radius: 0.5rem; - border: none; - cursor: pointer; - transition: all 0.15s ease; +button { + cursor: pointer; + font-family: inherit; + border: none; + outline: none; } -.btn-primary { - background-color: var(--primary); - color: white; -} - -.btn-primary:hover { - background-color: var(--primary-hover); -} - -.btn-secondary { - background-color: var(--surface); - color: var(--text); - border: 1px solid var(--border); -} - -.btn-secondary:hover { - background-color: var(--surface-hover); -} - -.btn-danger { - background-color: var(--error); - color: white; -} - -.btn-danger:hover { - background-color: #dc2626; -} - -.btn-sm { - padding: 0.375rem 0.75rem; - font-size: 0.75rem; -} - -.btn:disabled { - opacity: 0.5; - cursor: not-allowed; -} - -.input { - width: 100%; - padding: 0.625rem 0.875rem; - font-size: 0.875rem; - background-color: var(--surface); - border: 1px solid var(--border); - border-radius: 0.5rem; - color: var(--text); - transition: border-color 0.15s ease; -} - -.input:focus { - outline: none; - border-color: var(--primary); -} - -.input::placeholder { - color: var(--text-muted); -} - -.card { - background-color: var(--surface); - border: 1px solid var(--border); - border-radius: 0.75rem; - padding: 1.5rem; -} - -.form-group { - margin-bottom: 1rem; -} - -.form-group label { - display: block; - margin-bottom: 0.5rem; - font-size: 0.875rem; - font-weight: 500; - color: var(--text-muted); -} - -.error-message { - color: var(--error); - font-size: 0.875rem; - margin-top: 0.5rem; -} - -.success-message { - color: var(--success); - font-size: 0.875rem; - margin-top: 0.5rem; +input, textarea, select { + font-family: inherit; + font-size: inherit; } /* Scrollbar */ ::-webkit-scrollbar { - width: 8px; - height: 8px; + width: 10px; + height: 10px; } ::-webkit-scrollbar-track { - background: var(--background); + background: var(--background); + border-radius: 5px; } ::-webkit-scrollbar-thumb { - background: var(--border); - border-radius: 4px; + background: var(--gradient-sunset); + border-radius: 5px; } ::-webkit-scrollbar-thumb:hover { - background: var(--surface-hover); + background: var(--gradient-balloon); } -/* Code blocks */ -pre { - background-color: var(--background); - padding: 1rem; - border-radius: 0.5rem; - overflow-x: auto; - font-size: 0.875rem; +/* ============ BUTTONS ============ */ +.btn { + display: inline-flex; + align-items: center; + justify-content: center; + gap: 0.5rem; + padding: 0.75rem 1.5rem; + font-size: 0.9rem; + font-weight: 600; + border-radius: 50px; + border: none; + transition: all 0.3s ease; + text-transform: uppercase; + letter-spacing: 0.5px; } -code { - font-family: 'Fira Code', 'Monaco', 'Consolas', monospace; - font-size: 0.875rem; +.btn-primary { + background: var(--gradient-sunset); + color: var(--background); + box-shadow: var(--shadow-button); } -/* Tabs */ +.btn-primary:hover { + transform: translateY(-2px); + box-shadow: 0 6px 20px rgba(255, 107, 107, 0.5); +} + +.btn-secondary { + background: transparent; + color: var(--secondary); + border: 2px solid var(--secondary); + box-shadow: 0 0 15px rgba(78, 205, 196, 0.2); +} + +.btn-secondary:hover { + background: var(--secondary); + color: var(--background); + box-shadow: 0 0 25px rgba(78, 205, 196, 0.4); +} + +.btn-danger { + background: linear-gradient(135deg, #FF6B6B, #F38181); + color: white; + box-shadow: 0 4px 15px rgba(255, 107, 107, 0.4); +} + +.btn-danger:hover { + transform: translateY(-2px); + box-shadow: 0 6px 20px rgba(255, 107, 107, 0.5); +} + +.btn-sm { + padding: 0.5rem 1rem; + font-size: 0.75rem; +} + +.btn-icon { + padding: 0.75rem; + min-width: 48px; + border-radius: 50%; +} + +.btn:disabled { + opacity: 0.6; + cursor: not-allowed; + transform: none !important; +} + +/* ============ INPUTS ============ */ +.input { + width: 100%; + padding: 1rem 1.25rem; + background: rgba(22, 33, 62, 0.8); + border: 2px solid transparent; + border-radius: 15px; + color: var(--text); + font-size: 1rem; + transition: all 0.3s ease; + backdrop-filter: blur(10px); +} + +.input:focus { + outline: none; + border-color: var(--secondary); + box-shadow: 0 0 20px rgba(78, 205, 196, 0.3); + background: rgba(22, 33, 62, 1); +} + +.input::placeholder { + color: var(--text-muted); +} + +.label { + display: block; + margin-bottom: 0.5rem; + font-size: 0.875rem; + font-weight: 600; + color: var(--secondary); + text-transform: uppercase; + letter-spacing: 1px; +} + +/* ============ CARDS ============ */ +.card { + background: var(--surface-card); + border: 1px solid var(--border); + border-radius: 20px; + padding: 1.5rem; + backdrop-filter: blur(20px); + box-shadow: var(--shadow-card); + transition: all 0.3s ease; +} + +.card:hover { + border-color: var(--border-bright); + box-shadow: var(--shadow-glow); +} + +.form-group { + margin-bottom: 1.25rem; +} + +/* ============ TABS ============ */ .tabs { - display: flex; - gap: 0.5rem; - border-bottom: 1px solid var(--border); - margin-bottom: 1.5rem; + display: flex; + gap: 0.5rem; + margin-bottom: 1.5rem; + padding: 0.5rem; + background: var(--surface); + border-radius: 50px; + box-shadow: inset 0 2px 10px rgba(0, 0, 0, 0.2); } .tab { - padding: 0.75rem 1.5rem; - font-size: 0.875rem; - font-weight: 500; - color: var(--text-muted); - background: none; - border: none; - cursor: pointer; - transition: all 0.15s ease; - border-bottom: 2px solid transparent; - margin-bottom: -1px; + padding: 0.75rem 1.5rem; + background: transparent; + border: none; + border-radius: 50px; + color: var(--text-muted); + font-weight: 600; + cursor: pointer; + transition: all 0.3s ease; } .tab:hover { - color: var(--text); + color: var(--text); + background: rgba(78, 205, 196, 0.1); } .tab.active { - color: var(--primary); - border-bottom-color: var(--primary); + background: var(--gradient-sunset); + color: var(--background); + box-shadow: 0 4px 15px rgba(255, 107, 107, 0.4); } -/* Table */ -.table { - width: 100%; - border-collapse: collapse; +/* ============ BADGES ============ */ +.badge { + display: inline-flex; + align-items: center; + padding: 0.375rem 0.875rem; + border-radius: 50px; + font-size: 0.75rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.5px; } -.table th, -.table td { - padding: 0.75rem 1rem; - text-align: left; - border-bottom: 1px solid var(--border); +.badge.admin { + background: var(--gradient-balloon); + color: white; } -.table th { - font-weight: 600; - color: var(--text-muted); - font-size: 0.75rem; - text-transform: uppercase; - letter-spacing: 0.05em; +.badge.active { + background: linear-gradient(135deg, #95E1D3, #4ECDC4); + color: var(--background); } -.table tbody tr:hover { - background-color: var(--background); +.badge.inactive { + background: linear-gradient(135deg, #FF6B6B, #F38181); + color: white; +} + +.badge.default { + background: linear-gradient(135deg, #FFE66D, #FF9F43); + color: var(--background); +} + +/* ============ TABLES ============ */ +.data-table { + width: 100%; + border-collapse: separate; + border-spacing: 0; +} + +.data-table th, +.data-table td { + padding: 1rem 1.25rem; + text-align: left; +} + +.data-table th { + background: var(--background-light); + font-weight: 700; + color: var(--secondary); + font-size: 0.75rem; + text-transform: uppercase; + letter-spacing: 1px; + border-bottom: 2px solid var(--border); +} + +.data-table tr { + transition: all 0.3s ease; +} + +.data-table tbody tr:hover { + background: rgba(78, 205, 196, 0.05); +} + +.data-table td { + border-bottom: 1px solid var(--border); +} + +/* ============ ANIMATIONS ============ */ +@keyframes float { + 0%, 100% { transform: translateY(0px); } + 50% { transform: translateY(-10px); } +} + +@keyframes pulse-glow { + 0%, 100% { box-shadow: 0 0 20px rgba(78, 205, 196, 0.3); } + 50% { box-shadow: 0 0 40px rgba(78, 205, 196, 0.6); } +} + +@keyframes gradient-shift { + 0% { background-position: 0% 50%; } + 50% { background-position: 100% 50%; } + 100% { background-position: 0% 50%; } +} + +@keyframes spin { + to { transform: rotate(360deg); } +} + +/* ============ MARKDOWN CONTENT ============ */ +.markdown-content { + line-height: 1.8; +} + +.markdown-content p { + margin-bottom: 1rem; +} + +.markdown-content code { + background: var(--background); + padding: 0.25rem 0.5rem; + border-radius: 6px; + font-size: 0.9em; + color: var(--accent-1); + border: 1px solid var(--border); +} + +.markdown-content pre { + background: var(--background); + padding: 1.25rem; + border-radius: 15px; + overflow-x: auto; + margin-bottom: 1rem; + border: 1px solid var(--border); + box-shadow: inset 0 2px 10px rgba(0, 0, 0, 0.2); +} + +.markdown-content pre code { + background: none; + padding: 0; + border: none; +} + +.markdown-content ul, .markdown-content ol { + margin-bottom: 1rem; + padding-left: 1.5rem; +} + +.markdown-content li { + margin-bottom: 0.5rem; +} + +.markdown-content h1, .markdown-content h2, .markdown-content h3 { + margin-bottom: 1rem; + margin-top: 1.5rem; + background: var(--gradient-sunset); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; +} + +.markdown-content h1 { font-size: 1.5rem; } +.markdown-content h2 { font-size: 1.25rem; } +.markdown-content h3 { font-size: 1.1rem; } + +/* ============ MODAL ============ */ +.modal-overlay { + position: fixed; + inset: 0; + background: rgba(26, 26, 46, 0.9); + backdrop-filter: blur(10px); + display: flex; + align-items: center; + justify-content: center; + z-index: 1000; + padding: 1rem; +} + +.modal { + background: linear-gradient(135deg, var(--surface) 0%, var(--background-light) 100%); + border: 2px solid var(--border-bright); + border-radius: 25px; + padding: 2rem; + width: 100%; + max-width: 500px; + max-height: 90vh; + overflow-y: auto; + box-shadow: + 0 0 50px rgba(78, 205, 196, 0.3), + 0 25px 50px rgba(0, 0, 0, 0.5); + animation: float 3s ease-in-out infinite; +} + +.modal h3 { + background: var(--gradient-sunset); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + font-size: 1.5rem; + margin-bottom: 1.5rem; +} + +/* ============ NEURAL NETWORK BACKGROUND DECORATION ============ */ +.neural-bg { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + pointer-events: none; + z-index: -1; + background-image: + radial-gradient(circle at 10% 20%, rgba(255, 107, 107, 0.1) 0%, transparent 20%), + radial-gradient(circle at 30% 80%, rgba(78, 205, 196, 0.1) 0%, transparent 20%), + radial-gradient(circle at 70% 30%, rgba(255, 230, 109, 0.1) 0%, transparent 20%), + radial-gradient(circle at 90% 70%, rgba(170, 150, 218, 0.1) 0%, transparent 20%); } diff --git a/frontend/src/routes/+layout.svelte b/frontend/src/routes/+layout.svelte index 4181e0a..cc65502 100644 --- a/frontend/src/routes/+layout.svelte +++ b/frontend/src/routes/+layout.svelte @@ -22,7 +22,11 @@ {#if isLoading}
-
+
+ +
+

Loading Moxiegen...

+
{:else if user}
@@ -42,30 +46,49 @@
- {user.username} - +
+ 👤 + {user.username} +
+
@@ -78,8 +101,11 @@ {/if} + +
{:else} +
{/if} diff --git a/frontend/src/routes/login/+page.svelte b/frontend/src/routes/login/+page.svelte index 00872a1..6b3f577 100644 --- a/frontend/src/routes/login/+page.svelte +++ b/frontend/src/routes/login/+page.svelte @@ -35,16 +35,32 @@
+ +
+
+
+
+
+
+
+
+
- +
+ +
+

Welcome Back

Sign in to your account to continue

{#if error} -
{error}
+
+ ⚠️ + {error} +
{/if}
@@ -72,7 +88,13 @@
@@ -81,9 +103,15 @@
-

Demo Admin:

-

Email: admin@moxiegen.com

-

Password: admin123

+
🎯 Demo Admin Credentials
+
+ Email: + admin@moxiegen.com +
+
+ Password: + admin123 +
@@ -95,16 +123,75 @@ justify-content: center; min-height: 100vh; padding: 1rem; - background: var(--background); + position: relative; + overflow: hidden; } + /* Floating Balloons */ + .balloon { + position: absolute; + border-radius: 50% 50% 50% 50%; + opacity: 0.15; + animation: float 8s ease-in-out infinite; + } + + .b1 { + width: 200px; + height: 250px; + top: 10%; + left: 5%; + background: linear-gradient(135deg, #FF6B6B, #FCBAD3); + animation-delay: 0s; + } + + .b2 { + width: 150px; + height: 180px; + top: 60%; + right: 10%; + background: linear-gradient(135deg, #4ECDC4, #95E1D3); + animation-delay: 2s; + } + + .b3 { + width: 100px; + height: 120px; + bottom: 10%; + left: 15%; + background: linear-gradient(135deg, #FFE66D, #FF9F43); + animation-delay: 4s; + } + + /* Neural Network Nodes */ + .node { + position: absolute; + width: 20px; + height: 20px; + border-radius: 50%; + opacity: 0.3; + animation: pulse-glow 3s ease-in-out infinite; + } + + .n1 { top: 20%; left: 20%; background: #FF6B6B; animation-delay: 0s; } + .n2 { top: 40%; right: 15%; background: #4ECDC4; animation-delay: 0.5s; } + .n3 { top: 70%; left: 10%; background: #FFE66D; animation-delay: 1s; } + .n4 { bottom: 20%; right: 25%; background: #AA96DA; animation-delay: 1.5s; } + .n5 { top: 30%; right: 30%; background: #FCBAD3; animation-delay: 2s; } + .auth-card { width: 100%; - max-width: 400px; - background: var(--surface); - border: 1px solid var(--border); - border-radius: 1rem; - padding: 2rem; + max-width: 420px; + background: linear-gradient(135deg, rgba(15, 52, 96, 0.9), rgba(22, 33, 62, 0.95)); + border: 2px solid transparent; + border-image: var(--gradient-sunset) 1; + border-radius: 30px; + padding: 2.5rem; + backdrop-filter: blur(20px); + box-shadow: + 0 25px 50px rgba(0, 0, 0, 0.4), + 0 0 100px rgba(78, 205, 196, 0.1); + position: relative; + z-index: 1; } .auth-header { @@ -112,58 +199,159 @@ margin-bottom: 2rem; } + .logo-wrapper { + position: relative; + display: inline-block; + margin-bottom: 1.5rem; + } + .auth-logo { - width: 64px; - height: 64px; - border-radius: 0.75rem; - margin-bottom: 1rem; + width: 80px; + height: 80px; + border-radius: 20px; + object-fit: cover; + position: relative; + z-index: 1; + transition: transform 0.3s ease; + box-shadow: 0 10px 30px rgba(255, 107, 107, 0.4); + } + + .auth-logo:hover { + transform: scale(1.1) rotate(5deg); + } + + .logo-glow { + position: absolute; + inset: -10px; + background: var(--gradient-sunset); + border-radius: 30px; + opacity: 0.3; + filter: blur(20px); + animation: pulse-glow 2s ease-in-out infinite; } .auth-header h1 { - font-size: 1.5rem; + font-size: 2rem; + font-weight: 800; + background: var(--gradient-sunset); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; margin-bottom: 0.5rem; } .auth-header p { color: var(--text-muted); - font-size: 0.875rem; + font-size: 1rem; } .auth-form { margin-bottom: 1.5rem; } - .btn-full { - width: 100%; - margin-top: 1rem; - } - .error-message { - background: rgba(239, 68, 68, 0.1); + display: flex; + align-items: center; + gap: 0.75rem; + background: rgba(255, 107, 107, 0.1); border: 1px solid var(--danger); color: var(--danger); - padding: 0.75rem 1rem; - border-radius: 0.5rem; + padding: 1rem; + border-radius: 15px; margin-bottom: 1rem; - font-size: 0.875rem; + font-size: 0.9rem; + } + + .error-icon { + font-size: 1.25rem; + } + + .btn-full { + width: 100%; + margin-top: 1.5rem; + padding: 1rem 1.5rem; + font-size: 1rem; + } + + .loading-dots { + display: flex; + gap: 0.5rem; + } + + .loading-dots span { + width: 8px; + height: 8px; + background: currentColor; + border-radius: 50%; + animation: bounce 1.4s ease-in-out infinite; + } + + .loading-dots span:nth-child(1) { animation-delay: 0s; } + .loading-dots span:nth-child(2) { animation-delay: 0.2s; } + .loading-dots span:nth-child(3) { animation-delay: 0.4s; } + + @keyframes bounce { + 0%, 80%, 100% { transform: translateY(0); } + 40% { transform: translateY(-10px); } } .auth-footer { text-align: center; + margin-bottom: 1.5rem; + } + + .auth-footer p { color: var(--text-muted); - font-size: 0.875rem; + font-size: 0.9rem; + } + + .auth-footer a { + color: var(--secondary); + font-weight: 600; + } + + .auth-footer a:hover { + color: var(--accent-1); } .demo-credentials { - margin-top: 1.5rem; - padding: 1rem; - background: var(--background); - border-radius: 0.5rem; - font-size: 0.75rem; + background: linear-gradient(135deg, rgba(78, 205, 196, 0.1), rgba(149, 225, 211, 0.1)); + border: 1px solid var(--secondary); + border-radius: 15px; + padding: 1rem 1.25rem; + } + + .demo-header { + font-weight: 700; + color: var(--secondary); + margin-bottom: 0.75rem; + font-size: 0.85rem; + } + + .demo-row { + display: flex; + justify-content: space-between; + padding: 0.25rem 0; + font-size: 0.85rem; + } + + .demo-label { color: var(--text-muted); } - .demo-credentials p { - margin-bottom: 0.25rem; + .demo-value { + color: var(--accent-1); + font-family: monospace; + font-weight: 600; + } + + @media (max-width: 480px) { + .auth-card { + padding: 1.5rem; + } + + .auth-header h1 { + font-size: 1.5rem; + } }