govuk_publishing_components 55.0.1 → 55.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (167) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/govuk_publishing_components/components/file-upload.js +5 -0
  3. data/app/assets/stylesheets/govuk_publishing_components/components/_layout-super-navigation-header.scss +1 -0
  4. data/app/assets/stylesheets/govuk_publishing_components/components/_organisation-logo.scss +5 -2
  5. data/app/views/govuk_publishing_components/components/_file_upload.html.erb +13 -1
  6. data/app/views/govuk_publishing_components/components/_layout_super_navigation_header.html.erb +0 -1
  7. data/app/views/govuk_publishing_components/components/docs/file_upload.yml +6 -0
  8. data/app/views/govuk_publishing_components/components/feedback/_survey_signup_form.html.erb +1 -1
  9. data/lib/govuk_publishing_components/version.rb +1 -1
  10. data/node_modules/govuk-frontend/dist/govuk/all.bundle.js +313 -47
  11. data/node_modules/govuk-frontend/dist/govuk/all.bundle.js.map +1 -1
  12. data/node_modules/govuk-frontend/dist/govuk/all.bundle.mjs +312 -47
  13. data/node_modules/govuk-frontend/dist/govuk/all.bundle.mjs.map +1 -1
  14. data/node_modules/govuk-frontend/dist/govuk/all.mjs +2 -1
  15. data/node_modules/govuk-frontend/dist/govuk/all.mjs.map +1 -1
  16. data/node_modules/govuk-frontend/dist/govuk/common/configuration.mjs +21 -16
  17. data/node_modules/govuk-frontend/dist/govuk/common/configuration.mjs.map +1 -1
  18. data/node_modules/govuk-frontend/dist/govuk/common/govuk-frontend-version.mjs +1 -1
  19. data/node_modules/govuk-frontend/dist/govuk/common/index.mjs +3 -0
  20. data/node_modules/govuk-frontend/dist/govuk/common/index.mjs.map +1 -1
  21. data/node_modules/govuk-frontend/dist/govuk/{govuk-frontend-component.mjs → component.mjs} +5 -5
  22. data/node_modules/govuk-frontend/dist/govuk/component.mjs.map +1 -0
  23. data/node_modules/govuk-frontend/dist/govuk/components/accordion/accordion.bundle.js +27 -19
  24. data/node_modules/govuk-frontend/dist/govuk/components/accordion/accordion.bundle.js.map +1 -1
  25. data/node_modules/govuk-frontend/dist/govuk/components/accordion/accordion.bundle.mjs +27 -19
  26. data/node_modules/govuk-frontend/dist/govuk/components/accordion/accordion.bundle.mjs.map +1 -1
  27. data/node_modules/govuk-frontend/dist/govuk/components/accordion/accordion.mjs +1 -1
  28. data/node_modules/govuk-frontend/dist/govuk/components/accordion/accordion.mjs.map +1 -1
  29. data/node_modules/govuk-frontend/dist/govuk/components/button/button.bundle.js +27 -19
  30. data/node_modules/govuk-frontend/dist/govuk/components/button/button.bundle.js.map +1 -1
  31. data/node_modules/govuk-frontend/dist/govuk/components/button/button.bundle.mjs +27 -19
  32. data/node_modules/govuk-frontend/dist/govuk/components/button/button.bundle.mjs.map +1 -1
  33. data/node_modules/govuk-frontend/dist/govuk/components/button/button.mjs +1 -1
  34. data/node_modules/govuk-frontend/dist/govuk/components/button/button.mjs.map +1 -1
  35. data/node_modules/govuk-frontend/dist/govuk/components/button/macro-options.json +2 -1
  36. data/node_modules/govuk-frontend/dist/govuk/components/character-count/_index.scss +8 -0
  37. data/node_modules/govuk-frontend/dist/govuk/components/character-count/_index.scss.map +1 -1
  38. data/node_modules/govuk-frontend/dist/govuk/components/character-count/character-count.bundle.js +28 -20
  39. data/node_modules/govuk-frontend/dist/govuk/components/character-count/character-count.bundle.js.map +1 -1
  40. data/node_modules/govuk-frontend/dist/govuk/components/character-count/character-count.bundle.mjs +28 -20
  41. data/node_modules/govuk-frontend/dist/govuk/components/character-count/character-count.bundle.mjs.map +1 -1
  42. data/node_modules/govuk-frontend/dist/govuk/components/character-count/character-count.mjs +2 -2
  43. data/node_modules/govuk-frontend/dist/govuk/components/character-count/character-count.mjs.map +1 -1
  44. data/node_modules/govuk-frontend/dist/govuk/components/character-count/fixtures.json +16 -1
  45. data/node_modules/govuk-frontend/dist/govuk/components/character-count/macro-options.json +2 -2
  46. data/node_modules/govuk-frontend/dist/govuk/components/character-count/template.njk +5 -4
  47. data/node_modules/govuk-frontend/dist/govuk/components/checkboxes/checkboxes.bundle.js +8 -5
  48. data/node_modules/govuk-frontend/dist/govuk/components/checkboxes/checkboxes.bundle.js.map +1 -1
  49. data/node_modules/govuk-frontend/dist/govuk/components/checkboxes/checkboxes.bundle.mjs +8 -5
  50. data/node_modules/govuk-frontend/dist/govuk/components/checkboxes/checkboxes.bundle.mjs.map +1 -1
  51. data/node_modules/govuk-frontend/dist/govuk/components/checkboxes/checkboxes.mjs +2 -2
  52. data/node_modules/govuk-frontend/dist/govuk/components/checkboxes/checkboxes.mjs.map +1 -1
  53. data/node_modules/govuk-frontend/dist/govuk/components/error-summary/error-summary.bundle.js +27 -19
  54. data/node_modules/govuk-frontend/dist/govuk/components/error-summary/error-summary.bundle.js.map +1 -1
  55. data/node_modules/govuk-frontend/dist/govuk/components/error-summary/error-summary.bundle.mjs +27 -19
  56. data/node_modules/govuk-frontend/dist/govuk/components/error-summary/error-summary.bundle.mjs.map +1 -1
  57. data/node_modules/govuk-frontend/dist/govuk/components/error-summary/error-summary.mjs +1 -1
  58. data/node_modules/govuk-frontend/dist/govuk/components/error-summary/error-summary.mjs.map +1 -1
  59. data/node_modules/govuk-frontend/dist/govuk/components/exit-this-page/exit-this-page.bundle.js +27 -19
  60. data/node_modules/govuk-frontend/dist/govuk/components/exit-this-page/exit-this-page.bundle.js.map +1 -1
  61. data/node_modules/govuk-frontend/dist/govuk/components/exit-this-page/exit-this-page.bundle.mjs +27 -19
  62. data/node_modules/govuk-frontend/dist/govuk/components/exit-this-page/exit-this-page.bundle.mjs.map +1 -1
  63. data/node_modules/govuk-frontend/dist/govuk/components/exit-this-page/exit-this-page.mjs +1 -1
  64. data/node_modules/govuk-frontend/dist/govuk/components/exit-this-page/exit-this-page.mjs.map +1 -1
  65. data/node_modules/govuk-frontend/dist/govuk/components/file-upload/_index.scss +167 -0
  66. data/node_modules/govuk-frontend/dist/govuk/components/file-upload/_index.scss.map +1 -1
  67. data/node_modules/govuk-frontend/dist/govuk/components/file-upload/file-upload.bundle.js +754 -0
  68. data/node_modules/govuk-frontend/dist/govuk/components/file-upload/file-upload.bundle.js.map +1 -0
  69. data/node_modules/govuk-frontend/dist/govuk/components/file-upload/file-upload.bundle.mjs +746 -0
  70. data/node_modules/govuk-frontend/dist/govuk/components/file-upload/file-upload.bundle.mjs.map +1 -0
  71. data/node_modules/govuk-frontend/dist/govuk/components/file-upload/file-upload.mjs +267 -0
  72. data/node_modules/govuk-frontend/dist/govuk/components/file-upload/file-upload.mjs.map +1 -0
  73. data/node_modules/govuk-frontend/dist/govuk/components/file-upload/fixtures.json +207 -16
  74. data/node_modules/govuk-frontend/dist/govuk/components/file-upload/macro-options.json +52 -3
  75. data/node_modules/govuk-frontend/dist/govuk/components/file-upload/template-allows-direct-media-capture.html +6 -0
  76. data/node_modules/govuk-frontend/dist/govuk/components/file-upload/template-allows-image-files-only.html +6 -0
  77. data/node_modules/govuk-frontend/dist/govuk/components/file-upload/template-allows-multiple-files.html +6 -0
  78. data/node_modules/govuk-frontend/dist/govuk/components/file-upload/template-disabled.html +6 -0
  79. data/node_modules/govuk-frontend/dist/govuk/components/file-upload/template-enhanced-disabled.html +13 -0
  80. data/node_modules/govuk-frontend/dist/govuk/components/file-upload/template-enhanced-with-error-message-and-hint.html +16 -0
  81. data/node_modules/govuk-frontend/dist/govuk/components/file-upload/template-enhanced.html +10 -0
  82. data/node_modules/govuk-frontend/dist/govuk/components/file-upload/template-translated.html +10 -0
  83. data/node_modules/govuk-frontend/dist/govuk/components/file-upload/template.njk +42 -5
  84. data/node_modules/govuk-frontend/dist/govuk/components/header/_index.scss +14 -10
  85. data/node_modules/govuk-frontend/dist/govuk/components/header/_index.scss.map +1 -1
  86. data/node_modules/govuk-frontend/dist/govuk/components/header/header.bundle.js +8 -5
  87. data/node_modules/govuk-frontend/dist/govuk/components/header/header.bundle.js.map +1 -1
  88. data/node_modules/govuk-frontend/dist/govuk/components/header/header.bundle.mjs +8 -5
  89. data/node_modules/govuk-frontend/dist/govuk/components/header/header.bundle.mjs.map +1 -1
  90. data/node_modules/govuk-frontend/dist/govuk/components/header/header.mjs +2 -2
  91. data/node_modules/govuk-frontend/dist/govuk/components/header/header.mjs.map +1 -1
  92. data/node_modules/govuk-frontend/dist/govuk/components/header/macro-options.json +25 -12
  93. data/node_modules/govuk-frontend/dist/govuk/components/input/fixtures.json +16 -2
  94. data/node_modules/govuk-frontend/dist/govuk/components/input/macro-options.json +2 -2
  95. data/node_modules/govuk-frontend/dist/govuk/components/input/template-default.html +2 -2
  96. data/node_modules/govuk-frontend/dist/govuk/components/input/template.njk +5 -4
  97. data/node_modules/govuk-frontend/dist/govuk/components/notification-banner/notification-banner.bundle.js +27 -19
  98. data/node_modules/govuk-frontend/dist/govuk/components/notification-banner/notification-banner.bundle.js.map +1 -1
  99. data/node_modules/govuk-frontend/dist/govuk/components/notification-banner/notification-banner.bundle.mjs +27 -19
  100. data/node_modules/govuk-frontend/dist/govuk/components/notification-banner/notification-banner.bundle.mjs.map +1 -1
  101. data/node_modules/govuk-frontend/dist/govuk/components/notification-banner/notification-banner.mjs +1 -1
  102. data/node_modules/govuk-frontend/dist/govuk/components/notification-banner/notification-banner.mjs.map +1 -1
  103. data/node_modules/govuk-frontend/dist/govuk/components/password-input/fixtures.json +16 -2
  104. data/node_modules/govuk-frontend/dist/govuk/components/password-input/macro-options.json +2 -2
  105. data/node_modules/govuk-frontend/dist/govuk/components/password-input/password-input.bundle.js +27 -20
  106. data/node_modules/govuk-frontend/dist/govuk/components/password-input/password-input.bundle.js.map +1 -1
  107. data/node_modules/govuk-frontend/dist/govuk/components/password-input/password-input.bundle.mjs +27 -20
  108. data/node_modules/govuk-frontend/dist/govuk/components/password-input/password-input.bundle.mjs.map +1 -1
  109. data/node_modules/govuk-frontend/dist/govuk/components/password-input/password-input.mjs +1 -2
  110. data/node_modules/govuk-frontend/dist/govuk/components/password-input/password-input.mjs.map +1 -1
  111. data/node_modules/govuk-frontend/dist/govuk/components/password-input/template-default.html +3 -3
  112. data/node_modules/govuk-frontend/dist/govuk/components/password-input/template.njk +4 -2
  113. data/node_modules/govuk-frontend/dist/govuk/components/radios/radios.bundle.js +8 -5
  114. data/node_modules/govuk-frontend/dist/govuk/components/radios/radios.bundle.js.map +1 -1
  115. data/node_modules/govuk-frontend/dist/govuk/components/radios/radios.bundle.mjs +8 -5
  116. data/node_modules/govuk-frontend/dist/govuk/components/radios/radios.bundle.mjs.map +1 -1
  117. data/node_modules/govuk-frontend/dist/govuk/components/radios/radios.mjs +2 -2
  118. data/node_modules/govuk-frontend/dist/govuk/components/radios/radios.mjs.map +1 -1
  119. data/node_modules/govuk-frontend/dist/govuk/components/select/fixtures.json +16 -1
  120. data/node_modules/govuk-frontend/dist/govuk/components/select/macro-options.json +2 -2
  121. data/node_modules/govuk-frontend/dist/govuk/components/select/template-id.html +7 -0
  122. data/node_modules/govuk-frontend/dist/govuk/components/select/template.njk +6 -4
  123. data/node_modules/govuk-frontend/dist/govuk/components/service-navigation/service-navigation.bundle.js +8 -5
  124. data/node_modules/govuk-frontend/dist/govuk/components/service-navigation/service-navigation.bundle.js.map +1 -1
  125. data/node_modules/govuk-frontend/dist/govuk/components/service-navigation/service-navigation.bundle.mjs +8 -5
  126. data/node_modules/govuk-frontend/dist/govuk/components/service-navigation/service-navigation.bundle.mjs.map +1 -1
  127. data/node_modules/govuk-frontend/dist/govuk/components/service-navigation/service-navigation.mjs +2 -2
  128. data/node_modules/govuk-frontend/dist/govuk/components/service-navigation/service-navigation.mjs.map +1 -1
  129. data/node_modules/govuk-frontend/dist/govuk/components/skip-link/skip-link.bundle.js +9 -6
  130. data/node_modules/govuk-frontend/dist/govuk/components/skip-link/skip-link.bundle.js.map +1 -1
  131. data/node_modules/govuk-frontend/dist/govuk/components/skip-link/skip-link.bundle.mjs +9 -6
  132. data/node_modules/govuk-frontend/dist/govuk/components/skip-link/skip-link.bundle.mjs.map +1 -1
  133. data/node_modules/govuk-frontend/dist/govuk/components/skip-link/skip-link.mjs +3 -3
  134. data/node_modules/govuk-frontend/dist/govuk/components/skip-link/skip-link.mjs.map +1 -1
  135. data/node_modules/govuk-frontend/dist/govuk/components/summary-list/_index.scss +12 -21
  136. data/node_modules/govuk-frontend/dist/govuk/components/summary-list/_index.scss.map +1 -1
  137. data/node_modules/govuk-frontend/dist/govuk/components/summary-list/fixtures.json +142 -0
  138. data/node_modules/govuk-frontend/dist/govuk/components/summary-list/template-as-a-summary-card-extreme.html +106 -0
  139. data/node_modules/govuk-frontend/dist/govuk/components/tabs/tabs.bundle.js +8 -5
  140. data/node_modules/govuk-frontend/dist/govuk/components/tabs/tabs.bundle.js.map +1 -1
  141. data/node_modules/govuk-frontend/dist/govuk/components/tabs/tabs.bundle.mjs +8 -5
  142. data/node_modules/govuk-frontend/dist/govuk/components/tabs/tabs.bundle.mjs.map +1 -1
  143. data/node_modules/govuk-frontend/dist/govuk/components/tabs/tabs.mjs +2 -2
  144. data/node_modules/govuk-frontend/dist/govuk/components/tabs/tabs.mjs.map +1 -1
  145. data/node_modules/govuk-frontend/dist/govuk/components/textarea/fixtures.json +15 -1
  146. data/node_modules/govuk-frontend/dist/govuk/components/textarea/macro-options.json +2 -2
  147. data/node_modules/govuk-frontend/dist/govuk/components/textarea/template.njk +6 -4
  148. data/node_modules/govuk-frontend/dist/govuk/core/_govuk-frontend-properties.scss +1 -1
  149. data/node_modules/govuk-frontend/dist/govuk/errors/index.mjs +1 -1
  150. data/node_modules/govuk-frontend/dist/govuk/errors/index.mjs.map +1 -1
  151. data/node_modules/govuk-frontend/dist/govuk/govuk-frontend.min.css +2 -2
  152. data/node_modules/govuk-frontend/dist/govuk/govuk-frontend.min.css.map +1 -1
  153. data/node_modules/govuk-frontend/dist/govuk/govuk-frontend.min.js +1 -1
  154. data/node_modules/govuk-frontend/dist/govuk/govuk-frontend.min.js.map +1 -1
  155. data/node_modules/govuk-frontend/dist/govuk/helpers/_colour.scss +2 -2
  156. data/node_modules/govuk-frontend/dist/govuk/helpers/_colour.scss.map +1 -1
  157. data/node_modules/govuk-frontend/dist/govuk/init.mjs +11 -11
  158. data/node_modules/govuk-frontend/dist/govuk/init.mjs.map +1 -1
  159. data/node_modules/govuk-frontend/dist/govuk/settings/_colours-organisations.scss +18 -5
  160. data/node_modules/govuk-frontend/dist/govuk/settings/_colours-organisations.scss.map +1 -1
  161. data/node_modules/govuk-frontend/dist/govuk-prototype-kit/init.scss +1 -1
  162. data/node_modules/govuk-frontend/dist/govuk-prototype-kit/init.scss.map +1 -1
  163. data/node_modules/govuk-frontend/govuk-prototype-kit.config.json +1 -1
  164. data/node_modules/govuk-frontend/package.json +7 -7
  165. metadata +21 -5
  166. data/node_modules/govuk-frontend/dist/govuk/components/file-upload/template-with-value.html +0 -6
  167. data/node_modules/govuk-frontend/dist/govuk/govuk-frontend-component.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"accordion.mjs","sources":["../../../../src/govuk/components/accordion/accordion.mjs"],"sourcesContent":["import { ConfigurableComponent } from '../../common/configuration.mjs'\nimport { ElementError } from '../../errors/index.mjs'\nimport { I18n } from '../../i18n.mjs'\n\n/**\n * Accordion component\n *\n * This allows a collection of sections to be collapsed by default, showing only\n * their headers. Sections can be expanded or collapsed individually by clicking\n * their headers. A \"Show all sections\" button is also added to the top of the\n * accordion, which switches to \"Hide all sections\" when all the sections are\n * expanded.\n *\n * The state of each section is saved to the DOM via the `aria-expanded`\n * attribute, which also provides accessibility.\n *\n * @preserve\n * @augments ConfigurableComponent<AccordionConfig>\n */\nexport class Accordion extends ConfigurableComponent {\n /** @private */\n i18n\n\n /** @private */\n controlsClass = 'govuk-accordion__controls'\n\n /** @private */\n showAllClass = 'govuk-accordion__show-all'\n\n /** @private */\n showAllTextClass = 'govuk-accordion__show-all-text'\n\n /** @private */\n sectionClass = 'govuk-accordion__section'\n\n /** @private */\n sectionExpandedClass = 'govuk-accordion__section--expanded'\n\n /** @private */\n sectionButtonClass = 'govuk-accordion__section-button'\n\n /** @private */\n sectionHeaderClass = 'govuk-accordion__section-header'\n\n /** @private */\n sectionHeadingClass = 'govuk-accordion__section-heading'\n\n /** @private */\n sectionHeadingDividerClass = 'govuk-accordion__section-heading-divider'\n\n /** @private */\n sectionHeadingTextClass = 'govuk-accordion__section-heading-text'\n\n /** @private */\n sectionHeadingTextFocusClass = 'govuk-accordion__section-heading-text-focus'\n\n /** @private */\n sectionShowHideToggleClass = 'govuk-accordion__section-toggle'\n\n /** @private */\n sectionShowHideToggleFocusClass = 'govuk-accordion__section-toggle-focus'\n\n /** @private */\n sectionShowHideTextClass = 'govuk-accordion__section-toggle-text'\n\n /** @private */\n upChevronIconClass = 'govuk-accordion-nav__chevron'\n\n /** @private */\n downChevronIconClass = 'govuk-accordion-nav__chevron--down'\n\n /** @private */\n sectionSummaryClass = 'govuk-accordion__section-summary'\n\n /** @private */\n sectionSummaryFocusClass = 'govuk-accordion__section-summary-focus'\n\n /** @private */\n sectionContentClass = 'govuk-accordion__section-content'\n\n /** @private */\n $sections\n\n /**\n * @private\n * @type {HTMLButtonElement | null}\n */\n $showAllButton = null\n\n /**\n * @private\n * @type {HTMLElement | null}\n */\n $showAllIcon = null\n\n /**\n * @private\n * @type {HTMLElement | null}\n */\n $showAllText = null\n\n /**\n * @param {Element | null} $root - HTML element to use for accordion\n * @param {AccordionConfig} [config] - Accordion config\n */\n constructor($root, config = {}) {\n super($root, config)\n\n this.i18n = new I18n(this.config.i18n)\n\n const $sections = this.$root.querySelectorAll(`.${this.sectionClass}`)\n if (!$sections.length) {\n throw new ElementError({\n component: Accordion,\n identifier: `Sections (\\`<div class=\"${this.sectionClass}\">\\`)`\n })\n }\n\n this.$sections = $sections\n\n this.initControls()\n this.initSectionHeaders()\n\n this.updateShowAllButton(this.areAllSectionsOpen())\n }\n\n /**\n * Initialise controls and set attributes\n *\n * @private\n */\n initControls() {\n // Create \"Show all\" button and set attributes\n this.$showAllButton = document.createElement('button')\n this.$showAllButton.setAttribute('type', 'button')\n this.$showAllButton.setAttribute('class', this.showAllClass)\n this.$showAllButton.setAttribute('aria-expanded', 'false')\n\n // Create icon, add to element\n this.$showAllIcon = document.createElement('span')\n this.$showAllIcon.classList.add(this.upChevronIconClass)\n this.$showAllButton.appendChild(this.$showAllIcon)\n\n // Create control wrapper and add controls to it\n const $accordionControls = document.createElement('div')\n $accordionControls.setAttribute('class', this.controlsClass)\n $accordionControls.appendChild(this.$showAllButton)\n this.$root.insertBefore($accordionControls, this.$root.firstChild)\n\n // Build additional wrapper for Show all toggle text and place after icon\n this.$showAllText = document.createElement('span')\n this.$showAllText.classList.add(this.showAllTextClass)\n this.$showAllButton.appendChild(this.$showAllText)\n\n // Handle click events on the show/hide all button\n this.$showAllButton.addEventListener('click', () =>\n this.onShowOrHideAllToggle()\n )\n\n // Handle 'beforematch' events, if the user agent supports them\n if ('onbeforematch' in document) {\n document.addEventListener('beforematch', (event) =>\n this.onBeforeMatch(event)\n )\n }\n }\n\n /**\n * Initialise section headers\n *\n * @private\n */\n initSectionHeaders() {\n this.$sections.forEach(($section, i) => {\n const $header = $section.querySelector(`.${this.sectionHeaderClass}`)\n if (!$header) {\n throw new ElementError({\n component: Accordion,\n identifier: `Section headers (\\`<div class=\"${this.sectionHeaderClass}\">\\`)`\n })\n }\n\n // Set header attributes\n this.constructHeaderMarkup($header, i)\n this.setExpanded(this.isExpanded($section), $section)\n\n // Handle events\n $header.addEventListener('click', () => this.onSectionToggle($section))\n\n // See if there is any state stored in sessionStorage and set the sections\n // to open or closed.\n this.setInitialState($section)\n })\n }\n\n /**\n * Construct section header\n *\n * @private\n * @param {Element} $header - Section header\n * @param {number} index - Section index\n */\n constructHeaderMarkup($header, index) {\n const $span = $header.querySelector(`.${this.sectionButtonClass}`)\n const $heading = $header.querySelector(`.${this.sectionHeadingClass}`)\n const $summary = $header.querySelector(`.${this.sectionSummaryClass}`)\n\n if (!$heading) {\n throw new ElementError({\n component: Accordion,\n identifier: `Section heading (\\`.${this.sectionHeadingClass}\\`)`\n })\n }\n\n if (!$span) {\n throw new ElementError({\n component: Accordion,\n identifier: `Section button placeholder (\\`<span class=\"${this.sectionButtonClass}\">\\`)`\n })\n }\n\n // Create a button element that will replace the\n // '.govuk-accordion__section-button' span\n const $button = document.createElement('button')\n $button.setAttribute('type', 'button')\n $button.setAttribute(\n 'aria-controls',\n `${this.$root.id}-content-${index + 1}`\n )\n\n // Copy all attributes from $span to $button (except `id`, which gets added\n // to the `$headingText` element)\n for (const attr of Array.from($span.attributes)) {\n if (attr.name !== 'id') {\n $button.setAttribute(attr.name, attr.value)\n }\n }\n\n // Create container for heading text so it can be styled\n const $headingText = document.createElement('span')\n $headingText.classList.add(this.sectionHeadingTextClass)\n // Copy the span ID to the heading text to allow it to be referenced by\n // `aria-labelledby` on the hidden content area without \"Show this section\"\n $headingText.id = $span.id\n\n // Create an inner heading text container to limit the width of the focus\n // state\n const $headingTextFocus = document.createElement('span')\n $headingTextFocus.classList.add(this.sectionHeadingTextFocusClass)\n $headingText.appendChild($headingTextFocus)\n // span could contain HTML elements\n // (see https://www.w3.org/TR/2011/WD-html5-20110525/content-models.html#phrasing-content)\n Array.from($span.childNodes).forEach(($child) =>\n $headingTextFocus.appendChild($child)\n )\n\n // Create container for show / hide icons and text.\n const $showHideToggle = document.createElement('span')\n $showHideToggle.classList.add(this.sectionShowHideToggleClass)\n // Tell Google not to index the 'show' text as part of the heading. Must be\n // set on the element before it's added to the DOM.\n // See https://developers.google.com/search/docs/advanced/robots/robots_meta_tag#data-nosnippet-attr\n $showHideToggle.setAttribute('data-nosnippet', '')\n // Create an inner container to limit the width of the focus state\n const $showHideToggleFocus = document.createElement('span')\n $showHideToggleFocus.classList.add(this.sectionShowHideToggleFocusClass)\n $showHideToggle.appendChild($showHideToggleFocus)\n // Create wrapper for the show / hide text. Append text after the show/hide icon\n const $showHideText = document.createElement('span')\n const $showHideIcon = document.createElement('span')\n $showHideIcon.classList.add(this.upChevronIconClass)\n $showHideToggleFocus.appendChild($showHideIcon)\n $showHideText.classList.add(this.sectionShowHideTextClass)\n $showHideToggleFocus.appendChild($showHideText)\n\n // Append elements to the button:\n // 1. Heading text\n // 2. Punctuation\n // 3. (Optional: Summary line followed by punctuation)\n // 4. Show / hide toggle\n $button.appendChild($headingText)\n $button.appendChild(this.getButtonPunctuationEl())\n\n // If summary content exists add to DOM in correct order\n if ($summary) {\n // Create a new `span` element and copy the summary line content from the\n // original `div` to the new `span`. This is because the summary line text\n // is now inside a button element, which can only contain phrasing\n // content.\n const $summarySpan = document.createElement('span')\n // Create an inner summary container to limit the width of the summary\n // focus state\n const $summarySpanFocus = document.createElement('span')\n $summarySpanFocus.classList.add(this.sectionSummaryFocusClass)\n $summarySpan.appendChild($summarySpanFocus)\n\n // Get original attributes, and pass them to the replacement\n for (const attr of Array.from($summary.attributes)) {\n $summarySpan.setAttribute(attr.name, attr.value)\n }\n\n // Copy original contents of summary to the new summary span\n Array.from($summary.childNodes).forEach(($child) =>\n $summarySpanFocus.appendChild($child)\n )\n\n // Replace the original summary `div` with the new summary `span`\n $summary.remove()\n\n $button.appendChild($summarySpan)\n $button.appendChild(this.getButtonPunctuationEl())\n }\n\n $button.appendChild($showHideToggle)\n\n $heading.removeChild($span)\n $heading.appendChild($button)\n }\n\n /**\n * When a section is opened by the user agent via the 'beforematch' event\n *\n * @private\n * @param {Event} event - Generic event\n */\n onBeforeMatch(event) {\n const $fragment = event.target\n\n // Handle elements with `.closest()` support only\n if (!($fragment instanceof Element)) {\n return\n }\n\n // Handle when fragment is inside section\n const $section = $fragment.closest(`.${this.sectionClass}`)\n if ($section) {\n this.setExpanded(true, $section)\n }\n }\n\n /**\n * When section toggled, set and store state\n *\n * @private\n * @param {Element} $section - Section element\n */\n onSectionToggle($section) {\n const nowExpanded = !this.isExpanded($section)\n this.setExpanded(nowExpanded, $section)\n\n // Store the state in sessionStorage when a change is triggered\n this.storeState($section, nowExpanded)\n }\n\n /**\n * When Open/Close All toggled, set and store state\n *\n * @private\n */\n onShowOrHideAllToggle() {\n const nowExpanded = !this.areAllSectionsOpen()\n\n this.$sections.forEach(($section) => {\n this.setExpanded(nowExpanded, $section)\n this.storeState($section, nowExpanded)\n })\n\n this.updateShowAllButton(nowExpanded)\n }\n\n /**\n * Set section attributes when opened/closed\n *\n * @private\n * @param {boolean} expanded - Section expanded\n * @param {Element} $section - Section element\n */\n setExpanded(expanded, $section) {\n const $showHideIcon = $section.querySelector(`.${this.upChevronIconClass}`)\n const $showHideText = $section.querySelector(\n `.${this.sectionShowHideTextClass}`\n )\n const $button = $section.querySelector(`.${this.sectionButtonClass}`)\n const $content = $section.querySelector(`.${this.sectionContentClass}`)\n\n if (!$content) {\n throw new ElementError({\n component: Accordion,\n identifier: `Section content (\\`<div class=\"${this.sectionContentClass}\">\\`)`\n })\n }\n\n if (!$showHideIcon || !$showHideText || !$button) {\n // Return early for elements we create\n return\n }\n\n const newButtonText = expanded\n ? this.i18n.t('hideSection')\n : this.i18n.t('showSection')\n\n $showHideText.textContent = newButtonText\n $button.setAttribute('aria-expanded', `${expanded}`)\n\n // Update aria-label combining\n const ariaLabelParts = []\n\n const $headingText = $section.querySelector(\n `.${this.sectionHeadingTextClass}`\n )\n if ($headingText) {\n ariaLabelParts.push(`${$headingText.textContent}`.trim())\n }\n\n const $summary = $section.querySelector(`.${this.sectionSummaryClass}`)\n if ($summary) {\n ariaLabelParts.push(`${$summary.textContent}`.trim())\n }\n\n const ariaLabelMessage = expanded\n ? this.i18n.t('hideSectionAriaLabel')\n : this.i18n.t('showSectionAriaLabel')\n ariaLabelParts.push(ariaLabelMessage)\n\n /*\n * Join with a comma to add pause for assistive technology.\n * Example: [heading]Section A ,[pause] Show this section.\n * https://accessibility.blog.gov.uk/2017/12/18/what-working-on-gov-uk-navigation-taught-us-about-accessibility/\n */\n $button.setAttribute('aria-label', ariaLabelParts.join(' , '))\n\n // Swap icon, change class\n if (expanded) {\n $content.removeAttribute('hidden')\n $section.classList.add(this.sectionExpandedClass)\n $showHideIcon.classList.remove(this.downChevronIconClass)\n } else {\n $content.setAttribute('hidden', 'until-found')\n $section.classList.remove(this.sectionExpandedClass)\n $showHideIcon.classList.add(this.downChevronIconClass)\n }\n\n // See if \"Show all sections\" button text should be updated\n this.updateShowAllButton(this.areAllSectionsOpen())\n }\n\n /**\n * Get state of section\n *\n * @private\n * @param {Element} $section - Section element\n * @returns {boolean} True if expanded\n */\n isExpanded($section) {\n return $section.classList.contains(this.sectionExpandedClass)\n }\n\n /**\n * Check if all sections are open\n *\n * @private\n * @returns {boolean} True if all sections are open\n */\n areAllSectionsOpen() {\n return Array.from(this.$sections).every(($section) =>\n this.isExpanded($section)\n )\n }\n\n /**\n * Update \"Show all sections\" button\n *\n * @private\n * @param {boolean} expanded - Section expanded\n */\n updateShowAllButton(expanded) {\n if (!this.$showAllButton || !this.$showAllText || !this.$showAllIcon) {\n return\n }\n\n this.$showAllButton.setAttribute('aria-expanded', expanded.toString())\n this.$showAllText.textContent = expanded\n ? this.i18n.t('hideAllSections')\n : this.i18n.t('showAllSections')\n this.$showAllIcon.classList.toggle(this.downChevronIconClass, !expanded)\n }\n\n /**\n * Get the identifier for a section\n *\n * We need a unique way of identifying each content in the Accordion.\n * Since an `#id` should be unique and an `id` is required for `aria-`\n * attributes `id` can be safely used.\n *\n * @param {Element} $section - Section element\n * @returns {string | undefined | null} Identifier for section\n */\n getIdentifier($section) {\n const $button = $section.querySelector(`.${this.sectionButtonClass}`)\n\n return $button?.getAttribute('aria-controls')\n }\n\n /**\n * Set the state of the accordions in sessionStorage\n *\n * @private\n * @param {Element} $section - Section element\n * @param {boolean} isExpanded - Whether the section is expanded\n */\n storeState($section, isExpanded) {\n if (!this.config.rememberExpanded) {\n return\n }\n\n const id = this.getIdentifier($section)\n\n if (id) {\n try {\n window.sessionStorage.setItem(id, isExpanded.toString())\n } catch (exception) {}\n }\n }\n\n /**\n * Read the state of the accordions from sessionStorage\n *\n * @private\n * @param {Element} $section - Section element\n */\n setInitialState($section) {\n if (!this.config.rememberExpanded) {\n return\n }\n\n const id = this.getIdentifier($section)\n\n if (id) {\n try {\n const state = window.sessionStorage.getItem(id)\n\n if (state !== null) {\n this.setExpanded(state === 'true', $section)\n }\n } catch (exception) {}\n }\n }\n\n /**\n * Create an element to improve semantics of the section button with\n * punctuation\n *\n * Adding punctuation to the button can also improve its general semantics by\n * dividing its contents into thematic chunks. See\n * https://github.com/alphagov/govuk-frontend/issues/2327#issuecomment-922957442\n *\n * @private\n * @returns {Element} DOM element\n */\n getButtonPunctuationEl() {\n const $punctuationEl = document.createElement('span')\n $punctuationEl.classList.add(\n 'govuk-visually-hidden',\n this.sectionHeadingDividerClass\n )\n $punctuationEl.textContent = ', '\n return $punctuationEl\n }\n\n /**\n * Name for the component used when initialising using data-module attributes.\n */\n static moduleName = 'govuk-accordion'\n\n /**\n * Accordion default config\n *\n * @see {@link AccordionConfig}\n * @constant\n * @type {AccordionConfig}\n */\n static defaults = Object.freeze({\n i18n: {\n hideAllSections: 'Hide all sections',\n hideSection: 'Hide',\n hideSectionAriaLabel: 'Hide this section',\n showAllSections: 'Show all sections',\n showSection: 'Show',\n showSectionAriaLabel: 'Show this section'\n },\n rememberExpanded: true\n })\n\n /**\n * Accordion config schema\n *\n * @constant\n * @satisfies {Schema}\n */\n static schema = Object.freeze({\n properties: {\n i18n: { type: 'object' },\n rememberExpanded: { type: 'boolean' }\n }\n })\n}\n\n/**\n * Accordion config\n *\n * @see {@link Accordion.defaults}\n * @typedef {object} AccordionConfig\n * @property {AccordionTranslations} [i18n=Accordion.defaults.i18n] - Accordion translations\n * @property {boolean} [rememberExpanded] - Whether the expanded and collapsed\n * state of each section is remembered and restored when navigating.\n */\n\n/**\n * Accordion translations\n *\n * @see {@link Accordion.defaults.i18n}\n * @typedef {object} AccordionTranslations\n *\n * Messages used by the component for the labels of its buttons. This includes\n * the visible text shown on screen, and text to help assistive technology users\n * for the buttons toggling each section.\n * @property {string} [hideAllSections] - The text content for the 'Hide all\n * sections' button, used when at least one section is expanded.\n * @property {string} [hideSection] - The text content for the 'Hide'\n * button, used when a section is expanded.\n * @property {string} [hideSectionAriaLabel] - The text content appended to the\n * 'Hide' button's accessible name when a section is expanded.\n * @property {string} [showAllSections] - The text content for the 'Show all\n * sections' button, used when all sections are collapsed.\n * @property {string} [showSection] - The text content for the 'Show'\n * button, used when a section is collapsed.\n * @property {string} [showSectionAriaLabel] - The text content appended to the\n * 'Show' button's accessible name when a section is expanded.\n */\n\n/**\n * @typedef {import('../../common/configuration.mjs').Schema} Schema\n */\n"],"names":["Accordion","ConfigurableComponent","constructor","$root","config","i18n","controlsClass","showAllClass","showAllTextClass","sectionClass","sectionExpandedClass","sectionButtonClass","sectionHeaderClass","sectionHeadingClass","sectionHeadingDividerClass","sectionHeadingTextClass","sectionHeadingTextFocusClass","sectionShowHideToggleClass","sectionShowHideToggleFocusClass","sectionShowHideTextClass","upChevronIconClass","downChevronIconClass","sectionSummaryClass","sectionSummaryFocusClass","sectionContentClass","$sections","$showAllButton","$showAllIcon","$showAllText","I18n","querySelectorAll","length","ElementError","component","identifier","initControls","initSectionHeaders","updateShowAllButton","areAllSectionsOpen","document","createElement","setAttribute","classList","add","appendChild","$accordionControls","insertBefore","firstChild","addEventListener","onShowOrHideAllToggle","event","onBeforeMatch","forEach","$section","i","$header","querySelector","constructHeaderMarkup","setExpanded","isExpanded","onSectionToggle","setInitialState","index","$span","$heading","$summary","$button","id","attr","Array","from","attributes","name","value","$headingText","$headingTextFocus","childNodes","$child","$showHideToggle","$showHideToggleFocus","$showHideText","$showHideIcon","getButtonPunctuationEl","$summarySpan","$summarySpanFocus","remove","removeChild","$fragment","target","Element","closest","nowExpanded","storeState","expanded","$content","newButtonText","t","textContent","ariaLabelParts","push","trim","ariaLabelMessage","join","removeAttribute","contains","every","toString","toggle","getIdentifier","getAttribute","rememberExpanded","window","sessionStorage","setItem","exception","state","getItem","$punctuationEl","moduleName","defaults","Object","freeze","hideAllSections","hideSection","hideSectionAriaLabel","showAllSections","showSection","showSectionAriaLabel","schema","properties","type"],"mappings":"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"}
