.char-reveal {
  --progress-slice: 0;
  --char-step: 0.008;
  --char-span: 0.055;
}

.char-reveal .word {
  display: inline-block;
  white-space: nowrap;
}

.char-reveal .word-space {
  display: inline-block;
  width: 0.22em;
}

.char-reveal .char {
  --char-index: 0;
  --kerning: 0px;
  margin-right: var(--kerning);

  --char-delay: calc(var(--char-index) * var(--char-step));
  --local-progress: calc((var(--progress-slice) - var(--char-delay)) / var(--char-span));
  --animation-wave: clamp(0, var(--local-progress), 1);

  display: inline-block;
  opacity: var(--animation-wave);
  filter: blur(calc((1 - var(--animation-wave)) * 0.09em));
  transform: scale(calc(2.25 - (1.25 * var(--animation-wave))));
  transform-origin: center center;
  will-change: transform, opacity, filter;
  backface-visibility: hidden;
}

.functionality-point {
  transform: translate(-50%, -50%);
}

.functionality-point .dot-pulse {
  animation: none;
}

@keyframes pulse-custom {
  0% {
    transform: scale(0.3);
    opacity: 1;
  }
  100% {
    transform: scale(1);
    opacity: 0;
  }
}

.functionality-point.is-active .dot-core {
  transform: scale(1.3);
  box-shadow: 0 0 0 8px rgba(255,255,255,0.18);
}

.functionality-point.is-active .dot-pulse {
  animation: none;
  opacity: 0.3;
  transform: scale(1);
}