/**
 * V1.52 — LA GEOMETRIA DELLA MAPPA. Una volta sola.
 *
 * IL PROBLEMA CHE CHIUDE
 * Fino alla V1.51b queste stesse regole vivevano copiate in quattro
 * file: editor (dentro editor.css, poi map-surface.css), visitor.css,
 * public-preview.css e brochure.css. Quattro copie della stessa cosa
 * significa che una puo' essere cancellata senza che nessuno se ne
 * accorga — ed e' esattamente cio' che e' successo in V1.51, quando
 * eliminare editor.css ha lasciato MapLibre con un contenitore alto
 * zero pixel.
 *
 * Da qui in avanti la struttura che `MapController.buildDom()` costruisce
 * ha UN proprietario:
 *
 *   .map-container            (misurato dal layout della pagina)
 *     .native-map-root        posizionato, contesto di impilamento
 *       .vector-map-canvas    il contenitore di Google Maps
 *       .native-map-overlay   area e percorso (SVG)
 *       .native-map-markers   i punti dell'evento
 *       .native-map-controls  zoom
 *       .native-map-attribution
 *
 * COSA STA QUI E COSA NO
 * Qui c'e' solo cio' che rende la mappa UTILIZZABILE: posizione, misure,
 * piani, cursori, eventi del puntatore. Nessun colore di marchio,
 * nessuna dimensione di marker, nessuna decisione estetica: quelle
 * appartengono alla superficie che monta la mappa, e ogni superficie ha
 * il suo file.
 *
 * Se una regola qui dentro si puo' togliere senza che la mappa smetta di
 * funzionare, non appartiene a questo file.
 */

/* ====================================================================
   IL CONTENITORE DI PAGINA
   L'unico punto in cui la mappa prende misure dall'esterno. Chi lo
   monta gli deve dare un'altezza vera — `.map-surface` in layout.css
   e' la primitiva che lo fa.
   ==================================================================== */
.map-container { position: absolute; inset: 0; }

/* ====================================================================
   LA RADICE
   `isolation: isolate` la rende un contesto di impilamento suo: i piani
   1-9 qui dentro non possono salire sopra la navigazione o un dialog,
   e niente della shell puo' infilarsi fra il canvas e i marker.
   ==================================================================== */
.native-map-root {
  position: absolute;
  inset: 0;
  overflow: hidden;
  isolation: isolate;
  background: var(--surface-map);
  /* Una mappa interattiva mangia i gesti: e' l'unico modo di poterla
     trascinare. Una superficie dove la mappa e' un'illustrazione — la
     brochure — dichiara `auto`, o la pagina non si scorre piu' col
     dito passando sopra la mappa. */
  touch-action: var(--map-touch-action, none);
  user-select: none;
}

/* ====================================================================
   IL CANVAS DELLA MAPPA
   Il nodo passato a `new google.maps.Map()`. Google legge le misure di
   questo contenitore e le osserva: se sono zero, non disegna.
   ==================================================================== */
.vector-map-canvas {
  position: absolute;
  inset: 0;
  z-index: var(--z-map-canvas);
  width: 100%;
  height: 100%;
}

/* Il fondo che si vede prima che le tile arrivino. Il vettoriale ha il
   suo — deve somigliare alla basemap, non alla carta dell'app, o il
   caricamento lampeggia. */
.vector-map-root { background: var(--map-canvas-bg, var(--surface-map)); }

/*
  V1.59 — i comandi di Google restano spenti da `disableDefaultUI`, non
  da una regola CSS: lo zoom e' quello di Hearth, gia' disegnato dal
  controller.

  L'attribuzione e il logo di Google NON si nascondono. Sono una
  condizione d'uso del servizio, non decorazione.
*/

/* ====================================================================
   I PIANI SOPRA IL CANVAS
   Ognuno riempie la radice. Se uno di questi torna nel flusso normale,
   spinge il canvas fuori dal contenitore: e' il modo in cui la mappa
   "sparisce" senza che nulla segnali un errore.
   ==================================================================== */
.native-map-tiles,
.native-map-overlay,
.native-map-markers {
  position: absolute;
  inset: 0;
}

/*
  Fallback raster (map-controller-raster.js).

  `--map-tiles-inset: auto` serve alle superfici in cui e' il controller
  a posizionare la piastrellatura, per coprire la diagonale quando la
  mappa e' ruotata: e' una variabile, non una seconda geometria.
*/
.native-map-tiles {
  z-index: var(--z-map-canvas);
  overflow: hidden;
  inset: var(--map-tiles-inset, 0);
}

.native-map-tile {
  position: absolute;
  width: 256px;
  height: 256px;
  max-width: none;
  pointer-events: none;
}

/* Area e percorso: disegnati, non cliccabili. I click devono arrivare
   alla mappa sotto, o disegnare diventa impossibile. */
.native-map-overlay {
  z-index: var(--z-map-overlay);
  overflow: visible;
  pointer-events: none;
}

.native-map-markers {
  z-index: var(--z-map-markers);
  pointer-events: none;
}

