import { Controller } from 'stimulus' /* * Al navegar por el sitio y llegar a ciertas secciones, se van * activando ítems del menú. * * Para eso configuramos un IntersectionObserver en todo el documento y * a medida que van apareciendo secciones actualizamos el menú. */ export default class extends Controller { static targets = [ 'section' ] connect () { for (const section of this.sectionTargets) { this.observer.observe(section) } } /* * Solo nos interesa la primera */ get observer () { if (!this._observer) this._observer = new IntersectionObserver((entries, observer) => this.update(entries), this.options) return this._observer } get options () { if (!this._options) this._options = { threshold: 0, rootMargin: '0px' } return this._options } update (entries) { const section = entries.find(x => x.isIntersecting) if (!section) return window.dispatchEvent(new CustomEvent('scroll:section', { detail: { id: section.target.id }})) } }