PR Checks / Frontend Typecheck + Tests (pull_request) Successful in 1m13s
PR Checks / Backend Smoke (pull_request) Successful in 10s
PR Checks / Build Backend (no push) (pull_request) Successful in 18s
PR Checks / Build Frontend (no push) (pull_request) Successful in 1m19s
PR Checks / Build Pipeline (no push) (pull_request) Successful in 10s
PR Checks / AI Code Review (Claude) (pull_request) Successful in 12s
The close button was 40px square: a 24px icon in 8px of padding. MOBILE.md sets 44px as the minimum, and the phone filter sheet journey, which checks every target in the sheet, has failed on it in the staging E2E gate since the sheet shipped. Measured on staging with the rule injected: the button is 44x44, nothing in the sheet is under 44, and the page does not overflow. Every Modal gets the same button, the compare page's school search included. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
169 lines
3.2 KiB
CSS
169 lines
3.2 KiB
CSS
.overlay {
|
|
position: fixed;
|
|
inset: 0;
|
|
background: rgba(var(--shadow-rgb), 0.6);
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
/* Above the pinned results toolbar (1001), the floating List/Map button
|
|
(1002) and the comparison toast (2000): a modal covers the page. */
|
|
z-index: 2100;
|
|
padding: 1rem;
|
|
animation: fadeIn 0.2s ease;
|
|
}
|
|
|
|
@keyframes fadeIn {
|
|
from {
|
|
opacity: 0;
|
|
}
|
|
to {
|
|
opacity: 1;
|
|
}
|
|
}
|
|
|
|
.modal {
|
|
background: var(--bg-card);
|
|
border-radius: 16px;
|
|
box-shadow: 0 20px 40px rgba(var(--shadow-rgb), 0.2);
|
|
max-height: 90vh;
|
|
overflow: hidden;
|
|
display: flex;
|
|
flex-direction: column;
|
|
animation: slideIn 0.3s ease;
|
|
border: 1px solid var(--border);
|
|
}
|
|
|
|
.modal:focus {
|
|
outline: none;
|
|
}
|
|
|
|
@keyframes slideIn {
|
|
from {
|
|
transform: translateY(-20px);
|
|
opacity: 0;
|
|
}
|
|
to {
|
|
transform: translateY(0);
|
|
opacity: 1;
|
|
}
|
|
}
|
|
|
|
.modal.small {
|
|
width: 100%;
|
|
max-width: 400px;
|
|
}
|
|
|
|
.modal.medium {
|
|
width: 100%;
|
|
max-width: 600px;
|
|
}
|
|
|
|
.modal.large {
|
|
width: 100%;
|
|
max-width: 900px;
|
|
}
|
|
|
|
.header {
|
|
display: flex;
|
|
justify-content: space-between;
|
|
align-items: center;
|
|
padding: 1.5rem;
|
|
border-bottom: 1px solid var(--border);
|
|
}
|
|
|
|
.title {
|
|
margin: 0;
|
|
font-size: 1.25rem;
|
|
font-weight: 600;
|
|
color: var(--text-primary);
|
|
font-family: var(--font-display);
|
|
}
|
|
|
|
/* 44px, the MOBILE.md touch-target minimum: the 24px icon and its padding
|
|
came to 40, and the phone filter sheet journey caught it. */
|
|
.closeButton {
|
|
min-width: 2.75rem;
|
|
min-height: 2.75rem;
|
|
padding: 0.5rem;
|
|
background: transparent;
|
|
border: none;
|
|
color: var(--text-muted);
|
|
cursor: pointer;
|
|
border-radius: 8px;
|
|
transition: all 0.2s ease;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
}
|
|
|
|
.closeButton:hover {
|
|
background: var(--bg-secondary);
|
|
color: var(--brand);
|
|
}
|
|
|
|
.content {
|
|
overflow-y: auto;
|
|
flex: 1;
|
|
}
|
|
|
|
/* Clears the iPhone home indicator when the modal is a bottom sheet. */
|
|
.footer {
|
|
flex-shrink: 0;
|
|
padding: 0.75rem 1rem calc(0.75rem + env(safe-area-inset-bottom, 0px));
|
|
border-top: 1px solid var(--border);
|
|
background: var(--bg-card);
|
|
}
|
|
|
|
/* Scrollbar styles */
|
|
.content::-webkit-scrollbar {
|
|
width: 8px;
|
|
}
|
|
|
|
.content::-webkit-scrollbar-track {
|
|
background: var(--bg-secondary);
|
|
}
|
|
|
|
.content::-webkit-scrollbar-thumb {
|
|
background: var(--border);
|
|
border-radius: 4px;
|
|
}
|
|
|
|
.content::-webkit-scrollbar-thumb:hover {
|
|
background: var(--text-muted);
|
|
}
|
|
|
|
@media (max-width: 640px) {
|
|
.overlay {
|
|
padding: 0;
|
|
align-items: flex-end;
|
|
}
|
|
|
|
.modal {
|
|
width: 100%;
|
|
max-width: 100%;
|
|
/* Bottom sheet sized against the overlay (which tracks the visual
|
|
viewport), NOT vh: when the keyboard is open the overlay is short, so
|
|
max-height:100% keeps the whole sheet — input and results — above the
|
|
keyboard. min-height gives a comfortable default without a tiny stub,
|
|
but is capped at 100% so it never exceeds the visible area. */
|
|
min-height: min(55vh, 100%);
|
|
max-height: 100%;
|
|
border-bottom-left-radius: 0;
|
|
border-bottom-right-radius: 0;
|
|
animation: slideUp 0.3s ease;
|
|
}
|
|
|
|
@keyframes slideUp {
|
|
from {
|
|
transform: translateY(100%);
|
|
}
|
|
to {
|
|
transform: translateY(0);
|
|
}
|
|
}
|
|
|
|
.header {
|
|
padding: 1rem;
|
|
}
|
|
}
|