/* Il filo che collega un marker spostato alla sua posizione vera. */
.native-spider-leg {
  position: absolute;
  z-index: var(--z-map-overlay);
  height: 1.5px;
  background: var(--map-spider-color, rgba(17, 17, 17, .3));
  pointer-events: none;
  transform-origin: 0 50%;
}

/* ====================================================================
   L'ANCORAGGIO DEI MARKER
   Il controller scrive `left`/`top` in pixel: qui si decide solo come
   il marker si allinea a quel punto. La FORMA del marker sta in
   map-markers.css, il suo aspetto nel file della superficie.
   ==================================================================== */
/*
  V1.60 — IL MARKER NON SI POSIZIONA PIU' DA SOLO.

  Sta dentro un AdvancedMarkerElement, che lo ancora alla sua
  coordinata: la posizione appartiene a Google, e durante pan, zoom e
  rotazione e' lui a spostarlo. Fino alla V1.59 era `position:
  absolute` con `left` e `top` scritti a ogni evento di camera, piu'
  una transizione per ammorbidire i salti che quel modo produceva.

  Con la posizione tolta cade anche la transizione: non c'e' piu' un
  salto da ammorbidire, e durante un trascinamento era proprio lei a
  far arrivare il marker in ritardo sul dito.
*/
.native-point-marker {
  z-index: var(--z-map-marker);

  /*
    NIENTE PADDING SOTTO.

    La punta fa parte della forma e del suo riquadro: il fondo del
    bottone E' la punta, ed e' cio' che Google ancora alla coordinata.
    Un padding inferiore, di qualunque misura, sposterebbe la
    coordinata sotto il vuoto.

    Ai lati e sopra si puo': allarga l'area da toccare senza muovere
    il fondo.
  */
  padding: 2px 2px 0;
  border: 0;
  background: transparent;
  pointer-events: var(--map-marker-pointer-events, auto);
  touch-action: none;
  cursor: var(--map-marker-cursor, pointer);
}

/*
  V1.57 — durante il trascinamento la transizione si spegne.

  Animare `left` e `top` e' giusto quando la mappa si sposta: il marker
  accompagna il movimento invece di saltare. Sotto il dito e' l'opposto:
  il marker insegue il puntatore con un ritardo costante, e al rilascio
  il punto finisce dove il marker stava andando, non dove lo si e'
  lasciato. E' il motivo per cui trascinare uno stand sembrava impreciso.

  `transform` NON si tocca: e' quello che ancora il marker al suo punto,
  e riscriverlo qui e' il modo classico di far sparire i marker.
*/
.native-point-marker.is-dragging {
  z-index: calc(var(--z-map-marker) + 1);
  cursor: grabbing;
}

/* Un gruppo non si afferra, si tocca per aprirlo: sulla mappa
   dell'editor il cursore predefinito dei marker e' la mano che
   affenta, e per un gruppo direbbe una cosa falsa. */
.native-cluster-marker { cursor: pointer; padding: 0; }

/* ====================================================================
   CURSORI PER MODALITA'
   Disegnare un'area con la mano aperta non dice che si sta disegnando.
   E' l'unico segnale continuo che la modalita' e' attiva.
   ==================================================================== */
.native-map-root[data-mode="area"],
.native-map-root[data-mode="route"],
.native-map-root[data-mode="branch-start"],
.native-map-root[data-mode="branch-draw"],
.native-map-root[data-mode="point"] { cursor: crosshair; }

.native-map-root[data-mode="select"] { cursor: grab; }

.native-map-root[data-mode="select"]:active { cursor: grabbing; }

/* ====================================================================
   ATTRIBUZIONE
   Non e' negoziabile: OpenFreeMap, OpenMapTiles e OpenStreetMap vanno
   citati ovunque compaia la loro cartografia. Sta nel core, non nel
   file dei controlli, proprio perche' una superficie possa togliere i
   controlli senza togliere la citazione.
   ==================================================================== */
.native-map-attribution {
  position: absolute;
  right: var(--map-attribution-right, var(--space-2));
  bottom: var(--map-attribution-bottom, var(--space-1));
  z-index: var(--z-map-attribution);
  padding: var(--map-attribution-padding, 2px var(--space-1));
  border-radius: var(--map-attribution-radius, var(--radius-sm));
  background: var(--map-attribution-bg, var(--surface-panel));
  color: var(--map-attribution-color, var(--text-muted));
  font-size: var(--map-attribution-size, var(--type-eyebrow-size));
}

/* ====================================================================
   I CONTROLLI ESISTONO SEMPRE, SI VEDONO SOLO DOVE SERVONO

   `MapController.buildDom()` costruisce sempre i comandi di zoom. Una
   superficie che non li vuole — il visitatore ha i suoi, la brochure e'
   carta — prima li nascondeva con un `display: none !important` nel
   proprio CSS: tre superfici, tre regole, e la geometria dei comandi
   duplicata in ognuna per poterla battere.

   Ora il default e' NASCOSTO. Chi li vuole carica `map-controls.css`,
   che e' l'unico file che li mostra e li veste. Una superficie che non
   lo carica non deve scrivere niente.
   ==================================================================== */
.native-map-controls { display: none; }
