katalyst-govuk-formbuilder 1.30.0 → 2.0.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 (27) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +141 -15
  3. data/app/assets/builds/katalyst/govuk/formbuilder.css +77 -0
  4. data/app/assets/builds/katalyst/govuk/formbuilder.js +573 -10
  5. data/app/assets/builds/katalyst/govuk/formbuilder.min.js +8 -8
  6. data/app/assets/builds/katalyst/govuk/formbuilder.min.js.map +1 -1
  7. data/app/assets/stylesheets/katalyst/govuk/components/_index.scss +1 -0
  8. data/app/assets/stylesheets/katalyst/govuk/components/attachment/_index.scss +3 -0
  9. data/app/assets/stylesheets/katalyst/govuk/components/attachment/_mixin.scss +89 -0
  10. data/app/helpers/katalyst/govuk/form_builder/builder.rb +504 -0
  11. data/app/helpers/katalyst/govuk/form_builder/containers/fieldset_context.rb +19 -0
  12. data/app/helpers/katalyst/govuk/form_builder/elements/attachment.rb +80 -0
  13. data/app/helpers/katalyst/govuk/form_builder/elements/combobox.rb +85 -0
  14. data/app/helpers/katalyst/govuk/form_builder/elements/document.rb +68 -0
  15. data/app/helpers/katalyst/govuk/form_builder/elements/image.rb +65 -0
  16. data/app/helpers/katalyst/govuk/form_builder/elements/label.rb +38 -0
  17. data/app/helpers/katalyst/govuk/form_builder/elements/legend.rb +32 -0
  18. data/app/helpers/katalyst/govuk/form_builder/elements/rich_textarea.rb +70 -0
  19. data/app/helpers/katalyst/govuk/form_builder/frontend.rb +34 -0
  20. data/app/helpers/katalyst/govuk/form_builder/traits/attachment.rb +215 -0
  21. data/app/helpers/katalyst/govuk/form_builder/traits/file.rb +104 -0
  22. data/app/helpers/katalyst/govuk/form_builder/traits/label.rb +33 -0
  23. data/config/importmap.rb +1 -0
  24. data/config/locales/en.yml +16 -0
  25. data/lib/katalyst/govuk/form_builder/config.rb +20 -0
  26. data/lib/katalyst/govuk/form_builder/engine.rb +1 -1
  27. metadata +31 -1
@@ -1,11 +1,11 @@
1
- import{Controller as t}from"@hotwired/stimulus";function e(t=document.body){return!!t&&t.classList.contains("govuk-frontend-supported")}function n(t){return!!t&&"object"==typeof t&&!function(t){return Array.isArray(t)}(t)}function i(t,e){return`${t.moduleName}: ${e}`}class s extends Error{constructor(...t){super(...t),this.name="GOVUKFrontendError"}}class o extends s{constructor(t=document.body){const e="noModule"in HTMLScriptElement.prototype?'GOV.UK Frontend initialised without `<body class="govuk-frontend-supported">` from template `<script>` snippet':"GOV.UK Frontend is not supported in this browser";super(t?e:'GOV.UK Frontend initialised without `<script type="module">`'),this.name="SupportError"}}class r extends s{constructor(...t){super(...t),this.name="ConfigError"}}class a extends s{constructor(t){let e="string"==typeof t?t:"";if(n(t)){const{component:n,identifier:s,element:o,expectedType:r}=t;e=s,e+=o?` is not of type ${null!=r?r:"HTMLElement"}`:" not found",n&&(e=i(n,e))}super(e),this.name="ElementError"}}class u extends s{constructor(t){super("string"==typeof t?t:i(t,"Root element (`$root`) already initialised")),this.name="InitError"}}class l{get $root(){return this._$root}constructor(t){this._$root=void 0;const e=this.constructor;if("string"!=typeof e.moduleName)throw new u("`moduleName` not defined in component");if(!(t instanceof e.elementType))throw new a({element:t,component:e,identifier:"Root element (`$root`)",expectedType:e.elementType.name});this._$root=t,e.checkSupport(),this.checkInitialised();const n=e.moduleName;this.$root.setAttribute(`data-${n}-init`,"")}checkInitialised(){const t=this.constructor,e=t.moduleName;if(e&&function(t,e){return t instanceof HTMLElement&&t.hasAttribute(`data-${e}-init`)}(this.$root,e))throw new u(t)}static checkSupport(){if(!e())throw new o}}l.elementType=HTMLElement;const c=Symbol.for("configOverride");class d extends l{[c](t){return{}}get config(){return this._config}constructor(t,e){super(t),this._config=void 0;const s=this.constructor;if(!n(s.defaults))throw new r(i(s,"Config passed as parameter into constructor but no defaults defined"));const o=function(t,e){if(!n(t.schema))throw new r(i(t,"Config passed as parameter into constructor but no schema defined"));const s={},o=Object.entries(t.schema.properties);for(const n of o){const[i,o]=n,r=i.toString();r in e&&(s[r]=h(e[r],o)),"object"===(null==o?void 0:o.type)&&(s[r]=m(t.schema,e,i))}return s}(s,this._$root.dataset);this._config=p(s.defaults,null!=e?e:{},this[c](o),o)}}function h(t,e){const n=t?t.trim():"";let i,s=null==e?void 0:e.type;switch(s||(["true","false"].includes(n)&&(s="boolean"),n.length>0&&isFinite(Number(n))&&(s="number")),s){case"boolean":i="true"===n;break;case"number":i=Number(n);break;default:i=t}return i}function p(...t){const e={};for(const i of t)for(const t of Object.keys(i)){const s=e[t],o=i[t];n(s)&&n(o)?e[t]=p(s,o):e[t]=o}return e}function m(t,e,i){const s=t.properties[i];if("object"!==(null==s?void 0:s.type))return;const o={[i]:{}};for(const[t,s]of Object.entries(e)){let e=o;const r=t.split(".");for(const[o,a]of r.entries())n(e)&&(o<r.length-1?(n(e[a])||(e[a]={}),e=e[a]):t!==i&&(e[a]=h(s)))}return o[i]}class g{constructor(t={},e={}){var n;this.translations=void 0,this.locale=void 0,this.translations=t,this.locale=null!=(n=e.locale)?n:document.documentElement.lang||"en"}t(t,e){if(!t)throw new Error("i18n: lookup key missing");let i=this.translations[t];if("number"==typeof(null==e?void 0:e.count)&&n(i)){const n=i[this.getPluralSuffix(t,e.count)];n&&(i=n)}if("string"==typeof i){if(i.match(/%{(.\S+)}/)){if(!e)throw new Error("i18n: cannot replace placeholders in string if no option data provided");return this.replacePlaceholders(i,e)}return i}return t}replacePlaceholders(t,e){const n=Intl.NumberFormat.supportedLocalesOf(this.locale).length?new Intl.NumberFormat(this.locale):void 0;return t.replace(/%{(.\S+)}/g,function(t,i){if(Object.prototype.hasOwnProperty.call(e,i)){const t=e[i];return!1===t||"number"!=typeof t&&"string"!=typeof t?"":"number"==typeof t?n?n.format(t):`${t}`:t}throw new Error(`i18n: no data found to replace ${t} placeholder in string`)})}hasIntlPluralRulesSupport(){return Boolean("PluralRules"in window.Intl&&Intl.PluralRules.supportedLocalesOf(this.locale).length)}getPluralSuffix(t,e){if(e=Number(e),!isFinite(e))return"other";const i=this.translations[t],s=this.hasIntlPluralRulesSupport()?new Intl.PluralRules(this.locale).select(e):"other";if(n(i)){if(s in i)return s;if("other"in i)return console.warn(`i18n: Missing plural form ".${s}" for "${this.locale}" locale. Falling back to ".other".`),"other"}throw new Error(`i18n: Plural form ".other" is required for "${this.locale}" locale`)}}
1
+ import{Controller as t,Application as e}from"@hotwired/stimulus";import{DirectUploadController as n}from"@rails/activestorage";function i(t,e){return t instanceof HTMLElement&&t.hasAttribute(`data-${e}-init`)}function s(t=document.body){return!!t&&t.classList.contains("govuk-frontend-supported")}function o(t){return!!t&&"object"==typeof t&&!function(t){return Array.isArray(t)}(t)}function r(t,e){return`${t.moduleName}: ${e}`}class a extends Error{constructor(...t){super(...t),this.name="GOVUKFrontendError"}}class l extends a{constructor(t=document.body){const e="noModule"in HTMLScriptElement.prototype?'GOV.UK Frontend initialised without `<body class="govuk-frontend-supported">` from template `<script>` snippet':"GOV.UK Frontend is not supported in this browser";super(t?e:'GOV.UK Frontend initialised without `<script type="module">`'),this.name="SupportError"}}class u extends a{constructor(...t){super(...t),this.name="ConfigError"}}class d extends a{constructor(t){let e="string"==typeof t?t:"";if(o(t)){const{component:n,identifier:i,element:s,expectedType:o}=t;e=i,e+=s?` is not of type ${null!=o?o:"HTMLElement"}`:" not found",n&&(e=r(n,e))}super(e),this.name="ElementError"}}class c extends a{constructor(t){super("string"==typeof t?t:r(t,"Root element (`$root`) already initialised")),this.name="InitError"}}class h{get $root(){return this._$root}constructor(t){this._$root=void 0;const e=this.constructor;if("string"!=typeof e.moduleName)throw new c("`moduleName` not defined in component");if(!(t instanceof e.elementType))throw new d({element:t,component:e,identifier:"Root element (`$root`)",expectedType:e.elementType.name});this._$root=t,e.checkSupport(),this.checkInitialised();const n=e.moduleName;this.$root.setAttribute(`data-${n}-init`,"")}checkInitialised(){const t=this.constructor,e=t.moduleName;if(e&&i(this.$root,e))throw new c(t)}static checkSupport(){if(!s())throw new l}}h.elementType=HTMLElement;const p=Symbol.for("configOverride");class m extends h{[p](t){return{}}get config(){return this._config}constructor(t,e){super(t),this._config=void 0;const n=this.constructor;if(!o(n.defaults))throw new u(r(n,"Config passed as parameter into constructor but no defaults defined"));const i=f(n,this._$root.dataset);this._config=v(n.defaults,null!=e?e:{},this[p](i),i)}}function g(t,e){const n=t?t.trim():"";let i,s=null==e?void 0:e.type;switch(s||(["true","false"].includes(n)&&(s="boolean"),n.length>0&&isFinite(Number(n))&&(s="number")),s){case"boolean":i="true"===n;break;case"number":i=Number(n);break;default:i=t}return i}function f(t,e){if(!o(t.schema))throw new u(r(t,"Config passed as parameter into constructor but no schema defined"));const n={},i=Object.entries(t.schema.properties);for(const s of i){const[i,o]=s,r=i.toString();r in e&&(n[r]=g(e[r],o)),"object"===(null==o?void 0:o.type)&&(n[r]=b(t.schema,e,i))}return n}function v(...t){const e={};for(const n of t)for(const t of Object.keys(n)){const i=e[t],s=n[t];o(i)&&o(s)?e[t]=v(i,s):e[t]=s}return e}function b(t,e,n){const i=t.properties[n];if("object"!==(null==i?void 0:i.type))return;const s={[n]:{}};for(const[t,i]of Object.entries(e)){let e=s;const r=t.split(".");for(const[s,a]of r.entries())o(e)&&(s<r.length-1?(o(e[a])||(e[a]={}),e=e[a]):t!==n&&(e[a]=g(i)))}return s[n]}class y{constructor(t={},e={}){var n;this.translations=void 0,this.locale=void 0,this.translations=t,this.locale=null!=(n=e.locale)?n:document.documentElement.lang||"en"}t(t,e){if(!t)throw new Error("i18n: lookup key missing");let n=this.translations[t];if("number"==typeof(null==e?void 0:e.count)&&o(n)){const i=n[this.getPluralSuffix(t,e.count)];i&&(n=i)}if("string"==typeof n){if(n.match(/%{(.\S+)}/)){if(!e)throw new Error("i18n: cannot replace placeholders in string if no option data provided");return this.replacePlaceholders(n,e)}return n}return t}replacePlaceholders(t,e){const n=Intl.NumberFormat.supportedLocalesOf(this.locale).length?new Intl.NumberFormat(this.locale):void 0;return t.replace(/%{(.\S+)}/g,function(t,i){if(Object.prototype.hasOwnProperty.call(e,i)){const t=e[i];return!1===t||"number"!=typeof t&&"string"!=typeof t?"":"number"==typeof t?n?n.format(t):`${t}`:t}throw new Error(`i18n: no data found to replace ${t} placeholder in string`)})}hasIntlPluralRulesSupport(){return Boolean("PluralRules"in window.Intl&&Intl.PluralRules.supportedLocalesOf(this.locale).length)}getPluralSuffix(t,e){if(e=Number(e),!isFinite(e))return"other";const n=this.translations[t],i=this.hasIntlPluralRulesSupport()?new Intl.PluralRules(this.locale).select(e):"other";if(o(n)){if(i in n)return i;if("other"in n)return console.warn(`i18n: Missing plural form ".${i}" for "${this.locale}" locale. Falling back to ".other".`),"other"}throw new Error(`i18n: Plural form ".other" is required for "${this.locale}" locale`)}}
2
2
  /**
3
3
  * JavaScript enhancements for the Button component
4
4
  *
5
5
  * @preserve
6
6
  * @augments ConfigurableComponent<ButtonConfig>
7
7
  */