1
+ {"version":3,"file":"accordion.mjs","sources":["../../../../src/govuk/components/accordion/accordion.mjs"],"sourcesContent":["import { ConfigurableComponent } from '../../common/configuration.mjs'\nimport { ElementError } from '../../errors/index.mjs'\nimport { I18n } from '../../i18n.mjs'\n\n/**\n * Accordion component\n *\n * This allows a collection of sections to be collapsed by default, showing only\n * their headers. Sections can be expanded or collapsed individually by clicking\n * their headers. A \"Show all sections\" button is also added to the top of the\n * accordion, which switches to \"Hide all sections\" when all the sections are\n * expanded.\n *\n * The state of each section is saved to the DOM via the `aria-expanded`\n * attribute, which also provides accessibility.\n *\n * @preserve\n * @augments ConfigurableComponent<AccordionConfig>\n */\nexport class Accordion extends ConfigurableComponent {\n /** @private */\n i18n\n\n /** @private */\n controlsClass = 'govuk-accordion__controls'\n\n /** @private */\n showAllClass = 'govuk-accordion__show-all'\n\n /** @private */\n showAllTextClass = 'govuk-accordion__show-all-text'\n\n /** @private */\n sectionClass = 'govuk-accordion__section'\n\n /** @private */\n sectionExpandedClass = 'govuk-accordion__section--expanded'\n\n /** @private */\n sectionButtonClass = 'govuk-accordion__section-button'\n\n /** @private */\n sectionHeaderClass = 'govuk-accordion__section-header'\n\n /** @private */\n sectionHeadingClass = 'govuk-accordion__section-heading'\n\n /** @private */\n sectionHeadingDividerClass = 'govuk-accordion__section-heading-divider'\n\n /** @private */\n sectionHeadingTextClass = 'govuk-accordion__section-heading-text'\n\n /** @private */\n sectionHeadingTextFocusClass = 'govuk-accordion__section-heading-text-focus'\n\n /** @private */\n sectionShowHideToggleClass = 'govuk-accordion__section-toggle'\n\n /** @private */\n sectionShowHideToggleFocusClass = 'govuk-accordion__section-toggle-focus'\n\n /** @private */\n sectionShowHideTextClass = 'govuk-accordion__section-toggle-text'\n\n /** @private */\n upChevronIconClass = 'govuk-accordion-nav__chevron'\n\n /** @private */\n downChevronIconClass = 'govuk-accordion-nav__chevron--down'\n\n /** @private */\n sectionSummaryClass = 'govuk-accordion__section-summary'\n\n /** @private */\n sectionSummaryFocusClass = 'govuk-accordion__section-summary-focus'\n\n /** @private */\n sectionContentClass = 'govuk-accordion__section-content'\n\n /** @private */\n $sections\n\n /**\n * @private\n * @type {HTMLButtonElement | null}\n */\n $showAllButton = null\n\n /**\n * @private\n * @type {HTMLElement | null}\n */\n $showAllIcon = null\n\n /**\n * @private\n * @type {HTMLElement | null}\n */\n $showAllText = null\n\n /**\n * @param {Element | null} $root - HTML element to use for accordion\n * @param {AccordionConfig} [config] - Accordion config\n */\n constructor($root, config = {}) {\n super($root, config)\n\n this.i18n = new I18n(this.config.i18n)\n\n const $sections = this.$root.querySelectorAll(`.${this.sectionClass}`)\n if (!$sections.length) {\n throw new ElementError({\n component: Accordion,\n identifier: `Sections (\\`<div class=\"${this.sectionClass}\">\\`)`\n })\n }\n\n this.$sections = $sections\n\n this.initControls()\n this.initSectionHeaders()\n\n this.updateShowAllButton(this.areAllSectionsOpen())\n }\n\n /**\n * Initialise controls and set attributes\n *\n * @private\n */\n initControls() {\n // Create \"Show all\" button and set attributes\n this.$showAllButton = document.createElement('button')\n this.$showAllButton.setAttribute('type', 'button')\n this.$showAllButton.setAttribute('class', this.showAllClass)\n this.$showAllButton.setAttribute('aria-expanded', 'false')\n\n // Create icon, add to element\n this.$showAllIcon = document.createElement('span')\n this.$showAllIcon.classList.add(this.upChevronIconClass)\n this.$showAllButton.appendChild(this.$showAllIcon)\n\n // Create control wrapper and add controls to it\n const $accordionControls = document.createElement('div')\n $accordionControls.setAttribute('class', this.controlsClass)\n $accordionControls.appendChild(this.$showAllButton)\n this.$root.insertBefore($accordionControls, this.$root.firstChild)\n\n // Build additional wrapper for Show all toggle text and place after icon\n this.$showAllText = document.createElement('span')\n this.$showAllText.classList.add(this.showAllTextClass)\n this.$showAllButton.appendChild(this.$showAllText)\n\n // Handle click events on the show/hide all button\n this.$showAllButton.addEventListener('click', () =>\n this.onShowOrHideAllToggle()\n )\n\n // Handle 'beforematch' events, if the user agent supports them\n if ('onbeforematch' in document) {\n document.addEventListener('beforematch', (event) =>\n this.onBeforeMatch(event)\n )\n }\n }\n\n /**\n * Initialise section headers\n *\n * @private\n */\n initSectionHeaders() {\n this.$sections.forEach(($section, i) => {\n const $header = $section.querySelector(`.${this.sectionHeaderClass}`)\n if (!$header) {\n throw new ElementError({\n component: Accordion,\n identifier: `Section headers (\\`<div class=\"${this.sectionHeaderClass}\">\\`)`\n })\n }\n\n // Set header attributes\n this.constructHeaderMarkup($header, i)\n this.setExpanded(this.isExpanded($section), $section)\n\n // Handle events\n $header.addEventListener('click', () => this.onSectionToggle($section))\n\n // See if there is any state stored in sessionStorage and set the sections\n // to open or closed.\n this.setInitialState($section)\n })\n }\n\n /**\n * Construct section header\n *\n * @private\n * @param {Element} $header - Section header\n * @param {number} index - Section index\n */\n constructHeaderMarkup($header, index) {\n const $span = $header.querySelector(`.${this.sectionButtonClass}`)\n const $heading = $header.querySelector(`.${this.sectionHeadingClass}`)\n const $summary = $header.querySelector(`.${this.sectionSummaryClass}`)\n\n if (!$heading) {\n throw new ElementError({\n component: Accordion,\n identifier: `Section heading (\\`.${this.sectionHeadingClass}\\`)`\n })\n }\n\n if (!$span) {\n throw new ElementError({\n component: Accordion,\n identifier: `Section button placeholder (\\`<span class=\"${this.sectionButtonClass}\">\\`)`\n })\n }\n\n // Create a button element that will replace the\n // '.govuk-accordion__section-button' span\n const $button = document.createElement('button')\n $button.setAttribute('type', 'button')\n $button.setAttribute(\n 'aria-controls',\n `${this.$root.id}-content-${index + 1}`\n )\n\n // Copy all attributes from $span to $button (except `id`, which gets added\n // to the `$headingText` element)\n for (const attr of Array.from($span.attributes)) {\n if (attr.name !== 'id') {\n $button.setAttribute(attr.name, attr.value)\n }\n }\n\n // Create container for heading text so it can be styled\n const $headingText = document.createElement('span')\n $headingText.classList.add(this.sectionHeadingTextClass)\n // Copy the span ID to the heading text to allow it to be referenced by\n // `aria-labelledby` on the hidden content area without \"Show this section\"\n $headingText.id = $span.id\n\n // Create an inner heading text container to limit the width of the focus\n // state\n const $headingTextFocus = document.createElement('span')\n $headingTextFocus.classList.add(this.sectionHeadingTextFocusClass)\n $headingText.appendChild($headingTextFocus)\n // span could contain HTML elements\n // (see https://www.w3.org/TR/2011/WD-html5-20110525/content-models.html#phrasing-content)\n Array.from($span.childNodes).forEach(($child) =>\n $headingTextFocus.appendChild($child)\n )\n\n // Create container for show / hide icons and text.\n const $showHideToggle = document.createElement('span')\n $showHideToggle.classList.add(this.sectionShowHideToggleClass)\n // Tell Google not to index the 'show' text as part of the heading. Must be\n // set on the element before it's added to the DOM.\n // See https://developers.google.com/search/docs/advanced/robots/robots_meta_tag#data-nosnippet-attr\n $showHideToggle.setAttribute('data-nosnippet', '')\n // Create an inner container to limit the width of the focus state\n const $showHideToggleFocus = document.createElement('span')\n $showHideToggleFocus.classList.add(this.sectionShowHideToggleFocusClass)\n $showHideToggle.appendChild($showHideToggleFocus)\n // Create wrapper for the show / hide text. Append text after the show/hide icon\n const $showHideText = document.createElement('span')\n const $showHideIcon = document.createElement('span')\n $showHideIcon.classList.add(this.upChevronIconClass)\n $showHideToggleFocus.appendChild($showHideIcon)\n $showHideText.classList.add(this.sectionShowHideTextClass)\n $showHideToggleFocus.appendChild($showHideText)\n\n // Append elements to the button:\n // 1. Heading text\n // 2. Punctuation\n // 3. (Optional: Summary line followed by punctuation)\n // 4. Show / hide toggle\n $button.appendChild($headingText)\n $button.appendChild(this.getButtonPunctuationEl())\n\n // If summary content exists add to DOM in correct order\n if ($summary) {\n // Create a new `span` element and copy the summary line content from the\n // original `div` to the new `span`. This is because the summary line text\n // is now inside a button element, which can only contain phrasing\n // content.\n const $summarySpan = document.createElement('span')\n // Create an inner summary container to limit the width of the summary\n // focus state\n const $summarySpanFocus = document.createElement('span')\n $summarySpanFocus.classList.add(this.sectionSummaryFocusClass)\n $summarySpan.appendChild($summarySpanFocus)\n\n // Get original attributes, and pass them to the replacement\n for (const attr of Array.from($summary.attributes)) {\n $summarySpan.setAttribute(attr.name, attr.value)\n }\n\n // Copy original contents of summary to the new summary span\n Array.from($summary.childNodes).forEach(($child) =>\n $summarySpanFocus.appendChild($child)\n )\n\n // Replace the original summary `div` with the new summary `span`\n $summary.remove()\n\n $button.appendChild($summarySpan)\n $button.appendChild(this.getButtonPunctuationEl())\n }\n\n $button.appendChild($showHideToggle)\n\n $heading.removeChild($span)\n $heading.appendChild($button)\n }\n\n /**\n * When a section is opened by the user agent via the 'beforematch' event\n *\n * @private\n * @param {Event} event - Generic event\n */\n onBeforeMatch(event) {\n const $fragment = event.target\n\n // Handle elements with `.closest()` support only\n if (!($fragment instanceof Element)) {\n return\n }\n\n // Handle when fragment is inside section\n const $section = $fragment.closest(`.${this.sectionClass}`)\n if ($section) {\n this.setExpanded(true, $section)\n }\n }\n\n /**\n * When section toggled, set and store state\n *\n * @private\n * @param {Element} $section - Section element\n */\n onSectionToggle($section) {\n const nowExpanded = !this.isExpanded($section)\n this.setExpanded(nowExpanded, $section)\n\n // Store the state in sessionStorage when a change is triggered\n this.storeState($section, nowExpanded)\n }\n\n /**\n * When Open/Close All toggled, set and store state\n *\n * @private\n */\n onShowOrHideAllToggle() {\n const nowExpanded = !this.areAllSectionsOpen()\n\n this.$sections.forEach(($section) => {\n this.setExpanded(nowExpanded, $section)\n this.storeState($section, nowExpanded)\n })\n\n this.updateShowAllButton(nowExpanded)\n }\n\n /**\n * Set section attributes when opened/closed\n *\n * @private\n * @param {boolean} expanded - Section expanded\n * @param {Element} $section - Section element\n */\n setExpanded(expanded, $section) {\n const $showHideIcon = $section.querySelector(`.${this.upChevronIconClass}`)\n const $showHideText = $section.querySelector(\n `.${this.sectionShowHideTextClass}`\n )\n const $button = $section.querySelector(`.${this.sectionButtonClass}`)\n const $content = $section.querySelector(`.${this.sectionContentClass}`)\n\n if (!$content) {\n throw new ElementError({\n component: Accordion,\n identifier: `Section content (\\`<div class=\"${this.sectionContentClass}\">\\`)`\n })\n }\n\n if (!$showHideIcon || !$showHideText || !$button) {\n // Return early for elements we create\n return\n }\n\n const newButtonText = expanded\n ? this.i18n.t('hideSection')\n : this.i18n.t('showSection')\n\n $showHideText.textContent = newButtonText\n $button.setAttribute('aria-expanded', `${expanded}`)\n\n // Update aria-label combining\n const ariaLabelParts = []\n\n const $headingText = $section.querySelector(\n `.${this.sectionHeadingTextClass}`\n )\n if ($headingText) {\n ariaLabelParts.push(`${$headingText.textContent}`.trim())\n }\n\n const $summary = $section.querySelector(`.${this.sectionSummaryClass}`)\n if ($summary) {\n ariaLabelParts.push(`${$summary.textContent}`.trim())\n }\n\n const ariaLabelMessage = expanded\n ? this.i18n.t('hideSectionAriaLabel')\n : this.i18n.t('showSectionAriaLabel')\n ariaLabelParts.push(ariaLabelMessage)\n\n /*\n * Join with a comma to add pause for assistive technology.\n * Example: [heading]Section A ,[pause] Show this section.\n * https://accessibility.blog.gov.uk/2017/12/18/what-working-on-gov-uk-navigation-taught-us-about-accessibility/\n */\n $button.setAttribute('aria-label', ariaLabelParts.join(' , '))\n\n // Swap icon, change class\n if (expanded) {\n $content.removeAttribute('hidden')\n $section.classList.add(this.sectionExpandedClass)\n $showHideIcon.classList.remove(this.downChevronIconClass)\n } else {\n $content.setAttribute('hidden', 'until-found')\n $section.classList.remove(this.sectionExpandedClass)\n $showHideIcon.classList.add(this.downChevronIconClass)\n }\n\n // See if \"Show all sections\" button text should be updated\n this.updateShowAllButton(this.areAllSectionsOpen())\n }\n\n /**\n * Get state of section\n *\n * @private\n * @param {Element} $section - Section element\n * @returns {boolean} True if expanded\n */\n isExpanded($section) {\n return $section.classList.contains(this.sectionExpandedClass)\n }\n\n /**\n * Check if all sections are open\n *\n * @private\n * @returns {boolean} True if all sections are open\n */\n areAllSectionsOpen() {\n return Array.from(this.$sections).every(($section) =>\n this.isExpanded($section)\n )\n }\n\n /**\n * Update \"Show all sections\" button\n *\n * @private\n * @param {boolean} expanded - Section expanded\n */\n updateShowAllButton(expanded) {\n if (!this.$showAllButton || !this.$showAllText || !this.$showAllIcon) {\n return\n }\n\n this.$showAllButton.setAttribute('aria-expanded', expanded.toString())\n this.$showAllText.textContent = expanded\n ? this.i18n.t('hideAllSections')\n : this.i18n.t('showAllSections')\n this.$showAllIcon.classList.toggle(this.downChevronIconClass, !expanded)\n }\n\n /**\n * Get the identifier for a section\n *\n * We need a unique way of identifying each content in the Accordion.\n * Since an `#id` should be unique and an `id` is required for `aria-`\n * attributes `id` can be safely used.\n *\n * @param {Element} $section - Section element\n * @returns {string | undefined | null} Identifier for section\n */\n getIdentifier($section) {\n const $button = $section.querySelector(`.${this.sectionButtonClass}`)\n\n return $button?.getAttribute('aria-controls')\n }\n\n /**\n * Set the state of the accordions in sessionStorage\n *\n * @private\n * @param {Element} $section - Section element\n * @param {boolean} isExpanded - Whether the section is expanded\n */\n storeState($section, isExpanded) {\n if (!this.config.rememberExpanded) {\n return\n }\n\n const id = this.getIdentifier($section)\n\n if (id) {\n try {\n window.sessionStorage.setItem(id, isExpanded.toString())\n } catch (exception) {}\n }\n }\n\n /**\n * Read the state of the accordions from sessionStorage\n *\n * @private\n * @param {Element} $section - Section element\n */\n setInitialState($section) {\n if (!this.config.rememberExpanded) {\n return\n }\n\n const id = this.getIdentifier($section)\n\n if (id) {\n try {\n const state = window.sessionStorage.getItem(id)\n\n if (state !== null) {\n this.setExpanded(state === 'true', $section)\n }\n } catch (exception) {}\n }\n }\n\n /**\n * Create an element to improve semantics of the section button with\n * punctuation\n *\n * Adding punctuation to the button can also improve its general semantics by\n * dividing its contents into thematic chunks. See\n * https://github.com/alphagov/govuk-frontend/issues/2327#issuecomment-922957442\n *\n * @private\n * @returns {Element} DOM element\n */\n getButtonPunctuationEl() {\n const $punctuationEl = document.createElement('span')\n $punctuationEl.classList.add(\n 'govuk-visually-hidden',\n this.sectionHeadingDividerClass\n )\n $punctuationEl.textContent = ', '\n return $punctuationEl\n }\n\n /**\n * Name for the component used when initialising using data-module attributes.\n */\n static moduleName = 'govuk-accordion'\n\n /**\n * Accordion default config\n *\n * @see {@link AccordionConfig}\n * @constant\n * @type {AccordionConfig}\n */\n static defaults = Object.freeze({\n i18n: {\n hideAllSections: 'Hide all sections',\n hideSection: 'Hide',\n hideSectionAriaLabel: 'Hide this section',\n showAllSections: 'Show all sections',\n showSection: 'Show',\n showSectionAriaLabel: 'Show this section'\n },\n rememberExpanded: true\n })\n\n /**\n * Accordion config schema\n *\n * @constant\n * @satisfies {Schema<AccordionConfig>}\n */\n static schema = Object.freeze({\n properties: {\n i18n: { type: 'object' },\n rememberExpanded: { type: 'boolean' }\n }\n })\n}\n\n/**\n * Accordion config\n *\n * @see {@link Accordion.defaults}\n * @typedef {object} AccordionConfig\n * @property {AccordionTranslations} [i18n=Accordion.defaults.i18n] - Accordion translations\n * @property {boolean} [rememberExpanded] - Whether the expanded and collapsed\n * state of each section is remembered and restored when navigating.\n */\n\n/**\n * Accordion translations\n *\n * @see {@link Accordion.defaults.i18n}\n * @typedef {object} AccordionTranslations\n *\n * Messages used by the component for the labels of its buttons. This includes\n * the visible text shown on screen, and text to help assistive technology users\n * for the buttons toggling each section.\n * @property {string} [hideAllSections] - The text content for the 'Hide all\n * sections' button, used when at least one section is expanded.\n * @property {string} [hideSection] - The text content for the 'Hide'\n * button, used when a section is expanded.\n * @property {string} [hideSectionAriaLabel] - The text content appended to the\n * 'Hide' button's accessible name when a section is expanded.\n * @property {string} [showAllSections] - The text content for the 'Show all\n * sections' button, used when all sections are collapsed.\n * @property {string} [showSection] - The text content for the 'Show'\n * button, used when a section is collapsed.\n * @property {string} [showSectionAriaLabel] - The text content appended to the\n * 'Show' button's accessible name when a section is expanded.\n */\n\n/**\n * @import { Schema } from '../../common/configuration.mjs'\n */\n"],"names":["Accordion","ConfigurableComponent","constructor","$root","config","i18n","controlsClass","showAllClass","showAllTextClass","sectionClass","sectionExpandedClass","sectionButtonClass","sectionHeaderClass","sectionHeadingClass","sectionHeadingDividerClass","sectionHeadingTextClass","sectionHeadingTextFocusClass","sectionShowHideToggleClass","sectionShowHideToggleFocusClass","sectionShowHideTextClass","upChevronIconClass","downChevronIconClass","sectionSummaryClass","sectionSummaryFocusClass","sectionContentClass","$sections","$showAllButton","$showAllIcon","$showAllText","I18n","querySelectorAll","length","ElementError","component","identifier","initControls","initSectionHeaders","updateShowAllButton","areAllSectionsOpen","document","createElement","setAttribute","classList","add","appendChild","$accordionControls","insertBefore","firstChild","addEventListener","onShowOrHideAllToggle","event","onBeforeMatch","forEach","$section","i","$header","querySelector","constructHeaderMarkup","setExpanded","isExpanded","onSectionToggle","setInitialState","index","$span","$heading","$summary","$button","id","attr","Array","from","attributes","name","value","$headingText","$headingTextFocus","childNodes","$child","$showHideToggle","$showHideToggleFocus","$showHideText","$showHideIcon","getButtonPunctuationEl","$summarySpan","$summarySpanFocus","remove","removeChild","$fragment","target","Element","closest","nowExpanded","storeState","expanded","$content","newButtonText","t","textContent","ariaLabelParts","push","trim","ariaLabelMessage","join","removeAttribute","contains","every","toString","toggle","getIdentifier","getAttribute","rememberExpanded","window","sessionStorage","setItem","exception","state","getItem","$punctuationEl","moduleName","defaults","Object","freeze","hideAllSections","hideSection","hideSectionAriaLabel","showAllSections","showSection","showSectionAriaLabel","schema","properties","type"],"mappings":"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"}
@@ -36,6 +36,9 @@
36
36
  * @typedef ComponentWithModuleName
