Apply warm editorial design system across all components
All checks were successful
Build and Push Docker Images / Build Backend (FastAPI) (push) Successful in 1m19s
Build and Push Docker Images / Build Frontend (Next.js) (push) Successful in 1m22s
Build and Push Docker Images / Trigger Portainer Update (push) Successful in 1s

Replace generic blue/gray colors with warm editorial palette:
- Navigation: coral active states, branded logo colors
- Footer: navy background, gold section titles
- FilterBar: coral search button and focus states
- SchoolCard: coral left accent on hover, teal/coral buttons
- HomeView: gradient hero section, Playfair Display headings
- RankingsView: gold top-3 highlights, warm table styling
- ComparisonView: teal card borders, coral buttons

Consistent use of CSS variables and Playfair Display serif font
for headings throughout.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Tudor
2026-02-03 10:11:23 +00:00
parent 04ba09ab3b
commit c2ec067495
8 changed files with 387 additions and 212 deletions

View File

@@ -16,52 +16,56 @@
} }
.header h1 { .header h1 {
font-size: 2rem; font-size: 2.25rem;
font-weight: 700; font-weight: 700;
color: var(--text-primary); color: var(--text-primary, #1a1612);
margin-bottom: 0.5rem; margin-bottom: 0.5rem;
font-family: var(--font-playfair), 'Playfair Display', serif;
} }
.subtitle { .subtitle {
font-size: 1rem; font-size: 1rem;
color: var(--text-secondary); color: var(--text-secondary, #5c564d);
margin: 0; margin: 0;
line-height: 1.6;
} }
.addButton { .addButton {
padding: 0.75rem 1.5rem; padding: 0.75rem 1.5rem;
font-size: 0.9375rem; font-size: 0.9375rem;
font-weight: 500; font-weight: 600;
background: var(--primary); background: var(--accent-coral, #e07256);
color: white; color: white;
border: none; border: none;
border-radius: var(--radius-md); border-radius: 8px;
cursor: pointer; cursor: pointer;
transition: all var(--transition); transition: all 0.2s ease;
white-space: nowrap; white-space: nowrap;
} }
.addButton:hover { .addButton:hover {
background: var(--primary-dark); background: var(--accent-coral-dark, #c45a3f);
transform: translateY(-1px);
box-shadow: 0 4px 12px rgba(224, 114, 86, 0.3);
} }
/* Metric Selector */ /* Metric Selector */
.metricSelector { .metricSelector {
background: white; background: var(--bg-card, white);
border: 1px solid var(--border-light); border: 1px solid var(--border-color, #e5dfd5);
border-radius: var(--radius-lg); border-radius: 12px;
padding: 1.5rem; padding: 1.5rem;
margin-bottom: 2rem; margin-bottom: 2rem;
display: flex; display: flex;
align-items: center; align-items: center;
gap: 1rem; gap: 1rem;
box-shadow: var(--shadow-sm); box-shadow: var(--shadow-soft, 0 2px 8px rgba(26, 22, 18, 0.06));
} }
.metricLabel { .metricLabel {
font-size: 0.9375rem; font-size: 0.9375rem;
font-weight: 500; font-weight: 600;
color: var(--text-primary); color: var(--text-primary, #1a1612);
white-space: nowrap; white-space: nowrap;
} }
@@ -70,22 +74,22 @@
max-width: 400px; max-width: 400px;
padding: 0.625rem 1rem; padding: 0.625rem 1rem;
font-size: 0.9375rem; font-size: 0.9375rem;
border: 1px solid var(--border-medium); border: 1px solid var(--border-color, #e5dfd5);
border-radius: var(--radius-md); border-radius: 8px;
background: white; background: var(--bg-card, white);
color: var(--text-primary); color: var(--text-primary, #1a1612);
cursor: pointer; cursor: pointer;
transition: all var(--transition); transition: all 0.2s ease;
} }
.metricSelect:hover { .metricSelect:hover {
border-color: var(--primary); border-color: var(--accent-coral, #e07256);
} }
.metricSelect:focus { .metricSelect:focus {
outline: none; outline: none;
border-color: var(--primary); border-color: var(--accent-coral, #e07256);
box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1); box-shadow: 0 0 0 3px rgba(224, 114, 86, 0.15);
} }
/* Schools Section */ /* Schools Section */
@@ -100,17 +104,18 @@
} }
.schoolCard { .schoolCard {
background: white; background: var(--bg-card, white);
border: 1px solid var(--border-light); border: 1px solid var(--border-color, #e5dfd5);
border-radius: var(--radius-lg); border-left: 3px solid var(--accent-teal, #2d7d7d);
border-radius: 12px;
padding: 1.5rem; padding: 1.5rem;
position: relative; position: relative;
box-shadow: var(--shadow-sm); box-shadow: var(--shadow-soft, 0 2px 8px rgba(26, 22, 18, 0.06));
transition: all var(--transition); transition: all 0.3s ease;
} }
.schoolCard:hover { .schoolCard:hover {
box-shadow: var(--shadow-md); box-shadow: var(--shadow-medium, 0 4px 20px rgba(26, 22, 18, 0.1));
transform: translateY(-2px); transform: translateY(-2px);
} }
@@ -123,18 +128,18 @@
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
background: var(--danger); background: var(--accent-coral, #e07256);
color: white; color: white;
border: none; border: none;
border-radius: 50%; border-radius: 50%;
font-size: 1.25rem; font-size: 1.25rem;
line-height: 1; line-height: 1;
cursor: pointer; cursor: pointer;
transition: all var(--transition); transition: all 0.2s ease;
} }
.removeButton:hover { .removeButton:hover {
background: #dc2626; background: var(--accent-coral-dark, #c45a3f);
transform: scale(1.1); transform: scale(1.1);
} }
@@ -144,16 +149,17 @@
margin-bottom: 0.75rem; margin-bottom: 0.75rem;
padding-right: 2rem; padding-right: 2rem;
line-height: 1.3; line-height: 1.3;
font-family: var(--font-playfair), 'Playfair Display', serif;
} }
.schoolName a { .schoolName a {
color: var(--text-primary); color: var(--text-primary, #1a1612);
text-decoration: none; text-decoration: none;
transition: color var(--transition); transition: color 0.2s ease;
} }
.schoolName a:hover { .schoolName a:hover {
color: var(--primary); color: var(--accent-coral, #e07256);
} }
.schoolMeta { .schoolMeta {
@@ -165,7 +171,7 @@
.metaItem { .metaItem {
font-size: 0.875rem; font-size: 0.875rem;
color: var(--text-secondary); color: var(--text-secondary, #5c564d);
display: flex; display: flex;
align-items: center; align-items: center;
gap: 0.25rem; gap: 0.25rem;
@@ -174,39 +180,60 @@
.latestValue { .latestValue {
margin-top: 1rem; margin-top: 1rem;
padding-top: 1rem; padding-top: 1rem;
border-top: 1px solid var(--border-light); border-top: 1px solid var(--border-color, #e5dfd5);
text-align: center; text-align: center;
background: var(--bg-secondary, #f3ede4);
margin-left: -1.5rem;
margin-right: -1.5rem;
margin-bottom: -1.5rem;
padding: 1.25rem 1.5rem;
border-radius: 0 0 12px 9px;
} }
.latestLabel { .latestLabel {
font-size: 0.875rem; font-size: 0.75rem;
color: var(--text-secondary); color: var(--text-muted, #8a847a);
margin-bottom: 0.5rem; margin-bottom: 0.25rem;
text-transform: uppercase;
letter-spacing: 0.05em;
} }
.latestNumber { .latestNumber {
font-size: 1.75rem; font-size: 1.75rem;
font-weight: 700; font-weight: 700;
color: var(--text-primary); color: var(--accent-teal, #2d7d7d);
} }
/* Chart Section */ /* Chart Section */
.chartSection { .chartSection {
background: white; background: var(--bg-card, white);
border: 1px solid var(--border-light); border: 1px solid var(--border-color, #e5dfd5);
border-radius: var(--radius-lg); border-radius: 12px;
padding: 2rem; padding: 2rem;
margin-bottom: 2rem; margin-bottom: 2rem;
box-shadow: var(--shadow-sm); box-shadow: var(--shadow-soft, 0 2px 8px rgba(26, 22, 18, 0.06));
} }
.sectionTitle { .sectionTitle {
font-size: 1.5rem; font-size: 1.5rem;
font-weight: 600; font-weight: 600;
color: var(--text-primary); color: var(--text-primary, #1a1612);
margin-bottom: 1.5rem; margin-bottom: 1.5rem;
padding-bottom: 0.75rem; padding-bottom: 0.75rem;
border-bottom: 2px solid var(--border-light); border-bottom: 2px solid var(--border-color, #e5dfd5);
font-family: var(--font-playfair), 'Playfair Display', serif;
display: flex;
align-items: center;
gap: 0.5rem;
}
.sectionTitle::before {
content: '';
display: inline-block;
width: 4px;
height: 1em;
background: var(--accent-coral, #e07256);
border-radius: 2px;
} }
.chartContainer { .chartContainer {
@@ -218,18 +245,18 @@
.loadingMessage { .loadingMessage {
text-align: center; text-align: center;
padding: 3rem; padding: 3rem;
color: var(--text-secondary); color: var(--text-secondary, #5c564d);
font-size: 1rem; font-size: 1rem;
} }
/* Table Section */ /* Table Section */
.tableSection { .tableSection {
background: white; background: var(--bg-card, white);
border: 1px solid var(--border-light); border: 1px solid var(--border-color, #e5dfd5);
border-radius: var(--radius-lg); border-radius: 12px;
padding: 2rem; padding: 2rem;
margin-bottom: 2rem; margin-bottom: 2rem;
box-shadow: var(--shadow-sm); box-shadow: var(--shadow-soft, 0 2px 8px rgba(26, 22, 18, 0.06));
} }
.tableWrapper { .tableWrapper {
@@ -244,22 +271,25 @@
} }
.comparisonTable thead { .comparisonTable thead {
background: var(--bg-secondary); background: var(--bg-secondary, #f3ede4);
} }
.comparisonTable th { .comparisonTable th {
padding: 1rem; padding: 1rem;
text-align: left; text-align: left;
font-weight: 600; font-weight: 600;
color: var(--text-primary); color: var(--text-primary, #1a1612);
border-bottom: 2px solid var(--border-medium); border-bottom: 2px solid var(--border-color, #e5dfd5);
white-space: nowrap; white-space: nowrap;
text-transform: uppercase;
font-size: 0.75rem;
letter-spacing: 0.05em;
} }
.comparisonTable td { .comparisonTable td {
padding: 1rem; padding: 1rem;
border-bottom: 1px solid var(--border-light); border-bottom: 1px solid var(--border-color, #e5dfd5);
color: var(--text-secondary); color: var(--text-secondary, #5c564d);
text-align: left; text-align: left;
} }
@@ -268,12 +298,36 @@
} }
.comparisonTable tbody tr:hover { .comparisonTable tbody tr:hover {
background: var(--bg-secondary); background: var(--bg-secondary, #f3ede4);
} }
.yearCell { .yearCell {
font-weight: 700;
color: var(--accent-gold, #c9a227);
}
/* Empty State */
.emptyState {
text-align: center;
padding: 4rem 2rem;
background: var(--bg-card, white);
border: 1px solid var(--border-color, #e5dfd5);
border-radius: 12px;
}
.emptyStateTitle {
font-size: 1.5rem;
font-weight: 600; font-weight: 600;
color: var(--text-primary); color: var(--text-primary, #1a1612);
margin-bottom: 0.5rem;
font-family: var(--font-playfair), 'Playfair Display', serif;
}
.emptyStateDescription {
font-size: 1rem;
color: var(--text-secondary, #5c564d);
max-width: 400px;
margin: 0 auto 1.5rem;
} }
/* Responsive Design */ /* Responsive Design */
@@ -288,12 +342,14 @@
} }
.header h1 { .header h1 {
font-size: 1.5rem; font-size: 1.75rem;
} }
.metricSelector { .metricSelector {
flex-direction: column; flex-direction: column;
align-items: stretch; align-items: stretch;
padding: 1rem;
border-radius: 8px;
} }
.metricSelect { .metricSelect {
@@ -304,6 +360,12 @@
grid-template-columns: 1fr; grid-template-columns: 1fr;
} }
.chartSection,
.tableSection {
padding: 1rem;
border-radius: 8px;
}
.chartContainer { .chartContainer {
height: 300px; height: 300px;
} }
@@ -316,4 +378,12 @@
.comparisonTable td { .comparisonTable td {
padding: 0.75rem 0.5rem; padding: 0.75rem 0.5rem;
} }
.latestValue {
margin-left: -1rem;
margin-right: -1rem;
margin-bottom: -1rem;
padding: 1rem;
border-radius: 0 0 8px 5px;
}
} }

View File

@@ -1,37 +1,38 @@
.filterBar { .filterBar {
background: white; background: var(--bg-card, white);
border: 1px solid #e5e7eb; border: 1px solid var(--border-color, #e5dfd5);
border-radius: 8px; border-radius: 12px;
padding: 1.5rem; padding: 1.5rem;
margin-bottom: 2rem; margin-bottom: 2rem;
box-shadow: var(--shadow-soft, 0 2px 8px rgba(26, 22, 18, 0.06));
} }
.searchModeToggle { .searchModeToggle {
display: flex; display: flex;
gap: 0.5rem; gap: 0.5rem;
margin-bottom: 1rem; margin-bottom: 1rem;
background: #f3f4f6; background: var(--bg-secondary, #f3ede4);
padding: 0.25rem; padding: 0.25rem;
border-radius: 6px; border-radius: 8px;
} }
.searchModeToggle button { .searchModeToggle button {
flex: 1; flex: 1;
padding: 0.5rem 1rem; padding: 0.625rem 1rem;
font-size: 0.875rem; font-size: 0.875rem;
font-weight: 500; font-weight: 500;
background: transparent; background: transparent;
border: none; border: none;
border-radius: 4px; border-radius: 6px;
cursor: pointer; cursor: pointer;
color: #6b7280; color: var(--text-secondary, #5c564d);
transition: all 0.2s ease; transition: all 0.2s ease;
} }
.searchModeToggle button.active { .searchModeToggle button.active {
background: white; background: var(--bg-card, white);
color: #1f2937; color: var(--accent-coral, #e07256);
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); box-shadow: 0 2px 4px rgba(26, 22, 18, 0.08);
} }
.searchSection { .searchSection {
@@ -40,17 +41,22 @@
.searchInput { .searchInput {
width: 100%; width: 100%;
padding: 0.75rem 1rem; padding: 0.875rem 1rem;
font-size: 1rem; font-size: 1rem;
border: 1px solid #d1d5db; border: 1px solid var(--border-color, #e5dfd5);
border-radius: 6px; border-radius: 8px;
outline: none; outline: none;
transition: all 0.2s ease; transition: all 0.2s ease;
background: var(--bg-card, white);
} }
.searchInput:focus { .searchInput:focus {
border-color: #3b82f6; border-color: var(--accent-coral, #e07256);
box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1); box-shadow: 0 0 0 3px rgba(224, 114, 86, 0.15);
}
.searchInput::placeholder {
color: var(--text-muted, #8a847a);
} }
.locationForm { .locationForm {
@@ -61,43 +67,59 @@
.postcodeInput { .postcodeInput {
flex: 1; flex: 1;
padding: 0.75rem 1rem; padding: 0.875rem 1rem;
font-size: 1rem; font-size: 1rem;
border: 1px solid #d1d5db; border: 1px solid var(--border-color, #e5dfd5);
border-radius: 6px; border-radius: 8px;
outline: none; outline: none;
transition: all 0.2s ease; transition: all 0.2s ease;
background: var(--bg-card, white);
} }
.postcodeInput:focus { .postcodeInput:focus {
border-color: #3b82f6; border-color: var(--accent-coral, #e07256);
box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1); box-shadow: 0 0 0 3px rgba(224, 114, 86, 0.15);
}
.postcodeInput::placeholder {
color: var(--text-muted, #8a847a);
} }
.radiusSelect { .radiusSelect {
padding: 0.75rem 1rem; padding: 0.875rem 1rem;
font-size: 1rem; font-size: 1rem;
border: 1px solid #d1d5db; border: 1px solid var(--border-color, #e5dfd5);
border-radius: 6px; border-radius: 8px;
background: white; background: var(--bg-card, white);
cursor: pointer; cursor: pointer;
outline: none; outline: none;
color: var(--text-primary, #1a1612);
}
.radiusSelect:focus {
border-color: var(--accent-coral, #e07256);
} }
.searchButton { .searchButton {
padding: 0.75rem 1.5rem; padding: 0.875rem 1.5rem;
font-size: 1rem; font-size: 1rem;
font-weight: 500; font-weight: 600;
background: #3b82f6; background: var(--accent-coral, #e07256);
color: white; color: white;
border: none; border: none;
border-radius: 6px; border-radius: 8px;
cursor: pointer; cursor: pointer;
transition: all 0.2s ease; transition: all 0.2s ease;
} }
.searchButton:hover { .searchButton:hover {
background: #2563eb; background: var(--accent-coral-dark, #c45a3f);
transform: translateY(-1px);
box-shadow: 0 4px 12px rgba(224, 114, 86, 0.3);
}
.searchButton:active {
transform: translateY(0);
} }
.filters { .filters {
@@ -111,36 +133,39 @@
min-width: 200px; min-width: 200px;
padding: 0.75rem 1rem; padding: 0.75rem 1rem;
font-size: 0.875rem; font-size: 0.875rem;
border: 1px solid #d1d5db; border: 1px solid var(--border-color, #e5dfd5);
border-radius: 6px; border-radius: 8px;
background: white; background: var(--bg-card, white);
cursor: pointer; cursor: pointer;
outline: none; outline: none;
color: var(--text-primary, #1a1612);
} }
.filterSelect:focus { .filterSelect:focus {
border-color: #3b82f6; border-color: var(--accent-coral, #e07256);
} }
.clearButton { .clearButton {
padding: 0.75rem 1rem; padding: 0.75rem 1rem;
font-size: 0.875rem; font-size: 0.875rem;
font-weight: 500; font-weight: 500;
background: #f3f4f6; background: var(--bg-secondary, #f3ede4);
color: #374151; color: var(--text-secondary, #5c564d);
border: 1px solid #d1d5db; border: 1px solid var(--border-color, #e5dfd5);
border-radius: 6px; border-radius: 8px;
cursor: pointer; cursor: pointer;
transition: all 0.2s ease; transition: all 0.2s ease;
} }
.clearButton:hover { .clearButton:hover {
background: #e5e7eb; background: var(--border-color, #e5dfd5);
color: var(--text-primary, #1a1612);
} }
@media (max-width: 768px) { @media (max-width: 768px) {
.filterBar { .filterBar {
padding: 1rem; padding: 1rem;
border-radius: 8px;
} }
.locationForm { .locationForm {

View File

@@ -1,6 +1,6 @@
.footer { .footer {
background: #1f2937; background: var(--accent-navy, #2c3e50);
color: #d1d5db; color: var(--bg-secondary, #f3ede4);
margin-top: auto; margin-top: auto;
} }
@@ -27,21 +27,22 @@
margin: 0; margin: 0;
font-size: 1.25rem; font-size: 1.25rem;
font-weight: 700; font-weight: 700;
color: white; color: var(--bg-primary, #faf7f2);
font-family: var(--font-playfair), 'Playfair Display', serif;
} }
.description { .description {
margin: 0; margin: 0;
font-size: 0.875rem; font-size: 0.875rem;
line-height: 1.6; line-height: 1.6;
color: #9ca3af; color: rgba(250, 247, 242, 0.7);
} }
.sectionTitle { .sectionTitle {
margin: 0; margin: 0;
font-size: 0.875rem; font-size: 0.875rem;
font-weight: 600; font-weight: 600;
color: white; color: var(--accent-gold, #c9a227);
text-transform: uppercase; text-transform: uppercase;
letter-spacing: 0.05em; letter-spacing: 0.05em;
} }
@@ -57,24 +58,24 @@
.link { .link {
font-size: 0.875rem; font-size: 0.875rem;
color: #9ca3af; color: rgba(250, 247, 242, 0.7);
text-decoration: none; text-decoration: none;
transition: color 0.2s ease; transition: color 0.2s ease;
} }
.link:hover { .link:hover {
color: white; color: var(--accent-gold, #c9a227);
} }
.linkDisabled { .linkDisabled {
font-size: 0.875rem; font-size: 0.875rem;
color: #6b7280; color: rgba(250, 247, 242, 0.4);
cursor: not-allowed; cursor: not-allowed;
} }
.bottom { .bottom {
padding-top: 2rem; padding-top: 2rem;
border-top: 1px solid #374151; border-top: 1px solid rgba(250, 247, 242, 0.15);
display: flex; display: flex;
flex-direction: column; flex-direction: column;
gap: 0.5rem; gap: 0.5rem;
@@ -84,15 +85,15 @@
.disclaimer { .disclaimer {
margin: 0; margin: 0;
font-size: 0.875rem; font-size: 0.875rem;
color: #9ca3af; color: rgba(250, 247, 242, 0.6);
} }
.disclaimer .link { .disclaimer .link {
color: #60a5fa; color: var(--accent-coral, #e07256);
} }
.disclaimer .link:hover { .disclaimer .link:hover {
color: #93c5fd; color: var(--accent-gold, #c9a227);
} }
@media (max-width: 768px) { @media (max-width: 768px) {

View File

@@ -71,7 +71,7 @@ export function Footer() {
<div className={styles.bottom}> <div className={styles.bottom}>
<p className={styles.copyright}> <p className={styles.copyright}>
© {currentYear} SchoolCompare. Data © Crown copyright. © {currentYear} SchoolCompare.co.uk
</p> </p>
<p className={styles.disclaimer}> <p className={styles.disclaimer}>
This is an unofficial service. Official school performance data is available at{' '} This is an unofficial service. Official school performance data is available at{' '}

View File

@@ -5,22 +5,27 @@
.hero { .hero {
text-align: center; text-align: center;
margin-bottom: 3rem; margin-bottom: 3rem;
padding: 2rem 0; padding: 3rem 2rem;
background: linear-gradient(135deg, var(--bg-secondary, #f3ede4) 0%, var(--bg-primary, #faf7f2) 100%);
border-radius: 16px;
border: 1px solid var(--border-color, #e5dfd5);
} }
.heroTitle { .heroTitle {
font-size: 2.5rem; font-size: 2.75rem;
font-weight: 700; font-weight: 700;
color: var(--text-primary); color: var(--text-primary, #1a1612);
margin-bottom: 1rem; margin-bottom: 1rem;
line-height: 1.2; line-height: 1.2;
font-family: var(--font-playfair), 'Playfair Display', serif;
} }
.heroDescription { .heroDescription {
font-size: 1.125rem; font-size: 1.125rem;
color: var(--text-secondary); color: var(--text-secondary, #5c564d);
max-width: 600px; max-width: 600px;
margin: 0 auto; margin: 0 auto;
line-height: 1.6;
} }
.locationBanner { .locationBanner {
@@ -28,16 +33,18 @@
align-items: center; align-items: center;
gap: 0.75rem; gap: 0.75rem;
padding: 1rem 1.5rem; padding: 1rem 1.5rem;
background: #eff6ff; background: rgba(45, 125, 125, 0.1);
border: 1px solid #bfdbfe; border: 1px solid rgba(45, 125, 125, 0.3);
border-radius: 8px; border-radius: 12px;
margin-bottom: 2rem; margin-bottom: 2rem;
font-size: 0.9375rem; font-size: 0.9375rem;
color: #1e40af; color: var(--accent-teal, #2d7d7d);
font-weight: 500;
} }
.locationIcon { .locationIcon {
font-size: 1.25rem; font-size: 1.25rem;
color: var(--accent-teal, #2d7d7d);
} }
.results { .results {
@@ -50,25 +57,42 @@
.sectionHeader h2 { .sectionHeader h2 {
font-size: 1.875rem; font-size: 1.875rem;
font-weight: 600; font-weight: 700;
margin-bottom: 0.5rem; margin-bottom: 0.5rem;
color: var(--text-primary, #1a1612);
font-family: var(--font-playfair), 'Playfair Display', serif;
} }
.sectionDescription { .sectionDescription {
font-size: 1rem; font-size: 1rem;
color: var(--text-secondary); color: var(--text-secondary, #5c564d);
margin: 0; margin: 0;
line-height: 1.6;
} }
.resultsHeader { .resultsHeader {
margin-bottom: 2rem; margin-bottom: 2rem;
padding-bottom: 1rem;
border-bottom: 2px solid var(--border-color, #e5dfd5);
} }
.resultsHeader h2 { .resultsHeader h2 {
font-size: 1.5rem; font-size: 1.5rem;
font-weight: 600; font-weight: 600;
color: var(--text-primary); color: var(--text-primary, #1a1612);
margin: 0; margin: 0;
display: flex;
align-items: center;
gap: 0.5rem;
}
.resultsHeader h2::before {
content: '';
display: inline-block;
width: 4px;
height: 1.25em;
background: var(--accent-coral, #e07256);
border-radius: 2px;
} }
.grid { .grid {
@@ -78,10 +102,34 @@
margin-bottom: 2rem; margin-bottom: 2rem;
} }
.emptyState {
text-align: center;
padding: 4rem 2rem;
background: var(--bg-card, white);
border: 1px solid var(--border-color, #e5dfd5);
border-radius: 12px;
}
.emptyStateTitle {
font-size: 1.5rem;
font-weight: 600;
color: var(--text-primary, #1a1612);
margin-bottom: 0.5rem;
font-family: var(--font-playfair), 'Playfair Display', serif;
}
.emptyStateDescription {
font-size: 1rem;
color: var(--text-secondary, #5c564d);
max-width: 400px;
margin: 0 auto;
}
@media (max-width: 768px) { @media (max-width: 768px) {
.hero { .hero {
padding: 1rem 0; padding: 2rem 1rem;
margin-bottom: 2rem; margin-bottom: 2rem;
border-radius: 12px;
} }
.heroTitle { .heroTitle {
@@ -99,5 +147,10 @@
.locationBanner { .locationBanner {
padding: 0.875rem 1rem; padding: 0.875rem 1rem;
font-size: 0.875rem; font-size: 0.875rem;
border-radius: 8px;
}
.emptyState {
padding: 3rem 1.5rem;
} }
} }

View File

@@ -2,9 +2,9 @@
position: sticky; position: sticky;
top: 0; top: 0;
z-index: 100; z-index: 100;
background: white; background: var(--bg-card, white);
border-bottom: 1px solid #e5e7eb; border-bottom: 1px solid var(--border-color, #e5dfd5);
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05); box-shadow: 0 2px 8px rgba(26, 22, 18, 0.06);
} }
.container { .container {
@@ -22,22 +22,26 @@
align-items: center; align-items: center;
gap: 0.75rem; gap: 0.75rem;
text-decoration: none; text-decoration: none;
color: #1f2937; color: var(--text-primary, #1a1612);
font-size: 1.25rem; font-size: 1.25rem;
font-weight: 700; font-weight: 700;
transition: color 0.2s ease; transition: color 0.2s ease;
} }
.logo:hover { .logo:hover {
color: #3b82f6; color: var(--accent-coral, #e07256);
} }
.logoIcon { .logoIcon {
font-size: 1.5rem; width: 36px;
height: 36px;
color: var(--accent-coral, #e07256);
} }
.logoText { .logoText {
font-family: var(--font-playfair), 'Playfair Display', serif;
font-weight: 700; font-weight: 700;
letter-spacing: -0.01em;
} }
.nav { .nav {
@@ -53,20 +57,20 @@
padding: 0.625rem 1rem; padding: 0.625rem 1rem;
font-size: 0.9375rem; font-size: 0.9375rem;
font-weight: 500; font-weight: 500;
color: #6b7280; color: var(--text-secondary, #5c564d);
text-decoration: none; text-decoration: none;
border-radius: 6px; border-radius: 6px;
transition: all 0.2s ease; transition: all 0.2s ease;
} }
.navLink:hover { .navLink:hover {
color: #1f2937; color: var(--text-primary, #1a1612);
background: #f3f4f6; background: var(--bg-secondary, #f3ede4);
} }
.navLink.active { .navLink.active {
color: #3b82f6; color: var(--accent-coral, #e07256);
background: #eff6ff; background: rgba(224, 114, 86, 0.1);
} }
.badge { .badge {
@@ -79,7 +83,7 @@
font-size: 0.75rem; font-size: 0.75rem;
font-weight: 600; font-weight: 600;
color: white; color: white;
background: #3b82f6; background: var(--accent-coral, #e07256);
border-radius: 9999px; border-radius: 9999px;
} }

View File

@@ -8,29 +8,31 @@
} }
.header h1 { .header h1 {
font-size: 2rem; font-size: 2.25rem;
font-weight: 700; font-weight: 700;
color: var(--text-primary); color: var(--text-primary, #1a1612);
margin-bottom: 0.5rem; margin-bottom: 0.5rem;
font-family: var(--font-playfair), 'Playfair Display', serif;
} }
.subtitle { .subtitle {
font-size: 1rem; font-size: 1rem;
color: var(--text-secondary); color: var(--text-secondary, #5c564d);
margin: 0; margin: 0;
line-height: 1.6;
} }
/* Filters */ /* Filters */
.filters { .filters {
background: white; background: var(--bg-card, white);
border: 1px solid var(--border-light); border: 1px solid var(--border-color, #e5dfd5);
border-radius: var(--radius-lg); border-radius: 12px;
padding: 1.5rem; padding: 1.5rem;
margin-bottom: 2rem; margin-bottom: 2rem;
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
gap: 1.5rem; gap: 1.5rem;
box-shadow: var(--shadow-sm); box-shadow: var(--shadow-soft, 0 2px 8px rgba(26, 22, 18, 0.06));
} }
.filterGroup { .filterGroup {
@@ -43,8 +45,8 @@
.filterLabel { .filterLabel {
font-size: 0.9375rem; font-size: 0.9375rem;
font-weight: 500; font-weight: 600;
color: var(--text-primary); color: var(--text-primary, #1a1612);
white-space: nowrap; white-space: nowrap;
} }
@@ -52,31 +54,31 @@
flex: 1; flex: 1;
padding: 0.625rem 1rem; padding: 0.625rem 1rem;
font-size: 0.9375rem; font-size: 0.9375rem;
border: 1px solid var(--border-medium); border: 1px solid var(--border-color, #e5dfd5);
border-radius: var(--radius-md); border-radius: 8px;
background: white; background: var(--bg-card, white);
color: var(--text-primary); color: var(--text-primary, #1a1612);
cursor: pointer; cursor: pointer;
transition: all var(--transition); transition: all 0.2s ease;
} }
.filterSelect:hover { .filterSelect:hover {
border-color: var(--primary); border-color: var(--accent-coral, #e07256);
} }
.filterSelect:focus { .filterSelect:focus {
outline: none; outline: none;
border-color: var(--primary); border-color: var(--accent-coral, #e07256);
box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1); box-shadow: 0 0 0 3px rgba(224, 114, 86, 0.15);
} }
/* Rankings Section */ /* Rankings Section */
.rankingsSection { .rankingsSection {
background: white; background: var(--bg-card, white);
border: 1px solid var(--border-light); border: 1px solid var(--border-color, #e5dfd5);
border-radius: var(--radius-lg); border-radius: 12px;
padding: 2rem; padding: 2rem;
box-shadow: var(--shadow-sm); box-shadow: var(--shadow-soft, 0 2px 8px rgba(26, 22, 18, 0.06));
} }
.tableWrapper { .tableWrapper {
@@ -90,16 +92,19 @@
} }
.rankingsTable thead { .rankingsTable thead {
background: var(--bg-secondary); background: var(--bg-secondary, #f3ede4);
} }
.rankingsTable th { .rankingsTable th {
padding: 1rem; padding: 1rem;
text-align: left; text-align: left;
font-weight: 600; font-weight: 600;
color: var(--text-primary); color: var(--text-primary, #1a1612);
border-bottom: 2px solid var(--border-medium); border-bottom: 2px solid var(--border-color, #e5dfd5);
white-space: nowrap; white-space: nowrap;
text-transform: uppercase;
font-size: 0.75rem;
letter-spacing: 0.05em;
} }
.rankHeader { .rankHeader {
@@ -130,8 +135,8 @@
.rankingsTable td { .rankingsTable td {
padding: 1rem; padding: 1rem;
border-bottom: 1px solid var(--border-light); border-bottom: 1px solid var(--border-color, #e5dfd5);
color: var(--text-secondary); color: var(--text-secondary, #5c564d);
} }
.rankingsTable tbody tr:last-child td { .rankingsTable tbody tr:last-child td {
@@ -139,28 +144,28 @@
} }
.rankingsTable tbody tr:hover { .rankingsTable tbody tr:hover {
background: var(--bg-secondary); background: var(--bg-secondary, #f3ede4);
} }
/* Top 3 Highlighting */ /* Top 3 Highlighting with Gold */
.rank1 { .rank1 {
background: linear-gradient(90deg, rgba(255, 215, 0, 0.1) 0%, transparent 100%) !important; background: linear-gradient(90deg, rgba(201, 162, 39, 0.15) 0%, transparent 100%) !important;
} }
.rank2 { .rank2 {
background: linear-gradient(90deg, rgba(192, 192, 192, 0.1) 0%, transparent 100%) !important; background: linear-gradient(90deg, rgba(192, 192, 192, 0.15) 0%, transparent 100%) !important;
} }
.rank3 { .rank3 {
background: linear-gradient(90deg, rgba(205, 127, 50, 0.1) 0%, transparent 100%) !important; background: linear-gradient(90deg, rgba(205, 127, 50, 0.15) 0%, transparent 100%) !important;
} }
.rankCell { .rankCell {
display: flex; display: flex;
align-items: center; align-items: center;
gap: 0.5rem; gap: 0.5rem;
font-weight: 600; font-weight: 700;
color: var(--text-primary); color: var(--text-primary, #1a1612);
} }
.medal { .medal {
@@ -170,6 +175,7 @@
.rankNumber { .rankNumber {
font-size: 1rem; font-size: 1rem;
color: var(--accent-gold, #c9a227);
} }
.schoolCell { .schoolCell {
@@ -177,19 +183,18 @@
} }
.schoolLink { .schoolLink {
color: var(--text-primary); color: var(--text-primary, #1a1612);
text-decoration: none; text-decoration: none;
transition: color var(--transition); transition: color 0.2s ease;
} }
.schoolLink:hover { .schoolLink:hover {
color: var(--primary); color: var(--accent-coral, #e07256);
text-decoration: underline;
} }
.areaCell, .areaCell,
.typeCell { .typeCell {
color: var(--text-secondary); color: var(--text-secondary, #5c564d);
} }
.valueCell { .valueCell {
@@ -198,7 +203,8 @@
} }
.valueCell strong { .valueCell strong {
color: var(--text-primary); color: var(--accent-teal, #2d7d7d);
font-weight: 700;
} }
.actionCell { .actionCell {
@@ -208,30 +214,32 @@
.addButton { .addButton {
padding: 0.5rem 1rem; padding: 0.5rem 1rem;
font-size: 0.875rem; font-size: 0.875rem;
font-weight: 500; font-weight: 600;
border: none; border: none;
border-radius: var(--radius-md); border-radius: 8px;
cursor: pointer; cursor: pointer;
transition: all var(--transition); transition: all 0.2s ease;
background: var(--primary); background: var(--accent-coral, #e07256);
color: white; color: white;
} }
.addButton:hover:not(:disabled) { .addButton:hover:not(:disabled) {
background: var(--primary-dark); background: var(--accent-coral-dark, #c45a3f);
transform: translateY(-1px);
box-shadow: 0 4px 12px rgba(224, 114, 86, 0.3);
} }
.addButton:disabled { .addButton:disabled {
background: var(--secondary); background: var(--bg-secondary, #f3ede4);
color: var(--text-muted, #8a847a);
cursor: not-allowed; cursor: not-allowed;
opacity: 0.6;
} }
/* No Results */ /* No Results */
.noResults { .noResults {
text-align: center; text-align: center;
padding: 3rem 2rem; padding: 4rem 2rem;
color: var(--text-secondary); color: var(--text-secondary, #5c564d);
} }
.noResults p { .noResults p {
@@ -242,12 +250,14 @@
/* Responsive Design */ /* Responsive Design */
@media (max-width: 768px) { @media (max-width: 768px) {
.header h1 { .header h1 {
font-size: 1.5rem; font-size: 1.75rem;
} }
.filters { .filters {
flex-direction: column; flex-direction: column;
gap: 1rem; gap: 1rem;
padding: 1rem;
border-radius: 8px;
} }
.filterGroup { .filterGroup {
@@ -258,6 +268,7 @@
.rankingsSection { .rankingsSection {
padding: 1rem; padding: 1rem;
border-radius: 8px;
} }
.rankingsTable { .rankingsTable {

View File

@@ -1,13 +1,15 @@
.card { .card {
background: white; background: var(--bg-card, white);
border: 1px solid #e5e7eb; border: 1px solid var(--border-color, #e5dfd5);
border-radius: 8px; border-left: 3px solid transparent;
border-radius: 12px;
padding: 1.5rem; padding: 1.5rem;
transition: all 0.2s ease; transition: all 0.3s ease;
} }
.card:hover { .card:hover {
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); border-left-color: var(--accent-coral, #e07256);
box-shadow: var(--shadow-medium, 0 4px 20px rgba(26, 22, 18, 0.1));
transform: translateY(-2px); transform: translateY(-2px);
} }
@@ -24,25 +26,27 @@
font-size: 1.125rem; font-size: 1.125rem;
font-weight: 600; font-weight: 600;
line-height: 1.4; line-height: 1.4;
font-family: var(--font-playfair), 'Playfair Display', serif;
} }
.title a { .title a {
color: #1f2937; color: var(--text-primary, #1a1612);
text-decoration: none; text-decoration: none;
transition: color 0.2s ease;
} }
.title a:hover { .title a:hover {
color: #3b82f6; color: var(--accent-coral, #e07256);
text-decoration: underline;
} }
.distance { .distance {
font-size: 0.875rem; font-size: 0.875rem;
color: #6b7280; color: var(--accent-teal, #2d7d7d);
white-space: nowrap; white-space: nowrap;
background: #f3f4f6; background: rgba(45, 125, 125, 0.1);
padding: 0.25rem 0.5rem; padding: 0.25rem 0.75rem;
border-radius: 4px; border-radius: 20px;
font-weight: 500;
} }
.meta { .meta {
@@ -54,9 +58,9 @@
.metaItem { .metaItem {
font-size: 0.875rem; font-size: 0.875rem;
color: #6b7280; color: var(--text-secondary, #5c564d);
padding: 0.25rem 0.75rem; padding: 0.25rem 0.75rem;
background: #f9fafb; background: var(--bg-secondary, #f3ede4);
border-radius: 4px; border-radius: 4px;
} }
@@ -66,8 +70,9 @@
gap: 1rem; gap: 1rem;
margin-bottom: 1.5rem; margin-bottom: 1.5rem;
padding: 1rem; padding: 1rem;
background: #f9fafb; background: var(--bg-secondary, #f3ede4);
border-radius: 6px; border-radius: 8px;
border: 1px solid var(--border-color, #e5dfd5);
} }
.metric { .metric {
@@ -78,7 +83,7 @@
.metricLabel { .metricLabel {
font-size: 0.75rem; font-size: 0.75rem;
color: #6b7280; color: var(--text-muted, #8a847a);
text-transform: uppercase; text-transform: uppercase;
letter-spacing: 0.05em; letter-spacing: 0.05em;
} }
@@ -91,7 +96,8 @@
.metricValue strong { .metricValue strong {
font-size: 1.125rem; font-size: 1.125rem;
color: #1f2937; color: var(--text-primary, #1a1612);
font-weight: 700;
} }
.trend { .trend {
@@ -110,8 +116,8 @@
flex: 1; flex: 1;
padding: 0.625rem 1rem; padding: 0.625rem 1rem;
font-size: 0.875rem; font-size: 0.875rem;
font-weight: 500; font-weight: 600;
border-radius: 6px; border-radius: 8px;
border: none; border: none;
cursor: pointer; cursor: pointer;
text-align: center; text-align: center;
@@ -120,32 +126,37 @@
} }
.btnSecondary { .btnSecondary {
background: white; background: var(--bg-card, white);
color: #374151; color: var(--accent-teal, #2d7d7d);
border: 1px solid #d1d5db; border: 2px solid var(--accent-teal, #2d7d7d);
} }
.btnSecondary:hover { .btnSecondary:hover {
background: #f9fafb; background: var(--accent-teal, #2d7d7d);
border-color: #9ca3af; color: white;
transform: translateY(-1px);
box-shadow: 0 4px 12px rgba(45, 125, 125, 0.3);
} }
.btnPrimary { .btnPrimary {
background: #3b82f6; background: var(--accent-coral, #e07256);
color: white; color: white;
} }
.btnPrimary:hover { .btnPrimary:hover {
background: #2563eb; background: var(--accent-coral-dark, #c45a3f);
transform: translateY(-1px);
box-shadow: 0 4px 12px rgba(224, 114, 86, 0.3);
} }
.btnPrimary:active { .btnPrimary:active {
transform: scale(0.98); transform: translateY(0);
} }
@media (max-width: 640px) { @media (max-width: 640px) {
.card { .card {
padding: 1rem; padding: 1rem;
border-radius: 8px;
} }
.metrics { .metrics {