8
- class f extends d{constructor(t,e={}){super(t,e),this.debounceFormSubmitTimer=null,this.$root.addEventListener("keydown",t=>this.handleKeyDown(t)),this.$root.addEventListener("click",t=>this.debounce(t))}handleKeyDown(t){const e=t.target;" "===t.key&&e instanceof HTMLElement&&"button"===e.getAttribute("role")&&(t.preventDefault(),e.click())}debounce(t){if(this.config.preventDoubleClick)return this.debounceFormSubmitTimer?(t.preventDefault(),!1):void(this.debounceFormSubmitTimer=window.setTimeout(()=>{this.debounceFormSubmitTimer=null},1e3))}}function v(t,e){const n=t.closest(`[${e}]`);return n?n.getAttribute(e):null}
8
+ class w extends m{constructor(t,e={}){super(t,e),this.debounceFormSubmitTimer=null,this.$root.addEventListener("keydown",t=>this.handleKeyDown(t)),this.$root.addEventListener("click",t=>this.debounce(t))}handleKeyDown(t){const e=t.target;" "===t.key&&e instanceof HTMLElement&&"button"===e.getAttribute("role")&&(t.preventDefault(),e.click())}debounce(t){if(this.config.preventDoubleClick)return this.debounceFormSubmitTimer?(t.preventDefault(),!1):void(this.debounceFormSubmitTimer=window.setTimeout(()=>{this.debounceFormSubmitTimer=null},1e3))}}function $(t,e){const n=t.closest(`[${e}]`);return n?n.getAttribute(e):null}
9
9
  /**
10
10
  * Character count component
11
11
  *
@@ -18,13 +18,13 @@ class f extends d{constructor(t,e={}){super(t,e),this.debounceFormSubmitTimer=nu
18
18
  *
19
19
  * @preserve
20
20
  * @augments ConfigurableComponent<CharacterCountConfig>
21
- */f.moduleName="govuk-button",f.defaults=Object.freeze({preventDoubleClick:!1}),f.schema=Object.freeze({properties:{preventDoubleClick:{type:"boolean"}}});class b extends d{[c](t){let e={};return("maxwords"in t||"maxlength"in t)&&(e={maxlength:void 0,maxwords:void 0}),e}constructor(t,e={}){var n,s;super(t,e),this.$textarea=void 0,this.count=0,this.$visibleCountMessage=void 0,this.$screenReaderCountMessage=void 0,this.lastInputTimestamp=null,this.lastInputValue="",this.valueChecker=null,this.i18n=void 0,this.maxLength=void 0;const o=this.$root.querySelector(".govuk-js-character-count");if(!(o instanceof HTMLTextAreaElement||o instanceof HTMLInputElement))throw new a({component:b,element:o,expectedType:"HTMLTextareaElement or HTMLInputElement",identifier:"Form field (`.govuk-js-character-count`)"});const u=function(t,e){const n=[];for(const[i,s]of Object.entries(t)){const t=[];if(Array.isArray(s)){for(const{required:n,errorMessage:i}of s)n.every(t=>!!e[t])||t.push(i);"anyOf"!==i||s.length-t.length>=1||n.push(...t)}}return n}(b.schema,this.config);if(u[0])throw new r(i(b,u[0]));this.i18n=new g(this.config.i18n,{locale:v(this.$root,"lang")}),this.maxLength=null!=(n=null!=(s=this.config.maxwords)?s:this.config.maxlength)?n:1/0,this.$textarea=o;const l=`${this.$textarea.id}-info`,c=document.getElementById(l);if(!c)throw new a({component:b,element:c,identifier:`Count message (\`id="${l}"\`)`});this.$errorMessage=this.$root.querySelector(".govuk-error-message"),c.textContent.match(/^\s*$/)&&(c.textContent=this.i18n.t("textareaDescription",{count:this.maxLength})),this.$textarea.insertAdjacentElement("afterend",c);const d=document.createElement("div");d.className="govuk-character-count__sr-status govuk-visually-hidden",d.setAttribute("aria-live","polite"),this.$screenReaderCountMessage=d,c.insertAdjacentElement("afterend",d);const h=document.createElement("div");h.className=c.className,h.classList.add("govuk-character-count__status"),h.setAttribute("aria-hidden","true"),this.$visibleCountMessage=h,c.insertAdjacentElement("afterend",h),c.classList.add("govuk-visually-hidden"),this.$textarea.removeAttribute("maxlength"),this.bindChangeEvents(),window.addEventListener("pageshow",()=>{this.$textarea.value!==this.$textarea.textContent&&(this.updateCount(),this.updateCountMessage())}),this.updateCount(),this.updateCountMessage()}bindChangeEvents(){this.$textarea.addEventListener("input",()=>this.handleInput()),this.$textarea.addEventListener("focus",()=>this.handleFocus()),this.$textarea.addEventListener("blur",()=>this.handleBlur())}handleInput(){this.updateCount(),this.updateVisibleCountMessage(),this.lastInputTimestamp=Date.now()}handleFocus(){this.valueChecker=window.setInterval(()=>{(!this.lastInputTimestamp||Date.now()-500>=this.lastInputTimestamp)&&this.updateIfValueChanged()},1e3)}handleBlur(){this.valueChecker&&window.clearInterval(this.valueChecker)}updateIfValueChanged(){this.$textarea.value!==this.lastInputValue&&(this.lastInputValue=this.$textarea.value,this.updateCountMessage())}updateCountMessage(){this.updateVisibleCountMessage(),this.updateScreenReaderCountMessage()}updateVisibleCountMessage(){const t=this.maxLength-this.count<0;this.$visibleCountMessage.classList.toggle("govuk-character-count__message--disabled",!this.isOverThreshold()),this.$errorMessage||this.$textarea.classList.toggle("govuk-textarea--error",t),this.$visibleCountMessage.classList.toggle("govuk-error-message",t),this.$visibleCountMessage.classList.toggle("govuk-hint",!t),this.$visibleCountMessage.textContent=this.getCountMessage()}updateScreenReaderCountMessage(){this.isOverThreshold()?this.$screenReaderCountMessage.removeAttribute("aria-hidden"):this.$screenReaderCountMessage.setAttribute("aria-hidden","true"),this.$screenReaderCountMessage.textContent=this.getCountMessage()}updateCount(){const t=this.$textarea.value;if(this.config.maxwords){var e;const n=null!=(e=t.match(/\S+/g))?e:[];return void(this.count=n.length)}this.count=t.length}getCountMessage(){const t=this.maxLength-this.count,e=this.config.maxwords?"words":"characters";return this.formatCountMessage(t,e)}formatCountMessage(t,e){if(0===t)return this.i18n.t(`${e}AtLimit`);const n=t<0?"OverLimit":"UnderLimit";return this.i18n.t(`${e}${n}`,{count:Math.abs(t)})}isOverThreshold(){if(!this.config.threshold)return!0;const t=this.count;return this.maxLength*this.config.threshold/100<=t}}b.moduleName="govuk-character-count",b.defaults=Object.freeze({threshold:0,i18n:{charactersUnderLimit:{one:"You have %{count} character remaining",other:"You have %{count} characters remaining"},charactersAtLimit:"You have 0 characters remaining",charactersOverLimit:{one:"You have %{count} character too many",other:"You have %{count} characters too many"},wordsUnderLimit:{one:"You have %{count} word remaining",other:"You have %{count} words remaining"},wordsAtLimit:"You have 0 words remaining",wordsOverLimit:{one:"You have %{count} word too many",other:"You have %{count} words too many"},textareaDescription:{other:""}}}),b.schema=Object.freeze({properties:{i18n:{type:"object"},maxwords:{type:"number"},maxlength:{type:"number"},threshold:{type:"number"}},anyOf:[{required:["maxwords"],errorMessage:'Either "maxlength" or "maxwords" must be provided'},{required:["maxlength"],errorMessage:'Either "maxlength" or "maxwords" must be provided'}]});
21
+ */w.moduleName="govuk-button",w.defaults=Object.freeze({preventDoubleClick:!1}),w.schema=Object.freeze({properties:{preventDoubleClick:{type:"boolean"}}});class E extends m{[p](t){let e={};return("maxwords"in t||"maxlength"in t)&&(e={maxlength:void 0,maxwords:void 0}),e}constructor(t,e={}){var n,i;super(t,e),this.$textarea=void 0,this.count=0,this.$visibleCountMessage=void 0,this.$screenReaderCountMessage=void 0,this.lastInputTimestamp=null,this.lastInputValue="",this.valueChecker=null,this.i18n=void 0,this.maxLength=void 0;const s=this.$root.querySelector(".govuk-js-character-count");if(!(s instanceof HTMLTextAreaElement||s instanceof HTMLInputElement))throw new d({component:E,element:s,expectedType:"HTMLTextareaElement or HTMLInputElement",identifier:"Form field (`.govuk-js-character-count`)"});const o=function(t,e){const n=[];for(const[i,s]of Object.entries(t)){const t=[];if(Array.isArray(s)){for(const{required:n,errorMessage:i}of s)n.every(t=>!!e[t])||t.push(i);"anyOf"!==i||s.length-t.length>=1||n.push(...t)}}return n}(E.schema,this.config);if(o[0])throw new u(r(E,o[0]));this.i18n=new y(this.config.i18n,{locale:$(this.$root,"lang")}),this.maxLength=null!=(n=null!=(i=this.config.maxwords)?i:this.config.maxlength)?n:1/0,this.$textarea=s;const a=`${this.$textarea.id}-info`,l=document.getElementById(a);if(!l)throw new d({component:E,element:l,identifier:`Count message (\`id="${a}"\`)`});this.$errorMessage=this.$root.querySelector(".govuk-error-message"),l.textContent.match(/^\s*$/)&&(l.textContent=this.i18n.t("textareaDescription",{count:this.maxLength})),this.$textarea.insertAdjacentElement("afterend",l);const c=document.createElement("div");c.className="govuk-character-count__sr-status govuk-visually-hidden",c.setAttribute("aria-live","polite"),this.$screenReaderCountMessage=c,l.insertAdjacentElement("afterend",c);const h=document.createElement("div");h.className=l.className,h.classList.add("govuk-character-count__status"),h.setAttribute("aria-hidden","true"),this.$visibleCountMessage=h,l.insertAdjacentElement("afterend",h),l.classList.add("govuk-visually-hidden"),this.$textarea.removeAttribute("maxlength"),this.bindChangeEvents(),window.addEventListener("pageshow",()=>{this.$textarea.value!==this.$textarea.textContent&&(this.updateCount(),this.updateCountMessage())}),this.updateCount(),this.updateCountMessage()}bindChangeEvents(){this.$textarea.addEventListener("input",()=>this.handleInput()),this.$textarea.addEventListener("focus",()=>this.handleFocus()),this.$textarea.addEventListener("blur",()=>this.handleBlur())}handleInput(){this.updateCount(),this.updateVisibleCountMessage(),this.lastInputTimestamp=Date.now()}handleFocus(){this.valueChecker=window.setInterval(()=>{(!this.lastInputTimestamp||Date.now()-500>=this.lastInputTimestamp)&&this.updateIfValueChanged()},1e3)}handleBlur(){this.valueChecker&&window.clearInterval(this.valueChecker)}updateIfValueChanged(){this.$textarea.value!==this.lastInputValue&&(this.lastInputValue=this.$textarea.value,this.updateCountMessage())}updateCountMessage(){this.updateVisibleCountMessage(),this.updateScreenReaderCountMessage()}updateVisibleCountMessage(){const t=this.maxLength-this.count<0;this.$visibleCountMessage.classList.toggle("govuk-character-count__message--disabled",!this.isOverThreshold()),this.$errorMessage||this.$textarea.classList.toggle("govuk-textarea--error",t),this.$visibleCountMessage.classList.toggle("govuk-error-message",t),this.$visibleCountMessage.classList.toggle("govuk-hint",!t),this.$visibleCountMessage.textContent=this.getCountMessage()}updateScreenReaderCountMessage(){this.isOverThreshold()?this.$screenReaderCountMessage.removeAttribute("aria-hidden"):this.$screenReaderCountMessage.setAttribute("aria-hidden","true"),this.$screenReaderCountMessage.textContent=this.getCountMessage()}updateCount(){const t=this.$textarea.value;if(this.config.maxwords){var e;const n=null!=(e=t.match(/\S+/g))?e:[];return void(this.count=n.length)}this.count=t.length}getCountMessage(){const t=this.maxLength-this.count,e=this.config.maxwords?"words":"characters";return this.formatCountMessage(t,e)}formatCountMessage(t,e){if(0===t)return this.i18n.t(`${e}AtLimit`);const n=t<0?"OverLimit":"UnderLimit";return this.i18n.t(`${e}${n}`,{count:Math.abs(t)})}isOverThreshold(){if(!this.config.threshold)return!0;const t=this.count;return this.maxLength*this.config.threshold/100<=t}}E.moduleName="govuk-character-count",E.defaults=Object.freeze({threshold:0,i18n:{charactersUnderLimit:{one:"You have %{count} character remaining",other:"You have %{count} characters remaining"},charactersAtLimit:"You have 0 characters remaining",charactersOverLimit:{one:"You have %{count} character too many",other:"You have %{count} characters too many"},wordsUnderLimit:{one:"You have %{count} word remaining",other:"You have %{count} words remaining"},wordsAtLimit:"You have 0 words remaining",wordsOverLimit:{one:"You have %{count} word too many",other:"You have %{count} words too many"},textareaDescription:{other:""}}}),E.schema=Object.freeze({properties:{i18n:{type:"object"},maxwords:{type:"number"},maxlength:{type:"number"},threshold:{type:"number"}},anyOf:[{required:["maxwords"],errorMessage:'Either "maxlength" or "maxwords" must be provided'},{required:["maxlength"],errorMessage:'Either "maxlength" or "maxwords" must be provided'}]});
22
22
  /**
23
23
  * Checkboxes component
24
24
  *
25
25
  * @preserve
26
26
  */
