/* Zastávka cesty — jeden bod na zvislej osi postupu.
   Obal je bežný blok s triedou .ob-cesta; os aj striedanie strán si rieši
   samotný komponent, aby sa zastávky dali len pridavať a mazať v strome prvkov.
   Stranu určuje atribút data-strana, ktorý dopíše Component logic — nth-of-type
   by zlyhal, len čo builder zabalí inštanciu do vlastného obalu.

   Základný stav je vždy viditeľný. Skryje ho až trieda .ob-cesta--animuje, ktorú
   obalu pridá skript — v editore sa skript nedobehne, takže zastávky tam
   zostanú normálne vidno. */

.ob-cesta {
  position: relative;
  display: flex;
  flex-direction: column;
  gap: 64px;
  max-width: 980px;
  margin: 44px auto 0;
  text-align: left;
}

/* Os cesty. Vkladá ju Component logic a rovno jej dopočíta, kde začína prvá
   a končí posledná bodka — preto tu žiadne top ani bottom nie sú.
   Sivá vlasová linka spája body vždy; modrá výplň sa dokreslí scrollom. */
.ob-cesta__os {
  position: absolute;
  left: 50%;
  width: 1px;
  transform: translateX(-50%);
  background-color: var(--c-hairline-cool);
}

.ob-cesta__vypln {
  display: block;
  width: 100%;
  height: 100%;
  transform: scaleY(0);
  transform-origin: top;
  background-image: linear-gradient(180deg, var(--c-hairline-akcent), var(--c-delft));
}

/* Tlačidlo ako posledná zastávka — stojí presne na osi. */
.ob-cesta__cta {
  align-self: center;
  margin-top: 8px;
  transition:
    opacity .7s cubic-bezier(.16, .84, .28, 1),
    transform .7s cubic-bezier(.16, .84, .28, 1),
    background-position .55s var(--c-ease),
    color .3s var(--c-ease),
    border-color .3s var(--c-ease);
}

/* Builder zabalí každú inštanciu komponentu do vlastného obalu, takže
   položkou flexu je ten obal, nie samotné tlačidlo — zarovnanie patrí jemu. */
.ob-cesta > :has(.ob-cesta__cta) {
  align-self: center;
}

/* ---------- Samotná zastávka ---------- */

.ob-zastavka {
  --zastavka-label: var(--c-terracotta-deep, #a9542f);
  --zastavka-text: var(--c-slate);
  --zastavka-bodka: var(--c-delft);

  position: relative;
  display: grid;
  grid-template-columns: 1fr 17px 1fr;
  column-gap: 40px;
  align-items: start;
  transition:
    opacity .7s cubic-bezier(.16, .84, .28, 1),
    transform .7s cubic-bezier(.16, .84, .28, 1);
}

/* Skryté sú len dovtedy, kým na ne čitať nedoscrolluje. */
.ob-cesta--animuje .ob-zastavka:not(.je-vidno),
.ob-cesta--animuje .ob-cesta__cta:not(.je-vidno) {
  opacity: 0;
  transform: translateY(16px);
}

.ob-zastavka__bodka {
  grid-row: 1 / span 2;
  grid-column: 2;
  width: 17px;
  height: 17px;
  margin-top: 5px;
  border-radius: 50%;
  border: 1px solid var(--zastavka-bodka);
  background-color: var(--c-paper);
  transition:
    background-color .5s var(--c-ease),
    box-shadow .5s var(--c-ease);
}

/* Plná bodka so žiarou — rovnaký zápis ako guľočka scroll indikátora. */
.ob-zastavka--plna .ob-zastavka__bodka {
  background-color: var(--zastavka-bodka);
  box-shadow:
    0 0 0 4px color-mix(in oklab, var(--zastavka-bodka) 20%, transparent),
    0 0 16px 4px color-mix(in oklab, var(--zastavka-bodka) 45%, transparent);
}

/* Posledná bodka sa rozsvieti až vtedy, keď na ňu čitať naozaj príde. */
.ob-cesta--animuje .ob-zastavka--plna:not(.je-vidno) .ob-zastavka__bodka {
  background-color: var(--c-paper);
  box-shadow: none;
}

.ob-zastavka__label {
  display: block;
  padding-top: 3px;
  font-family: var(--c-font-mono);
  font-size: 13px;
  font-weight: 700;
  letter-spacing: .1em;
  text-transform: uppercase;
  color: var(--zastavka-label);
}

.ob-zastavka__text {
  margin: 12px 0 0;
  max-width: 34ch;
  font-size: 18px;
  line-height: 1.6;
  color: var(--zastavka-text);
  text-wrap: pretty;
}

.ob-zastavka__label:empty,
.ob-zastavka__text:empty {
  display: none;
}

/* Strana od osi. Pokiaľ skript ešte nedobehol (editor), platí trieda
   z vlastnosti Strana od osi a automatické zastávky stoja vpravo. */
.ob-zastavka[data-strana="vlavo"] .ob-zastavka__label,
.ob-zastavka[data-strana="vlavo"] .ob-zastavka__text,
.ob-zastavka--vlavo:not([data-strana]) .ob-zastavka__label,
.ob-zastavka--vlavo:not([data-strana]) .ob-zastavka__text {
  grid-column: 1;
  text-align: right;
  justify-self: end;
}

.ob-zastavka[data-strana="vpravo"] .ob-zastavka__label,
.ob-zastavka[data-strana="vpravo"] .ob-zastavka__text,
.ob-zastavka--auto:not([data-strana]) .ob-zastavka__label,
.ob-zastavka--auto:not([data-strana]) .ob-zastavka__text,
.ob-zastavka--vpravo:not([data-strana]) .ob-zastavka__label,
.ob-zastavka--vpravo:not([data-strana]) .ob-zastavka__text {
  grid-column: 3;
  text-align: left;
  justify-self: start;
}

/* Na úzkom displeji sa striedanie ruší — všetko ide napravo od osi. */
@media (max-width: 760px) {
  .ob-cesta {
    max-width: 560px;
    gap: 44px;
  }

  .ob-cesta__os {
    left: 8px;
  }

  .ob-cesta > :has(.ob-cesta__cta) {
    align-self: flex-start;
    margin-left: 47px;
  }

  .ob-cesta__cta {
    align-self: flex-start;
  }

  .ob-zastavka {
    grid-template-columns: auto 1fr;
    column-gap: 30px;
  }

  .ob-zastavka__bodka {
    grid-column: 1;
  }

  .ob-zastavka .ob-zastavka__label,
  .ob-zastavka .ob-zastavka__text {
    grid-column: 2;
    text-align: left;
    justify-self: start;
  }
}

@media (prefers-reduced-motion: reduce) {
  .ob-zastavka,
  .ob-cesta__cta,
  .ob-zastavka__bodka {
    transition: none;
  }
}