37
37
  * @property {string} moduleName - Name of the component
38
38
  */
39
+ /**
40
+ * @import { ObjectNested } from './configuration.mjs'
41
+ */
39
42
 
40
43
  class GOVUKFrontendError extends Error {
41
44
  constructor(...args) {
@@ -87,10 +90,10 @@
87
90
  }
88
91
  }
89
92
  /**
90
- * @typedef {import('../common/index.mjs').ComponentWithModuleName} ComponentWithModuleName
93
+ * @import { ComponentWithModuleName } from '../common/index.mjs'
91
94
  */
92
95
 
93
- class GOVUKFrontendComponent {
96
+ class Component {
94
97
  /**
95
98
  * Returns the root element of the component
96
99
  *
@@ -141,12 +144,12 @@
141
144
  */
142
145
 
143
146
  /**
144
- * @typedef {typeof GOVUKFrontendComponent & ChildClass} ChildClassConstructor
147
+ * @typedef {typeof Component & ChildClass} ChildClassConstructor
145
148
  */
146
- GOVUKFrontendComponent.elementType = HTMLElement;
149
+ Component.elementType = HTMLElement;
147
150
 
148
151
  const configOverride = Symbol.for('configOverride');
149
- class ConfigurableComponent extends GOVUKFrontendComponent {
152
+ class ConfigurableComponent extends Component {
150
153
  [configOverride](param) {
151
154
  return {};
152
155
  }
@@ -164,7 +167,7 @@
164
167
  super($root);
165
168
  this._config = void 0;
166
169
  const childConstructor = this.constructor;
167
- if (typeof childConstructor.defaults === 'undefined') {
170
+ if (!isObject(childConstructor.defaults)) {
168
171
  throw new ConfigError(formatErrorMessage(childConstructor, 'Config passed as parameter into constructor but no defaults defined'));
169
172
  }
170
173
  const datasetConfig = normaliseDataset(childConstructor, this._$root.dataset);
@@ -196,16 +199,19 @@
196
199
  return output;
197
200
  }
198
201
  function normaliseDataset(Component, dataset) {
199
- if (typeof Component.schema === 'undefined') {
202
+ if (!isObject(Component.schema)) {
200
203
  throw new ConfigError(formatErrorMessage(Component, 'Config passed as parameter into constructor but no schema defined'));
201
204
  }
202
205
  const out = {};
203
- for (const [field, property] of Object.entries(Component.schema.properties)) {
206
+ const entries = Object.entries(Component.schema.properties);
207
+ for (const entry of entries) {
208
+ const [namespace, property] = entry;
209
+ const field = namespace.toString();
204
210
  if (field in dataset) {
205
211
  out[field] = normaliseString(dataset[field], property);
206
212
  }
207
213
  if ((property == null ? void 0 : property.type) === 'object') {
208
- out[field] = extractConfigByNamespace(Component.schema, dataset, field);
214
+ out[field] = extractConfigByNamespace(Component.schema, dataset, namespace);
209
215
  }
210
216
  }
211
217
  return out;
@@ -231,13 +237,13 @@
231
237
  return;
232
238
  }
233
239
  const newObject = {
234
- [namespace]: ({})
240
+ [namespace]: {}
235
241
  };
236
242
  for (const [key, value] of Object.entries(dataset)) {
237
243
  let current = newObject;
238
244
  const keyParts = key.split('.');
239
245
  for (const [index, name] of keyParts.entries()) {
240
- if (typeof current === 'object') {
246
+ if (isObject(current)) {
241
247
  if (index < keyParts.length - 1) {
242
248
  if (!isObject(current[name])) {
243
249
  current[name] = {};
@@ -254,9 +260,10 @@
254
260
  /**
255
261
  * Schema for component config
256
262
  *
263
+ * @template {Partial<Record<keyof ConfigurationType, unknown>>} ConfigurationType
257
264
  * @typedef {object} Schema
258
- * @property {{ [field: string]: SchemaProperty | undefined }} properties - Schema properties
259
- * @property {SchemaCondition[]} [anyOf] - List of schema conditions
265
+ * @property {Record<keyof ConfigurationType, SchemaProperty | undefined>} properties - Schema properties
266
+ * @property {SchemaCondition<ConfigurationType>[]} [anyOf] - List of schema conditions
260
267
  */
261
268
  /**
262
269
  * Schema property for component config
@@ -267,20 +274,21 @@
267
274
  /**
268
275
  * Schema condition for component config
269
276
  *
277
+ * @template {Partial<Record<keyof ConfigurationType, unknown>>} ConfigurationType
270
278
  * @typedef {object} SchemaCondition
271
- * @property {string[]} required - List of required config fields
279
+ * @property {(keyof ConfigurationType)[]} required - List of required config fields
272
280
  * @property {string} errorMessage - Error message when required config fields not provided
273
281
  */
274
282
  /**
275
- * @template {ObjectNested} [ConfigurationType={}]
283
+ * @template {Partial<Record<keyof ConfigurationType, unknown>>} [ConfigurationType=ObjectNested]
276
284
  * @typedef ChildClass
277
285
  * @property {string} moduleName - The module name that'll be looked for in the DOM when initialising the component
278
- * @property {Schema} [schema] - The schema of the component configuration
286
+ * @property {Schema<ConfigurationType>} [schema] - The schema of the component configuration
279
287
  * @property {ConfigurationType} [defaults] - The default values of the configuration of the component
280
288
  */
281
289
  /**
282
- * @template {ObjectNested} [ConfigurationType={}]
283
- * @typedef {typeof GOVUKFrontendComponent & ChildClass<ConfigurationType>} ChildClassConstructor<ConfigurationType>
290
+ * @template {Partial<Record<keyof ConfigurationType, unknown>>} [ConfigurationType=ObjectNested]
291
+ * @typedef {typeof Component & ChildClass<ConfigurationType>} ChildClassConstructor<ConfigurationType>
284
292
  */
285
293
 
286
294
  const DEBOUNCE_TIMEOUT_IN_SECONDS = 1;
@@ -335,7 +343,7 @@
335
343
  */
336
344
 
337
345
  /**
338
- * @typedef {import('../../common/configuration.mjs').Schema} Schema
346
+ * @import { Schema } from '../../common/configuration.mjs'
339
347
  */
340
348
  Button.moduleName = 'govuk-button';
341
349
  Button.defaults = Object.freeze({
@@ -1 +1 @@
1
- {"version":3,"file":"button.bundle.js","sources":["../../../../src/govuk/common/index.mjs","../../../../src/govuk/errors/index.mjs","../../../../src/govuk/govuk-frontend-component.mjs","../../../../src/govuk/common/configuration.mjs","../../../../src/govuk/components/button/button.mjs"],"sourcesContent":["/**\n * Common helpers which do not require polyfill.\n *\n * IMPORTANT: If a helper require a polyfill, please isolate it in its own module\n * so that the polyfill can be properly tree-shaken and does not burden\n * the components that do not need that helper\n */\n\n/**\n * Get hash fragment from URL\n *\n * Extract the hash fragment (everything after the hash) from a URL,\n * but not including the hash symbol\n *\n * @private\n * @param {string} url - URL\n * @returns {string | undefined} Fragment from URL, without the hash\n */\nexport function getFragmentFromUrl(url) {\n if (!url.includes('#')) {\n return undefined\n }\n\n return url.split('#').pop()\n}\n\n/**\n * Get GOV.UK Frontend breakpoint value from CSS custom property\n *\n * @private\n * @param {string} name - Breakpoint name\n * @returns {{ property: string, value?: string }} Breakpoint object\n */\nexport function getBreakpoint(name) {\n const property = `--govuk-frontend-breakpoint-${name}`\n\n // Get value from `<html>` with breakpoints on CSS :root\n const value = window\n .getComputedStyle(document.documentElement)\n .getPropertyValue(property)\n\n return {\n property,\n value: value || undefined\n }\n}\n\n/**\n * Move focus to element\n *\n * Sets tabindex to -1 to make the element programmatically focusable,\n * but removes it on blur as the element doesn't need to be focused again.\n *\n * @private\n * @template {HTMLElement} FocusElement\n * @param {FocusElement} $element - HTML element\n * @param {object} [options] - Handler options\n * @param {function(this: FocusElement): void} [options.onBeforeFocus] - Callback before focus\n * @param {function(this: FocusElement): void} [options.onBlur] - Callback on blur\n */\nexport function setFocus($element, options = {}) {\n const isFocusable = $element.getAttribute('tabindex')\n\n if (!isFocusable) {\n $element.setAttribute('tabindex', '-1')\n }\n\n /**\n * Handle element focus\n */\n function onFocus() {\n $element.addEventListener('blur', onBlur, { once: true })\n }\n\n /**\n * Handle element blur\n */\n function onBlur() {\n options.onBlur?.call($element)\n\n if (!isFocusable) {\n $element.removeAttribute('tabindex')\n }\n }\n\n // Add listener to reset element on blur, after focus\n $element.addEventListener('focus', onFocus, { once: true })\n\n // Focus element\n options.onBeforeFocus?.call($element)\n $element.focus()\n}\n\n/**\n * Checks if component is already initialised\n *\n * @internal\n * @param {Element} $root - HTML element to be checked\n * @param {string} moduleName - name of component module\n * @returns {boolean} Whether component is already initialised\n */\nexport function isInitialised($root, moduleName) {\n return (\n $root instanceof HTMLElement &&\n $root.hasAttribute(`data-${moduleName}-init`)\n )\n}\n\n/**\n * Checks if GOV.UK Frontend is supported on this page\n *\n * Some browsers will load and run our JavaScript but GOV.UK Frontend\n * won't be supported.\n *\n * @param {HTMLElement | null} [$scope] - (internal) `<body>` HTML element checked for browser support\n * @returns {boolean} Whether GOV.UK Frontend is supported on this page\n */\nexport function isSupported($scope = document.body) {\n if (!$scope) {\n return false\n }\n\n return $scope.classList.contains('govuk-frontend-supported')\n}\n\n/**\n * Check for an array\n *\n * @internal\n * @param {unknown} option - Option to check\n * @returns {boolean} Whether the option is an array\n */\nfunction isArray(option) {\n return Array.isArray(option)\n}\n\n/**\n * Check for an object\n *\n * @internal\n * @param {unknown} option - Option to check\n * @returns {boolean} Whether the option is an object\n */\nexport function isObject(option) {\n return !!option && typeof option === 'object' && !isArray(option)\n}\n\n/**\n * Format error message\n *\n * @internal\n * @param {ComponentWithModuleName} Component - Component that threw the error\n * @param {string} message - Error message\n * @returns {string} - Formatted error message\n */\nexport function formatErrorMessage(Component, message) {\n return `${Component.moduleName}: ${message}`\n}\n\n/* eslint-disable jsdoc/valid-types --\n * `{new(...args: any[] ): object}` is not recognised as valid\n * https://github.com/gajus/eslint-plugin-jsdoc/issues/145#issuecomment-1308722878\n * https://github.com/jsdoc-type-pratt-parser/jsdoc-type-pratt-parser/issues/131\n **/\n\n/**\n * @typedef ComponentWithModuleName\n * @property {string} moduleName - Name of the component\n */\n\n/* eslint-enable jsdoc/valid-types */\n","import { formatErrorMessage } from '../common/index.mjs'\n\n/**\n * GOV.UK Frontend error\n *\n * A base class for `Error`s thrown by GOV.UK Frontend.\n *\n * It is meant to be extended into specific types of errors\n * to be thrown by our code.\n *\n * @example\n * ```js\n * class MissingRootError extends GOVUKFrontendError {\n * // Setting an explicit name is important as extending the class will not\n * // set a new `name` on the subclass. The `name` property is important\n * // to ensure intelligible error names even if the class name gets\n * // mangled by a minifier\n * name = \"MissingRootError\"\n * }\n * ```\n * @virtual\n */\nexport class GOVUKFrontendError extends Error {\n name = 'GOVUKFrontendError'\n}\n\n/**\n * Indicates that GOV.UK Frontend is not supported\n */\nexport class SupportError extends GOVUKFrontendError {\n name = 'SupportError'\n\n /**\n * Checks if GOV.UK Frontend is supported on this page\n *\n * @param {HTMLElement | null} [$scope] - HTML element `<body>` checked for browser support\n */\n constructor($scope = document.body) {\n const supportMessage =\n 'noModule' in HTMLScriptElement.prototype\n ? 'GOV.UK Frontend initialised without `<body class=\"govuk-frontend-supported\">` from template `<script>` snippet'\n : 'GOV.UK Frontend is not supported in this browser'\n\n super(\n $scope\n ? supportMessage\n : 'GOV.UK Frontend initialised without `<script type=\"module\">`'\n )\n }\n}\n\n/**\n * Indicates that a component has received an illegal configuration\n */\nexport class ConfigError extends GOVUKFrontendError {\n name = 'ConfigError'\n}\n\n/**\n * Indicates an issue with an element (possibly `null` or `undefined`)\n */\nexport class ElementError extends GOVUKFrontendError {\n name = 'ElementError'\n\n /**\n * @internal\n * @overload\n * @param {string} message - Element error message\n */\n\n /**\n * @internal\n * @overload\n * @param {ElementErrorOptions} options - Element error options\n */\n\n /**\n * @internal\n * @param {string | ElementErrorOptions} messageOrOptions - Element error message or options\n */\n constructor(messageOrOptions) {\n let message = typeof messageOrOptions === 'string' ? messageOrOptions : ''\n\n // Build message from options\n if (typeof messageOrOptions === 'object') {\n const { component, identifier, element, expectedType } = messageOrOptions\n\n message = identifier\n\n // Append reason\n message += element\n ? ` is not of type ${expectedType ?? 'HTMLElement'}`\n : ' not found'\n\n message = formatErrorMessage(component, message)\n }\n\n super(message)\n }\n}\n\n/**\n * Indicates that a component is already initialised\n */\nexport class InitError extends GOVUKFrontendError {\n name = 'InitError'\n\n /**\n * @internal\n * @param {ComponentWithModuleName | string} componentOrMessage - name of the component module\n */\n constructor(componentOrMessage) {\n const message =\n typeof componentOrMessage === 'string'\n ? componentOrMessage\n : formatErrorMessage(\n componentOrMessage,\n `Root element (\\`$root\\`) already initialised`\n )\n\n super(message)\n }\n}\n\n/**\n * Element error options\n *\n * @internal\n * @typedef {object} ElementErrorOptions\n * @property {string} identifier - An identifier that'll let the user understand which element has an error. This is whatever makes the most sense\n * @property {Element | null} [element] - The element in error\n * @property {string} [expectedType] - The type that was expected for the identifier\n * @property {ComponentWithModuleName} component - Component throwing the error\n */\n\n/**\n * @typedef {import('../common/index.mjs').ComponentWithModuleName} ComponentWithModuleName\n */\n","import { isInitialised, isSupported } from './common/index.mjs'\nimport { ElementError, InitError, SupportError } from './errors/index.mjs'\n\n/**\n * Base Component class\n *\n * Centralises the behaviours shared by our components\n *\n * @virtual\n * @template {Element} [RootElementType=HTMLElement]\n */\nexport class GOVUKFrontendComponent {\n /**\n * @type {typeof Element}\n */\n static elementType = HTMLElement\n\n // allows Typescript user to work around the lack of types\n // in GOVUKFrontend package, Typescript is not aware of $root\n // in components that extend GOVUKFrontendComponent\n /**\n * Returns the root element of the component\n *\n * @protected\n * @returns {RootElementType} - the root element of component\n */\n get $root() {\n return this._$root\n }\n\n /**\n * @protected\n * @type {RootElementType}\n */\n _$root\n\n /**\n * Constructs a new component, validating that GOV.UK Frontend is supported\n *\n * @internal\n * @param {Element | null} [$root] - HTML element to use for component\n */\n constructor($root) {\n const childConstructor = /** @type {ChildClassConstructor} */ (\n this.constructor\n )\n\n // TypeScript does not enforce that inheriting classes will define a `moduleName`\n // (even if we add a `@virtual` `static moduleName` property to this class).\n // While we trust users to do this correctly, we do a little check to provide them\n // a helpful error message.\n //\n // After this, we'll be sure that `childConstructor` has a `moduleName`\n // as expected of the `ChildClassConstructor` we've cast `this.constructor` to.\n if (typeof childConstructor.moduleName !== 'string') {\n throw new InitError(`\\`moduleName\\` not defined in component`)\n }\n\n if (!($root instanceof childConstructor.elementType)) {\n throw new ElementError({\n element: $root,\n component: childConstructor,\n identifier: 'Root element (`$root`)',\n expectedType: childConstructor.elementType.name\n })\n } else {\n this._$root = /** @type {RootElementType} */ ($root)\n }\n\n childConstructor.checkSupport()\n\n this.checkInitialised()\n\n const moduleName = childConstructor.moduleName\n\n this.$root.setAttribute(`data-${moduleName}-init`, '')\n }\n\n /**\n * Validates whether component is already initialised\n *\n * @private\n * @throws {InitError} when component is already initialised\n */\n checkInitialised() {\n const constructor = /** @type {ChildClassConstructor} */ (this.constructor)\n const moduleName = constructor.moduleName\n\n if (moduleName && isInitialised(this.$root, moduleName)) {\n throw new InitError(constructor)\n }\n }\n\n /**\n * Validates whether components are supported\n *\n * @throws {SupportError} when the components are not supported\n */\n static checkSupport() {\n if (!isSupported()) {\n throw new SupportError()\n }\n }\n}\n\n/**\n * @typedef ChildClass\n * @property {string} moduleName - The module name that'll be looked for in the DOM when initialising the component\n */\n\n/**\n * @typedef {typeof GOVUKFrontendComponent & ChildClass} ChildClassConstructor\n */\n","import { ConfigError } from '../errors/index.mjs'\nimport { GOVUKFrontendComponent } from '../govuk-frontend-component.mjs'\n\nimport { isObject, formatErrorMessage } from './index.mjs'\n\nexport const configOverride = Symbol.for('configOverride')\n\n/**\n * Base Component class\n *\n * Centralises the behaviours shared by our components\n *\n * @virtual\n * @template {ObjectNested} [ConfigurationType={}]\n * @template {Element & { dataset: DOMStringMap }} [RootElementType=HTMLElement]\n * @augments GOVUKFrontendComponent<RootElementType>\n */\nexport class ConfigurableComponent extends GOVUKFrontendComponent {\n /**\n * configOverride\n *\n * Function which defines configuration overrides to prioritize\n * properties from the root element's dataset.\n *\n * It should take a subset of configuration as input and return\n * a new configuration object with properties that should be\n * overridden based on the root element's dataset. A Symbol\n * is used for indexing to prevent conflicts.\n *\n * @internal\n * @virtual\n * @param {ObjectNested} [param] - Configuration object\n * @returns {ObjectNested} return - Configuration object\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n [configOverride](param) {\n return {}\n }\n\n /**\n * Returns the root element of the component\n *\n * @protected\n * @returns {ConfigurationType} - the root element of component\n */\n get config() {\n return this._config\n }\n\n /**\n *\n * @type {ConfigurationType}\n */\n _config\n\n /**\n * Constructs a new component, validating that GOV.UK Frontend is supported\n *\n * @internal\n * @param {Element | null} [$root] - HTML element to use for component\n * @param {ConfigurationType} [config] - HTML element to use for component\n */\n constructor($root, config) {\n super($root)\n\n const childConstructor =\n /** @type {ChildClassConstructor<ConfigurationType>} */ (this.constructor)\n\n if (typeof childConstructor.defaults === 'undefined') {\n throw new ConfigError(\n formatErrorMessage(\n childConstructor,\n 'Config passed as parameter into constructor but no defaults defined'\n )\n )\n }\n\n const datasetConfig = /** @type {ConfigurationType} */ (\n normaliseDataset(childConstructor, this._$root.dataset)\n )\n\n this._config = /** @type {ConfigurationType} */ (\n mergeConfigs(\n childConstructor.defaults,\n config ?? {},\n this[configOverride](datasetConfig),\n datasetConfig\n )\n )\n }\n}\n\n/**\n * Normalise string\n *\n * 'If it looks like a duck, and it quacks like a duck…' 🦆\n *\n * If the passed value looks like a boolean or a number, convert it to a boolean\n * or number.\n *\n * Designed to be used to convert config passed via data attributes (which are\n * always strings) into something sensible.\n *\n * @internal\n * @param {DOMStringMap[string]} value - The value to normalise\n * @param {SchemaProperty} [property] - Component schema property\n * @returns {string | boolean | number | undefined} Normalised data\n */\nexport function normaliseString(value, property) {\n const trimmedValue = value ? value.trim() : ''\n\n let output\n let outputType = property?.type\n\n // No schema type set? Determine automatically\n if (!outputType) {\n if (['true', 'false'].includes(trimmedValue)) {\n outputType = 'boolean'\n }\n\n // Empty / whitespace-only strings are considered finite so we need to check\n // the length of the trimmed string as well\n if (trimmedValue.length > 0 && isFinite(Number(trimmedValue))) {\n outputType = 'number'\n }\n }\n\n switch (outputType) {\n case 'boolean':\n output = trimmedValue === 'true'\n break\n\n case 'number':\n output = Number(trimmedValue)\n break\n\n default:\n output = value\n }\n\n return output\n}\n\n/**\n * Normalise dataset\n *\n * Loop over an object and normalise each value using {@link normaliseString},\n * optionally expanding nested `i18n.field`\n *\n * @internal\n * @param {{ schema?: Schema, moduleName: string }} Component - Component class\n * @param {DOMStringMap} dataset - HTML element dataset\n * @returns {ObjectNested} Normalised dataset\n */\nexport function normaliseDataset(Component, dataset) {\n if (typeof Component.schema === 'undefined') {\n throw new ConfigError(\n formatErrorMessage(\n Component,\n 'Config passed as parameter into constructor but no schema defined'\n )\n )\n }\n\n const out = /** @type {ReturnType<typeof normaliseDataset>} */ ({})\n\n // Normalise top-level dataset ('data-*') values using schema types\n for (const [field, property] of Object.entries(Component.schema.properties)) {\n if (field in dataset) {\n out[field] = normaliseString(dataset[field], property)\n }\n\n /**\n * Extract and normalise nested object values automatically using\n * {@link normaliseString} but only schema object types are allowed\n */\n if (property?.type === 'object') {\n out[field] = extractConfigByNamespace(Component.schema, dataset, field)\n }\n }\n\n return out\n}\n\n/**\n * Config merging function\n *\n * Takes any number of objects and combines them together, with\n * greatest priority on the LAST item passed in.\n *\n * @internal\n * @param {...{ [key: string]: unknown }} configObjects - Config objects to merge\n * @returns {{ [key: string]: unknown }} A merged config object\n */\nexport function mergeConfigs(...configObjects) {\n // Start with an empty object as our base\n /** @type {{ [key: string]: unknown }} */\n const formattedConfigObject = {}\n\n // Loop through each of the passed objects\n for (const configObject of configObjects) {\n for (const key of Object.keys(configObject)) {\n const option = formattedConfigObject[key]\n const override = configObject[key]\n\n // Push their keys one-by-one into formattedConfigObject. Any duplicate\n // keys with object values will be merged, otherwise the new value will\n // override the existing value.\n if (isObject(option) && isObject(override)) {\n // @ts-expect-error Index signature for type 'string' is missing\n formattedConfigObject[key] = mergeConfigs(option, override)\n } else {\n // Apply override\n formattedConfigObject[key] = override\n }\n }\n }\n\n return formattedConfigObject\n}\n\n/**\n * Validate component config by schema\n *\n * Follows limited examples in JSON schema for wider support in future\n *\n * {@link https://ajv.js.org/json-schema.html#compound-keywords}\n * {@link https://ajv.js.org/packages/ajv-errors.html#single-message}\n *\n * @internal\n * @param {Schema} schema - Config schema\n * @param {{ [key: string]: unknown }} config - Component config\n * @returns {string[]} List of validation errors\n */\nexport function validateConfig(schema, config) {\n const validationErrors = []\n\n // Check errors for each schema\n for (const [name, conditions] of Object.entries(schema)) {\n const errors = []\n\n // Check errors for each schema condition\n if (Array.isArray(conditions)) {\n for (const { required, errorMessage } of conditions) {\n if (!required.every((key) => !!config[key])) {\n errors.push(errorMessage) // Missing config key value\n }\n }\n\n // Check one condition passes or add errors\n if (name === 'anyOf' && !(conditions.length - errors.length >= 1)) {\n validationErrors.push(...errors)\n }\n }\n }\n\n return validationErrors\n}\n\n/**\n * Extracts keys starting with a particular namespace from dataset ('data-*')\n * object, removing the namespace in the process, normalising all values\n *\n * @internal\n * @param {Schema} schema - The schema of a component\n * @param {DOMStringMap} dataset - The object to extract key-value pairs from\n * @param {string} namespace - The namespace to filter keys with\n * @returns {ObjectNested | undefined} Nested object with dot-separated key namespace removed\n */\nexport function extractConfigByNamespace(schema, dataset, namespace) {\n const property = schema.properties[namespace]\n\n // Only extract configs for object schema properties\n if (property?.type !== 'object') {\n return\n }\n\n // Add default empty config\n const newObject = {\n [namespace]: /** @type {ObjectNested} */ ({})\n }\n\n for (const [key, value] of Object.entries(dataset)) {\n /** @type {ObjectNested | ObjectNested[NestedKey]} */\n let current = newObject\n\n // Split the key into parts, using . as our namespace separator\n const keyParts = key.split('.')\n\n /**\n * Create new level per part\n *\n * e.g. 'i18n.textareaDescription.other' becomes\n * `{ i18n: { textareaDescription: { other } } }`\n */\n for (const [index, name] of keyParts.entries()) {\n if (typeof current === 'object') {\n // Drop down to nested object until the last part\n if (index < keyParts.length - 1) {\n // New nested object (optionally) replaces existing value\n if (!isObject(current[name])) {\n current[name] = {}\n }\n\n // Drop down into new or existing nested object\n current = current[name]\n } else if (key !== namespace) {\n // Normalised value (optionally) replaces existing value\n current[name] = normaliseString(value)\n }\n }\n }\n }\n\n return newObject[namespace]\n}\n\n/**\n * @internal\n * @typedef {keyof ObjectNested} NestedKey\n * @typedef {{ [key: string]: string | boolean | number | ObjectNested | undefined }} ObjectNested\n */\n\n/**\n * Schema for component config\n *\n * @typedef {object} Schema\n * @property {{ [field: string]: SchemaProperty | undefined }} properties - Schema properties\n * @property {SchemaCondition[]} [anyOf] - List of schema conditions\n */\n\n/**\n * Schema property for component config\n *\n * @typedef {object} SchemaProperty\n * @property {'string' | 'boolean' | 'number' | 'object'} type - Property type\n */\n\n/**\n * Schema condition for component config\n *\n * @typedef {object} SchemaCondition\n * @property {string[]} required - List of required config fields\n * @property {string} errorMessage - Error message when required config fields not provided\n */\n\n/**\n * @template {ObjectNested} [ConfigurationType={}]\n * @typedef ChildClass\n * @property {string} moduleName - The module name that'll be looked for in the DOM when initialising the component\n * @property {Schema} [schema] - The schema of the component configuration\n * @property {ConfigurationType} [defaults] - The default values of the configuration of the component\n */\n\n/**\n * @template {ObjectNested} [ConfigurationType={}]\n * @typedef {typeof GOVUKFrontendComponent & ChildClass<ConfigurationType>} ChildClassConstructor<ConfigurationType>\n */\n","import { ConfigurableComponent } from '../../common/configuration.mjs'\n\nconst DEBOUNCE_TIMEOUT_IN_SECONDS = 1\n\n/**\n * JavaScript enhancements for the Button component\n *\n * @preserve\n * @augments ConfigurableComponent<ButtonConfig>\n */\nexport class Button extends ConfigurableComponent {\n /**\n * @private\n * @type {number | null}\n */\n debounceFormSubmitTimer = null\n\n /**\n * @param {Element | null} $root - HTML element to use for button\n * @param {ButtonConfig} [config] - Button config\n */\n constructor($root, config = {}) {\n super($root, config)\n\n this.$root.addEventListener('keydown', (event) => this.handleKeyDown(event))\n this.$root.addEventListener('click', (event) => this.debounce(event))\n }\n\n /**\n * Trigger a click event when the space key is pressed\n *\n * Some screen readers tell users they can use the space bar to activate\n * things with the 'button' role, so we need to match the functionality of\n * native HTML buttons.\n *\n * See https://github.com/alphagov/govuk_elements/pull/272#issuecomment-233028270\n *\n * @private\n * @param {KeyboardEvent} event - Keydown event\n */\n handleKeyDown(event) {\n const $target = event.target\n\n // Handle space bar only\n if (event.key !== ' ') {\n return\n }\n\n // Handle elements with [role=\"button\"] only\n if (\n $target instanceof HTMLElement &&\n $target.getAttribute('role') === 'button'\n ) {\n event.preventDefault() // prevent the page from scrolling\n $target.click()\n }\n }\n\n /**\n * Debounce double-clicks\n *\n * If the click quickly succeeds a previous click then nothing will happen.\n * This stops people accidentally causing multiple form submissions by double\n * clicking buttons.\n *\n * @private\n * @param {MouseEvent} event - Mouse click event\n * @returns {undefined | false} Returns undefined, or false when debounced\n */\n debounce(event) {\n // Check the button that was clicked has preventDoubleClick enabled\n if (!this.config.preventDoubleClick) {\n return\n }\n\n // If the timer is still running, prevent the click from submitting the form\n if (this.debounceFormSubmitTimer) {\n event.preventDefault()\n return false\n }\n\n this.debounceFormSubmitTimer = window.setTimeout(() => {\n this.debounceFormSubmitTimer = null\n }, DEBOUNCE_TIMEOUT_IN_SECONDS * 1000)\n }\n\n /**\n * Name for the component used when initialising using data-module attributes.\n */\n static moduleName = 'govuk-button'\n\n /**\n * Button default config\n *\n * @see {@link ButtonConfig}\n * @constant\n * @type {ButtonConfig}\n */\n static defaults = Object.freeze({\n preventDoubleClick: false\n })\n\n /**\n * Button config schema\n *\n * @constant\n * @satisfies {Schema}\n */\n static schema = Object.freeze({\n properties: {\n preventDoubleClick: { type: 'boolean' }\n }\n })\n}\n\n/**\n * Button config\n *\n * @typedef {object} ButtonConfig\n * @property {boolean} [preventDoubleClick=false] - Prevent accidental double\n * clicks on submit buttons from submitting forms multiple times.\n */\n\n/**\n * @typedef {import('../../common/configuration.mjs').Schema} Schema\n */\n"],"names":["isInitialised","$root","moduleName","HTMLElement","hasAttribute","isSupported","$scope","document","body","classList","contains","isArray","option","Array","isObject","formatErrorMessage","Component","message","GOVUKFrontendError","Error","constructor","args","name","SupportError","supportMessage","HTMLScriptElement","prototype","ConfigError","ElementError","messageOrOptions","component","identifier","element","expectedType","InitError","componentOrMessage","GOVUKFrontendComponent","_$root","childConstructor","elementType","checkSupport","checkInitialised","setAttribute","configOverride","Symbol","for","ConfigurableComponent","param","config","_config","defaults","datasetConfig","normaliseDataset","dataset","mergeConfigs","normaliseString","value","property","trimmedValue","trim","output","outputType","type","includes","length","isFinite","Number","schema","out","field","Object","entries","properties","extractConfigByNamespace","configObjects","formattedConfigObject","configObject","key","keys","override","namespace","newObject","current","keyParts","split","index","DEBOUNCE_TIMEOUT_IN_SECONDS","Button","debounceFormSubmitTimer","addEventListener","event","handleKeyDown","debounce","$target","target","getAttribute","preventDefault","click","preventDoubleClick","window","setTimeout","freeze"],"mappings":"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"}
1
+ {"version":3,"file":"button.bundle.js","sources":["../../../../src/govuk/common/index.mjs","../../../../src/govuk/errors/index.mjs","../../../../src/govuk/component.mjs","../../../../src/govuk/common/configuration.mjs","../../../../src/govuk/components/button/button.mjs"],"sourcesContent":["/**\n * Common helpers which do not require polyfill.\n *\n * IMPORTANT: If a helper require a polyfill, please isolate it in its own module\n * so that the polyfill can be properly tree-shaken and does not burden\n * the components that do not need that helper\n */\n\n/**\n * Get hash fragment from URL\n *\n * Extract the hash fragment (everything after the hash) from a URL,\n * but not including the hash symbol\n *\n * @private\n * @param {string} url - URL\n * @returns {string | undefined} Fragment from URL, without the hash\n */\nexport function getFragmentFromUrl(url) {\n if (!url.includes('#')) {\n return undefined\n }\n\n return url.split('#').pop()\n}\n\n/**\n * Get GOV.UK Frontend breakpoint value from CSS custom property\n *\n * @private\n * @param {string} name - Breakpoint name\n * @returns {{ property: string, value?: string }} Breakpoint object\n */\nexport function getBreakpoint(name) {\n const property = `--govuk-frontend-breakpoint-${name}`\n\n // Get value from `<html>` with breakpoints on CSS :root\n const value = window\n .getComputedStyle(document.documentElement)\n .getPropertyValue(property)\n\n return {\n property,\n value: value || undefined\n }\n}\n\n/**\n * Move focus to element\n *\n * Sets tabindex to -1 to make the element programmatically focusable,\n * but removes it on blur as the element doesn't need to be focused again.\n *\n * @private\n * @template {HTMLElement} FocusElement\n * @param {FocusElement} $element - HTML element\n * @param {object} [options] - Handler options\n * @param {function(this: FocusElement): void} [options.onBeforeFocus] - Callback before focus\n * @param {function(this: FocusElement): void} [options.onBlur] - Callback on blur\n */\nexport function setFocus($element, options = {}) {\n const isFocusable = $element.getAttribute('tabindex')\n\n if (!isFocusable) {\n $element.setAttribute('tabindex', '-1')\n }\n\n /**\n * Handle element focus\n */\n function onFocus() {\n $element.addEventListener('blur', onBlur, { once: true })\n }\n\n /**\n * Handle element blur\n */\n function onBlur() {\n options.onBlur?.call($element)\n\n if (!isFocusable) {\n $element.removeAttribute('tabindex')\n }\n }\n\n // Add listener to reset element on blur, after focus\n $element.addEventListener('focus', onFocus, { once: true })\n\n // Focus element\n options.onBeforeFocus?.call($element)\n $element.focus()\n}\n\n/**\n * Checks if component is already initialised\n *\n * @internal\n * @param {Element} $root - HTML element to be checked\n * @param {string} moduleName - name of component module\n * @returns {boolean} Whether component is already initialised\n */\nexport function isInitialised($root, moduleName) {\n return (\n $root instanceof HTMLElement &&\n $root.hasAttribute(`data-${moduleName}-init`)\n )\n}\n\n/**\n * Checks if GOV.UK Frontend is supported on this page\n *\n * Some browsers will load and run our JavaScript but GOV.UK Frontend\n * won't be supported.\n *\n * @param {HTMLElement | null} [$scope] - (internal) `<body>` HTML element checked for browser support\n * @returns {boolean} Whether GOV.UK Frontend is supported on this page\n */\nexport function isSupported($scope = document.body) {\n if (!$scope) {\n return false\n }\n\n return $scope.classList.contains('govuk-frontend-supported')\n}\n\n/**\n * Check for an array\n *\n * @internal\n * @param {unknown} option - Option to check\n * @returns {boolean} Whether the option is an array\n */\nfunction isArray(option) {\n return Array.isArray(option)\n}\n\n/**\n * Check for an object\n *\n * @internal\n * @template {Partial<Record<keyof ObjectType, unknown>>} [ObjectType=ObjectNested]\n * @param {unknown | ObjectType} option - Option to check\n * @returns {option is ObjectType} Whether the option is an object\n */\nexport function isObject(option) {\n return !!option && typeof option === 'object' && !isArray(option)\n}\n\n/**\n * Format error message\n *\n * @internal\n * @param {ComponentWithModuleName} Component - Component that threw the error\n * @param {string} message - Error message\n * @returns {string} - Formatted error message\n */\nexport function formatErrorMessage(Component, message) {\n return `${Component.moduleName}: ${message}`\n}\n\n/* eslint-disable jsdoc/valid-types --\n * `{new(...args: any[] ): object}` is not recognised as valid\n * https://github.com/gajus/eslint-plugin-jsdoc/issues/145#issuecomment-1308722878\n * https://github.com/jsdoc-type-pratt-parser/jsdoc-type-pratt-parser/issues/131\n **/\n\n/**\n * @typedef ComponentWithModuleName\n * @property {string} moduleName - Name of the component\n */\n\n/* eslint-enable jsdoc/valid-types */\n\n/**\n * @import { ObjectNested } from './configuration.mjs'\n */\n","import { formatErrorMessage } from '../common/index.mjs'\n\n/**\n * GOV.UK Frontend error\n *\n * A base class for `Error`s thrown by GOV.UK Frontend.\n *\n * It is meant to be extended into specific types of errors\n * to be thrown by our code.\n *\n * @example\n * ```js\n * class MissingRootError extends GOVUKFrontendError {\n * // Setting an explicit name is important as extending the class will not\n * // set a new `name` on the subclass. The `name` property is important\n * // to ensure intelligible error names even if the class name gets\n * // mangled by a minifier\n * name = \"MissingRootError\"\n * }\n * ```\n * @virtual\n */\nexport class GOVUKFrontendError extends Error {\n name = 'GOVUKFrontendError'\n}\n\n/**\n * Indicates that GOV.UK Frontend is not supported\n */\nexport class SupportError extends GOVUKFrontendError {\n name = 'SupportError'\n\n /**\n * Checks if GOV.UK Frontend is supported on this page\n *\n * @param {HTMLElement | null} [$scope] - HTML element `<body>` checked for browser support\n */\n constructor($scope = document.body) {\n const supportMessage =\n 'noModule' in HTMLScriptElement.prototype\n ? 'GOV.UK Frontend initialised without `<body class=\"govuk-frontend-supported\">` from template `<script>` snippet'\n : 'GOV.UK Frontend is not supported in this browser'\n\n super(\n $scope\n ? supportMessage\n : 'GOV.UK Frontend initialised without `<script type=\"module\">`'\n )\n }\n}\n\n/**\n * Indicates that a component has received an illegal configuration\n */\nexport class ConfigError extends GOVUKFrontendError {\n name = 'ConfigError'\n}\n\n/**\n * Indicates an issue with an element (possibly `null` or `undefined`)\n */\nexport class ElementError extends GOVUKFrontendError {\n name = 'ElementError'\n\n /**\n * @internal\n * @overload\n * @param {string} message - Element error message\n */\n\n /**\n * @internal\n * @overload\n * @param {ElementErrorOptions} options - Element error options\n */\n\n /**\n * @internal\n * @param {string | ElementErrorOptions} messageOrOptions - Element error message or options\n */\n constructor(messageOrOptions) {\n let message = typeof messageOrOptions === 'string' ? messageOrOptions : ''\n\n // Build message from options\n if (typeof messageOrOptions === 'object') {\n const { component, identifier, element, expectedType } = messageOrOptions\n\n message = identifier\n\n // Append reason\n message += element\n ? ` is not of type ${expectedType ?? 'HTMLElement'}`\n : ' not found'\n\n message = formatErrorMessage(component, message)\n }\n\n super(message)\n }\n}\n\n/**\n * Indicates that a component is already initialised\n */\nexport class InitError extends GOVUKFrontendError {\n name = 'InitError'\n\n /**\n * @internal\n * @param {ComponentWithModuleName | string} componentOrMessage - name of the component module\n */\n constructor(componentOrMessage) {\n const message =\n typeof componentOrMessage === 'string'\n ? componentOrMessage\n : formatErrorMessage(\n componentOrMessage,\n `Root element (\\`$root\\`) already initialised`\n )\n\n super(message)\n }\n}\n\n/**\n * Element error options\n *\n * @internal\n * @typedef {object} ElementErrorOptions\n * @property {string} identifier - An identifier that'll let the user understand which element has an error. This is whatever makes the most sense\n * @property {Element | null} [element] - The element in error\n * @property {string} [expectedType] - The type that was expected for the identifier\n * @property {ComponentWithModuleName} component - Component throwing the error\n */\n\n/**\n * @import { ComponentWithModuleName } from '../common/index.mjs'\n */\n","import { isInitialised, isSupported } from './common/index.mjs'\nimport { ElementError, InitError, SupportError } from './errors/index.mjs'\n\n/**\n * Base Component class\n *\n * Centralises the behaviours shared by our components\n *\n * @virtual\n * @template {Element} [RootElementType=HTMLElement]\n */\nexport class Component {\n /**\n * @type {typeof Element}\n */\n static elementType = HTMLElement\n\n // allows Typescript user to work around the lack of types\n // in GOVUKFrontend package, Typescript is not aware of $root\n // in components that extend GOVUKFrontendComponent\n /**\n * Returns the root element of the component\n *\n * @protected\n * @returns {RootElementType} - the root element of component\n */\n get $root() {\n return this._$root\n }\n\n /**\n * @protected\n * @type {RootElementType}\n */\n _$root\n\n /**\n * Constructs a new component, validating that GOV.UK Frontend is supported\n *\n * @internal\n * @param {Element | null} [$root] - HTML element to use for component\n */\n constructor($root) {\n const childConstructor = /** @type {ChildClassConstructor} */ (\n this.constructor\n )\n\n // TypeScript does not enforce that inheriting classes will define a `moduleName`\n // (even if we add a `@virtual` `static moduleName` property to this class).\n // While we trust users to do this correctly, we do a little check to provide them\n // a helpful error message.\n //\n // After this, we'll be sure that `childConstructor` has a `moduleName`\n // as expected of the `ChildClassConstructor` we've cast `this.constructor` to.\n if (typeof childConstructor.moduleName !== 'string') {\n throw new InitError(`\\`moduleName\\` not defined in component`)\n }\n\n if (!($root instanceof childConstructor.elementType)) {\n throw new ElementError({\n element: $root,\n component: childConstructor,\n identifier: 'Root element (`$root`)',\n expectedType: childConstructor.elementType.name\n })\n } else {\n this._$root = /** @type {RootElementType} */ ($root)\n }\n\n childConstructor.checkSupport()\n\n this.checkInitialised()\n\n const moduleName = childConstructor.moduleName\n\n this.$root.setAttribute(`data-${moduleName}-init`, '')\n }\n\n /**\n * Validates whether component is already initialised\n *\n * @private\n * @throws {InitError} when component is already initialised\n */\n checkInitialised() {\n const constructor = /** @type {ChildClassConstructor} */ (this.constructor)\n const moduleName = constructor.moduleName\n\n if (moduleName && isInitialised(this.$root, moduleName)) {\n throw new InitError(constructor)\n }\n }\n\n /**\n * Validates whether components are supported\n *\n * @throws {SupportError} when the components are not supported\n */\n static checkSupport() {\n if (!isSupported()) {\n throw new SupportError()\n }\n }\n}\n\n/**\n * @typedef ChildClass\n * @property {string} moduleName - The module name that'll be looked for in the DOM when initialising the component\n */\n\n/**\n * @typedef {typeof Component & ChildClass} ChildClassConstructor\n */\n","import { Component } from '../component.mjs'\nimport { ConfigError } from '../errors/index.mjs'\n\nimport { isObject, formatErrorMessage } from './index.mjs'\n\nexport const configOverride = Symbol.for('configOverride')\n\n/**\n * Base Component class\n *\n * Centralises the behaviours shared by our components\n *\n * @virtual\n * @template {Partial<Record<keyof ConfigurationType, unknown>>} [ConfigurationType=ObjectNested]\n * @template {Element & { dataset: DOMStringMap }} [RootElementType=HTMLElement]\n * @augments Component<RootElementType>\n */\nexport class ConfigurableComponent extends Component {\n /**\n * configOverride\n *\n * Function which defines configuration overrides to prioritize\n * properties from the root element's dataset.\n *\n * It should take a subset of configuration as input and return\n * a new configuration object with properties that should be\n * overridden based on the root element's dataset. A Symbol\n * is used for indexing to prevent conflicts.\n *\n * @internal\n * @virtual\n * @param {Partial<ConfigurationType>} [param] - Configuration object\n * @returns {Partial<ConfigurationType>} return - Configuration object\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n [configOverride](param) {\n return {}\n }\n\n /**\n * Returns the root element of the component\n *\n * @protected\n * @returns {ConfigurationType} - the root element of component\n */\n get config() {\n return this._config\n }\n\n /**\n *\n * @type {ConfigurationType}\n */\n _config\n\n /**\n * Constructs a new component, validating that GOV.UK Frontend is supported\n *\n * @internal\n * @param {Element | null} [$root] - HTML element to use for component\n * @param {ConfigurationType} [config] - HTML element to use for component\n */\n constructor($root, config) {\n super($root)\n\n const childConstructor =\n /** @type {ChildClassConstructor<ConfigurationType>} */ (this.constructor)\n\n if (!isObject(childConstructor.defaults)) {\n throw new ConfigError(\n formatErrorMessage(\n childConstructor,\n 'Config passed as parameter into constructor but no defaults defined'\n )\n )\n }\n\n const datasetConfig = /** @type {ConfigurationType} */ (\n normaliseDataset(childConstructor, this._$root.dataset)\n )\n\n this._config = /** @type {ConfigurationType} */ (\n mergeConfigs(\n childConstructor.defaults,\n config ?? {},\n this[configOverride](datasetConfig),\n datasetConfig\n )\n )\n }\n}\n\n/**\n * Normalise string\n *\n * 'If it looks like a duck, and it quacks like a duck…' 🦆\n *\n * If the passed value looks like a boolean or a number, convert it to a boolean\n * or number.\n *\n * Designed to be used to convert config passed via data attributes (which are\n * always strings) into something sensible.\n *\n * @internal\n * @param {DOMStringMap[string]} value - The value to normalise\n * @param {SchemaProperty} [property] - Component schema property\n * @returns {string | boolean | number | undefined} Normalised data\n */\nexport function normaliseString(value, property) {\n const trimmedValue = value ? value.trim() : ''\n\n let output\n let outputType = property?.type\n\n // No schema type set? Determine automatically\n if (!outputType) {\n if (['true', 'false'].includes(trimmedValue)) {\n outputType = 'boolean'\n }\n\n // Empty / whitespace-only strings are considered finite so we need to check\n // the length of the trimmed string as well\n if (trimmedValue.length > 0 && isFinite(Number(trimmedValue))) {\n outputType = 'number'\n }\n }\n\n switch (outputType) {\n case 'boolean':\n output = trimmedValue === 'true'\n break\n\n case 'number':\n output = Number(trimmedValue)\n break\n\n default:\n output = value\n }\n\n return output\n}\n\n/**\n * Normalise dataset\n *\n * Loop over an object and normalise each value using {@link normaliseString},\n * optionally expanding nested `i18n.field`\n *\n * @internal\n * @template {Partial<Record<keyof ConfigurationType, unknown>>} ConfigurationType\n * @template {[keyof ConfigurationType, SchemaProperty | undefined][]} SchemaEntryType\n * @param {{ schema?: Schema<ConfigurationType>, moduleName: string }} Component - Component class\n * @param {DOMStringMap} dataset - HTML element dataset\n * @returns {ObjectNested} Normalised dataset\n */\nexport function normaliseDataset(Component, dataset) {\n if (!isObject(Component.schema)) {\n throw new ConfigError(\n formatErrorMessage(\n Component,\n 'Config passed as parameter into constructor but no schema defined'\n )\n )\n }\n\n const out = /** @type {ObjectNested} */ ({})\n const entries = /** @type {SchemaEntryType} */ (\n Object.entries(Component.schema.properties)\n )\n\n // Normalise top-level dataset ('data-*') values using schema types\n for (const entry of entries) {\n const [namespace, property] = entry\n\n // Cast the `namespace` to string so it can be used to access the dataset\n const field = namespace.toString()\n\n if (field in dataset) {\n out[field] = normaliseString(dataset[field], property)\n }\n\n /**\n * Extract and normalise nested object values automatically using\n * {@link normaliseString} but only schema object types are allowed\n */\n if (property?.type === 'object') {\n out[field] = extractConfigByNamespace(\n Component.schema,\n dataset,\n namespace\n )\n }\n }\n\n return out\n}\n\n/**\n * Config merging function\n *\n * Takes any number of objects and combines them together, with\n * greatest priority on the LAST item passed in.\n *\n * @internal\n * @param {...{ [key: string]: unknown }} configObjects - Config objects to merge\n * @returns {{ [key: string]: unknown }} A merged config object\n */\nexport function mergeConfigs(...configObjects) {\n // Start with an empty object as our base\n /** @type {{ [key: string]: unknown }} */\n const formattedConfigObject = {}\n\n // Loop through each of the passed objects\n for (const configObject of configObjects) {\n for (const key of Object.keys(configObject)) {\n const option = formattedConfigObject[key]\n const override = configObject[key]\n\n // Push their keys one-by-one into formattedConfigObject. Any duplicate\n // keys with object values will be merged, otherwise the new value will\n // override the existing value.\n if (isObject(option) && isObject(override)) {\n formattedConfigObject[key] = mergeConfigs(option, override)\n } else {\n // Apply override\n formattedConfigObject[key] = override\n }\n }\n }\n\n return formattedConfigObject\n}\n\n/**\n * Validate component config by schema\n *\n * Follows limited examples in JSON schema for wider support in future\n *\n * {@link https://ajv.js.org/json-schema.html#compound-keywords}\n * {@link https://ajv.js.org/packages/ajv-errors.html#single-message}\n *\n * @internal\n * @template {Partial<Record<keyof ConfigurationType, unknown>>} ConfigurationType\n * @param {Schema<ConfigurationType>} schema - The schema of a component\n * @param {ConfigurationType} config - Component config\n * @returns {string[]} List of validation errors\n */\nexport function validateConfig(schema, config) {\n const validationErrors = []\n\n // Check errors for each schema\n for (const [name, conditions] of Object.entries(schema)) {\n const errors = []\n\n // Check errors for each schema condition\n if (Array.isArray(conditions)) {\n for (const { required, errorMessage } of conditions) {\n if (!required.every((key) => !!config[key])) {\n errors.push(errorMessage) // Missing config key value\n }\n }\n\n // Check one condition passes or add errors\n if (name === 'anyOf' && !(conditions.length - errors.length >= 1)) {\n validationErrors.push(...errors)\n }\n }\n }\n\n return validationErrors\n}\n\n/**\n * Extracts keys starting with a particular namespace from dataset ('data-*')\n * object, removing the namespace in the process, normalising all values\n *\n * @internal\n * @template {Partial<Record<keyof ConfigurationType, unknown>>} ConfigurationType\n * @param {Schema<ConfigurationType>} schema - The schema of a component\n * @param {DOMStringMap} dataset - The object to extract key-value pairs from\n * @param {keyof ConfigurationType} namespace - The namespace to filter keys with\n * @returns {ObjectNested | undefined} Nested object with dot-separated key namespace removed\n */\nexport function extractConfigByNamespace(schema, dataset, namespace) {\n const property = schema.properties[namespace]\n\n // Only extract configs for object schema properties\n if (property?.type !== 'object') {\n return\n }\n\n // Add default empty config\n const newObject = /** @type {Record<typeof namespace, ObjectNested>} */ ({\n [namespace]: {}\n })\n\n for (const [key, value] of Object.entries(dataset)) {\n /** @type {ObjectNested | ObjectNested[NestedKey]} */\n let current = newObject\n\n // Split the key into parts, using . as our namespace separator\n const keyParts = key.split('.')\n\n /**\n * Create new level per part\n *\n * e.g. 'i18n.textareaDescription.other' becomes\n * `{ i18n: { textareaDescription: { other } } }`\n */\n for (const [index, name] of keyParts.entries()) {\n if (isObject(current)) {\n // Drop down to nested object until the last part\n if (index < keyParts.length - 1) {\n // New nested object (optionally) replaces existing value\n if (!isObject(current[name])) {\n current[name] = {}\n }\n\n // Drop down into new or existing nested object\n current = current[name]\n } else if (key !== namespace) {\n // Normalised value (optionally) replaces existing value\n current[name] = normaliseString(value)\n }\n }\n }\n }\n\n return newObject[namespace]\n}\n\n/**\n * @internal\n * @typedef {keyof ObjectNested} NestedKey\n * @typedef {{ [key: string]: string | boolean | number | ObjectNested | undefined }} ObjectNested\n */\n\n/**\n * Schema for component config\n *\n * @template {Partial<Record<keyof ConfigurationType, unknown>>} ConfigurationType\n * @typedef {object} Schema\n * @property {Record<keyof ConfigurationType, SchemaProperty | undefined>} properties - Schema properties\n * @property {SchemaCondition<ConfigurationType>[]} [anyOf] - List of schema conditions\n */\n\n/**\n * Schema property for component config\n *\n * @typedef {object} SchemaProperty\n * @property {'string' | 'boolean' | 'number' | 'object'} type - Property type\n */\n\n/**\n * Schema condition for component config\n *\n * @template {Partial<Record<keyof ConfigurationType, unknown>>} ConfigurationType\n * @typedef {object} SchemaCondition\n * @property {(keyof ConfigurationType)[]} required - List of required config fields\n * @property {string} errorMessage - Error message when required config fields not provided\n */\n\n/**\n * @template {Partial<Record<keyof ConfigurationType, unknown>>} [ConfigurationType=ObjectNested]\n * @typedef ChildClass\n * @property {string} moduleName - The module name that'll be looked for in the DOM when initialising the component\n * @property {Schema<ConfigurationType>} [schema] - The schema of the component configuration\n * @property {ConfigurationType} [defaults] - The default values of the configuration of the component\n */\n\n/**\n * @template {Partial<Record<keyof ConfigurationType, unknown>>} [ConfigurationType=ObjectNested]\n * @typedef {typeof Component & ChildClass<ConfigurationType>} ChildClassConstructor<ConfigurationType>\n */\n","import { ConfigurableComponent } from '../../common/configuration.mjs'\n\nconst DEBOUNCE_TIMEOUT_IN_SECONDS = 1\n\n/**\n * JavaScript enhancements for the Button component\n *\n * @preserve\n * @augments ConfigurableComponent<ButtonConfig>\n */\nexport class Button extends ConfigurableComponent {\n /**\n * @private\n * @type {number | null}\n */\n debounceFormSubmitTimer = null\n\n /**\n * @param {Element | null} $root - HTML element to use for button\n * @param {ButtonConfig} [config] - Button config\n */\n constructor($root, config = {}) {\n super($root, config)\n\n this.$root.addEventListener('keydown', (event) => this.handleKeyDown(event))\n this.$root.addEventListener('click', (event) => this.debounce(event))\n }\n\n /**\n * Trigger a click event when the space key is pressed\n *\n * Some screen readers tell users they can use the space bar to activate\n * things with the 'button' role, so we need to match the functionality of\n * native HTML buttons.\n *\n * See https://github.com/alphagov/govuk_elements/pull/272#issuecomment-233028270\n *\n * @private\n * @param {KeyboardEvent} event - Keydown event\n */\n handleKeyDown(event) {\n const $target = event.target\n\n // Handle space bar only\n if (event.key !== ' ') {\n return\n }\n\n // Handle elements with [role=\"button\"] only\n if (\n $target instanceof HTMLElement &&\n $target.getAttribute('role') === 'button'\n ) {\n event.preventDefault() // prevent the page from scrolling\n $target.click()\n }\n }\n\n /**\n * Debounce double-clicks\n *\n * If the click quickly succeeds a previous click then nothing will happen.\n * This stops people accidentally causing multiple form submissions by double\n * clicking buttons.\n *\n * @private\n * @param {MouseEvent} event - Mouse click event\n * @returns {undefined | false} Returns undefined, or false when debounced\n */\n debounce(event) {\n // Check the button that was clicked has preventDoubleClick enabled\n if (!this.config.preventDoubleClick) {\n return\n }\n\n // If the timer is still running, prevent the click from submitting the form\n if (this.debounceFormSubmitTimer) {\n event.preventDefault()\n return false\n }\n\n this.debounceFormSubmitTimer = window.setTimeout(() => {\n this.debounceFormSubmitTimer = null\n }, DEBOUNCE_TIMEOUT_IN_SECONDS * 1000)\n }\n\n /**\n * Name for the component used when initialising using data-module attributes.\n */\n static moduleName = 'govuk-button'\n\n /**\n * Button default config\n *\n * @see {@link ButtonConfig}\n * @constant\n * @type {ButtonConfig}\n */\n static defaults = Object.freeze({\n preventDoubleClick: false\n })\n\n /**\n * Button config schema\n *\n * @constant\n * @satisfies {Schema<ButtonConfig>}\n */\n static schema = Object.freeze({\n properties: {\n preventDoubleClick: { type: 'boolean' }\n }\n })\n}\n\n/**\n * Button config\n *\n * @typedef {object} ButtonConfig\n * @property {boolean} [preventDoubleClick=false] - Prevent accidental double\n * clicks on submit buttons from submitting forms multiple times.\n */\n\n/**\n * @import { Schema } from '../../common/configuration.mjs'\n */\n"],"names":["isInitialised","$root","moduleName","HTMLElement","hasAttribute","isSupported","$scope","document","body","classList","contains","isArray","option","Array","isObject","formatErrorMessage","Component","message","GOVUKFrontendError","Error","constructor","args","name","SupportError","supportMessage","HTMLScriptElement","prototype","ConfigError","ElementError","messageOrOptions","component","identifier","element","expectedType","InitError","componentOrMessage","_$root","childConstructor","elementType","checkSupport","checkInitialised","setAttribute","configOverride","Symbol","for","ConfigurableComponent","param","config","_config","defaults","datasetConfig","normaliseDataset","dataset","mergeConfigs","normaliseString","value","property","trimmedValue","trim","output","outputType","type","includes","length","isFinite","Number","schema","out","entries","Object","properties","entry","namespace","field","toString","extractConfigByNamespace","configObjects","formattedConfigObject","configObject","key","keys","override","newObject","current","keyParts","split","index","DEBOUNCE_TIMEOUT_IN_SECONDS","Button","debounceFormSubmitTimer","addEventListener","event","handleKeyDown","debounce","$target","target","getAttribute","preventDefault","click","preventDoubleClick","window","setTimeout","freeze"],"mappings":"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"}