27
- class w extends l{constructor(t){super(t),this.$inputs=void 0;const e=this.$root.querySelectorAll('input[type="checkbox"]');if(!e.length)throw new a({component:w,identifier:'Form inputs (`<input type="checkbox">`)'});this.$inputs=e,this.$inputs.forEach(t=>{const e=t.getAttribute("data-aria-controls");if(e){if(!document.getElementById(e))throw new a({component:w,identifier:`Conditional reveal (\`id="${e}"\`)`});t.setAttribute("aria-controls",e),t.removeAttribute("data-aria-controls")}}),window.addEventListener("pageshow",()=>this.syncAllConditionalReveals()),this.syncAllConditionalReveals(),this.$root.addEventListener("click",t=>this.handleClick(t))}syncAllConditionalReveals(){this.$inputs.forEach(t=>this.syncConditionalRevealWithInputState(t))}syncConditionalRevealWithInputState(t){const e=t.getAttribute("aria-controls");if(!e)return;const n=document.getElementById(e);if(null!=n&&n.classList.contains("govuk-checkboxes__conditional")){const e=t.checked;t.setAttribute("aria-expanded",e.toString()),n.classList.toggle("govuk-checkboxes__conditional--hidden",!e)}}unCheckAllInputsExcept(t){document.querySelectorAll(`input[type="checkbox"][name="${t.name}"]`).forEach(e=>{t.form===e.form&&e!==t&&(e.checked=!1,this.syncConditionalRevealWithInputState(e))})}unCheckExclusiveInputs(t){document.querySelectorAll(`input[data-behaviour="exclusive"][type="checkbox"][name="${t.name}"]`).forEach(e=>{t.form===e.form&&(e.checked=!1,this.syncConditionalRevealWithInputState(e))})}handleClick(t){const e=t.target;if(!(e instanceof HTMLInputElement)||"checkbox"!==e.type)return;if(e.getAttribute("aria-controls")&&this.syncConditionalRevealWithInputState(e),!e.checked)return;"exclusive"===e.getAttribute("data-behaviour")?this.unCheckAllInputsExcept(e):this.unCheckExclusiveInputs(e)}}w.moduleName="govuk-checkboxes";
27
+ class C extends h{constructor(t){super(t),this.$inputs=void 0;const e=this.$root.querySelectorAll('input[type="checkbox"]');if(!e.length)throw new d({component:C,identifier:'Form inputs (`<input type="checkbox">`)'});this.$inputs=e,this.$inputs.forEach(t=>{const e=t.getAttribute("data-aria-controls");if(e){if(!document.getElementById(e))throw new d({component:C,identifier:`Conditional reveal (\`id="${e}"\`)`});t.setAttribute("aria-controls",e),t.removeAttribute("data-aria-controls")}}),window.addEventListener("pageshow",()=>this.syncAllConditionalReveals()),this.syncAllConditionalReveals(),this.$root.addEventListener("click",t=>this.handleClick(t))}syncAllConditionalReveals(){this.$inputs.forEach(t=>this.syncConditionalRevealWithInputState(t))}syncConditionalRevealWithInputState(t){const e=t.getAttribute("aria-controls");if(!e)return;const n=document.getElementById(e);if(null!=n&&n.classList.contains("govuk-checkboxes__conditional")){const e=t.checked;t.setAttribute("aria-expanded",e.toString()),n.classList.toggle("govuk-checkboxes__conditional--hidden",!e)}}unCheckAllInputsExcept(t){document.querySelectorAll(`input[type="checkbox"][name="${t.name}"]`).forEach(e=>{t.form===e.form&&e!==t&&(e.checked=!1,this.syncConditionalRevealWithInputState(e))})}unCheckExclusiveInputs(t){document.querySelectorAll(`input[data-behaviour="exclusive"][type="checkbox"][name="${t.name}"]`).forEach(e=>{t.form===e.form&&(e.checked=!1,this.syncConditionalRevealWithInputState(e))})}handleClick(t){const e=t.target;if(!(e instanceof HTMLInputElement)||"checkbox"!==e.type)return;if(e.getAttribute("aria-controls")&&this.syncConditionalRevealWithInputState(e),!e.checked)return;"exclusive"===e.getAttribute("data-behaviour")?this.unCheckAllInputsExcept(e):this.unCheckExclusiveInputs(e)}}C.moduleName="govuk-checkboxes";
28
28
  /**
29
29
  * Error summary component
30
30
  *
@@ -34,24 +34,24 @@ class w extends l{constructor(t){super(t),this.$inputs=void 0;const e=this.$root
34
34
  * @preserve
35
35
  * @augments ConfigurableComponent<ErrorSummaryConfig>
36
36
  */
