diff --git a/nextjs-app/components/ComparisonChart.module.css b/nextjs-app/components/ComparisonChart.module.css index d847f1d..43acaf0 100644 --- a/nextjs-app/components/ComparisonChart.module.css +++ b/nextjs-app/components/ComparisonChart.module.css @@ -1,16 +1,23 @@ -/* Chart wrapper: chips (mobile) above, canvas filling the rest of the - parent .chartContainer, whose fixed height drives Chart.js sizing via - maintainAspectRatio: false. */ +/* Chart wrapper: chips (mobile) above, then the canvas, then the gap note. + The canvas has its OWN definite height (Chart.js needs one for + maintainAspectRatio: false); the chips and the note flow at their natural + size around it rather than competing with it for a fixed outer height — + so a longer note (e.g. the KS4 gap caption) or a two-row chip legend can + never squash the chart. */ .wrapper { display: flex; flex-direction: column; - height: 100%; } .canvasBox { position: relative; - flex: 1 1 auto; - min-height: 0; + height: 380px; +} + +@media (max-width: 640px) { + .canvasBox { + height: 280px; + } } /* School chips: mobile-only legend + tap-to-focus control. Desktop keeps diff --git a/nextjs-app/components/Modal.module.css b/nextjs-app/components/Modal.module.css index d1ecf4c..eab03ac 100644 --- a/nextjs-app/components/Modal.module.css +++ b/nextjs-app/components/Modal.module.css @@ -123,6 +123,10 @@ .modal { width: 100%; max-width: 100%; + /* Bottom sheet: open at a stable, comfortable height so the empty + "start typing" state isn't a tiny stub and the sheet doesn't jump as + results load (the results list scrolls within). */ + min-height: 55vh; max-height: 95vh; border-bottom-left-radius: 0; border-bottom-right-radius: 0; diff --git a/nextjs-app/components/SchoolSearchModal.module.css b/nextjs-app/components/SchoolSearchModal.module.css index c00e8c3..640dcea 100644 --- a/nextjs-app/components/SchoolSearchModal.module.css +++ b/nextjs-app/components/SchoolSearchModal.module.css @@ -2,14 +2,6 @@ padding: 1.5rem; } -.title { - font-size: 1.5rem; - font-weight: 700; - color: var(--text-primary, #1a1612); - margin-bottom: 1.5rem; - font-family: var(--font-playfair), 'Playfair Display', serif; -} - .warning { background: var(--accent-gold-bg); border: 1px solid var(--accent-gold, #c9a227); @@ -119,12 +111,16 @@ font-size: 1rem; font-weight: 600; color: var(--text-primary, #1a1612); - margin-bottom: 0.5rem; + margin-bottom: 0.25rem; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } +.resultButton { + flex: 0 0 auto; +} + .schoolMeta { display: flex; gap: 1rem; @@ -159,21 +155,21 @@ padding: 1rem; } - .title { - font-size: 1.25rem; - } - + /* Compact stacked card: name + meta, then a full-width action so the tap + target is obvious and the card doesn't waste vertical space. */ .resultItem { flex-direction: column; align-items: stretch; + gap: 0.625rem; + padding: 0.875rem; } - .addButton { + .resultButton { width: 100%; } .schoolMeta { - flex-direction: column; - gap: 0.25rem; + flex-wrap: wrap; + gap: 0.25rem 1rem; } } diff --git a/nextjs-app/components/SchoolSearchModal.tsx b/nextjs-app/components/SchoolSearchModal.tsx index 798c2af..e7e6d42 100644 --- a/nextjs-app/components/SchoolSearchModal.tsx +++ b/nextjs-app/components/SchoolSearchModal.tsx @@ -81,10 +81,8 @@ export function SchoolSearchModal({ isOpen, onClose }: SchoolSearchModalProps) { }; return ( - +
-

Add School to Comparison

- {!canAddMore && (
Maximum 5 schools can be compared. Remove a school to add another. @@ -129,9 +127,9 @@ export function SchoolSearchModal({ isOpen, onClose }: SchoolSearchModalProps) { diff --git a/nextjs-app/components/compare/TrendsExplorer.module.css b/nextjs-app/components/compare/TrendsExplorer.module.css index 7c74367..e5e007b 100644 --- a/nextjs-app/components/compare/TrendsExplorer.module.css +++ b/nextjs-app/components/compare/TrendsExplorer.module.css @@ -60,18 +60,10 @@ margin: 0 0 1rem; } -/* ComparisonChart runs Chart.js with maintainAspectRatio:false, so it fills - its container's height — which must be *definite*. A min-height alone does - not resolve the chart wrapper's height:100%, leaving Chart.js to fall back - to its ~150px default (a squashed sliver). Give it a real height. */ +/* ComparisonChart owns its own canvas height now (a definite px value per + breakpoint), with the mobile chip legend above and the gap note below it + flowing at natural size. This box therefore only needs to not constrain + that height — no fixed height, or the note would again eat the plot. */ .chartBox { - height: 420px; -} - -@media (max-width: 640px) { - /* Taller on mobile: the mobile-only school chips sit above the canvas and - wrap to two rows for 3+ schools, so the plot keeps a usable height. */ - .chartBox { - height: 360px; - } + min-height: 0; }