diff --git a/frontend/src/App.css b/frontend/src/App.css index aa93ad6..f5b0842 100644 --- a/frontend/src/App.css +++ b/frontend/src/App.css @@ -1,17 +1,27 @@ :root { - --color-bg: #f6f8fb; + /* Playful, gender-neutral color palette */ + --color-bg: #f0f4ff; --color-surface: #ffffff; - --color-surface-alt: #f0f4ff; - --color-surface-muted: #e9f2ff; - --color-primary: #2f80ed; - --color-primary-dark: #1f5fb7; - --color-secondary: #3ab5a8; - --color-secondary-dark: #2d8c82; - --color-accent: #f4c95d; - --color-muted: #5a6473; - --color-text: #1f2a37; - --color-border: #d4deef; - --color-shadow: rgba(35, 74, 134, 0.16); + --color-surface-alt: #fff8e1; + --color-surface-muted: #e8f5e9; + --color-primary: #7c3aed; + --color-primary-dark: #6d28d9; + --color-secondary: #f59e0b; + --color-secondary-dark: #d97706; + --color-accent: #10b981; + --color-accent-alt: #ef4444; + --color-muted: #6b7280; + --color-text: #1f2937; + --color-border: #e5e7eb; + --color-shadow: rgba(124, 58, 237, 0.15); + + /* Subtle gradients for text effects only */ + --gradient-primary-text: linear-gradient(135deg, #7c3aed 0%, #a855f7 100%); + --gradient-secondary-text: linear-gradient(135deg, #f59e0b 0%, #fbbf24 100%); + + /* Playful fonts */ + --font-playful: 'Comic Sans MS', 'Chalkboard SE', 'Comic Neue', 'Nunito', sans-serif; + --font-body: 'Nunito', 'Roboto', sans-serif; } * { @@ -21,10 +31,10 @@ } body { - font-family: 'Roboto', 'Arial', sans-serif; + font-family: var(--font-body); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; - background: linear-gradient(180deg, var(--color-bg), #e7edf7); + background: var(--color-bg); color: var(--color-text); } @@ -63,7 +73,7 @@ body { .error-container button { padding: 10px 20px; - background: linear-gradient(135deg, var(--color-primary), var(--color-secondary)); + background: var(--color-primary); color: white; border: none; border-radius: 999px; diff --git a/frontend/src/components/Navbar/Navbar.css b/frontend/src/components/Navbar/Navbar.css index dce5071..b9c245f 100644 --- a/frontend/src/components/Navbar/Navbar.css +++ b/frontend/src/components/Navbar/Navbar.css @@ -1,5 +1,5 @@ .navbar { - background: linear-gradient(120deg, var(--color-surface), var(--color-surface-alt)); + background: var(--color-surface); border-bottom: 1px solid var(--color-border); position: sticky; top: 0; @@ -67,7 +67,7 @@ } .navbar-button { - background: linear-gradient(135deg, var(--color-primary), var(--color-secondary)); + background: var(--color-primary); color: white; border: none; padding: 10px 20px; @@ -125,7 +125,7 @@ .navbar-search-button { padding: 10px 18px; - background: linear-gradient(135deg, var(--color-primary), var(--color-secondary)); + background: var(--color-primary); border: none; border-radius: 999px; cursor: pointer; diff --git a/frontend/src/components/WordGroupManager/WordGroupManager.css b/frontend/src/components/WordGroupManager/WordGroupManager.css index accef53..af5706f 100644 --- a/frontend/src/components/WordGroupManager/WordGroupManager.css +++ b/frontend/src/components/WordGroupManager/WordGroupManager.css @@ -249,6 +249,7 @@ .practice-area { .word-text { font-size: 48px; + text-transform: none; } } .word-text { diff --git a/frontend/src/pages/LandingPage.css b/frontend/src/pages/LandingPage.css index 92173bb..96a9a84 100644 --- a/frontend/src/pages/LandingPage.css +++ b/frontend/src/pages/LandingPage.css @@ -14,11 +14,19 @@ .menu-header h1 { font-size: 2.5rem; margin: 12px 0; + font-family: var(--font-playful); + font-weight: 800; + background: var(--gradient-primary-text); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; } .menu-header p { color: var(--color-muted); margin: 0; + font-weight: 600; + font-size: 1.1rem; } .eyebrow { @@ -36,13 +44,20 @@ .app-card { border-radius: 24px; - background: rgba(255, 255, 255, 0.9); - border: 1px solid var(--color-border); - padding: 24px; - box-shadow: 0 20px 45px rgba(31, 59, 115, 0.12); + background: var(--color-surface); + border: 3px solid var(--color-primary); + padding: 28px; + box-shadow: 0 8px 24px var(--color-shadow); display: flex; flex-direction: column; gap: 12px; + transition: all 0.3s cubic-bezier(0.34, 1.56, 0.64, 1); +} + +.app-card:hover:not(.disabled) { + transform: translateY(-6px) scale(1.02); + box-shadow: 0 12px 32px rgba(124, 58, 237, 0.25); + border-color: var(--color-secondary); } .app-card header { @@ -54,7 +69,13 @@ .app-card h2 { margin: 0; - font-size: 1.4rem; + font-size: 1.5rem; + font-family: var(--font-playful); + font-weight: 800; + background: var(--gradient-primary-text); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; } .app-card p { @@ -80,20 +101,23 @@ display: inline-flex; align-items: center; justify-content: center; - padding: 10px 18px; - border-radius: 999px; - font-weight: 600; + padding: 12px 24px; + border-radius: 25px; + font-weight: 700; + font-family: var(--font-playful); text-decoration: none; - border: none; - background: linear-gradient(135deg, var(--color-primary), var(--color-secondary)); + border: 3px solid var(--color-primary); + background: var(--color-primary); color: white; - box-shadow: 0 12px 24px rgba(31, 59, 115, 0.2); - transition: transform 0.2s, box-shadow 0.2s; + box-shadow: 0 4px 12px var(--color-shadow); + transition: all 0.3s cubic-bezier(0.34, 1.56, 0.64, 1); } .app-actions a:hover, -.app-actions button:hover { - transform: translateY(-2px); +.app-actions button:hover:not(:disabled) { + transform: translateY(-4px) scale(1.05); + box-shadow: 0 8px 20px rgba(124, 58, 237, 0.4); + border-color: var(--color-secondary); } .app-card.disabled { diff --git a/frontend/src/pages/SpeechSoundsApp.css b/frontend/src/pages/SpeechSoundsApp.css index e0cdca2..6930748 100644 --- a/frontend/src/pages/SpeechSoundsApp.css +++ b/frontend/src/pages/SpeechSoundsApp.css @@ -1,8 +1,8 @@ .speech-sounds-app { min-height: calc(100vh - 60px); - background-color: #f9f9f9; + background: var(--color-bg); padding: 24px; - max-width: 800px; + max-width: 900px; margin: 0 auto; } @@ -12,32 +12,44 @@ } .app-header h1 { - margin: 0 0 8px 0; - font-size: 32px; - font-weight: 500; - color: #030303; + margin: 0 0 12px 0; + font-size: 42px; + font-weight: 800; + background: var(--gradient-primary-text); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + font-family: var(--font-playful); } .app-header p { margin: 0; - font-size: 16px; - color: #606060; + font-size: 18px; + color: var(--color-text); + font-weight: 600; + opacity: 0.8; } .back-to-groups-button { margin-bottom: 16px; - padding: 8px 16px; - background: transparent; - border: 1px solid #e5e5e5; - border-radius: 6px; - color: #030303; - font-size: 14px; + padding: 12px 24px; + background: var(--color-surface); + border: 3px solid var(--color-primary); + border-radius: 20px; + color: var(--color-primary); + font-size: 16px; + font-weight: 700; cursor: pointer; - transition: background-color 0.2s; + transition: all 0.3s; + box-shadow: 0 4px 8px var(--color-shadow); + font-family: var(--font-playful); } .back-to-groups-button:hover { - background-color: #f5f5f5; + background: var(--color-primary); + color: white; + transform: translateY(-2px); + box-shadow: 0 6px 12px rgba(124, 58, 237, 0.3); } .groups-grid { @@ -48,85 +60,138 @@ } .group-card { - background: white; - border: 2px solid #e5e5e5; - border-radius: 12px; + background: var(--color-surface); + border: 4px solid var(--color-primary); + border-radius: 24px; padding: 32px 24px; text-align: center; cursor: pointer; - transition: all 0.2s; + transition: all 0.3s cubic-bezier(0.34, 1.56, 0.64, 1); text-decoration: none; - color: #030303; + color: var(--color-text); + box-shadow: 0 8px 16px var(--color-shadow); + position: relative; + overflow: hidden; +} + +.group-card::before { + content: ""; + position: absolute; + top: -50%; + left: -50%; + width: 200%; + height: 200%; + background: radial-gradient( + circle, + rgba(124, 58, 237, 0.1) 0%, + transparent 70% + ); + opacity: 0; + transition: opacity 0.3s; } .group-card:hover { - border-color: #065fd4; - transform: translateY(-4px); - box-shadow: 0 8px 24px rgba(0, 0, 0, 0.1); + transform: translateY(-8px) scale(1.05); + box-shadow: 0 12px 32px rgba(124, 58, 237, 0.3); + border-color: var(--color-secondary); +} + +.group-card:hover::before { + opacity: 1; } .group-card-name { margin: 0 0 8px 0; - font-size: 24px; - font-weight: 600; - color: #030303; + font-size: 28px; + font-weight: 800; + background: var(--gradient-primary-text); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + font-family: var(--font-playful); + position: relative; + z-index: 1; } .group-card-count { margin: 0; - font-size: 16px; - color: #606060; + font-size: 18px; + color: var(--color-muted); + font-weight: 700; + position: relative; + z-index: 1; } .practice-area { - background: white; - border-radius: 12px; - padding: 32px; - box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); + background: var(--color-surface); + border-radius: 32px; + padding: 40px; + box-shadow: 0 8px 32px var(--color-shadow); + border: 4px solid var(--color-primary); } .word-display { text-align: center; - margin-bottom: 32px; + margin-bottom: 40px; } .word-text { - font-size: 64px; - font-weight: 700; - color: #030303; - margin: 0 0 16px 0; - letter-spacing: 2px; - text-transform: uppercase; + font-size: 72px; + font-weight: 900; + background: var(--gradient-primary-text); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + margin: 0 0 20px 0; + letter-spacing: 4px; + font-family: var(--font-playful); + animation: wordBounce 0.5s ease-out; +} + +@keyframes wordBounce { + 0%, + 100% { + transform: scale(1); + } + 50% { + transform: scale(1.1); + } } .practice-stats { display: flex; justify-content: center; - gap: 24px; - margin-top: 16px; + gap: 20px; + margin-top: 20px; flex-wrap: wrap; } .stat-item { - font-size: 16px; - font-weight: 500; - padding: 8px 16px; - border-radius: 20px; - background: #f5f5f5; + font-size: 18px; + font-weight: 700; + padding: 12px 20px; + border-radius: 25px; + box-shadow: 0 4px 8px var(--color-shadow); + border: 3px solid; + font-family: var(--font-playful); } .stat-pass { - color: #166534; - background: #f0fdf4; + background: var(--color-accent); + border-color: var(--color-accent); + color: white; } .stat-fail { - color: #991b1b; - background: #fef2f2; + background: var(--color-accent-alt); + border-color: var(--color-accent-alt); + color: white; } .stat-total { - color: #030303; + background: var(--color-secondary); + border-color: var(--color-secondary); + color: white; } .practice-container { @@ -135,17 +200,17 @@ .practice-label { text-align: center; - font-size: 16px; - font-weight: 500; - color: #030303; - margin-bottom: 20px; + font-size: 20px; + font-weight: 700; + color: var(--color-text); + margin-bottom: 24px; + font-family: var(--font-playful); } .practice-grid { display: grid; grid-template-columns: repeat(5, 1fr); gap: 16px; - max-width: 645px; margin: 0 auto; } @@ -154,75 +219,96 @@ flex-direction: column; align-items: center; gap: 12px; - padding: 16px; - border: 2px solid #e5e5e5; - border-radius: 8px; - background: white; + padding: 20px 16px; + border: 3px solid var(--color-border); + border-radius: 20px; + background: var(--color-surface); + transition: all 0.3s; +} + +.practice-item:hover { + transform: translateY(-4px); + box-shadow: 0 8px 16px var(--color-shadow); + border-color: var(--color-primary); } .practice-number { - font-size: 14px; - font-weight: 600; - color: #606060; - width: 32px; - height: 32px; + font-size: 16px; + font-weight: 700; + color: white; + width: 40px; + height: 40px; display: flex; align-items: center; justify-content: center; border-radius: 50%; - background: #f5f5f5; + background: var(--color-primary); + box-shadow: 0 4px 8px var(--color-shadow); } .practice-buttons { display: flex; - gap: 8px; + gap: 10px; } .practice-button { - width: 36px; - height: 36px; - border: 2px solid #e5e5e5; - border-radius: 6px; + width: 44px; + height: 44px; + border: 3px solid; + border-radius: 12px; background: white; - font-size: 20px; + font-size: 24px; font-weight: bold; cursor: pointer; - transition: all 0.2s; + transition: all 0.3s cubic-bezier(0.34, 1.56, 0.64, 1); display: flex; align-items: center; justify-content: center; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); +} + +.practice-button:hover { + transform: scale(1.15); } .pass-button { - color: #166534; - border-color: #86efac; + color: #065f46; + border-color: #10b981; } .pass-button:hover { - background: #f0fdf4; - border-color: #4ade80; + background: var(--color-accent); + border-color: var(--color-accent); + color: white; + box-shadow: 0 6px 12px rgba(16, 185, 129, 0.3); } .pass-button.active { - background: #22c55e; + background: var(--color-accent); color: white; - border-color: #22c55e; + border-color: var(--color-accent); + transform: scale(1.1); + box-shadow: 0 6px 16px rgba(16, 185, 129, 0.4); } .fail-button { color: #991b1b; - border-color: #fecaca; + border-color: #ef4444; } .fail-button:hover { - background: #fef2f2; - border-color: #f87171; + background: var(--color-accent-alt); + border-color: var(--color-accent-alt); + color: white; + box-shadow: 0 6px 12px rgba(239, 68, 68, 0.3); } .fail-button.active { - background: #dc2626; + background: var(--color-accent-alt); color: white; - border-color: #dc2626; + border-color: var(--color-accent-alt); + transform: scale(1.1); + box-shadow: 0 6px 16px rgba(239, 68, 68, 0.4); } .word-navigation { @@ -231,34 +317,45 @@ align-items: center; margin-bottom: 24px; padding-top: 24px; - border-top: 1px solid #e5e5e5; + border-top: 3px dashed #e0e0e0; } .nav-button { - padding: 12px 24px; - background: #065fd4; + padding: 16px 32px; + background: var(--color-primary); color: white; - border: none; - border-radius: 8px; - font-size: 16px; - font-weight: 500; + border: 3px solid var(--color-primary); + border-radius: 25px; + font-size: 18px; + font-weight: 700; cursor: pointer; - transition: background-color 0.2s; + transition: all 0.3s cubic-bezier(0.34, 1.56, 0.64, 1); + box-shadow: 0 4px 12px var(--color-shadow); + font-family: var(--font-playful); } .nav-button:hover:not(:disabled) { - background: #0556c4; + transform: translateY(-4px) scale(1.05); + box-shadow: 0 8px 20px rgba(124, 58, 237, 0.4); + border-color: var(--color-secondary); } .nav-button:disabled { - opacity: 0.5; + opacity: 0.4; cursor: not-allowed; + transform: none; } .word-counter { - font-size: 16px; - color: #606060; - font-weight: 500; + font-size: 20px; + color: white; + font-weight: 700; + font-family: var(--font-playful); + padding: 12px 24px; + background: var(--color-secondary); + border-radius: 20px; + border: 3px solid var(--color-secondary); + box-shadow: 0 4px 8px rgba(245, 158, 11, 0.3); } .word-actions { @@ -266,20 +363,24 @@ } .reset-button { - padding: 10px 20px; - background: transparent; - color: #d00; - border: 1px solid #d00; - border-radius: 8px; - font-size: 14px; - font-weight: 500; + padding: 12px 24px; + background: var(--color-surface); + color: var(--color-accent-alt); + border: 3px solid var(--color-accent-alt); + border-radius: 20px; + font-size: 16px; + font-weight: 700; cursor: pointer; - transition: all 0.2s; + transition: all 0.3s; + box-shadow: 0 4px 8px rgba(239, 68, 68, 0.2); + font-family: var(--font-playful); } .reset-button:hover { - background: #d00; + background: var(--color-accent-alt); color: white; + transform: translateY(-2px); + box-shadow: 0 6px 12px rgba(239, 68, 68, 0.3); } .loading-state, @@ -287,20 +388,30 @@ .empty-state { text-align: center; padding: 48px 24px; - background: white; - border-radius: 12px; + background: var(--color-surface); + border-radius: 24px; margin-top: 32px; + border: 4px solid var(--color-primary); + box-shadow: 0 8px 16px var(--color-shadow); } .empty-state h2 { - margin: 0 0 8px 0; - font-size: 24px; - color: #030303; + margin: 0 0 12px 0; + font-size: 32px; + color: var(--color-text); + font-family: var(--font-playful); + font-weight: 800; + background: var(--gradient-primary-text); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; } .empty-state p { margin: 0; - color: #606060; + color: var(--color-muted); + font-size: 18px; + font-weight: 600; } @media (max-width: 768px) {