37
- class $ extends d{constructor(t,e={}){super(t,e),this.config.disableAutoFocus||function(t,e={}){var n;const i=t.getAttribute("tabindex");function s(){var n;null==(n=e.onBlur)||n.call(t),i||t.removeAttribute("tabindex")}i||t.setAttribute("tabindex","-1"),t.addEventListener("focus",function(){t.addEventListener("blur",s,{once:!0})},{once:!0}),null==(n=e.onBeforeFocus)||n.call(t),t.focus()}(this.$root),this.$root.addEventListener("click",t=>this.handleClick(t))}handleClick(t){const e=t.target;e&&this.focusTarget(e)&&t.preventDefault()}focusTarget(t){if(!(t instanceof HTMLAnchorElement))return!1;const e=t.hash.replace("#","");if(!e)return!1;const n=document.getElementById(e);if(!n)return!1;const i=this.getAssociatedLegendOrLabel(n);return!!i&&(i.scrollIntoView(),n.focus({preventScroll:!0}),!0)}getAssociatedLegendOrLabel(t){var e;const n=t.closest("fieldset");if(n){const e=n.getElementsByTagName("legend");if(e.length){const n=e[0];if(t instanceof HTMLInputElement&&("checkbox"===t.type||"radio"===t.type))return n;const i=n.getBoundingClientRect().top,s=t.getBoundingClientRect();if(s.height&&window.innerHeight){if(s.top+s.height-i<window.innerHeight/2)return n}}}return null!=(e=document.querySelector(`label[for='${t.getAttribute("id")}']`))?e:t.closest("label")}}$.moduleName="govuk-error-summary",$.defaults=Object.freeze({disableAutoFocus:!1}),$.schema=Object.freeze({properties:{disableAutoFocus:{type:"boolean"}}});
37
+ class T extends m{constructor(t,e={}){super(t,e),this.config.disableAutoFocus||function(t,e={}){var n;const i=t.getAttribute("tabindex");function s(){var n;null==(n=e.onBlur)||n.call(t),i||t.removeAttribute("tabindex")}i||t.setAttribute("tabindex","-1"),t.addEventListener("focus",function(){t.addEventListener("blur",s,{once:!0})},{once:!0}),null==(n=e.onBeforeFocus)||n.call(t),t.focus()}(this.$root),this.$root.addEventListener("click",t=>this.handleClick(t))}handleClick(t){const e=t.target;e&&this.focusTarget(e)&&t.preventDefault()}focusTarget(t){if(!(t instanceof HTMLAnchorElement))return!1;const e=t.hash.replace("#","");if(!e)return!1;const n=document.getElementById(e);if(!n)return!1;const i=this.getAssociatedLegendOrLabel(n);return!!i&&(i.scrollIntoView(),n.focus({preventScroll:!0}),!0)}getAssociatedLegendOrLabel(t){var e;const n=t.closest("fieldset");if(n){const e=n.getElementsByTagName("legend");if(e.length){const n=e[0];if(t instanceof HTMLInputElement&&("checkbox"===t.type||"radio"===t.type))return n;const i=n.getBoundingClientRect().top,s=t.getBoundingClientRect();if(s.height&&window.innerHeight){if(s.top+s.height-i<window.innerHeight/2)return n}}}return null!=(e=document.querySelector(`label[for='${t.getAttribute("id")}']`))?e:t.closest("label")}}T.moduleName="govuk-error-summary",T.defaults=Object.freeze({disableAutoFocus:!1}),T.schema=Object.freeze({properties:{disableAutoFocus:{type:"boolean"}}});
38
38
  /**
39
39
  * File upload component
40
40
  *
41
41
  * @preserve
42
42
  * @augments ConfigurableComponent<FileUploadConfig>
43
43
  */
