/*
 * Virelia ecosystem hub
 * VIRELIA_ECOSYSTEM_HUB_V1
 */

.ecosystem-section,
.ecosystem-section * {
  box-sizing: border-box;
}

.ecosystem-section {
  width: min(1440px, calc(100% - 32px));
  margin: clamp(54px, 8vw, 110px) auto;
}

.ecosystem-sr-only {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: -1px;
  padding: 0;
  overflow: hidden;
  clip: rect(0 0 0 0);
  white-space: nowrap;
  border: 0;
}

.orbit-map {
  --mouse-x: 50%;
  --mouse-y: 50%;
  --core-x: 0px;
  --core-y: 0px;

  position: relative;
  isolation: isolate;

  width: 100%;
  min-height: 760px;

  overflow: hidden;

  border: 1px solid rgba(157, 210, 245, 0.11);
  border-radius: 38px;

  background:
    radial-gradient(
      circle at var(--mouse-x) var(--mouse-y),
      rgba(64, 177, 235, 0.11),
      transparent 27%
    ),
    radial-gradient(
      circle at 49% 48%,
      rgba(17, 105, 166, 0.20),
      transparent 25%
    ),
    radial-gradient(
      circle at 50% 50%,
      #06142f 0,
      #020a1d 45%,
      #010615 78%,
      #01040f 100%
    );

  box-shadow:
    inset 0 1px 0 rgba(255,255,255,.045),
    0 36px 100px rgba(0, 4, 18, .20);

  color: #edf8ff;
}

.orbit-map::before {
  content: "";

  position: absolute;
  inset: 0;
  z-index: -2;

  pointer-events: none;

  opacity: .72;

  background-image:
    radial-gradient(
      circle at 8% 19%,
      rgba(183, 235, 255, .8) 0 1px,
      transparent 1.8px
    ),
    radial-gradient(
      circle at 16% 74%,
      rgba(137, 218, 255, .7) 0 1.2px,
      transparent 2px
    ),
    radial-gradient(
      circle at 24% 31%,
      rgba(207, 244, 255, .7) 0 1px,
      transparent 1.8px
    ),
    radial-gradient(
      circle at 39% 13%,
      rgba(142, 218, 255, .6) 0 1px,
      transparent 1.8px
    ),
    radial-gradient(
      circle at 47% 82%,
      rgba(211, 246, 255, .9) 0 1px,
      transparent 2px
    ),
    radial-gradient(
      circle at 62% 24%,
      rgba(126, 216, 255, .65) 0 1px,
      transparent 2px
    ),
    radial-gradient(
      circle at 70% 68%,
      rgba(205, 246, 255, .72) 0 1px,
      transparent 2px
    ),
    radial-gradient(
      circle at 78% 16%,
      rgba(179, 233, 255, .8) 0 1.2px,
      transparent 2px
    ),
    radial-gradient(
      circle at 88% 57%,
      rgba(101, 205, 255, .7) 0 1px,
      transparent 2px
    ),
    radial-gradient(
      circle at 93% 30%,
      rgba(206, 245, 255, .9) 0 1.1px,
      transparent 2px
    );
}

.orbit-map::after {
  content: "";

  position: absolute;
  inset: -18%;
  z-index: -1;

  pointer-events: none;

  background:
    radial-gradient(
      ellipse at center,
      transparent 54%,
      rgba(39, 137, 196, .08) 55%,
      transparent 55.6%
    );

  transform: rotate(-13deg);
}


.ecosystem-hint {
  position: absolute;
  top: 30px;
  left: 34px;
  z-index: 5;

  margin: 0;

  color: rgba(197, 228, 247, .53);

  font-size: .72rem;
  font-weight: 650;
  line-height: 1;
  letter-spacing: .16em;
  text-transform: uppercase;
}


.ecosystem-orbit {
  position: absolute;
  z-index: 0;

  pointer-events: none;

  border: 1px solid rgba(119, 205, 247, .17);
  border-radius: 50%;
}

