/* * VidConf — стили экрана лобби. * * `.page-shell`/`.page-main`/`.page-head` — общая разметка светлой оболочки, * переиспользуется и другими страницами (см. CalendarPage.tsx), поэтому эти * три класса общие и не привязаны к разметке лобби. * * Остальное — 1:1 воспроизводит хаб действий design/mockups/lobby.html * (мозаика из 4 действий + медальон логотипа в центре пересечения). */ .page-shell { min-height: 100vh; background: var(--color-bg); } main.page-main { padding: var(--space-8); max-width: 1440px; margin: 0 auto; } .page-head { display: flex; align-items: flex-end; justify-content: space-between; margin-bottom: var(--space-6); } .page-head h1 { font: var(--text-display-lg); font-family: var(--font-display); color: var(--color-ink-700); margin: 0 0 6px; } .page-head p { font: var(--text-body-lg); color: var(--color-ink-500); margin: 0; } /* Общая адаптивная подстройка контейнера/шапки страниц оболочки (Calendar/ MyConferences/Admin) — узкие экраны не должны получать горизонтальную прокрутку из-за фиксированных отступов space-8. Раскладка контента внутри каждой страницы (сетки/сайдбары) — зона соответствующих блоков. */ @media (max-width: 640px) { main.page-main { padding: var(--space-5) var(--space-4); } .page-head { flex-direction: column; align-items: flex-start; gap: var(--space-3); } /* Длинные заголовки («Администрирование» и т.п.) иначе вылезают за край. */ .page-head h1 { font-size: clamp(22px, 6.5vw, 34px); } } /* ---------- Лобби-хаб (мозаика действий) ---------- */ .lobby-shell { min-height: 100vh; display: flex; flex-direction: column; background: radial-gradient(1100px 520px at 10% -10%, rgba(59, 77, 149, 0.06), transparent 60%), radial-gradient(900px 480px at 105% 110%, rgba(212, 242, 227, 0.28), transparent 55%), var(--color-bg); } /* Тёмная тема: декоративные радиальные пятна фона построены на индиго/мятном светлой темы (литеральные rgba, не var()) — патч в тон новой палитры (янтарь/мята той же светлоты, что и в комнате конференции). */ @media (prefers-color-scheme: dark) { :root:not([data-theme]) .lobby-shell { background: radial-gradient(1100px 520px at 10% -10%, rgba(214, 168, 61, 0.05), transparent 60%), radial-gradient(900px 480px at 105% 110%, rgba(127, 221, 168, 0.14), transparent 55%), var(--color-bg); } } :root[data-theme='dark'] .lobby-shell { background: radial-gradient(1100px 520px at 10% -10%, rgba(214, 168, 61, 0.05), transparent 60%), radial-gradient(900px 480px at 105% 110%, rgba(127, 221, 168, 0.14), transparent 55%), var(--color-bg); } .hub-main { flex: 1; display: flex; align-items: center; justify-content: center; padding: var(--space-6) var(--space-8) var(--space-12); } .hub-wrap { display: flex; flex-direction: column; align-items: center; gap: var(--space-8); width: 100%; } .hub-intro { text-align: center; max-width: 560px; } .hub-intro .eyebrow { font: var(--text-caption); color: var(--color-ink-400); margin: 0 0 var(--space-2); } .hub-intro h1 { font: var(--text-display-lg); font-family: var(--font-display); color: var(--color-ink-700); margin: 0; } .hub { position: relative; width: min(1420px, 100%); display: grid; grid-template-columns: repeat(2, 1fr); grid-template-rows: repeat(2, 340px); gap: var(--space-8); } /* Карточка-действие. Медальон с иконкой «сидит» на верхней кромке. */ .action { position: relative; display: flex; flex-direction: column; align-items: center; justify-content: center; text-align: center; gap: var(--space-3); padding: var(--space-10) var(--space-12) var(--space-8); margin-top: 34px; /* min-width:0 — иначе grid-элемент с 1fr-треком не сжимается уже своего min-content (длинные заглавные слова вроде «ПОДКЛЮЧИТЬСЯ» на Unbounded); без этого узкий вьюпорт даёт classic grid blowout — трек и вся сетка раздуваются шире контейнера, появляется горизонтальный скролл. */ min-width: 0; background: var(--color-surface); border: 1px solid var(--color-border); border-radius: var(--radius-3xl); text-decoration: none; color: var(--color-ink-900); box-shadow: var(--shadow-sm); cursor: pointer; font-family: inherit; transition: transform var(--transition-base), box-shadow var(--transition-base), border-color var(--transition-base); } .action:hover { transform: translateY(-4px); box-shadow: var(--shadow-lg); border-color: var(--color-border-strong); } .action:active { transform: translateY(-1px); } .action:disabled { cursor: not-allowed; opacity: 0.7; transform: none; } .action-icon { position: absolute; top: -34px; left: 50%; transform: translateX(-50%); width: 68px; height: 68px; border-radius: 50%; background: var(--color-surface); border: var(--border-thick) solid var(--color-ink-700); color: var(--color-ink-700); display: flex; align-items: center; justify-content: center; box-shadow: var(--shadow-md); } .action-icon .icon { width: 30px; height: 30px; } .action-title { margin: 0; font: 600 40px/1.2 var(--font-display); letter-spacing: 0.01em; color: var(--color-ink-700); text-transform: uppercase; overflow-wrap: break-word; } .action-object { margin: 0; font: 600 21px/1.35 var(--font-body); color: var(--color-ink-900); overflow-wrap: break-word; } .action-note { margin: 0; font: 400 17px/1.5 var(--font-body); color: var(--color-ink-500); overflow-wrap: break-word; } /* Главное действие — CTA дизайн-системы (пастельная мята) */ .action--create { background: var(--color-accent); border-color: transparent; } .action--create:hover:not(:disabled) { background: var(--color-accent-hover); border-color: transparent; } .action--create:active:not(:disabled) { background: var(--color-accent-active); } .action--create .action-title { font: 700 54px/1.1 var(--font-display); } .action--create .action-title, .action--create .action-object { color: var(--color-accent-text); } .action--create .action-note { color: var(--color-ink-700); } .action--create .action-icon { background: var(--color-accent); border-color: var(--color-accent-text); color: var(--color-accent-text); } /* ---------- Медальон VidConf в центре мозаики ---------- */ .hub-logo { position: absolute; top: 373px; left: 50%; transform: translate(-50%, -50%); width: 156px; height: 156px; border-radius: 50%; background: var(--color-surface); border: var(--border-thick) solid var(--color-ink-700); box-shadow: var(--shadow-lg); display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 6px; z-index: 20; pointer-events: none; } .hub-logo .logo-mark { width: 56px; height: 56px; color: var(--color-ink-700); } .hub-logo .logo-word { font: 600 16px/1 var(--font-display); color: var(--color-ink-700); } /* ---------- Появление ---------- */ @media (prefers-reduced-motion: no-preference) { .action, .hub-logo { animation: vc-hub-rise 480ms cubic-bezier(0.22, 0.9, 0.3, 1) backwards; } .action--create { animation-delay: 60ms; } .action--calendar { animation-delay: 140ms; } .action--join { animation-delay: 220ms; } .action--mine { animation-delay: 300ms; } .hub-logo { animation-delay: 420ms; animation-name: vc-hub-rise-logo; } @keyframes vc-hub-rise { from { opacity: 0; transform: translateY(14px); } to { opacity: 1; transform: translateY(0); } } @keyframes vc-hub-rise-logo { from { opacity: 0; transform: translate(-50%, calc(-50% + 14px)); } to { opacity: 1; transform: translate(-50%, -50%); } } } /* ---------- Узкие экраны ---------- */ /* ВАЖНО: этот блок должен идти строго ПОСЛЕДНИМ в файле. При равной специфичности селекторов (`.action-title` и т.п. — 0,1,0 что здесь, что в безусловных правилах выше) порядок в исходнике решает, какое правило применится, а не сам факт совпадения media query — если этот блок стоит раньше своих безусловных дублей, он будет молча перебит ими на любой ширине. Так уже ловили баг (правки гейта, гейт 3): грид расползался на 375px, потому что этот блок раньше стоял сразу после базового `.hub {}`, до `.action-title`/`.action--create .action-title` и т.п. */ @media (max-width: 960px) { /* Мозаика 2×2 → одна колонка; фиксированная высота 340px больше не нужна — тайлы подстраиваются под контент. Медальон-логотип в центре сетки на узких экранах убираем совсем: он был позиционирован под чёткую 2×2 геометрию (см. .hub-logo выше) и на одну колонку не переносится. */ .hub-wrap { gap: var(--space-6); } .hub { grid-template-columns: 1fr; grid-template-rows: repeat(4, auto); gap: var(--space-5); } .hub-logo { display: none; } .hub-main { padding: var(--space-5) var(--space-4) var(--space-8); } .action { padding: var(--space-8) var(--space-5) var(--space-6); margin-top: 28px; } .action-icon { width: 56px; height: 56px; top: -28px; } .action-icon .icon { width: 26px; height: 26px; } .action-title { font-size: 28px; } .action--create .action-title { font-size: 34px; } .action-object { font-size: 17px; } .action-note { font-size: 15px; } }