44
- class y extends d{constructor(t,e={}){super(t,e),this.$input=void 0,this.$button=void 0,this.$status=void 0,this.$label=void 0,this.i18n=void 0,this.id=void 0,this.$announcements=void 0,this.enteredAnotherElement=void 0;const n=this.$root.querySelector('input[type="file"]');if(null===n)throw new a({component:y,identifier:'File inputs (`<input type="file">`)'});if(this.$input=n,!this.$input.id)throw new a({component:y,identifier:'File input (`<input type="file">`) attribute (`id`)'});this.id=this.$input.id,this.i18n=new g(this.config.i18n,{locale:v(this.$root,"lang")});const i=this.findLabel();i.id||(i.id=`${this.id}-label`),this.$label=i,this.$input.id=`${this.id}-input`,this.$input.setAttribute("hidden","hidden"),this.$status=this.createStatus(),this.$button=this.createButton(),this.$root.insertAdjacentElement("afterbegin",this.$button),this.$input.addEventListener("change",this.onChange.bind(this)),this.updateDisabledState(),this.observeDisabledState(),this.$announcements=document.createElement("span"),this.$announcements.classList.add("govuk-file-upload-announcements"),this.$announcements.classList.add("govuk-visually-hidden"),this.$announcements.setAttribute("aria-live","assertive"),this.$root.insertAdjacentElement("afterend",this.$announcements),this.bindDraggingEvents()}createStatus(){const t=document.createElement("span");return t.className="govuk-body govuk-file-upload-button__status",t.setAttribute("aria-live","polite"),t.innerText=this.i18n.t("noFileChosen"),t}createButton(){const t=document.createElement("button");t.classList.add("govuk-file-upload-button"),t.type="button",t.id=this.id,t.classList.add("govuk-file-upload-button--empty");const e=this.$input.getAttribute("aria-describedby");e&&t.setAttribute("aria-describedby",e),t.appendChild(this.$status);const n=document.createElement("span");n.className="govuk-visually-hidden",n.innerText=", ",n.id=`${this.id}-comma`,t.appendChild(n);const i=document.createElement("span");i.className="govuk-file-upload-button__pseudo-button-container";const s=document.createElement("span");s.className="govuk-button govuk-button--secondary govuk-file-upload-button__pseudo-button",s.innerText=this.i18n.t("chooseFilesButton"),i.appendChild(s),i.insertAdjacentText("beforeend"," ");const o=document.createElement("span");return o.className="govuk-body govuk-file-upload-button__instruction",o.innerText=this.i18n.t("dropInstruction"),i.appendChild(o),t.appendChild(i),t.setAttribute("aria-labelledby",`${this.$label.id} ${n.id} ${t.id}`),t.addEventListener("click",this.onClick.bind(this)),t.addEventListener("dragover",t=>{t.preventDefault()}),t}bindDraggingEvents(){this.$button.addEventListener("drop",this.onDrop.bind(this)),document.addEventListener("dragenter",this.updateDropzoneVisibility.bind(this)),document.addEventListener("dragenter",()=>{this.enteredAnotherElement=!0}),document.addEventListener("dragleave",()=>{this.enteredAnotherElement||this.$button.disabled||(this.hideDraggingState(),this.$announcements.innerText=this.i18n.t("leftDropZone")),this.enteredAnotherElement=!1})}updateDropzoneVisibility(t){this.$button.disabled||t.target instanceof Node&&(this.$root.contains(t.target)?t.dataTransfer&&this.canDrop(t.dataTransfer)&&(this.$button.classList.contains("govuk-file-upload-button--dragging")||(this.showDraggingState(),this.$announcements.innerText=this.i18n.t("enteredDropZone"))):this.$button.classList.contains("govuk-file-upload-button--dragging")&&(this.hideDraggingState(),this.$announcements.innerText=this.i18n.t("leftDropZone")))}showDraggingState(){this.$button.classList.add("govuk-file-upload-button--dragging")}hideDraggingState(){this.$button.classList.remove("govuk-file-upload-button--dragging")}onDrop(t){t.preventDefault(),t.dataTransfer&&this.canFillInput(t.dataTransfer)&&(this.$input.files=t.dataTransfer.files,this.$input.dispatchEvent(new CustomEvent("change")),this.hideDraggingState())}canFillInput(t){return this.matchesInputCapacity(t.files.length)}canDrop(t){return t.items.length?this.matchesInputCapacity(function(t){let e=0;for(let n=0;n<t.length;n++)"file"===t[n].kind&&e++;return e}
44
+ class L extends m{constructor(t,e={}){super(t,e),this.$input=void 0,this.$button=void 0,this.$status=void 0,this.$label=void 0,this.i18n=void 0,this.id=void 0,this.$announcements=void 0,this.enteredAnotherElement=void 0;const n=this.$root.querySelector('input[type="file"]');if(null===n)throw new d({component:L,identifier:'File inputs (`<input type="file">`)'});if(this.$input=n,!this.$input.id)throw new d({component:L,identifier:'File input (`<input type="file">`) attribute (`id`)'});this.id=this.$input.id,this.i18n=new y(this.config.i18n,{locale:$(this.$root,"lang")});const i=this.findLabel();i.id||(i.id=`${this.id}-label`),this.$label=i,this.$input.id=`${this.id}-input`,this.$input.setAttribute("hidden","hidden"),this.$status=this.createStatus(),this.$button=this.createButton(),this.$root.insertAdjacentElement("afterbegin",this.$button),this.$input.addEventListener("change",this.onChange.bind(this)),this.updateDisabledState(),this.observeDisabledState(),this.$announcements=document.createElement("span"),this.$announcements.classList.add("govuk-file-upload-announcements"),this.$announcements.classList.add("govuk-visually-hidden"),this.$announcements.setAttribute("aria-live","assertive"),this.$root.insertAdjacentElement("afterend",this.$announcements),this.bindDraggingEvents()}createStatus(){const t=document.createElement("span");return t.className="govuk-body govuk-file-upload-button__status",t.setAttribute("aria-live","polite"),t.innerText=this.i18n.t("noFileChosen"),t}createButton(){const t=document.createElement("button");t.classList.add("govuk-file-upload-button"),t.type="button",t.id=this.id,t.classList.add("govuk-file-upload-button--empty");const e=this.$input.getAttribute("aria-describedby");e&&t.setAttribute("aria-describedby",e),t.appendChild(this.$status);const n=document.createElement("span");n.className="govuk-visually-hidden",n.innerText=", ",n.id=`${this.id}-comma`,t.appendChild(n);const i=document.createElement("span");i.className="govuk-file-upload-button__pseudo-button-container";const s=document.createElement("span");s.className="govuk-button govuk-button--secondary govuk-file-upload-button__pseudo-button",s.innerText=this.i18n.t("chooseFilesButton"),i.appendChild(s),i.insertAdjacentText("beforeend"," ");const o=document.createElement("span");return o.className="govuk-body govuk-file-upload-button__instruction",o.innerText=this.i18n.t("dropInstruction"),i.appendChild(o),t.appendChild(i),t.setAttribute("aria-labelledby",`${this.$label.id} ${n.id} ${t.id}`),t.addEventListener("click",this.onClick.bind(this)),t.addEventListener("dragover",t=>{t.preventDefault()}),t}bindDraggingEvents(){this.$button.addEventListener("drop",this.onDrop.bind(this)),document.addEventListener("dragenter",this.updateDropzoneVisibility.bind(this)),document.addEventListener("dragenter",()=>{this.enteredAnotherElement=!0}),document.addEventListener("dragleave",()=>{this.enteredAnotherElement||this.$button.disabled||(this.hideDraggingState(),this.$announcements.innerText=this.i18n.t("leftDropZone")),this.enteredAnotherElement=!1})}updateDropzoneVisibility(t){this.$button.disabled||t.target instanceof Node&&(this.$root.contains(t.target)?t.dataTransfer&&this.canDrop(t.dataTransfer)&&(this.$button.classList.contains("govuk-file-upload-button--dragging")||(this.showDraggingState(),this.$announcements.innerText=this.i18n.t("enteredDropZone"))):this.$button.classList.contains("govuk-file-upload-button--dragging")&&(this.hideDraggingState(),this.$announcements.innerText=this.i18n.t("leftDropZone")))}showDraggingState(){this.$button.classList.add("govuk-file-upload-button--dragging")}hideDraggingState(){this.$button.classList.remove("govuk-file-upload-button--dragging")}onDrop(t){t.preventDefault(),t.dataTransfer&&this.canFillInput(t.dataTransfer)&&(this.$input.files=t.dataTransfer.files,this.$input.dispatchEvent(new CustomEvent("change")),this.hideDraggingState())}canFillInput(t){return this.matchesInputCapacity(t.files.length)}canDrop(t){return t.items.length?this.matchesInputCapacity(function(t){let e=0;for(let n=0;n<t.length;n++)"file"===t[n].kind&&e++;return e}
45
45
  /**
46
46
  * Password input component
47
47
  *
48
48
  * @preserve
49
49
  * @augments ConfigurableComponent<PasswordInputConfig>
50
- */(t.items)):!t.types.length||t.types.includes("Files")}matchesInputCapacity(t){return this.$input.multiple?t>0:1===t}onChange(){const t=this.$input.files.length;0===t?(this.$status.innerText=this.i18n.t("noFileChosen"),this.$button.classList.add("govuk-file-upload-button--empty")):(this.$status.innerText=1===t?this.$input.files[0].name:this.i18n.t("multipleFilesChosen",{count:t}),this.$button.classList.remove("govuk-file-upload-button--empty"))}findLabel(){const t=document.querySelector(`label[for="${this.$input.id}"]`);if(!t)throw new a({component:y,identifier:`Field label (\`<label for=${this.$input.id}>\`)`});return t}onClick(){this.$input.click()}observeDisabledState(){new MutationObserver(t=>{for(const e of t)"attributes"===e.type&&"disabled"===e.attributeName&&this.updateDisabledState()}).observe(this.$input,{attributes:!0})}updateDisabledState(){this.$button.disabled=this.$input.disabled,this.$root.classList.toggle("govuk-file-upload-wrapper--disabled",this.$button.disabled)}}y.moduleName="govuk-file-upload",y.defaults=Object.freeze({i18n:{chooseFilesButton:"Choose file",dropInstruction:"or drop file",noFileChosen:"No file chosen",multipleFilesChosen:{one:"%{count} file chosen",other:"%{count} files chosen"},enteredDropZone:"Entered drop zone",leftDropZone:"Left drop zone"}}),y.schema=Object.freeze({properties:{i18n:{type:"object"}}});class x extends d{constructor(t,e={}){super(t,e),this.i18n=void 0,this.$input=void 0,this.$showHideButton=void 0,this.$screenReaderStatusMessage=void 0;const n=this.$root.querySelector(".govuk-js-password-input-input");if(!(n instanceof HTMLInputElement))throw new a({component:x,element:n,expectedType:"HTMLInputElement",identifier:"Form field (`.govuk-js-password-input-input`)"});if("password"!==n.type)throw new a("Password input: Form field (`.govuk-js-password-input-input`) must be of type `password`.");const i=this.$root.querySelector(".govuk-js-password-input-toggle");if(!(i instanceof HTMLButtonElement))throw new a({component:x,element:i,expectedType:"HTMLButtonElement",identifier:"Button (`.govuk-js-password-input-toggle`)"});if("button"!==i.type)throw new a("Password input: Button (`.govuk-js-password-input-toggle`) must be of type `button`.");this.$input=n,this.$showHideButton=i,this.i18n=new g(this.config.i18n,{locale:v(this.$root,"lang")}),this.$showHideButton.removeAttribute("hidden");const s=document.createElement("div");s.className="govuk-password-input__sr-status govuk-visually-hidden",s.setAttribute("aria-live","polite"),this.$screenReaderStatusMessage=s,this.$input.insertAdjacentElement("afterend",s),this.$showHideButton.addEventListener("click",this.toggle.bind(this)),this.$input.form&&this.$input.form.addEventListener("submit",()=>this.hide()),window.addEventListener("pageshow",t=>{t.persisted&&"password"!==this.$input.type&&this.hide()}),this.hide()}toggle(t){t.preventDefault(),"password"!==this.$input.type?this.hide():this.show()}show(){this.setType("text")}hide(){this.setType("password")}setType(t){if(t===this.$input.type)return;this.$input.setAttribute("type",t);const e="password"===t,n=e?"show":"hide",i=e?"passwordHidden":"passwordShown";this.$showHideButton.innerText=this.i18n.t(`${n}Password`),this.$showHideButton.setAttribute("aria-label",this.i18n.t(`${n}PasswordAriaLabel`)),this.$screenReaderStatusMessage.innerText=this.i18n.t(`${i}Announcement`)}}x.moduleName="govuk-password-input",x.defaults=Object.freeze({i18n:{showPassword:"Show",hidePassword:"Hide",showPasswordAriaLabel:"Show password",hidePasswordAriaLabel:"Hide password",passwordShownAnnouncement:"Your password is visible",passwordHiddenAnnouncement:"Your password is hidden"}}),x.schema=Object.freeze({properties:{i18n:{type:"object"}}});
50
+ */(t.items)):!t.types.length||t.types.includes("Files")}matchesInputCapacity(t){return this.$input.multiple?t>0:1===t}onChange(){const t=this.$input.files.length;0===t?(this.$status.innerText=this.i18n.t("noFileChosen"),this.$button.classList.add("govuk-file-upload-button--empty")):(this.$status.innerText=1===t?this.$input.files[0].name:this.i18n.t("multipleFilesChosen",{count:t}),this.$button.classList.remove("govuk-file-upload-button--empty"))}findLabel(){const t=document.querySelector(`label[for="${this.$input.id}"]`);if(!t)throw new d({component:L,identifier:`Field label (\`<label for=${this.$input.id}>\`)`});return t}onClick(){this.$input.click()}observeDisabledState(){new MutationObserver(t=>{for(const e of t)"attributes"===e.type&&"disabled"===e.attributeName&&this.updateDisabledState()}).observe(this.$input,{attributes:!0})}updateDisabledState(){this.$button.disabled=this.$input.disabled,this.$root.classList.toggle("govuk-file-upload-wrapper--disabled",this.$button.disabled)}}L.moduleName="govuk-file-upload",L.defaults=Object.freeze({i18n:{chooseFilesButton:"Choose file",dropInstruction:"or drop file",noFileChosen:"No file chosen",multipleFilesChosen:{one:"%{count} file chosen",other:"%{count} files chosen"},enteredDropZone:"Entered drop zone",leftDropZone:"Left drop zone"}}),L.schema=Object.freeze({properties:{i18n:{type:"object"}}});class k extends m{constructor(t,e={}){super(t,e),this.i18n=void 0,this.$input=void 0,this.$showHideButton=void 0,this.$screenReaderStatusMessage=void 0;const n=this.$root.querySelector(".govuk-js-password-input-input");if(!(n instanceof HTMLInputElement))throw new d({component:k,element:n,expectedType:"HTMLInputElement",identifier:"Form field (`.govuk-js-password-input-input`)"});if("password"!==n.type)throw new d("Password input: Form field (`.govuk-js-password-input-input`) must be of type `password`.");const i=this.$root.querySelector(".govuk-js-password-input-toggle");if(!(i instanceof HTMLButtonElement))throw new d({component:k,element:i,expectedType:"HTMLButtonElement",identifier:"Button (`.govuk-js-password-input-toggle`)"});if("button"!==i.type)throw new d("Password input: Button (`.govuk-js-password-input-toggle`) must be of type `button`.");this.$input=n,this.$showHideButton=i,this.i18n=new y(this.config.i18n,{locale:$(this.$root,"lang")}),this.$showHideButton.removeAttribute("hidden");const s=document.createElement("div");s.className="govuk-password-input__sr-status govuk-visually-hidden",s.setAttribute("aria-live","polite"),this.$screenReaderStatusMessage=s,this.$input.insertAdjacentElement("afterend",s),this.$showHideButton.addEventListener("click",this.toggle.bind(this)),this.$input.form&&this.$input.form.addEventListener("submit",()=>this.hide()),window.addEventListener("pageshow",t=>{t.persisted&&"password"!==this.$input.type&&this.hide()}),this.hide()}toggle(t){t.preventDefault(),"password"!==this.$input.type?this.hide():this.show()}show(){this.setType("text")}hide(){this.setType("password")}setType(t){if(t===this.$input.type)return;this.$input.setAttribute("type",t);const e="password"===t,n=e?"show":"hide",i=e?"passwordHidden":"passwordShown";this.$showHideButton.innerText=this.i18n.t(`${n}Password`),this.$showHideButton.setAttribute("aria-label",this.i18n.t(`${n}PasswordAriaLabel`)),this.$screenReaderStatusMessage.innerText=this.i18n.t(`${i}Announcement`)}}k.moduleName="govuk-password-input",k.defaults=Object.freeze({i18n:{showPassword:"Show",hidePassword:"Hide",showPasswordAriaLabel:"Show password",hidePasswordAriaLabel:"Hide password",passwordShownAnnouncement:"Your password is visible",passwordHiddenAnnouncement:"Your password is hidden"}}),k.schema=Object.freeze({properties:{i18n:{type:"object"}}});
51
51
  /**
52
52
  * Radios component
53
53
  *
54
54
  * @preserve
55
55
  */
