:root {
  /* Palette : panneaux semi-transparents (minicarte, raccourcis) sur fond photo. */
  --ui-font: system-ui, sans-serif;
  --ui-radius: 8px;
  --ui-radius-sm: 4px;
  --ui-panel-bg: rgba(20, 20, 20, 0.55);
  --ui-panel-bg-hover: rgba(20, 20, 20, 0.75);
  --ui-panel-border: rgba(255, 255, 255, 0.25);
  --ui-panel-fg: white;
  --ui-menu-bg: rgba(20, 20, 20, 0.85);
  --ui-menu-item-hover-bg: rgba(255, 255, 255, 0.15);
  --ui-tooltip-bg: rgba(20, 20, 20, 0.9);
  --ui-control-bg: rgba(20, 20, 20, 0.7);
  --ui-control-bg-hover: rgba(20, 20, 20, 0.9);
  --ui-control-border: rgba(255, 255, 255, 0.35);
  --ui-accent: #e63946;

  --ui-z-overlay: 10;
  --ui-z-minimap-controls: 2;
  --ui-z-minimap-tooltip: 1;

  --ui-transition-fast: 0.1s ease;
  --ui-transition-base: 0.2s ease;
  --ui-transition-slow: 0.4s ease;

  --minimap-width: 250px;
  --minimap-height: 190px;
  --minimap-width-expanded: 470px;
  --minimap-height-expanded: 355px;
  --minimap-max-width: 260px;
  --minimap-max-width-expanded: 480px;
}

html, body { margin: 0; height: 100%; }
#viewer { width: 100vw; height: 100vh; }
.psv-marker { cursor: pointer !important; }
.caption-link { color: inherit; text-decoration: none; }

#minimap {
  position: fixed;
  left: 12px;
  /* Cleared above Photo Sphere Viewer's own bottom navbar (~44px) so its
     zoom/fullscreen buttons don't overlap the plan. */
  bottom: 56px;
  z-index: var(--ui-z-overlay);
  background: var(--ui-panel-bg);
  border: 1px solid var(--ui-panel-border);
  border-radius: var(--ui-radius);
  padding: 6px;
  max-width: var(--minimap-max-width);
  font-family: var(--ui-font);
  user-select: none;
  transition: max-width var(--ui-transition-base);
}
#minimap.expanded { max-width: var(--minimap-max-width-expanded); }
#minimap[hidden] { display: none; }
#minimap.collapsed .minimap-body { display: none; }
#minimap-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
  color: var(--ui-panel-fg);
  font-size: 12px;
  padding: 0 2px 4px;
}
#minimap-label { font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; cursor: pointer; }
#minimap-buttons { display: flex; gap: 2px; flex-shrink: 0; }
#minimap-expand, #minimap-toggle {
  cursor: pointer;
  background: none;
  border: none;
  color: var(--ui-panel-fg);
  font-size: 14px;
  line-height: 1;
  padding: 2px 4px;
}
#minimap.collapsed #minimap-expand { display: none; }
.minimap-body { position: relative; line-height: 0; }
.minimap-viewport {
  position: relative;
  overflow: hidden;
  width: var(--minimap-width);
  height: var(--minimap-height);
  border-radius: var(--ui-radius-sm);
  cursor: grab;
  touch-action: none;
  transition: width var(--ui-transition-base), height var(--ui-transition-base);
}
.minimap-viewport.dragging { cursor: grabbing; }
#minimap.expanded .minimap-viewport { width: var(--minimap-width-expanded); height: var(--minimap-height-expanded); }
.minimap-content {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  transform-origin: 0 0;
  --mm-scale: 1;
}
/* Appliquée temporairement par focusMinimap(..., true) lors d'un changement de
   node, pour animer le recentrage plutôt que de sauter instantanément. Retirée
   juste après (voir focusMinimap) pour que le drag/pinch restent instantanés. */