.orbit-one {
  width: 82%;
  height: 48%;

  top: 26%;
  left: 9%;

  transform: rotate(8deg);
}

.orbit-two {
  width: 72%;
  height: 67%;

  top: 14%;
  left: 14%;

  border-style: dashed;
  border-color: rgba(113, 198, 242, .12);

  transform: rotate(-18deg);
}

.orbit-three {
  width: 54%;
  height: 76%;

  top: 9%;
  left: 23%;

  border-color: rgba(115, 204, 250, .105);

  transform: rotate(38deg);
}

.orbit-four {
  width: 66%;
  height: 55%;

  top: 21%;
  left: 17%;

  border-style: dotted;
  border-color: rgba(96, 187, 235, .12);

  transform: rotate(-42deg);
}


.ecosystem-core {
  position: absolute;
  top: 51%;
  left: 50%;
  z-index: 3;

  display: flex;
  flex-direction: column;
  align-items: center;

  width: 240px;

  color: #f1f8fd;
  text-decoration: none;

  transform:
    translate(
      calc(-50% + var(--core-x)),
      calc(-50% + var(--core-y))
    );

  transition:
    transform .18s ease,
    filter .25s ease;
}

.ecosystem-core:hover,
.ecosystem-core:focus-visible {
  filter:
    drop-shadow(
      0 0 17px rgba(113, 213, 255, .17)
    );
}

.ecosystem-core:focus-visible {
  outline: none;
}

.ecosystem-core img {
  position: relative;
  z-index: 2;

  width: 105px;
  height: auto;

  margin-bottom: 14px;

  object-fit: contain;

  filter:
    drop-shadow(
      0 0 16px rgba(109, 211, 255, .14)
    );
}

.ecosystem-core strong {
  position: relative;
  z-index: 2;

  color: #f3f7fb;

  font-family:
    Georgia,
    "Times New Roman",
    serif;

  font-size: clamp(2rem, 3.4vw, 3.25rem);
  font-weight: 400;

  line-height: 1;

  letter-spacing: .22em;

  text-indent: .22em;

  text-shadow:
    0 2px 18px rgba(0, 0, 0, .6);
}

.ecosystem-core > span:not(.core-halo) {
  position: relative;
  z-index: 2;

  margin-top: 13px;

  color: rgba(190, 218, 237, .48);

  font-size: .82rem;
  font-weight: 500;

  letter-spacing: .22em;
}

.core-halo {
  position: absolute;
  top: 29%;
  left: 50%;
  z-index: 0;

  width: 310px;
  height: 310px;

  border: 1px solid rgba(83, 183, 234, .11);
  border-radius: 50%;

  transform: translate(-50%, -50%);

  box-shadow:
    0 0 80px rgba(24, 131, 197, .07),
    inset 0 0 65px rgba(39, 153, 219, .045);
}

.core-halo::before,
.core-halo::after {
  content: "";

  position: absolute;

  border: 1px solid rgba(93, 188, 237, .08);
  border-radius: 50%;
}

.core-halo::before {
  inset: -36px;
}

.core-halo::after {
  inset: 36px;
}


.portal-node {
  --x: 50%;
  --y: 50%;

  position: absolute;
  top: var(--y);
  left: var(--x);
  z-index: 6;

  display: flex;
  align-items: center;
  gap: 12px;

  color: rgba(229, 242, 250, .72);

  font-size: .82rem;
  font-weight: 520;
  line-height: 1.25;

  text-decoration: none;

  transform: translate(-50%, -50%);

  transition:
    color .25s ease,
    filter .25s ease;
}

.portal-news {
  --x: 29%;
  --y: 20%;
}

.portal-canon {
  --x: 14%;
  --y: 52%;
}

.portal-citizenship {
  --x: 82%;
  --y: 43%;
}

.portal-rates {
  --x: 34%;
  --y: 79%;
}

