diff --git a/nextjs-app/app/globals.css b/nextjs-app/app/globals.css index 2c1ffdb..285fc85 100644 --- a/nextjs-app/app/globals.css +++ b/nextjs-app/app/globals.css @@ -92,7 +92,7 @@ body { .header-content { max-width: 1400px; margin: 0 auto; - padding: 1rem 2rem; + padding: 0.625rem 1.5rem; display: flex; justify-content: space-between; align-items: center; @@ -101,14 +101,14 @@ body { .logo { display: flex; align-items: center; - gap: 0.75rem; + gap: 0.5rem; text-decoration: none; color: inherit; } .logo-icon { - width: 40px; - height: 40px; + width: 32px; + height: 32px; color: var(--accent-coral); } @@ -119,14 +119,14 @@ body { .logo-title { font-family: var(--font-playfair), 'Playfair Display', Georgia, serif; - font-size: 1.25rem; + font-size: 1.125rem; font-weight: 700; color: var(--text-primary); line-height: 1.2; } .logo-subtitle { - font-size: 0.7rem; + font-size: 0.625rem; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.1em; @@ -134,15 +134,15 @@ body { .nav { display: flex; - gap: 0.5rem; + gap: 0.25rem; } .nav-link { - padding: 0.6rem 1.2rem; + padding: 0.4rem 0.875rem; text-decoration: none; color: var(--text-secondary); font-weight: 500; - font-size: 0.9rem; + font-size: 0.8125rem; border-radius: var(--radius-md); transition: var(--transition); } @@ -161,7 +161,7 @@ body { .main { max-width: 1400px; margin: 0 auto; - padding: 2rem; + padding: 1.25rem 1.5rem; } .view { @@ -181,7 +181,7 @@ body { /* Hero Section */ .hero { text-align: center; - padding: 3rem 0 2rem; + padding: 1.5rem 0 1rem; } .hero-title { diff --git a/nextjs-app/components/FilterBar.module.css b/nextjs-app/components/FilterBar.module.css index b3a3ab6..9b782f0 100644 --- a/nextjs-app/components/FilterBar.module.css +++ b/nextjs-app/components/FilterBar.module.css @@ -1,36 +1,36 @@ .filterBar { background: var(--bg-card, white); border: 1px solid var(--border-color, #e5dfd5); - border-radius: 12px; - padding: 1.5rem; - margin-bottom: 2rem; + border-radius: 10px; + padding: 1rem 1.25rem; + margin-bottom: 1.25rem; box-shadow: var(--shadow-soft, 0 2px 8px rgba(26, 22, 18, 0.06)); } .filterBar.withHero { - background: linear-gradient(180deg, var(--bg-secondary, #f3ede4) 0%, var(--bg-card, white) 40%); - padding: 1.75rem 1.5rem 1.5rem; + background: linear-gradient(180deg, var(--bg-secondary, #f3ede4) 0%, var(--bg-card, white) 50%); + padding: 1.25rem 1.25rem 1rem; } .heroSection { text-align: center; - margin-bottom: 1.25rem; - padding-bottom: 1.25rem; + margin-bottom: 0.875rem; + padding-bottom: 0.875rem; border-bottom: 1px solid var(--border-color, #e5dfd5); } .heroTitle { - font-size: 1.75rem; + font-size: 1.5rem; font-weight: 700; color: var(--text-primary, #1a1612); - margin: 0 0 0.375rem; + margin: 0 0 0.25rem; line-height: 1.2; letter-spacing: -0.02em; font-family: var(--font-playfair), 'Playfair Display', serif; } .heroDescription { - font-size: 0.9375rem; + font-size: 0.875rem; color: var(--text-secondary, #5c564d); margin: 0; line-height: 1.4; @@ -38,21 +38,21 @@ .searchModeToggle { display: flex; - gap: 0.5rem; - margin-bottom: 1rem; + gap: 0.25rem; + margin-bottom: 0.75rem; background: var(--bg-secondary, #f3ede4); - padding: 0.25rem; - border-radius: 8px; + padding: 0.2rem; + border-radius: 6px; } .searchModeToggle button { flex: 1; - padding: 0.625rem 1rem; - font-size: 0.875rem; + padding: 0.5rem 0.875rem; + font-size: 0.8125rem; font-weight: 500; background: transparent; border: none; - border-radius: 6px; + border-radius: 5px; cursor: pointer; color: var(--text-secondary, #5c564d); transition: all 0.2s ease; @@ -65,15 +65,15 @@ } .searchSection { - margin-bottom: 1rem; + margin-bottom: 0.75rem; } .searchInput { width: 100%; - padding: 0.875rem 1rem; - font-size: 1rem; + padding: 0.625rem 0.875rem; + font-size: 0.9375rem; border: 1px solid var(--border-color, #e5dfd5); - border-radius: 8px; + border-radius: 6px; outline: none; transition: all 0.2s ease; background: var(--bg-card, white); @@ -90,16 +90,16 @@ .locationForm { display: flex; - gap: 0.75rem; - margin-bottom: 1rem; + gap: 0.5rem; + margin-bottom: 0.75rem; } .postcodeInput { flex: 1; - padding: 0.875rem 1rem; - font-size: 1rem; + padding: 0.625rem 0.875rem; + font-size: 0.9375rem; border: 1px solid var(--border-color, #e5dfd5); - border-radius: 8px; + border-radius: 6px; outline: none; transition: all 0.2s ease; background: var(--bg-card, white); @@ -107,7 +107,7 @@ .postcodeInput:focus { border-color: var(--accent-coral, #e07256); - box-shadow: 0 0 0 3px rgba(224, 114, 86, 0.15); + box-shadow: 0 0 0 2px rgba(224, 114, 86, 0.15); } .postcodeInput::placeholder { @@ -115,10 +115,10 @@ } .radiusSelect { - padding: 0.875rem 1rem; - font-size: 1rem; + padding: 0.625rem 0.75rem; + font-size: 0.9375rem; border: 1px solid var(--border-color, #e5dfd5); - border-radius: 8px; + border-radius: 6px; background: var(--bg-card, white); cursor: pointer; outline: none; @@ -130,13 +130,13 @@ } .searchButton { - padding: 0.875rem 1.5rem; - font-size: 1rem; + padding: 0.625rem 1.25rem; + font-size: 0.9375rem; font-weight: 600; background: var(--accent-coral, #e07256); color: white; border: none; - border-radius: 8px; + border-radius: 6px; cursor: pointer; transition: all 0.2s ease; } @@ -153,17 +153,17 @@ .filters { display: flex; - gap: 0.75rem; + gap: 0.5rem; flex-wrap: wrap; } .filterSelect { flex: 1; - min-width: 200px; - padding: 0.75rem 1rem; - font-size: 0.875rem; + min-width: 180px; + padding: 0.5rem 0.75rem; + font-size: 0.8125rem; border: 1px solid var(--border-color, #e5dfd5); - border-radius: 8px; + border-radius: 6px; background: var(--bg-card, white); cursor: pointer; outline: none; @@ -175,13 +175,13 @@ } .clearButton { - padding: 0.75rem 1rem; - font-size: 0.875rem; + padding: 0.5rem 0.75rem; + font-size: 0.8125rem; font-weight: 500; background: var(--bg-secondary, #f3ede4); color: var(--text-secondary, #5c564d); border: 1px solid var(--border-color, #e5dfd5); - border-radius: 8px; + border-radius: 6px; cursor: pointer; transition: all 0.2s ease; } @@ -193,25 +193,25 @@ @media (max-width: 768px) { .filterBar { - padding: 1rem; + padding: 0.875rem; border-radius: 8px; } .filterBar.withHero { - padding: 1.25rem 1rem 1rem; + padding: 1rem 0.875rem 0.875rem; } .heroSection { - margin-bottom: 1rem; - padding-bottom: 1rem; + margin-bottom: 0.75rem; + padding-bottom: 0.75rem; } .heroTitle { - font-size: 1.375rem; + font-size: 1.25rem; } .heroDescription { - font-size: 0.875rem; + font-size: 0.8125rem; } .locationForm { diff --git a/nextjs-app/components/HomeView.module.css b/nextjs-app/components/HomeView.module.css index cf51638..f67d6e5 100644 --- a/nextjs-app/components/HomeView.module.css +++ b/nextjs-app/components/HomeView.module.css @@ -6,20 +6,20 @@ display: flex; align-items: center; justify-content: space-between; - gap: 1rem; - margin-bottom: 2rem; + gap: 0.75rem; + margin-bottom: 1rem; flex-wrap: wrap; } .locationBanner { display: flex; align-items: center; - gap: 0.75rem; - padding: 0.75rem 1.25rem; + gap: 0.5rem; + padding: 0.5rem 1rem; background: rgba(45, 125, 125, 0.1); border: 1px solid rgba(45, 125, 125, 0.3); - border-radius: 10px; - font-size: 0.9375rem; + border-radius: 8px; + font-size: 0.875rem; color: var(--accent-teal, #2d7d7d); font-weight: 500; } @@ -32,22 +32,22 @@ /* View Toggle */ .viewToggle { display: flex; - gap: 0.25rem; + gap: 0.2rem; background: var(--bg-secondary, #f3ede4); - padding: 0.25rem; - border-radius: 8px; + padding: 0.2rem; + border-radius: 6px; } .viewToggleBtn { display: flex; align-items: center; - gap: 0.375rem; - padding: 0.5rem 0.875rem; - font-size: 0.875rem; + gap: 0.25rem; + padding: 0.375rem 0.625rem; + font-size: 0.8125rem; font-weight: 500; background: transparent; border: none; - border-radius: 6px; + border-radius: 5px; cursor: pointer; color: var(--text-secondary, #5c564d); transition: all 0.2s ease; @@ -68,7 +68,7 @@ } .results { - margin-top: 2rem; + margin-top: 1rem; } .mapViewResults { @@ -78,13 +78,13 @@ /* Map View Layout */ .mapViewContainer { display: grid; - grid-template-columns: 1fr 380px; - gap: 1.5rem; - height: 550px; + grid-template-columns: 1fr 340px; + gap: 1rem; + height: 480px; } .mapContainer { - border-radius: 12px; + border-radius: 10px; overflow: hidden; border: 1px solid var(--border-color, #e5dfd5); height: 100%; @@ -93,10 +93,10 @@ .compactList { display: flex; flex-direction: column; - gap: 0.75rem; + gap: 0.5rem; overflow-y: auto; height: 100%; - padding-right: 0.5rem; + padding-right: 0.375rem; } .compactList::-webkit-scrollbar { @@ -122,17 +122,17 @@ display: flex; justify-content: space-between; align-items: center; - gap: 1rem; - padding: 0.875rem 1rem; + gap: 0.75rem; + padding: 0.625rem 0.75rem; background: var(--bg-card, white); border: 1px solid var(--border-color, #e5dfd5); - border-radius: 10px; + border-radius: 8px; transition: all 0.2s ease; } .compactItem:hover { border-color: var(--accent-coral, #e07256); - box-shadow: 0 2px 8px rgba(26, 22, 18, 0.06); + box-shadow: 0 2px 6px rgba(26, 22, 18, 0.05); } .compactItemContent { @@ -143,13 +143,13 @@ .compactItemHeader { display: flex; align-items: center; - gap: 0.5rem; - margin-bottom: 0.25rem; + gap: 0.375rem; + margin-bottom: 0.125rem; } .compactItemName { font-weight: 600; - font-size: 0.9375rem; + font-size: 0.8125rem; color: var(--text-primary, #1a1612); text-decoration: none; white-space: nowrap; @@ -163,32 +163,32 @@ .distanceBadge { flex-shrink: 0; - padding: 0.125rem 0.5rem; - font-size: 0.75rem; + padding: 0.0625rem 0.375rem; + font-size: 0.6875rem; font-weight: 600; background: var(--accent-teal, #2d7d7d); color: white; - border-radius: 4px; + border-radius: 3px; } .compactItemMeta { display: flex; - gap: 0.5rem; - font-size: 0.8125rem; + gap: 0.375rem; + font-size: 0.6875rem; color: var(--text-secondary, #5c564d); - margin-bottom: 0.375rem; + margin-bottom: 0.25rem; } .compactItemMeta span:not(:last-child)::after { content: 'ยท'; - margin-left: 0.5rem; + margin-left: 0.375rem; color: var(--text-muted, #8a847a); } .compactItemStats { display: flex; - gap: 1rem; - font-size: 0.8125rem; + gap: 0.75rem; + font-size: 0.6875rem; color: var(--text-secondary, #5c564d); } @@ -199,18 +199,18 @@ .compactItemActions { display: flex; flex-direction: column; - gap: 0.375rem; + gap: 0.25rem; flex-shrink: 0; } .compactBtn { - padding: 0.375rem 0.75rem; - font-size: 0.75rem; + padding: 0.25rem 0.5rem; + font-size: 0.6875rem; font-weight: 600; background: var(--accent-coral, #e07256); color: white; border: none; - border-radius: 6px; + border-radius: 4px; cursor: pointer; transition: all 0.2s ease; text-align: center; @@ -232,13 +232,13 @@ } .compactBtnSecondary { - padding: 0.375rem 0.75rem; - font-size: 0.75rem; + padding: 0.25rem 0.5rem; + font-size: 0.6875rem; font-weight: 500; background: transparent; color: var(--text-secondary, #5c564d); border: 1px solid var(--border-color, #e5dfd5); - border-radius: 6px; + border-radius: 4px; cursor: pointer; transition: all 0.2s ease; text-decoration: none; @@ -251,13 +251,13 @@ } .sectionHeader { - margin-bottom: 2rem; + margin-bottom: 1rem; } .sectionHeader h2 { - font-size: 1.875rem; + font-size: 1.5rem; font-weight: 700; - margin-bottom: 0.75rem; + margin-bottom: 0.5rem; color: var(--text-primary, #1a1612); font-family: var(--font-playfair), 'Playfair Display', serif; } @@ -266,50 +266,50 @@ .sectionHeader h2::after { content: ''; display: block; - width: 60px; - height: 3px; + width: 50px; + height: 2px; background: var(--accent-coral, #e07256); - border-radius: 2px; - margin-top: 0.75rem; + border-radius: 1px; + margin-top: 0.5rem; } .sectionDescription { - font-size: 1rem; + font-size: 0.9375rem; color: var(--text-secondary, #5c564d); margin: 0; - line-height: 1.6; + line-height: 1.5; } .resultsHeader { - margin-bottom: 2rem; - padding-bottom: 1rem; + margin-bottom: 1rem; + padding-bottom: 0.625rem; border-bottom: 2px solid var(--border-color, #e5dfd5); } .resultsHeader h2 { - font-size: 1.5rem; + font-size: 1.25rem; font-weight: 600; color: var(--text-primary, #1a1612); margin: 0; display: flex; align-items: center; - gap: 0.5rem; + gap: 0.375rem; } .resultsHeader h2::before { content: ''; display: inline-block; - width: 4px; - height: 1.25em; + width: 3px; + height: 1.125em; background: var(--accent-coral, #e07256); border-radius: 2px; } .grid { display: grid; - grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); - gap: 1.5rem; - margin-bottom: 2rem; + grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); + gap: 1rem; + margin-bottom: 1.25rem; } /* Staggered grid entry animation */ @@ -341,41 +341,43 @@ .emptyState { text-align: center; - padding: 4rem 2rem; + padding: 2.5rem 1.5rem; background: var(--bg-card, white); border: 1px solid var(--border-color, #e5dfd5); - border-radius: 12px; + border-radius: 10px; } .emptyStateTitle { - font-size: 1.5rem; + font-size: 1.25rem; font-weight: 600; color: var(--text-primary, #1a1612); - margin-bottom: 0.5rem; + margin-bottom: 0.375rem; font-family: var(--font-playfair), 'Playfair Display', serif; } .emptyStateDescription { - font-size: 1rem; + font-size: 0.9375rem; color: var(--text-secondary, #5c564d); - max-width: 400px; + max-width: 380px; margin: 0 auto; } @media (max-width: 768px) { .grid { grid-template-columns: 1fr; + gap: 0.75rem; } .locationBannerWrapper { flex-direction: column; align-items: stretch; + margin-bottom: 0.75rem; } .locationBanner { - padding: 0.75rem 1rem; - font-size: 0.875rem; - border-radius: 8px; + padding: 0.5rem 0.75rem; + font-size: 0.8125rem; + border-radius: 6px; } .viewToggle { @@ -384,24 +386,25 @@ .mapViewContainer { grid-template-columns: 1fr; - grid-template-rows: 300px auto; + grid-template-rows: 260px auto; height: auto; + gap: 0.75rem; } .mapContainer { - height: 300px; + height: 260px; } .compactList { height: auto; - max-height: 400px; + max-height: 350px; padding-right: 0; } .compactItem { flex-direction: column; align-items: stretch; - gap: 0.75rem; + gap: 0.5rem; } .compactItemActions { @@ -413,6 +416,6 @@ } .emptyState { - padding: 3rem 1.5rem; + padding: 2rem 1.25rem; } } diff --git a/nextjs-app/components/SchoolCard.module.css b/nextjs-app/components/SchoolCard.module.css index 229eae2..97e087b 100644 --- a/nextjs-app/components/SchoolCard.module.css +++ b/nextjs-app/components/SchoolCard.module.css @@ -2,30 +2,30 @@ background: var(--bg-card, white); border: 1px solid var(--border-color, #e5dfd5); border-left: 3px solid transparent; - border-radius: 12px; - padding: 1.5rem; + border-radius: 10px; + padding: 1rem 1.125rem; transition: all 0.3s ease; } .card:hover { 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(-1px); } .header { display: flex; justify-content: space-between; align-items: flex-start; - gap: 1rem; - margin-bottom: 0.75rem; + gap: 0.75rem; + margin-bottom: 0.375rem; } .title { margin: 0; - font-size: 1.125rem; + font-size: 1rem; font-weight: 600; - line-height: 1.4; + line-height: 1.35; font-family: var(--font-playfair), 'Playfair Display', serif; } @@ -40,49 +40,49 @@ } .distance { - font-size: 0.875rem; + font-size: 0.75rem; color: var(--accent-teal, #2d7d7d); white-space: nowrap; background: rgba(45, 125, 125, 0.1); - padding: 0.25rem 0.75rem; - border-radius: 20px; + padding: 0.125rem 0.5rem; + border-radius: 12px; font-weight: 500; } .meta { display: flex; flex-wrap: wrap; - gap: 0.5rem; - margin-bottom: 1rem; + gap: 0.375rem; + margin-bottom: 0.625rem; } .metaItem { - font-size: 0.875rem; + font-size: 0.75rem; color: var(--text-secondary, #5c564d); - padding: 0.25rem 0.75rem; + padding: 0.125rem 0.5rem; background: var(--bg-secondary, #f3ede4); - border-radius: 4px; + border-radius: 3px; } .metrics { display: grid; - grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); - gap: 1rem; - margin-bottom: 1.5rem; - padding: 1rem; + grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); + gap: 0.625rem; + margin-bottom: 0.875rem; + padding: 0.625rem 0.75rem; background: var(--bg-secondary, #f3ede4); - border-radius: 8px; + border-radius: 6px; border: 1px solid var(--border-color, #e5dfd5); } .metric { display: flex; flex-direction: column; - gap: 0.25rem; + gap: 0.125rem; } .metricLabel { - font-size: 0.75rem; + font-size: 0.6875rem; color: var(--text-muted, #8a847a); text-transform: uppercase; letter-spacing: 0.05em; @@ -91,11 +91,11 @@ .metricValue { display: flex; align-items: center; - gap: 0.5rem; + gap: 0.375rem; } .metricValue strong { - font-size: 1.125rem; + font-size: 1rem; color: var(--text-primary, #1a1612); font-weight: 700; } @@ -137,16 +137,16 @@ .actions { display: flex; - gap: 0.75rem; + gap: 0.5rem; } .btnSecondary, .btnPrimary { flex: 1; - padding: 0.625rem 1rem; - font-size: 0.875rem; + padding: 0.5rem 0.75rem; + font-size: 0.8125rem; font-weight: 600; - border-radius: 8px; + border-radius: 6px; border: none; cursor: pointer; text-align: center; @@ -157,14 +157,14 @@ .btnSecondary { background: var(--bg-card, white); color: var(--accent-teal, #2d7d7d); - border: 2px solid var(--accent-teal, #2d7d7d); + border: 1.5px solid var(--accent-teal, #2d7d7d); } .btnSecondary:hover { background: var(--accent-teal, #2d7d7d); color: white; transform: translateY(-1px); - box-shadow: 0 4px 12px rgba(45, 125, 125, 0.3); + box-shadow: 0 3px 8px rgba(45, 125, 125, 0.25); } .btnPrimary { @@ -175,7 +175,7 @@ .btnPrimary:hover { background: var(--accent-coral-dark, #c45a3f); transform: translateY(-1px); - box-shadow: 0 4px 12px rgba(224, 114, 86, 0.3); + box-shadow: 0 3px 8px rgba(224, 114, 86, 0.25); } .btnPrimary:active { @@ -184,13 +184,13 @@ @media (max-width: 640px) { .card { - padding: 1rem; + padding: 0.875rem; border-radius: 8px; } .metrics { grid-template-columns: 1fr; - gap: 0.75rem; + gap: 0.5rem; } .actions {