/* ── Espace : orbite de la bibliothèque ── */
.library-orbit-stage {
  display: grid;
  grid-template-columns: var(--side-rail-width) minmax(0, var(--content-rail-width)) var(--side-rail-width);
  gap: var(--layout-rail-gap);
  min-height: calc(100vh - var(--nav-clearance) - 4rem);
  align-items: start;
  justify-content: center;
  position: relative;
}
.space-orbit-page {
  padding: var(--nav-clearance) var(--page-gutter) 2rem;
}
.space-orbit-page .library-orbit-stage {
  min-height: calc(100vh - var(--nav-clearance) - 2rem);
}
.library-orbit-map {
  align-items: center;
  display: grid;
  grid-column: 2;
  grid-row: 1;
  min-height: calc(100vh - var(--sticky-clearance) - 2rem);
  min-width: 0;
  position: sticky;
  top: var(--sticky-clearance);
  width: 100%;
}
.library-orbit-map svg {
  display: block;
  height: auto;
  margin: 0 auto;
  max-width: var(--content-rail-width);
  overflow: visible;
  width: 100%;
}
.library-orbit-assembly {
  /* Rythme permanent, et non transition : une derive lente n'appartient pas
     au contrat de duree de 00-foundation.css, qui ne couvre que les gestes.
     C'est la seule categorie d'animation qui garde ses propres nombres. */
  animation: library-orbit-drift 28s ease-in-out infinite;
  transform-box: view-box;
  transform-origin: 300px 180px;
}
.library-orbit-node {
  cursor: pointer;
  outline: none;
}
.library-orbit-node:focus-visible .library-orbit-sector-outline,
.library-orbit-node.is-selected .library-orbit-sector-outline {
  stroke: var(--fg);
  stroke-width: 1.35;
}
.library-orbit-sector,
.library-orbit-sector-outline,
.library-orbit-band,
.library-orbit-port,
.library-orbit-wire,
.library-orbit-engine circle {
  vector-effect: non-scaling-stroke;
}
.library-orbit-sector {
  fill: url(#library-sector-fill);
  stroke: var(--ui-frame);
  stroke-width: 1;
}
.library-orbit-sector-outline {
  fill: none;
  pointer-events: none;
  stroke: var(--ui-frame);
  stroke-width: 1;
}
.library-sector-fill-start {
  stop-color: var(--surface);
  stop-opacity: 0.42;
}
.library-sector-fill-end {
  stop-color: var(--ui-frame-soft);
  stop-opacity: 0.82;
}
.library-orbit-band {
  fill: var(--surface);
  pointer-events: none;
  stroke: var(--ui-frame);
  stroke-width: 1;
}
.library-orbit-label {
  fill: var(--fg);
  font-family: inherit;
  font-size: 10.5px;
  font-weight: 600;
  letter-spacing: 0.12em;
  pointer-events: none;
  text-transform: uppercase;
}
.library-orbit-catalog .library-orbit-sector {
  fill: color-mix(in srgb, var(--user-color, var(--profile-secondary)) 13%, var(--surface) 87%);
}
.library-orbit-catalog-label {
  font-size: 6.5px;
  letter-spacing: 0.08em;
}
.library-orbit-catalog.is-available .library-orbit-sector,
.library-orbit-catalog.is-available .library-orbit-sector-outline,
.library-orbit-catalog.is-available .library-orbit-band,
.library-orbit-catalog.is-available .library-orbit-port {
  opacity: 0.48;
  stroke-dasharray: 3 2;
}
.library-orbit-catalog.is-downloaded .library-orbit-sector,
.library-orbit-catalog.is-downloaded .library-orbit-sector-outline,
.library-orbit-catalog.is-downloaded .library-orbit-band,
.library-orbit-catalog.is-downloaded .library-orbit-port,
.library-orbit-catalog.is-downloaded .library-orbit-label {
  opacity: 0.66;
}
.library-orbit-space.is-inactive .library-orbit-sector,
.library-orbit-space.is-inactive .library-orbit-sector-outline,
.library-orbit-space.is-inactive .library-orbit-band,
.library-orbit-space.is-inactive .library-orbit-port,
.library-orbit-space.is-inactive .library-orbit-label,
.library-orbit-space.is-inactive .library-orbit-mesh-cell {
  opacity: 0.58;
}
.library-orbit-node.is-demo {
  opacity: 0.78;
}
.library-orbit-port {
  fill: var(--surface);
  stroke: var(--ui-frame);
  stroke-linejoin: round;
  stroke-width: 1;
}
.library-orbit-port.is-connected {
  fill: var(--fg);
  stroke: var(--ui-frame-strong);
}
.library-orbit-mesh {
  pointer-events: none;
}
.library-orbit-mesh-cell {
  --mesh-category: var(--ui-frame-strong);
  fill-opacity: 1;
  stroke: color-mix(in srgb, var(--mesh-category) 38%, var(--ui-frame) 62%);
  stroke-linejoin: round;
  stroke-width: 0.8;
  vector-effect: non-scaling-stroke;
}
.library-orbit-catalog.is-available .library-orbit-mesh-cell {
  fill-opacity: 0.52;
  stroke-dasharray: 2 2;
}
.library-orbit-catalog.is-downloaded .library-orbit-mesh-cell {
  fill-opacity: 0.78;
}
.library-orbit-wire {
  fill: none;
  pointer-events: none;
  stroke-linecap: round;
}
.library-orbit-wire.is-active {
  animation: library-wire-breathe 2.8s ease-in-out infinite;
  stroke: var(--ui-frame-strong);
  stroke-width: 1.15;
}
.library-orbit-wire.is-dormant {
  opacity: 0.28;
  stroke: var(--fg-muted);
  stroke-dasharray: 2 3;
  stroke-width: 0.9;
}
.library-orbit-engine {
  --library-orbit-engine-radius: 8px;
  cursor: pointer;
  outline: none;
}
.library-orbit-engine:focus-visible circle:first-child,
.library-orbit-engine:hover circle:first-child {
  stroke: var(--ui-frame-strong);
  stroke-width: 1.4;
}
.library-orbit-engine circle:first-child {
  fill: var(--surface);
  r: var(--library-orbit-engine-radius);
  stroke: var(--ui-frame);
  stroke-width: 1;
}
.library-orbit-engine circle:nth-child(2) {
  fill: var(--surface);
  r: calc(var(--library-orbit-engine-radius) - var(--ui-frame-gap));
  stroke: var(--ui-frame);
  stroke-width: 1;
}
.library-orbit-dock {
  --profile-gap: var(--ui-frame-gap);
  --profile-pad: var(--ui-frame-pad);
  align-self: start;
  grid-column: 1;
  grid-row: 1;
  max-height: calc(100vh - var(--nav-clearance) - 2rem);
  overflow: auto;
  width: 100%;
}
.library-orbit-panel[hidden] {
  display: none !important;
}
/* Un panneau n'est plus un cadre : il empile des blocs qui portent chacun le
   leur, un bandeau par bloc, avec l'ecart de panneau du reste du site. */
.library-orbit-panel {
  display: grid;
  gap: var(--ui-panel-gap);
}
.library-orbit-panel .admin-panel-body {
  display: grid;
  gap: var(--ui-frame-gap);
}
/* Texte explicatif du rail : même cadre que les blocs de lecture du site,
   réglé sur la typographie des lignes de liste voisines. */
.library-orbit-panel .about-text-body {
  font-size: var(--ui-list-row-font-size);
  line-height: var(--ui-list-row-line-height);
}
.library-orbit-compact-form {
  border: 0;
  padding: 0;
}
/* L'action d'un panneau reste une ligne du rail : elle garde l'écart de cadre
   commun et ne réintroduit pas la marge des pieds de formulaire. */
.library-orbit-panel .form-actions.library-orbit-state-form {
  margin-top: 0;
}
.library-orbit-state-form button {
  width: 100%;
}
.library-orbit-index-link {
  color: var(--fg);
  cursor: pointer;
  font: inherit;
  text-align: left;
  width: 100%;
}
.library-orbit-index-link.is-selected {
  background: var(--ui-side-grad);
  color: var(--fg);
}
@media (max-width: 1180px) {
  .library-orbit-stage {
    grid-template-columns: var(--side-rail-width) minmax(0, 1fr);
    justify-content: stretch;
  }
}
@media (max-width: 620px) {
  .space-orbit-page {
    padding-inline: 0.85rem;
  }
  .library-orbit-stage {
    grid-template-columns: minmax(0, 1fr);
  }
  .library-orbit-dock,
  .library-orbit-map {
    grid-column: 1;
    max-height: none;
    overflow: visible;
    position: static;
  }
  .library-orbit-dock { grid-row: 1; }
  .library-orbit-map {
    grid-row: 2;
    min-height: 0;
  }
}
@keyframes library-orbit-drift {
  0%, 100% { transform: rotate(-0.7deg); }
  50% { transform: rotate(0.7deg); }
}
@keyframes library-wire-breathe {
  0%, 100% {
    opacity: 0.62;
    stroke-width: 0.9;
  }
  50% {
    opacity: 1;
    stroke-width: 1.3;
  }
}
@media (prefers-reduced-motion: reduce) {
  .library-orbit-assembly,
  .library-orbit-wire.is-active {
    animation: none;
  }
}
.refs-filter {
  align-self: start;
  border: 1px solid var(--ui-frame);
  background: rgba(var(--surface-rgb), 0.86);
  padding: var(--ui-frame-pad);
  margin-top: 0;
  box-shadow: 0 16px 44px rgba(var(--shadow-rgb), 0.055);
}
.refs-filter > span {
  display: block;
  border: 1px solid var(--ui-frame);
  background:
    linear-gradient(90deg, var(--ui-frame-soft) 0%, rgba(var(--surface-rgb), 0.74) 100%);
  color: var(--fg);
  font-size: 0.66rem;
  letter-spacing: 0.12em;
  line-height: 1.15;
  margin-bottom: var(--ui-frame-gap);
  padding: var(--ui-band-pad);
  text-transform: uppercase;
}
.refs-filter form {
  display: grid;
  gap: var(--ui-frame-gap);
}
.refs-filter form > * {
  width: 100%;
}
.refs-filter button {
  width: 100%;
  text-align: center;
  border-color: var(--ui-frame);
  background: var(--ui-bg);
}
.library-sidebar .refs-filter button:hover {
  background: var(--ui-grad);
  border-color: var(--ui-frame-strong);
}
.refs-filter a {
  text-align: left;
  padding: 1px 0;
}
.refs-filter a {
  color: var(--fg-muted);
  font-size: 0.72rem;
  text-transform: uppercase;
  letter-spacing: 0.08em;
}
/* Sous-bloc du panneau de filtres : cadre secondaire. */
.refs-category-list {
  display: grid;
  gap: var(--ui-frame-gap);
  margin-top: 0;
  padding: var(--ui-frame-pad);
  border: 1px solid var(--ui-sub-frame);
  background: rgba(var(--surface-rgb), 0.56);
}
.refs-category-list a,
.refs-category-list button {
  display: flex;
  align-items: center;
  gap: 6px;
  color: var(--fg-soft);
  font-size: var(--ui-list-row-font-size);
  height: var(--ui-list-row-height);
  min-height: var(--ui-list-row-height);
  line-height: var(--ui-list-row-line-height);
  letter-spacing: 0;
  padding: var(--ui-list-row-pad);
  text-align: left;
  text-transform: none;
}
/* Une entrée de liste qui déclenche une action reste la même ligne compacte :
   le bouton ne porte ni cadre ni fond propre. */
.refs-category-list button {
  width: 100%;
  border: 0;
  background: transparent;
}
.refs-category-list a::before {
  content: "";
  flex: 0 0 auto;
  width: 7px;
  height: 7px;
  background: var(--cat-color, transparent);
  box-shadow: var(--cat-color) 0 0 0 0.5px inset;
  opacity: 0.9;
}
/* La puce « Tous » n'a pas de couleur : pas de pastille visible. */
.refs-category-list a:not([style])::before { box-shadow: none; }
.refs-category-list a:hover,
.refs-category-list a.active,
.refs-category-list button:hover,
.refs-category-list button:focus-visible {
  color: var(--fg);
  background: var(--ui-side-grad);
  outline: 0;
}
.filter-reset {
  display: block;
  margin-top: -4px;
  padding: 2px 3px;
  color: var(--fg-muted);
  font-size: 0.72rem;
  letter-spacing: 0.08em;
  line-height: 1.25;
  text-align: center;
  text-transform: uppercase;
}
.refs-filter .filter-reset {
  text-align: center;
}
.library-filter-reset {
  margin-top: -2px;
}
.filter-reset:hover {
  color: var(--fg);
  background: var(--ui-side-grad);
}
.index-side-list {
  position: sticky;
  top: var(--sticky-clearance);
  align-self: start;
  display: grid;
  gap: var(--ui-frame-gap);
  max-height: calc(100vh - var(--sticky-clearance) - 24px);
  overflow: auto;
  padding: 1px 0 12px;
  scrollbar-width: none;
  margin-top: 0;
  min-width: 0;
}
.index-side-list::-webkit-scrollbar {
  display: none;
}
.index-side-list a {
  display: block;
  color: var(--fg-soft);
  font-size: 0.74rem;
  line-height: 1.25;
  padding: 2px 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.index-side-list a:hover,
.index-side-list a.active {
  color: var(--fg);
  background: var(--ui-side-grad);
}

.ref-detail {
  max-width: none;
  width: min(var(--content-rail-width), calc(100vw - 2rem));
  margin: var(--nav-clearance) auto 4rem;
  padding: var(--ui-frame-pad);
}
.ref-detail header {
  display: grid;
  column-gap: 12px;
  row-gap: 2px;
  margin-bottom: 0;
  padding: var(--ui-band-pad);
  position: relative;
}
.ref-detail h1 {
  font-size: 1.32rem;
  line-height: 1.12;
  margin: 0;
}
.ref-detail-text {
  border-top: 1px solid var(--detail-frame);
  line-height: 1.45;
  margin: -5px -3px 0;
  padding: 6px 8px;
  font-size: 0.84rem;
}
.ref-media-stack {
  display: grid;
  gap: 8px;
}
.ref-media-stack img {
  width: 100%;
  display: block;
  border: 1px solid var(--detail-frame);
  background: rgba(var(--surface-rgb), 0.92);
  padding: 2px;
}

.edit-page {
  display: grid;
  grid-template-columns: minmax(0, min(var(--content-rail-width), calc(100vw - 2rem)));
  justify-content: center;
  align-items: flex-start;
  padding: var(--nav-clearance) 1rem 4rem;
}
.edit-panel {
  width: 100%;
}
.edit-switcher {
  width: var(--side-rail-width);
  display: grid;
  gap: var(--ui-frame-gap);
  position: sticky;
  top: var(--sticky-clearance);
  grid-column: 1;
  grid-row: 1;
  justify-self: start;
  transform: translateX(calc(-100% - var(--layout-rail-gap)));
  border: 1px solid var(--ui-frame);
  background: rgba(var(--surface-rgb), 0.86);
  padding: var(--ui-frame-pad);
}
.edit-switcher + .edit-panel {
  grid-column: 1;
  grid-row: 1;
}
.edit-switcher a {
  align-items: center;
  border: 1px solid var(--area-btn-border);
  background: var(--surface);
  color: var(--fg-muted);
  display: flex;
  font-size: 0.66rem;
  letter-spacing: 0.08em;
  height: var(--ui-list-row-height);
  line-height: var(--ui-list-row-line-height);
  padding: var(--ui-list-row-pad);
  text-transform: uppercase;
}
.edit-switcher a.active {
  background: var(--area-btn-grad);
  color: var(--fg);
  border-color: var(--area-btn-grad-hi);
}
.edit-switcher a:hover {
  border-color: var(--fg);
  color: var(--fg);
}
.edit-switcher a.active:hover {
  border-color: var(--area-btn-grad-hi);
}
.contribution-switcher {
  border-color: var(--user-color, var(--ui-frame));
  background: color-mix(in srgb, var(--user-color, var(--ui-frame)) 12%, rgba(var(--surface-rgb), 0.86));
}
.contribution-switcher a {
  border-color: var(--profile-primary);
}
.contribution-switcher a:hover,
.contribution-switcher a.active {
  background: var(--profile-grad);
  border-color: var(--profile-primary);
  color: var(--fg);
}
.contribution-page[data-category-accent-active="true"] {
  --area-btn-bg: color-mix(in srgb, var(--category-accent) 18%, var(--surface) 82%);
  --area-btn-border: var(--category-accent);
  --area-btn-grad: linear-gradient(
    90deg,
    color-mix(in srgb, var(--category-accent) 30%, var(--surface) 70%) 0%,
    color-mix(in srgb, var(--category-accent) 12%, var(--surface) 88%) 100%
  );
  --area-btn-grad-hi: color-mix(in srgb, var(--category-accent) 74%, var(--fg) 26%);
  --area-submit-bg: color-mix(in srgb, var(--category-accent) 20%, var(--surface) 80%);
  --area-submit-border: var(--category-accent);
  --area-submit-grad: linear-gradient(
    90deg,
    color-mix(in srgb, var(--category-accent) 34%, var(--surface) 66%) 0%,
    color-mix(in srgb, var(--category-accent) 14%, var(--surface) 86%) 100%
  );
  --area-side-grad: linear-gradient(
    90deg,
    color-mix(in srgb, var(--category-accent) 28%, transparent) 0%,
    color-mix(in srgb, var(--category-accent) 9%, transparent) 60%,
    transparent 100%
  );
  --area-frame: var(--category-accent);
  --area-frame-soft: color-mix(in srgb, var(--category-accent) 18%, transparent);
}
.contribution-page[data-category-accent-active="true"] .contribution-switcher a.is-reference-kind.active,
.contribution-page[data-category-accent-active="true"] .contribution-switcher a.is-reference-kind.active:hover {
  background: var(--profile-grad);
  border-color: var(--profile-primary);
}
.contribution-page:not(.has-contribution-selection) {
  min-height: 42vh;
}
.contribution-page.has-contribution-selection .edit-panel {
  grid-column: 1;
  grid-row: 1;
}
.edit-panel-head {
  display: flex;
  justify-content: space-between;
  gap: 1rem;
  align-items: start;
  margin-bottom: 16px;
}
.edit-panel textarea {
  resize: vertical;
}
.form-actions {
  display: flex;
  justify-content: flex-end;
  gap: 5px;
  margin-top: 4px;
}
.form-actions .danger {
  background: transparent;
  border-color: var(--danger);
  color: var(--danger);
}
.form-actions .danger:hover {
  background: var(--danger-soft);
  border-color: var(--danger);
  color: var(--danger);
}
