Files
nexu-io--open-design/apps/web/src/components/BrandPickerModal.module.css
T
wehub-resource-sync 070959e133
landing-page-staging / Deploy landing page to staging (push) Has been skipped
landing-page-ci / Validate landing page (push) Failing after 4s
visual-baseline / Capture visual baselines (push) Has been cancelled
bake-plugin-previews / Bake plugin previews (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:00:47 +08:00

121 lines
2.5 KiB
CSS

.backdrop {
position: fixed;
inset: 0;
z-index: 1000;
display: flex;
align-items: center;
justify-content: center;
padding: 24px;
background: rgba(26, 25, 22, 0.32);
animation: bpmBackdropIn var(--dur-enter, 200ms) var(--ease-out, cubic-bezier(0.23, 1, 0.32, 1));
}
@keyframes bpmBackdropIn {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
.modal {
width: 100%;
max-width: 860px;
/* Stable, spacious dialog with a bounded height; the brand gallery scrolls
internally (fillHeight) while the header stays pinned. */
height: min(680px, 84vh);
display: flex;
flex-direction: column;
padding: 22px 24px 24px;
border: 1px solid var(--border);
border-radius: var(--radius-lg);
background: var(--bg-panel);
box-shadow: var(--shadow-lg);
animation: bpmModalIn var(--dur-enter, 200ms) var(--ease-out, cubic-bezier(0.23, 1, 0.32, 1));
}
@keyframes bpmModalIn {
from {
opacity: 0;
transform: translateY(8px) scale(0.97);
}
to {
opacity: 1;
transform: translateY(0) scale(1);
}
}
@media (prefers-reduced-motion: reduce) {
.backdrop,
.modal {
animation: none;
}
}
.head {
flex: 0 0 auto;
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 16px;
margin-bottom: 14px;
}
.headText {
min-width: 0;
}
.title {
margin: 0;
font-size: 18px;
font-weight: 700;
color: var(--text-strong);
}
.subtitle {
margin: 6px 0 0;
font-size: 13px;
line-height: 1.5;
color: var(--text-muted);
}
.close {
flex: 0 0 auto;
display: inline-flex;
align-items: center;
justify-content: center;
width: 30px;
height: 30px;
border: 0;
border-radius: var(--radius);
background: transparent;
color: var(--text-muted);
cursor: pointer;
transition:
background-color 140ms var(--ease-out, cubic-bezier(0.23, 1, 0.32, 1)),
color 140ms var(--ease-out, cubic-bezier(0.23, 1, 0.32, 1));
}
.close:hover,
.close:focus-visible {
outline: none;
background: var(--bg-subtle);
color: var(--text-strong);
}
/* The whole picker (popular brands, search, filters, and gallery) flows and
scrolls together here, so the modal reads as one scrolling surface rather
than a pinned head over a separately-scrolling list. Only the dialog header
(title/close) stays pinned above. Horizontal padding gives the cards' hover
lift + shadow breathing room against the scrollbar. */
.pickerWrap {
flex: 1 1 auto;
min-height: 0;
overflow-y: auto;
overflow-x: hidden;
scrollbar-width: thin;
padding: 16px 4px 4px 2px;
border-top: 1px solid var(--border);
}