diff --git a/js/dist/admin.js b/js/dist/admin.js
index 54d50f0..22cd948 100644
--- a/js/dist/admin.js
+++ b/js/dist/admin.js
@@ -1,2 +1,2 @@
-(()=>{var e={n:r=>{var o=r&&r.__esModule?()=>r.default:()=>r;return e.d(o,{a:o}),o},d:(r,o)=>{for(var t in o)e.o(o,t)&&!e.o(r,t)&&Object.defineProperty(r,t,{enumerable:!0,get:o[t]})},o:(e,r)=>Object.prototype.hasOwnProperty.call(e,r),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},r={};(()=>{"use strict";e.r(r);const o=flarum.core.compat["admin/app"];var t=e.n(o);t().initializers.add("fof-user-bio",(function(){t().extensionData.for("fof-user-bio").registerPermission({icon:"fas fa-pen",label:t().translator.trans("fof-user-bio.admin.permission.view"),permission:"fof-user-bio.view",allowGuest:!0},"view").registerPermission({icon:"fas fa-pen",label:t().translator.trans("fof-user-bio.admin.permission.editOwn"),permission:"fof-user-bio.editOwn"},"start").registerPermission({icon:"fas fa-pen",label:t().translator.trans("fof-user-bio.admin.permission.editAny"),permission:"fof-user-bio.editAny"},"moderate").registerSetting({label:t().translator.trans("fof-user-bio.admin.setting.bioLimit"),setting:"fof-user-bio.maxLength",type:"number",placeholder:200}).registerSetting({label:t().translator.trans("fof-user-bio.admin.setting.allowFormatting"),help:t().translator.trans("fof-user-bio.admin.setting.allowFormatting_help"),setting:"fof-user-bio.allowFormatting",type:"boolean"})}))})(),module.exports=r})();
+(()=>{var e={n:r=>{var t=r&&r.__esModule?()=>r.default:()=>r;return e.d(t,{a:t}),t},d:(r,t)=>{for(var i in t)e.o(t,i)&&!e.o(r,i)&&Object.defineProperty(r,i,{enumerable:!0,get:t[i]})},o:(e,r)=>Object.prototype.hasOwnProperty.call(e,r),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},r={};(()=>{"use strict";e.r(r);const t=flarum.core.compat["admin/app"];var i=e.n(t);i().initializers.add("fof-user-bio",(function(){i().extensionData.for("fof-user-bio").registerPermission({icon:"fas fa-pen",label:i().translator.trans("fof-user-bio.admin.permission.view"),permission:"fof-user-bio.view",allowGuest:!0},"view").registerPermission({icon:"fas fa-pen",label:i().translator.trans("fof-user-bio.admin.permission.editOwn"),permission:"fof-user-bio.editOwn"},"start").registerPermission({icon:"fas fa-pen",label:i().translator.trans("fof-user-bio.admin.permission.editAny"),permission:"fof-user-bio.editAny"},"moderate").registerSetting({label:i().translator.trans("fof-user-bio.admin.setting.bioLimit"),setting:"fof-user-bio.maxLength",type:"number",placeholder:200}).registerSetting({label:i().translator.trans("fof-user-bio.admin.setting.maxLines"),setting:"fof-user-bio.maxLines",type:"number",placeholder:5,min:5}).registerSetting({label:i().translator.trans("fof-user-bio.admin.setting.allowFormatting"),help:i().translator.trans("fof-user-bio.admin.setting.allowFormatting_help"),setting:"fof-user-bio.allowFormatting",type:"boolean"})}))})(),module.exports=r})();
//# sourceMappingURL=admin.js.map
\ No newline at end of file
diff --git a/js/dist/admin.js.map b/js/dist/admin.js.map
index c1395c0..b669916 100644
--- a/js/dist/admin.js.map
+++ b/js/dist/admin.js.map
@@ -1 +1 @@
-{"version":3,"file":"admin.js","mappings":"MACA,IAAIA,EAAsB,CCA1BA,EAAyBC,IACxB,IAAIC,EAASD,GAAUA,EAAOE,WAC7B,IAAOF,EAAiB,QACxB,IAAM,EAEP,OADAD,EAAoBI,EAAEF,EAAQ,CAAEG,EAAGH,IAC5BA,CAAM,ECLdF,EAAwB,CAACM,EAASC,KACjC,IAAI,IAAIC,KAAOD,EACXP,EAAoBS,EAAEF,EAAYC,KAASR,EAAoBS,EAAEH,EAASE,IAC5EE,OAAOC,eAAeL,EAASE,EAAK,CAAEI,YAAY,EAAMC,IAAKN,EAAWC,IAE1E,ECNDR,EAAwB,CAACc,EAAKC,IAAUL,OAAOM,UAAUC,eAAeC,KAAKJ,EAAKC,GCClFf,EAAyBM,IACH,oBAAXa,QAA0BA,OAAOC,aAC1CV,OAAOC,eAAeL,EAASa,OAAOC,YAAa,CAAEC,MAAO,WAE7DX,OAAOC,eAAeL,EAAS,aAAc,CAAEe,OAAO,GAAO,G,+BCL9D,MAAM,EAA+BC,OAAOC,KAAKC,OAAO,a,aCExDC,IAAAA,aAAiBC,IAAI,gBAAgB,WACnCD,IAAAA,cAAA,IACO,gBACJE,mBACC,CACEC,KAAM,aACNC,MAAOJ,IAAAA,WAAeK,MAAM,sCAC5BC,WAAY,oBACZC,YAAY,GAEd,QAEDL,mBACC,CACEC,KAAM,aACNC,MAAOJ,IAAAA,WAAeK,MAAM,yCAC5BC,WAAY,wBAEd,SAEDJ,mBACC,CACEC,KAAM,aACNC,MAAOJ,IAAAA,WAAeK,MAAM,yCAC5BC,WAAY,wBAEd,YAEDE,gBAAgB,CACfJ,MAAOJ,IAAAA,WAAeK,MAAM,uCAC5BI,QAAS,yBACTC,KAAM,SACNC,YAAa,MAEdH,gBAAgB,CACfJ,MAAOJ,IAAAA,WAAeK,MAAM,8CAC5BO,KAAMZ,IAAAA,WAAeK,MAAM,mDAC3BI,QAAS,+BACTC,KAAM,WAEX,G","sources":["webpack://@fof/user-bio/webpack/bootstrap","webpack://@fof/user-bio/webpack/runtime/compat get default export","webpack://@fof/user-bio/webpack/runtime/define property getters","webpack://@fof/user-bio/webpack/runtime/hasOwnProperty shorthand","webpack://@fof/user-bio/webpack/runtime/make namespace object","webpack://@fof/user-bio/external root \"flarum.core.compat['admin/app']\"","webpack://@fof/user-bio/./src/admin/index.ts"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['admin/app'];","import app from 'flarum/admin/app';\n\napp.initializers.add('fof-user-bio', () => {\n app.extensionData\n .for('fof-user-bio')\n .registerPermission(\n {\n icon: 'fas fa-pen',\n label: app.translator.trans('fof-user-bio.admin.permission.view'),\n permission: 'fof-user-bio.view',\n allowGuest: true,\n },\n 'view'\n )\n .registerPermission(\n {\n icon: 'fas fa-pen',\n label: app.translator.trans('fof-user-bio.admin.permission.editOwn'),\n permission: 'fof-user-bio.editOwn',\n },\n 'start'\n )\n .registerPermission(\n {\n icon: 'fas fa-pen',\n label: app.translator.trans('fof-user-bio.admin.permission.editAny'),\n permission: 'fof-user-bio.editAny',\n },\n 'moderate'\n )\n .registerSetting({\n label: app.translator.trans('fof-user-bio.admin.setting.bioLimit'),\n setting: 'fof-user-bio.maxLength',\n type: 'number',\n placeholder: 200,\n })\n .registerSetting({\n label: app.translator.trans('fof-user-bio.admin.setting.allowFormatting'),\n help: app.translator.trans('fof-user-bio.admin.setting.allowFormatting_help'),\n setting: 'fof-user-bio.allowFormatting',\n type: 'boolean',\n });\n});\n"],"names":["__webpack_require__","module","getter","__esModule","d","a","exports","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","flarum","core","compat","app","add","registerPermission","icon","label","trans","permission","allowGuest","registerSetting","setting","type","placeholder","help"],"sourceRoot":""}
\ No newline at end of file
+{"version":3,"file":"admin.js","mappings":"MACA,IAAIA,EAAsB,CCA1BA,EAAyBC,IACxB,IAAIC,EAASD,GAAUA,EAAOE,WAC7B,IAAOF,EAAiB,QACxB,IAAM,EAEP,OADAD,EAAoBI,EAAEF,EAAQ,CAAEG,EAAGH,IAC5BA,CAAM,ECLdF,EAAwB,CAACM,EAASC,KACjC,IAAI,IAAIC,KAAOD,EACXP,EAAoBS,EAAEF,EAAYC,KAASR,EAAoBS,EAAEH,EAASE,IAC5EE,OAAOC,eAAeL,EAASE,EAAK,CAAEI,YAAY,EAAMC,IAAKN,EAAWC,IAE1E,ECNDR,EAAwB,CAACc,EAAKC,IAAUL,OAAOM,UAAUC,eAAeC,KAAKJ,EAAKC,GCClFf,EAAyBM,IACH,oBAAXa,QAA0BA,OAAOC,aAC1CV,OAAOC,eAAeL,EAASa,OAAOC,YAAa,CAAEC,MAAO,WAE7DX,OAAOC,eAAeL,EAAS,aAAc,CAAEe,OAAO,GAAO,G,+BCL9D,MAAM,EAA+BC,OAAOC,KAAKC,OAAO,a,aCExDC,IAAAA,aAAiBC,IAAI,gBAAgB,WACnCD,IAAAA,cAAA,IACO,gBACJE,mBACC,CACEC,KAAM,aACNC,MAAOJ,IAAAA,WAAeK,MAAM,sCAC5BC,WAAY,oBACZC,YAAY,GAEd,QAEDL,mBACC,CACEC,KAAM,aACNC,MAAOJ,IAAAA,WAAeK,MAAM,yCAC5BC,WAAY,wBAEd,SAEDJ,mBACC,CACEC,KAAM,aACNC,MAAOJ,IAAAA,WAAeK,MAAM,yCAC5BC,WAAY,wBAEd,YAEDE,gBAAgB,CACfJ,MAAOJ,IAAAA,WAAeK,MAAM,uCAC5BI,QAAS,yBACTC,KAAM,SACNC,YAAa,MAEdH,gBAAgB,CACfJ,MAAOJ,IAAAA,WAAeK,MAAM,uCAC5BI,QAAS,wBACTC,KAAM,SACNC,YAAa,EACbC,IAAK,IAENJ,gBAAgB,CACfJ,MAAOJ,IAAAA,WAAeK,MAAM,8CAC5BQ,KAAMb,IAAAA,WAAeK,MAAM,mDAC3BI,QAAS,+BACTC,KAAM,WAEX,G","sources":["webpack://@fof/user-bio/webpack/bootstrap","webpack://@fof/user-bio/webpack/runtime/compat get default export","webpack://@fof/user-bio/webpack/runtime/define property getters","webpack://@fof/user-bio/webpack/runtime/hasOwnProperty shorthand","webpack://@fof/user-bio/webpack/runtime/make namespace object","webpack://@fof/user-bio/external root \"flarum.core.compat['admin/app']\"","webpack://@fof/user-bio/./src/admin/index.ts"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['admin/app'];","import app from 'flarum/admin/app';\n\napp.initializers.add('fof-user-bio', () => {\n app.extensionData\n .for('fof-user-bio')\n .registerPermission(\n {\n icon: 'fas fa-pen',\n label: app.translator.trans('fof-user-bio.admin.permission.view'),\n permission: 'fof-user-bio.view',\n allowGuest: true,\n },\n 'view'\n )\n .registerPermission(\n {\n icon: 'fas fa-pen',\n label: app.translator.trans('fof-user-bio.admin.permission.editOwn'),\n permission: 'fof-user-bio.editOwn',\n },\n 'start'\n )\n .registerPermission(\n {\n icon: 'fas fa-pen',\n label: app.translator.trans('fof-user-bio.admin.permission.editAny'),\n permission: 'fof-user-bio.editAny',\n },\n 'moderate'\n )\n .registerSetting({\n label: app.translator.trans('fof-user-bio.admin.setting.bioLimit'),\n setting: 'fof-user-bio.maxLength',\n type: 'number',\n placeholder: 200,\n })\n .registerSetting({\n label: app.translator.trans('fof-user-bio.admin.setting.maxLines'),\n setting: 'fof-user-bio.maxLines',\n type: 'number',\n placeholder: 5,\n min: 5,\n })\n .registerSetting({\n label: app.translator.trans('fof-user-bio.admin.setting.allowFormatting'),\n help: app.translator.trans('fof-user-bio.admin.setting.allowFormatting_help'),\n setting: 'fof-user-bio.allowFormatting',\n type: 'boolean',\n });\n});\n"],"names":["__webpack_require__","module","getter","__esModule","d","a","exports","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","flarum","core","compat","app","add","registerPermission","icon","label","trans","permission","allowGuest","registerSetting","setting","type","placeholder","min","help"],"sourceRoot":""}
\ No newline at end of file
diff --git a/js/dist/forum.js b/js/dist/forum.js
index aff3502..d99984b 100644
--- a/js/dist/forum.js
+++ b/js/dist/forum.js
@@ -1,2 +1,2 @@
-(()=>{var t={561:function(){(function(){var t=[].slice;String.prototype.autoLink=function(){var o,e,r,i,n,a;return n=/(^|[\s\n]|<[A-Za-z]*\/?>)((?:https?|ftp):\/\/[\-A-Z0-9+\u0026\u2019@#\/%?=()~_|!:,.;]*[\-A-Z0-9+\u0026@#\/%=~()_|])/gi,0<(i=1<=arguments.length?t.call(arguments,0):[]).length?(r=i[0],e=function(){var t;for(o in t=[],r)a=r[o],"callback"!==o&&t.push(" "+o+"='"+a+"'");return t}().join(""),this.replace(n,(function(t,o,i){return""+o+(("function"==typeof r.callback?r.callback(i):void 0)||""+i+"")}))):this.replace(n,"$1$2")}}).call(this)}},o={};function e(r){var i=o[r];if(void 0!==i)return i.exports;var n=o[r]={exports:{}};return t[r].call(n.exports,n,n.exports,e),n.exports}e.n=t=>{var o=t&&t.__esModule?()=>t.default:()=>t;return e.d(o,{a:o}),o},e.d=(t,o)=>{for(var r in o)e.o(o,r)&&!e.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:o[r]})},e.o=(t,o)=>Object.prototype.hasOwnProperty.call(t,o),e.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})};var r={};(()=>{"use strict";e.r(r),e.d(r,{components:()=>P});const t=flarum.core.compat["forum/app"];var o=e.n(t);const i=flarum.core.compat["common/extend"];e(561),flarum.core.compat["common/utils/computed"];const n=flarum.core.compat["forum/components/UserCard"];var a=e.n(n);const s=flarum.core.compat["common/models/User"];var c=e.n(s);const u=flarum.core.compat["common/Model"];var l=e.n(u);function p(t,o){return p=Object.setPrototypeOf||function(t,o){return t.__proto__=o,t},p(t,o)}const f=flarum.core.compat["common/Component"];var d=e.n(f);const h=flarum.core.compat["common/components/LoadingIndicator"];var b=e.n(h);const v=flarum.core.compat["common/utils/classList"];var g=e.n(v);const y=flarum.core.compat["common/utils/extractText"];var x=e.n(y),w=function(t){var e,r;function i(){return t.apply(this,arguments)||this}r=t,(e=i).prototype=Object.create(r.prototype),e.prototype.constructor=e,p(e,r);var n=i.prototype;return n.oninit=function(e){t.prototype.oninit.call(this,e),this.editing=!1,this.loading=!1,this.bioMaxLength=o().forum.attribute("fof-user-bio.maxLength"),this.bioPlaceholder=o().session&&o().session.user&&o().session.user.id()===this.attrs.user.id()?o().translator.trans("fof-user-bio.forum.userbioPlaceholder"):o().translator.trans("fof-user-bio.forum.userbioPlaceholderOtherUser",{username:this.attrs.user.username()})},n.view=function(){var t,o=this.attrs.user,e=this.attrs.user.attribute("canEditBio");if(this.editing)t=m("textarea",{className:"FormControl",placeholder:x()(this.bioPlaceholder),rows:"3",maxlength:this.bioMaxLength,value:o.bio()});else{var r;if(this.loading)r=m("p",{className:"UserBio-placeholder"},m(b(),null));else{var i=o.bioHtml();i?r=m.trust(i):o.bio()?r=m.trust("
"+$("
").text(o.bio()).html().replace(/\n/g,"
").autoLink({rel:"nofollow ugc"})+""):e&&(r=m("p",{className:"UserBio-placeholder"},this.bioPlaceholder))}t=m("div",{className:"UserBio-content",onclick:e?this.edit.bind(this):function(){}},r)}return m("div",{className:"UserBio "+g()({editable:e,editing:this.editing})},t)},n.edit=function(){this.editing=!0,m.redraw.sync();var t=this,o=function(o){o.shiftKey||(o.preventDefault(),t.save($(this).val()))};this.$("textarea").focus().bind("blur",o).bind("keydown","return",o),m.redraw()},n.save=function(t){var o=this,e=this.attrs.user;e.bio()!==t&&(this.loading=!0,e.save({bio:t}).catch((function(){})).then((function(){o.loading=!1,m.redraw()}))),this.editing=!1,m.redraw()},i}(d()),P={UserBio:w};o().initializers.add("fof-user-bio",(function(){c().prototype.bio=l().attribute("bio"),c().prototype.bioHtml=l().attribute("bioHtml"),(0,i.extend)(a().prototype,"infoItems",(function(t){var o=this.attrs.user;o.attribute("canViewBio")&&t.add("bio",m(w,{user:o}),-100)}))}))})(),module.exports=r})();
+(()=>{var t={561:function(){(function(){var t=[].slice;String.prototype.autoLink=function(){var e,o,r,i,n,a;return n=/(^|[\s\n]|<[A-Za-z]*\/?>)((?:https?|ftp):\/\/[\-A-Z0-9+\u0026\u2019@#\/%?=()~_|!:,.;]*[\-A-Z0-9+\u0026@#\/%=~()_|])/gi,0<(i=1<=arguments.length?t.call(arguments,0):[]).length?(r=i[0],o=function(){var t;for(e in t=[],r)a=r[e],"callback"!==e&&t.push(" "+e+"='"+a+"'");return t}().join(""),this.replace(n,(function(t,e,i){return""+e+(("function"==typeof r.callback?r.callback(i):void 0)||""+i+"")}))):this.replace(n,"$1$2")}}).call(this)}},e={};function o(r){var i=e[r];if(void 0!==i)return i.exports;var n=e[r]={exports:{}};return t[r].call(n.exports,n,n.exports,o),n.exports}o.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return o.d(e,{a:e}),e},o.d=(t,e)=>{for(var r in e)o.o(e,r)&&!o.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:e[r]})},o.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),o.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})};var r={};(()=>{"use strict";o.r(r),o.d(r,{components:()=>B});const t=flarum.core.compat["forum/app"];var e=o.n(t);const i=flarum.core.compat["common/extend"];o(561),flarum.core.compat["common/utils/computed"];const n=flarum.core.compat["forum/components/UserCard"];var a=o.n(n);const s=flarum.core.compat["common/models/User"];var c=o.n(s);const l=flarum.core.compat["common/Model"];var u=o.n(l);function p(t,e){return p=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t},p(t,e)}const f=flarum.core.compat["common/Component"];var d=o.n(f);const h=flarum.core.compat["common/components/LoadingIndicator"];var b=o.n(h);const v=flarum.core.compat["common/utils/classList"];var g=o.n(v);const y=flarum.core.compat["common/utils/extractText"];var x=o.n(y),S=function(t){var o,r;function i(){return t.apply(this,arguments)||this}r=t,(o=i).prototype=Object.create(r.prototype),o.prototype.constructor=o,p(o,r);var n=i.prototype;return n.oninit=function(o){t.prototype.oninit.call(this,o),this.editing=!1,this.loading=!1,this.bioMaxLength=e().forum.attribute("fof-user-bio.maxLength"),this.bioPlaceholder=e().session&&e().session.user&&e().session.user.id()===this.attrs.user.id()?e().translator.trans("fof-user-bio.forum.userbioPlaceholder"):e().translator.trans("fof-user-bio.forum.userbioPlaceholderOtherUser",{username:this.attrs.user.username()})},n.view=function(){var t,o=this,r=this.attrs.user,i=this.attrs.user.attribute("canEditBio");if(this.editing){var n=this.tempBio,a=null!=n?n:r.bio();t=m("textarea",{className:"FormControl",placeholder:x()(this.bioPlaceholder),rows:"3",maxlength:this.bioMaxLength,oncreate:function(t){var e=t.dom;e.value=a,void 0!==n&&(e.value=n,e.focus(),void 0!==o.tempSelector&&(e.selectionStart=o.tempSelector,e.selectionEnd=o.tempSelector,delete o.tempSelector))}})}else{var s;if(this.loading)s=m("p",{className:"UserBio-placeholder"},m(b(),null));else{var c=r.bioHtml();c?s=m.trust(c):r.bio()?s=m.trust(""+$("
").text(r.bio()).html().replace(/\n/g,"
").autoLink({rel:"nofollow ugc"})+""):i&&(s=m("p",{className:"UserBio-placeholder"},this.bioPlaceholder))}var l=e().forum.attribute("fof-user-bio.maxLines");t=m("div",{className:"UserBio-content",onclick:i?this.edit.bind(this):function(){},style:{"--bio-max-lines":l}},s)}return m("div",{className:"UserBio "+g()({editable:i,editing:this.editing})},t)},n.edit=function(){this.editing=!0,m.redraw.sync();var t=this,e=function(e){e.shiftKey||(e.preventDefault(),t.save(e.target.value,"blur"===e.type))};this.$("textarea").trigger("focus").on("blur",e).bind("keydown","return",e),m.redraw()},n.save=function(t,e){var o=this,r=this.attrs.user,i=this.$("textarea").prop("selectionStart"),n=e&&t===this.tempBio;n||r.bio()===t||(this.loading=!0,r.save({bio:t}).catch((function(){o.tempBio=t,o.tempSelector=i,o.edit()})).then((function(){o.loading=!1,delete o.tempBio,m.redraw()}))),n&&delete this.tempBio,this.editing=!1,m.redraw()},i}(d()),B={UserBio:S};e().initializers.add("fof-user-bio",(function(){c().prototype.bio=u().attribute("bio"),c().prototype.bioHtml=u().attribute("bioHtml"),(0,i.extend)(a().prototype,"infoItems",(function(t){var e=this.attrs.user;e.attribute("canViewBio")&&t.add("bio",m(S,{user:e}),-100)}))}))})(),module.exports=r})();
//# sourceMappingURL=forum.js.map
\ No newline at end of file
diff --git a/js/dist/forum.js.map b/js/dist/forum.js.map
index 002ee26..67a6c39 100644
--- a/js/dist/forum.js.map
+++ b/js/dist/forum.js.map
@@ -1 +1 @@
-{"version":3,"file":"forum.js","mappings":"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","sources":["webpack://@fof/user-bio/./node_modules/autolink-js/autolink-min.js","webpack://@fof/user-bio/webpack/bootstrap","webpack://@fof/user-bio/webpack/runtime/compat get default export","webpack://@fof/user-bio/webpack/runtime/define property getters","webpack://@fof/user-bio/webpack/runtime/hasOwnProperty shorthand","webpack://@fof/user-bio/webpack/runtime/make namespace object","webpack://@fof/user-bio/external root \"flarum.core.compat['forum/app']\"","webpack://@fof/user-bio/external root \"flarum.core.compat['common/extend']\"","webpack://@fof/user-bio/external root \"flarum.core.compat['common/utils/computed']\"","webpack://@fof/user-bio/external root \"flarum.core.compat['forum/components/UserCard']\"","webpack://@fof/user-bio/external root \"flarum.core.compat['common/models/User']\"","webpack://@fof/user-bio/external root \"flarum.core.compat['common/Model']\"","webpack://@fof/user-bio/./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js","webpack://@fof/user-bio/external root \"flarum.core.compat['common/Component']\"","webpack://@fof/user-bio/external root \"flarum.core.compat['common/components/LoadingIndicator']\"","webpack://@fof/user-bio/external root \"flarum.core.compat['common/utils/classList']\"","webpack://@fof/user-bio/external root \"flarum.core.compat['common/utils/extractText']\"","webpack://@fof/user-bio/./src/forum/components/UserBio.js","webpack://@fof/user-bio/./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js","webpack://@fof/user-bio/./src/forum/components/index.js","webpack://@fof/user-bio/./src/forum/index.js"],"sourcesContent":["(function(){var h=[].slice;String.prototype.autoLink=function(){var b,f,d,a,e,g;a=1<=arguments.length?h.call(arguments,0):[];e=/(^|[\\s\\n]|<[A-Za-z]*\\/?>)((?:https?|ftp):\\/\\/[\\-A-Z0-9+\\u0026\\u2019@#\\/%?=()~_|!:,.;]*[\\-A-Z0-9+\\u0026@#\\/%=~()_|])/gi;if(!(0$2\");d=a[0];f=function(){var c;c=[];for(b in d)g=d[b],\"callback\"!==b&&c.push(\" \"+b+\"='\"+g+\"'\");return c}().join(\"\");return this.replace(e,function(c,b,a){c=(\"function\"===typeof d.callback?d.callback(a):\nvoid 0)||\"\"+a+\"\";return\"\"+b+c})}}).call(this);\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/app'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/extend'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/utils/computed'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/components/UserCard'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/models/User'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/Model'];","export default function _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n\n return _setPrototypeOf(o, p);\n}","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/Component'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/LoadingIndicator'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/utils/classList'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/utils/extractText'];","import app from 'flarum/forum/app';\nimport Component from 'flarum/common/Component';\nimport LoadingIndicator from 'flarum/common/components/LoadingIndicator';\nimport classList from 'flarum/common/utils/classList';\nimport extractText from 'flarum/common/utils/extractText';\n\n/**\n * The `UserBio` component displays a user's bio, optionally letting the user\n * edit it.\n */\nexport default class UserBio extends Component {\n oninit(vnode) {\n super.oninit(vnode);\n /**\n * Whether or not the bio is currently being edited.\n *\n * @type {Boolean}\n */\n this.editing = false;\n\n /**\n * Whether or not the bio is currently being saved.\n *\n * @type {Boolean}\n */\n this.loading = false;\n\n /**\n * The max configured character count the bio may be\n */\n this.bioMaxLength = app.forum.attribute('fof-user-bio.maxLength');\n\n /**\n * The placeholder shown in the bio textbox when no input is set.\n */\n this.bioPlaceholder =\n app.session && app.session.user && app.session.user.id() === this.attrs.user.id()\n ? // Normal placeholder if they're looking at their own profile\n app.translator.trans('fof-user-bio.forum.userbioPlaceholder')\n : // Special placeholder if someone else is viewing their profile with edit access\n app.translator.trans('fof-user-bio.forum.userbioPlaceholderOtherUser', {\n username: this.attrs.user.username(),\n });\n }\n\n view() {\n const user = this.attrs.user;\n const editable = this.attrs.user.attribute('canEditBio');\n let content;\n\n if (this.editing) {\n content = (\n \n );\n } else {\n let subContent;\n\n if (this.loading) {\n subContent = (\n \n \n
\n );\n } else {\n const bioHtml = user.bioHtml();\n\n if (bioHtml) {\n subContent = m.trust(bioHtml);\n } else if (user.bio()) {\n subContent = m.trust('' + $('
').text(user.bio()).html().replace(/\\n/g, '
').autoLink({ rel: 'nofollow ugc' }) + '');\n } else if (editable) {\n subContent = {this.bioPlaceholder}
;\n }\n }\n\n content = (\n undefined}>\n {subContent}\n
\n );\n }\n\n return (\n \n {content}\n
\n );\n }\n\n /**\n * Edit the bio.\n */\n edit() {\n this.editing = true;\n m.redraw.sync();\n\n const bio = this;\n const save = function (e) {\n if (e.shiftKey) return;\n e.preventDefault();\n bio.save($(this).val());\n };\n\n this.$('textarea').focus().bind('blur', save).bind('keydown', 'return', save);\n m.redraw();\n }\n\n /**\n * Save the bio.\n *\n * @param {String} value\n */\n save(value) {\n const user = this.attrs.user;\n\n if (user.bio() !== value) {\n this.loading = true;\n\n user\n .save({ bio: value })\n .catch(() => {})\n .then(() => {\n this.loading = false;\n m.redraw();\n });\n }\n\n this.editing = false;\n m.redraw();\n }\n}\n","import setPrototypeOf from \"./setPrototypeOf.js\";\nexport default function _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n setPrototypeOf(subClass, superClass);\n}","import UserBio from './UserBio';\n\nexport const components = {\n UserBio,\n};\n","import app from 'flarum/forum/app';\nimport { extend } from 'flarum/common/extend';\nimport 'autolink-js';\nimport computed from 'flarum/common/utils/computed';\nimport UserCard from 'flarum/forum/components/UserCard';\nimport User from 'flarum/common/models/User';\nimport Model from 'flarum/common/Model';\nimport UserBio from './components/UserBio';\n\nexport * from './components';\n\napp.initializers.add('fof-user-bio', () => {\n User.prototype.bio = Model.attribute('bio');\n User.prototype.bioHtml = Model.attribute('bioHtml');\n\n extend(UserCard.prototype, 'infoItems', function (items) {\n let user = this.attrs.user;\n\n if (!user.attribute('canViewBio')) {\n return;\n }\n\n items.add('bio', , -100);\n });\n});\n"],"names":["h","slice","String","prototype","autoLink","b","f","d","a","e","g","arguments","length","call","c","push","join","this","replace","callback","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","__webpack_modules__","n","getter","__esModule","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","hasOwnProperty","r","Symbol","toStringTag","value","flarum","core","compat","_setPrototypeOf","p","setPrototypeOf","__proto__","UserBio","subClass","superClass","create","constructor","oninit","vnode","editing","loading","bioMaxLength","app","attribute","bioPlaceholder","user","id","attrs","trans","username","view","content","editable","className","placeholder","extractText","rows","maxlength","bio","subContent","bioHtml","m","trust","$","text","html","rel","onclick","edit","bind","classList","redraw","sync","save","shiftKey","preventDefault","val","focus","then","Component","components","add","User","Model","extend","UserCard","items"],"sourceRoot":""}
\ No newline at end of file
+{"version":3,"file":"forum.js","mappings":"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","sources":["webpack://@fof/user-bio/./node_modules/autolink-js/autolink-min.js","webpack://@fof/user-bio/webpack/bootstrap","webpack://@fof/user-bio/webpack/runtime/compat get default export","webpack://@fof/user-bio/webpack/runtime/define property getters","webpack://@fof/user-bio/webpack/runtime/hasOwnProperty shorthand","webpack://@fof/user-bio/webpack/runtime/make namespace object","webpack://@fof/user-bio/external root \"flarum.core.compat['forum/app']\"","webpack://@fof/user-bio/external root \"flarum.core.compat['common/extend']\"","webpack://@fof/user-bio/external root \"flarum.core.compat['common/utils/computed']\"","webpack://@fof/user-bio/external root \"flarum.core.compat['forum/components/UserCard']\"","webpack://@fof/user-bio/external root \"flarum.core.compat['common/models/User']\"","webpack://@fof/user-bio/external root \"flarum.core.compat['common/Model']\"","webpack://@fof/user-bio/./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js","webpack://@fof/user-bio/external root \"flarum.core.compat['common/Component']\"","webpack://@fof/user-bio/external root \"flarum.core.compat['common/components/LoadingIndicator']\"","webpack://@fof/user-bio/external root \"flarum.core.compat['common/utils/classList']\"","webpack://@fof/user-bio/external root \"flarum.core.compat['common/utils/extractText']\"","webpack://@fof/user-bio/./src/forum/components/UserBio.js","webpack://@fof/user-bio/./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js","webpack://@fof/user-bio/./src/forum/components/index.js","webpack://@fof/user-bio/./src/forum/index.js"],"sourcesContent":["(function(){var h=[].slice;String.prototype.autoLink=function(){var b,f,d,a,e,g;a=1<=arguments.length?h.call(arguments,0):[];e=/(^|[\\s\\n]|<[A-Za-z]*\\/?>)((?:https?|ftp):\\/\\/[\\-A-Z0-9+\\u0026\\u2019@#\\/%?=()~_|!:,.;]*[\\-A-Z0-9+\\u0026@#\\/%=~()_|])/gi;if(!(0$2\");d=a[0];f=function(){var c;c=[];for(b in d)g=d[b],\"callback\"!==b&&c.push(\" \"+b+\"='\"+g+\"'\");return c}().join(\"\");return this.replace(e,function(c,b,a){c=(\"function\"===typeof d.callback?d.callback(a):\nvoid 0)||\"\"+a+\"\";return\"\"+b+c})}}).call(this);\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/app'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/extend'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/utils/computed'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/components/UserCard'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/models/User'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/Model'];","export default function _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n\n return _setPrototypeOf(o, p);\n}","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/Component'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/LoadingIndicator'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/utils/classList'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/utils/extractText'];","import app from 'flarum/forum/app';\nimport Component from 'flarum/common/Component';\nimport LoadingIndicator from 'flarum/common/components/LoadingIndicator';\nimport classList from 'flarum/common/utils/classList';\nimport extractText from 'flarum/common/utils/extractText';\n\n/**\n * The `UserBio` component displays a user's bio, optionally letting the user\n * edit it.\n */\nexport default class UserBio extends Component {\n oninit(vnode) {\n super.oninit(vnode);\n /**\n * Whether or not the bio is currently being edited.\n *\n * @type {Boolean}\n */\n this.editing = false;\n\n /**\n * Whether or not the bio is currently being saved.\n *\n * @type {Boolean}\n */\n this.loading = false;\n\n /**\n * The max configured character count the bio may be\n */\n this.bioMaxLength = app.forum.attribute('fof-user-bio.maxLength');\n\n /**\n * The placeholder shown in the bio textbox when no input is set.\n */\n this.bioPlaceholder =\n app.session && app.session.user && app.session.user.id() === this.attrs.user.id()\n ? // Normal placeholder if they're looking at their own profile\n app.translator.trans('fof-user-bio.forum.userbioPlaceholder')\n : // Special placeholder if someone else is viewing their profile with edit access\n app.translator.trans('fof-user-bio.forum.userbioPlaceholderOtherUser', {\n username: this.attrs.user.username(),\n });\n }\n\n view() {\n const user = this.attrs.user;\n const editable = this.attrs.user.attribute('canEditBio');\n let content;\n\n if (this.editing) {\n const tempBio = this.tempBio;\n const value = tempBio ?? user.bio();\n\n const focusIfErrored = (vnode) => {\n const textarea = vnode.dom;\n\n textarea.value = value;\n\n if (tempBio !== undefined) {\n textarea.value = tempBio;\n textarea.focus();\n\n if (this.tempSelector !== undefined) {\n textarea.selectionStart = this.tempSelector;\n textarea.selectionEnd = this.tempSelector;\n\n delete this.tempSelector;\n }\n }\n };\n\n content = (\n \n );\n } else {\n let subContent;\n\n if (this.loading) {\n subContent = (\n \n \n
\n );\n } else {\n const bioHtml = user.bioHtml();\n\n if (bioHtml) {\n subContent = m.trust(bioHtml);\n } else if (user.bio()) {\n subContent = m.trust('' + $('
').text(user.bio()).html().replace(/\\n/g, '
').autoLink({ rel: 'nofollow ugc' }) + '');\n } else if (editable) {\n subContent = {this.bioPlaceholder}
;\n }\n }\n\n const maxLines = app.forum.attribute('fof-user-bio.maxLines');\n\n content = (\n undefined} style={{ '--bio-max-lines': maxLines }}>\n {subContent}\n
\n );\n }\n\n return (\n \n {content}\n
\n );\n }\n\n /**\n * Edit the bio.\n */\n edit() {\n this.editing = true;\n m.redraw.sync();\n\n const bio = this;\n const save = function (e) {\n if (e.shiftKey) return;\n e.preventDefault();\n\n bio.save(e.target.value, e.type === 'blur');\n };\n\n this.$('textarea').trigger('focus').on('blur', save).bind('keydown', 'return', save);\n m.redraw();\n }\n\n /**\n * Save the bio.\n *\n * @param {String} value\n */\n save(value, wasBlurred) {\n const user = this.attrs.user;\n const tempSelector = this.$('textarea').prop('selectionStart');\n\n const shouldIgnore = wasBlurred && value === this.tempBio;\n\n // Don't constantly try to save when blurring textarea\n if (!shouldIgnore && user.bio() !== value) {\n this.loading = true;\n\n user\n .save({ bio: value })\n .catch(() => {\n this.tempBio = value;\n this.tempSelector = tempSelector;\n this.edit();\n })\n .then(() => {\n this.loading = false;\n delete this.tempBio;\n m.redraw();\n });\n }\n\n if (shouldIgnore) {\n delete this.tempBio;\n }\n\n this.editing = false;\n m.redraw();\n }\n}\n","import setPrototypeOf from \"./setPrototypeOf.js\";\nexport default function _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n setPrototypeOf(subClass, superClass);\n}","import UserBio from './UserBio';\n\nexport const components = {\n UserBio,\n};\n","import app from 'flarum/forum/app';\nimport { extend } from 'flarum/common/extend';\nimport 'autolink-js';\nimport computed from 'flarum/common/utils/computed';\nimport UserCard from 'flarum/forum/components/UserCard';\nimport User from 'flarum/common/models/User';\nimport Model from 'flarum/common/Model';\nimport UserBio from './components/UserBio';\n\nexport * from './components';\n\napp.initializers.add('fof-user-bio', () => {\n User.prototype.bio = Model.attribute('bio');\n User.prototype.bioHtml = Model.attribute('bioHtml');\n\n extend(UserCard.prototype, 'infoItems', function (items) {\n let user = this.attrs.user;\n\n if (!user.attribute('canViewBio')) {\n return;\n }\n\n items.add('bio', , -100);\n });\n});\n"],"names":["h","slice","String","prototype","autoLink","b","f","d","a","e","g","arguments","length","call","c","push","join","this","replace","callback","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","__webpack_modules__","n","getter","__esModule","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","hasOwnProperty","r","Symbol","toStringTag","value","flarum","core","compat","_setPrototypeOf","p","setPrototypeOf","__proto__","UserBio","subClass","superClass","create","constructor","oninit","vnode","editing","loading","bioMaxLength","app","attribute","bioPlaceholder","user","id","attrs","trans","username","view","content","editable","tempBio","bio","className","placeholder","extractText","rows","maxlength","oncreate","textarea","dom","focus","tempSelector","selectionStart","selectionEnd","subContent","bioHtml","m","trust","$","text","html","rel","maxLines","onclick","edit","bind","style","classList","redraw","sync","save","shiftKey","preventDefault","target","type","trigger","on","wasBlurred","shouldIgnore","then","Component","components","add","User","Model","extend","UserCard","items"],"sourceRoot":""}
\ No newline at end of file