/* ==========================================================================
   Pagina "Esplora" (/webgis/) - WebGisPage
   Sostituisce il blocco <style> inline che stava in web_gis_page.html.
   Dipende da css/tla-tokens.css (caricato per primo in base.html).

   Tre principi:
   1. nessun hex letterale: solo token;
   2. il verde #009933 (--tla-green-500) non compare mai su testo (3,75:1);
   3. il contratto DOM e' intoccabile: qui si stilizza, non si rinomina.
   ========================================================================== */

/* --------------------------------------------------------------------------
   1. GABBIA: la pagina esce dal tetto di 1200px del .container globale
   -------------------------------------------------------------------------- */

.container.container-explore {
	max-width: none;
	padding-left: 0;
	padding-right: 0;
	padding-bottom: 0 !important;
}

/* la testata e' gia' a piena larghezza: niente margini negativi da full-bleed */
.container-explore .page-header {
	width: 100%;
	margin-left: 0;
	margin-right: 0;
}

/* Due misure soltanto:
   - "app"     (2200px): testata, toolbar e mappa, cioe' gli elementi che devono
                         risultare incolonnati fra loro;
   - "lettura" (1560px): schede ed elenco, dove conta la lunghezza di riga. */
.explore-wrap {
	max-width: var(--tla-wrap-max, 1560px);
	margin-inline: auto;
	padding-inline: var(--tla-gutter, 1rem);
}

.explore-wrap--map,
.explore-toolbar > .explore-wrap {
	max-width: min(var(--tla-wrap-app, 2200px), 100%);
}

/* La testata slim usa la stessa gabbia di toolbar e mappa. Il gutter di .explore-wrap
   sta DENTRO il suo max-width, quindi va sommato: senza, titolo e breadcrumb restavano
   16px piu' esterni dei campi di ricerca e del bordo della mappa. */
.container-explore .page-header.page-header--slim {
	padding-inline: max(
		var(--tla-gutter, 1rem),
		calc(50% - var(--tla-wrap-app, 2200px) / 2 + var(--tla-gutter, 1rem))
	);
}

@media (max-width: 575.98px) {
	.explore-wrap {
		padding-inline: 0.75rem;
	}

	.container-explore .page-header.page-header--slim {
		padding-inline: 0.75rem;
	}
}

/* --------------------------------------------------------------------------
   2. TOOLBAR UNIFICATA: ricerca + filtri + chip + conteggi
   Sostituisce 3 bande verticali distinte (ricerca, filtri, statistiche).
   -------------------------------------------------------------------------- */

