diff --git a/src/components/MapView.jsx b/src/components/MapView.jsx
index 0f95ab8..0c6f4c0 100644
--- a/src/components/MapView.jsx
+++ b/src/components/MapView.jsx
@@ -1,4 +1,5 @@
import { useEffect, useRef, useState } from "react";
+import { useTranslation } from "react-i18next";
import { API_URL, getImageUrl } from "../config/authConstants";
import { useGeolocation, GEO_STATUS } from "../hooks/useGeolocation";
@@ -40,7 +41,8 @@ function createMarkerLayout(color, imageUrl) {
const FOCUS_ZOOM = 16;
const COORD_MATCH_TOLERANCE = 0.005;
-export default function MapView({ focusPostId, focusLat, focusLng, onPostClick }) {
+export default function MapView({ focusPostId, focusLat, focusLng, onPostClick, onBack }) {
+ const { t } = useTranslation();
const mapRef = useRef(null);
const ymapRef = useRef(null);
const userMarkerRef = useRef(null);
@@ -215,6 +217,15 @@ export default function MapView({ focusPostId, focusLat, focusLng, onPostClick }
{geoStatus === GEO_STATUS.UNSUPPORTED && (
{isMapView ? (
-
+
) : (
<>
diff --git a/src/styles/layout.css b/src/styles/layout.css
index 7049e64..655613c 100644
--- a/src/styles/layout.css
+++ b/src/styles/layout.css
@@ -456,6 +456,50 @@
.f-mapview-geo-info { color: var(--muted); }
.f-mapview-geo-warn { color: var(--err); border-color: rgba(237,73,86,.35); }
+/* Back-to-feed button on map view */
+.f-mapview-back {
+ position: absolute;
+ bottom: 24px; left: 50%;
+ transform: translateX(-50%);
+ z-index: 8;
+ display: flex; align-items: center; gap: 8px;
+ padding: 12px 22px;
+ border: 1px solid rgba(255, 255, 255, .12);
+ border-radius: 999px;
+ background: rgba(20, 20, 20, .55);
+ backdrop-filter: blur(30px) saturate(1.6); -webkit-backdrop-filter: blur(30px) saturate(1.6);
+ color: #fff;
+ font-family: var(--font);
+ font-size: .92rem; font-weight: 700;
+ cursor: pointer;
+ white-space: nowrap;
+ box-shadow: 0 8px 32px rgba(0,0,0,.3), inset 0 0.5px 0 rgba(255,255,255,.08);
+ transition: background .15s, border-color .15s, transform .15s, box-shadow .15s;
+}
+.f-mapview-back-icon { width: 18px; height: 18px; flex-shrink: 0; }
+
+:root:not([data-theme="dark"]) .f-mapview-back {
+ background: rgba(255, 255, 255, .6);
+ border-color: rgba(0, 0, 0, .08);
+ color: var(--text-primary);
+ box-shadow: 0 8px 32px rgba(0,0,0,.08), inset 0 0.5px 0 rgba(255,255,255,.7);
+}
+
+.f-mapview-back:hover {
+ background: rgba(255, 255, 255, .22);
+ border-color: rgba(255, 255, 255, .28);
+ transform: translateX(-50%) translateY(-2px);
+ box-shadow: 0 10px 36px rgba(0,0,0,.35), inset 0 0.5px 0 rgba(255,255,255,.12);
+}
+:root:not([data-theme="dark"]) .f-mapview-back:hover {
+ background: rgba(255, 255, 255, .85);
+ border-color: rgba(0, 0, 0, .14);
+}
+.f-mapview-back:active {
+ transform: translateX(-50%) translateY(0);
+ box-shadow: 0 4px 16px rgba(0,0,0,.2), inset 0 0.5px 0 rgba(255,255,255,.08);
+}
+
/* ── Feed Wrap + Scroll ── */
.f-wrap { display: flex; flex: 1; overflow: hidden; min-height: 0; }
@@ -481,6 +525,11 @@
}
@media (max-width: 900px) {
+ .f-mapview-back {
+ /* Поднимаем кнопку выше плавающей нижней навигации */
+ bottom: calc(84px + env(safe-area-inset-bottom));
+ }
+
.f-feed {
padding: 10px;
gap: 12px;
diff --git a/src/styles/modal.css b/src/styles/modal.css
index cc09a3f..b782825 100644
--- a/src/styles/modal.css
+++ b/src/styles/modal.css
@@ -522,21 +522,33 @@ select.f-m-field::selection { background: transparent; }
padding: 0;
overflow: hidden;
border-radius: 24px;
+ display: flex;
+ flex-direction: column;
+ max-height: min(90vh, 820px);
}
.f-post-detail-modal .f-card {
border: none;
border-radius: 24px;
box-shadow: none;
+ display: flex;
+ flex-direction: column;
+ flex: 1;
+ min-height: 0;
+ overflow-y: auto;
+ scrollbar-width: thin;
}
+.f-post-detail-modal .f-card::-webkit-scrollbar { width: 4px; }
+.f-post-detail-modal .f-card::-webkit-scrollbar-track { background: transparent; }
+.f-post-detail-modal .f-card::-webkit-scrollbar-thumb { background: var(--muted2); border-radius: 2px; }
.f-post-detail-modal .f-card-head {
border-radius: 24px 24px 0 0;
-}
-.f-post-detail-modal .f-card-head {
+ flex-shrink: 0;
padding: 10px 14px;
}
.f-post-detail-modal .f-card-img {
max-height: none;
overflow: visible;
+ flex-shrink: 0;
}
.f-post-detail-modal .f-card-img img {
width: 100%;
@@ -546,8 +558,25 @@ select.f-m-field::selection { background: transparent; }
.f-post-detail-modal .f-card-caption {
padding: 8px 14px;
}
+.f-post-detail-modal .f-card-caption-text {
+ -webkit-line-clamp: unset;
+ line-clamp: unset;
+ overflow: visible;
+}
.f-post-detail-modal .f-card-foot {
- padding: 8px 14px;
+ position: sticky;
+ bottom: 0;
+ z-index: 2;
+ flex-shrink: 0;
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ justify-content: space-between;
+ gap: 10px;
+ padding: 10px 16px calc(12px + env(safe-area-inset-bottom, 0px));
+ background: var(--bg-card);
+ border-top: 1px solid var(--border);
+ box-shadow: 0 -6px 20px rgba(0, 0, 0, .06);
}
.f-app.f-map-view .f-card-foot .f-card-phone {
font-size: .75rem;