Files
nahodka-front/src/styles/layout.css
2026-08-18 01:06:50 +03:00

394 lines
11 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* ── App Shell (Instagram-style) ── */
.f-app {
display: flex; height: 100vh;
background: var(--bg-app);
overflow: hidden; font-family: var(--font); position: relative;
}
/* ── Overlay (mobile sidebar backdrop) ── */
.f-overlay {
position: fixed; inset: 0; background: var(--bg-overlay);
z-index: 40; opacity: 0; pointer-events: none; transition: opacity .32s;
}
.f-overlay.show { opacity: 1; pointer-events: all; }
/* ── Main Column ── */
.f-main {
flex: 1; display: flex; flex-direction: column;
min-width: 0; height: 100vh; overflow: hidden;
}
/* ── Topbar (mobile only; desktop uses the nav sidebar) ── */
.f-topbar {
display: flex; align-items: center; gap: 8px;
padding: 8px 16px;
border-bottom: 1px solid var(--border);
background: var(--bg-surface);
position: sticky; top: 0; z-index: 10;
}
.f-menu-btn {
background: none; border: none; cursor: pointer;
padding: 6px; border-radius: 8px; transition: background .15s;
flex-shrink: 0; line-height: 0; width: 32px;
color: var(--text-primary);
}
.f-menu-btn:hover { background: var(--hover-bg); }
.f-topbar-center { flex: 1; display: flex; justify-content: center; min-width: 0; }
.f-topbar-wordmark {
color: var(--text-primary); font-weight: 900; font-size: 1.05rem;
letter-spacing: -.4px; white-space: nowrap; margin-left: 2px;
}
.f-topbar-spacer { width: 32px; flex-shrink: 0; }
/* ── Topbar Profile ── */
.f-topbar-profile {
width: 32px; height: 32px; flex-shrink: 0;
display: flex; align-items: center; justify-content: center;
cursor: pointer; border-radius: 50%;
transition: background .15s;
}
.f-topbar-profile:hover { background: var(--hover-bg); }
.f-topbar-profile .f-profile-avatar {
width: 28px; height: 28px; border-width: 1.5px;
}
.f-topbar-profile .f-profile-avatar-placeholder {
width: 28px; height: 28px; font-size: 1rem;
}
.f-topbar-login-icon { font-size: 1.1rem; line-height: 1; }
/* ── Search Bar ── */
.f-search-bar {
display: flex; align-items: center; gap: 10px;
padding: 10px 16px;
background: var(--bg-surface);
border-bottom: 1px solid var(--border);
}
.f-search-icon {
width: 18px; height: 18px; flex-shrink: 0;
color: var(--muted);
}
.f-search-input {
flex: 1; min-width: 0;
background: var(--bg-input);
border: 1px solid transparent;
border-radius: 999px;
padding: 10px 18px;
font-family: var(--font); font-size: 0.9rem;
color: var(--text-primary);
outline: none;
transition: border-color .2s, box-shadow .2s, background .2s;
}
.f-search-input::placeholder { color: var(--muted); }
.f-search-input:focus {
border-color: var(--border);
background: var(--bg-surface);
box-shadow: 0 1px 6px rgba(0,0,0,.06);
}
.f-search-clear {
background: none; border: none; cursor: pointer;
color: var(--muted); padding: 4px; border-radius: 50%;
display: flex; align-items: center; justify-content: center;
flex-shrink: 0; transition: color .15s, background .15s;
}
.f-search-clear:hover { color: var(--text-primary); background: var(--hover-bg); }
/* ── Filter Bar ── */
.f-filter-bar {
display: flex; gap: 8px;
padding: 10px 16px;
border-bottom: 1px solid var(--border);
background: var(--bg-surface);
justify-content: center;
}
.f-filter-btn {
display: flex; align-items: center; gap: 6px;
padding: 8px 16px; border-radius: 999px;
font-family: var(--font); font-size: 0.85rem; font-weight: 600;
background: var(--bg-input); border: 1px solid var(--border);
color: var(--muted); cursor: pointer;
transition: all 0.2s ease;
}
.f-filter-btn:hover {
background: var(--hover-bg); color: var(--text-primary);
}
.f-filter-btn.active {
background: rgba(var(--teal-rgb), .08);
border-color: rgba(var(--teal-rgb), .5);
color: var(--teal); font-weight: 700;
}
/* ── City Multiselect ── */
.f-city-filter-wrap {
position: relative; z-index: 20;
display: flex; align-items: center;
padding: 10px 16px;
border-bottom: 1px solid var(--border);
background: var(--bg-surface);
}
.f-city-multiselect {
position: relative; flex: 1;
width: 100%; max-width: 440px; margin: 0 auto;
}
.f-city-ms-control {
display: flex; align-items: center; gap: 8px;
background: var(--bg-input);
border: 1px solid var(--border);
border-radius: 999px;
padding: 6px 14px;
min-height: 42px;
cursor: text;
transition: border-color .2s, box-shadow .2s;
}
.f-city-ms-control.open {
border-color: rgba(var(--teal-rgb), .5);
box-shadow: 0 0 0 3px rgba(var(--teal-rgb), .12);
}
.f-city-ms-icon {
width: 18px; height: 18px; flex-shrink: 0; color: var(--muted);
}
.f-city-ms-tags {
display: flex; flex-wrap: wrap; gap: 6px;
flex: 1; min-width: 0; align-items: center;
}
.f-city-ms-tag {
display: inline-flex; align-items: center; gap: 4px;
background: rgba(var(--teal-rgb), .1);
border: 1px solid rgba(var(--teal-rgb), .35);
color: var(--teal);
border-radius: 999px;
padding: 3px 10px;
font-size: 0.78rem; font-weight: 600;
white-space: nowrap;
}
.f-city-ms-tag-remove {
background: none; border: none; color: inherit; cursor: pointer;
padding: 0; display: flex; align-items: center; line-height: 0;
opacity: .7; transition: opacity .15s;
}
.f-city-ms-tag-remove:hover { opacity: 1; }
.f-city-ms-input {
flex: 1; min-width: 90px;
border: none; outline: none; background: transparent;
color: var(--text-primary);
font-family: var(--font); font-size: 0.9rem;
padding: 2px 0;
}
.f-city-ms-input::placeholder { color: var(--muted); }
.f-city-ms-clear {
background: none; border: none; cursor: pointer;
color: var(--muted); padding: 4px; border-radius: 6px;
display: flex; align-items: center; justify-content: center;
flex-shrink: 0; transition: color .15s, background .15s;
}
.f-city-ms-clear:hover { color: var(--text-primary); background: var(--hover-bg); }
.f-city-ms-chevron {
width: 16px; height: 16px; flex-shrink: 0; color: var(--muted);
transition: transform .2s;
}
.f-city-ms-control.open .f-city-ms-chevron { transform: rotate(180deg); }
.f-city-ms-dropdown {
position: absolute; top: calc(100% + 6px); left: 0; right: 0;
background: var(--bg-surface-solid);
border: 1px solid var(--border);
border-radius: 12px;
box-shadow: 0 12px 32px rgba(0, 0, 0, .18);
max-height: 260px; overflow-y: auto;
z-index: 30; padding: 6px;
}
.f-city-ms-dropdown::-webkit-scrollbar { width: 4px; }
.f-city-ms-dropdown::-webkit-scrollbar-track { background: transparent; }
.f-city-ms-dropdown::-webkit-scrollbar-thumb { background: var(--muted2); border-radius: 2px; }
.f-city-ms-option {
display: flex; align-items: center; gap: 10px;
width: 100%; text-align: left;
padding: 9px 10px; border: none; border-radius: 8px;
background: none; color: var(--text-primary);
font-family: var(--font); font-size: 0.9rem; cursor: pointer;
transition: background .15s;
}
.f-city-ms-option:hover { background: var(--hover-bg); }
.f-city-ms-option.selected { color: var(--teal); font-weight: 600; }
.f-city-ms-option.f-city-ms-add { color: var(--teal); font-weight: 600; }
.f-city-ms-check {
width: 18px; height: 18px; flex-shrink: 0;
display: flex; align-items: center; justify-content: center;
border: 1.5px solid var(--border); border-radius: 5px;
font-size: 0.8rem; color: var(--teal);
}
.f-city-ms-option.selected .f-city-ms-check {
border-color: var(--teal);
background: rgba(var(--teal-rgb), .12);
}
.f-city-ms-option.f-city-ms-add .f-city-ms-check {
border-color: rgba(var(--teal-rgb), .5);
}
.f-city-ms-empty {
padding: 10px; text-align: center; color: var(--muted); font-size: 0.85rem;
}
/* ── Bottom Navigation (Instagram-style) ── */
.f-bottom-nav {
position: fixed; left: 0; right: 0; bottom: 0;
display: flex; align-items: center; justify-content: space-around;
padding: 6px 0 calc(6px + env(safe-area-inset-bottom));
background: var(--bg-surface-solid);
border-top: 1px solid var(--border);
z-index: 35;
}
.f-bn-item {
position: relative;
display: flex; align-items: center; justify-content: center;
width: 44px; height: 44px;
border: none; background: none; cursor: pointer;
color: var(--text-primary);
transition: color .15s, transform .1s;
}
.f-bn-item:active { transform: scale(.92); }
.f-bn-item svg { width: 26px; height: 26px; }
.f-bn-item.active { color: var(--teal); }
.f-bn-item.active::before {
content: ""; position: absolute; inset: 3px;
border-radius: 50%;
background: rgba(var(--teal-rgb), .12);
}
/* Create button — бирюзовая рамка как у старой кнопки «Разместить» */
.f-bn-create {
width: 44px; height: 44px;
border-radius: 999px;
background: var(--teal);
color: #fff;
box-shadow: 0 2px 10px rgba(var(--teal-rgb), .35);
}
.f-bn-create:hover { background: var(--teal2); }
.f-bn-create svg { color: #fff; }
/* Profile avatar inside the nav */
.f-bn-profile .f-profile-avatar,
.f-bn-profile .f-profile-avatar-placeholder {
width: 28px; height: 28px;
}
.f-bn-profile .f-profile-avatar-placeholder { font-size: 1rem; }
.f-bn-item.f-bn-profile.active::before {
inset: -1px;
box-shadow: 0 0 0 2px var(--teal);
}
/* Indicator: активные фильтры поиска */
.f-bn-dot {
position: absolute; top: 6px; right: 4px;
width: 8px; height: 8px; border-radius: 50%;
background: #ff3040;
box-shadow: 0 0 0 2px var(--bg-surface-solid);
}
/* Search panel — видна только во вкладке «Поиск» (на десктопе всегда) */
.f-search-panel { display: none; }
.f-app.f-search-view .f-search-panel { display: block; }
/* ── Feed Wrap + Scroll ── */
.f-wrap { display: flex; flex: 1; overflow: hidden; min-height: 0; }
.f-feed {
flex: 1; overflow-y: scroll; overscroll-behavior: contain; min-height: 0;
padding: 20px 16px; display: flex; flex-direction: column; gap: 16px;
width: 100%; max-width: 660px; margin: 0 auto;
}
.f-feed::-webkit-scrollbar { width: 4px; }
.f-feed::-webkit-scrollbar-track { background: transparent; }
.f-feed::-webkit-scrollbar-thumb { background: var(--muted2); border-radius: 2px; }
@media (min-width: 900px) {
.f-main-feed .f-topbar {
display: none;
}
.f-search-panel {
display: block;
}
.f-bottom-nav {
display: none;
}
}
@media (max-width: 900px) {
.f-feed {
padding: 10px;
gap: 12px;
}
.f-topbar {
padding: 8px 12px;
}
.f-post-btn {
padding: 8px 14px;
font-size: 0.78rem;
}
.f-login-btn {
padding: 6px 14px;
font-size: 0.78rem;
}
.f-filter-bar {
padding: 8px 12px;
gap: 6px;
}
.f-filter-btn {
padding: 7px 13px;
font-size: 0.82rem;
}
.f-city-filter-wrap { padding: 8px 12px; }
.f-city-ms-control { padding: 5px 12px; min-height: 38px; }
.f-city-ms-input { font-size: 0.85rem; }
.f-city-ms-tag { font-size: 0.75rem; padding: 2px 8px; }
/* Нижняя панель fixed — освобождаем место в конце ленты */
.f-feed {
padding-bottom: calc(72px + env(safe-area-inset-bottom));
}
}
@media (max-width: 600px) {
.f-post-btn {
padding: 7px 10px;
font-size: 0.7rem;
gap: 4px;
border-radius: 8px;
}
.f-post-btn span {
width: 12px;
height: 12px;
font-size: 0.7rem;
}
.f-login-btn {
padding: 4px 10px;
font-size: 0.7rem;
border-radius: 8px;
}
.f-filter-btn {
padding: 7px 12px;
font-size: 0.78rem;
}
}