{"version":3,"file":"filter-toggle-button.mjs","sources":["../../../../src/moj/components/filter-toggle-button/filter-toggle-button.mjs"],"sourcesContent":["import { ConfigurableComponent } from 'govuk-frontend'\n\n/**\n * @augments {ConfigurableComponent<FilterToggleButtonConfig>}\n */\nexport class FilterToggleButton extends ConfigurableComponent {\n  /**\n   * @param {Element | null} $root - HTML element to use for filter toggle button\n   * @param {FilterToggleButtonConfig} [config] - Filter toggle button config\n   */\n  constructor($root, config = {}) {\n    super($root, config)\n\n    const $toggleButtonContainer =\n      this.config.toggleButtonContainer.element ??\n      document.querySelector(this.config.toggleButtonContainer.selector)\n\n    const $closeButtonContainer =\n      this.config.closeButtonContainer.element ??\n      this.$root.querySelector(this.config.closeButtonContainer.selector)\n\n    if (\n      !(\n        $toggleButtonContainer instanceof HTMLElement &&\n        $closeButtonContainer instanceof HTMLElement\n      )\n    ) {\n      return this\n    }\n\n    this.$toggleButtonContainer = $toggleButtonContainer\n    this.$closeButtonContainer = $closeButtonContainer\n\n    this.createToggleButton()\n    this.setupResponsiveChecks()\n\n    this.$root.setAttribute('tabindex', '-1')\n\n    if (this.config.startHidden) {\n      this.hideMenu()\n    }\n  }\n\n  setupResponsiveChecks() {\n    this.mq = window.matchMedia(this.config.bigModeMediaQuery)\n    this.mq.addListener(this.checkMode.bind(this))\n    this.checkMode()\n  }\n\n  createToggleButton() {\n    this.$menuButton = document.createElement('button')\n    this.$menuButton.setAttribute('type', 'button')\n    this.$menuButton.setAttribute('aria-haspopup', 'true')\n    this.$menuButton.setAttribute('aria-expanded', 'false')\n\n    this.$menuButton.className = `govuk-button ${this.config.toggleButton.classes}`\n    this.$menuButton.textContent = this.config.toggleButton.showText\n\n    this.$menuButton.addEventListener(\n      'click',\n      this.onMenuButtonClick.bind(this)\n    )\n\n    this.$toggleButtonContainer.append(this.$menuButton)\n  }\n\n  checkMode() {\n    if (this.mq.matches) {\n      this.enableBigMode()\n    } else {\n      this.enableSmallMode()\n    }\n  }\n\n  enableBigMode() {\n    this.showMenu()\n    this.removeCloseButton()\n  }\n\n  enableSmallMode() {\n    this.hideMenu()\n    this.addCloseButton()\n  }\n\n  addCloseButton() {\n    this.$closeButton = document.createElement('button')\n    this.$closeButton.setAttribute('type', 'button')\n\n    this.$closeButton.className = this.config.closeButton.classes\n    this.$closeButton.textContent = this.config.closeButton.text\n\n    this.$closeButton.addEventListener('click', this.onCloseClick.bind(this))\n    this.$closeButtonContainer.append(this.$closeButton)\n  }\n\n  onCloseClick() {\n    this.hideMenu()\n    this.$menuButton.focus()\n  }\n\n  removeCloseButton() {\n    if (this.$closeButton) {\n      this.$closeButton.remove()\n      this.$closeButton = null\n    }\n  }\n\n  hideMenu() {\n    this.$menuButton.setAttribute('aria-expanded', 'false')\n    this.$root.classList.add('moj-js-hidden')\n    this.$menuButton.textContent = this.config.toggleButton.showText\n  }\n\n  showMenu() {\n    this.$menuButton.setAttribute('aria-expanded', 'true')\n    this.$root.classList.remove('moj-js-hidden')\n    this.$menuButton.textContent = this.config.toggleButton.hideText\n  }\n\n  onMenuButtonClick() {\n    this.toggle()\n  }\n\n  toggle() {\n    if (this.$menuButton.getAttribute('aria-expanded') === 'false') {\n      this.showMenu()\n      this.$root.focus()\n    } else {\n      this.hideMenu()\n    }\n  }\n\n  /**\n   * Name for the component used when initialising using data-module attributes.\n   */\n  static moduleName = 'moj-filter'\n\n  /**\n   * Filter toggle button config\n   *\n   * @type {FilterToggleButtonConfig}\n   */\n  static defaults = Object.freeze({\n    bigModeMediaQuery: '(min-width: 48.0625em)',\n    startHidden: true,\n    toggleButton: {\n      showText: 'Show filter',\n      hideText: 'Hide filter',\n      classes: 'govuk-button--secondary'\n    },\n    toggleButtonContainer: {\n      selector: '.moj-action-bar__filter'\n    },\n    closeButton: {\n      text: 'Close',\n      classes: 'moj-filter__close'\n    },\n    closeButtonContainer: {\n      selector: '.moj-filter__header-action'\n    }\n  })\n\n  /**\n   * Filter toggle button config schema\n   *\n   * @satisfies {Schema<FilterToggleButtonConfig>}\n   */\n  static schema = Object.freeze(\n    /** @type {const} */ ({\n      properties: {\n        bigModeMediaQuery: { type: 'string' },\n        startHidden: { type: 'boolean' },\n        toggleButton: { type: 'object' },\n        toggleButtonContainer: { type: 'object' },\n        closeButton: { type: 'object' },\n        closeButtonContainer: { type: 'object' }\n      }\n    })\n  )\n}\n\n/**\n * @typedef {object} FilterToggleButtonConfig\n * @property {string} [bigModeMediaQuery] - Media query for big mode\n * @property {boolean} [startHidden] - Whether to start hidden\n * @property {object} [toggleButton] - Toggle button config\n * @property {string} [toggleButton.showText] - Text for show button\n * @property {string} [toggleButton.hideText] - Text for hide button\n * @property {string} [toggleButton.classes] - Classes for toggle button\n * @property {object} [toggleButtonContainer] - Toggle button container config\n * @property {string} [toggleButtonContainer.selector] - Selector for toggle button container\n * @property {Element | null} [toggleButtonContainer.element] - HTML element for toggle button container\n * @property {object} [closeButton] - Close button config\n * @property {string} [closeButton.text] - Text for close button\n * @property {string} [closeButton.classes] - Classes for close button\n * @property {object} [closeButtonContainer] - Close button container config\n * @property {string} [closeButtonContainer.selector] - Selector for close button container\n * @property {Element | null} [closeButtonContainer.element] - HTML element for close button container\n */\n\n/**\n * @import { Schema } from 'govuk-frontend/dist/govuk/common/configuration.mjs'\n */\n"],"names":["FilterToggleButton","ConfigurableComponent","constructor","$root","config","_this$config$toggleBu","_this$config$closeBut","$toggleButtonContainer","toggleButtonContainer","element","document","querySelector","selector","$closeButtonContainer","closeButtonContainer","HTMLElement","createToggleButton","setupResponsiveChecks","setAttribute","startHidden","hideMenu","mq","window","matchMedia","bigModeMediaQuery","addListener","checkMode","bind","$menuButton","createElement","className","toggleButton","classes","textContent","showText","addEventListener","onMenuButtonClick","append","matches","enableBigMode","enableSmallMode","showMenu","removeCloseButton","addCloseButton","$closeButton","closeButton","text","onCloseClick","focus","remove","classList","add","hideText","toggle","getAttribute","moduleName","defaults","Object","freeze","schema","properties","type"],"mappings":"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"}