56
- class C extends l{constructor(t){super(t),this.$inputs=void 0;const e=this.$root.querySelectorAll('input[type="radio"]');if(!e.length)throw new a({component:C,identifier:'Form inputs (`<input type="radio">`)'});this.$inputs=e,this.$inputs.forEach(t=>{const e=t.getAttribute("data-aria-controls");if(e){if(!document.getElementById(e))throw new a({component:C,identifier:`Conditional reveal (\`id="${e}"\`)`});t.setAttribute("aria-controls",e),t.removeAttribute("data-aria-controls")}}),window.addEventListener("pageshow",()=>this.syncAllConditionalReveals()),this.syncAllConditionalReveals(),this.$root.addEventListener("click",t=>this.handleClick(t))}syncAllConditionalReveals(){this.$inputs.forEach(t=>this.syncConditionalRevealWithInputState(t))}syncConditionalRevealWithInputState(t){const e=t.getAttribute("aria-controls");if(!e)return;const n=document.getElementById(e);if(null!=n&&n.classList.contains("govuk-radios__conditional")){const e=t.checked;t.setAttribute("aria-expanded",e.toString()),n.classList.toggle("govuk-radios__conditional--hidden",!e)}}handleClick(t){const e=t.target;if(!(e instanceof HTMLInputElement)||"radio"!==e.type)return;const n=document.querySelectorAll('input[type="radio"][aria-controls]'),i=e.form,s=e.name;n.forEach(t=>{const e=t.form===i;t.name===s&&e&&this.syncConditionalRevealWithInputState(t)})}}C.moduleName="govuk-radios";class k extends t{static targets=["preview","destroy"];static values={mimeTypes:Array};connect(){this.counter=0,this.initialPreviewContent=null,this.onUploadFlag=!1}onUpload(t){this.onUploadFlag=!0,this.hasDestroyTarget&&(this.destroyTarget.value=!1),this.previewTarget.removeAttribute("hidden"),this.hasPreviewTarget&&(t.currentTarget.files.length>0?this.showPreview(t.currentTarget.files[0]):this.setPreviewContent(this.initialPreviewContent))}setDestroy(t){t.preventDefault(),this.initialPreviewContent&&this.onUploadFlag?(this.onUploadFlag=!1,this.setPreviewContent(this.initialPreviewContent)):(this.hasDestroyTarget&&(this.destroyTarget.value=!0),this.hasPreviewTarget&&(this.previewTarget.setAttribute("hidden",""),this.setPreviewContent("")),this.previousInput&&this.previousInput.toggleAttribute("disabled",!0)),this.fileInput.value=""}setPreviewContent(t){this.filenameTag&&(this.filenameTag.innerText=text)}drop(t){t.preventDefault();const e=this.fileForEvent(t,this.mimeTypesValue);if(e){const t=new DataTransfer;t.items.add(e),this.fileInput.files=t.files,this.fileInput.dispatchEvent(new Event("change"))}this.counter=0,this.element.classList.remove("droppable")}dragover(t){t.preventDefault()}dragenter(t){t.preventDefault(),0===this.counter&&this.element.classList.add("droppable"),this.counter++}dragleave(t){t.preventDefault(),this.counter--,0===this.counter&&this.element.classList.remove("droppable")}get fileInput(){return this.element.querySelector("input[type='file']")}get previousInput(){return this.element.querySelector(`input[type='hidden'][name='${this.fileInput.name}']`)}get filenameTag(){return this.hasPreviewTarget?this.previewTarget.querySelector("p.preview-filename"):null}showPreview(t){const e=new FileReader;e.onload=e=>{this.filenameTag&&(this.filenameTag.innerText=t.name)},e.readAsDataURL(t)}fileForEvent(t,e){const n=t=>e.indexOf(t.type)>-1;let i;if(t.dataTransfer.items){const e=[...t.dataTransfer.items].find(n);e&&(i=e.getAsFile())}else i=[...t.dataTransfer.files].find(n);return i}}const E=[{identifier:"govuk-document-field",controllerConstructor:class extends k{connect(){super.connect(),this.initialPreviewContent=this.filenameTag.text}setPreviewContent(t){this.filenameTag.innerText=t}showPreview(t){const e=new FileReader;e.onload=e=>{this.filenameTag&&(this.filenameTag.innerText=t.name)},e.readAsDataURL(t)}get filenameTag(){return this.previewTarget.querySelector("p.preview-filename")}}},{identifier:"govuk-image-field",controllerConstructor:class extends k{connect(){super.connect(),this.initialPreviewContent=this.imageTag.getAttribute("src")}setPreviewContent(t){this.imageTag.src=t}showPreview(t){const e=new FileReader;e.onload=t=>{this.imageTag.src=t.target.result},e.readAsDataURL(t)}get imageTag(){return this.previewTarget.querySelector("img")}}}];function T(t){let n;if(t=void 0!==t?t:{},!e())return void console.log(new o);const i=[[f,t.button],[b,t.characterCount],[w],[$,t.errorSummary],[y,t.fileUpload],[C],[x,t.passwordInput]],s=null!=(n=t.scope)?n:document;i.forEach(([t,e])=>{s.querySelectorAll(`[data-module="${t.moduleName}"]`).forEach(n=>{try{"defaults"in t?new t(n,e):new t(n)}catch(t){console.log(t)}})})}export{f as Button,b as CharacterCount,w as Checkboxes,$ as ErrorSummary,x as PasswordInput,C as Radios,E as default,T as initAll};
56
+ class x extends h{constructor(t){super(t),this.$inputs=void 0;const e=this.$root.querySelectorAll('input[type="radio"]');if(!e.length)throw new d({component:x,identifier:'Form inputs (`<input type="radio">`)'});this.$inputs=e,this.$inputs.forEach(t=>{const e=t.getAttribute("data-aria-controls");if(e){if(!document.getElementById(e))throw new d({component:x,identifier:`Conditional reveal (\`id="${e}"\`)`});t.setAttribute("aria-controls",e),t.removeAttribute("data-aria-controls")}}),window.addEventListener("pageshow",()=>this.syncAllConditionalReveals()),this.syncAllConditionalReveals(),this.$root.addEventListener("click",t=>this.handleClick(t))}syncAllConditionalReveals(){this.$inputs.forEach(t=>this.syncConditionalRevealWithInputState(t))}syncConditionalRevealWithInputState(t){const e=t.getAttribute("aria-controls");if(!e)return;const n=document.getElementById(e);if(null!=n&&n.classList.contains("govuk-radios__conditional")){const e=t.checked;t.setAttribute("aria-expanded",e.toString()),n.classList.toggle("govuk-radios__conditional--hidden",!e)}}handleClick(t){const e=t.target;if(!(e instanceof HTMLInputElement)||"radio"!==e.type)return;const n=document.querySelectorAll('input[type="radio"][aria-controls]'),i=e.form,s=e.name;n.forEach(t=>{const e=t.form===i;t.name===s&&e&&this.syncConditionalRevealWithInputState(t)})}}x.moduleName="govuk-radios";const A={brand:"govuk"},S="[type='button']:has(+ input[type='file'])",I={moduleName:"govuk-attachment",defaults:{i18n:{...L.defaults.i18n,uploadSucceeded:"Uploaded successfully",uploadFailed:"Upload failed — try again",retryButton:"Try again",fileRemoved:"%{filename} removed",removeButton:"Remove %{filename}",removeButtonContent:"Remove"}},schema:{properties:{i18n:{type:"object"}}}};function D(t){return v(I.defaults,f(I,t?.dataset??{}))}class M extends n{async start(t){this.dispatch("start");try{const e=await new Promise((t,e)=>{this.directUpload.create((n,i)=>n?e(n):t(i))});t.value=e.signed_id}catch(t){throw this.dispatch("error",{error:t}),t}finally{this.dispatch("end")}}}let B=0;function F(t,e,n){const i=document.createElement("TEMPLATE"),s=++B;i.innerHTML=`\n <figure class="${A.brand}-attachment" data-controller="govuk-attachment" aria-labelledby="attachment-${s}-filename">\n <img alt="" class="preview" src="">\n <figcaption class="caption" aria-atomic="true" aria-live="polite">\n <span id="attachment-${s}-filename" class="filename"></span>\n <span class="size"></span>\n <span class="status"></span>\n </figcaption>\n <div class="actions">\n <select id="attachment-${s}-input" name="${t.name}" aria-labelledby="attachment-${s}-filename">\n <option selected="selected" value=""></option>\n <option value=""></option>\n </select>\n <button type="button" class="${A.brand}-button ${A.brand}-button--secondary ${A.brand}-attachment__remove" data-action="govuk-attachment#destroy" data-module="govuk-button"></button>\n </div>\n </figure>\n `;const o=i.content.firstElementChild;o.querySelector(".filename").textContent=e.name,o.querySelector(".size").textContent=function(t){if(1===t)return"1 Byte";if(t<1024)return`${t} Bytes`;const e=Math.min(Math.floor(Math.log2(t)/10),P.length-1);return`${Number((t/1024**e).toPrecision(3))} ${P[e]}`}(e.size);const[r,a]=o.querySelectorAll("option");r.textContent=e.name,a.textContent=n.t("removeButton",{filename:e.name});const l=o.querySelector("button");return l.textContent=n.t("removeButtonContent"),l.setAttribute("aria-label",n.t("removeButton",{filename:e.name})),o.file=e,o}const P=["Bytes","KB","MB","GB","TB","PB"];class R extends t{static targets=["preview","destroy"];static values={mimeTypes:Array};connect(){this.counter=0,this.initialPreviewContent=null,this.onUploadFlag=!1}onUpload(t){this.onUploadFlag=!0,this.hasDestroyTarget&&(this.destroyTarget.value=!1),this.previewTarget.removeAttribute("hidden"),this.hasPreviewTarget&&(t.currentTarget.files.length>0?this.showPreview(t.currentTarget.files[0]):this.setPreviewContent(this.initialPreviewContent))}setDestroy(t){t.preventDefault(),this.initialPreviewContent&&this.onUploadFlag?(this.onUploadFlag=!1,this.setPreviewContent(this.initialPreviewContent)):(this.hasDestroyTarget&&(this.destroyTarget.value=!0),this.hasPreviewTarget&&(this.previewTarget.setAttribute("hidden",""),this.setPreviewContent("")),this.previousInput&&this.previousInput.toggleAttribute("disabled",!0)),this.fileInput.value=""}setPreviewContent(t){this.filenameTag&&(this.filenameTag.innerText=text)}drop(t){t.preventDefault();const e=this.fileForEvent(t,this.mimeTypesValue);if(e){const t=new DataTransfer;t.items.add(e),this.fileInput.files=t.files,this.fileInput.dispatchEvent(new Event("change"))}this.counter=0,this.element.classList.remove("droppable")}dragover(t){t.preventDefault()}dragenter(t){t.preventDefault(),0===this.counter&&this.element.classList.add("droppable"),this.counter++}dragleave(t){t.preventDefault(),this.counter--,0===this.counter&&this.element.classList.remove("droppable")}get fileInput(){return this.element.querySelector("input[type='file']")}get previousInput(){return this.element.querySelector(`input[type='hidden'][name='${this.fileInput.name}']`)}get filenameTag(){return this.hasPreviewTarget?this.previewTarget.querySelector("p.preview-filename"):null}showPreview(t){const e=new FileReader;e.onload=e=>{this.filenameTag&&(this.filenameTag.innerText=t.name)},e.readAsDataURL(t)}fileForEvent(t,e){const n=t=>e.indexOf(t.type)>-1;let i;if(t.dataTransfer.items){const e=[...t.dataTransfer.items].find(n);e&&(i=e.getAsFile())}else i=[...t.dataTransfer.files].find(n);return i}}const O=[{identifier:"govuk-attachment",controllerConstructor:class extends t{connect(){this.config=D(this.element.closest(`.${A.brand}-file-upload-wrapper`)),this.i18n=new y(this.config.i18n,{locale:$(this.element,"lang")}),this.select.addEventListener("change",this.change),this.previewPendingFile(),this.uploadPendingFile()}disconnect(){this.select?.removeEventListener("change",this.change)}previewPendingFile(){const t=this.element.file;if(!t)return;if(!t.type.startsWith("image/"))return void this.imageTag?.remove();const e=new FileReader;e.onload=this.onPreviewReady,e.readAsDataURL(t)}uploadPendingFile(){const t=this.element.file;t&&this.input?.dataset.directUploadUrl&&(delete this.element.file,this.input.dispatchEvent(new CustomEvent("govuk:upload",{detail:{file:t}})),this.performUpload(t))}async performUpload(t){this.uploader=new M(this.input,t),this.element.dataset.state="uploading",this.statusText="",this.retryButton?.remove();const e=function(t){const e=document.createElement("PROGRESS");e.className=`${A.brand}-attachment-progress`,t&&e.setAttribute("aria-labelledby",t);return e.value=0,e.max=100,e}(this.filenameTag.id);this.captionTag.appendChild(e),this.input.addEventListener("direct-upload:progress",this.progress);try{await this.uploader.start(this.inputOption),this.element.dataset.state="upload-successful",this.statusText=this.i18n.t("uploadSucceeded")}catch(e){console.warn(e),this.element.dataset.state="upload-failed",this.statusText=this.i18n.t("uploadFailed"),this.actionsTag?.prepend(function(t,e){const n=document.createElement("BUTTON");return n.type="button",n.className=`${A.brand}-button ${A.brand}-button--secondary ${A.brand}-attachment__retry`,n.textContent=e.t("retryButton"),n.setAttribute("aria-label",`${e.t("retryButton")} ${t}`),n.dataset.action="govuk-attachment#retry",n.dataset.module="govuk-button",n}(t.name,this.i18n))}finally{this.input.removeEventListener("direct-upload:progress",this.progress),e.remove()}}onPreviewReady=t=>{this.imageTag.src=t.target.result};change=()=>{""===this.select.value&&this.destroy()};retry(){this.performUpload(this.directUpload.file),this.removeButton?.focus()}progress=({detail:t})=>{t.id===this.id&&this.progressTag&&(this.progressTag.value=t.progress)};destroy(){const t=this.uploadButton,e=new CustomEvent("govuk:remove",{detail:{name:this.element.querySelector(".filename")?.textContent,file:this.element.file},cancelable:!0});this.input.dispatchEvent(e)&&(this.element.remove(),t?.focus())}get id(){return this.directUpload?.id??this.select.id}get directUpload(){return this.uploader?.directUpload}get input(){return this.element.closest(`.${A.brand}-file-upload-wrapper`)?.querySelector("input[type=file]")}get uploadButton(){return this.element.closest(`.${A.brand}-file-upload-wrapper`)?.querySelector(S)}set statusText(t){const e=this.element.querySelector("figcaption .status");e&&(e.textContent=t)}get captionTag(){return this.element.querySelector("figcaption")}get filenameTag(){return this.element.querySelector("figcaption .filename")}get actionsTag(){return this.element.querySelector(".actions")}get select(){return this.element.querySelector("select")}get inputOption(){return this.element.querySelector("option")}get imageTag(){return this.element.querySelector("img")}get progressTag(){return this.element.querySelector("progress")}get retryButton(){return this.element.querySelector(".actions button[data-action*='retry']")}get removeButton(){return this.element.querySelector(".actions button[data-action*='destroy']")}}},{identifier:"govuk-document-field",controllerConstructor:class extends R{connect(){super.connect(),this.initialPreviewContent=this.filenameTag.text}setPreviewContent(t){this.filenameTag.innerText=t}showPreview(t){const e=new FileReader;e.onload=e=>{this.filenameTag&&(this.filenameTag.innerText=t.name)},e.readAsDataURL(t)}get filenameTag(){return this.previewTarget.querySelector("p.preview-filename")}}},{identifier:"govuk-file-upload",controllerConstructor:class extends t{connect(){if(!this.fileInput)throw new Error(`Missing file input for ${this.element}`);this.config=D(this.element),this.i18n=new y(this.config.i18n,{locale:$(this.element,"lang")}),this.id=this.uploadButton?.id??this.fileInput.id,document.addEventListener("dragenter",this.onDragenter),document.addEventListener("dragleave",this.onDragleave),this.element.addEventListener("dragover",this.onDragover),this.element.addEventListener("drop",this.onDrop),this.enhance(),this.morphObserver=new MutationObserver(this.onMorph),this.morphObserver.observe(this.element,{childList:!0})}disconnect(){this.morphObserver?.disconnect(),this.disabledObserver?.disconnect(),this.uploadButton?.removeEventListener("click",this.onClick),this.element.removeEventListener("dragover",this.onDragover),this.element.removeEventListener("drop",this.onDrop),this.unbindInput(),document.removeEventListener("dragenter",this.onDragenter),document.removeEventListener("dragleave",this.onDragleave),this.announcements?.remove()}enhance(){const t=this.fileInput;let e=this.uploadButton;e||(this.ensureLabelId(),t.id=`${this.id}-input`,t.setAttribute("hidden","hidden"),e=function(t,e,n){const i=A.brand,s=document.createElement("TEMPLATE");s.innerHTML=`\n <button\n class="${i}-file-upload-button ${i}-file-upload-button--empty"\n type="button"\n id="${t}"\n aria-labelledby="${t}-label ${t}-comma ${t}"\n >\n <span class="${i}-body ${i}-file-upload-button__status"\n aria-live="polite">${e.t("noFileChosen")}</span>\n <span class="${i}-visually-hidden" id="${t}-comma">, </span>\n <span class="${i}-file-upload-button__pseudo-button-container">\n <span class="${i}-button\n ${i}-button--secondary\n ${i}-file-upload-button__pseudo-button">${e.t("chooseFilesButton")}</span>\n <span class="${i}-body ${i}-file-upload-button__instruction">${e.t("dropInstruction")}</span>\n </span>\n </button>\n `;const o=s.content.firstElementChild,r=n.getAttribute("aria-describedby");r&&o.setAttribute("aria-describedby",r);return o}(this.id,this.i18n,t),t.insertAdjacentElement("beforebegin",e),e.addEventListener("click",this.onClick)),this.announcements||this.element.appendChild(function(){const t=document.createElement("span");return t.className=`${A.brand}-file-upload-announcements ${A.brand}-visually-hidden`,t.setAttribute("aria-live","assertive"),t}()),this.unbindInput(),t.addEventListener("change",this.onChange),t.addEventListener("govuk:upload",this.onUpload),t.addEventListener("govuk:remove",this.onRemove),this.updateDisabledState(),this.observeDisabledState(),this.updateCount()}unbindInput(){this.fileInput?.removeEventListener("change",this.onChange),this.fileInput?.removeEventListener("govuk:upload",this.onUpload),this.fileInput?.removeEventListener("govuk:remove",this.onRemove)}onMorph=()=>{this.uploadButton||(this.fileInput.value="",this.element.querySelectorAll("figure").forEach(t=>{delete t.file}),this.enhance())};ensureLabelId(){const t=document.querySelector(`label[for="${this.id}"]`);t&&!t.id&&(t.id=`${this.id}-label`)}updateDisabledState(){if(!this.uploadButton)return;const t=this.fileInput.disabled;this.uploadButton.disabled=t,this.element.classList.toggle(`${A.brand}-file-upload-wrapper--disabled`,t)}observeDisabledState(){this.disabledObserver?.disconnect(),this.disabledObserver=new MutationObserver(t=>{for(const e of t)"disabled"===e.attributeName&&this.updateDisabledState()}),this.disabledObserver.observe(this.fileInput,{attributes:!0})}onClick=t=>{this.fileInput.click()};onDragover=t=>{this.fileInput.disabled||t.preventDefault()};onDragenter=t=>{this.updateDropzoneVisibility(t),this.enteredAnotherElement=!0};onDragleave=()=>{this.enteredAnotherElement||this.uploadButton.disabled||(this.hideDraggingState(),this.announce(this.i18n.t("leftDropZone"))),this.enteredAnotherElement=!1};onDrop=t=>{this.fileInput.disabled||(t.preventDefault(),t.dataTransfer&&this.canFillInput(t.dataTransfer)&&(this.fileInput.files=t.dataTransfer.files,this.fileInput.dispatchEvent(new CustomEvent("change")),this.hideDraggingState()))};updateDropzoneVisibility(t){this.uploadButton.disabled||t.target instanceof Node&&(this.element.contains(t.target)?t.dataTransfer&&this.canDrop(t.dataTransfer)&&(this.isDragging||(this.showDraggingState(),this.announce(this.i18n.t("enteredDropZone")))):this.isDragging&&(this.hideDraggingState(),this.announce(this.i18n.t("leftDropZone"))))}showDraggingState(){this.uploadButton.classList.add(`${A.brand}-file-upload-button--dragging`)}hideDraggingState(){this.uploadButton.classList.remove(`${A.brand}-file-upload-button--dragging`)}announce(t){this.announcements&&(this.announcements.textContent=t)}get announcements(){return this.element.querySelector(`.${A.brand}-file-upload-announcements`)}matchesInputCapacity(t){return this.fileInput.multiple?t>0:1===t}canDrop(t){return t.items.length?this.matchesInputCapacity((e=t.items,Array.from(e).filter(t=>"file"===t.kind).length)):!t.types.length||t.types.includes("Files");var e}canFillInput(t){return this.matchesInputCapacity(t.files.length)}onChange=()=>{const t=Array.from(this.fileInput.files),e=Array.from(this.element.querySelectorAll("figure"));e.forEach(e=>{e.file&&!t.includes(e.file)&&e.remove()}),t.forEach(t=>{if(e.some(e=>e.file===t))return;const n=F(this.fileInput,t,this.i18n);this.uploadButton.insertAdjacentElement("beforebegin",n)}),this.updateCount()};onUpload=({detail:{file:t}})=>{this.releaseFile(t),this.updateCount()};releaseFile(t){const e=new DataTransfer;for(const n of this.fileInput.files)n!==t&&e.items.add(n);this.fileInput.files=e.files}onRemove=async t=>{if(await Promise.resolve(),t.defaultPrevented)return;const{name:e,file:n}=t.detail;n&&this.releaseFile(n),this.announce(this.i18n.t("fileRemoved",{filename:e})),this.updateCount()};updateCount(){const t=this.fileCount;0===t?(this.statusTag.innerText=this.i18n.t("noFileChosen"),this.uploadButton.classList.add(`${A.brand}-file-upload-button--empty`)):(this.statusTag.innerText=this.i18n.t("multipleFilesChosen",{count:t}),this.uploadButton.classList.remove(`${A.brand}-file-upload-button--empty`))}get fileInput(){return this.element.querySelector("input[type='file']")}get uploadButton(){return this.element.querySelector(S)}get isDragging(){return this.uploadButton.classList.contains(`${A.brand}-file-upload-button--dragging`)}get statusTag(){return this.element.querySelector("button [aria-live]")}get fileCount(){let t=this.fileInput.files.length;return this.element.querySelectorAll(`select[name='${this.fileInput.name}']`).forEach(e=>{e.closest("figure")?.file||(t+=1)}),this.fileInput.multiple||(t=Math.min(t,1)),t}}},{identifier:"govuk-image-field",controllerConstructor:class extends R{connect(){super.connect(),this.initialPreviewContent=this.imageTag.getAttribute("src")}setPreviewContent(t){this.imageTag.src=t}showPreview(t){const e=new FileReader;e.onload=t=>{this.imageTag.src=t.target.result},e.readAsDataURL(t)}get imageTag(){return this.previewTarget.querySelector("img")}}}];let _={};function q(t=document){if(!s())return void console.log(new l);[[w,_.button],[E,_.characterCount],[C],[T,_.errorSummary],[L,_.fileUpload],[x],[k,_.passwordInput]].forEach(([e,n])=>{const s=`[data-module="${e.moduleName}"]`;[...t instanceof Element&&t.matches(s)?[t]:[],...t.querySelectorAll(s)].forEach(t=>{if(!i(t,e.moduleName))try{"defaults"in e?new e(t,n):new e(t)}catch(t){console.log(t)}})})}function j(t){t.classList.toggle("js-enabled",!0),t.classList.toggle("govuk-frontend-supported","noModule"in HTMLScriptElement.prototype)}function N(t){new MutationObserver(()=>{(function(t){const e="noModule"in HTMLScriptElement.prototype;return t.classList.contains("js-enabled")&&t.classList.contains("govuk-frontend-supported")===e})(t)||(j(t),q())}).observe(t,{attributes:!0,attributeFilter:["class"]}),new MutationObserver(t=>{for(const e of t)for(const t of e.addedNodes)t instanceof Element&&q(t)}).observe(t,{childList:!0,subtree:!0})}function H(t){t&&!t.__govukFormbuilderInit&&(t.__govukFormbuilderInit=!0,j(t),q(),N(t))}let U=!1;function z(t=void 0){U||(U=!0,(t??e.start()).load(O))}function V(t){t.brand&&(A.brand=t.brand),_=t}function Y(t={}){V(t),z(),H(document.body)}let W=!1;var Z={start:function(t=void 0,e={}){V(e),z(t),W||(W=!0,new MutationObserver(()=>H(document.body)).observe(document.documentElement,{childList:!0})),H(document.body)}};export{w as Button,E as CharacterCount,C as Checkboxes,T as ErrorSummary,k as PasswordInput,x as Radios,Z as default,Y as initAll};
57
57
  //# sourceMappingURL=formbuilder.min.js.map