.portal-challenge {
  --x: 72%;
  --y: 82%;
}


.portal-dot {
  position: relative;

  display: block;
  flex: 0 0 auto;

  width: 11px;
  height: 11px;

  border: 2px solid rgba(223, 248, 255, .92);
  border-radius: 50%;

  background: #e9fbff;

  box-shadow:
    0 0 7px rgba(176, 236, 255, .9),
    0 0 20px rgba(74, 190, 244, .62),
    0 0 40px rgba(35, 144, 209, .35);

  transition:
    transform .25s cubic-bezier(.2,.8,.2,1),
    box-shadow .25s ease;
}

.portal-dot::before,
.portal-dot::after {
  content: "";

  position: absolute;
  top: 50%;
  left: 50%;

  border: 1px solid rgba(119, 211, 255, .24);
  border-radius: 50%;

  transform: translate(-50%, -50%);
}

.portal-dot::before {
  width: 31px;
  height: 31px;
}

.portal-dot::after {
  width: 49px;
  height: 49px;

  border-color: rgba(116, 205, 250, .085);
}


.portal-label {
  display: block;

  max-width: 190px;

  overflow-wrap: anywhere;

  text-shadow:
    0 2px 10px rgba(0, 0, 0, .92);

  transition:
    transform .25s ease;
}


.portal-node:hover,
.portal-node:focus-visible {
  z-index: 20;

  color: #ffffff;

  outline: none;

  filter:
    drop-shadow(
      0 0 12px rgba(97, 201, 253, .15)
    );
}

.portal-node:hover .portal-dot,
.portal-node:focus-visible .portal-dot {
  transform: scale(1.28);

  box-shadow:
    0 0 8px rgba(225, 250, 255, 1),
    0 0 25px rgba(94, 214, 255, .85),
    0 0 58px rgba(44, 162, 224, .42);
}

.portal-node:hover .portal-label,
.portal-node:focus-visible .portal-label {
  transform: translateX(2px);
}


.portal-card {
  position: absolute;

  width: 270px;

  padding: 17px 18px;

  border: 1px solid rgba(125, 202, 244, .27);
  border-radius: 15px;

  background:
    linear-gradient(
      135deg,
      rgba(10, 32, 65, .94),
      rgba(3, 14, 36, .92)
    );

  box-shadow:
    0 18px 55px rgba(0, 3, 16, .50),
    inset 0 1px 0 rgba(255,255,255,.055);

  opacity: 0;

  pointer-events: none;

  backdrop-filter: blur(16px);

  transition:
    opacity .18s ease,
    transform .22s cubic-bezier(.2,.8,.2,1);

  text-align: left;
}

.portal-card strong,
.portal-card span,
.portal-card em {
  display: block;
}

.portal-card strong {
  margin-bottom: 5px;

  color: #f5fbff;

  font-size: .98rem;
  font-weight: 650;
}

.portal-card > span {
  color: rgba(206, 228, 241, .69);

  font-size: .8rem;
  font-weight: 450;
  line-height: 1.45;
}

.portal-card em {
  margin-top: 11px;

  color: rgba(147, 220, 255, .86);

  font-size: .71rem;
  font-style: normal;
  font-weight: 650;

  letter-spacing: .035em;
}


.card-right .portal-card {
  top: 50%;
  left: 31px;

  transform:
    translate(10px, -50%)
    scale(.97);
}

.card-left .portal-card {
  top: 50%;
  right: 31px;

  transform:
    translate(-10px, -50%)
    scale(.97);
}

.card-up .portal-card {
  bottom: 31px;
  left: 50%;

  transform:
    translate(-50%, 10px)
    scale(.97);
}


.portal-node:hover .portal-card,
.portal-node:focus-visible .portal-card {
  opacity: 1;
}

.portal-node.card-right:hover .portal-card,
.portal-node.card-right:focus-visible .portal-card {
  transform:
    translate(0, -50%)
    scale(1);
}

