This commit is contained in:
Fabio 2026-02-22 21:28:36 +01:00
parent 4dec824b41
commit 81d31c6839
3 changed files with 115 additions and 31 deletions

View file

@ -1,5 +1,5 @@
/* =============================== /* ===============================
BOTTOM SHEET (menu ) STRUTTURA BASE (comune)
=============================== */ =============================== */
.bottom-sheet { .bottom-sheet {
@ -8,10 +8,6 @@
left: 0; left: 0;
width: 100%; width: 100%;
/* 🔥 Altezza dinamica: abbastanza grande per mostrare tutto */
height: 60vh;
max-height: 80vh;
background: rgba(255,255,255,0.95); background: rgba(255,255,255,0.95);
backdrop-filter: blur(6px); backdrop-filter: blur(6px);
border-top: 1px solid #ddd; border-top: 1px solid #ddd;
@ -20,15 +16,13 @@
display: none; display: none;
flex-direction: column; flex-direction: column;
z-index: 9999; z-index: 9999;
overflow-y: auto; /* 🔥 Scroll verticale */
} }
.bottom-sheet.open { .bottom-sheet.open {
display: flex; display: flex;
} }
/* Header con la "maniglia" */ /* Maniglia superiore */
.sheet-header { .sheet-header {
height: 16px; height: 16px;
display: flex; display: flex;
@ -44,12 +38,18 @@
border-radius: 4px; border-radius: 4px;
} }
/* Contenuto del menu (ordinamento, filtri, ecc.) */ /* ===============================
.sheet-content { BOTTOM SHEET FOTO (MAPPA)
padding: 20px; BASSO SOLO STRISCIA FOTO
=============================== */
.photo-strip {
height: 140px; /* altezza originale */
overflow-y: hidden; /* niente scroll verticale */
overflow-x: auto; /* scroll orizzontale per le foto */
} }
/* Miniature (usate nel bottom sheet delle foto, non in quello delle opzioni) */ /* Miniature della striscia foto */
.sheet-gallery { .sheet-gallery {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
@ -74,6 +74,21 @@
object-fit: cover; object-fit: cover;
} }
/* ===============================
BOTTOM SHEET OPZIONI ()
ALTO MENU COMPLETO
=============================== */
.options-sheet {
height: auto; /* grande */
max-height: 80vh;
overflow-y: auto; /* scroll verticale */
}
.sheet-content {
padding: 20px;
}
/* Pulsanti del menu ⋮ */ /* Pulsanti del menu ⋮ */
.sheet-btn { .sheet-btn {
width: 100%; width: 100%;
@ -91,10 +106,22 @@
background: #e8e8e8; background: #e8e8e8;
} }
/* Titoli delle sezioni */ /* Titoli delle sezioni del menu ⋮ */
#optionsSheet h3 { #optionsSheet h3 {
margin-top: 20px; margin-top: 20px;
margin-bottom: 10px; margin-bottom: 10px;
font-size: 16px; font-size: 16px;
color: #444; color: #444;
} }
.sheet-overlay {
position: fixed;
inset: 0;
background: rgba(0,0,0,0.0); /* invisibile */
display: none;
z-index: 9998; /* appena sotto il bottom sheet */
}
.sheet-overlay.open {
display: block;
}

View file