.explore-toolbar {
	background: var(--tla-surface, #fff);
	border-bottom: 1px solid var(--tla-line, #e6e6e6);
	padding-block: 0.65rem;
	transition: box-shadow 0.15s ease;
}

@media (min-width: 768px) {
	.explore-toolbar {
		position: sticky;
		top: 0;
		/* IMPILAMENTO - .it-header-wrapper e' position:relative con z-index:5, quindi e'
		   un contesto di impilamento: tutto cio' che sta dentro l'header (compresi i menu
		   a tendina della navbar e quello del profilo, che dichiarano 1000 e 2000) compete
		   con i fratelli al livello 5, non ai propri.
		   Con z-index 1020 questa toolbar copriva i menu aperti. Serve un valore sopra la
		   mappa (#map e' z-index 0) e sotto l'header. */
		z-index: 4;
	}

	.explore-toolbar.is-pinned {
		box-shadow: var(--tla-sh-2);
	}
}

.explore-toolbar .form-label {
	font-size: var(--fs-xs, 0.75rem);
	font-weight: var(--fw-semi, 600);
	color: var(--tla-ink-muted, #565e64);
	margin-bottom: 0.15rem;
	text-transform: none;
	letter-spacing: 0;
}

.explore-toolbar .form-select,
.explore-toolbar .form-control {
	border-color: var(--tla-line-strong, #dee2e6);
	border-radius: var(--tla-radius-ctrl, 4px);
}

.explore-toolbar .form-select:focus,
.explore-toolbar .form-control:focus {
	border-color: var(--tla-accent-surface, #009933);
	box-shadow: 0 0 0 0.2rem rgba(0, 153, 51, 0.15);
}

/* Select2: allinea l'altezza e il bordo ai campi nativi */
.explore-toolbar .select2-container .select2-selection--single {
	height: calc(1.5em + 0.75rem + 2px);
	border-color: var(--tla-line-strong, #dee2e6);
	border-radius: var(--tla-radius-ctrl, 4px);
}

.explore-toolbar .select2-container--default .select2-selection--single .select2-selection__rendered {
	line-height: calc(1.5em + 0.75rem);
	padding-left: 0.75rem;
}

.explore-toolbar .select2-container--default .select2-selection--single .select2-selection__arrow {
	height: calc(1.5em + 0.75rem);
}

/* pulsante "Filtri" e pulsanti secondari della toolbar */
.btn-tla-outline {
	background: var(--tla-surface, #fff) !important;
	border: 1px solid var(--tla-line-strong, #dee2e6) !important;
	color: var(--tla-accent, #007722) !important;
	border-radius: var(--tla-radius-ctrl, 4px) !important;
	font-size: var(--fs-sm, 0.875rem);
	font-weight: var(--fw-semi, 600);
	padding: 0.375rem 0.75rem;
}

.btn-tla-outline:hover,
.btn-tla-outline:focus-visible {
	background: var(--tla-green-050, #f2fbf5) !important;
	border-color: var(--tla-accent-surface, #009933) !important;
	color: var(--tla-accent-strong, #005511) !important;
}

.btn-tla-outline[aria-expanded="true"] {
	background: var(--tla-accent-soft, #ccf2d9) !important;
	border-color: var(--tla-accent-border, #99e6b8) !important;
	color: var(--tla-accent-strong, #005511) !important;
}

.btn-tla-outline:disabled,
.btn-tla-outline[disabled] {
	opacity: 0.5;
	cursor: not-allowed;
}

.badge-tla {
	background: var(--tla-accent-strong, #005511);
	color: #fff;
	font-size: var(--fs-xs, 0.75rem);
	font-weight: var(--fw-bold, 700);
}

/* riga di riepilogo: chip a sinistra, conteggi a destra */
.explore-summary {
	display: flex;
	flex-wrap: wrap;
	gap: 0.4rem 1rem;
	align-items: center;
	justify-content: space-between;
	margin-top: 0.5rem;
}

.explore-chips {
	display: flex;
	gap: 0.35rem;
	flex-wrap: wrap;
	align-items: center;
	min-height: 1.75rem;
}

.explore-chips > #explore-chips {
	display: contents;
}

.explore-summary-right {
	display: flex;
	align-items: center;
	gap: 0.75rem;
	flex-wrap: wrap;
}

.explore-stats-inline {
	font-size: var(--fs-sm, 0.875rem);
	color: var(--tla-ink-muted, #565e64);
	font-variant-numeric: tabular-nums;
}

.explore-stats-inline strong {
	color: var(--tla-accent-strong, #005511);
	font-weight: var(--fw-bold, 700);
	font-size: var(--fs-base, 1rem);
}

.explore-note {
	font-size: var(--fs-xs, 0.75rem);
	color: var(--tla-ink-muted, #565e64);
}

/* --------------------------------------------------------------------------
   3. CHIP DEI FILTRI ATTIVI
   -------------------------------------------------------------------------- */

.filter-chip {
	display: inline-flex;
	align-items: center;
	gap: 0.35rem;
	background: var(--tla-accent-soft, #ccf2d9);
	color: var(--tla-accent-strong, #005511);
	border: 1px solid var(--tla-accent-border, #99e6b8);
	border-radius: var(--tla-radius-pill, 999px);
	padding: 0.2rem 0.3rem 0.2rem 0.7rem;
	font-size: var(--fs-sm, 0.875rem);
	line-height: var(--lh-tight, 1.25);
	white-space: nowrap;
	max-width: 100%;
}

.filter-chip > span {
	overflow: hidden;
	text-overflow: ellipsis;
}

.filter-chip-x {
	border: none;
	background: var(--tla-accent-strong, #005511);
	color: #fff;
	width: 20px;
	height: 20px;
	min-width: 20px;
	line-height: 1;
	border-radius: 50%;
	font-size: 0.95rem;
	cursor: pointer;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	padding: 0;
	flex: 0 0 auto;
}

.filter-chip-x:hover {
	background: var(--tla-green-900, #004c28);
}

/* target touch da 44px senza deformare il cerchio (WCAG 2.5.5) */
@media (hover: none), (pointer: coarse) {
	.filter-chip-x::after {
		content: "";
		position: absolute;
		width: 44px;
		height: 44px;
	}

	.filter-chip-x {
		position: relative;
	}
}

/* --------------------------------------------------------------------------
   4. SELETTORE DI VISTA (Mappa / Schede / Elenco)
   -------------------------------------------------------------------------- */

.explore-tabs {
	gap: 0.25rem;
	margin: 0.6rem 0 0.5rem;
}

.explore-tabs .nav-link {
	color: var(--tla-accent, #007722);
	font-weight: var(--fw-semi, 600);
	font-size: var(--fs-sm, 0.875rem);
	padding: 0.4rem 1rem;
	border-radius: var(--tla-radius-ctrl, 4px);
	background: transparent;
	border: 1px solid transparent;
}

.explore-tabs .nav-link:hover {
	background: var(--tla-green-050, #f2fbf5);
	border-color: var(--tla-accent-border, #99e6b8);
}

.explore-tabs .nav-link.active {
	background: var(--tla-accent-strong, #005511);
	color: #fff;
	border-color: var(--tla-accent-strong, #005511);
}

@media (max-width: 575.98px) {
	.explore-tabs {
		flex-wrap: nowrap;
		overflow-x: auto;
		scrollbar-width: none;
	}

	.explore-tabs::-webkit-scrollbar {
		display: none;
	}
}

/* --------------------------------------------------------------------------
   5. MAPPA
   -------------------------------------------------------------------------- */

/* I comandi d'area (disegno, caricamento file) sono controlli OpenLayers dentro la
   barra della mappa: ereditano lo stile di .ol-control button definito in gis.css. */

/* avviso sopra la mappa (checklist pronta) */
.map-notice {
	display: flex;
	align-items: center;
	gap: 0.6rem;
	flex-wrap: wrap;
	background: var(--tla-accent-soft, #ccf2d9);
	border: 1px solid var(--tla-accent-border, #99e6b8);
	color: var(--tla-accent-strong, #005511);
	border-radius: var(--tla-radius-ctrl, 4px);
	padding: 0.5rem 0.75rem;
	margin-bottom: 0.6rem;
	font-size: var(--fs-sm, 0.875rem);
}

.map-notice > span {
	flex: 1 1 auto;
}

.map-container {
	position: relative;
	border-radius: var(--tla-radius-surf, 8px);
	overflow: hidden;
	box-shadow: var(--tla-sh-1);
	border: 1px solid var(--tla-line, #e6e6e6);
}

/* SORGENTE UNICA dell'altezza della mappa su questa pagina.
   Vince su gisdata.css (.map{height:30em}) per ordine di caricamento: explore.css
   entra dopo il block.super di extra_css. gisdata.css NON va toccato, serve anche a
   TaxonPage, DatasetPage, HabitatPage e MonitoraggiPage.
   --explore-chrome e' aggiornata a runtime da un ResizeObserver sulla toolbar; il
   fallback 330px serve al primo paint, quando view.fit legge map.getSize(). */
.container-explore .map {
	height: clamp(420px, calc(100dvh - var(--explore-chrome, 330px)), 1100px);
	min-height: 0;
	width: 100%;
	margin-bottom: 0;
	position: relative;
	/* CONSERVATO: e' lo stacking context su cui poggia syncMapLegendOffset in
	   gisdata_base.html e che tiene i control ol-ext sotto la toolbar sticky. */
	z-index: 0;
}

@media (max-width: 767.98px) {
	.container-explore .map {
		height: clamp(340px, calc(100dvh - 290px), 640px);
	}

	.map-container {
		border-radius: 0;
		border-left: 0;
		border-right: 0;
		margin-inline: -0.75rem;
	}
}

/* equivalente testuale della griglia di densita' */
.map-alt-data {
	display: flex;
	align-items: center;
	gap: 0.65rem;
	flex-wrap: wrap;
	margin: 0.6rem 0 0;
}

.map-alt-hint {
	font-size: var(--fs-xs, 0.75rem);
	color: var(--tla-ink-muted, #565e64);
}

/* feedback visivo del drag&drop di file KML/GeoJSON/GPX sulla mappa */
.map-container.is-dragover::after {
	content: "";
	position: absolute;
	inset: 0;
	z-index: 7;
	pointer-events: none;
	outline: 3px dashed var(--tla-accent-surface, #009933);
	outline-offset: -8px;
	background: rgba(0, 153, 51, 0.06);
}

/* il control ol-ext della tabella resta creato (serve alle altre pagine) ma qui e'
   pilotato dal pulsante HTML della toolbar. Fuori campo, NON display:none: il codice
   di gisdata_base scrive proprio su element.style.display e lo useremmo come segnale. */
.ol-ctrl-offscreen {
	position: absolute !important;
	left: -9999px !important;
}

/* --------------------------------------------------------------------------
   6. VISTA SCHEDE (card di specie)
   -------------------------------------------------------------------------- */

.species-card > a {
	text-decoration: none;
	color: inherit;
	display: block;
	height: 100%;
}

.species-card-inner {
	background: var(--tla-surface, #fff);
	border: 1px solid var(--tla-line-strong, #dee2e6);
	border-radius: var(--tla-radius-surf, 8px);
	box-shadow: var(--tla-sh-1);
	overflow: hidden;
	height: 100%;
	display: flex;
	flex-direction: column;
	transition: box-shadow 0.2s ease, transform 0.2s ease, border-color 0.2s ease;
}

.species-card:hover .species-card-inner,
.species-card:focus-within .species-card-inner {
	box-shadow: var(--tla-sh-3);
	transform: translateY(-2px);
	border-color: var(--tla-accent-surface, #009933);
}

.species-card-img {
	aspect-ratio: 4 / 3;
	background: #eef2f1;
	display: flex;
	align-items: center;
	justify-content: center;
	overflow: hidden;
}

.species-card-img img {
	width: 100%;
	height: 100%;
	object-fit: cover;
}

.species-card-img .placeholder-icon {
	font-size: 2.4rem;
	color: var(--tla-ink-faint, #6b7a78);
}

.species-card-body {
	padding: 0.55rem 0.7rem 0.65rem;
	display: flex;
	flex-direction: column;
	gap: 0.1rem;
}

.species-card-vern {
	font-weight: var(--fw-semi, 600);
	font-size: var(--fs-sm, 0.875rem);
	line-height: var(--lh-tight, 1.25);
}

.species-card-sci {
	font-style: italic;
	font-size: var(--fs-xs, 0.75rem);
	color: var(--tla-ink-muted, #565e64);
}

.species-card-meta {
	display: flex;
	align-items: center;
	justify-content: space-between;
	margin-top: 0.3rem;
	gap: 0.3rem;
}

.species-card-count {
	font-size: var(--fs-xs, 0.75rem);
	color: var(--tla-accent, #007722);
	font-weight: var(--fw-bold, 700);
	white-space: nowrap;
	font-variant-numeric: tabular-nums;
}

.species-card-badge {
	font-size: var(--fs-xs, 0.75rem);
}

/* --------------------------------------------------------------------------
   7. VISTA ELENCO (tabella compatta)
   -------------------------------------------------------------------------- */

.species-list-table {
	vertical-align: middle;
}

.species-list-thumb {
	width: 46px;
	height: 46px;
	border-radius: var(--tla-radius-surf, 8px);
	object-fit: cover;
	background: #eef2f1;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	overflow: hidden;
}

.species-list-thumb img {
	width: 100%;
	height: 100%;
	object-fit: cover;
}

.species-list-thumb .placeholder-icon {
	font-size: 1.15rem;
	color: var(--tla-ink-faint, #6b7a78);
}

.species-list-table tbody tr {
	cursor: default;
}

.species-list-table tbody tr:hover {
	background: var(--tla-green-050, #f2fbf5);
}

.species-list-table .list-vern {
	font-weight: var(--fw-semi, 600);
}

.species-list-table .list-sci {
	font-style: italic;
	font-size: var(--fs-xs, 0.75rem);
	color: var(--tla-ink-muted, #565e64);
}

.species-list-table .list-count {
	color: var(--tla-accent, #007722);
	font-weight: var(--fw-bold, 700);
	white-space: nowrap;
	font-variant-numeric: tabular-nums;
}

/* --------------------------------------------------------------------------
   8. STATI: vuoto, caricamento, errore
   -------------------------------------------------------------------------- */

.explore-empty {
	text-align: center;
	color: var(--tla-ink-muted, #565e64);
	padding: 3rem 1rem;
}

.explore-empty .explore-empty-icon {
	font-size: 2.5rem;
	color: var(--tla-ink-faint, #6b7a78);
	margin-bottom: 0.75rem;
	display: block;
}

.explore-empty p {
	margin-bottom: 0.5rem;
}

.spinner-border.text-tla {
	color: var(--tla-accent, #007722) !important;
}

/* --------------------------------------------------------------------------
   9. AUTOCOMPLETE SPECIE: evidenziazione delle specie con modello di idoneita'
   -------------------------------------------------------------------------- */

.taxon-opt {
	display: flex;
	align-items: center;
	gap: 8px;
}

.taxon-opt__label {
	flex: 1 1 auto;
	min-width: 0;
}

.taxon-opt--model .taxon-opt__label {
	font-weight: var(--fw-semi, 600);
}

.taxon-opt__model {
	flex: 0 0 auto;
	display: inline-flex;
	align-items: center;
	color: var(--tla-accent, #007722);
	opacity: 0.75;
	transition: opacity 0.15s ease, transform 0.15s ease;
}

.taxon-opt--model:hover .taxon-opt__model {
	opacity: 1;
	transform: scale(1.08);
}

.select2-results__option--highlighted .taxon-opt__model {
	color: #fff;
	opacity: 0.95;
}

/* --------------------------------------------------------------------------
   S4 - Avviso sulla mappa: la densita' provinciale non risente dei filtri
   -------------------------------------------------------------------------- */

.map-badge {
	position: absolute;
	top: 10px;
	left: 50%;
	transform: translateX(-50%);
	z-index: 6;
	display: flex;
	align-items: center;
	gap: 0.5rem;
	background: rgba(255, 255, 255, 0.95);
	border: 1px solid var(--tla-accent-border, #99e6b8);
	border-radius: var(--tla-radius-pill, 999px);
	padding: 0.3rem 0.5rem 0.3rem 0.8rem;
	font-size: var(--fs-sm, 0.875rem);
	color: var(--tla-accent-strong, #005511);
	box-shadow: var(--tla-sh-2);
	max-width: calc(100% - 1.5rem);
}

.map-badge[hidden] {
	display: none;
}

.map-badge-link {
	border: 0;
	background: var(--tla-accent-strong, #005511);
	color: #fff;
	border-radius: var(--tla-radius-pill, 999px);
	padding: 0.15rem 0.6rem;
	font-size: var(--fs-xs, 0.75rem);
	font-weight: var(--fw-semi, 600);
	cursor: pointer;
	white-space: nowrap;
}

.map-badge-link:hover {
	background: var(--tla-green-900, #004c28);
}

@media (max-width: 575.98px) {
	.map-badge {
		font-size: var(--fs-xs, 0.75rem);
		padding: 0.25rem 0.4rem 0.25rem 0.6rem;
	}
}

/* --------------------------------------------------------------------------
   S13 - Stati di caricamento non distruttivi
   Prima il contenuto spariva di colpo e restava uno spinner su fondo vuoto:
   a ogni cambio di filtro la pagina "sbatteva". Ora il contenuto gia' presente
   resta al suo posto, attenuato e non cliccabile, finche' non arriva il nuovo.
   -------------------------------------------------------------------------- */

.is-loading-soft {
	opacity: 0.45;
	pointer-events: none;
	transition: opacity 0.15s ease;
}

.explore-skeleton {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
	gap: 1rem;
}

.explore-skeleton .sk-card {
	border: 1px solid var(--tla-line-strong, #dee2e6);
	border-radius: var(--tla-radius-surf, 8px);
	overflow: hidden;
	background: var(--tla-surface, #fff);
}

.explore-skeleton .sk-img {
	aspect-ratio: 4 / 3;
	background: linear-gradient(90deg, #eef2f1 25%, #e2e9e6 37%, #eef2f1 63%);
	background-size: 400% 100%;
	animation: sk-shimmer 1.4s ease infinite;
}

.explore-skeleton .sk-line {
	height: 0.7rem;
	margin: 0.55rem 0.7rem;
	border-radius: 3px;
	background: linear-gradient(90deg, #eef2f1 25%, #e2e9e6 37%, #eef2f1 63%);
	background-size: 400% 100%;
	animation: sk-shimmer 1.4s ease infinite;
}

.explore-skeleton .sk-line.short {
	width: 55%;
	margin-bottom: 0.7rem;
}

@keyframes sk-shimmer {
	0% { background-position: 100% 50%; }
	100% { background-position: 0 50%; }
}

@media (prefers-reduced-motion: reduce) {
	.explore-skeleton .sk-img,
	.explore-skeleton .sk-line {
		animation: none;
	}
}

/* --------------------------------------------------------------------------
   S15 - Toolbar compatta allo scroll su schermi stretti
   Sotto i 768px la toolbar non e' sticky (occuperebbe troppo), ma quando la
   pagina scorre la riga dei conteggi e le chip sono le prime a diventare
   superflue: si comprimono per lasciare spazio alla mappa.
   -------------------------------------------------------------------------- */

@media (max-width: 767.98px) {
	.explore-toolbar {
		position: sticky;
		top: 0;
		z-index: 4;   /* stesso ragionamento della variante desktop qui sopra */
		transition: padding-block 0.15s ease;
	}

	.explore-toolbar.is-condensed {
		padding-block: 0.35rem;
		box-shadow: var(--tla-sh-2);
	}

	.explore-toolbar.is-condensed .explore-summary,
	.explore-toolbar.is-condensed .form-label {
		display: none;
	}

	.explore-toolbar.is-condensed .row > [class*="col-"]:nth-child(n + 2) {
		display: none;   /* resta il solo campo specie */
	}
}

/* --------------------------------------------------------------------------
   10. FOCUS VISIBILE (WCAG 2.4.7), anche sopra le ortofoto
   -------------------------------------------------------------------------- */

.container-explore a:focus-visible,
.container-explore button:focus-visible,
.container-explore [tabindex]:focus-visible,
.container-explore .select2-selection:focus-visible,
.container-explore .form-select:focus-visible,
.container-explore .form-control:focus-visible {
	outline: 3px solid var(--tla-focus-color, #005511);
	outline-offset: 2px;
	box-shadow: var(--tla-focus-ring);
}