.portal-node.card-left:hover .portal-card,
.portal-node.card-left:focus-visible .portal-card {
  transform:
    translate(0, -50%)
    scale(1);
}

.portal-node.card-up:hover .portal-card,
.portal-node.card-up:focus-visible .portal-card {
  transform:
    translate(-50%, 0)
    scale(1);
}


/* slow ambient motion */

@keyframes ecosystem-pulse {
  0%,
  100% {
    opacity: .72;
  }

  50% {
    opacity: 1;
  }
}

.portal-news .portal-dot {
  animation:
    ecosystem-pulse 4.8s ease-in-out infinite;
}

.portal-canon .portal-dot {
  animation:
    ecosystem-pulse 5.7s ease-in-out -1.4s infinite;
}

.portal-citizenship .portal-dot {
  animation:
    ecosystem-pulse 5.1s ease-in-out -2.8s infinite;
}

.portal-rates .portal-dot {
  animation:
    ecosystem-pulse 6.2s ease-in-out -1.9s infinite;
}

.portal-challenge .portal-dot {
  animation:
    ecosystem-pulse 4.9s ease-in-out -3.4s infinite;
}


@media (max-width: 900px) {
  .ecosystem-section {
    width: min(100% - 20px, 900px);

    margin-top: 62px;
    margin-bottom: 62px;
  }

  .orbit-map {
    min-height: 690px;

    border-radius: 28px;
  }

  .ecosystem-hint {
    top: 23px;
    left: 24px;

    font-size: .66rem;
  }

  .ecosystem-core {
    top: 50%;

    width: 190px;
  }

  .ecosystem-core img {
    width: 82px;
  }

  .ecosystem-core strong {
    font-size: 2rem;
  }

  .core-halo {
    width: 245px;
    height: 245px;
  }

  .portal-label {
    max-width: 150px;

    font-size: .72rem;
  }

  .portal-card {
    width: 230px;
  }
}


@media (max-width: 620px) {
  .orbit-map {
    min-height: 650px;
  }

  .ecosystem-core {
    top: 49%;
  }

  .ecosystem-core img {
    width: 72px;
  }

  .ecosystem-core strong {
    font-size: 1.65rem;
  }

  .ecosystem-core > span:not(.core-halo) {
    font-size: .67rem;
  }

  .core-halo {
    width: 208px;
    height: 208px;
  }

  .portal-news {
    --x: 50%;
    --y: 17%;
  }

  .portal-canon {
    --x: 21%;
    --y: 38%;
  }

  .portal-citizenship {
    --x: 79%;
    --y: 38%;
  }

  .portal-rates {
    --x: 24%;
    --y: 73%;
  }

  .portal-challenge {
    --x: 76%;
    --y: 74%;
  }

  .portal-node {
    flex-direction: column;
    gap: 9px;

    text-align: center;
  }

  .portal-label {
    max-width: 126px;

    font-size: .66rem;
    line-height: 1.25;
  }

  .portal-dot {
    width: 10px;
    height: 10px;
  }

  .orbit-one {
    width: 105%;
    height: 47%;

    left: -2.5%;
    top: 25%;
  }

  .orbit-two {
    width: 85%;
    height: 73%;

    left: 7.5%;
  }

  .orbit-three {
    width: 62%;
    height: 82%;

    left: 19%;
  }

  .orbit-four {
    width: 88%;
    left: 6%;
  }
}


@media (hover: none) {
  .portal-card {
    display: none;
  }

  .portal-node:hover .portal-dot {
    transform: none;
  }
}


@media (prefers-reduced-motion: reduce) {
  .portal-dot {
    animation: none !important;
  }

  .portal-node,
  .portal-dot,
  .portal-label,
  .portal-card,
  .ecosystem-core {
    transition: none !important;
  }
}

/* Ecosystem hub hotfix 20260815-2 */

.portal-card em {
  display: none !important;
}

.portal-card {
  padding-bottom: 17px;
}
