import {vlElement, define} from '/node_modules/vl-ui-core/dist/vl-core.js';

/**
 * VlLoader
 * @class
 * @classdesc De loader component is een animatie dat aangeeft dat een pagina of website aan het laden is.
 *
 * @extends HTMLElement
 * @mixes vlElement
 *
 * @property {boolean} data-vl-light - Attribuut wordt gebruikt om een alternatieve rendering te bekomen in combinatie met een donkere achtergrond.
 * @property {boolean} data-vl-text - Attribuut wordt gebruikt om een informatieve tekst te tonen tijdens het laden.
 * @property {boolean} data-vl-single - Attribuut wordt gebruikt om aan te geven dat er geen tekst getoond mag worden.
 *
 * @see {@link https://www.github.com/milieuinfo/webcomponent-vl-ui-loader/releases/latest|Release notes}
 * @see {@link https://www.github.com/milieuinfo/webcomponent-vl-ui-loader/issues|Issues}
 * @see {@link https://webcomponenten.omgeving.vlaanderen.be/demo/vl-loader.html|Demo}
 *
 */
export class VlLoader extends vlElement(HTMLElement) {
  static get _observedAttributes() {
    return ['light', 'text', 'single'];
  }

  constructor() {
    super(`
      <style>
        @import '/src/style.css';
      </style>
      <div class="vl-u-align-center">
        <div class="vl-loader" role="alert" aria-busy="true"></div>
        <p id="text">
          <slot>
            Pagina is aan het laden
          </slot>
        </p>
      </div>
    `);
  }

  get _loader() {
    return this._shadow.querySelector('.vl-loader');
  }

  get _text() {
    return this._shadow.querySelector('#text');
  }

  _lightChangedCallback(oldValue, newValue) {
    this._toggleClass(this._loader, newValue, 'vl-loader--light');
  }

  _textChangedCallback(oldValue, newValue) {
    this._text.innerText = newValue;
  }

  _singleChangedCallback(oldValue, newValue) {
    this._toggleClass(this._text, newValue, 'vl-u-visually-hidden');
  }
}

define('vl-loader', VlLoader);