From 9ac63a42e58916e630af773881d78811a6dc3026 Mon Sep 17 00:00:00 2001 From: David Gwilliam Date: Fri, 27 Mar 2026 13:23:28 -0700 Subject: [PATCH] style: Add responsive CSS variables and mobile navigation styles --- app/assets/css/app.css | 399 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 373 insertions(+), 26 deletions(-) diff --git a/app/assets/css/app.css b/app/assets/css/app.css index adac05f..afa1ad2 100644 --- a/app/assets/css/app.css +++ b/app/assets/css/app.css @@ -1,24 +1,120 @@ +/* EuchreCamp Theme - Green and Gold */ +:root { + /* Primary Colors */ + --color-primary: #2d5a27; + --color-primary-dark: #1e3d1a; + --color-primary-light: #4a7c42; + + /* Secondary Colors (Gold) */ + --color-secondary: #c9a227; + --color-secondary-dark: #a68a1f; + --color-secondary-light: #e6b832; + + /* Neutral Colors */ + --color-white: #ffffff; + --color-gray-50: #f9f9f9; + --color-gray-100: #f5f5f5; + --color-gray-200: #e0e0e0; + --color-gray-300: #d0d0d0; + --color-gray-500: #666666; + --color-gray-700: #333333; + --color-black: #000000; + + /* Status Colors */ + --color-success: #2d5a27; + --color-error: #c62828; + --color-warning: #c9a227; + --color-info: #1565c0; + + /* Background Colors */ + --bg-body: var(--color-white); + --bg-card: var(--color-white); + --bg-card-alt: var(--color-gray-50); + --bg-nav: var(--color-primary); + --bg-nav-mobile: var(--color-primary); + --bg-bottom-nav: var(--color-primary); + + /* Text Colors */ + --text-primary: var(--color-black); + --text-secondary: var(--color-gray-500); + --text-on-primary: var(--color-white); + --text-on-secondary: var(--color-black); + + /* Spacing */ + --spacing-xs: 0.25rem; + --spacing-sm: 0.5rem; + --spacing-md: 1rem; + --spacing-lg: 1.5rem; + --spacing-xl: 2rem; + --spacing-2xl: 3rem; + + /* Border Radius */ + --radius-sm: 4px; + --radius-md: 8px; + --radius-lg: 12px; + --radius-full: 9999px; + + /* Shadows */ + --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05); + --shadow-md: 0 4px 6px rgba(0, 0, 0, 0.1); + --shadow-lg: 0 10px 15px rgba(0, 0, 0, 0.1); + + /* Transitions */ + --transition-fast: 150ms ease; + --transition-normal: 200ms ease; + + /* Z-index layers */ + --z-bottom-nav: 1000; + --z-overlay: 1100; + --z-modal: 1200; + + /* Bottom Nav Height */ + --bottom-nav-height: 60px; +} + +/* Reset and Base Styles */ +*, *::before, *::after { + box-sizing: border-box; +} + +html { + font-size: 16px; + -webkit-text-size-adjust: 100%; +} + body { - background-color: #fff; - color: #000; + background-color: var(--bg-body); + color: var(--text-primary); font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; margin: 0; padding: 0; + line-height: 1.5; + /* Add bottom padding for mobile navigation */ + padding-bottom: var(--bottom-nav-height); } -/* Navigation */ +/* Desktop Navigation (hidden on mobile) */ .main-nav { - background-color: #2d5a27; - color: white; - padding: 1rem 2rem; + background-color: var(--bg-nav); + color: var(--text-on-primary); + padding: var(--spacing-md) var(--spacing-xl); display: flex; justify-content: space-between; align-items: center; - box-shadow: 0 2px 4px rgba(0,0,0,0.1); + box-shadow: var(--shadow-md); + position: sticky; + top: 0; + z-index: var(--z-bottom-nav); +} + +@media (max-width: 768px) { + .main-nav { + display: none; + } } .nav-brand a { - color: white; + color: var(--text-on-primary); text-decoration: none; font-size: 1.5rem; font-weight: bold; @@ -26,14 +122,15 @@ body { .nav-links { display: flex; - gap: 1.5rem; + gap: var(--spacing-lg); } .nav-links a { - color: white; + color: var(--text-on-primary); text-decoration: none; opacity: 0.9; - transition: opacity 0.2s; + transition: opacity var(--transition-fast); + padding: var(--spacing-sm) 0; } .nav-links a:hover { @@ -42,7 +139,7 @@ body { .nav-user { display: flex; - gap: 1rem; + gap: var(--spacing-md); align-items: center; } @@ -51,16 +148,126 @@ body { } .nav-user a { - color: white; + color: var(--text-on-primary); text-decoration: none; opacity: 0.9; + transition: opacity var(--transition-fast); +} + +.nav-user a:hover { + opacity: 1; +} + +/* Bottom Navigation (Mobile) */ +.bottom-nav { + display: none; + position: fixed; + bottom: 0; + left: 0; + right: 0; + height: var(--bottom-nav-height); + background-color: var(--bg-bottom-nav); + box-shadow: 0 -2px 10px rgba(0, 0, 0, 0.1); + z-index: var(--z-bottom-nav); +} + +@media (max-width: 768px) { + .bottom-nav { + display: flex; + justify-content: space-around; + align-items: center; + } +} + +.bottom-nav-item { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: var(--spacing-sm); + color: var(--text-on-primary); + text-decoration: none; + opacity: 0.7; + transition: opacity var(--transition-fast); + flex: 1; +} + +.bottom-nav-item:hover, +.bottom-nav-item.active { + opacity: 1; +} + +.bottom-nav-item svg { + width: 24px; + height: 24px; + margin-bottom: 2px; +} + +.bottom-nav-item span { + font-size: 0.7rem; + text-transform: uppercase; + letter-spacing: 0.5px; +} + +/* Offline Notification */ +.offline-notification { + position: fixed; + top: var(--spacing-md); + left: 50%; + transform: translateX(-50%); + background-color: var(--color-secondary); + color: var(--text-on-secondary); + padding: var(--spacing-sm) var(--spacing-md); + border-radius: var(--radius-full); + display: flex; + align-items: center; + gap: var(--spacing-sm); + box-shadow: var(--shadow-md); + z-index: var(--z-overlay); + animation: slideDown 0.3s ease; +} + +@keyframes slideDown { + from { + transform: translateX(-50%) translateY(-100%); + opacity: 0; + } + to { + transform: translateX(-50%) translateY(0); + opacity: 1; + } +} + +/* Bottom Nav Active State */ +.bottom-nav-item.active { + opacity: 1; + color: var(--color-secondary); +} + +.bottom-nav-item.active svg { + stroke: var(--color-secondary); } /* Main Content */ .main-content { max-width: 1200px; margin: 0 auto; - padding: 2rem; + padding: var(--spacing-xl); +} + +/* Responsive Main Content */ +@media (max-width: 768px) { + .main-content { + padding: var(--spacing-md); + padding-bottom: calc(var(--spacing-xl) + var(--bottom-nav-height)); + } +} + +@media (max-width: 480px) { + .main-content { + padding: var(--spacing-sm); + padding-bottom: calc(var(--spacing-lg) + var(--bottom-nav-height)); + } } /* Tables */ @@ -68,21 +275,68 @@ table { width: 100%; border-collapse: collapse; margin: 1rem 0; + background: var(--bg-card); + border-radius: var(--radius-lg); + overflow: hidden; + box-shadow: var(--shadow-sm); } th, td { - padding: 0.75rem; + padding: var(--spacing-md); text-align: left; - border-bottom: 1px solid #ddd; + border-bottom: 1px solid var(--color-gray-200); } th { - background-color: #f5f5f5; + background-color: var(--color-gray-100); font-weight: 600; + color: var(--text-primary); } tr:hover { - background-color: #f9f9f9; + background-color: var(--color-gray-50); +} + +/* Responsive Table - Convert to Cards on Mobile */ +@media (max-width: 768px) { + /* Hide table headers but keep content accessible */ + table thead { + display: none; + } + + table, tbody, tr, td { + display: block; + width: 100%; + } + + tr { + margin-bottom: var(--spacing-md); + border: 1px solid var(--color-gray-200); + border-radius: var(--radius-md); + background: var(--bg-card); + box-shadow: var(--shadow-sm); + } + + td { + text-align: right; + padding-left: 50%; + position: relative; + border-bottom: none; + } + + td::before { + content: attr(data-label); + position: absolute; + left: var(--spacing-md); + width: 45%; + font-weight: 600; + text-align: left; + color: var(--text-secondary); + } + + td:last-child { + border-bottom: none; + } } /* Links */ @@ -307,13 +561,32 @@ section h2 { gap: 1rem; } +@media (max-width: 768px) { + .tournaments-list { + grid-template-columns: 1fr; + } +} + .tournament-card { display: flex; align-items: center; padding: 1rem; - background: #f9f9f9; - border-radius: 8px; + background: var(--bg-card-alt); + border-radius: var(--radius-md); gap: 1rem; + border: 1px solid var(--color-gray-200); +} + +@media (max-width: 480px) { + .tournament-card { + flex-direction: column; + align-items: flex-start; + gap: var(--spacing-sm); + } + + .tournament-status { + align-self: flex-end; + } } .tournament-info { @@ -400,22 +673,96 @@ section h2 { .no-matches, .no-tournaments, .no-schedule { - color: #666; + color: var(--text-secondary); font-style: italic; - padding: 2rem; + padding: var(--spacing-xl); text-align: center; - background: #f9f9f9; - border-radius: 8px; + background: var(--bg-card-alt); + border-radius: var(--radius-lg); +} + +/* Card Container */ +.card-container { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); + gap: var(--spacing-lg); + margin: var(--spacing-lg) 0; +} + +@media (max-width: 768px) { + .card-container { + grid-template-columns: 1fr; + } +} + +/* Card Base Styles */ +.card { + background: var(--bg-card); + border-radius: var(--radius-lg); + box-shadow: var(--shadow-sm); + padding: var(--spacing-lg); + transition: box-shadow var(--transition-normal); +} + +.card:hover { + box-shadow: var(--shadow-md); +} + +/* Responsive visibility utilities */ +.hide-mobile { + display: block; +} + +.show-mobile { + display: none; +} + +@media (max-width: 768px) { + .hide-mobile { + display: none !important; + } + + .show-mobile { + display: block !important; + } +} + +/* Form responsive styles */ +.form-group input, +.form-group select, +.form-group textarea { + width: 100%; + padding: var(--spacing-sm) var(--spacing-md); + border: 1px solid var(--color-gray-300); + border-radius: var(--radius-sm); + font-size: 1rem; + transition: border-color var(--transition-fast); +} + +@media (max-width: 480px) { + .form-group input, + .form-group select, + .form-group textarea { + padding: var(--spacing-sm); + font-size: 16px; /* Prevents zoom on iOS */ + } } /* Dashboard Stats */ .dashboard-stats { display: grid; - grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); - gap: 1.5rem; + grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); + gap: 1rem; margin: 2rem 0; } +@media (max-width: 480px) { + .dashboard-stats { + grid-template-columns: repeat(2, 1fr); + gap: var(--spacing-sm); + } +} + .stat-card { background: white; border: 1px solid #e0e0e0;