@ -15,7 +15,6 @@
<link rel="stylesheet" href="css/map.css"> <link rel="stylesheet" href="css/map.css">
<link rel="stylesheet" href="css/utils.css"> <link rel="stylesheet" href="css/utils.css">
<!-- Leaflet CSS --> <!-- Leaflet CSS -->
<link rel="stylesheet" href="https://unpkg.com/leaflet/dist/leaflet.css" /> <link rel="stylesheet" href="https://unpkg.com/leaflet/dist/leaflet.css" />
@ -46,31 +45,41 @@
<div id="globalMap" class="global-map"></div> <div id="globalMap" class="global-map"></div>
</main> </main>
<!-- Modal Media (foto + video) --> <!-- =============================== -->
<!-- MODAL FOTO/VIDEO -->
<!-- =============================== -->
<div id="modal" class="modal"> <div id="modal" class="modal">
<div class="modal-content"> <div class="modal-content">
<div class="modal-close" id="modalClose">×</div> <div class="modal-close" id="modalClose">×</div>
<!-- CONTENITORE DINAMICO -->
<div id="modalMediaContainer"></div> <div id="modalMediaContainer"></div>
<div class="modal-info-btn" id="modalInfoBtn"></div> <div class="modal-info-btn" id="modalInfoBtn"></div>
</div> </div>
</div> </div>
<!-- Pannello Info --> <!-- =============================== -->
<!-- PANNELLO INFO -->
<!-- =============================== -->
<div id="infoPanel" class="info-panel"></div> <div id="infoPanel" class="info-panel"></div>
<!-- Bottom Sheet stile Google Photos Web (foto/cluster) --> <!-- =============================== -->
<div id="bottomSheet" class="bottom-sheet"> <!-- PANNELLO OVERLAY -->
<!-- =============================== -->
<div id="sheetOverlay" class="sheet-overlay"></div>
<!-- =============================== -->
<!-- BOTTOM SHEET FOTO (MAPPA) -->
<!-- =============================== -->
<div id="bottomSheet" class="bottom-sheet photo-strip">
<div class="sheet-header"></div> <div class="sheet-header"></div>
<div class="sheet-gallery" id="sheetGallery"></div> <div class="sheet-gallery" id="sheetGallery"></div>
</div> </div>
<!-- =============================== --> <!-- =============================== -->
<!-- BOTTOM SHEET OPZIONI (ordinamento + raggruppamento + filtri) --> <!-- BOTTOM SHEET OPZIONI () -->
<!-- =============================== --> <!-- =============================== -->
<div id="optionsSheet" class="bottom-sheet"> <div id="optionsSheet" class="bottom-sheet options-sheet">
<div class="sheet-header"></div> <div class="sheet-header"></div>
<div class="sheet-content"> <div class="sheet-content">

View file

@ -2,10 +2,26 @@
// BOTTOM SHEET (Google Photos Web) // BOTTOM SHEET (Google Photos Web)
// =============================== // ===============================
// Striscia foto (MAPPA)
const bottomSheet = document.getElementById("bottomSheet"); const bottomSheet = document.getElementById("bottomSheet");
const sheetGallery = document.getElementById("sheetGallery"); const sheetGallery = document.getElementById("sheetGallery");
// Apri il bottom sheet con una lista di foto // Menu ⋮ (OPZIONI) — NON usare const se già definito altrove
let optionsSheetRef = document.getElementById("optionsSheet");
// Overlay per chiudere i bottom sheet
let sheetOverlay = document.getElementById("sheetOverlay");
if (!sheetOverlay) {
sheetOverlay = document.createElement("div");
sheetOverlay.id = "sheetOverlay";
sheetOverlay.className = "sheet-overlay";
document.body.appendChild(sheetOverlay);
}
// ===============================
// STRISCIA FOTO (MAPPA)
// ===============================
function openBottomSheet(photoList) { function openBottomSheet(photoList) {
sheetGallery.innerHTML = ""; sheetGallery.innerHTML = "";
@ -31,21 +47,53 @@ function openBottomSheet(photoList) {
}); });
bottomSheet.classList.add("open"); bottomSheet.classList.add("open");
sheetOverlay.classList.add("open");
} }
// Chiudi il bottom sheet
function closeBottomSheet() { function closeBottomSheet() {
bottomSheet.classList.remove("open"); bottomSheet.classList.remove("open");
sheetOverlay.classList.remove("open");
} }
// Chiudi cliccando fuori dal bottom sheet // ===============================
document.addEventListener("click", (e) => { // MENU ⋮ (OPZIONI)
if (!bottomSheet.classList.contains("open")) return; // ===============================
const clickedInside = bottomSheet.contains(e.target); function openOptionsSheet() {
const clickedMarker = e.target.closest(".photo-marker, .photo-cluster"); optionsSheetRef.classList.add("open");
sheetOverlay.classList.add("open");
}
if (!clickedInside && !clickedMarker) { function closeOptionsSheet() {
optionsSheetRef.classList.remove("open");
sheetOverlay.classList.remove("open");
}
// ===============================
// CHIUSURA CLICCANDO FUORI
// ===============================
sheetOverlay.addEventListener("click", () => {
closeBottomSheet(); closeBottomSheet();
} closeOptionsSheet();
}); });
// ===============================
// CHIUSURA TOCCANDO LA MANIGLIA
// ===============================
document.querySelectorAll(".sheet-header").forEach(header => {
header.addEventListener("click", () => {
closeBottomSheet();
closeOptionsSheet();
});
});
// ===============================
// ESPORTIAMO LE FUNZIONI
// ===============================
window.openBottomSheet = openBottomSheet;
window.closeBottomSheet = closeBottomSheet;
window.openOptionsSheet = openOptionsSheet;
window.closeOptionsSheet = closeOptionsSheet;