@aerogel/core 0.0.0-next.c8f032a868370824898e171969aec1bb6827688e → 0.0.0-next.d824b40e5d06757cd9f47c9f771d916185df4f05
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.
- package/dist/aerogel-core.cjs.js +1 -1
- package/dist/aerogel-core.cjs.js.map +1 -1
- package/dist/aerogel-core.d.ts +545 -88
- package/dist/aerogel-core.esm.js +1 -1
- package/dist/aerogel-core.esm.js.map +1 -1
- package/dist/virtual.d.ts +11 -0
- package/noeldemartin.config.js +4 -1
- package/package.json +4 -3
- package/src/bootstrap/index.ts +6 -2
- package/src/components/AGAppModals.vue +15 -0
- package/src/components/AGAppOverlays.vue +5 -7
- package/src/components/AGAppSnackbars.vue +13 -0
- package/src/components/basic/AGErrorMessage.vue +16 -0
- package/src/components/basic/AGLink.vue +9 -0
- package/src/components/basic/AGMarkdown.vue +10 -9
- package/src/components/basic/index.ts +3 -1
- package/src/components/constants.ts +8 -0
- package/src/components/forms/AGButton.vue +33 -10
- package/src/components/forms/AGCheckbox.vue +35 -0
- package/src/components/forms/AGInput.vue +8 -4
- package/src/components/forms/index.ts +2 -1
- package/src/components/headless/forms/AGHeadlessButton.vue +7 -7
- package/src/components/headless/forms/AGHeadlessInput.ts +2 -2
- package/src/components/headless/forms/AGHeadlessInput.vue +3 -3
- package/src/components/headless/forms/AGHeadlessInputError.vue +1 -1
- package/src/components/headless/forms/AGHeadlessInputInput.vue +15 -3
- package/src/components/headless/index.ts +1 -0
- package/src/components/headless/modals/AGHeadlessModalPanel.vue +5 -1
- package/src/components/headless/snackbars/AGHeadlessSnackbar.vue +10 -0
- package/src/components/headless/snackbars/index.ts +25 -0
- package/src/components/index.ts +2 -0
- package/src/components/modals/AGAlertModal.vue +0 -1
- package/src/components/modals/AGConfirmModal.vue +1 -1
- package/src/components/modals/AGErrorReportModal.ts +20 -0
- package/src/components/modals/AGErrorReportModal.vue +62 -0
- package/src/components/modals/AGErrorReportModalButtons.vue +109 -0
- package/src/components/modals/AGErrorReportModalTitle.vue +25 -0
- package/src/components/modals/AGLoadingModal.vue +19 -0
- package/src/components/modals/AGModal.vue +23 -4
- package/src/components/modals/AGModalTitle.vue +9 -0
- package/src/components/modals/index.ts +18 -2
- package/src/components/snackbars/AGSnackbar.vue +42 -0
- package/src/components/snackbars/index.ts +3 -0
- package/src/directives/index.ts +16 -3
- package/src/errors/Errors.state.ts +31 -0
- package/src/errors/Errors.ts +183 -0
- package/src/errors/index.ts +59 -0
- package/src/forms/Form.test.ts +21 -0
- package/src/forms/Form.ts +22 -12
- package/src/forms/utils.ts +17 -0
- package/src/lang/Lang.ts +12 -4
- package/src/lang/index.ts +3 -5
- package/src/lang/utils.ts +4 -0
- package/src/main.ts +1 -2
- package/src/plugins/Plugin.ts +1 -0
- package/src/plugins/index.ts +19 -0
- package/src/services/App.state.ts +10 -2
- package/src/services/App.ts +14 -1
- package/src/services/Service.ts +132 -45
- package/src/services/index.ts +21 -4
- package/src/services/store.ts +27 -0
- package/src/types/virtual.d.ts +11 -0
- package/src/ui/UI.state.ts +11 -1
- package/src/ui/UI.ts +52 -8
- package/src/ui/index.ts +7 -1
- package/src/utils/composition/forms.ts +11 -0
- package/src/utils/index.ts +1 -0
- package/src/utils/markdown.ts +11 -2
- package/src/utils/vue.ts +2 -0
- package/tsconfig.json +1 -0
- package/vite.config.ts +2 -1
- package/src/globals.ts +0 -6
package/dist/aerogel-core.esm.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import"core-js/modules/esnext.async-iterator.map.js";import"core-js/modules/esnext.iterator.map.js";import{ref as e,inject as t,reactive as s,computed as a,markRaw as r,nextTick as o,onUnmounted as n,defineComponent as l,toRef as i,openBlock as u,createBlock as d,unref as c,withCtx as m,renderSlot as p,provide as f,resolveDynamicComponent as h,normalizeProps as v,guardReactiveProps as _,createCommentVNode as g,createElementVNode as b,createVNode as y,h as A,onMounted as x,normalizeClass as G,createTextVNode as w,toDisplayString as j,createApp as C,createElementBlock as M,Fragment as I,withModifiers as S,readonly as k,mergeProps as $}from"vue";import"core-js/modules/esnext.async-iterator.for-each.js";import"core-js/modules/esnext.iterator.constructor.js";import"core-js/modules/esnext.iterator.for-each.js";import{fail as H,JSError as E,MagicObject as O,PromisedValue as P,facade as q,arr as D,tap as L,uuid as B,noop as F,objectWithoutEmpty as V}from"@noeldemartin/utils";import N from"@babel/runtime/helpers/esm/defineProperty";import"core-js/modules/esnext.async-iterator.reduce.js";import"core-js/modules/esnext.iterator.reduce.js";import"core-js/modules/esnext.string.at.js";import"core-js/modules/esnext.async-iterator.filter.js";import"core-js/modules/esnext.iterator.filter.js";import{Dialog as T,DialogPanel as K,DialogTitle as z}from"@headlessui/vue";import Q from"dompurify";import{marked as W}from"marked";import"core-js/modules/esnext.async-iterator.some.js";import"core-js/modules/esnext.iterator.some.js";function R(e){return e}function U(e){return{type:Array,default:e??(()=>[])}}function J(){return{type:Boolean,default:arguments.length>0&&void 0!==arguments[0]&&arguments[0]}}function X(){return e()}function Y(e){return e}function Z(e,t){const s=Object.values(e);return{type:String,default:t??s[0]??null,validator:e=>s.includes(e)}}function ee(e){const a=t(e);return a?s(a):void 0}function te(e,t){return ee(e)??H(t??`Could not resolve '${e}' injection key`)}function se(e,s){return t(e)??H(s??`Could not resolve '${e}' injection key`)}function ae(e){return{type:e,default:null}}function re(){return{type:Number,default:arguments.length>0&&void 0!==arguments[0]?arguments[0]:null}}function oe(){return{type:Object,default:arguments.length>0&&void 0!==arguments[0]?arguments[0]:null}}function ne(){return{type:Array,required:!0}}function le(e){const t=Object.values(e);return{type:String,required:!0,validator:e=>t.includes(e)}}function ie(e){return{type:e,required:!0}}function ue(){return{type:Number,required:!0}}function de(){return{type:Object,required:!0}}function ce(){return{type:String,required:!0}}function me(){return{type:String,default:arguments.length>0&&void 0!==arguments[0]?arguments[0]:null}}const pe={"initial-focus":{mounted(e,t){let{value:s}=t;!1!==s&&e.focus()}}};var fe={install(e){Object.entries(pe).forEach((t=>{let[s,a]=t;return e.directive(s,a)}))}};class ServiceBootError extends E{constructor(e,t){super(`Service '${e}' failed booting`,{cause:t})}}function he(e){return class extends ve{getInitialState(){return e.initialState}getComputedStateDefinition(){return e.computed??{}}}}class ve extends O{constructor(){super(),N(this,"_namespace",void 0),N(this,"_booted",void 0),N(this,"_state",void 0),N(this,"_computedState",void 0),this._namespace=new.target.name,this._booted=new P,this._state=s(this.getInitialState()),this._computedState=Object.entries(this.getComputedStateDefinition()).reduce(((e,t)=>{let[s,r]=t;return e[s]=a((()=>r(this._state))),e}),{})}get booted(){return this._booted}launch(e){const handleError=e=>this._booted.reject(new ServiceBootError(this._namespace,e));this._namespace=e??this._namespace;try{this.boot().then((()=>this._booted.resolve())).catch(handleError)}catch(e){handleError(e)}return this._booted}__get(e){return this.hasState(e)?this.getState(e):this.hasComputedState(e)?this.getComputedState(e):super.__get(e)}__set(e,t){this.setState({[e]:t})}hasState(e){return e in this._state}hasComputedState(e){return e in this._computedState}getState(e){return e?this._state[e]:this._state}getComputedState(e){return this._computedState[e]?.value}setState(e){Object.assign(this._state,e)}getInitialState(){return{}}getComputedStateDefinition(){return{}}async boot(){}}var _e=he({initialState:{environment:__AG_ENV},computed:{isDevelopment:e=>"development"===e.environment}});class ge extends _e{}var be=q(new ge);class ye extends ve{constructor(){super(...arguments),N(this,"listeners",{})}async emit(e,t){const s=[...this.listeners[e]??[]];await Promise.all(s.map((e=>e(t)))??[])}on(e,t){return(this.listeners[e]??=D([])).push(t),()=>this.off(e,t)}once(e,t){let s=null;return L((()=>s&&this.off(e,s)),(a=>{(this.listeners[e]??=D([])).push(s=function(){return a(),t(...arguments)})}))}off(e,t){const s=this.listeners[e];s&&(s.remove(t),s.isEmpty()&&delete this.listeners[e])}}var Ae=q(new ye);const xe={$app:be,$events:Ae};async function Ge(e,t){await Promise.all(Object.entries(t).map((async e=>{let[t,s]=e;await s.launch(t.slice(1)).catch((e=>console.error(e)))}))),Object.assign(e.config.globalProperties,t)}var we={async install(e){await Ge(e,xe)}};var je=q(new class extends ve{constructor(){super(),N(this,"provider",void 0),this.provider={translate:e=>(be.isDevelopment&&console.warn("Lang provider is missing"),e)}}setProvider(e){this.provider=e}translate(e,t){return this.provider.translate(e,t)??e}translateWithDefault(e,t,s){s??=t;const a="string"==typeof t?{}:t,r=this.provider.translate(e,a)??e;return r===e?s:r}});const Ce={$lang:je},Me=je.translate.bind(je),Ie=je.translateWithDefault.bind(je);var Se={async install(e){e.config.globalProperties.$t??=Me,e.config.globalProperties.$td=Ie,await Ge(e,Ce)}},ke=he({initialState:{modals:[]}});const $e={AlertModal:"alert-modal",ConfirmModal:"confirm-modal"};var He=q(new class extends ke{constructor(){super(...arguments),N(this,"modalCallbacks",{}),N(this,"components",{})}alert(e,t){const s="string"==typeof t?{title:e,message:t}:{message:e};this.openModal(this.requireComponent($e.AlertModal),s)}async confirm(e,t){const s="string"==typeof t?{title:e,message:t}:{message:e},a=await this.openModal(this.requireComponent($e.ConfirmModal),s);return await a.beforeClose??!1}registerComponent(e,t){this.components[e]=t}async openModal(e,t){const s=B(),a={},n={id:s,properties:t??{},component:r(e),beforeClose:new Promise((e=>a.willClose=e)),afterClose:new Promise((e=>a.closed=e))},l=this.modals.at(-1),i=this.modals.concat(n);return this.modalCallbacks[n.id]=a,this.setState({modals:i}),await o(),await(l&&Ae.emit("hide-modal",{id:l.id})),await Promise.all([l||Ae.emit("show-overlays-backdrop"),Ae.emit("show-modal",{id:n.id})]),n}async closeModal(e,t){await Ae.emit("close-modal",{id:e,result:t})}async boot(){await super.boot(),this.watchModalEvents()}requireComponent(e){return this.components[e]??H(`UI Component '${e}' is not defined!`)}watchModalEvents(){Ae.on("modal-will-close",(e=>{let{modal:t,result:s}=e;this.modalCallbacks[t.id]?.willClose?.(s),1===this.modals.length&&Ae.emit("hide-overlays-backdrop")})),Ae.on("modal-closed",(async e=>{let{modal:t,result:s}=e;this.setState({modals:this.modals.filter((e=>e.id!==t.id))}),this.modalCallbacks[t.id]?.closed?.(s),delete this.modalCallbacks[t.id];const a=this.modals.at(-1);await(a&&Ae.emit("show-modal",{id:a.id}))}))}});function Ee(e,t){const s=Ae.on(e,t);n((()=>s()))}var Oe=l({__name:"AGHeadlessModal",props:{cancellable:J(!0)},setup(t,{expose:s}){const a=t,r=e(null),o=e(!0),n=e(!1),{modal:l}=te("modal","could not obtain modal reference from <AGHeadlessModal>, did you render this component manually? Show it using $ui.openModal() instead");async function f(){r.value?.$el&&(o.value=!0)}async function h(e){n.value||(Ae.emit("modal-will-close",{modal:l,result:e}),await f(),n.value=!0,Ae.emit("modal-closed",{modal:l,result:e}))}return Ee("close-modal",(async({id:e,result:t})=>{e===l.id&&await h(t)})),Ee("hide-modal",(async({id:e})=>{e===l.id&&await f()})),Ee("show-modal",(async({id:e})=>{e===l.id&&await async function(){r.value?.$el&&(o.value=!1)}()})),s({close:h,cancellable:i(a,"cancellable")}),(e,s)=>(u(),d(c(T),{ref_key:"$root",ref:r,open:!0,onClose:s[0]||(s[0]=e=>t.cancellable&&h())},{default:m((()=>[p(e.$slots,"default",{close:h})])),_:3},512))}});Oe.__file="src/components/headless/modals/AGHeadlessModal.vue";var Pe=l({__name:"AGModalContext",props:{modal:de(),childIndex:ue()},setup(e){const t=e;return f("modal",{modal:i(t,"modal"),childIndex:i(t,"childIndex")}),(t,s)=>(u(),d(h(e.modal.component),v(_(e.modal.properties)),null,16))}});Pe.__file="src/components/modals/AGModalContext.vue";var qe=l({__name:"AGHeadlessModalPanel",setup(e){const t=te("modal","could not obtain modal reference from <AGHeadlessModalPanel>, did you render this component manually? Show it using $ui.openModal() instead"),s=a((()=>He.modals[t.childIndex]??null));return(e,a)=>(u(),d(c(K),null,{default:m((()=>[p(e.$slots,"default"),s.value?(u(),d(Pe,{key:0,"child-index":c(t).childIndex+1,modal:s.value},null,8,["child-index","modal"])):g("v-if",!0)])),_:3}))}});qe.__file="src/components/headless/modals/AGHeadlessModalPanel.vue";const De={class:"fixed inset-0 flex items-center justify-center"},Le={class:"flex max-h-full flex-col overflow-auto p-4"};var Be=l({__name:"AGModal",setup:e=>(e,t)=>(u(),d(Oe,{class:"relative z-50"},{default:m((({close:t})=>[b("div",De,[y(qe,{class:"flex max-h-full max-w-full flex-col overflow-hidden bg-white"},{default:m((()=>[b("div",Le,[p(e.$slots,"default",{close:t})])])),_:2},1024)])])),_:3}))});function Fe(e){return t=W(e,{mangle:!1,headerIds:!1}),Q.sanitize(t,{ADD_ATTR:["target"]});var t}Be.__file="src/components/modals/AGModal.vue";var Ve=l({__name:"AGMarkdown",props:{as:me("div"),langKey:me(),text:me(),inline:J(),raw:J()},setup(e){const t=e,s=a((()=>t.text??(t.langKey&&Me(t.langKey)))),r=a((()=>{if(!s.value)return null;let e=Fe(s.value);return t.inline&&(e=e.replace("<p>","<span>").replace("</p>","</span>")),e})),o=()=>A(t.as,{class:t.raw?"":"prose",innerHTML:r.value});return(e,t)=>(u(),d(o))}});Ve.__file="src/components/basic/AGMarkdown.vue";var Ne=l({__name:"AGAlertModal",props:{title:me(),message:ce()},setup:e=>(t,s)=>(u(),d(Be,null,{default:m((()=>[e.title?(u(),d(Ve,{key:0,text:e.title,as:"h2",class:"font-semibold",raw:"",inline:""},null,8,["text"])):g("v-if",!0),y(Ve,{text:e.message},null,8,["text"])])),_:1}))});function Te(e){let t=F;x((()=>t=e())),n((()=>t()))}Ne.__file="src/components/modals/AGAlertModal.vue";var Ke=l({__name:"AGHeadlessButton",props:{url:me(),route:me(),routeParams:oe((()=>({}))),routeQuery:oe((()=>({}))),submit:J()},setup(e){const{url:t,route:s,routeParams:r,routeQuery:o,submit:n}=e,l=a((()=>s?{tag:"router-link",props:{to:V({name:s,params:r,query:o})}}:t?{tag:"a",props:{target:"_blank",href:t}}:{tag:"button",props:{type:n?"submit":"button"}}));return(e,t)=>(u(),d(h(l.value.tag),v(_(l.value.props)),{default:m((()=>[p(e.$slots,"default")])),_:3},16))}});Ke.__file="src/components/headless/forms/AGHeadlessButton.vue";var ze=l({__name:"AGButton",props:{secondary:J()},setup:e=>(t,s)=>(u(),d(Ke,{class:G(["px-2.5 py-1.5 text-white focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2",{"bg-indigo-600 hover:bg-indigo-500 focus-visible:outline-indigo-600":!e.secondary,"bg-gray-600 hover:bg-gray-500 focus-visible:outline-gray-600":e.secondary}])},{default:m((()=>[p(t.$slots,"default")])),_:3},8,["class"]))});ze.__file="src/components/forms/AGButton.vue";const Qe={class:"mt-2 flex flex-row-reverse gap-2"};var We=l({__name:"AGConfirmModal",props:{title:me(),message:ce()},setup:e=>(t,s)=>(u(),d(Be,{cancellable:!1},{default:m((({close:s})=>[e.title?(u(),d(Ve,{key:0,text:e.title,as:"h1"},null,8,["text"])):g("v-if",!0),y(Ve,{text:e.message},null,8,["text"]),b("div",Qe,[y(ze,{onClick:e=>s(!0)},{default:m((()=>[w(j(t.$td("ui.ok","OK")),1)])),_:2},1032,["onClick"]),y(ze,{secondary:"",onClick:e=>s()},{default:m((()=>[w(j(t.$td("ui.cancel","Cancel")),1)])),_:2},1032,["onClick"])])])),_:1}))});We.__file="src/components/modals/AGConfirmModal.vue";const Re={$ui:He};var Ue={async install(e,t){const s={[$e.AlertModal]:Ne,[$e.ConfirmModal]:We};Object.entries({...s,...t.components}).forEach((e=>{let[t,s]=e;return He.registerComponent(t,s)})),await Ge(e,Re)}};async function Je(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const s=[fe,Se,we,Ue,...t.plugins??[]],a=C(e);await Promise.all(s.map((e=>e.install(a,t)))??[]),a.mount("#app")}const Xe={key:0};var Ye=l({__name:"AGAppOverlays",setup(t){const s=e(null),r=e(!0),o=a((()=>He.modals[0]??null));return Ee("show-overlays-backdrop",(async()=>{s.value&&r.value&&(r.value=!1,s.value.classList.remove("opacity-0"))})),Ee("hide-overlays-backdrop",(async()=>{s.value&&!r.value&&(r.value=!0,s.value.classList.add("opacity-0"))})),(e,t)=>(u(),M(I,null,[b("div",{ref_key:"$backdrop",ref:s,class:"pointer-events-none fixed inset-0 z-50 bg-black/30 opacity-0"},null,512),o.value?(u(),M("aside",Xe,[y(Pe,{"child-index":1,modal:o.value},null,8,["modal"])])):g("v-if",!0)],64))}});Ye.__file="src/components/AGAppOverlays.vue";const Ze={class:"flex h-full flex-col text-base font-normal leading-tight text-gray-900 antialiased"};var et=l({__name:"AGAppLayout",setup:e=>(e,t)=>(u(),M("div",Ze,[p(e.$slots,"default"),y(Ye)]))});et.__file="src/components/AGAppLayout.vue";const tt=["onSubmit"];var st=l({__name:"AGForm",props:{form:oe()},emits:["submit"],setup(e,{emit:t}){const s=e;function a(){s.form&&!s.form.submit()||t("submit")}return f("form",s.form),(e,t)=>(u(),M("form",{onSubmit:S(a,["prevent"])},[p(e.$slots,"default")],40,tt))}});st.__file="src/components/forms/AGForm.vue";var at=l({__name:"AGHeadlessInput",props:{as:me(),name:me(),modelValue:me()},emits:["update:modelValue"],setup(e,{expose:s,emit:r}){const o=e,n=a((()=>l&&o.name?l.errors[o.name]??null:null)),l=t("form",null),i={id:`input-${B()}`,value:a((()=>l&&o.name?l.getFieldValue(o.name):o.modelValue)),errors:k(n),update(e){l&&o.name?l.setFieldValue(o.name,e):r("update:modelValue",e)}};return f("input",i),s(i),(t,s)=>e.as?(u(),d(h(e.as),{key:0},{default:m((()=>[p(t.$slots,"default")])),_:3})):p(t.$slots,"default",{key:1})}});at.__file="src/components/headless/forms/AGHeadlessInput.vue";const rt=["id","value","aria-invalid","aria-describedby"];var ot=l({__name:"AGHeadlessInputInput",setup(t){const s=e(),r=te("input","<AGHeadlessInputInput> must be a child of a <AGHeadlessInput>"),o=a((()=>r.value));function n(){s.value&&r.update(s.value.value)}return(e,t)=>(u(),M("input",{id:c(r).id,ref_key:"$input",ref:s,type:"text",value:o.value,"aria-invalid":c(r).errors?"true":"false","aria-describedby":c(r).errors?`${c(r).id}-error`:void 0,onInput:n},null,40,rt))}});ot.__file="src/components/headless/forms/AGHeadlessInputInput.vue";const nt=["id"];var lt=l({__name:"AGHeadlessInputError",setup(e){const t=te("input","<AGHeadlessInputError> must be a child of a <AGHeadlessInput>"),s=a((()=>t.errors?Ie(`errors.${t.errors[0]}`,`Error: ${t.errors[0]}`):null));return(e,a)=>s.value?(u(),M("p",{key:0,id:`${c(t).id}-error`},j(s.value),9,nt)):g("v-if",!0)}});lt.__file="src/components/headless/forms/AGHeadlessInputError.vue";var it=l({inheritAttrs:!1,__name:"AGInput",props:{name:me()},setup(e){const t=X();return(s,a)=>(u(),d(at,{ref_key:"$input",ref:t,as:"div",class:"flex flex-col items-center",name:e.name},{default:m((()=>[y(ot,$(s.$attrs,{class:["block w-full border-0 py-1.5 text-gray-900 ring-1 ring-inset ring-gray-300 placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-indigo-600",{"ring-1 ring-red-500":c(t)?.errors}]}),null,16,["class"]),y(lt,{class:"mt-1 text-sm text-red-500"})])),_:1},8,["name"]))}});it.__file="src/components/forms/AGInput.vue";const ut=["for"];var dt=l({__name:"AGHeadlessInputLabel",setup(e){const t=te("input","<AGHeadlessInputLabel> must be a child of a <AGHeadlessInput>");return(e,s)=>(u(),M("label",{for:c(t).id},[p(e.$slots,"default")],8,ut))}});dt.__file="src/components/headless/forms/AGHeadlessInputLabel.vue";var ct=l({__name:"AGHeadlessModalTitle",props:{as:me("h2")},setup:e=>(t,s)=>(u(),d(c(z),{as:e.as},{default:m((()=>[p(t.$slots,"default")])),_:3},8,["as"]))});ct.__file="src/components/headless/modals/AGHeadlessModalTitle.vue";const mt={String:"string",Number:"number"};class pt extends O{constructor(t){super(),N(this,"errors",void 0),N(this,"_fields",void 0),N(this,"_data",void 0),N(this,"_valid",void 0),N(this,"_submitted",void 0),N(this,"_errors",void 0),this._fields=t,this._submitted=e(!1),this._data=this.getInitialData(t),this._errors=this.getInitialErrors(t),this._valid=a((()=>!Object.values(this._errors).some((e=>null!==e)))),this.errors=k(this._errors)}get valid(){return this._valid.value}get submitted(){return this._submitted.value}setFieldValue(e,t){this._data[e]=t,this._submitted.value&&this.validate()}getFieldValue(e){return this._data[e]}validate(){const e=Object.entries(this._fields).reduce(((e,t)=>{let[s,a]=t;return e[s]=this.getFieldErrors(s,a),e}),{});return this.resetErrors(e),this.valid}reset(){this._submitted.value=!1,this.resetErrors()}submit(){return this._submitted.value=!0,this.validate()}__get(e){return e in this._fields?this._data[e]:super.__get(e)}__set(e,t){e in this._fields?Object.assign(this._data,{[e]:t}):super.__set(e,t)}getFieldErrors(e,t){const s=[];return t.rules?.includes("required")&&!this._data[e]&&s.push("required"),s.length>0?s:null}getInitialData(e){if(this.static().isConjuring())return{};const t=Object.entries(e).reduce(((e,t)=>{let[s,a]=t;return e[s]=a.default??null,e}),{});return s(t)}getInitialErrors(e){if(this.static().isConjuring())return{};const t=Object.keys(e).reduce(((e,t)=>(e[t]=null,e)),{});return s(t)}resetErrors(e){Object.keys(this._errors).forEach((e=>delete this._errors[e])),e&&Object.assign(this._errors,e)}}function ft(e){return new pt(e)}function ht(e){return{default:e,type:mt.Number,rules:"required"}}function vt(e){return{default:e,type:mt.String,rules:"required"}}function _t(e){return{default:e,type:mt.Number}}function gt(e){return{default:e,type:mt.String}}export{Ne as AGAlertModal,et as AGAppLayout,Ye as AGAppOverlays,ze as AGButton,We as AGConfirmModal,st as AGForm,Ke as AGHeadlessButton,at as AGHeadlessInput,lt as AGHeadlessInputError,ot as AGHeadlessInputInput,dt as AGHeadlessInputLabel,Oe as AGHeadlessModal,qe as AGHeadlessModalPanel,ct as AGHeadlessModalTitle,it as AGInput,Ve as AGMarkdown,Be as AGModal,Pe as AGModalContext,be as App,ge as AppService,Ae as Events,ye as EventsService,mt as FormFieldTypes,je as Lang,ve as Service,He as UI,$e as UIComponents,U as arrayProp,J as booleanProp,Ge as bootServices,Je as bootstrapApplication,X as componentRef,Y as defineDirective,R as definePlugin,he as defineServiceState,Z as enumProp,se as injectOrFail,ee as injectReactive,te as injectReactiveOrFail,ae as mixedProp,_t as numberInput,re as numberProp,oe as objectProp,Te as onCleanMounted,ne as requiredArrayProp,le as requiredEnumProp,ie as requiredMixedProp,ht as requiredNumberInput,ue as requiredNumberProp,de as requiredObjectProp,vt as requiredStringInput,ce as requiredStringProp,gt as stringInput,me as stringProp,Me as translate,Ie as translateWithDefault,Ee as useEvent,ft as useForm};
|
|
1
|
+
import{ref as e,inject as t,reactive as r,markRaw as s,nextTick as o,onUnmounted as n,useAttrs as a,computed as l,onMounted as i,defineComponent as u,toRef as c,openBlock as d,createBlock as p,unref as m,withCtx as f,renderSlot as h,provide as v,resolveDynamicComponent as g,normalizeProps as _,guardReactiveProps as b,createElementBlock as y,Fragment as x,createVNode as w,createCommentVNode as A,createElementVNode as k,mergeProps as G,h as j,normalizeClass as S,createTextVNode as M,toDisplayString as C,renderList as E,readonly as $,createApp as H,withModifiers as I}from"vue";import"core-js/modules/esnext.async-iterator.reduce.js";import"core-js/modules/esnext.iterator.constructor.js";import"core-js/modules/esnext.iterator.reduce.js";import"core-js/modules/esnext.async-iterator.map.js";import"core-js/modules/esnext.iterator.map.js";import{JSError as R,MagicObject as L,PromisedValue as P,objectOnly as B,isEmpty as O,Storage as q,objectDeepClone as D,facade as T,arr as z,tap as V,fail as U,uuid as F,toString as N,isObject as K,objectWithoutEmpty as Q,objectWithout as W,noop as Z,stringExcerpt as Y}from"@noeldemartin/utils";import J from"@babel/runtime/helpers/esm/defineProperty";import"core-js/modules/esnext.set.add-all.js";import"core-js/modules/esnext.set.delete-all.js";import"core-js/modules/esnext.set.difference.js";import"core-js/modules/esnext.set.every.js";import"core-js/modules/esnext.set.filter.js";import"core-js/modules/esnext.set.find.js";import"core-js/modules/esnext.set.intersection.js";import"core-js/modules/esnext.set.is-disjoint-from.js";import"core-js/modules/esnext.set.is-subset-of.js";import"core-js/modules/esnext.set.is-superset-of.js";import"core-js/modules/esnext.set.join.js";import"core-js/modules/esnext.set.map.js";import"core-js/modules/esnext.set.reduce.js";import"core-js/modules/esnext.set.some.js";import"core-js/modules/esnext.set.symmetric-difference.js";import"core-js/modules/esnext.set.union.js";import{defineStore as X,createPinia as ee,setActivePinia as te}from"pinia";import re from"virtual:aerogel";import"core-js/modules/esnext.async-iterator.filter.js";import"core-js/modules/esnext.iterator.filter.js";import"core-js/modules/esnext.string.at.js";import"core-js/modules/esnext.async-iterator.some.js";import"core-js/modules/esnext.iterator.some.js";import"core-js/modules/esnext.async-iterator.for-each.js";import"core-js/modules/esnext.iterator.for-each.js";import{Dialog as se,DialogPanel as oe,DialogTitle as ne}from"@headlessui/vue";import ae from"dompurify";import{marked as le,Renderer as ie}from"marked";class ServiceBootError extends R{constructor(e,t){super(`Service '${e}' failed booting`,{cause:t})}}let ue=null;function ce(){return ue||(ue=ee(),te(ue)),ue}function de(e){var t;return J(t=class extends pe{usesStore(){return!0}getName(){return e.name??null}getInitialState(){return e.initialState}getComputedStateDefinition(){return e.computed??{}}serializePersistedState(t){return e.serialize?.(t)??t}},"persist",e.persist??[]),t}class pe extends L{constructor(){super(),J(this,"_name",void 0),J(this,"_booted",void 0),J(this,"_computedStateKeys",void 0),J(this,"_store",void 0);const e=this.getComputedStateDefinition();var t,r;this._name=this.getName()??new.target.name,this._booted=new P,this._computedStateKeys=new Set(Object.keys(e)),this._store=this.usesStore()&&(t=this._name,r={state:()=>this.getInitialState(),getters:e},ce(),X(t,r)())}get booted(){return this._booted}launch(){const handleError=e=>this._booted.reject(new ServiceBootError(this._name,e));try{this.frameworkBoot().then((()=>this.boot())).then((()=>this._booted.resolve())).catch(handleError)}catch(e){handleError(e)}return this._booted}hasState(e){return!!this._store&&(e in this._store.$state||this._computedStateKeys.has(e))}getState(e){const t=this._store;return e?t?t[e]:void 0:t||{}}setState(e,t){if(!this._store)return;const r="string"==typeof e?{[e]:t}:e;Object.assign(this._store.$state,r),this.onStateUpdated(r)}__get(e){return this.hasState(e)?this.getState(e):super.__get(e)}__set(e,t){this.setState({[e]:t})}onStateUpdated(e){const t=this.constructor.persist,r=B(e,t);if(O(r))return;const s=q.require(this._name);q.set(this._name,{...s,...this.serializePersistedState(D(r))})}usesStore(){return!1}getName(){return null}getInitialState(){return{}}getComputedStateDefinition(){return{}}serializePersistedState(e){return e}async frameworkBoot(){this.restorePersistedState()}async boot(){}restorePersistedState(){const e=this.constructor.persist;if(this.usesStore()&&!O(e))if(q.has(this._name)){const e=q.require(this._name);this.setState(e)}else q.set(this._name,B(this.getState(),e))}}J(pe,"persist",[]);class me extends pe{constructor(){super(...arguments),J(this,"listeners",{})}async emit(e,t){const r=[...this.listeners[e]??[]];await Promise.all(r.map((e=>e(t)))??[])}on(e,t){return(this.listeners[e]??=z([])).push(t),()=>this.off(e,t)}once(e,t){let r=null;return V((()=>r&&this.off(e,r)),(s=>{(this.listeners[e]??=z([])).push(r=function(){return s(),t(...arguments)})}))}off(e,t){const r=this.listeners[e];r&&(r.remove(t),r.isEmpty()&&delete this.listeners[e])}}var fe=T(new me),he=de({name:"app",initialState:{plugins:{},environment:re.environment,sourceUrl:re.sourceUrl,isMounted:!1},computed:{development:e=>"development"===e.environment,testing:e=>"testing"===e.environment}});class ve extends he{plugin(e){return this.plugins[e]??null}async boot(){fe.once("application-mounted",(()=>this.setState({isMounted:!0})))}}var ge=T(new ve);function _e(e){return e}async function be(e){for(var t=arguments.length,r=new Array(t>1?t-1:0),s=1;s<t;s++)r[s-1]=arguments[s];ge.setState("plugins",e.reduce(((e,t)=>(t.name&&(e[t.name]=t),e)),{})),await Promise.all(e.map((e=>e.install(...r)))??[])}function ye(e){return{type:Array,default:e??(()=>[])}}function xe(){return{type:Boolean,default:arguments.length>0&&void 0!==arguments[0]&&arguments[0]}}function we(){return e()}function Ae(e){return e}function ke(e,t){const r=Object.values(e);return{type:String,default:t??r[0]??null,validator:e=>r.includes(e)}}function Ge(e){const s=t(e);return s?r(s):void 0}function je(e,t){return Ge(e)??U(t??`Could not resolve '${e}' injection key`)}function Se(e,r){return t(e)??U(r??`Could not resolve '${e}' injection key`)}function Me(e){return{type:e,default:null}}function Ce(){return{type:Number,default:arguments.length>0&&void 0!==arguments[0]?arguments[0]:null}}function Ee(){return{type:Object,default:arguments.length>0&&void 0!==arguments[0]?arguments[0]:null}}function $e(){return{type:Array,required:!0}}function He(e){const t=Object.values(e);return{type:String,required:!0,validator:e=>t.includes(e)}}function Ie(e){return{type:e,required:!0}}function Re(){return{type:Number,required:!0}}function Le(){return{type:Object,required:!0}}function Pe(){return{type:String,required:!0}}function Be(){return{type:String,default:arguments.length>0&&void 0!==arguments[0]?arguments[0]:null}}const Oe={"initial-focus":{mounted(e,t){let{value:r}=t;!1!==r&&e.focus()}}};var qe={install(e,t){const r={...Oe,...t.directives};for(const[t,s]of Object.entries(r))e.directive(t,s)}};const De={$app:ge,$events:fe};async function Te(e,t){await Promise.all(Object.entries(t).map((async t=>{let[r,s]=t;await s.launch().catch((t=>e.config.errorHandler?.(t,null,`Failed launching ${r}.`)))}))),Object.assign(e.config.globalProperties,t),ge.development&&Object.assign(window,t)}var ze={async install(e,t){const r={...De,...t.services};e.use(ue??ce()),await Te(e,r)}},Ve=de({name:"ui",initialState:{modals:[],snackbars:[]}});const Ue={AlertModal:"alert-modal",ConfirmModal:"confirm-modal",ErrorReportModal:"error-report-modal",LoadingModal:"loading-modal",Snackbar:"snackbar"};var Fe=T(new class extends Ve{constructor(){super(...arguments),J(this,"modalCallbacks",{}),J(this,"components",{})}requireComponent(e){return this.components[e]??U(`UI Component '${e}' is not defined!`)}alert(e,t){const r="string"==typeof t?{title:e,message:t}:{message:e};this.openModal(this.requireComponent(Ue.AlertModal),r)}async confirm(e,t){const r="string"==typeof t?{title:e,message:t}:{message:e},s=await this.openModal(this.requireComponent(Ue.ConfirmModal),r);return await s.beforeClose??!1}async loading(e,t){t="string"==typeof e?t:e;const r="string"==typeof e?e:void 0,s=await this.openModal(this.requireComponent(Ue.LoadingModal),{message:r}),o=await t;return await this.closeModal(s.id),o}showSnackbar(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const r={id:F(),properties:{message:e,...t},component:t.component??s(this.requireComponent(Ue.Snackbar))};this.setState("snackbars",this.snackbars.concat(r)),setTimeout((()=>this.hideSnackbar(r.id)),5e3)}hideSnackbar(e){this.setState("snackbars",this.snackbars.filter((t=>t.id!==e)))}registerComponent(e,t){this.components[e]=t}async openModal(e,t){const r=F(),n={},a={id:r,properties:t??{},component:s(e),beforeClose:new Promise((e=>n.willClose=e)),afterClose:new Promise((e=>n.closed=e))},l=this.modals.at(-1),i=this.modals.concat(a);return this.modalCallbacks[a.id]=n,this.setState({modals:i}),await o(),await(l&&fe.emit("hide-modal",{id:l.id})),await Promise.all([l||fe.emit("show-overlays-backdrop"),fe.emit("show-modal",{id:a.id})]),a}async closeModal(e,t){await fe.emit("close-modal",{id:e,result:t})}async boot(){this.watchModalEvents()}watchModalEvents(){fe.on("modal-will-close",(e=>{let{modal:t,result:r}=e;this.modalCallbacks[t.id]?.willClose?.(r),1===this.modals.length&&fe.emit("hide-overlays-backdrop")})),fe.on("modal-closed",(async e=>{let{modal:t,result:r}=e;this.setState("modals",this.modals.filter((e=>e.id!==t.id))),this.modalCallbacks[t.id]?.closed?.(r),delete this.modalCallbacks[t.id];const s=this.modals.at(-1);await(s&&fe.emit("show-modal",{id:s.id}))}))}});var Ne=T(new class extends pe{constructor(){super(),J(this,"provider",void 0),this.provider={translate:e=>(ge.development&&console.warn("Lang provider is missing"),e)}}setProvider(e){this.provider=e}translate(e,t){return this.provider.translate(e,t)??e}translateWithDefault(e,t,r){r??=t;const s="string"==typeof t?{}:t??{},o=this.provider.translate(e,s)??e;return o===e?Object.entries(s).reduce(((e,t)=>{let[r,s]=t;return e.replace(new RegExp(`\\{\\s*${r}\\s*\\}`,"g"),N(s))}),r):o}});const Ke=Ne.translate.bind(Ne),Qe=Ne.translateWithDefault.bind(Ne);var We=de({name:"errors",initialState:{logs:[],startupErrors:[]},computed:{hasErrors:e=>{let{logs:t}=e;return t.length>0},hasNewErrors:e=>{let{logs:t}=e;return t.some((e=>!e.seen))},hasStartupErrors:e=>{let{startupErrors:t}=e;return t.length>0}}});const Ze={Primary:"primary",Secondary:"secondary",Danger:"danger",Clear:"clear"};var Ye=T(new class extends We{constructor(){super(...arguments),J(this,"forceReporting",!1),J(this,"enabled",!0)}enable(){this.enabled=!0}disable(){this.enabled=!1}async inspect(e){const t=Array.isArray(e)?e:[await this.createErrorReport(e)];0!==t.length?Fe.openModal(Fe.requireComponent(Ue.ErrorReportModal),{reports:t}):Fe.alert(Qe("errors.inspectEmpty","Nothing to inspect!"))}async report(e,t){if((ge.development||ge.testing)&&this.logError(e),!this.enabled)throw e;if(!ge.isMounted){const t=await this.createStartupErrorReport(e);return void(t&&this.setState({startupErrors:this.startupErrors.concat(t)}))}const r=await this.createErrorReport(e),s={report:r,seen:!1,date:new Date};Fe.showSnackbar(t??Qe("errors.notice","Something went wrong, but it's not your fault. Try again!"),{color:Ze.Danger,actions:[{text:Qe("errors.viewDetails","View details"),dismiss:!0,handler:()=>Fe.openModal(Fe.requireComponent(Ue.ErrorReportModal),{reports:[r]})}]}),this.setState({logs:[s].concat(this.logs)})}see(e){this.setState({logs:this.logs.map((t=>t.report!==e?t:{...t,seen:!0}))})}seeAll(){this.setState({logs:this.logs.map((e=>({...e,seen:!0})))})}getErrorMessage(e){return"string"==typeof e?e:e instanceof Error||e instanceof R?e.message:K(e)?N(e.message??e.description??"Unknown error object"):Qe("errors.unknown","Unknown Error")}logError(e){console.error(e),K(e)&&e.cause&&this.logError(e.cause)}async createErrorReport(e){return"string"==typeof e?{title:e}:e instanceof Error||e instanceof R?this.createErrorReportFromError(e):K(e)?Q({title:N(e.name??e.title??Qe("errors.unknown","Unknown Error")),description:N(e.message??e.description??Qe("errors.unknownDescription","Unknown error object")),error:e}):{title:Qe("errors.unknown","Unknown Error"),error:e}}async createStartupErrorReport(e){return e instanceof ServiceBootError?e.cause instanceof ServiceBootError?null:this.createErrorReport(e.cause):this.createErrorReport(e)}createErrorReportFromError(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return{title:e.name,description:e.message,details:e.stack,error:e,...t}}});const Je={$errors:Ye};function Xe(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:()=>!1;return V((t=>e(t)||(e=>Ye.instance?(Ye.report(e),!0):(console.warn("Errors service hasn't been initialized properly!"),console.error(e),!0))(t)),(e=>{globalThis.onerror=(t,r,s,o,n)=>e(n??t),globalThis.onunhandledrejection=t=>e(t.reason)}))}var et={async install(e,t){const r=Xe(t.handleError);e.config.errorHandler=r,await Te(e,Je)}};const tt={$lang:Ne};var rt={async install(e){e.config.globalProperties.$t??=Ke,e.config.globalProperties.$td=Qe,await Te(e,tt)}};function st(e,t){const r=fe.on(e,t);n((()=>r()))}function ot(){const e=a(),t=l((()=>e.class));return[l((()=>W(e,"class"))),t]}function nt(e){let t=Z;i((()=>t=e())),n((()=>t()))}var at=u({__name:"AGHeadlessModal",props:{cancellable:xe(!0)},setup(t,{expose:r}){const s=t,o=e(null),n=e(!0),a=e(!1),{modal:l}=je("modal","could not obtain modal reference from <AGHeadlessModal>, did you render this component manually? Show it using $ui.openModal() instead");async function i(){o.value?.$el&&(n.value=!0)}async function u(e){a.value||(fe.emit("modal-will-close",{modal:l,result:e}),await i(),a.value=!0,fe.emit("modal-closed",{modal:l,result:e}))}return st("close-modal",(async({id:e,result:t})=>{e===l.id&&await u(t)})),st("hide-modal",(async({id:e})=>{e===l.id&&await i()})),st("show-modal",(async({id:e})=>{e===l.id&&await async function(){o.value?.$el&&(n.value=!1)}()})),r({close:u,cancellable:c(s,"cancellable")}),(e,r)=>(d(),p(m(se),{ref_key:"$root",ref:o,open:!0,onClose:r[0]||(r[0]=e=>t.cancellable&&u())},{default:f((()=>[h(e.$slots,"default",{close:u})])),_:3},512))}});at.__file="src/components/headless/modals/AGHeadlessModal.vue";var lt=u({__name:"AGModalContext",props:{modal:Le(),childIndex:Re()},setup(e){const t=e;return v("modal",{modal:c(t,"modal"),childIndex:c(t,"childIndex")}),(t,r)=>(d(),p(g(e.modal.component),_(b(e.modal.properties)),null,16))}});lt.__file="src/components/modals/AGModalContext.vue";const it=k("div",{class:"pointer-events-none fixed inset-0 z-50 bg-black/30"},null,-1);var ut=u({__name:"AGHeadlessModalPanel",setup(e){const t=je("modal","could not obtain modal reference from <AGHeadlessModalPanel>, did you render this component manually? Show it using $ui.openModal() instead"),r=l((()=>Fe.modals[t.childIndex]??null));return(e,s)=>(d(),p(m(oe),null,{default:f((()=>[h(e.$slots,"default"),r.value?(d(),y(x,{key:0},[it,w(lt,{"child-index":m(t).childIndex+1,modal:r.value},null,8,["child-index","modal"])],64)):A("v-if",!0)])),_:3}))}});ut.__file="src/components/headless/modals/AGHeadlessModalPanel.vue";const ct={class:"fixed inset-0 flex items-center justify-center p-8"};var dt=u({inheritAttrs:!1,__name:"AGModal",props:{cancellable:xe(!0)},setup(t,{expose:r}){const s=e();return r({close:async()=>s.value?.close(),cancellable:l((()=>!!s.value?.cancellable))}),(e,r)=>(d(),p(at,{ref_key:"$headlessModal",ref:s,cancellable:t.cancellable,class:"relative z-50"},{default:f((({close:t})=>[k("div",ct,[w(ut,{class:"flex max-h-full max-w-full flex-col overflow-hidden bg-white"},{default:f((()=>[k("div",G({class:"flex max-h-full flex-col overflow-auto p-4"},e.$attrs),[h(e.$slots,"default",{close:t})],16)])),_:2},1024)])])),_:3},8,["cancellable"]))}});function pt(e){return t=le(e,{mangle:!1,headerIds:!1,renderer:V(new ie,(e=>{e.link=function(e,t,r){return ie.prototype.link.apply(this,[e,t,r]).replace("<a",'<a target="_blank"')}}))}),ae.sanitize(t,{ADD_ATTR:["target"]});var t}dt.__file="src/components/modals/AGModal.vue";var mt=u({__name:"AGMarkdown",props:{as:Be(),inline:xe(),langKey:Be(),langParams:Ee(),text:Be()},setup(e){const t=e,r=l((()=>t.text??(t.langKey&&Ke(t.langKey,t.langParams??{})))),s=l((()=>{if(!r.value)return null;let e=pt(r.value);return t.inline&&(e=e.replace("<p>","<span>").replace("</p>","</span>")),e})),o=()=>j(t.as??(t.inline?"span":"div"),{class:t.inline?"":"prose",innerHTML:s.value});return(e,t)=>(d(),p(o))}});mt.__file="src/components/basic/AGMarkdown.vue";var ft=u({__name:"AGAlertModal",props:{title:Be(),message:Pe()},setup:e=>(t,r)=>(d(),p(dt,null,{default:f((()=>[e.title?(d(),p(mt,{key:0,text:e.title,as:"h2",class:"font-semibold",inline:""},null,8,["text"])):A("v-if",!0),w(mt,{text:e.message},null,8,["text"])])),_:1}))});ft.__file="src/components/modals/AGAlertModal.vue";var ht=u({__name:"AGHeadlessButton",props:{href:Be(),url:Be(),route:Be(),routeParams:Ee((()=>({}))),routeQuery:Ee((()=>({}))),submit:xe()},setup(e){const{href:t,url:r,route:s,routeParams:o,routeQuery:n,submit:a}=e,i=l((()=>s?{tag:"router-link",props:{to:Q({name:s,params:o,query:n})}}:t||r?{tag:"a",props:{target:"_blank",href:t||r}}:{tag:"button",props:{type:a?"submit":"button"}}));return(e,t)=>(d(),p(g(i.value.tag),_(b(i.value.props)),{default:f((()=>[h(e.$slots,"default")])),_:3},16))}});ht.__file="src/components/headless/forms/AGHeadlessButton.vue";var vt=u({__name:"AGButton",props:{color:ke(Ze,Ze.Primary)},setup(e){const t=e,r=l((()=>{switch(t.color){case Ze.Secondary:return["text-white bg-gray-600","hover:bg-gray-500","focus-visible:outline-offset-2 focus-visible:outline-gray-600"].join(" ");case Ze.Clear:return"hover:bg-gray-500/20 focus-visible:outline-gray-500/60";case Ze.Danger:return["text-white bg-red-600","hover:bg-red-500","focus-visible:outline-offset-2 focus-visible:outline-red-600"].join(" ");default:return["text-white bg-indigo-600","hover:bg-indigo-500","focus-visible:outline-offset-2 focus-visible:outline-indigo-600"].join(" ")}}));return(e,t)=>(d(),p(ht,{class:S(["px-2.5 py-1.5 focus-visible:outline focus-visible:outline-2",r.value])},{default:f((()=>[h(e.$slots,"default")])),_:3},8,["class"]))}});vt.__file="src/components/forms/AGButton.vue";const gt={class:"mt-2 flex flex-row-reverse gap-2"};var _t=u({__name:"AGConfirmModal",props:{title:Be(),message:Pe()},setup:e=>(t,r)=>(d(),p(dt,{cancellable:!1},{default:f((({close:r})=>[e.title?(d(),p(mt,{key:0,text:e.title,as:"h1"},null,8,["text"])):A("v-if",!0),w(mt,{text:e.message},null,8,["text"]),k("div",gt,[w(vt,{onClick:e=>r(!0)},{default:f((()=>[M(C(t.$td("ui.ok","OK")),1)])),_:2},1032,["onClick"]),w(vt,{color:"secondary",onClick:e=>r()},{default:f((()=>[M(C(t.$td("ui.cancel","Cancel")),1)])),_:2},1032,["onClick"])])])),_:1}))});_t.__file="src/components/modals/AGConfirmModal.vue";const bt={viewBox:"0 0 20 20",width:"1.2em",height:"1.2em"},yt=[k("path",{fill:"currentColor",d:"m12.95 10.707l.707-.707L8 4.343L6.586 5.757L10.828 10l-4.242 4.243L8 15.657l4.95-4.95z"},null,-1)];var xt={name:"zondicons-cheveron-right",render:function(e,t){return d(),y("svg",bt,yt)}};const wt={viewBox:"0 0 20 20",width:"1.2em",height:"1.2em"},At=[k("path",{fill:"currentColor",d:"M7.05 9.293L6.343 10L12 15.657l1.414-1.414L9.172 10l4.242-4.243L12 4.343z"},null,-1)];var kt={name:"zondicons-cheveron-left",render:function(e,t){return d(),y("svg",wt,At)}};const Gt={reports:$e()};function jt(){return Gt}const St={viewBox:"0 0 24 24",width:"1.2em",height:"1.2em"},Mt=[k("path",{fill:"currentColor",d:"M20 19V7H4v12h16m0-16a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h16m-7 14v-2h5v2h-5m-3.42-4L5.57 9H8.4l3.3 3.3c.39.39.39 1.03 0 1.42L8.42 17H5.59l3.99-4Z"},null,-1)];var Ct={name:"mdi-console",render:function(e,t){return d(),y("svg",St,Mt)}};const Et={viewBox:"0 0 20 20",width:"1.2em",height:"1.2em"},$t=[k("path",{fill:"currentColor",d:"M6 6V2c0-1.1.9-2 2-2h10a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2h-4v4a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V8c0-1.1.9-2 2-2h4zm2 0h4a2 2 0 0 1 2 2v4h4V2H8v4zM2 8v10h10V8H2z"},null,-1)];var Ht={name:"zondicons-copy",render:function(e,t){return d(),y("svg",Et,$t)}};const It={viewBox:"0 0 24 24",width:"1.2em",height:"1.2em"},Rt=[k("path",{fill:"currentColor",d:"M12 2A10 10 0 0 0 2 12c0 4.42 2.87 8.17 6.84 9.5c.5.08.66-.23.66-.5v-1.69c-2.77.6-3.36-1.34-3.36-1.34c-.46-1.16-1.11-1.47-1.11-1.47c-.91-.62.07-.6.07-.6c1 .07 1.53 1.03 1.53 1.03c.87 1.52 2.34 1.07 2.91.83c.09-.65.35-1.09.63-1.34c-2.22-.25-4.55-1.11-4.55-4.92c0-1.11.38-2 1.03-2.71c-.1-.25-.45-1.29.1-2.64c0 0 .84-.27 2.75 1.02c.79-.22 1.65-.33 2.5-.33c.85 0 1.71.11 2.5.33c1.91-1.29 2.75-1.02 2.75-1.02c.55 1.35.2 2.39.1 2.64c.65.71 1.03 1.6 1.03 2.71c0 3.82-2.34 4.66-4.57 4.91c.36.31.69.92.69 1.85V21c0 .27.16.59.67.5C19.14 20.16 22 16.42 22 12A10 10 0 0 0 12 2Z"},null,-1)];var Lt={name:"mdi-github",render:function(e,t){return d(),y("svg",It,Rt)}};const Pt={class:"flex"};var Bt=u({__name:"AGErrorReportModalButtons",props:{report:Le()},setup(e){const t=e,r=l((()=>t.report.description?`${t.report.title}: ${t.report.description}`:t.report.title)),s=l((()=>{if(!ge.sourceUrl)return!1;const e=encodeURIComponent(r.value),s=encodeURIComponent(["[Please, explain here what you were trying to do when this error appeared]","","Error details:","```",Y(t.report.details??"Details missing from report",1800-e.length-ge.sourceUrl.length).trim(),"```"].join("\n"));return`${ge.sourceUrl}/issues/new?title=${e}&body=${s}`})),o=l((()=>V([{id:"clipboard",description:"Copy to clipboard",iconComponent:Ht,async handler(){await navigator.clipboard.writeText(`${r.value}\n\n${t.report.details}`),Fe.showSnackbar(Qe("errors.copiedToClipboard","Debug information copied to clipboard"))}},{id:"console",description:"Log to console",iconComponent:Ct,handler(){window.error=t.report.error,console.error(t.report.error),Fe.showSnackbar(Qe("errors.addedToConsole","You can now use the **error** variable in the console"))}}],(e=>{s.value&&e.push({id:"github",description:"Report in GitHub",iconComponent:Lt,url:s.value})}))));return(e,t)=>(d(),y("div",Pt,[(d(!0),y(x,null,E(o.value,((t,r)=>h(e.$slots,"default",G(t,{key:r}),(()=>[w(vt,{color:"clear",url:t.url,title:e.$td(`errors.report_${t.id}`,t.description),"aria-label":e.$td(`errors.report_${t.id}`,t.description),onClick:t.handler},{default:f((()=>[(d(),p(g(t.iconComponent),{class:"h-4 w-4","aria-hidden":"true"}))])),_:2},1032,["url","title","aria-label","onClick"])])))),128))]))}});Bt.__file="src/components/modals/AGErrorReportModalButtons.vue";var Ot=u({__name:"AGErrorReportModalTitle",props:{report:Le(),currentReport:Ce(),totalReports:Ce()},setup(e){const t=e,r=l((()=>!t.totalReports||t.totalReports<=1?t.report.title:`${t.report.title} (${t.currentReport}/${t.totalReports})`));return(e,t)=>(d(),p(mt,{text:r.value,inline:""},null,8,["text"]))}});Ot.__file="src/components/modals/AGErrorReportModalTitle.vue";const qt={class:"flex items-center justify-between text-lg font-medium"},Dt={class:"flex items-center"},Tt=["textContent"];var zt=u({__name:"AGErrorReportModal",props:jt(),setup(t){const r=t,s=e(0),o=l((()=>r.reports[s.value]));return(e,t)=>(d(),p(dt,null,{default:f((()=>[k("div",null,[k("h2",qt,[k("div",Dt,[w(Ot,{report:o.value,"current-report":s.value+1,"total-reports":e.reports.length},null,8,["report","current-report","total-reports"]),e.reports.length>1?(d(),y(x,{key:0},[w(vt,{color:"clear",disabled:0===s.value,title:e.$td("errors.previousReport","Show previous report"),"aria-label":e.$td("errors.previousReport","Show previous report"),onClick:t[0]||(t[0]=e=>s.value--)},{default:f((()=>[w(m(kt),{"aria-hidden":"true",class:"h-4 w-4"})])),_:1},8,["disabled","title","aria-label"]),w(vt,{color:"clear",disabled:s.value===e.reports.length-1,title:e.$td("errors.nextReport","Show next report"),"aria-label":e.$td("errors.nextReport","Show next report"),onClick:t[1]||(t[1]=e=>s.value++)},{default:f((()=>[w(m(xt),{"aria-hidden":"true",class:"h-4 w-4"})])),_:1},8,["disabled","title","aria-label"])],64)):A("v-if",!0)]),w(Bt,{report:o.value},null,8,["report"])]),o.value.description?(d(),p(mt,{key:0,text:o.value.description,class:"mt-2"},null,8,["text"])):A("v-if",!0)]),k("pre",{class:"h-full overflow-auto bg-gray-200 p-4 text-xs text-red-900",textContent:C(o.value.details??e.$td("errors.detailsEmpty","This error is missing a stacktrace."))},null,8,Tt)])),_:1}))}});zt.__file="src/components/modals/AGErrorReportModal.vue";var Vt=u({__name:"AGLoadingModal",props:{message:Be()},setup(e){const t=e,r=l((()=>t.message??Qe("ui.loading","Loading...")));return(e,t)=>(d(),p(dt,{cancellable:!1},{default:f((()=>[w(mt,{text:r.value},null,8,["text"])])),_:1}))}});Vt.__file="src/components/modals/AGLoadingModal.vue";var Ut=u({__name:"AGHeadlessInput",props:{as:Be("div"),name:Be(),modelValue:Me([String,Number,Boolean])},emits:["update:modelValue"],setup(e,{expose:r,emit:s}){const o=e,n=l((()=>a&&o.name?a.errors[o.name]??null:null)),a=t("form",null),i={id:`input-${F()}`,value:l((()=>a&&o.name?a.getFieldValue(o.name):o.modelValue)),errors:$(n),update(e){a&&o.name?a.setFieldValue(o.name,e):s("update:modelValue",e)}};return v("input",i),r(i),(t,r)=>e.as?(d(),p(g(e.as),{key:0},{default:f((()=>[h(t.$slots,"default")])),_:3})):h(t.$slots,"default",{key:1})}});Ut.__file="src/components/headless/forms/AGHeadlessInput.vue";const Ft=["id"];var Nt=u({__name:"AGHeadlessInputError",setup(e){const t=je("input","<AGHeadlessInputError> must be a child of a <AGHeadlessInput>"),r=l((()=>t.errors?Qe(`errors.${t.errors[0]}`,`Error: ${t.errors[0]}`):null));return(e,s)=>r.value?(d(),y("p",{key:0,id:`${m(t).id}-error`},C(r.value),9,Ft)):A("v-if",!0)}});Nt.__file="src/components/headless/forms/AGHeadlessInputError.vue";const Kt=["id","type","value","aria-invalid","aria-describedby","checked"];var Qt=u({__name:"AGHeadlessInputInput",props:{type:Be("text")},setup(t){const r=t,s=e(),o=je("input","<AGHeadlessInputInput> must be a child of a <AGHeadlessInput>"),n=l((()=>o.value)),a=l((()=>{if("checkbox"===r.type)return!!n.value}));function i(){s.value&&o.update("checkbox"===r.type?s.value.checked:s.value.value)}return(e,r)=>(d(),y("input",{id:m(o).id,ref_key:"$input",ref:s,type:t.type,value:n.value,"aria-invalid":m(o).errors?"true":"false","aria-describedby":m(o).errors?`${m(o).id}-error`:void 0,checked:a.value,onInput:i},null,40,Kt))}});Qt.__file="src/components/headless/forms/AGHeadlessInputInput.vue";const Wt=["for"];var Zt=u({__name:"AGHeadlessInputLabel",setup(e){const t=je("input","<AGHeadlessInputLabel> must be a child of a <AGHeadlessInput>");return(e,r)=>(d(),y("label",{for:m(t).id},[h(e.$slots,"default")],8,Wt))}});Zt.__file="src/components/headless/forms/AGHeadlessInputLabel.vue";var Yt=u({__name:"AGHeadlessModalTitle",props:{as:Be("h2")},setup:e=>(t,r)=>(d(),p(m(ne),{as:e.as},{default:f((()=>[h(t.$slots,"default")])),_:3},8,["as"]))});Yt.__file="src/components/headless/modals/AGHeadlessModalTitle.vue";const Jt={class:"pointer-events-auto"};var Xt=u({__name:"AGHeadlessSnackbar",setup:e=>(e,t)=>(d(),y("div",Jt,[h(e.$slots,"default")]))});Xt.__file="src/components/headless/snackbars/AGHeadlessSnackbar.vue";const er=W(Ze,["Primary","Clear"]),tr={id:Pe(),message:Pe(),actions:ye((()=>[])),color:ke(er,Ze.Secondary)};function rr(){return tr}var sr=u({__name:"AGSnackbar",props:rr(),setup(e){const t=e,r=l((()=>t.color===Ze.Danger?"bg-red-200 text-red-900":"bg-gray-900 text-white"));return(e,s)=>(d(),p(Xt,{class:S(["flex flex-row items-center justify-center gap-3 p-4",r.value])},{default:f((()=>[w(mt,{text:e.message,inline:""},null,8,["text"]),(d(!0),y(x,null,E(e.actions,((r,s)=>(d(),p(vt,{key:s,color:e.color,onClick:e=>function(e){e.handler?.(),e.dismiss&&Fe.hideSnackbar(t.id)}(r)},{default:f((()=>[M(C(r.text),1)])),_:2},1032,["color","onClick"])))),128))])),_:1},8,["class"]))}});sr.__file="src/components/snackbars/AGSnackbar.vue";const or={$ui:Fe};var nr={async install(e,t){const r={[Ue.AlertModal]:ft,[Ue.ConfirmModal]:_t,[Ue.ErrorReportModal]:zt,[Ue.LoadingModal]:Vt,[Ue.Snackbar]:sr};Object.entries({...r,...t.components}).forEach((e=>{let[t,r]=e;return Fe.registerComponent(t,r)})),await Te(e,or)}};async function ar(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const r=[qe,et,rt,ze,nr,...t.plugins??[]],s=H(e);await be(r,s,t),s.mount("#app"),fe.emit("application-mounted")}const lr={key:0};var ir=u({__name:"AGAppModals",setup(e){const t=l((()=>Fe.modals[0]??null));return(e,r)=>t.value?(d(),y("aside",lr,[w(lt,{"child-index":1,modal:t.value},null,8,["modal"])])):A("v-if",!0)}});ir.__file="src/components/AGAppModals.vue";const ur={"aria-live":"assertive",class:"z-60 pointer-events-none fixed inset-0 flex items-end px-4 py-6 sm:p-6"},cr={class:"flex w-full flex-col items-center space-y-4 sm:items-end"};const dr={render:function(e,t){return d(),y("div",ur,[k("div",cr,[(d(!0),y(x,null,E(e.$ui.snackbars,(e=>(d(),p(g(e.component),G({id:e.id,key:e.id},e.properties),null,16,["id"])))),128))])])},__file:"src/components/AGAppSnackbars.vue"};var pr=dr,mr=u({__name:"AGAppOverlays",setup(t){const r=e(null),s=e(!0);return st("show-overlays-backdrop",(async()=>{r.value&&s.value&&(s.value=!1,r.value.classList.remove("opacity-0"))})),st("hide-overlays-backdrop",(async()=>{r.value&&!s.value&&(s.value=!0,r.value.classList.add("opacity-0"))})),(e,t)=>(d(),y(x,null,[k("div",{ref_key:"$backdrop",ref:r,class:"pointer-events-none fixed inset-0 z-50 bg-black/30 opacity-0"},null,512),w(ir),w(pr)],64))}});mr.__file="src/components/AGAppOverlays.vue";const fr={class:"flex h-full flex-col text-base font-normal leading-tight text-gray-900 antialiased"};var hr=u({__name:"AGAppLayout",setup:e=>(e,t)=>(d(),y("div",fr,[h(e.$slots,"default"),w(mr)]))});hr.__file="src/components/AGAppLayout.vue";var vr=u({__name:"AGErrorMessage",props:{error:Le()},setup(e){const t=e,r=l((()=>Ye.getErrorMessage(t.error)));return(e,t)=>(d(),p(mt,{text:r.value,inline:""},null,8,["text"]))}});vr.__file="src/components/basic/AGErrorMessage.vue";var gr=u({__name:"AGLink",setup:e=>(e,t)=>(d(),p(ht,{class:"font-medium hover:underline"},{default:f((()=>[h(e.$slots,"default")])),_:3}))});gr.__file="src/components/basic/AGLink.vue";const _r={class:"ml-2"};var br=u({inheritAttrs:!1,__name:"AGCheckbox",props:{name:Be()},setup(e){const t=we();return(r,s)=>(d(),p(Ut,{ref_key:"$input",ref:t,name:e.name,class:"flex"},{default:f((()=>[w(Qt,G(r.$attrs,{type:"checkbox",class:{"text-indigo-600 focus:ring-indigo-600":!m(t)?.errors,"border-red-200 text-red-600 focus:ring-red-600":m(t)?.errors}}),null,16,["class"]),k("div",_r,[r.$slots.default?(d(),p(Zt,{key:0},{default:f((()=>[h(r.$slots,"default")])),_:3})):A("v-if",!0),w(Nt,{class:"text-sm text-red-600"})])])),_:3},8,["name"]))}});br.__file="src/components/forms/AGCheckbox.vue";const yr=["onSubmit"];var xr=u({__name:"AGForm",props:{form:Ee()},emits:["submit"],setup(e,{emit:t}){const r=e;function s(){r.form&&!r.form.submit()||t("submit")}return v("form",r.form),(e,t)=>(d(),y("form",{onSubmit:I(s,["prevent"])},[h(e.$slots,"default")],40,yr))}});xr.__file="src/components/forms/AGForm.vue";const wr={class:"absolute bottom-0 left-0 translate-y-full"};var Ar=u({inheritAttrs:!1,__name:"AGInput",props:{name:Be()},setup(e){const t=we(),[r,s]=ot();return(o,n)=>(d(),p(Ut,{ref_key:"$input",ref:t,class:S(["relative flex flex-col items-center",m(s)]),name:e.name},{default:f((()=>[w(Qt,G(m(r),{class:["block w-full border-0 py-1.5 text-gray-900 ring-1 ring-inset ring-gray-300 placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-indigo-600",{"ring-1 ring-red-500":m(t)?.errors}]}),null,16,["class"]),k("div",wr,[w(Nt,{class:"mt-1 text-sm text-red-500"})])])),_:1},8,["class","name"]))}});Ar.__file="src/components/forms/AGInput.vue";var kr=u({__name:"AGModalTitle",setup:e=>(e,t)=>(d(),p(Yt,{class:"mb-2 font-semibold"},{default:f((()=>[h(e.$slots,"default")])),_:3}))});kr.__file="src/components/modals/AGModalTitle.vue";const Gr={String:"string",Number:"number",Boolean:"boolean"};class jr extends L{constructor(t){super(),J(this,"errors",void 0),J(this,"_fields",void 0),J(this,"_data",void 0),J(this,"_valid",void 0),J(this,"_submitted",void 0),J(this,"_errors",void 0),this._fields=t,this._submitted=e(!1),this._data=this.getInitialData(t),this._errors=this.getInitialErrors(t),this._valid=l((()=>!Object.values(this._errors).some((e=>null!==e)))),this.errors=$(this._errors)}get valid(){return this._valid.value}get submitted(){return this._submitted.value}setFieldValue(e,t){this._data[e]=t,this._submitted.value&&this.validate()}getFieldValue(e){return this._data[e]}validate(){const e=Object.entries(this._fields).reduce(((e,t)=>{let[r,s]=t;return e[r]=this.getFieldErrors(r,s),e}),{});return this.resetErrors(e),this.valid}reset(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this._submitted.value=!1,e.keepData||this.resetData(),e.keepErrors||this.resetErrors()}submit(){return this._submitted.value=!0,this.validate()}__get(e){return e in this._fields?this._data[e]:super.__get(e)}__set(e,t){e in this._fields?Object.assign(this._data,{[e]:t}):super.__set(e,t)}getFieldErrors(e,t){const r=[];return t.rules?.includes("required")&&!this._data[e]&&r.push("required"),r.length>0?r:null}getInitialData(e){if(this.static().isConjuring())return{};const t=Object.entries(e).reduce(((e,t)=>{let[r,s]=t;return e[r]=s.default??null,e}),{});return r(t)}getInitialErrors(e){if(this.static().isConjuring())return{};const t=Object.keys(e).reduce(((e,t)=>(e[t]=null,e)),{});return r(t)}resetData(){for(const[e,t]of Object.entries(this._fields))this._data[e]=t.default??null}resetErrors(e){Object.keys(this._errors).forEach((e=>delete this._errors[e])),e&&Object.assign(this._errors,e)}}function Sr(e){return new jr(e)}function Mr(e){return{default:e,type:Gr.Boolean}}function Cr(e){return{default:e,type:Gr.Boolean,rules:"required"}}function Er(e){return{default:e,type:Gr.Number,rules:"required"}}function $r(e){return{default:e,type:Gr.String,rules:"required"}}function Hr(e){return{default:e,type:Gr.Number}}function Ir(e){return{default:e,type:Gr.String}}export{ft as AGAlertModal,hr as AGAppLayout,mr as AGAppOverlays,vt as AGButton,br as AGCheckbox,_t as AGConfirmModal,vr as AGErrorMessage,Bt as AGErrorReportModalButtons,Ot as AGErrorReportModalTitle,xr as AGForm,ht as AGHeadlessButton,Ut as AGHeadlessInput,Nt as AGHeadlessInputError,Qt as AGHeadlessInputInput,Zt as AGHeadlessInputLabel,at as AGHeadlessModal,ut as AGHeadlessModalPanel,Yt as AGHeadlessModalTitle,Xt as AGHeadlessSnackbar,Ar as AGInput,gr as AGLink,Vt as AGLoadingModal,mt as AGMarkdown,dt as AGModal,lt as AGModalContext,kr as AGModalTitle,sr as AGSnackbar,ge as App,ve as AppService,Ze as Colors,Ye as Errors,fe as Events,me as EventsService,Gr as FormFieldTypes,Ne as Lang,pe as Service,er as SnackbarColors,Fe as UI,Ue as UIComponents,ye as arrayProp,Mr as booleanInput,xe as booleanProp,Te as bootServices,ar as bootstrapApplication,we as componentRef,Ae as defineDirective,_e as definePlugin,de as defineServiceState,ke as enumProp,Gt as errorReportModalProps,Se as injectOrFail,Ge as injectReactive,je as injectReactiveOrFail,be as installPlugins,Me as mixedProp,Hr as numberInput,Ce as numberProp,Ee as objectProp,nt as onCleanMounted,$e as requiredArrayProp,Cr as requiredBooleanInput,He as requiredEnumProp,Ie as requiredMixedProp,Er as requiredNumberInput,Re as requiredNumberProp,Le as requiredObjectProp,$r as requiredStringInput,Pe as requiredStringProp,tr as snackbarProps,Ir as stringInput,Be as stringProp,Ke as translate,Qe as translateWithDefault,jt as useErrorReportModalProps,st as useEvent,Sr as useForm,ot as useInputAttrs,rr as useSnackbarProps};
|
|
2
2
|
//# sourceMappingURL=aerogel-core.esm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aerogel-core.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"aerogel-core.esm.js","sources":["../src/errors/ServiceBootError.ts","../src/services/store.ts","../src/services/Service.ts","../src/services/Events.ts","../src/services/App.state.ts","../src/services/App.ts","../src/plugins/index.ts","../src/utils/vue.ts","../src/directives/index.ts","../src/directives/initial-focus.ts","../src/services/index.ts","../src/ui/UI.state.ts","../src/ui/UI.ts","../src/lang/Lang.ts","../src/lang/utils.ts","../src/errors/Errors.state.ts","../src/components/constants.ts","../src/errors/Errors.ts","../src/errors/index.ts","../src/lang/index.ts","../src/utils/composition/events.ts","../src/utils/composition/forms.ts","../src/utils/composition/hooks.ts","../src/components/headless/modals/AGHeadlessModal.vue","../src/components/modals/AGModalContext.vue","../src/components/headless/modals/AGHeadlessModalPanel.vue","../src/components/modals/AGModal.vue","../src/utils/markdown.ts","../src/components/basic/AGMarkdown.vue","../src/components/headless/forms/AGHeadlessButton.vue","../src/components/forms/AGButton.vue","../src/components/modals/AGErrorReportModal.ts","../src/components/modals/AGErrorReportModalButtons.vue","../src/components/modals/AGErrorReportModalTitle.vue","../src/components/modals/AGErrorReportModal.vue","../src/components/modals/AGLoadingModal.vue","../src/components/headless/forms/AGHeadlessInput.vue","../src/components/headless/forms/AGHeadlessInputError.vue","../src/components/headless/forms/AGHeadlessInputInput.vue","../src/components/headless/forms/AGHeadlessInputLabel.vue","../src/components/headless/snackbars/index.ts","../src/components/snackbars/AGSnackbar.vue","../src/ui/index.ts","../src/bootstrap/index.ts","../src/components/AGAppModals.vue","../src/components/AGAppSnackbars.vue?vue&type=template&id=7942f27a&lang.js","../src/components/AGAppOverlays.vue","../src/components/basic/AGErrorMessage.vue","../src/components/forms/AGCheckbox.vue","../src/components/forms/AGForm.vue","../src/components/forms/AGInput.vue","../src/forms/Form.ts","../src/forms/composition.ts","../src/forms/utils.ts"],"sourcesContent":["import { JSError } from '@noeldemartin/utils';\n\nexport default class ServiceBootError extends JSError {\n\n constructor(serviceNamespace: string, cause: unknown) {\n super(`Service '${serviceNamespace}' failed booting`, { cause });\n }\n\n}\n","import { createPinia, defineStore, setActivePinia } from 'pinia';\nimport type { DefineStoreOptions, Pinia, StateTree, Store, _GettersTree } from 'pinia';\n\nlet _store: Pinia | null = null;\n\nfunction initializePiniaStore(): Pinia {\n if (!_store) {\n _store = createPinia();\n\n setActivePinia(_store);\n }\n\n return _store;\n}\n\nexport function getPiniaStore(): Pinia {\n return _store ?? initializePiniaStore();\n}\n\nexport function defineServiceStore<Id extends string, S extends StateTree = {}, G extends _GettersTree<S> = {}, A = {}>(\n name: Id,\n options: Omit<DefineStoreOptions<Id, S, G, A>, 'id'>,\n): Store<Id, S, G, A> {\n initializePiniaStore();\n\n return defineStore(name, options)();\n}\n","import { MagicObject, PromisedValue, Storage, isEmpty, objectDeepClone, objectOnly } from '@noeldemartin/utils';\nimport type { Constructor } from '@noeldemartin/utils';\nimport type { Store } from 'pinia';\n\nimport ServiceBootError from '@/errors/ServiceBootError';\nimport { defineServiceStore } from '@/services/store';\n\nexport type ServiceState = Record<string, any>; // eslint-disable-line @typescript-eslint/no-explicit-any\nexport type DefaultServiceState = any; // eslint-disable-line @typescript-eslint/no-explicit-any\nexport type ServiceConstructor<T extends Service = Service> = Constructor<T> & typeof Service;\n\nexport type ComputedStateDefinition<TState extends ServiceState, TComputedState extends ServiceState> = {\n [K in keyof TComputedState]: (state: TState) => TComputedState[K];\n} & ThisType<{\n readonly [K in keyof TComputedState]: TComputedState[K];\n}>;\n\nexport function defineServiceState<\n State extends ServiceState = ServiceState,\n ComputedState extends ServiceState = {}\n>(options: {\n name: string;\n initialState: State;\n persist?: (keyof State)[];\n computed?: ComputedStateDefinition<State, ComputedState>;\n serialize?: (state: Partial<State>) => Partial<State>;\n}): Constructor<State> & Constructor<ComputedState> & Constructor<Service<State, ComputedState, Partial<State>>> {\n return class extends Service<State, ComputedState> {\n\n public static persist = (options.persist as string[]) ?? [];\n\n protected usesStore(): boolean {\n return true;\n }\n\n protected getName(): string | null {\n return options.name ?? null;\n }\n\n protected getInitialState(): State {\n return options.initialState;\n }\n\n protected getComputedStateDefinition(): ComputedStateDefinition<State, ComputedState> {\n return options.computed ?? ({} as ComputedStateDefinition<State, ComputedState>);\n }\n\n protected serializePersistedState(state: Partial<State>): Partial<State> {\n return options.serialize?.(state) ?? state;\n }\n \n } as unknown as Constructor<State> &\n Constructor<ComputedState> &\n Constructor<Service<State, ComputedState, Partial<State>>>;\n}\n\nexport default class Service<\n State extends ServiceState = DefaultServiceState,\n ComputedState extends ServiceState = {},\n ServiceStorage extends Partial<State> = Partial<State>\n> extends MagicObject {\n\n public static persist: string[] = [];\n\n protected _name: string;\n private _booted: PromisedValue<void>;\n private _computedStateKeys: Set<keyof State>;\n private _store?: Store | false;\n\n constructor() {\n super();\n\n const getters = this.getComputedStateDefinition();\n\n this._name = this.getName() ?? new.target.name;\n this._booted = new PromisedValue();\n this._computedStateKeys = new Set(Object.keys(getters));\n this._store =\n this.usesStore() &&\n defineServiceStore(this._name, {\n state: () => this.getInitialState(),\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getters: getters as any,\n });\n }\n\n public get booted(): PromisedValue<void> {\n return this._booted;\n }\n\n public launch(): Promise<void> {\n const handleError = (error: unknown) => this._booted.reject(new ServiceBootError(this._name, error));\n\n try {\n this.frameworkBoot()\n .then(() => this.boot())\n .then(() => this._booted.resolve())\n .catch(handleError);\n } catch (error) {\n handleError(error);\n }\n\n return this._booted;\n }\n\n public hasState<P extends keyof State>(property: P): boolean {\n if (!this._store) {\n return false;\n }\n\n return property in this._store.$state || this._computedStateKeys.has(property);\n }\n\n public getState(): State;\n public getState<P extends keyof State>(property: P): State[P];\n public getState<P extends keyof State>(property?: P): State | State[P] {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const store = this._store as any;\n\n if (property) {\n return store ? store[property] : undefined;\n }\n\n return store ? store : {};\n }\n\n public setState<P extends keyof State>(property: P, value: State[P]): void;\n public setState(state: Partial<State>): void;\n public setState<P extends keyof State>(stateOrProperty: P | Partial<State>, value?: State[P]): void {\n if (!this._store) {\n return;\n }\n\n const state = (\n typeof stateOrProperty === 'string' ? { [stateOrProperty]: value } : stateOrProperty\n ) as Partial<State>;\n\n Object.assign(this._store.$state, state);\n\n this.onStateUpdated(state);\n }\n\n protected __get(property: string): unknown {\n if (this.hasState(property)) {\n return this.getState(property);\n }\n\n return super.__get(property);\n }\n\n protected __set(property: string, value: unknown): void {\n this.setState({ [property]: value } as Partial<State>);\n }\n\n protected onStateUpdated(state: Partial<State>): void {\n // TODO fix this.static()\n const persist = (this.constructor as unknown as { persist: string[] }).persist;\n const persisted = objectOnly(state, persist);\n\n if (isEmpty(persisted)) {\n return;\n }\n\n const storage = Storage.require<ServiceStorage>(this._name);\n\n Storage.set(this._name, {\n ...storage,\n ...this.serializePersistedState(objectDeepClone(persisted) as Partial<State>),\n });\n }\n\n protected usesStore(): boolean {\n return false;\n }\n\n protected getName(): string | null {\n return null;\n }\n\n protected getInitialState(): State {\n return {} as State;\n }\n\n protected getComputedStateDefinition(): ComputedStateDefinition<State, ComputedState> {\n return {} as ComputedStateDefinition<State, ComputedState>;\n }\n\n protected serializePersistedState(state: Partial<State>): Partial<State> {\n return state;\n }\n\n protected async frameworkBoot(): Promise<void> {\n this.restorePersistedState();\n }\n\n protected async boot(): Promise<void> {\n // Override.\n }\n\n protected restorePersistedState(): void {\n // TODO fix this.static()\n const persist = (this.constructor as unknown as { persist: string[] }).persist;\n\n if (!this.usesStore() || isEmpty(persist)) {\n return;\n }\n\n if (Storage.has(this._name)) {\n const persisted = Storage.require<ServiceStorage>(this._name);\n this.setState(persisted);\n\n return;\n }\n\n Storage.set(this._name, objectOnly(this.getState(), persist));\n }\n\n}\n","import { arr, facade, tap } from '@noeldemartin/utils';\nimport type { FluentArray } from '@noeldemartin/utils';\n\nimport Service from '@/services/Service';\n\nexport interface EventsPayload {}\n\nexport type EventListener<T = unknown> = (payload: T) => unknown;\nexport type UnknownEvent<T> = T extends keyof EventsPayload ? never : T;\n\nexport type EventWithoutPayload = {\n [K in keyof EventsPayload]: EventsPayload[K] extends void ? K : never;\n}[keyof EventsPayload];\n\nexport type EventWithPayload = {\n [K in keyof EventsPayload]: EventsPayload[K] extends void ? never : K;\n}[keyof EventsPayload];\n\nexport class EventsService extends Service {\n\n private listeners: Record<string, FluentArray<EventListener>> = {};\n\n public emit<Event extends EventWithoutPayload>(event: Event): Promise<void>;\n public emit<Event extends EventWithPayload>(event: Event, payload: EventsPayload[Event]): Promise<void>;\n public emit<Event extends string>(event: UnknownEvent<Event>, payload?: unknown): Promise<void>;\n public async emit(event: string, payload?: unknown): Promise<void> {\n const listeners = [...(this.listeners[event] ?? [])];\n\n await Promise.all(listeners.map((listener) => listener(payload)) ?? []);\n }\n\n public on<Event extends EventWithoutPayload>(event: Event, listener: () => unknown): () => void;\n public on<Event extends EventWithPayload>(\n event: Event,\n listener: EventListener<EventsPayload[Event]>\n ): () => void | void;\n\n public on<Event extends string>(event: UnknownEvent<Event>, listener: EventListener): () => void;\n public on(event: string, listener: EventListener): () => void {\n (this.listeners[event] ??= arr<EventListener>([])).push(listener);\n\n return () => this.off(event, listener);\n }\n\n public once<Event extends EventWithoutPayload>(event: Event, listener: () => unknown): () => void;\n public once<Event extends EventWithPayload>(\n event: Event,\n listener: EventListener<EventsPayload[Event]>\n ): () => void | void;\n\n public once<Event extends string>(event: UnknownEvent<Event>, listener: EventListener): () => void;\n public once(event: string, listener: EventListener): () => void {\n let onceListener: EventListener | null = null;\n\n return tap(\n () => onceListener && this.off(event, onceListener),\n (off) => {\n (this.listeners[event] ??= arr<EventListener>([])).push(\n (onceListener = (...args) => {\n off();\n\n return listener(...args);\n }),\n );\n },\n );\n }\n\n public off(event: string, listener: EventListener): void {\n const eventListeners = this.listeners[event];\n\n if (!eventListeners) {\n return;\n }\n\n eventListeners.remove(listener);\n\n if (eventListeners.isEmpty()) {\n delete this.listeners[event];\n }\n }\n\n}\n\nexport default facade(new EventsService());\n","import Build from 'virtual:aerogel';\n\nimport { defineServiceState } from '@/services/Service';\nimport type { Plugin } from '@/plugins/Plugin';\n\nexport default defineServiceState({\n name: 'app',\n initialState: {\n plugins: {} as Record<string, Plugin>,\n environment: Build.environment,\n sourceUrl: Build.sourceUrl,\n isMounted: false,\n },\n computed: {\n development: (state) => state.environment === 'development',\n testing: (state) => state.environment === 'testing',\n },\n});\n","import { facade } from '@noeldemartin/utils';\n\nimport Events from '@/services/Events';\nimport type { Plugin } from '@/plugins';\n\nimport Service from './App.state';\n\nexport class AppService extends Service {\n\n public plugin<T extends Plugin = Plugin>(name: string): T | null {\n return (this.plugins[name] as T) ?? null;\n }\n\n protected async boot(): Promise<void> {\n Events.once('application-mounted', () => this.setState({ isMounted: true }));\n }\n\n}\n\nexport default facade(new AppService());\n","import type { GetClosureArgs } from '@noeldemartin/utils';\n\nimport App from '@/services/App';\n\nimport type { Plugin } from './Plugin';\n\nexport * from './Plugin';\n\nexport function definePlugin<T extends Plugin>(plugin: T): T {\n return plugin;\n}\n\nexport async function installPlugins(plugins: Plugin[], ...args: GetClosureArgs<Plugin['install']>): Promise<void> {\n App.setState(\n 'plugins',\n plugins.reduce((pluginsMap, plugin) => {\n if (plugin.name) {\n pluginsMap[plugin.name] = plugin;\n }\n\n return pluginsMap;\n }, {} as Record<string, Plugin>),\n );\n\n await Promise.all(plugins.map((plugin) => plugin.install(...args)) ?? []);\n}\n","import { fail } from '@noeldemartin/utils';\nimport { inject, reactive, ref } from 'vue';\nimport type { Directive, InjectionKey, PropType, Ref, UnwrapNestedRefs } from 'vue';\n\ntype BaseProp<T> = {\n type: PropType<T>;\n validator?(value: unknown): boolean;\n};\n\ntype RequiredProp<T> = BaseProp<T> & { required: true };\ntype OptionalProp<T> = BaseProp<T> & { default: T | (() => T) | null };\n\nexport type ComponentProps = Record<string, unknown>;\n\nexport function arrayProp<T>(defaultValue?: () => T[]): OptionalProp<T[]> {\n return {\n type: Array as PropType<T[]>,\n default: defaultValue ?? (() => []),\n };\n}\n\nexport function booleanProp(defaultValue: boolean = false): OptionalProp<boolean> {\n return {\n type: Boolean,\n default: defaultValue,\n };\n}\n\nexport function componentRef<T>(): Ref<UnwrapNestedRefs<T> | undefined> {\n return ref<UnwrapNestedRefs<T>>();\n}\n\nexport function defineDirective(directive: Directive): Directive {\n return directive;\n}\n\nexport function enumProp<Enum extends Record<string, unknown>>(\n enumeration: Enum,\n defaultValue?: Enum[keyof Enum],\n): OptionalProp<Enum[keyof Enum]> {\n const values = Object.values(enumeration) as Enum[keyof Enum][];\n\n return {\n type: String as unknown as PropType<Enum[keyof Enum]>,\n default: defaultValue ?? values[0] ?? null,\n validator: (value) => values.includes(value as Enum[keyof Enum]),\n };\n}\n\nexport function injectReactive<T extends object>(key: InjectionKey<T> | string): UnwrapNestedRefs<T> | undefined {\n const value = inject(key);\n\n return value ? reactive<T>(value) : undefined;\n}\n\nexport function injectReactiveOrFail<T extends object>(\n key: InjectionKey<T> | string,\n errorMessage?: string,\n): UnwrapNestedRefs<T> {\n return injectReactive(key) ?? fail(errorMessage ?? `Could not resolve '${key}' injection key`);\n}\n\nexport function injectOrFail<T>(key: InjectionKey<T> | string, errorMessage?: string): T {\n return inject(key) ?? fail(errorMessage ?? `Could not resolve '${key}' injection key`);\n}\n\nexport function mixedProp<T>(type: PropType<T>): OptionalProp<T | null> {\n return {\n type,\n default: null,\n };\n}\n\nexport function numberProp(): OptionalProp<number | null>;\nexport function numberProp(defaultValue: number): OptionalProp<number>;\nexport function numberProp(defaultValue: number | null = null): OptionalProp<number | null> {\n return {\n type: Number,\n default: defaultValue,\n };\n}\n\nexport function objectProp<T = Object>(): OptionalProp<T | null>;\nexport function objectProp<T>(defaultValue: () => T): OptionalProp<T>;\nexport function objectProp<T = Object>(defaultValue: (() => T) | null = null): OptionalProp<T | null> {\n return {\n type: Object,\n default: defaultValue,\n };\n}\n\nexport function requiredArrayProp<T>(): RequiredProp<T[]> {\n return {\n type: Array as PropType<T[]>,\n required: true,\n };\n}\n\nexport function requiredEnumProp<Enum extends Record<string, unknown>>(\n enumeration: Enum,\n): RequiredProp<Enum[keyof Enum]> {\n const values = Object.values(enumeration);\n\n return {\n type: String as unknown as PropType<Enum[keyof Enum]>,\n required: true,\n validator: (value) => values.includes(value),\n };\n}\n\nexport function requiredMixedProp<T>(type: PropType<T>): RequiredProp<T> {\n return {\n type,\n required: true,\n };\n}\n\nexport function requiredNumberProp(): RequiredProp<number> {\n return {\n type: Number,\n required: true,\n };\n}\n\nexport function requiredObjectProp<T = Object>(): RequiredProp<T> {\n return {\n type: Object,\n required: true,\n };\n}\n\nexport function requiredStringProp(): RequiredProp<string> {\n return {\n type: String,\n required: true,\n };\n}\n\nexport function stringProp(): OptionalProp<string | null>;\nexport function stringProp(defaultValue: string): OptionalProp<string>;\nexport function stringProp(defaultValue: string | null = null): OptionalProp<string | null> {\n return {\n type: String,\n default: defaultValue,\n };\n}\n","import type { Directive } from 'vue';\n\nimport { definePlugin } from '@/plugins';\n\nimport initialFocus from './initial-focus';\n\nconst builtInDirectives: Record<string, Directive> = {\n 'initial-focus': initialFocus,\n};\n\nexport default definePlugin({\n install(app, options) {\n const directives = {\n ...builtInDirectives,\n ...options.directives,\n };\n\n for (const [name, directive] of Object.entries(directives)) {\n app.directive(name, directive);\n }\n },\n});\n\ndeclare module '@/bootstrap/options' {\n interface AerogelOptions {\n directives?: Record<string, Directive>;\n }\n}\n","import { defineDirective } from '@/utils/vue';\n\nexport default defineDirective({\n mounted(element: HTMLElement, { value }) {\n if (value === false) {\n return;\n }\n\n element.focus();\n },\n});\n","import type { App as VueApp } from 'vue';\n\nimport { definePlugin } from '@/plugins';\n\nimport App from './App';\nimport Events from './Events';\nimport Service from './Service';\nimport { getPiniaStore } from './store';\n\nexport * from './App';\nexport * from './Events';\nexport * from './Service';\n\nexport { App, Events, Service };\n\nconst defaultServices = {\n $app: App,\n $events: Events,\n};\n\nexport type DefaultServices = typeof defaultServices;\n\nexport interface Services extends DefaultServices {}\n\nexport async function bootServices(app: VueApp, services: Record<string, Service>): Promise<void> {\n await Promise.all(\n Object.entries(services).map(async ([name, service]) => {\n await service\n .launch()\n .catch((error) => app.config.errorHandler?.(error, null, `Failed launching ${name}.`));\n }),\n );\n\n Object.assign(app.config.globalProperties, services);\n\n App.development && Object.assign(window, services);\n}\n\nexport default definePlugin({\n async install(app, options) {\n const services = {\n ...defaultServices,\n ...options.services,\n };\n\n app.use(getPiniaStore());\n\n await bootServices(app, services);\n },\n});\n\ndeclare module '@/bootstrap/options' {\n interface AerogelOptions {\n services?: Record<string, Service>;\n }\n}\n\ndeclare module '@vue/runtime-core' {\n interface ComponentCustomProperties extends Services {}\n}\n","import type { Component } from 'vue';\n\nimport { defineServiceState } from '@/services/Service';\n\nexport interface Modal<T = unknown> {\n id: string;\n properties: Record<string, unknown>;\n component: Component;\n beforeClose: Promise<T | undefined>;\n afterClose: Promise<T | undefined>;\n}\n\nexport interface ModalComponent<\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n Properties extends Record<string, unknown> = Record<string, unknown>,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n Result = unknown\n> {}\n\nexport interface Snackbar {\n id: string;\n component: Component;\n properties: Record<string, unknown>;\n}\n\nexport default defineServiceState({\n name: 'ui',\n initialState: {\n modals: [] as Modal[],\n snackbars: [] as Snackbar[],\n },\n});\n","import { facade, fail, uuid } from '@noeldemartin/utils';\nimport { markRaw, nextTick } from 'vue';\nimport type { Component } from 'vue';\nimport type { ObjectValues } from '@noeldemartin/utils';\n\nimport Events from '@/services/Events';\nimport type { SnackbarAction, SnackbarColor } from '@/components/headless/snackbars';\n\nimport Service from './UI.state';\nimport type { Modal, ModalComponent, Snackbar } from './UI.state';\n\ninterface ModalCallbacks<T = unknown> {\n willClose(result: T | undefined): void;\n closed(result: T | undefined): void;\n}\n\ntype ModalProperties<TComponent> = TComponent extends ModalComponent<infer TProperties, unknown> ? TProperties : never;\ntype ModalResult<TComponent> = TComponent extends ModalComponent<Record<string, unknown>, infer TResult>\n ? TResult\n : never;\n\nexport const UIComponents = {\n AlertModal: 'alert-modal',\n ConfirmModal: 'confirm-modal',\n ErrorReportModal: 'error-report-modal',\n LoadingModal: 'loading-modal',\n Snackbar: 'snackbar',\n} as const;\n\nexport type UIComponent = ObjectValues<typeof UIComponents>;\n\nexport interface ShowSnackbarOptions {\n component?: Component;\n color?: SnackbarColor;\n actions?: SnackbarAction[];\n}\n\nexport class UIService extends Service {\n\n private modalCallbacks: Record<string, Partial<ModalCallbacks>> = {};\n private components: Partial<Record<UIComponent, Component>> = {};\n\n public requireComponent(name: UIComponent): Component {\n return this.components[name] ?? fail(`UI Component '${name}' is not defined!`);\n }\n\n public alert(message: string): void;\n public alert(title: string, message: string): void;\n public alert(messageOrTitle: string, message?: string): void {\n const options = typeof message === 'string' ? { title: messageOrTitle, message } : { message: messageOrTitle };\n\n this.openModal(this.requireComponent(UIComponents.AlertModal), options);\n }\n\n public async confirm(message: string): Promise<boolean>;\n public async confirm(title: string, message: string): Promise<boolean>;\n public async confirm(messageOrTitle: string, message?: string): Promise<boolean> {\n const options = typeof message === 'string' ? { title: messageOrTitle, message } : { message: messageOrTitle };\n const modal = await this.openModal<ModalComponent<{ message: string }, boolean>>(\n this.requireComponent(UIComponents.ConfirmModal),\n options,\n );\n const result = await modal.beforeClose;\n\n return result ?? false;\n }\n\n public async loading<T>(operation: Promise<T>): Promise<T>;\n public async loading<T>(message: string, operation: Promise<T>): Promise<T>;\n public async loading<T>(messageOrOperation: string | Promise<T>, operation?: Promise<T>): Promise<T> {\n operation = typeof messageOrOperation === 'string' ? (operation as Promise<T>) : messageOrOperation;\n\n const message = typeof messageOrOperation === 'string' ? messageOrOperation : undefined;\n const modal = await this.openModal(this.requireComponent(UIComponents.LoadingModal), { message });\n const result = await operation;\n\n await this.closeModal(modal.id);\n\n return result;\n }\n\n public showSnackbar(message: string, options: ShowSnackbarOptions = {}): void {\n const snackbar: Snackbar = {\n id: uuid(),\n properties: { message, ...options },\n component: options.component ?? markRaw(this.requireComponent(UIComponents.Snackbar)),\n };\n\n this.setState('snackbars', this.snackbars.concat(snackbar));\n\n setTimeout(() => this.hideSnackbar(snackbar.id), 5000);\n }\n\n public hideSnackbar(id: string): void {\n this.setState(\n 'snackbars',\n this.snackbars.filter((snackbar) => snackbar.id !== id),\n );\n }\n\n public registerComponent(name: UIComponent, component: Component): void {\n this.components[name] = component;\n }\n\n public async openModal<TModalComponent extends ModalComponent>(\n component: TModalComponent,\n properties?: ModalProperties<TModalComponent>,\n ): Promise<Modal<ModalResult<TModalComponent>>> {\n const id = uuid();\n const callbacks: Partial<ModalCallbacks<ModalResult<TModalComponent>>> = {};\n const modal: Modal<ModalResult<TModalComponent>> = {\n id,\n properties: properties ?? {},\n component: markRaw(component),\n beforeClose: new Promise((resolve) => (callbacks.willClose = resolve)),\n afterClose: new Promise((resolve) => (callbacks.closed = resolve)),\n };\n const activeModal = this.modals.at(-1);\n const modals = this.modals.concat(modal);\n\n this.modalCallbacks[modal.id] = callbacks;\n\n this.setState({ modals });\n\n await nextTick();\n await (activeModal && Events.emit('hide-modal', { id: activeModal.id }));\n await Promise.all([\n activeModal || Events.emit('show-overlays-backdrop'),\n Events.emit('show-modal', { id: modal.id }),\n ]);\n\n return modal;\n }\n\n public async closeModal(id: string, result?: unknown): Promise<void> {\n await Events.emit('close-modal', { id, result });\n }\n\n protected async boot(): Promise<void> {\n this.watchModalEvents();\n }\n\n private watchModalEvents(): void {\n Events.on('modal-will-close', ({ modal, result }) => {\n this.modalCallbacks[modal.id]?.willClose?.(result);\n\n if (this.modals.length === 1) {\n Events.emit('hide-overlays-backdrop');\n }\n });\n\n Events.on('modal-closed', async ({ modal, result }) => {\n this.setState(\n 'modals',\n this.modals.filter((m) => m.id !== modal.id),\n );\n\n this.modalCallbacks[modal.id]?.closed?.(result);\n\n delete this.modalCallbacks[modal.id];\n\n const activeModal = this.modals.at(-1);\n\n await (activeModal && Events.emit('show-modal', { id: activeModal.id }));\n });\n }\n\n}\n\nexport default facade(new UIService());\n\ndeclare module '@/services/Events' {\n export interface EventsPayload {\n 'modal-will-close': { modal: Modal; result?: unknown };\n 'modal-closed': { modal: Modal; result?: unknown };\n 'close-modal': { id: string; result?: unknown };\n 'hide-modal': { id: string };\n 'show-modal': { id: string };\n }\n}\n","import { facade, toString } from '@noeldemartin/utils';\n\nimport App from '@/services/App';\nimport Service from '@/services/Service';\n\nexport interface LangProvider {\n translate(key: string, parameters?: Record<string, unknown>): string;\n}\n\nexport class LangService extends Service {\n\n private provider: LangProvider;\n\n constructor() {\n super();\n\n this.provider = {\n translate: (key) => {\n // eslint-disable-next-line no-console\n App.development && console.warn('Lang provider is missing');\n\n return key;\n },\n };\n }\n\n public setProvider(provider: LangProvider): void {\n this.provider = provider;\n }\n\n public translate(key: string, parameters?: Record<string, unknown>): string {\n return this.provider.translate(key, parameters) ?? key;\n }\n\n public translateWithDefault(key: string, defaultMessage: string): string;\n public translateWithDefault(key: string, parameters: Record<string, unknown>, defaultMessage: string): string;\n public translateWithDefault(\n key: string,\n defaultMessageOrParameters?: string | Record<string, unknown>,\n defaultMessage?: string,\n ): string {\n defaultMessage ??= defaultMessageOrParameters as string;\n\n const parameters = typeof defaultMessageOrParameters === 'string' ? {} : defaultMessageOrParameters ?? {};\n const message = this.provider.translate(key, parameters) ?? key;\n\n if (message === key) {\n return Object.entries(parameters).reduce(\n (renderedMessage, [name, value]) =>\n renderedMessage.replace(new RegExp(`\\\\{\\\\s*${name}\\\\s*\\\\}`, 'g'), toString(value)),\n defaultMessage,\n );\n }\n\n return message;\n }\n\n}\n\nexport default facade(new LangService());\n","import Lang from './Lang';\n\nexport const translate = Lang.translate.bind(Lang);\nexport const translateWithDefault = Lang.translateWithDefault.bind(Lang);\n","import type { JSError } from '@noeldemartin/utils';\n\nimport { defineServiceState } from '@/services';\n\nexport type ErrorSource = string | Error | JSError | unknown;\n\nexport interface ErrorReport {\n title: string;\n description?: string;\n details?: string;\n error?: Error | JSError | unknown;\n}\n\nexport interface ErrorReportLog {\n report: ErrorReport;\n seen: boolean;\n date: Date;\n}\n\nexport default defineServiceState({\n name: 'errors',\n initialState: {\n logs: [] as ErrorReportLog[],\n startupErrors: [] as ErrorReport[],\n },\n computed: {\n hasErrors: ({ logs }) => logs.length > 0,\n hasNewErrors: ({ logs }) => logs.some((error) => !error.seen),\n hasStartupErrors: ({ startupErrors }) => startupErrors.length > 0,\n },\n});\n","export const Colors = {\n Primary: 'primary',\n Secondary: 'secondary',\n Danger: 'danger',\n Clear: 'clear',\n} as const;\n\nexport type Color = (typeof Colors)[keyof typeof Colors];\n","import { JSError, facade, isObject, objectWithoutEmpty, toString } from '@noeldemartin/utils';\n\nimport App from '@/services/App';\nimport ServiceBootError from '@/errors/ServiceBootError';\nimport UI, { UIComponents } from '@/ui/UI';\nimport { translateWithDefault } from '@/lang/utils';\n\nimport Service from './Errors.state';\nimport { Colors } from '@/components/constants';\nimport type { ErrorReport, ErrorReportLog, ErrorSource } from './Errors.state';\n\nexport class ErrorsService extends Service {\n\n public forceReporting: boolean = false;\n private enabled: boolean = true;\n\n public enable(): void {\n this.enabled = true;\n }\n\n public disable(): void {\n this.enabled = false;\n }\n\n public async inspect(error: ErrorSource | ErrorReport[]): Promise<void> {\n const reports = Array.isArray(error) ? error : [await this.createErrorReport(error)];\n\n if (reports.length === 0) {\n UI.alert(translateWithDefault('errors.inspectEmpty', 'Nothing to inspect!'));\n\n return;\n }\n\n UI.openModal(UI.requireComponent(UIComponents.ErrorReportModal), { reports });\n }\n\n public async report(error: ErrorSource, message?: string): Promise<void> {\n if (App.development || App.testing) {\n this.logError(error);\n }\n\n if (!this.enabled) {\n throw error;\n }\n\n if (!App.isMounted) {\n const startupError = await this.createStartupErrorReport(error);\n\n if (startupError) {\n this.setState({ startupErrors: this.startupErrors.concat(startupError) });\n }\n\n return;\n }\n\n const report = await this.createErrorReport(error);\n const log: ErrorReportLog = {\n report,\n seen: false,\n date: new Date(),\n };\n\n UI.showSnackbar(\n message ??\n translateWithDefault('errors.notice', 'Something went wrong, but it\\'s not your fault. Try again!'),\n {\n color: Colors.Danger,\n actions: [\n {\n text: translateWithDefault('errors.viewDetails', 'View details'),\n dismiss: true,\n handler: () =>\n UI.openModal(UI.requireComponent(UIComponents.ErrorReportModal), {\n reports: [report],\n }),\n },\n ],\n },\n );\n\n this.setState({ logs: [log].concat(this.logs) });\n }\n\n public see(report: ErrorReport): void {\n this.setState({\n logs: this.logs.map((log) => {\n if (log.report !== report) {\n return log;\n }\n\n return {\n ...log,\n seen: true,\n };\n }),\n });\n }\n\n public seeAll(): void {\n this.setState({\n logs: this.logs.map((log) => ({\n ...log,\n seen: true,\n })),\n });\n }\n\n public getErrorMessage(error: ErrorSource): string {\n if (typeof error === 'string') {\n return error;\n }\n\n if (error instanceof Error || error instanceof JSError) {\n return error.message;\n }\n\n if (isObject(error)) {\n return toString(error['message'] ?? error['description'] ?? 'Unknown error object');\n }\n\n return translateWithDefault('errors.unknown', 'Unknown Error');\n }\n\n private logError(error: unknown): void {\n // eslint-disable-next-line no-console\n console.error(error);\n\n if (isObject(error) && error.cause) {\n this.logError(error.cause);\n }\n }\n\n private async createErrorReport(error: ErrorSource): Promise<ErrorReport> {\n if (typeof error === 'string') {\n return { title: error };\n }\n\n if (error instanceof Error || error instanceof JSError) {\n return this.createErrorReportFromError(error);\n }\n\n if (isObject(error)) {\n return objectWithoutEmpty({\n title: toString(\n error['name'] ?? error['title'] ?? translateWithDefault('errors.unknown', 'Unknown Error'),\n ),\n description: toString(\n error['message'] ??\n error['description'] ??\n translateWithDefault('errors.unknownDescription', 'Unknown error object'),\n ),\n error,\n });\n }\n\n return {\n title: translateWithDefault('errors.unknown', 'Unknown Error'),\n error,\n };\n }\n\n private async createStartupErrorReport(error: ErrorSource): Promise<ErrorReport | null> {\n if (error instanceof ServiceBootError) {\n // Ignore second-order boot errors in order to have a cleaner startup crash screen.\n return error.cause instanceof ServiceBootError ? null : this.createErrorReport(error.cause);\n }\n\n return this.createErrorReport(error);\n }\n\n private createErrorReportFromError(error: Error | JSError, defaults: Partial<ErrorReport> = {}): ErrorReport {\n return {\n title: error.name,\n description: error.message,\n details: error.stack,\n error,\n ...defaults,\n };\n }\n\n}\n\nexport default facade(new ErrorsService());\n","import { tap } from '@noeldemartin/utils';\n\nimport { bootServices } from '@/services';\nimport { definePlugin } from '@/plugins';\n\nimport Errors from './Errors';\nimport { ErrorReport, ErrorReportLog, ErrorSource } from './Errors.state';\n\nexport { Errors, ErrorSource, ErrorReport, ErrorReportLog };\n\nconst services = { $errors: Errors };\nconst frameworkHandler: ErrorHandler = (error) => {\n if (!Errors.instance) {\n // eslint-disable-next-line no-console\n console.warn('Errors service hasn\\'t been initialized properly!');\n\n // eslint-disable-next-line no-console\n console.error(error);\n\n return true;\n }\n\n Errors.report(error);\n\n return true;\n};\n\nfunction setUpErrorHandler(baseHandler: ErrorHandler = () => false): ErrorHandler {\n return tap(\n (error) => baseHandler(error) || frameworkHandler(error),\n (errorHandler) => {\n globalThis.onerror = (message, _, __, ___, error) => errorHandler(error ?? message);\n globalThis.onunhandledrejection = (event) => errorHandler(event.reason);\n },\n );\n}\n\nexport type ErrorHandler = (error: ErrorSource) => boolean;\nexport type ErrorsServices = typeof services;\n\nexport default definePlugin({\n async install(app, options) {\n const errorHandler = setUpErrorHandler(options.handleError);\n\n app.config.errorHandler = errorHandler;\n\n await bootServices(app, services);\n },\n});\n\ndeclare module '@/bootstrap/options' {\n interface AerogelOptions {\n handleError?(error: ErrorSource): boolean;\n }\n}\n\ndeclare module '@/services' {\n export interface Services extends ErrorsServices {}\n}\n","import { bootServices } from '@/services';\nimport { definePlugin } from '@/plugins';\n\nimport Lang, { LangProvider } from './Lang';\nimport { translate, translateWithDefault } from './utils';\n\nexport { Lang, LangProvider, translate, translateWithDefault };\n\nconst services = { $lang: Lang };\n\nexport type LangServices = typeof services;\n\nexport default definePlugin({\n async install(app) {\n app.config.globalProperties.$t ??= translate;\n app.config.globalProperties.$td = translateWithDefault;\n\n await bootServices(app, services);\n },\n});\n\ndeclare module '@/services' {\n export interface Services extends LangServices {}\n}\n\ndeclare module '@vue/runtime-core' {\n interface ComponentCustomProperties {\n $td: typeof translateWithDefault;\n }\n}\n","import { onUnmounted } from 'vue';\n\nimport Events from '@/services/Events';\nimport type {\n EventListener,\n EventWithPayload,\n EventWithoutPayload,\n EventsPayload,\n UnknownEvent,\n} from '@/services/Events';\n\nexport function useEvent<Event extends EventWithoutPayload>(event: Event, listener: () => unknown): void;\nexport function useEvent<Event extends EventWithPayload>(\n event: Event,\n listener: EventListener<EventsPayload[Event]>\n): void;\nexport function useEvent<Event extends string>(event: UnknownEvent<Event>, listener: EventListener): void;\n\nexport function useEvent(event: string, listener: EventListener): void {\n const unsubscribe = Events.on(event, listener);\n\n onUnmounted(() => unsubscribe());\n}\n","import { objectWithout } from '@noeldemartin/utils';\nimport { computed, useAttrs } from 'vue';\nimport type { ComputedRef } from 'vue';\n\nexport function useInputAttrs(): [ComputedRef<{}>, ComputedRef<unknown>] {\n const attrs = useAttrs();\n const className = computed(() => attrs.class);\n const inputAttrs = computed(() => objectWithout(attrs, 'class'));\n\n return [inputAttrs, className];\n}\n","import { noop } from '@noeldemartin/utils';\nimport { onMounted, onUnmounted } from 'vue';\n\nexport function onCleanMounted(operation: () => Function): void {\n let cleanUp: Function = noop;\n\n onMounted(() => (cleanUp = operation()));\n onUnmounted(() => cleanUp());\n}\n","<template>\n <Dialog ref=\"$root\" :open=\"true\" @close=\"cancellable && close()\">\n <slot :close=\"close\" />\n </Dialog>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, toRef } from 'vue';\nimport { Dialog } from '@headlessui/vue';\nimport type { VNode } from 'vue';\n\nimport Events from '@/services/Events';\nimport { useEvent } from '@/utils/composition/events';\nimport { booleanProp, injectReactiveOrFail } from '@/utils/vue';\nimport type { IAGModalContext } from '@/components/modals/AGModalContext';\n\nimport type { IAGHeadlessModal, IAGHeadlessModalDefaultSlotProps } from './AGHeadlessModal';\n\nconst props = defineProps({\n cancellable: booleanProp(true),\n});\n\nconst $root = ref<{ $el?: HTMLElement } | null>(null);\nconst hidden = ref(true);\nconst closed = ref(false);\nconst { modal } = injectReactiveOrFail<IAGModalContext>(\n 'modal',\n 'could not obtain modal reference from <AGHeadlessModal>, ' +\n 'did you render this component manually? Show it using $ui.openModal() instead',\n);\n\nasync function hide(): Promise<void> {\n if (!$root.value?.$el) {\n return;\n }\n\n hidden.value = true;\n}\n\nasync function show(): Promise<void> {\n if (!$root.value?.$el) {\n return;\n }\n\n hidden.value = false;\n}\n\nasync function close(result?: unknown) {\n if (closed.value) {\n return;\n }\n\n Events.emit('modal-will-close', { modal, result });\n\n await hide();\n\n closed.value = true;\n\n Events.emit('modal-closed', { modal, result });\n}\n\nuseEvent('close-modal', async ({ id, result }) => {\n if (id !== modal.id) {\n return;\n }\n\n await close(result);\n});\n\nuseEvent('hide-modal', async ({ id }) => {\n if (id !== modal.id) {\n return;\n }\n\n await hide();\n});\n\nuseEvent('show-modal', async ({ id }) => {\n if (id !== modal.id) {\n return;\n }\n\n await show();\n});\n\ndefineSlots<{ default(props: IAGHeadlessModalDefaultSlotProps): VNode[] }>();\ndefineExpose<IAGHeadlessModal>({ close, cancellable: toRef(props, 'cancellable') });\n</script>\n","<template>\n <component :is=\"modal.component\" v-bind=\"modal.properties\" />\n</template>\n\n<script setup lang=\"ts\">\nimport { provide, toRef } from 'vue';\n\nimport { requiredNumberProp, requiredObjectProp } from '@/utils/vue';\nimport type { Modal } from '@/ui/UI.state';\n\nimport type { IAGModalContext } from './AGModalContext';\n\nconst props = defineProps({\n modal: requiredObjectProp<Modal>(),\n childIndex: requiredNumberProp(),\n});\n\nprovide<IAGModalContext>('modal', {\n modal: toRef(props, 'modal'),\n childIndex: toRef(props, 'childIndex'),\n});\n</script>\n","<template>\n <DialogPanel>\n <slot />\n\n <template v-if=\"childModal\">\n <div class=\"pointer-events-none fixed inset-0 z-50 bg-black/30\" />\n <AGModalContext :child-index=\"modal.childIndex + 1\" :modal=\"childModal\" />\n </template>\n </DialogPanel>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { DialogPanel } from '@headlessui/vue';\n\nimport UI from '@/ui/UI';\nimport { injectReactiveOrFail } from '@/utils/vue';\nimport type { IAGModalContext } from '@/components/modals/AGModalContext';\n\nimport AGModalContext from '../../modals/AGModalContext.vue';\n\nconst modal = injectReactiveOrFail<IAGModalContext>(\n 'modal',\n 'could not obtain modal reference from <AGHeadlessModalPanel>, ' +\n 'did you render this component manually? Show it using $ui.openModal() instead',\n);\nconst childModal = computed(() => UI.modals[modal.childIndex] ?? null);\n</script>\n","<template>\n <AGHeadlessModal\n ref=\"$headlessModal\"\n v-slot=\"{ close }: IAGHeadlessModalDefaultSlotProps\"\n :cancellable=\"cancellable\"\n class=\"relative z-50\"\n >\n <div class=\"fixed inset-0 flex items-center justify-center p-8\">\n <AGHeadlessModalPanel class=\"flex max-h-full max-w-full flex-col overflow-hidden bg-white\">\n <div class=\"flex max-h-full flex-col overflow-auto p-4\" v-bind=\"$attrs\">\n <slot :close=\"close\" />\n </div>\n </AGHeadlessModalPanel>\n </div>\n </AGHeadlessModal>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref } from 'vue';\n\nimport { booleanProp } from '@/utils';\nimport type { IAGHeadlessModal, IAGHeadlessModalDefaultSlotProps } from '@/components/headless/modals/AGHeadlessModal';\n\nimport type { IAGModal } from './AGModal';\n\nimport AGHeadlessModal from '../headless/modals/AGHeadlessModal.vue';\nimport AGHeadlessModalPanel from '../headless/modals/AGHeadlessModalPanel.vue';\n\nconst $headlessModal = ref<IAGHeadlessModal>();\n\ndefineOptions({ inheritAttrs: false });\ndefineProps({ cancellable: booleanProp(true) });\ndefineExpose<IAGModal>({\n close: async () => $headlessModal.value?.close(),\n cancellable: computed(() => !!$headlessModal.value?.cancellable),\n});\n</script>\n","import { tap } from '@noeldemartin/utils';\nimport DOMPurify from 'dompurify';\nimport { Renderer, marked } from 'marked';\n\nfunction makeRenderer(): Renderer {\n return tap(new Renderer(), (renderer) => {\n renderer.link = function(href, title, text) {\n return Renderer.prototype.link.apply(this, [href, title, text]).replace('<a', '<a target=\"_blank\"');\n };\n });\n}\n\nexport function renderMarkdown(markdown: string): string {\n return safeHtml(marked(markdown, { mangle: false, headerIds: false, renderer: makeRenderer() }));\n}\n\nexport function safeHtml(html: string): string {\n // TODO improve target=\"_blank\" exception\n // See https://github.com/cure53/DOMPurify/issues/317\n return DOMPurify.sanitize(html, { ADD_ATTR: ['target'] });\n}\n","<template>\n <root />\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, h } from 'vue';\n\nimport { renderMarkdown } from '@/utils/markdown';\nimport { booleanProp, objectProp, stringProp } from '@/utils/vue';\nimport { translate } from '@/lang';\n\nconst props = defineProps({\n as: stringProp(),\n inline: booleanProp(),\n langKey: stringProp(),\n langParams: objectProp<Record<string, unknown>>(),\n text: stringProp(),\n});\n\nconst markdown = computed(() => props.text ?? (props.langKey && translate(props.langKey, props.langParams ?? {})));\nconst html = computed(() => {\n if (!markdown.value) {\n return null;\n }\n\n let renderedHtml = renderMarkdown(markdown.value);\n\n if (props.inline) {\n renderedHtml = renderedHtml.replace('<p>', '<span>').replace('</p>', '</span>');\n }\n\n return renderedHtml;\n});\nconst root = () =>\n h(props.as ?? (props.inline ? 'span' : 'div'), { class: props.inline ? '' : 'prose', innerHTML: html.value });\n</script>\n","<template>\n <component :is=\"component.tag\" v-bind=\"component.props\">\n <slot />\n </component>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { objectWithoutEmpty } from '@noeldemartin/utils';\n\nimport { booleanProp, objectProp, stringProp } from '@/utils/vue';\n\nconst { href, url, route, routeParams, routeQuery, submit } = defineProps({\n href: stringProp(),\n url: stringProp(),\n route: stringProp(),\n routeParams: objectProp(() => ({})),\n routeQuery: objectProp(() => ({})),\n submit: booleanProp(),\n});\n\nconst component = computed(() => {\n if (route) {\n return {\n tag: 'router-link',\n props: {\n to: objectWithoutEmpty({\n name: route,\n params: routeParams,\n query: routeQuery,\n }),\n },\n };\n }\n\n if (href || url) {\n return {\n tag: 'a',\n props: {\n target: '_blank',\n href: href || url,\n },\n };\n }\n\n return {\n tag: 'button',\n props: { type: submit ? 'submit' : 'button' },\n };\n});\n</script>\n","<template>\n <AGHeadlessButton class=\"px-2.5 py-1.5 focus-visible:outline focus-visible:outline-2\" :class=\"colorClasses\">\n <slot />\n </AGHeadlessButton>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\n\nimport { enumProp } from '@/utils/vue';\nimport { Colors } from '@/components/constants';\n\nimport AGHeadlessButton from '../headless/forms/AGHeadlessButton.vue';\n\nconst props = defineProps({\n color: enumProp(Colors, Colors.Primary),\n});\n\nconst colorClasses = computed(() => {\n switch (props.color) {\n case Colors.Secondary:\n return [\n 'text-white bg-gray-600',\n 'hover:bg-gray-500',\n 'focus-visible:outline-offset-2 focus-visible:outline-gray-600',\n ].join(' ');\n case Colors.Clear:\n return 'hover:bg-gray-500/20 focus-visible:outline-gray-500/60';\n case Colors.Danger:\n return [\n 'text-white bg-red-600',\n 'hover:bg-red-500',\n 'focus-visible:outline-offset-2 focus-visible:outline-red-600',\n ].join(' ');\n case Colors.Primary:\n default:\n return [\n 'text-white bg-indigo-600',\n 'hover:bg-indigo-500',\n 'focus-visible:outline-offset-2 focus-visible:outline-indigo-600',\n ].join(' ');\n }\n});\n</script>\n","import type { Component } from 'vue';\n\nimport { requiredArrayProp } from '@/utils/vue';\nimport type { ErrorReport } from '@/errors';\n\nexport interface IAGErrorReportModalButtonsDefaultSlotProps {\n id: string;\n description: string;\n iconComponent: Component;\n url?: string;\n handler?(): void;\n}\n\nexport const errorReportModalProps = {\n reports: requiredArrayProp<ErrorReport>(),\n};\n\nexport function useErrorReportModalProps(): typeof errorReportModalProps {\n return errorReportModalProps;\n}\n","<template>\n <div class=\"flex\">\n <slot v-for=\"(button, i) of buttons\" v-bind=\"(button as unknown as ComponentProps)\" :key=\"i\">\n <AGButton\n color=\"clear\"\n :url=\"button.url\"\n :title=\"$td(`errors.report_${button.id}`, button.description)\"\n :aria-label=\"$td(`errors.report_${button.id}`, button.description)\"\n @click=\"button.handler\"\n >\n <component :is=\"button.iconComponent\" class=\"h-4 w-4\" aria-hidden=\"true\" />\n </AGButton>\n </slot>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport IconConsole from '~icons/mdi/console';\nimport IconCopy from '~icons/zondicons/copy';\nimport IconGitHub from '~icons/mdi/github';\n\nimport { computed } from 'vue';\nimport { stringExcerpt, tap } from '@noeldemartin/utils';\n\nimport App from '@/services/App';\nimport UI from '@/ui/UI';\nimport { requiredObjectProp } from '@/utils/vue';\nimport { translateWithDefault } from '@/lang/utils';\nimport type { ComponentProps } from '@/utils/vue';\nimport type { ErrorReport } from '@/errors';\n\nimport AGButton from '../forms/AGButton.vue';\nimport type { IAGErrorReportModalButtonsDefaultSlotProps } from './AGErrorReportModal';\n\nconst props = defineProps({\n report: requiredObjectProp<ErrorReport>(),\n});\nconst summary = computed(() =>\n props.report.description ? `${props.report.title}: ${props.report.description}` : props.report.title);\nconst githubReportUrl = computed(() => {\n if (!App.sourceUrl) {\n return false;\n }\n\n const issueTitle = encodeURIComponent(summary.value);\n const issueBody = encodeURIComponent(\n [\n '[Please, explain here what you were trying to do when this error appeared]',\n '',\n 'Error details:',\n '```',\n stringExcerpt(\n props.report.details ?? 'Details missing from report',\n 1800 - issueTitle.length - App.sourceUrl.length,\n ).trim(),\n '```',\n ].join('\\n'),\n );\n\n return `${App.sourceUrl}/issues/new?title=${issueTitle}&body=${issueBody}`;\n});\nconst buttons = computed(() =>\n tap(\n [\n {\n id: 'clipboard',\n description: 'Copy to clipboard',\n iconComponent: IconCopy,\n async handler() {\n await navigator.clipboard.writeText(`${summary.value}\\n\\n${props.report.details}`);\n\n UI.showSnackbar(\n translateWithDefault('errors.copiedToClipboard', 'Debug information copied to clipboard'),\n );\n },\n },\n {\n id: 'console',\n description: 'Log to console',\n iconComponent: IconConsole,\n handler() {\n (window as { error?: unknown }).error = props.report.error;\n\n // eslint-disable-next-line no-console\n console.error(props.report.error);\n\n UI.showSnackbar(\n translateWithDefault(\n 'errors.addedToConsole',\n 'You can now use the **error** variable in the console',\n ),\n );\n },\n },\n ],\n (reportButtons: IAGErrorReportModalButtonsDefaultSlotProps[]) => {\n if (!githubReportUrl.value) {\n return;\n }\n\n reportButtons.push({\n id: 'github',\n description: 'Report in GitHub',\n iconComponent: IconGitHub,\n url: githubReportUrl.value,\n });\n },\n ));\n</script>\n","<template>\n <AGMarkdown :text=\"text\" inline />\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\n\nimport { numberProp, requiredObjectProp } from '@/utils/vue';\nimport type { ErrorReport } from '@/errors';\n\nimport AGMarkdown from '../basic/AGMarkdown.vue';\n\nconst props = defineProps({\n report: requiredObjectProp<ErrorReport>(),\n currentReport: numberProp(),\n totalReports: numberProp(),\n});\nconst text = computed(() => {\n if (!props.totalReports || props.totalReports <= 1) {\n return props.report.title;\n }\n\n return `${props.report.title} (${props.currentReport}/${props.totalReports})`;\n});\n</script>\n","<template>\n <AGModal>\n <div>\n <h2 class=\"flex items-center justify-between text-lg font-medium\">\n <div class=\"flex items-center\">\n <AGErrorReportModalTitle\n :report=\"report\"\n :current-report=\"activeReportIndex + 1\"\n :total-reports=\"reports.length\"\n />\n <template v-if=\"reports.length > 1\">\n <AGButton\n color=\"clear\"\n :disabled=\"activeReportIndex === 0\"\n :title=\"$td('errors.previousReport', 'Show previous report')\"\n :aria-label=\"$td('errors.previousReport', 'Show previous report')\"\n @click=\"activeReportIndex--\"\n >\n <IconCheveronLeft aria-hidden=\"true\" class=\"h-4 w-4\" />\n </AGButton>\n <AGButton\n color=\"clear\"\n :disabled=\"activeReportIndex === reports.length - 1\"\n :title=\"$td('errors.nextReport', 'Show next report')\"\n :aria-label=\"$td('errors.nextReport', 'Show next report')\"\n @click=\"activeReportIndex++\"\n >\n <IconCheveronRight aria-hidden=\"true\" class=\"h-4 w-4\" />\n </AGButton>\n </template>\n </div>\n <AGErrorReportModalButtons :report=\"report\" />\n </h2>\n <AGMarkdown v-if=\"report.description\" :text=\"report.description\" class=\"mt-2\" />\n </div>\n <pre\n class=\"h-full overflow-auto bg-gray-200 p-4 text-xs text-red-900\"\n v-text=\"report.details ?? $td('errors.detailsEmpty', 'This error is missing a stacktrace.')\"\n />\n </AGModal>\n</template>\n\n<script setup lang=\"ts\">\nimport IconCheveronRight from '~icons/zondicons/cheveron-right';\nimport IconCheveronLeft from '~icons/zondicons/cheveron-left';\n\nimport { computed, ref } from 'vue';\n\nimport type { ErrorReport } from '@/errors';\n\nimport { useErrorReportModalProps } from './AGErrorReportModal';\n\nimport AGButton from '../forms/AGButton.vue';\nimport AGErrorReportModalButtons from './AGErrorReportModalButtons.vue';\nimport AGErrorReportModalTitle from './AGErrorReportModalTitle.vue';\nimport AGMarkdown from '../basic/AGMarkdown.vue';\nimport AGModal from './AGModal.vue';\n\nconst props = defineProps(useErrorReportModalProps());\nconst activeReportIndex = ref(0);\nconst report = computed(() => props.reports[activeReportIndex.value] as ErrorReport);\n</script>\n","<template>\n <AGModal :cancellable=\"false\">\n <AGMarkdown :text=\"renderedMessage\" />\n </AGModal>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\n\nimport { stringProp } from '@/utils/vue';\nimport { translateWithDefault } from '@/lang/utils';\n\nimport AGModal from './AGModal.vue';\n\nimport AGMarkdown from '../basic/AGMarkdown.vue';\n\nconst props = defineProps({ message: stringProp() });\nconst renderedMessage = computed(() => props.message ?? translateWithDefault('ui.loading', 'Loading...'));\n</script>\n","<template>\n <component :is=\"as\" v-if=\"as\">\n <slot />\n </component>\n <slot v-else />\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, inject, provide, readonly } from 'vue';\nimport { uuid } from '@noeldemartin/utils';\n\nimport { mixedProp, stringProp } from '@/utils/vue';\nimport type Form from '@/forms/Form';\n\nimport type { IAGHeadlessInput } from './AGHeadlessInput';\n\nconst emit = defineEmits(['update:modelValue']);\nconst props = defineProps({\n as: stringProp('div'),\n name: stringProp(),\n modelValue: mixedProp<string | number | boolean>([String, Number, Boolean]),\n});\nconst errors = computed(() => {\n if (!form || !props.name) {\n return null;\n }\n\n return form.errors[props.name] ?? null;\n});\nconst form = inject<Form | null>('form', null);\nconst publicApi: IAGHeadlessInput = {\n id: `input-${uuid()}`,\n value: computed(() => {\n if (form && props.name) {\n return form.getFieldValue(props.name);\n }\n\n return props.modelValue;\n }),\n errors: readonly(errors),\n update(value) {\n if (form && props.name) {\n form.setFieldValue(props.name, value);\n\n return;\n }\n\n emit('update:modelValue', value);\n },\n};\n\nprovide<IAGHeadlessInput>('input', publicApi);\ndefineExpose<IAGHeadlessInput>(publicApi);\n</script>\n","<template>\n <p v-if=\"errorMessage\" :id=\"`${input.id}-error`\">\n {{ errorMessage }}\n </p>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\n\nimport { injectReactiveOrFail } from '@/utils/vue';\nimport { translateWithDefault } from '@/lang/utils';\n\nimport type { IAGHeadlessInput } from './AGHeadlessInput';\n\nconst input = injectReactiveOrFail<IAGHeadlessInput>(\n 'input',\n '<AGHeadlessInputError> must be a child of a <AGHeadlessInput>',\n);\nconst errorMessage = computed(() => {\n if (!input.errors) {\n return null;\n }\n\n return translateWithDefault(`errors.${input.errors[0]}`, `Error: ${input.errors[0]}`);\n});\n</script>\n","<template>\n <input\n :id=\"input.id\"\n ref=\"$input\"\n :type=\"type\"\n :value=\"value\"\n :aria-invalid=\"input.errors ? 'true' : 'false'\"\n :aria-describedby=\"input.errors ? `${input.id}-error` : undefined\"\n :checked=\"checked\"\n @input=\"update\"\n >\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref } from 'vue';\n\nimport { injectReactiveOrFail, stringProp } from '@/utils';\nimport type { IAGHeadlessInput } from '@/components/headless/forms/AGHeadlessInput';\n\nconst props = defineProps({\n type: stringProp('text'),\n});\n\nconst $input = ref<HTMLInputElement>();\nconst input = injectReactiveOrFail<IAGHeadlessInput>(\n 'input',\n '<AGHeadlessInputInput> must be a child of a <AGHeadlessInput>',\n);\nconst value = computed(() => input.value);\nconst checked = computed(() => {\n if (props.type !== 'checkbox') {\n return;\n }\n\n return !!value.value;\n});\n\nfunction update() {\n if (!$input.value) {\n return;\n }\n\n input.update(props.type === 'checkbox' ? $input.value.checked : $input.value.value);\n}\n</script>\n","<template>\n <label :for=\"input.id\">\n <slot />\n </label>\n</template>\n\n<script setup lang=\"ts\">\nimport { injectReactiveOrFail } from '@/utils/vue';\n\nimport type { IAGHeadlessInput } from './AGHeadlessInput';\n\nconst input = injectReactiveOrFail<IAGHeadlessInput>(\n 'input',\n '<AGHeadlessInputLabel> must be a child of a <AGHeadlessInput>',\n);\n</script>\n","import { arrayProp, enumProp, requiredStringProp } from '@/utils/vue';\nimport { Colors } from '@/components/constants';\nimport { objectWithout } from '@noeldemartin/utils';\n\nexport { default as AGHeadlessSnackbar } from './AGHeadlessSnackbar.vue';\n\nexport interface SnackbarAction {\n text: string;\n dismiss?: boolean;\n handler?(): unknown;\n}\n\nexport type SnackbarColor = (typeof SnackbarColors)[keyof typeof SnackbarColors];\n\nexport const SnackbarColors = objectWithout(Colors, ['Primary', 'Clear']);\nexport const snackbarProps = {\n id: requiredStringProp(),\n message: requiredStringProp(),\n actions: arrayProp<SnackbarAction>(() => []),\n color: enumProp(SnackbarColors, Colors.Secondary),\n};\n\nexport function useSnackbarProps(): typeof snackbarProps {\n return snackbarProps;\n}\n","<template>\n <AGHeadlessSnackbar class=\"flex flex-row items-center justify-center gap-3 p-4\" :class=\"styleClasses\">\n <AGMarkdown :text=\"message\" inline />\n <AGButton\n v-for=\"(action, i) of actions\"\n :key=\"i\"\n :color=\"color\"\n @click=\"activate(action)\"\n >\n {{ action.text }}\n </AGButton>\n </AGHeadlessSnackbar>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\n\nimport UI from '@/ui/UI';\nimport { Colors } from '@/components/constants';\nimport { useSnackbarProps } from '@/components/headless';\nimport type { SnackbarAction } from '@/components/headless';\n\nimport AGButton from '../forms/AGButton.vue';\nimport AGHeadlessSnackbar from '../headless/snackbars/AGHeadlessSnackbar.vue';\nimport AGMarkdown from '../basic/AGMarkdown.vue';\n\nconst props = defineProps(useSnackbarProps());\nconst styleClasses = computed(() => {\n switch (props.color) {\n case Colors.Danger:\n return 'bg-red-200 text-red-900';\n default:\n case Colors.Secondary:\n return 'bg-gray-900 text-white';\n }\n});\n\nfunction activate(action: SnackbarAction): void {\n action.handler?.();\n action.dismiss && UI.hideSnackbar(props.id);\n}\n</script>\n","import type { Component } from 'vue';\n\nimport { bootServices } from '@/services';\nimport { definePlugin } from '@/plugins';\n\nimport UI, { UIComponents } from './UI';\nimport AGAlertModal from '../components/modals/AGAlertModal.vue';\nimport AGConfirmModal from '../components/modals/AGConfirmModal.vue';\nimport AGErrorReportModal from '../components/modals/AGErrorReportModal.vue';\nimport AGLoadingModal from '../components/modals/AGLoadingModal.vue';\nimport AGSnackbar from '../components/snackbars/AGSnackbar.vue';\nimport type { UIComponent } from './UI';\n\nexport { UI, UIComponents, UIComponent };\n\nconst services = { $ui: UI };\n\nexport type UIServices = typeof services;\n\nexport default definePlugin({\n async install(app, options) {\n const defaultComponents = {\n [UIComponents.AlertModal]: AGAlertModal,\n [UIComponents.ConfirmModal]: AGConfirmModal,\n [UIComponents.ErrorReportModal]: AGErrorReportModal,\n [UIComponents.LoadingModal]: AGLoadingModal,\n [UIComponents.Snackbar]: AGSnackbar,\n };\n\n Object.entries({\n ...defaultComponents,\n ...options.components,\n }).forEach(([name, component]) => UI.registerComponent(name as UIComponent, component));\n\n await bootServices(app, services);\n },\n});\n\ndeclare module '@/bootstrap/options' {\n interface AerogelOptions {\n components?: Partial<Record<UIComponent, Component>>;\n }\n}\n\ndeclare module '@/services' {\n export interface Services extends UIServices {}\n}\n","import { createApp } from 'vue';\nimport type { Component } from 'vue';\n\nimport directives from '@/directives';\nimport errors from '@/errors';\nimport Events from '@/services/Events';\nimport lang from '@/lang';\nimport services from '@/services';\nimport ui from '@/ui';\nimport { installPlugins } from '@/plugins';\nimport type { AerogelOptions } from '@/bootstrap/options';\n\nexport async function bootstrapApplication(rootComponent: Component, options: AerogelOptions = {}): Promise<void> {\n const plugins = [directives, errors, lang, services, ui, ...(options.plugins ?? [])];\n const app = createApp(rootComponent);\n\n await installPlugins(plugins, app, options);\n\n app.mount('#app');\n Events.emit('application-mounted');\n}\n","<template>\n <aside v-if=\"modal\">\n <AGModalContext :child-index=\"1\" :modal=\"modal\" />\n </aside>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\n\nimport UI from '@/ui/UI';\n\nimport AGModalContext from './modals/AGModalContext.vue';\n\nconst modal = computed(() => UI.modals[0] ?? null);\n</script>\n","<template>\n <div aria-live=\"assertive\" class=\"z-60 pointer-events-none fixed inset-0 flex items-end px-4 py-6 sm:p-6\">\n <div class=\"flex w-full flex-col items-center space-y-4 sm:items-end\">\n <component\n :is=\"snackbar.component\"\n v-for=\"snackbar of $ui.snackbars\"\n :id=\"snackbar.id\"\n :key=\"snackbar.id\"\n v-bind=\"snackbar.properties\"\n />\n </div>\n </div>\n</template>\n","<template>\n <div ref=\"$backdrop\" class=\"pointer-events-none fixed inset-0 z-50 bg-black/30 opacity-0\" />\n <AGAppModals />\n <AGAppSnackbars />\n</template>\n\n<script setup lang=\"ts\">\nimport { ref } from 'vue';\n\nimport { useEvent } from '@/utils/composition/events';\n\nimport AGAppModals from './AGAppModals.vue';\nimport AGAppSnackbars from './AGAppSnackbars.vue';\n\nconst $backdrop = ref<HTMLElement | null>(null);\nconst backdropHidden = ref(true);\n\nuseEvent('show-overlays-backdrop', async () => {\n if (!$backdrop.value || !backdropHidden.value) {\n return;\n }\n\n backdropHidden.value = false;\n\n $backdrop.value.classList.remove('opacity-0');\n});\n\nuseEvent('hide-overlays-backdrop', async () => {\n if (!$backdrop.value || backdropHidden.value) {\n return;\n }\n\n backdropHidden.value = true;\n\n $backdrop.value.classList.add('opacity-0');\n});\n</script>\n","<template>\n <AGMarkdown :text=\"message\" inline />\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\n\nimport Errors from '@/errors/Errors';\nimport { requiredObjectProp } from '@/utils/vue';\nimport type { ErrorSource } from '@/errors/Errors.state';\n\nimport AGMarkdown from './AGMarkdown.vue';\n\nconst props = defineProps({ error: requiredObjectProp<ErrorSource>() });\nconst message = computed(() => Errors.getErrorMessage(props.error));\n</script>\n","<template>\n <AGHeadlessInput ref=\"$input\" :name=\"name\" class=\"flex\">\n <AGHeadlessInputInput\n v-bind=\"$attrs\"\n type=\"checkbox\"\n :class=\"{\n 'text-indigo-600 focus:ring-indigo-600': !$input?.errors,\n 'border-red-200 text-red-600 focus:ring-red-600': $input?.errors,\n }\"\n />\n\n <div class=\"ml-2\">\n <AGHeadlessInputLabel v-if=\"$slots.default\">\n <slot />\n </AGHeadlessInputLabel>\n <AGHeadlessInputError class=\"text-sm text-red-600\" />\n </div>\n </AGHeadlessInput>\n</template>\n\n<script setup lang=\"ts\">\nimport { componentRef, stringProp } from '@/utils/vue';\n\nimport type { IAGHeadlessInput } from '@/components/headless/forms/AGHeadlessInput';\n\nimport AGHeadlessInput from '../headless/forms/AGHeadlessInput.vue';\nimport AGHeadlessInputError from '../headless/forms/AGHeadlessInputError.vue';\nimport AGHeadlessInputInput from '../headless/forms/AGHeadlessInputInput.vue';\nimport AGHeadlessInputLabel from '../headless/forms/AGHeadlessInputLabel.vue';\n\ndefineProps({ name: stringProp() });\ndefineOptions({ inheritAttrs: false });\n\nconst $input = componentRef<IAGHeadlessInput>();\n</script>\n","<template>\n <form @submit.prevent=\"submit\">\n <slot />\n </form>\n</template>\n\n<script setup lang=\"ts\">\nimport { provide } from 'vue';\n\nimport { objectProp } from '@/utils/vue';\nimport type Form from '@/forms/Form';\n\nconst props = defineProps({ form: objectProp<Form>() });\n\nconst emit = defineEmits<{ submit: [] }>();\n\nprovide('form', props.form);\n\nfunction submit() {\n if (props.form && !props.form.submit()) {\n return;\n }\n\n emit('submit');\n}\n</script>\n","<template>\n <AGHeadlessInput\n ref=\"$input\"\n class=\"relative flex flex-col items-center\"\n :class=\"className\"\n :name=\"name\"\n >\n <AGHeadlessInputInput\n v-bind=\"attrs\"\n class=\"block w-full border-0 py-1.5 text-gray-900 ring-1 ring-inset ring-gray-300 placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-indigo-600\"\n :class=\"{\n 'ring-1 ring-red-500': $input?.errors,\n }\"\n />\n <div class=\"absolute bottom-0 left-0 translate-y-full\">\n <AGHeadlessInputError class=\"mt-1 text-sm text-red-500\" />\n </div>\n </AGHeadlessInput>\n</template>\n\n<script setup lang=\"ts\">\nimport { componentRef, stringProp } from '@/utils/vue';\n\nimport { useInputAttrs } from '@/utils';\nimport type { IAGHeadlessInput } from '@/components/headless/forms/AGHeadlessInput';\n\nimport AGHeadlessInput from '../headless/forms/AGHeadlessInput.vue';\nimport AGHeadlessInputInput from '../headless/forms/AGHeadlessInputInput.vue';\nimport AGHeadlessInputError from '../headless/forms/AGHeadlessInputError.vue';\n\ndefineProps({ name: stringProp() });\ndefineOptions({ inheritAttrs: false });\n\nconst $input = componentRef<IAGHeadlessInput>();\nconst [attrs, className] = useInputAttrs();\n</script>\n","import { MagicObject } from '@noeldemartin/utils';\nimport { computed, reactive, readonly, ref } from 'vue';\nimport type { ObjectValues } from '@noeldemartin/utils';\nimport type { ComputedRef, DeepReadonly, Ref, UnwrapNestedRefs } from 'vue';\n\nexport const FormFieldTypes = {\n String: 'string',\n Number: 'number',\n Boolean: 'boolean',\n} as const;\n\nexport interface FormFieldDefinition<TType extends FormFieldType = FormFieldType, TRules extends string = string> {\n type: TType;\n default?: GetFormFieldValue<TType>;\n rules?: TRules;\n}\n\nexport type FormFieldDefinitions = Record<string, FormFieldDefinition>;\nexport type FormFieldType = ObjectValues<typeof FormFieldTypes>;\n\nexport type FormData<T> = {\n -readonly [k in keyof T]: T[k] extends FormFieldDefinition<infer TType, infer TRules>\n ? TRules extends 'required'\n ? GetFormFieldValue<TType>\n : GetFormFieldValue<TType> | null\n : never;\n};\n\nexport type FormErrors<T> = {\n [k in keyof T]: string[] | null;\n};\n\nexport type GetFormFieldValue<TType> = TType extends typeof FormFieldTypes.String\n ? string\n : TType extends typeof FormFieldTypes.Number\n ? number\n : TType extends typeof FormFieldTypes.Boolean\n ? boolean\n : never;\n\nexport default class Form<Fields extends FormFieldDefinitions = FormFieldDefinitions> extends MagicObject {\n\n public errors: DeepReadonly<UnwrapNestedRefs<FormErrors<Fields>>>;\n\n private _fields: Fields;\n private _data: FormData<Fields>;\n private _valid: ComputedRef<boolean>;\n private _submitted: Ref<boolean>;\n private _errors: FormErrors<Fields>;\n\n constructor(fields: Fields) {\n super();\n\n this._fields = fields;\n this._submitted = ref(false);\n this._data = this.getInitialData(fields);\n this._errors = this.getInitialErrors(fields);\n this._valid = computed(() => !Object.values(this._errors).some((error) => error !== null));\n\n this.errors = readonly(this._errors);\n }\n\n public get valid(): boolean {\n return this._valid.value;\n }\n\n public get submitted(): boolean {\n return this._submitted.value;\n }\n\n public setFieldValue<T extends keyof Fields>(field: T, value: FormData<Fields>[T]): void {\n this._data[field] = value;\n\n if (this._submitted.value) {\n this.validate();\n }\n }\n\n public getFieldValue<T extends keyof Fields>(field: T): GetFormFieldValue<Fields[T]['type']> {\n return this._data[field] as unknown as GetFormFieldValue<Fields[T]['type']>;\n }\n\n public validate(): boolean {\n const errors = Object.entries(this._fields).reduce((formErrors, [name, definition]) => {\n formErrors[name] = this.getFieldErrors(name, definition);\n\n return formErrors;\n }, {} as Record<string, string[] | null>);\n\n this.resetErrors(errors);\n\n return this.valid;\n }\n\n public reset(options: { keepData?: boolean; keepErrors?: boolean } = {}): void {\n this._submitted.value = false;\n\n options.keepData || this.resetData();\n options.keepErrors || this.resetErrors();\n }\n\n public submit(): boolean {\n this._submitted.value = true;\n\n return this.validate();\n }\n\n protected __get(property: string): unknown {\n if (!(property in this._fields)) {\n return super.__get(property);\n }\n\n return this._data[property];\n }\n\n protected __set(property: string, value: unknown): void {\n if (!(property in this._fields)) {\n super.__set(property, value);\n\n return;\n }\n\n Object.assign(this._data, { [property]: value });\n }\n\n private getFieldErrors(name: keyof Fields, definition: FormFieldDefinition): string[] | null {\n const errors = [];\n\n if (definition.rules?.includes('required') && !this._data[name]) {\n errors.push('required');\n }\n\n return errors.length > 0 ? errors : null;\n }\n\n private getInitialData(fields: Fields): FormData<Fields> {\n if (this.static().isConjuring()) {\n return {} as FormData<Fields>;\n }\n\n const data = Object.entries(fields).reduce((formData, [name, definition]) => {\n formData[name as keyof Fields] = (definition.default ?? null) as FormData<Fields>[keyof Fields];\n\n return formData;\n }, {} as FormData<Fields>);\n\n return reactive(data) as FormData<Fields>;\n }\n\n private getInitialErrors(fields: Fields): FormErrors<Fields> {\n if (this.static().isConjuring()) {\n return {} as FormErrors<Fields>;\n }\n\n const errors = Object.keys(fields).reduce((formErrors, name) => {\n formErrors[name as keyof Fields] = null;\n\n return formErrors;\n }, {} as FormErrors<Fields>);\n\n return reactive(errors) as FormErrors<Fields>;\n }\n\n private resetData(): void {\n for (const [name, field] of Object.entries(this._fields)) {\n this._data[name as keyof Fields] = (field.default ?? null) as FormData<Fields>[keyof Fields];\n }\n }\n\n private resetErrors(errors?: Record<string, string[] | null>): void {\n Object.keys(this._errors).forEach((key) => delete this._errors[key as keyof Fields]);\n\n errors && Object.assign(this._errors, errors);\n }\n\n}\n","import Form from '@/forms/Form';\nimport type { FormData, FormFieldDefinitions } from '@/forms/Form';\n\nexport function useForm<const T extends FormFieldDefinitions>(fields: T): Form<T> & FormData<T> {\n return new Form(fields) as Form<T> & FormData<T>;\n}\n","import { FormFieldTypes } from './Form';\nimport type { FormFieldDefinition } from './Form';\n\nexport function booleanInput(defaultValue?: boolean): FormFieldDefinition<typeof FormFieldTypes.Boolean> {\n return {\n default: defaultValue,\n type: FormFieldTypes.Boolean,\n };\n}\n\nexport function requiredBooleanInput(\n defaultValue?: boolean,\n): FormFieldDefinition<typeof FormFieldTypes.Boolean, 'required'> {\n return {\n default: defaultValue,\n type: FormFieldTypes.Boolean,\n rules: 'required',\n };\n}\n\nexport function requiredNumberInput(\n defaultValue?: number,\n): FormFieldDefinition<typeof FormFieldTypes.Number, 'required'> {\n return {\n default: defaultValue,\n type: FormFieldTypes.Number,\n rules: 'required',\n };\n}\n\nexport function requiredStringInput(\n defaultValue?: string,\n): FormFieldDefinition<typeof FormFieldTypes.String, 'required'> {\n return {\n default: defaultValue,\n type: FormFieldTypes.String,\n rules: 'required',\n };\n}\n\nexport function numberInput(defaultValue?: number): FormFieldDefinition<typeof FormFieldTypes.Number> {\n return {\n default: defaultValue,\n type: FormFieldTypes.Number,\n };\n}\n\nexport function stringInput(defaultValue?: string): FormFieldDefinition<typeof FormFieldTypes.String> {\n return {\n default: defaultValue,\n type: FormFieldTypes.String,\n };\n}\n"],"names":["ServiceBootError","JSError","constructor","serviceNamespace","cause","super","_store","initializePiniaStore","createPinia","setActivePinia","defineServiceState","options","_class","_defineProperty","Service","usesStore","getName","name","getInitialState","initialState","getComputedStateDefinition","computed","serializePersistedState","state","serialize","persist","MagicObject","this","getters","_name","_booted","PromisedValue","_computedStateKeys","Set","Object","keys","defineStore","booted","launch","handleError","error","reject","frameworkBoot","then","boot","resolve","catch","hasState","property","$state","has","getState","store","undefined","setState","stateOrProperty","value","assign","onStateUpdated","__get","__set","persisted","objectOnly","isEmpty","storage","Storage","require","set","objectDeepClone","restorePersistedState","EventsService","arguments","emit","event","payload","listeners","Promise","all","map","listener","on","arr","push","off","once","onceListener","tap","eventListeners","remove","Events","facade","Service$2","plugins","environment","Build","sourceUrl","isMounted","development","testing","AppService","plugin","App","definePlugin","async","installPlugins","_len","length","args","Array","_key","reduce","pluginsMap","install","arrayProp","defaultValue","type","default","booleanProp","Boolean","componentRef","ref","defineDirective","directive","enumProp","enumeration","values","String","validator","includes","injectReactive","key","inject","reactive","injectReactiveOrFail","errorMessage","fail","injectOrFail","mixedProp","numberProp","Number","objectProp","requiredArrayProp","required","requiredEnumProp","requiredMixedProp","requiredNumberProp","requiredObjectProp","requiredStringProp","stringProp","builtInDirectives","mounted","element","_ref","focus","directives","app","entries","defaultServices","$app","$events","bootServices","services","service","config","errorHandler","globalProperties","window","services$3","use","Service$1","modals","snackbars","UIComponents","AlertModal","ConfirmModal","ErrorReportModal","LoadingModal","Snackbar","UI","requireComponent","components","alert","messageOrTitle","message","title","openModal","confirm","modal","beforeClose","loading","messageOrOperation","operation","result","closeModal","id","showSnackbar","snackbar","uuid","properties","component","markRaw","concat","setTimeout","hideSnackbar","filter","registerComponent","callbacks","willClose","afterClose","closed","activeModal","at","modalCallbacks","nextTick","watchModalEvents","_ref2","m","Lang","provider","translate","console","warn","setProvider","parameters","translateWithDefault","defaultMessageOrParameters","defaultMessage","renderedMessage","replace","RegExp","toString","bind","logs","startupErrors","hasErrors","hasNewErrors","some","seen","hasStartupErrors","_ref3","Colors","Primary","Secondary","Danger","Clear","Errors","enable","enabled","disable","inspect","reports","isArray","createErrorReport","report","logError","startupError","createStartupErrorReport","log","date","Date","color","actions","text","dismiss","handler","see","seeAll","getErrorMessage","Error","isObject","createErrorReportFromError","objectWithoutEmpty","description","defaults","details","stack","$errors","setUpErrorHandler","baseHandler","instance","frameworkHandler","globalThis","onerror","_","__","___","onunhandledrejection","reason","errors","$lang","lang","$t","$td","useEvent","unsubscribe","onUnmounted","useInputAttrs","attrs","useAttrs","className","class","objectWithout","onCleanMounted","cleanUp","noop","onMounted","$root","hidden","hide","$el","close","show","__expose","cancellable","toRef","props","provide","childIndex","childModal","$headlessModal","renderMarkdown","markdown","html","marked","mangle","headerIds","renderer","Renderer","link","href","prototype","apply","DOMPurify","sanitize","ADD_ATTR","langKey","langParams","renderedHtml","inline","root","h","as","innerHTML","route","tag","to","params","routeParams","query","routeQuery","url","target","submit","colorClasses","join","errorReportModalProps","useErrorReportModalProps","summary","githubReportUrl","issueTitle","encodeURIComponent","issueBody","stringExcerpt","trim","buttons","iconComponent","IconCopy","navigator","clipboard","writeText","IconConsole","reportButtons","IconGitHub","totalReports","currentReport","activeReportIndex","form","publicApi","getFieldValue","modelValue","readonly","update","setFieldValue","input","$input","checked","SnackbarColors","snackbarProps","useSnackbarProps","styleClasses","action","$ui","ui","defaultComponents","AGAlertModal","AGConfirmModal","AGErrorReportModal","AGLoadingModal","AGSnackbar","forEach","bootstrapApplication","rootComponent","createApp","mount","_hoisted_2","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_Fragment","_renderList","_ctx","_createBlock","_resolveDynamicComponent","_mergeProps","$backdrop","backdropHidden","classList","add","FormFieldTypes","Form","fields","_fields","_submitted","_data","getInitialData","_errors","getInitialErrors","_valid","valid","submitted","field","validate","formErrors","definition","getFieldErrors","resetErrors","reset","keepData","resetData","keepErrors","rules","static","isConjuring","data","formData","useForm","booleanInput","requiredBooleanInput","requiredNumberInput","requiredStringInput","numberInput","stringInput"],"mappings":"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"}
|
package/noeldemartin.config.js
CHANGED
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aerogel/core",
|
|
3
3
|
"description": "The Lightest Solid",
|
|
4
|
-
"version": "0.0.0-next.
|
|
4
|
+
"version": "0.0.0-next.d824b40e5d06757cd9f47c9f771d916185df4f05",
|
|
5
5
|
"main": "dist/aerogel-core.cjs.js",
|
|
6
6
|
"module": "dist/aerogel-core.esm.js",
|
|
7
7
|
"types": "dist/aerogel-core.d.ts",
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
"scripts": {
|
|
10
10
|
"build": "rm dist -rf && npm run build:js && npm run build:types",
|
|
11
11
|
"build:js": "noeldemartin-build-javascript",
|
|
12
|
-
"build:types": "noeldemartin-build-types",
|
|
12
|
+
"build:types": "noeldemartin-build-types && cp src/types/virtual.d.ts dist",
|
|
13
13
|
"lint": "noeldemartin-lint src",
|
|
14
14
|
"publish-next": "noeldemartin-publish-next",
|
|
15
15
|
"test": "vitest --run"
|
|
@@ -33,9 +33,10 @@
|
|
|
33
33
|
},
|
|
34
34
|
"dependencies": {
|
|
35
35
|
"@headlessui/vue": "^1.7.14",
|
|
36
|
-
"@noeldemartin/utils": "0.4.0-next.
|
|
36
|
+
"@noeldemartin/utils": "0.4.0-next.2549ce58d5c94a6009ecdd37d6fe2fcd76b6038e",
|
|
37
37
|
"dompurify": "^3.0.3",
|
|
38
38
|
"marked": "^5.0.4",
|
|
39
|
+
"pinia": "^2.1.6",
|
|
39
40
|
"vue": "^3.3.0"
|
|
40
41
|
},
|
|
41
42
|
"devDependencies": {
|
package/src/bootstrap/index.ts
CHANGED
|
@@ -2,16 +2,20 @@ import { createApp } from 'vue';
|
|
|
2
2
|
import type { Component } from 'vue';
|
|
3
3
|
|
|
4
4
|
import directives from '@/directives';
|
|
5
|
+
import errors from '@/errors';
|
|
6
|
+
import Events from '@/services/Events';
|
|
5
7
|
import lang from '@/lang';
|
|
6
8
|
import services from '@/services';
|
|
7
9
|
import ui from '@/ui';
|
|
10
|
+
import { installPlugins } from '@/plugins';
|
|
8
11
|
import type { AerogelOptions } from '@/bootstrap/options';
|
|
9
12
|
|
|
10
13
|
export async function bootstrapApplication(rootComponent: Component, options: AerogelOptions = {}): Promise<void> {
|
|
11
|
-
const plugins = [directives, lang, services, ui, ...(options.plugins ?? [])];
|
|
14
|
+
const plugins = [directives, errors, lang, services, ui, ...(options.plugins ?? [])];
|
|
12
15
|
const app = createApp(rootComponent);
|
|
13
16
|
|
|
14
|
-
await
|
|
17
|
+
await installPlugins(plugins, app, options);
|
|
15
18
|
|
|
16
19
|
app.mount('#app');
|
|
20
|
+
Events.emit('application-mounted');
|
|
17
21
|
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<aside v-if="modal">
|
|
3
|
+
<AGModalContext :child-index="1" :modal="modal" />
|
|
4
|
+
</aside>
|
|
5
|
+
</template>
|
|
6
|
+
|
|
7
|
+
<script setup lang="ts">
|
|
8
|
+
import { computed } from 'vue';
|
|
9
|
+
|
|
10
|
+
import UI from '@/ui/UI';
|
|
11
|
+
|
|
12
|
+
import AGModalContext from './modals/AGModalContext.vue';
|
|
13
|
+
|
|
14
|
+
const modal = computed(() => UI.modals[0] ?? null);
|
|
15
|
+
</script>
|
|
@@ -1,21 +1,19 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<div ref="$backdrop" class="pointer-events-none fixed inset-0 z-50 bg-black/30 opacity-0" />
|
|
3
|
-
<
|
|
4
|
-
|
|
5
|
-
</aside>
|
|
3
|
+
<AGAppModals />
|
|
4
|
+
<AGAppSnackbars />
|
|
6
5
|
</template>
|
|
7
6
|
|
|
8
7
|
<script setup lang="ts">
|
|
9
|
-
import {
|
|
8
|
+
import { ref } from 'vue';
|
|
10
9
|
|
|
11
|
-
import UI from '@/ui/UI';
|
|
12
10
|
import { useEvent } from '@/utils/composition/events';
|
|
13
11
|
|
|
14
|
-
import
|
|
12
|
+
import AGAppModals from './AGAppModals.vue';
|
|
13
|
+
import AGAppSnackbars from './AGAppSnackbars.vue';
|
|
15
14
|
|
|
16
15
|
const $backdrop = ref<HTMLElement | null>(null);
|
|
17
16
|
const backdropHidden = ref(true);
|
|
18
|
-
const modal = computed(() => UI.modals[0] ?? null);
|
|
19
17
|
|
|
20
18
|
useEvent('show-overlays-backdrop', async () => {
|
|
21
19
|
if (!$backdrop.value || !backdropHidden.value) {
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div aria-live="assertive" class="z-60 pointer-events-none fixed inset-0 flex items-end px-4 py-6 sm:p-6">
|
|
3
|
+
<div class="flex w-full flex-col items-center space-y-4 sm:items-end">
|
|
4
|
+
<component
|
|
5
|
+
:is="snackbar.component"
|
|
6
|
+
v-for="snackbar of $ui.snackbars"
|
|
7
|
+
:id="snackbar.id"
|
|
8
|
+
:key="snackbar.id"
|
|
9
|
+
v-bind="snackbar.properties"
|
|
10
|
+
/>
|
|
11
|
+
</div>
|
|
12
|
+
</div>
|
|
13
|
+
</template>
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<AGMarkdown :text="message" inline />
|
|
3
|
+
</template>
|
|
4
|
+
|
|
5
|
+
<script setup lang="ts">
|
|
6
|
+
import { computed } from 'vue';
|
|
7
|
+
|
|
8
|
+
import Errors from '@/errors/Errors';
|
|
9
|
+
import { requiredObjectProp } from '@/utils/vue';
|
|
10
|
+
import type { ErrorSource } from '@/errors/Errors.state';
|
|
11
|
+
|
|
12
|
+
import AGMarkdown from './AGMarkdown.vue';
|
|
13
|
+
|
|
14
|
+
const props = defineProps({ error: requiredObjectProp<ErrorSource>() });
|
|
15
|
+
const message = computed(() => Errors.getErrorMessage(props.error));
|
|
16
|
+
</script>
|