diff --git a/extensions/package-manager/js/dist-typings/components/TaskOutputModal.d.ts b/extensions/package-manager/js/dist-typings/components/TaskOutputModal.d.ts
index 9a49783a86..4ad9a25a71 100644
--- a/extensions/package-manager/js/dist-typings/components/TaskOutputModal.d.ts
+++ b/extensions/package-manager/js/dist-typings/components/TaskOutputModal.d.ts
@@ -1,3 +1,4 @@
+///
///
///
import Modal, { IInternalModalAttrs } from 'flarum/common/components/Modal';
diff --git a/extensions/package-manager/js/dist-typings/components/WhyNotModal.d.ts b/extensions/package-manager/js/dist-typings/components/WhyNotModal.d.ts
index 2b6082f29f..bc5999870c 100644
--- a/extensions/package-manager/js/dist-typings/components/WhyNotModal.d.ts
+++ b/extensions/package-manager/js/dist-typings/components/WhyNotModal.d.ts
@@ -1,3 +1,4 @@
+///
///
import type Mithril from 'mithril';
import Modal, { IInternalModalAttrs } from 'flarum/common/components/Modal';
diff --git a/extensions/tags/js/dist-typings/admin/components/EditTagModal.d.ts b/extensions/tags/js/dist-typings/admin/components/EditTagModal.d.ts
index 89844a829f..839f19a7cd 100644
--- a/extensions/tags/js/dist-typings/admin/components/EditTagModal.d.ts
+++ b/extensions/tags/js/dist-typings/admin/components/EditTagModal.d.ts
@@ -1,3 +1,4 @@
+///
///
import FormModal, { IFormModalAttrs } from 'flarum/common/components/FormModal';
import ItemList from 'flarum/common/utils/ItemList';
diff --git a/extensions/tags/js/dist-typings/forum/components/DiscussionTaggedPost.d.ts b/extensions/tags/js/dist-typings/forum/components/DiscussionTaggedPost.d.ts
index 1125020ebc..121ea18a2b 100644
--- a/extensions/tags/js/dist-typings/forum/components/DiscussionTaggedPost.d.ts
+++ b/extensions/tags/js/dist-typings/forum/components/DiscussionTaggedPost.d.ts
@@ -1,3 +1,4 @@
+///
///
export default class DiscussionTaggedPost extends EventPost {
static initAttrs(attrs: any): void;
diff --git a/framework/core/js/dist-typings/admin/components/AdvancedPage.d.ts b/framework/core/js/dist-typings/admin/components/AdvancedPage.d.ts
index 1e9050bc4a..34a2e74796 100644
--- a/framework/core/js/dist-typings/admin/components/AdvancedPage.d.ts
+++ b/framework/core/js/dist-typings/admin/components/AdvancedPage.d.ts
@@ -1,4 +1,4 @@
-///
+///
import AdminPage from './AdminPage';
import type { IPageAttrs } from '../../common/components/Page';
import type Mithril from 'mithril';
diff --git a/framework/core/js/dist-typings/admin/components/AppearancePage.d.ts b/framework/core/js/dist-typings/admin/components/AppearancePage.d.ts
index 64820117c8..9ceae9e8f0 100644
--- a/framework/core/js/dist-typings/admin/components/AppearancePage.d.ts
+++ b/framework/core/js/dist-typings/admin/components/AppearancePage.d.ts
@@ -1,4 +1,4 @@
-///
+///
import AdminPage from './AdminPage';
import ItemList from '../../common/utils/ItemList';
import type Mithril from 'mithril';
diff --git a/framework/core/js/dist-typings/admin/components/BasicsPage.d.ts b/framework/core/js/dist-typings/admin/components/BasicsPage.d.ts
index 264da04303..db0c134d7c 100644
--- a/framework/core/js/dist-typings/admin/components/BasicsPage.d.ts
+++ b/framework/core/js/dist-typings/admin/components/BasicsPage.d.ts
@@ -1,4 +1,4 @@
-///
+///
import ItemList from '../../common/utils/ItemList';
import AdminPage from './AdminPage';
import type { IPageAttrs } from '../../common/components/Page';
diff --git a/framework/core/js/dist-typings/admin/components/CreateUserModal.d.ts b/framework/core/js/dist-typings/admin/components/CreateUserModal.d.ts
index 473dfc5b11..2d6510affe 100644
--- a/framework/core/js/dist-typings/admin/components/CreateUserModal.d.ts
+++ b/framework/core/js/dist-typings/admin/components/CreateUserModal.d.ts
@@ -1,4 +1,4 @@
-///
+///
import FormModal, { IFormModalAttrs } from '../../common/components/FormModal';
import ItemList from '../../common/utils/ItemList';
import Stream from '../../common/utils/Stream';
diff --git a/framework/core/js/dist-typings/admin/components/DashboardPage.d.ts b/framework/core/js/dist-typings/admin/components/DashboardPage.d.ts
index c7090dd713..b94e449d61 100644
--- a/framework/core/js/dist-typings/admin/components/DashboardPage.d.ts
+++ b/framework/core/js/dist-typings/admin/components/DashboardPage.d.ts
@@ -1,4 +1,4 @@
-///
+///
import ItemList from '../../common/utils/ItemList';
import AdminPage from './AdminPage';
import type { Children } from 'mithril';
diff --git a/framework/core/js/dist-typings/admin/components/EditCustomCssModal.d.ts b/framework/core/js/dist-typings/admin/components/EditCustomCssModal.d.ts
index ec92bfc341..782786cd40 100644
--- a/framework/core/js/dist-typings/admin/components/EditCustomCssModal.d.ts
+++ b/framework/core/js/dist-typings/admin/components/EditCustomCssModal.d.ts
@@ -1,4 +1,4 @@
-///
+///
///
import SettingsModal from './SettingsModal';
export default class EditCustomCssModal extends SettingsModal {
diff --git a/framework/core/js/dist-typings/admin/components/EditCustomFooterModal.d.ts b/framework/core/js/dist-typings/admin/components/EditCustomFooterModal.d.ts
index 45122c515c..b2d35c06e0 100644
--- a/framework/core/js/dist-typings/admin/components/EditCustomFooterModal.d.ts
+++ b/framework/core/js/dist-typings/admin/components/EditCustomFooterModal.d.ts
@@ -1,4 +1,4 @@
-///
+///
///
import SettingsModal from './SettingsModal';
export default class EditCustomFooterModal extends SettingsModal {
diff --git a/framework/core/js/dist-typings/admin/components/EditCustomHeaderModal.d.ts b/framework/core/js/dist-typings/admin/components/EditCustomHeaderModal.d.ts
index bac737dd0a..da83c1674f 100644
--- a/framework/core/js/dist-typings/admin/components/EditCustomHeaderModal.d.ts
+++ b/framework/core/js/dist-typings/admin/components/EditCustomHeaderModal.d.ts
@@ -1,4 +1,4 @@
-///
+///
///
import SettingsModal from './SettingsModal';
export default class EditCustomHeaderModal extends SettingsModal {
diff --git a/framework/core/js/dist-typings/admin/components/LoadingModal.d.ts b/framework/core/js/dist-typings/admin/components/LoadingModal.d.ts
index a3a69c2fb8..5891f479ac 100644
--- a/framework/core/js/dist-typings/admin/components/LoadingModal.d.ts
+++ b/framework/core/js/dist-typings/admin/components/LoadingModal.d.ts
@@ -1,4 +1,4 @@
-///
+///
import Modal, { IInternalModalAttrs } from '../../common/components/Modal';
export interface ILoadingModalAttrs extends IInternalModalAttrs {
}
diff --git a/framework/core/js/dist-typings/admin/components/MailPage.d.ts b/framework/core/js/dist-typings/admin/components/MailPage.d.ts
index 9c1198e880..17d0fa35f6 100644
--- a/framework/core/js/dist-typings/admin/components/MailPage.d.ts
+++ b/framework/core/js/dist-typings/admin/components/MailPage.d.ts
@@ -1,4 +1,4 @@
-///
+///
import AdminPage from './AdminPage';
import type { IPageAttrs } from '../../common/components/Page';
import type { AlertIdentifier } from '../../common/states/AlertManagerState';
diff --git a/framework/core/js/dist-typings/admin/components/PermissionsPage.d.ts b/framework/core/js/dist-typings/admin/components/PermissionsPage.d.ts
index ff15efaa57..cb453a2a7d 100644
--- a/framework/core/js/dist-typings/admin/components/PermissionsPage.d.ts
+++ b/framework/core/js/dist-typings/admin/components/PermissionsPage.d.ts
@@ -1,4 +1,4 @@
-///
+///
///
import AdminPage from './AdminPage';
export default class PermissionsPage extends AdminPage {
diff --git a/framework/core/js/dist-typings/admin/components/ReadmeModal.d.ts b/framework/core/js/dist-typings/admin/components/ReadmeModal.d.ts
index b754111f51..c56fbfe418 100644
--- a/framework/core/js/dist-typings/admin/components/ReadmeModal.d.ts
+++ b/framework/core/js/dist-typings/admin/components/ReadmeModal.d.ts
@@ -1,4 +1,4 @@
-///
+///
import Modal, { IInternalModalAttrs } from '../../common/components/Modal';
import ExtensionReadme from '../models/ExtensionReadme';
import type Mithril from 'mithril';
diff --git a/framework/core/js/dist-typings/admin/components/UserListPage.d.ts b/framework/core/js/dist-typings/admin/components/UserListPage.d.ts
index 9e7d0a9b55..4bfb7c6149 100644
--- a/framework/core/js/dist-typings/admin/components/UserListPage.d.ts
+++ b/framework/core/js/dist-typings/admin/components/UserListPage.d.ts
@@ -1,4 +1,4 @@
-///
+///
import Mithril from 'mithril';
import type User from '../../common/models/User';
import type { IPageAttrs } from '../../common/components/Page';
diff --git a/framework/core/js/dist-typings/common/components/EditUserModal.d.ts b/framework/core/js/dist-typings/common/components/EditUserModal.d.ts
index 77fbee2ab1..dbf7c69112 100644
--- a/framework/core/js/dist-typings/common/components/EditUserModal.d.ts
+++ b/framework/core/js/dist-typings/common/components/EditUserModal.d.ts
@@ -1,4 +1,4 @@
-///
+///
import FormModal, { IFormModalAttrs } from '../../common/components/FormModal';
import ItemList from '../utils/ItemList';
import Stream from '../utils/Stream';
diff --git a/framework/core/js/dist-typings/forum/components/ChangeEmailModal.d.ts b/framework/core/js/dist-typings/forum/components/ChangeEmailModal.d.ts
index a491173a7b..e431140fb7 100644
--- a/framework/core/js/dist-typings/forum/components/ChangeEmailModal.d.ts
+++ b/framework/core/js/dist-typings/forum/components/ChangeEmailModal.d.ts
@@ -1,4 +1,4 @@
-///
+///
import FormModal, { IFormModalAttrs } from '../../common/components/FormModal';
import Stream from '../../common/utils/Stream';
import type Mithril from 'mithril';
diff --git a/framework/core/js/dist-typings/forum/components/ChangePasswordModal.d.ts b/framework/core/js/dist-typings/forum/components/ChangePasswordModal.d.ts
index 786ab12d8a..cd9f5868f3 100644
--- a/framework/core/js/dist-typings/forum/components/ChangePasswordModal.d.ts
+++ b/framework/core/js/dist-typings/forum/components/ChangePasswordModal.d.ts
@@ -1,4 +1,4 @@
-///
+///
import FormModal, { IFormModalAttrs } from '../../common/components/FormModal';
import Mithril from 'mithril';
import ItemList from '../../common/utils/ItemList';
diff --git a/framework/core/js/dist-typings/forum/components/DiscussionRenamedNotification.d.ts b/framework/core/js/dist-typings/forum/components/DiscussionRenamedNotification.d.ts
index c8d7702981..bda60b2031 100644
--- a/framework/core/js/dist-typings/forum/components/DiscussionRenamedNotification.d.ts
+++ b/framework/core/js/dist-typings/forum/components/DiscussionRenamedNotification.d.ts
@@ -1,4 +1,4 @@
-///
+///
import Notification from './Notification';
/**
* The `DiscussionRenamedNotification` component displays a notification which
diff --git a/framework/core/js/dist-typings/forum/components/ForgotPasswordModal.d.ts b/framework/core/js/dist-typings/forum/components/ForgotPasswordModal.d.ts
index 046ea49d02..6b52d46056 100644
--- a/framework/core/js/dist-typings/forum/components/ForgotPasswordModal.d.ts
+++ b/framework/core/js/dist-typings/forum/components/ForgotPasswordModal.d.ts
@@ -1,4 +1,4 @@
-///
+///
import FormModal, { IFormModalAttrs } from '../../common/components/FormModal';
import Stream from '../../common/utils/Stream';
import Mithril from 'mithril';
diff --git a/framework/core/js/dist-typings/forum/components/LogInModal.d.ts b/framework/core/js/dist-typings/forum/components/LogInModal.d.ts
index 61b906d89f..d91a5ca47a 100644
--- a/framework/core/js/dist-typings/forum/components/LogInModal.d.ts
+++ b/framework/core/js/dist-typings/forum/components/LogInModal.d.ts
@@ -1,4 +1,4 @@
-///
+///
import FormModal, { IFormModalAttrs } from '../../common/components/FormModal';
import ItemList from '../../common/utils/ItemList';
import Stream from '../../common/utils/Stream';
diff --git a/framework/core/js/dist-typings/forum/components/RenameDiscussionModal.d.ts b/framework/core/js/dist-typings/forum/components/RenameDiscussionModal.d.ts
index 3fe0294829..0869e51d6a 100644
--- a/framework/core/js/dist-typings/forum/components/RenameDiscussionModal.d.ts
+++ b/framework/core/js/dist-typings/forum/components/RenameDiscussionModal.d.ts
@@ -1,4 +1,4 @@
-///
+///
import FormModal, { IFormModalAttrs } from '../../common/components/FormModal';
import Stream from '../../common/utils/Stream';
import Mithril from 'mithril';
diff --git a/framework/core/js/dist-typings/forum/components/SignUpModal.d.ts b/framework/core/js/dist-typings/forum/components/SignUpModal.d.ts
index 660d0c5fbe..4e0c8b9788 100644
--- a/framework/core/js/dist-typings/forum/components/SignUpModal.d.ts
+++ b/framework/core/js/dist-typings/forum/components/SignUpModal.d.ts
@@ -1,4 +1,4 @@
-///
+///
import FormModal, { IFormModalAttrs } from '../../common/components/FormModal';
import ItemList from '../../common/utils/ItemList';
import Stream from '../../common/utils/Stream';
diff --git a/framework/core/js/dist/admin.js b/framework/core/js/dist/admin.js
index 0449248582..a224ac8b53 100644
--- a/framework/core/js/dist/admin.js
+++ b/framework/core/js/dist/admin.js
@@ -1,3 +1,3 @@
/*! For license information please see admin.js.LICENSE.txt */
-(()=>{var t,e,n={2190:(t,e,n)=>{"use strict";n.d(e,{Z:()=>s});var r=n(7905);class s{constructor(){(0,r.Z)(this,"element",void 0),(0,r.Z)(this,"attrs",void 0),(0,r.Z)(this,"state",void 0)}oninit(t){this.setAttrs(t.attrs)}oncreate(t){this.element=t.dom}onbeforeupdate(t){this.setAttrs(t.attrs)}onupdate(t){}onbeforeremove(t){}onremove(t){}$(t){const e=$(this.element);return t?e.find(t):e}static component(t,e){void 0===t&&(t={}),void 0===e&&(e=null);const n={...t};return m(this,n,e)}setAttrs(t){if(void 0===t&&(t={}),this.constructor.initAttrs(t),t){if("children"in t)throw new Error("[".concat(this.constructor.name,'] The "children" attribute of attrs should never be used. Either pass children in as the vnode children or rename the attribute'));if("tag"in t)throw new Error("[".concat(this.constructor.name,'] You cannot use the "tag" attribute name with Mithril 2.'))}this.attrs=t}static initAttrs(t){}}flarum.reg.add("core","common/Component",s)},9175:(t,e,n)=>{"use strict";n.d(e,{Z:()=>i});var r=n(7905),s=n(7465);class i{constructor(t,e){void 0===t&&(t={}),void 0===e&&(e=s.Z.store),(0,r.Z)(this,"data",{}),(0,r.Z)(this,"freshness",new Date),(0,r.Z)(this,"exists",!1),(0,r.Z)(this,"store",void 0),this.data=t,this.store=e}id(){return"id"in this.data?this.data.id:void 0}attribute(t){var e,n;return null==(e=this.data)||null==(n=e.attributes)?void 0:n[t]}pushData(t){if("id"in t&&(this.data.id=t.id),"type"in t&&(this.data.type=t.type),"attributes"in t){var e;(e=this.data).attributes||(e.attributes={});for(const e in t.attributes){const n=t.attributes[e];n&&n instanceof i&&delete t.attributes[e]}Object.assign(this.data.attributes,t.attributes)}if("relationships"in t){var n;const e=null!=(n=this.data.relationships)?n:{};for(const n in t.relationships){const r=t.relationships[n];if(null===r){delete e[n],delete t.relationships[n];continue}let s;s=r instanceof i?{data:i.getIdentifier(r)}:r instanceof Array?{data:r.map(i.getIdentifier)}:r,t.relationships[n]=s,e[n]=s}this.data.relationships=e}return this.freshness=new Date,this}pushAttributes(t){this.pushData({attributes:t})}save(t,e){void 0===e&&(e={});const n={type:this.data.type,attributes:t};if("id"in this.data&&(n.id=this.data.id),t.relationships){n.relationships={};for(const e in t.relationships){const r=t.relationships[e];null!==r&&(n.relationships[e]={data:r instanceof Array?r.map(i.getIdentifier):i.getIdentifier(r)})}delete t.relationships}const r=this.copyData();this.pushData(n);const a={data:n,meta:e.meta||void 0};return s.Z.request({method:this.exists?"PATCH":"POST",url:s.Z.forum.attribute("apiUrl")+this.apiEndpoint(),body:a,...e}).then((t=>this.store.pushPayload(t)),(t=>{throw this.pushData(r),m.redraw(),t}))}delete(t,e){return void 0===t&&(t={}),void 0===e&&(e={}),this.exists?s.Z.request({method:"DELETE",url:s.Z.forum.attribute("apiUrl")+this.apiEndpoint(),body:t,...e}).then((()=>{this.exists=!1,this.store.remove(this)})):Promise.resolve()}apiEndpoint(){return"/"+this.data.type+("id"in this.data?"/"+this.data.id:"")}copyData(){return JSON.parse(JSON.stringify(this.data))}rawRelationship(t){var e,n;return null==(e=this.data.relationships)||null==(n=e[t])?void 0:n.data}static attribute(t,e){return function(){return e?e(this.attribute(t)):this.attribute(t)}}static hasOne(t){return function(){var e,n;const r=null==(e=this.data.relationships)||null==(n=e[t])?void 0:n.data;if(r&&r instanceof Array)throw new Error("Relationship ".concat(t," on model ").concat(this.data.type," is plural, so the hasOne method cannot be used to access it."));return!!r&&this.store.getById(r.type,r.id)}}static hasMany(t){return function(){var e,n;const r=null==(e=this.data.relationships)||null==(n=e[t])?void 0:n.data;if(r&&!(r instanceof Array))throw new Error("Relationship ".concat(t," on model ").concat(this.data.type," is singular, so the hasMany method cannot be used to access it."));return!!r&&r.map((t=>this.store.getById(t.type,t.id)))}}static transformDate(t){return null!=t?new Date(t):t}static getIdentifier(t){return t&&t.data&&"id"in t.data?{type:t.data.type,id:t.data.id}:null}}flarum.reg.add("core","common/Model",i)},4773:(t,e,n)=>{"use strict";n.d(e,{Z:()=>p});var r=n(7905),s=n(7465),i=n(1586);class a extends i.y3{key(){return s.Z.translator.trans("core.lib.gambits.discussions.author.key",{},!0)}hint(){return s.Z.translator.trans("core.lib.gambits.discussions.author.hint",{},!0)}filterKey(){return"author"}}flarum.reg.add("core","common/query/discussions/AuthorGambit",a);class o extends i.y3{key(){return s.Z.translator.trans("core.lib.gambits.discussions.created.key",{},!0)}hint(){return s.Z.translator.trans("core.lib.gambits.discussions.created.hint",{},!0)}valuePattern(){return"(\\d{4}\\-\\d\\d\\-\\d\\d(?:\\.\\.(\\d{4}\\-\\d\\d\\-\\d\\d))?)"}filterKey(){return"created"}}flarum.reg.add("core","common/query/discussions/CreatedGambit",o);class l extends i.gD{key(){return s.Z.translator.trans("core.lib.gambits.discussions.hidden.key",{},!0)}filterKey(){return"hidden"}enabled(){return!!s.Z.session.user}}flarum.reg.add("core","common/query/discussions/HiddenGambit",l);class c extends i.gD{key(){return s.Z.translator.trans("core.lib.gambits.discussions.unread.key",{},!0)}filterKey(){return"unread"}enabled(){return!!s.Z.session.user}}flarum.reg.add("core","common/query/discussions/UnreadGambit",c);class u extends i.y3{key(){return s.Z.translator.trans("core.lib.gambits.users.email.key",{},!0)}hint(){return s.Z.translator.trans("core.lib.gambits.users.email.hint",{},!0)}filterKey(){return"email"}enabled(){return!(!s.Z.session.user||!s.Z.forum.attribute("canEditUserCredentials"))}}flarum.reg.add("core","common/query/users/EmailGambit",u);class d extends i.y3{key(){return s.Z.translator.trans("core.lib.gambits.users.group.key",{},!0)}hint(){return s.Z.translator.trans("core.lib.gambits.users.group.hint",{},!0)}filterKey(){return"group"}}flarum.reg.add("core","common/query/users/GroupGambit",d);class h extends i.y3{key(){return s.Z.translator.trans("core.lib.gambits.posts.discussion.key",{},!0)}hint(){return s.Z.translator.trans("core.lib.gambits.posts.discussion.hint",{},!0)}filterKey(){return"discussion"}}flarum.reg.add("core","common/query/discussions/DiscussionGambit",h);class m{constructor(){(0,r.Z)(this,"gambits",{discussions:[a,o,l,c],posts:[a,h],users:[u,d]})}apply(t,e){return e.q=this.match(t,e.q,((t,n,r)=>{const s=t.toFilter(n,r);Object.keys(s).forEach((n=>{n in e&&t.predicates&&Array.isArray(s[n])?e[n]=e[n].concat(s[n]):e[n]=s[n]}))})),e}match(t,e,n){const r=this.for(t).filter((t=>t.enabled()));if(0===r.length)return e;const s=e.split(" ");for(const t of r)for(const r of s){const s=new RegExp("^(-?)".concat(t.pattern(),"$"),"i");let i=r.match(s);if(i){const s="-"===i[1];i.splice(1,1),n(t,i,s,r),e=e.replace(r,"")}}return e.trim().replace(/\s+/g," ")}from(t,e,n){const r=this.for(t);return 0===r.length||Object.keys(n).forEach((t=>{for(const s of r){const r="-"===t[0];r&&(t=t.substring(1)),s.filterKey()===t&&(e+=" ".concat(s.fromFilter(n[t],r)))}})),e}for(t){return(this.gambits[t]||[]).map((t=>new t))}}flarum.reg.add("core","common/GambitManager",m);class p{constructor(t){(0,r.Z)(this,"state",void 0),(0,r.Z)(this,"gambits",new m),this.state=t}}(0,r.Z)(p,"MIN_SEARCH_LEN",3),flarum.reg.add("core","common/SearchManager",p)},7465:(t,e,n)=>{"use strict";n.d(e,{Z:()=>i});const r=window,s=new Proxy({},{get:(t,e)=>Reflect.get(r.app,e,r.app),set:(t,e,n)=>Reflect.set(r.app,e,n,r.app)}),i=s;flarum.reg.add("core","common/app",s)},3817:(t,e,n)=>{"use strict";n.d(e,{Z:()=>u});var r=n(2190),s=n(8312),i=n(1268),a=n(6786),o=n(3344),l=n(7465),c=n(9133);class u extends r.Z{view(t){const e=Object.assign({},this.attrs),n=(0,a.Z)(e,"type");e.className=(0,o.Z)("Alert","Alert--".concat(n),e.className);const r=(0,a.Z)(e,"title"),u=(0,a.Z)(e,"icon"),d=(0,a.Z)(e,"content")||t.children,h=(0,a.Z)(e,"controls")||[],p=(0,a.Z)(e,"dismissible"),f=(0,a.Z)(e,"ondismiss"),g=[];return(p||void 0===p)&&g.push(m(s.Z,{"aria-label":l.Z.translator.trans("core.lib.alert.dismiss_a11y_label"),icon:"fas fa-times",className:"Button Button--link Button--icon Alert-dismiss",onclick:f})),m("div",e,m("div",{className:(0,o.Z)("Alert-container",e.containerClassName)},!!r&&m("div",{className:"Alert-title"},!!u&&m("span",{className:"Alert-title-icon"},m(c.Z,{name:u})),m("span",{className:"Alert-title-text"},r)),m("span",{className:"Alert-body"},d),m("ul",{className:"Alert-controls"},(0,i.Z)(h.concat(g)))))}}flarum.reg.add("core","common/components/Alert",u)},3804:(t,e,n)=>{"use strict";n.d(e,{Z:()=>l});var r=n(6439),s=n(2190),i=n(3344),a=n(9215),o=n(9133);class l extends s.Z{view(){const{type:t,icon:e,label:n,color:s,style:l={},...c}=this.attrs,u=(0,i.Z)("Badge",[t&&"Badge--".concat(t)],c.className,(0,a.Z)(s)),d=e?m(o.Z,{name:e,className:"Badge-icon"}):m.trust(" "),h={...l,"--badge-bg":s},p={...c,className:u,style:h},f=m("div",p,d);return n?m(r.Z,{text:n},f):f}}flarum.reg.add("core","common/components/Badge",l)},8312:(t,e,n)=>{"use strict";n.d(e,{Z:()=>u});var r=n(2190),s=n(7465);function i(){s.Z.forum.attribute("debug")&&console.warn(...arguments)}flarum.reg.add("core","common/helpers/fireDebugWarning",i);var a=n(3344),o=n(1552),l=n(5226),c=n(9133);class u extends r.Z{view(t){let{type:e,"aria-label":n,icon:r,disabled:s,loading:i,className:l,class:c,...u}=this.attrs;e||(e="button"),"object"==typeof n&&(n=(0,o.Z)(n)),(s||i)&&delete u.onclick,l=(0,a.Z)(c,l,{hasIcon:r,disabled:s||i,loading:i});const d={disabled:s,className:l,type:e,"aria-label":n,...u};return m("button",d,this.getButtonContent(t.children))}oncreate(t){var e,n;super.oncreate(t);const{"aria-label":r}=this.attrs;this.view!==u.prototype.view||r||(0,o.Z)(t.children)||null!=(e=this.element)&&null!=(n=e.getAttribute)&&n.call(e,"aria-label")||i('[Flarum Accessibility Warning] Button has no content and no accessible label. This means that screen-readers will not be able to interpret its meaning and just read "Button". Consider providing accessible text via the `aria-label` attribute. https://web.dev/button-name',this.element)}getButtonContent(t){const e=this.attrs.icon;return[e&&m(c.Z,{name:e,className:"Button-icon"}),t&&m("span",{className:"Button-label"},t),this.attrs.loading&&m(l.Z,{size:"small",display:"inline"})]}}flarum.reg.add("core","common/components/Button",u)},6352:(t,e,n)=>{"use strict";n.d(e,{Z:()=>i});var r=n(2190),s=n(3344);class i extends r.Z{view(t){const{label:e,description:n,className:r,...i}=t.attrs;return m("div",Object.assign({className:(0,s.Z)("Form",r)},i),m("div",{className:"Form-header"},e&&m("label",null,e),n&&m("p",{className:"helpText"},n)),m("div",{className:"Form-body"},t.children))}}flarum.reg.add("core","common/components/Form",i)},899:(t,e,n)=>{"use strict";n.d(e,{Z:()=>s});var r=n(7108);class s extends r.Z{wrapper(t){return m("form",{onsubmit:this.onsubmit.bind(this)},t)}onsubmit(t){}onready(){this.$().find("input, select, textarea").first().trigger("focus").trigger("select")}onerror(t){var e;this.alertAttrs=t.alert,m.redraw(),422===t.status&&null!=(e=t.response)&&e.errors?this.$("form [name="+t.response.errors[0].source.pointer.replace("/data/attributes/","")+"]").trigger("select"):this.onready()}}flarum.reg.add("core","common/components/FormModal",s)},6697:(t,e,n)=>{"use strict";n.d(e,{Z:()=>s});var r=n(3804);class s extends r.Z{static initAttrs(t){super.initAttrs(t),t.group&&(t.icon=t.group.icon()||"",t.color=t.group.color()||"",t.label=void 0===t.label?t.group.nameSingular():t.label,t.type="group--"+t.group.id(),delete t.group)}}flarum.reg.add("core","common/components/GroupBadge",s)},9133:(t,e,n)=>{"use strict";n.d(e,{Z:()=>i});var r=n(3344),s=n(2190);class i extends s.Z{view(t){const{name:e,...n}=t.attrs;return n.className=(0,r.Z)("icon",e,n.className),m("i",Object.assign({"aria-hidden":"true"},n))}}flarum.reg.add("core","common/components/Icon",i)},3986:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var r=n(2190),s=n(9133),i=n(3344);class a extends r.Z{view(t){const{icon:e,className:n,...r}=t.attrs;return m("div",Object.assign({className:(0,i.Z)("InfoTile",n)},r),this.icon(),m("div",{className:"InfoTile-text"},t.children))}icon(){return this.attrs.iconElement?this.attrs.iconElement:this.attrs.icon?m(s.Z,{name:(0,i.Z)(this.attrs.icon,"InfoTile-icon")}):null}}flarum.reg.add("core","common/components/InfoTile",a)},9908:(t,e,n)=>{"use strict";n.d(e,{Z:()=>c});var r=n(7465),s=n(2190),i=n(9133),a=n(5226),o=n(3344),l=n(8312);class c extends s.Z{oninit(t){super.oninit(t)}view(t){var e,n;const{className:s,...c}=this.attrs.inputAttrs||{},u=this.attrs.value||(null==(e=(n=this.attrs).stream)?void 0:e.call(n))||"";return m("div",{className:(0,o.Z)("Input",this.attrs.className,{"Input--withPrefix":this.attrs.prefixIcon,"Input--withClear":this.attrs.clearable})},this.attrs.prefixIcon&&m(i.Z,{name:(0,o.Z)(this.attrs.prefixIcon,"Input-prefix-icon")}),this.input({inputClassName:s,value:u,inputAttrs:c}),this.attrs.loading&&m(a.Z,{size:"small",display:"inline",containerClassName:"Button Button--icon Button--link"}),this.attrs.clearable&&u&&!this.attrs.loading&&m(l.Z,{className:"Input-clear Button Button--icon Button--link",onclick:this.clear.bind(this),"aria-label":this.attrs.clearLabel||r.Z.translator.trans("core.lib.input.clear_button"),type:"button",icon:"fas fa-times-circle"}))}input(t){let{inputClassName:e,value:n,inputAttrs:r}=t;const s={className:(0,o.Z)("FormControl",e),type:this.attrs.type||"text",value:n,oninput:t=>{var e;return null==(e=this.onchange)?void 0:e.call(this,t.target.value)},"aria-label":this.attrs.ariaLabel,placeholder:this.attrs.placeholder,readonly:this.attrs.readonly||void 0,disabled:this.attrs.disabled||void 0,...r};return this.attrs.renderInput?this.attrs.renderInput(s):m("input",s)}onchange(t){var e,n;this.attrs.stream?this.attrs.stream(t):null==(e=(n=this.attrs).onchange)||e.call(n,t)}clear(){this.onchange("")}}flarum.reg.add("core","common/components/Input",c)},5226:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var r=n(7465),s=n(2190),i=n(3344);class a extends s.Z{view(){const{display:t="block",size:e="medium",containerClassName:n,className:s,...a}=this.attrs,o=(0,i.Z)("LoadingIndicator",s),l=(0,i.Z)("LoadingIndicator-container","unset"!==t&&"LoadingIndicator-container--".concat(t),e&&"LoadingIndicator-container--".concat(e),n);return m("div",Object.assign({"aria-label":r.Z.translator.trans("core.lib.loading_indicator.accessible_label"),role:"status"},a.containerAttrs,{"data-size":e,className:l}),m("div",Object.assign({"aria-hidden":"true",className:o},a)))}}flarum.reg.add("core","common/components/LoadingIndicator",a)},7108:(t,e,n)=>{"use strict";n.d(e,{Z:()=>c});var r=n(7905),s=n(7465),i=n(2190),a=n(3817),o=n(8312),l=n(3344);class c extends i.Z{constructor(){super(...arguments),(0,r.Z)(this,"loading",!1),(0,r.Z)(this,"alertAttrs",null)}static get dismissibleOptions(){return{viaCloseButton:this.isDismissibleViaCloseButton,viaEscKey:this.isDismissibleViaEscKey,viaBackdropClick:this.isDismissibleViaBackdropClick}}oncreate(t){super.oncreate(t),this.attrs.animateShow((()=>this.onready()))}onbeforeremove(t){if(super.onbeforeremove(t),!this.attrs.state.modal)return new Promise((t=>setTimeout(t,300)))}view(){return this.alertAttrs&&(this.alertAttrs.dismissible=!1),m("div",{className:(0,l.Z)("Modal modal-dialog fade",this.className())},m("div",{className:"Modal-content"},this.dismissibleOptions.viaCloseButton&&m("div",{className:"Modal-close App-backControl"},m(o.Z,{icon:"fas fa-times",onclick:()=>this.hide(),className:"Button Button--icon Button--link","aria-label":s.Z.translator.trans("core.lib.modal.close")})),this.wrapper(this.inner())))}wrapper(t){return m("[",null,t)}inner(){return m("[",null,m("div",{className:"Modal-header"},m("h3",{className:"App-titleControl App-titleControl--text"},this.title())),!!this.alertAttrs&&m("div",{className:"Modal-alert"},m(a.Z,this.alertAttrs)),this.content())}onready(){}hide(){this.attrs.animateHide()}loaded(){this.loading=!1,m.redraw()}get dismissibleOptions(){return this.constructor.dismissibleOptions}}(0,r.Z)(c,"isDismissibleViaCloseButton",!0),(0,r.Z)(c,"isDismissibleViaEscKey",!0),(0,r.Z)(c,"isDismissibleViaBackdropClick",!0),flarum.reg.add("core","common/components/Modal",c)},6439:(t,e,n)=>{"use strict";n.d(e,{Z:()=>o});var r=n(7905),s=n(2190),i=n(3344),a=n(1552);class o extends s.Z{constructor(){super(...arguments),(0,r.Z)(this,"firstChild",null),(0,r.Z)(this,"childDomNode",null),(0,r.Z)(this,"oldText",""),(0,r.Z)(this,"oldVisibility",void 0),(0,r.Z)(this,"shouldRecreateTooltip",!1),(0,r.Z)(this,"shouldChangeTooltipVisibility",!1)}view(t){const e=t.children,{text:n,tooltipVisible:r,showOnFocus:s=!0,position:i="top",ignoreTitleWarning:a=!1,html:o=!1,delay:l=0,...c}=this.attrs;this.attrs.title&&!a&&console.warn("`title` attribute was passed to Tooltip component. Was this intentional? Tooltip content should be passed to the `text` attr instead.");const u=this.getRealText();if(u!==this.oldText&&(this.oldText=u,this.shouldRecreateTooltip=!0),r!==this.oldVisibility&&(this.oldVisibility=this.attrs.tooltipVisible,this.shouldChangeTooltipVisibility=!0),void 0===e)throw new Error("Tooltip component was provided with no direct child DOM element. Tooltips must contain a single direct DOM node to attach to.");if(1!==e.length)throw new Error("Tooltip component was either passed more than one or no child node.\n\nPlease wrap multiple children in another element, such as a
or .");const d=e[0];if("object"!=typeof d||Array.isArray(d)||null===d)throw new Error("Tooltip component was provided with no direct child DOM element. Tooltips must contain a single direct DOM node to attach to.");if("string"==typeof d.tag&&["#","[","<"].includes(d.tag))throw new Error('Tooltip component with provided with a vnode with tag "'.concat(d.tag,'". This is not a DOM element, so is not a valid child element. Please wrap this vnode in another element, such as a