.minimap-content.animate { transition: transform var(--ui-transition-slow); }
.minimap-content img {
  display: block;
  width: 100%;
  height: auto;
  -webkit-user-drag: none;
  user-drag: none;
}
.minimap-point {
  position: absolute;
  width: 6px;
  height: 6px;
  margin: -3px 0 0 -3px;
  border-radius: 50%;
  background: rgba(255, 255, 255, 0.85);
  border: 1.5px solid rgba(20, 20, 20, 0.7);
  cursor: pointer;
}
.minimap-point:hover { background: var(--ui-panel-fg); }
.minimap-point.current {
  width: 6px;
  height: 6px;
  margin: -3px 0 0 -3px;
  background: var(--ui-accent);
  border: 1.5px solid white;
  cursor: default;
}
.minimap-point::after {
  content: attr(data-name);
  position: absolute;
  left: 50%;
  bottom: calc(100% + 7px);
  /* La minicarte peut être zoomée jusqu'à ×4.5 (voir MINIMAP_ZOOM_MAX) ; sans ce
     contre-zoom l'infobulle serait agrandie d'autant et deviendrait illisible.
     --mm-scale est mis à jour en JS (applyMinimapTransform) à chaque changement
     de zoom. */
  transform: translateX(-50%) scale(calc(1 / var(--mm-scale, 1)));
  transform-origin: 50% 100%;
  background: var(--ui-tooltip-bg);
  color: var(--ui-panel-fg);
  font-size: 11px;
  line-height: 1.6;
  white-space: nowrap;
  padding: 5px 7px;
  border-radius: var(--ui-radius-sm);
  pointer-events: none;
  opacity: 0;
  transition: opacity var(--ui-transition-fast);
  z-index: var(--ui-z-minimap-tooltip);
}
.minimap-point:hover::after { opacity: 1; }
/* Cône plein flouté indiquant la direction regardée, ancré sur le point
   actif (rotate(0) = "vers le haut du plan"). Triangle CSS classique
   (border-left/right transparents + border-top solid = pointe en bas) ;
   le flou casse volontairement les bords nets pour ne pas suggérer un
   angle exact — juste "à peu près par là". */
.minimap-heading {
  position: absolute;
  width: 0;
  height: 0;
  border-left: 6px solid transparent;
  border-right: 6px solid transparent;
  border-top: 14px solid rgba(230, 57, 70, 0.35);
  filter: blur(1.5px);
  /* Marge = décalage nécessaire pour amener la pointe (bas de la boîte)
     sur le point actif, + 1.5px sur chaque axe car .minimap-point est en
     box-sizing content-box : sa bordure de 1.5px s'ajoute hors de la marge
     de centrage, donc son centre visuel réel est décalé d'autant. */
  margin: -12.5px 0 0 -4.5px;
  transform-origin: 50% 100%;
  pointer-events: none;
}
.minimap-zoom-controls {
  position: absolute;
  right: 6px;
  bottom: 6px;
  z-index: var(--ui-z-minimap-controls);
  display: flex;
  flex-direction: column;
  gap: 4px;
}
.minimap-zoom-controls button {
  width: 22px;
  height: 22px;
  padding: 0;
  border-radius: var(--ui-radius-sm);
  border: 1px solid var(--ui-control-border);
  background: var(--ui-control-bg);
  color: var(--ui-panel-fg);
  font-size: 14px;
  line-height: 1;
  cursor: pointer;
}
.minimap-zoom-controls button:hover:not(:disabled) { background: var(--ui-control-bg-hover); }
.minimap-zoom-controls button:disabled { opacity: 0.35; cursor: default; }
#minimap.collapsed .minimap-zoom-controls { display: none; }
/* Sur tactile, le pincement à deux doigts remplace ces boutons. */
@media (pointer: coarse) {
  .minimap-zoom-controls { display: none; }
}

#shortcuts {
  position: fixed;
  top: 12px;
  right: 12px;
  z-index: var(--ui-z-overlay);
  font-family: var(--ui-font);
  user-select: none;
}
#shortcuts-toggle {
  cursor: pointer;
  background: var(--ui-panel-bg);
  border: 1px solid var(--ui-panel-border);
  border-radius: var(--ui-radius);
  color: var(--ui-panel-fg);
  font-size: 14px;
  line-height: 1;
  padding: 10px 12px;
  white-space: nowrap;
}
#shortcuts-toggle:hover { background: var(--ui-panel-bg-hover); }
#shortcuts-menu {
  position: absolute;
  top: calc(100% + 6px);
  right: 0;
  min-width: 200px;
  background: var(--ui-menu-bg);
  border: 1px solid var(--ui-panel-border);
  border-radius: var(--ui-radius);
  padding: 6px;
  display: flex;
  flex-direction: column;
  gap: 2px;
}
#shortcuts-menu[hidden] { display: none; }
#shortcuts-menu button {
  cursor: pointer;
  background: none;
  border: none;
  color: var(--ui-panel-fg);
  font-size: 14px;
  text-align: left;
  padding: 8px 10px;
  border-radius: 5px;
  white-space: nowrap;
}
#shortcuts-menu button:hover { background: var(--ui-menu-item-hover-bg); }
#shortcuts-menu button.current { color: var(--ui-accent); font-weight: 600; }
