@aerogel/core 0.0.0-next.926bde19326fe7b6b24b277666936862b64d8295 → 0.0.0-next.b85327579d32f21c6a9fa21142f0165cdd320d7e

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/dist/aerogel-core.cjs.js +1 -1
  2. package/dist/aerogel-core.d.ts +213 -53
  3. package/dist/aerogel-core.esm.js +1 -1
  4. package/package.json +2 -1
  5. package/src/bootstrap/index.ts +4 -1
  6. package/src/components/basic/AGMarkdown.vue +3 -3
  7. package/src/components/forms/AGButton.vue +21 -8
  8. package/src/components/forms/AGCheckbox.vue +35 -0
  9. package/src/components/forms/AGInput.vue +8 -4
  10. package/src/components/forms/index.ts +2 -1
  11. package/src/components/headless/forms/AGHeadlessButton.vue +3 -4
  12. package/src/components/headless/forms/AGHeadlessInput.ts +2 -2
  13. package/src/components/headless/forms/AGHeadlessInput.vue +3 -3
  14. package/src/components/headless/forms/AGHeadlessInputError.vue +1 -1
  15. package/src/components/headless/forms/AGHeadlessInputInput.vue +15 -3
  16. package/src/components/headless/modals/AGHeadlessModalPanel.vue +5 -1
  17. package/src/components/modals/AGLoadingModal.vue +19 -0
  18. package/src/components/modals/AGModal.vue +20 -2
  19. package/src/components/modals/index.ts +2 -1
  20. package/src/errors/Errors.state.ts +31 -0
  21. package/src/errors/Errors.ts +132 -0
  22. package/src/errors/index.ts +21 -0
  23. package/src/forms/Form.ts +12 -9
  24. package/src/forms/utils.ts +17 -0
  25. package/src/lang/Lang.ts +11 -3
  26. package/src/lang/index.ts +3 -5
  27. package/src/lang/utils.ts +4 -0
  28. package/src/main.ts +1 -0
  29. package/src/services/App.state.ts +3 -0
  30. package/src/services/App.ts +11 -1
  31. package/src/services/Service.ts +126 -44
  32. package/src/services/index.ts +18 -4
  33. package/src/services/store.ts +27 -0
  34. package/src/ui/UI.state.ts +1 -0
  35. package/src/ui/UI.ts +15 -0
  36. package/src/ui/index.ts +3 -1
  37. package/src/utils/composition/forms.ts +11 -0
  38. package/src/utils/index.ts +1 -0
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),require("core-js/modules/esnext.async-iterator.map.js"),require("core-js/modules/esnext.iterator.map.js");var e=require("vue");require("core-js/modules/esnext.async-iterator.for-each.js"),require("core-js/modules/esnext.iterator.constructor.js"),require("core-js/modules/esnext.iterator.for-each.js");var t=require("@noeldemartin/utils"),r=require("@babel/runtime/helpers/defineProperty");require("core-js/modules/esnext.async-iterator.reduce.js"),require("core-js/modules/esnext.iterator.reduce.js"),require("core-js/modules/esnext.string.at.js"),require("core-js/modules/esnext.async-iterator.filter.js"),require("core-js/modules/esnext.iterator.filter.js");var o=require("@headlessui/vue"),s=require("dompurify"),n=require("marked");function a(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}require("core-js/modules/esnext.async-iterator.some.js"),require("core-js/modules/esnext.iterator.some.js");var l=a(r),i=a(s);function u(e){return e}function d(){return{type:Boolean,default:arguments.length>0&&void 0!==arguments[0]&&arguments[0]}}function c(){return e.ref()}function p(e){return e}function m(t){const r=e.inject(t);return r?e.reactive(r):void 0}function f(e,r){return m(e)??t.fail(r??`Could not resolve '${e}' injection key`)}function v(){return{type:Object,default:arguments.length>0&&void 0!==arguments[0]?arguments[0]:null}}function h(){return{type:Number,required:!0}}function _(){return{type:Object,required:!0}}function x(){return{type:String,required:!0}}function g(){return{type:String,default:arguments.length>0&&void 0!==arguments[0]?arguments[0]:null}}const b={"initial-focus":{mounted(e,t){let{value:r}=t;!1!==r&&e.focus()}}};var y={install(e){Object.entries(b).forEach((t=>{let[r,o]=t;return e.directive(r,o)}))}};class ServiceBootError extends t.JSError{constructor(e,t){super(`Service '${e}' failed booting`,{cause:t})}}function k(e){return class extends A{getInitialState(){return e.initialState}getComputedStateDefinition(){return e.computed??{}}}}class A extends t.MagicObject{constructor(){super(),l.default(this,"_namespace",void 0),l.default(this,"_booted",void 0),l.default(this,"_state",void 0),l.default(this,"_computedState",void 0),this._namespace=new.target.name,this._booted=new t.PromisedValue,this._state=e.reactive(this.getInitialState()),this._computedState=Object.entries(this.getComputedStateDefinition()).reduce(((t,r)=>{let[o,s]=r;return t[o]=e.computed((()=>s(this._state))),t}),{})}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 C=k({initialState:{environment:__AG_ENV},computed:{isDevelopment:e=>"development"===e.environment}});class w extends C{}var G=t.facade(new w);class S extends A{constructor(){super(...arguments),l.default(this,"listeners",{})}async emit(e,t){const r=[...this.listeners[e]??[]];await Promise.all(r.map((e=>e(t)))??[])}on(e,r){return(this.listeners[e]??=t.arr([])).push(r),()=>this.off(e,r)}once(e,r){let o=null;return t.tap((()=>o&&this.off(e,o)),(s=>{(this.listeners[e]??=t.arr([])).push(o=function(){return s(),r(...arguments)})}))}off(e,t){const r=this.listeners[e];r&&(r.remove(t),r.isEmpty()&&delete this.listeners[e])}}var j=t.facade(new S);const B={$app:G,$events:j};async function M(e,t){await Promise.all(Object.entries(t).map((async e=>{let[t,r]=e;await r.launch(t.slice(1)).catch((e=>console.error(e)))}))),Object.assign(e.config.globalProperties,t)}var I={async install(e){await M(e,B)}};var q=t.facade(new class extends A{constructor(){super(),l.default(this,"provider",void 0),this.provider={translate:e=>(G.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,r){r??=t;const o="string"==typeof t?{}:t,s=this.provider.translate(e,o)??e;return s===e?r:s}});const P={$lang:q},E=q.translate.bind(q),$=q.translateWithDefault.bind(q);var H={async install(e){e.config.globalProperties.$t??=E,e.config.globalProperties.$td=$,await M(e,P)}},V=k({initialState:{modals:[]}});const N={AlertModal:"alert-modal",ConfirmModal:"confirm-modal"};var O=t.facade(new class extends V{constructor(){super(...arguments),l.default(this,"modalCallbacks",{}),l.default(this,"components",{})}alert(e,t){const r="string"==typeof t?{title:e,message:t}:{message:e};this.openModal(this.requireComponent(N.AlertModal),r)}async confirm(e,t){const r="string"==typeof t?{title:e,message:t}:{message:e},o=await this.openModal(this.requireComponent(N.ConfirmModal),r);return await o.beforeClose??!1}registerComponent(e,t){this.components[e]=t}async openModal(r,o){const s=t.uuid(),n={},a={id:s,properties:o??{},component:e.markRaw(r),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 e.nextTick(),await(l&&j.emit("hide-modal",{id:l.id})),await Promise.all([l||j.emit("show-overlays-backdrop"),j.emit("show-modal",{id:a.id})]),a}async closeModal(e,t){await j.emit("close-modal",{id:e,result:t})}async boot(){await super.boot(),this.watchModalEvents()}requireComponent(e){return this.components[e]??t.fail(`UI Component '${e}' is not defined!`)}watchModalEvents(){j.on("modal-will-close",(e=>{let{modal:t,result:r}=e;this.modalCallbacks[t.id]?.willClose?.(r),1===this.modals.length&&j.emit("hide-overlays-backdrop")})),j.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 o=this.modals.at(-1);await(o&&j.emit("show-modal",{id:o.id}))}))}});function D(t,r){const o=j.on(t,r);e.onUnmounted((()=>o()))}var F=e.defineComponent({__name:"AGHeadlessModal",props:{cancellable:d(!0)},setup(t,{expose:r}){const s=t,n=e.ref(null),a=e.ref(!0),l=e.ref(!1),{modal:i}=f("modal","could not obtain modal reference from <AGHeadlessModal>, did you render this component manually? Show it using $ui.openModal() instead");async function u(){n.value?.$el&&(a.value=!0)}async function d(e){l.value||(j.emit("modal-will-close",{modal:i,result:e}),await u(),l.value=!0,j.emit("modal-closed",{modal:i,result:e}))}return D("close-modal",(async({id:e,result:t})=>{e===i.id&&await d(t)})),D("hide-modal",(async({id:e})=>{e===i.id&&await u()})),D("show-modal",(async({id:e})=>{e===i.id&&await async function(){n.value?.$el&&(a.value=!1)}()})),r({close:d,cancellable:e.toRef(s,"cancellable")}),(r,s)=>(e.openBlock(),e.createBlock(e.unref(o.Dialog),{ref_key:"$root",ref:n,open:!0,onClose:s[0]||(s[0]=e=>t.cancellable&&d())},{default:e.withCtx((()=>[e.renderSlot(r.$slots,"default",{close:d})])),_:3},512))}});F.__file="src/components/headless/modals/AGHeadlessModal.vue";var L=e.defineComponent({__name:"AGModalContext",props:{modal:_(),childIndex:h()},setup(t){const r=t;return e.provide("modal",{modal:e.toRef(r,"modal"),childIndex:e.toRef(r,"childIndex")}),(r,o)=>(e.openBlock(),e.createBlock(e.resolveDynamicComponent(t.modal.component),e.normalizeProps(e.guardReactiveProps(t.modal.properties)),null,16))}});L.__file="src/components/modals/AGModalContext.vue";var T=e.defineComponent({__name:"AGHeadlessModalPanel",setup(t){const r=f("modal","could not obtain modal reference from <AGHeadlessModalPanel>, did you render this component manually? Show it using $ui.openModal() instead"),s=e.computed((()=>O.modals[r.childIndex]??null));return(t,n)=>(e.openBlock(),e.createBlock(e.unref(o.DialogPanel),null,{default:e.withCtx((()=>[e.renderSlot(t.$slots,"default"),s.value?(e.openBlock(),e.createBlock(L,{key:0,"child-index":e.unref(r).childIndex+1,modal:s.value},null,8,["child-index","modal"])):e.createCommentVNode("v-if",!0)])),_:3}))}});T.__file="src/components/headless/modals/AGHeadlessModalPanel.vue";const R={class:"fixed inset-0 flex items-center justify-center"},z={class:"flex max-h-full flex-col overflow-auto p-4"};var U=e.defineComponent({__name:"AGModal",setup:t=>(t,r)=>(e.openBlock(),e.createBlock(F,{class:"relative z-50"},{default:e.withCtx((({close:r})=>[e.createElementVNode("div",R,[e.createVNode(T,{class:"flex max-h-full max-w-full flex-col overflow-hidden bg-white"},{default:e.withCtx((()=>[e.createElementVNode("div",z,[e.renderSlot(t.$slots,"default",{close:r})])])),_:2},1024)])])),_:3}))});function K(e){return t=n.marked(e,{mangle:!1,headerIds:!1}),i.default.sanitize(t,{ADD_ATTR:["target"]});var t}U.__file="src/components/modals/AGModal.vue";var W=e.defineComponent({__name:"AGMarkdown",props:{as:g("div"),langKey:g(),text:g(),inline:d(),raw:d()},setup(t){const r=t,o=e.computed((()=>r.text??(r.langKey&&E(r.langKey)))),s=e.computed((()=>{if(!o.value)return null;let e=K(o.value);return r.inline&&(e=e.replace("<p>","<span>").replace("</p>","</span>")),e})),n=()=>e.h(r.as,{class:r.raw?"":"prose",innerHTML:s.value});return(t,r)=>(e.openBlock(),e.createBlock(n))}});W.__file="src/components/basic/AGMarkdown.vue";var Q=e.defineComponent({__name:"AGAlertModal",props:{title:g(),message:x()},setup:t=>(r,o)=>(e.openBlock(),e.createBlock(U,null,{default:e.withCtx((()=>[t.title?(e.openBlock(),e.createBlock(W,{key:0,text:t.title,as:"h2",class:"font-semibold",raw:"",inline:""},null,8,["text"])):e.createCommentVNode("v-if",!0),e.createVNode(W,{text:t.message},null,8,["text"])])),_:1}))});Q.__file="src/components/modals/AGAlertModal.vue";var J=e.defineComponent({__name:"AGHeadlessButton",props:{url:g(),route:g(),routeParams:v((()=>({}))),routeQuery:v((()=>({}))),submit:d()},setup(r){const{url:o,route:s,routeParams:n,routeQuery:a,submit:l}=r,i=e.computed((()=>s?{tag:"router-link",props:{to:t.objectWithoutEmpty({name:s,params:n,query:a})}}:o?{tag:"a",props:{target:"_blank",href:o}}:{tag:"button",props:{type:l?"submit":"button"}}));return(t,r)=>(e.openBlock(),e.createBlock(e.resolveDynamicComponent(i.value.tag),e.normalizeProps(e.guardReactiveProps(i.value.props)),{default:e.withCtx((()=>[e.renderSlot(t.$slots,"default")])),_:3},16))}});J.__file="src/components/headless/forms/AGHeadlessButton.vue";var X=e.defineComponent({__name:"AGButton",props:{secondary:d()},setup:t=>(r,o)=>(e.openBlock(),e.createBlock(J,{class:e.normalizeClass(["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":!t.secondary,"bg-gray-600 hover:bg-gray-500 focus-visible:outline-gray-600":t.secondary}])},{default:e.withCtx((()=>[e.renderSlot(r.$slots,"default")])),_:3},8,["class"]))});X.__file="src/components/forms/AGButton.vue";const Y={class:"mt-2 flex flex-row-reverse gap-2"};var Z=e.defineComponent({__name:"AGConfirmModal",props:{title:g(),message:x()},setup:t=>(r,o)=>(e.openBlock(),e.createBlock(U,{cancellable:!1},{default:e.withCtx((({close:o})=>[t.title?(e.openBlock(),e.createBlock(W,{key:0,text:t.title,as:"h1"},null,8,["text"])):e.createCommentVNode("v-if",!0),e.createVNode(W,{text:t.message},null,8,["text"]),e.createElementVNode("div",Y,[e.createVNode(X,{onClick:e=>o(!0)},{default:e.withCtx((()=>[e.createTextVNode(e.toDisplayString(r.$td("ui.ok","OK")),1)])),_:2},1032,["onClick"]),e.createVNode(X,{secondary:"",onClick:e=>o()},{default:e.withCtx((()=>[e.createTextVNode(e.toDisplayString(r.$td("ui.cancel","Cancel")),1)])),_:2},1032,["onClick"])])])),_:1}))});Z.__file="src/components/modals/AGConfirmModal.vue";const ee={$ui:O};var te={async install(e,t){const r={[N.AlertModal]:Q,[N.ConfirmModal]:Z};Object.entries({...r,...t.components}).forEach((e=>{let[t,r]=e;return O.registerComponent(t,r)})),await M(e,ee)}};const re={key:0};var oe=e.defineComponent({__name:"AGAppOverlays",setup(t){const r=e.ref(null),o=e.ref(!0),s=e.computed((()=>O.modals[0]??null));return D("show-overlays-backdrop",(async()=>{r.value&&o.value&&(o.value=!1,r.value.classList.remove("opacity-0"))})),D("hide-overlays-backdrop",(async()=>{r.value&&!o.value&&(o.value=!0,r.value.classList.add("opacity-0"))})),(t,o)=>(e.openBlock(),e.createElementBlock(e.Fragment,null,[e.createElementVNode("div",{ref_key:"$backdrop",ref:r,class:"pointer-events-none fixed inset-0 z-50 bg-black/30 opacity-0"},null,512),s.value?(e.openBlock(),e.createElementBlock("aside",re,[e.createVNode(L,{"child-index":1,modal:s.value},null,8,["modal"])])):e.createCommentVNode("v-if",!0)],64))}});oe.__file="src/components/AGAppOverlays.vue";const se={class:"flex h-full flex-col text-base font-normal leading-tight text-gray-900 antialiased"};var ne=e.defineComponent({__name:"AGAppLayout",setup:t=>(t,r)=>(e.openBlock(),e.createElementBlock("div",se,[e.renderSlot(t.$slots,"default"),e.createVNode(oe)]))});ne.__file="src/components/AGAppLayout.vue";const ae=["onSubmit"];var le=e.defineComponent({__name:"AGForm",props:{form:v()},emits:["submit"],setup(t,{emit:r}){const o=t;function s(){o.form&&!o.form.submit()||r("submit")}return e.provide("form",o.form),(t,r)=>(e.openBlock(),e.createElementBlock("form",{onSubmit:e.withModifiers(s,["prevent"])},[e.renderSlot(t.$slots,"default")],40,ae))}});le.__file="src/components/forms/AGForm.vue";var ie=e.defineComponent({__name:"AGHeadlessInput",props:{as:g(),name:g(),modelValue:g()},emits:["update:modelValue"],setup(r,{expose:o,emit:s}){const n=r,a=e.computed((()=>l&&n.name?l.errors[n.name]??null:null)),l=e.inject("form",null),i={id:`input-${t.uuid()}`,value:e.computed((()=>l&&n.name?l.getFieldValue(n.name):n.modelValue)),errors:e.readonly(a),update(e){l&&n.name?l.setFieldValue(n.name,e):s("update:modelValue",e)}};return e.provide("input",i),o(i),(t,o)=>r.as?(e.openBlock(),e.createBlock(e.resolveDynamicComponent(r.as),{key:0},{default:e.withCtx((()=>[e.renderSlot(t.$slots,"default")])),_:3})):e.renderSlot(t.$slots,"default",{key:1})}});ie.__file="src/components/headless/forms/AGHeadlessInput.vue";const ue=["id","value","aria-invalid","aria-describedby"];var de=e.defineComponent({__name:"AGHeadlessInputInput",setup(t){const r=e.ref(),o=f("input","<AGHeadlessInputInput> must be a child of a <AGHeadlessInput>"),s=e.computed((()=>o.value));function n(){r.value&&o.update(r.value.value)}return(t,a)=>(e.openBlock(),e.createElementBlock("input",{id:e.unref(o).id,ref_key:"$input",ref:r,type:"text",value:s.value,"aria-invalid":e.unref(o).errors?"true":"false","aria-describedby":e.unref(o).errors?`${e.unref(o).id}-error`:void 0,onInput:n},null,40,ue))}});de.__file="src/components/headless/forms/AGHeadlessInputInput.vue";const ce=["id"];var pe=e.defineComponent({__name:"AGHeadlessInputError",setup(t){const r=f("input","<AGHeadlessInputError> must be a child of a <AGHeadlessInput>"),o=e.computed((()=>r.errors?$(`errors.${r.errors[0]}`,`Error: ${r.errors[0]}`):null));return(t,s)=>o.value?(e.openBlock(),e.createElementBlock("p",{key:0,id:`${e.unref(r).id}-error`},e.toDisplayString(o.value),9,ce)):e.createCommentVNode("v-if",!0)}});pe.__file="src/components/headless/forms/AGHeadlessInputError.vue";var me=e.defineComponent({inheritAttrs:!1,__name:"AGInput",props:{name:g()},setup(t){const r=c();return(o,s)=>(e.openBlock(),e.createBlock(ie,{ref_key:"$input",ref:r,as:"div",class:"flex flex-col items-center",name:t.name},{default:e.withCtx((()=>[e.createVNode(de,e.mergeProps(o.$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":e.unref(r)?.errors}]}),null,16,["class"]),e.createVNode(pe,{class:"mt-1 text-sm text-red-500"})])),_:1},8,["name"]))}});me.__file="src/components/forms/AGInput.vue";const fe=["for"];var ve=e.defineComponent({__name:"AGHeadlessInputLabel",setup(t){const r=f("input","<AGHeadlessInputLabel> must be a child of a <AGHeadlessInput>");return(t,o)=>(e.openBlock(),e.createElementBlock("label",{for:e.unref(r).id},[e.renderSlot(t.$slots,"default")],8,fe))}});ve.__file="src/components/headless/forms/AGHeadlessInputLabel.vue";var he=e.defineComponent({__name:"AGHeadlessModalTitle",props:{as:g("h2")},setup:t=>(r,s)=>(e.openBlock(),e.createBlock(e.unref(o.DialogTitle),{as:t.as},{default:e.withCtx((()=>[e.renderSlot(r.$slots,"default")])),_:3},8,["as"]))});he.__file="src/components/headless/modals/AGHeadlessModalTitle.vue";const _e={String:"string",Number:"number"};class xe extends t.MagicObject{constructor(t){super(),l.default(this,"errors",void 0),l.default(this,"_fields",void 0),l.default(this,"_data",void 0),l.default(this,"_valid",void 0),l.default(this,"_submitted",void 0),l.default(this,"_errors",void 0),this._fields=t,this._submitted=e.ref(!1),this._data=this.getInitialData(t),this._errors=this.getInitialErrors(t),this._valid=e.computed((()=>!Object.values(this._errors).some((e=>null!==e)))),this.errors=e.readonly(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,o]=t;return e[r]=this.getFieldErrors(r,o),e}),{});return this.resetErrors(e),this.valid}reset(){this._submitted.value=!1,this.resetData(),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(t){if(this.static().isConjuring())return{};const r=Object.entries(t).reduce(((e,t)=>{let[r,o]=t;return e[r]=o.default??null,e}),{});return e.reactive(r)}getInitialErrors(t){if(this.static().isConjuring())return{};const r=Object.keys(t).reduce(((e,t)=>(e[t]=null,e)),{});return e.reactive(r)}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)}}exports.AGAlertModal=Q,exports.AGAppLayout=ne,exports.AGAppOverlays=oe,exports.AGButton=X,exports.AGConfirmModal=Z,exports.AGForm=le,exports.AGHeadlessButton=J,exports.AGHeadlessInput=ie,exports.AGHeadlessInputError=pe,exports.AGHeadlessInputInput=de,exports.AGHeadlessInputLabel=ve,exports.AGHeadlessModal=F,exports.AGHeadlessModalPanel=T,exports.AGHeadlessModalTitle=he,exports.AGInput=me,exports.AGMarkdown=W,exports.AGModal=U,exports.AGModalContext=L,exports.App=G,exports.AppService=w,exports.Events=j,exports.EventsService=S,exports.FormFieldTypes=_e,exports.Lang=q,exports.Service=A,exports.UI=O,exports.UIComponents=N,exports.arrayProp=function(e){return{type:Array,default:e??(()=>[])}},exports.booleanProp=d,exports.bootServices=M,exports.bootstrapApplication=async function(t){let r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const o=[y,H,I,te,...r.plugins??[]],s=e.createApp(t);await Promise.all(o.map((e=>e.install(s,r)))??[]),s.mount("#app")},exports.componentRef=c,exports.defineDirective=p,exports.definePlugin=u,exports.defineServiceState=k,exports.enumProp=function(e,t){const r=Object.values(e);return{type:String,default:t??r[0]??null,validator:e=>r.includes(e)}},exports.injectOrFail=function(r,o){return e.inject(r)??t.fail(o??`Could not resolve '${r}' injection key`)},exports.injectReactive=m,exports.injectReactiveOrFail=f,exports.mixedProp=function(e){return{type:e,default:null}},exports.numberInput=function(e){return{default:e,type:_e.Number}},exports.numberProp=function(){return{type:Number,default:arguments.length>0&&void 0!==arguments[0]?arguments[0]:null}},exports.objectProp=v,exports.onCleanMounted=function(r){let o=t.noop;e.onMounted((()=>o=r())),e.onUnmounted((()=>o()))},exports.requiredArrayProp=function(){return{type:Array,required:!0}},exports.requiredEnumProp=function(e){const t=Object.values(e);return{type:String,required:!0,validator:e=>t.includes(e)}},exports.requiredMixedProp=function(e){return{type:e,required:!0}},exports.requiredNumberInput=function(e){return{default:e,type:_e.Number,rules:"required"}},exports.requiredNumberProp=h,exports.requiredObjectProp=_,exports.requiredStringInput=function(e){return{default:e,type:_e.String,rules:"required"}},exports.requiredStringProp=x,exports.stringInput=function(e){return{default:e,type:_e.String}},exports.stringProp=g,exports.translate=E,exports.translateWithDefault=$,exports.useEvent=D,exports.useForm=function(e){return new xe(e)};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),require("core-js/modules/esnext.async-iterator.map.js"),require("core-js/modules/esnext.iterator.map.js");var e=require("vue");require("core-js/modules/esnext.async-iterator.for-each.js"),require("core-js/modules/esnext.iterator.constructor.js"),require("core-js/modules/esnext.iterator.for-each.js");var t=require("@noeldemartin/utils"),r=require("@babel/runtime/helpers/defineProperty");require("core-js/modules/esnext.set.add-all.js"),require("core-js/modules/esnext.set.delete-all.js"),require("core-js/modules/esnext.set.difference.js"),require("core-js/modules/esnext.set.every.js"),require("core-js/modules/esnext.set.filter.js"),require("core-js/modules/esnext.set.find.js"),require("core-js/modules/esnext.set.intersection.js"),require("core-js/modules/esnext.set.is-disjoint-from.js"),require("core-js/modules/esnext.set.is-subset-of.js"),require("core-js/modules/esnext.set.is-superset-of.js"),require("core-js/modules/esnext.set.join.js"),require("core-js/modules/esnext.set.map.js"),require("core-js/modules/esnext.set.reduce.js"),require("core-js/modules/esnext.set.some.js"),require("core-js/modules/esnext.set.symmetric-difference.js"),require("core-js/modules/esnext.set.union.js");var o=require("pinia");require("core-js/modules/esnext.string.at.js"),require("core-js/modules/esnext.async-iterator.filter.js"),require("core-js/modules/esnext.iterator.filter.js"),require("core-js/modules/esnext.async-iterator.reduce.js"),require("core-js/modules/esnext.iterator.reduce.js"),require("core-js/modules/esnext.async-iterator.some.js"),require("core-js/modules/esnext.iterator.some.js");var s=require("@headlessui/vue"),n=require("dompurify"),a=require("marked");function l(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var i=l(r),u=l(n);function c(e){return e}function d(){return{type:Boolean,default:arguments.length>0&&void 0!==arguments[0]&&arguments[0]}}function p(){return e.ref()}function m(e){return e}function f(t){const r=e.inject(t);return r?e.reactive(r):void 0}function h(e,r){return f(e)??t.fail(r??`Could not resolve '${e}' injection key`)}function v(e){return{type:e,default:null}}function g(){return{type:Object,default:arguments.length>0&&void 0!==arguments[0]?arguments[0]:null}}function x(){return{type:Number,required:!0}}function _(){return{type:Object,required:!0}}function b(){return{type:String,required:!0}}function y(){return{type:String,default:arguments.length>0&&void 0!==arguments[0]?arguments[0]:null}}const k={"initial-focus":{mounted(e,t){let{value:r}=t;!1!==r&&e.focus()}}};var j={install(e){Object.entries(k).forEach((t=>{let[r,o]=t;return e.directive(r,o)}))}};class ServiceBootError extends t.JSError{constructor(e,t){super(`Service '${e}' failed booting`,{cause:t})}}let A=null;function S(){return A||(A=o.createPinia(),o.setActivePinia(A)),A}function w(e){var t;return t=class extends C{usesStore(){return!0}getName(){return e.name??null}getInitialState(){return e.initialState}getComputedStateDefinition(){return e.computed??{}}serializePersistedState(t){return e.serialize?.(t)??t}},i.default(t,"persist",e.persist??[]),t}class C extends t.MagicObject{constructor(){super(),i.default(this,"_name",void 0),i.default(this,"_booted",void 0),i.default(this,"_computedStateKeys",void 0),i.default(this,"_store",void 0);const e=this.getComputedStateDefinition();var r,s;this._name=this.getName()??new.target.name,this._booted=new t.PromisedValue,this._computedStateKeys=new Set(Object.keys(e)),this._store=this.usesStore()&&(r=this._name,s={state:()=>this.getInitialState(),getters:e},S(),o.defineStore(r,s)())}get booted(){return this._booted}launch(){const handleError=e=>this._booted.reject(new ServiceBootError(this._name,e));try{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 r=this.constructor.persist,o=t.objectOnly(e,r);if(t.isEmpty(o))return;const s=t.Storage.require(this._name);t.Storage.set(this._name,{...s,...this.serializePersistedState(t.objectDeepClone(o))})}usesStore(){return!1}getName(){return null}getInitialState(){return{}}getComputedStateDefinition(){return{}}serializePersistedState(e){return e}async boot(){this.restorePersistedState()}restorePersistedState(){const e=this.constructor.persist;if(this.usesStore()&&!t.isEmpty(e))if(t.Storage.has(this._name)){const e=t.Storage.require(this._name);this.setState(e)}else t.Storage.set(this._name,t.objectOnly(this.getState(),e))}}i.default(C,"persist",[]);class E extends C{constructor(){super(...arguments),i.default(this,"listeners",{})}async emit(e,t){const r=[...this.listeners[e]??[]];await Promise.all(r.map((e=>e(t)))??[])}on(e,r){return(this.listeners[e]??=t.arr([])).push(r),()=>this.off(e,r)}once(e,r){let o=null;return t.tap((()=>o&&this.off(e,o)),(s=>{(this.listeners[e]??=t.arr([])).push(o=function(){return s(),r(...arguments)})}))}off(e,t){const r=this.listeners[e];r&&(r.remove(t),r.isEmpty()&&delete this.listeners[e])}}var G=t.facade(new E),B=w({name:"app",initialState:{environment:__AG_ENV,isMounted:!1},computed:{isDevelopment:e=>"development"===e.environment,isTesting:e=>"testing"===e.environment}});class q extends B{async boot(){await super.boot(),G.once("application-mounted",(()=>this.setState({isMounted:!0})))}}var M=t.facade(new q);const I={$app:M,$events:G};async function P(e,t){await Promise.all(Object.entries(t).map((async e=>{let[t,r]=e;await r.launch().catch((e=>console.error(e)))}))),Object.assign(e.config.globalProperties,t)}var $={async install(e,t){const r={...I,...t.services};e.use(A??S()),await P(e,r)}},N=w({name:"ui",initialState:{modals:[]}});const V={AlertModal:"alert-modal",ConfirmModal:"confirm-modal",LoadingModal:"loading-modal"};var H=t.facade(new class extends N{constructor(){super(...arguments),i.default(this,"modalCallbacks",{}),i.default(this,"components",{})}alert(e,t){const r="string"==typeof t?{title:e,message:t}:{message:e};this.openModal(this.requireComponent(V.AlertModal),r)}async confirm(e,t){const r="string"==typeof t?{title:e,message:t}:{message:e},o=await this.openModal(this.requireComponent(V.ConfirmModal),r);return await o.beforeClose??!1}async loading(e,t){t="string"==typeof e?t:e;const r="string"==typeof e?e:void 0,o=await this.openModal(this.requireComponent(V.LoadingModal),{message:r}),s=await t;return await this.closeModal(o.id),s}registerComponent(e,t){this.components[e]=t}async openModal(r,o){const s=t.uuid(),n={},a={id:s,properties:o??{},component:e.markRaw(r),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 e.nextTick(),await(l&&G.emit("hide-modal",{id:l.id})),await Promise.all([l||G.emit("show-overlays-backdrop"),G.emit("show-modal",{id:a.id})]),a}async closeModal(e,t){await G.emit("close-modal",{id:e,result:t})}async boot(){await super.boot(),this.watchModalEvents()}requireComponent(e){return this.components[e]??t.fail(`UI Component '${e}' is not defined!`)}watchModalEvents(){G.on("modal-will-close",(e=>{let{modal:t,result:r}=e;this.modalCallbacks[t.id]?.willClose?.(r),1===this.modals.length&&G.emit("hide-overlays-backdrop")})),G.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 o=this.modals.at(-1);await(o&&G.emit("show-modal",{id:o.id}))}))}});var O=t.facade(new class extends C{constructor(){super(),i.default(this,"provider",void 0),this.provider={translate:e=>(M.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,r,o){o??=r;const s="string"==typeof r?{}:r??{},n=this.provider.translate(e,s)??e;return n===e?Object.entries(s).reduce(((e,r)=>{let[o,s]=r;return e.replace(new RegExp(`\\{\\s*${o}\\s*\\}`,"g"),t.toString(s))}),o):n}});const D=O.translate.bind(O),R=O.translateWithDefault.bind(O);var L=w({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}}});var F=t.facade(new class extends L{constructor(){super(...arguments),i.default(this,"forceReporting",!1),i.default(this,"enabled",!0)}enable(){this.enabled=!0}disable(){this.enabled=!1}async inspect(e){Array.isArray(e)||await this.createErrorReport(e)}async report(e,t){if((M.isDevelopment||M.isTesting)&&this.logError(e),!this.enabled)throw e;if(!M.isMounted){const t=await this.createStartupErrorReport(e);return void(t&&this.setState({startupErrors:this.startupErrors.concat(t)}))}const r={report:await this.createErrorReport(e),seen:!1,date:new Date};H.alert(t??"Something went wrong, but it's not your fault! (look at the console for details)"),this.setState({logs:[r].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})))})}logError(e){console.error(e),t.isObject(e)&&e.cause&&this.logError(e.cause)}async createErrorReport(e){return"string"==typeof e?{title:e}:e instanceof Error||e instanceof t.JSError?this.createErrorReportFromError(e):{title:D("errors.unknown"),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 T={$errors:F};var z={async install(e){await P(e,T)}};const K={$lang:O};var U={async install(e){e.config.globalProperties.$t??=D,e.config.globalProperties.$td=R,await P(e,K)}};function W(t,r){const o=G.on(t,r);e.onUnmounted((()=>o()))}function J(){const r=e.useAttrs(),o=e.computed((()=>r.class));return[e.computed((()=>t.objectWithout(r,"class"))),o]}var Q=e.defineComponent({__name:"AGHeadlessModal",props:{cancellable:d(!0)},setup(t,{expose:r}){const o=t,n=e.ref(null),a=e.ref(!0),l=e.ref(!1),{modal:i}=h("modal","could not obtain modal reference from <AGHeadlessModal>, did you render this component manually? Show it using $ui.openModal() instead");async function u(){n.value?.$el&&(a.value=!0)}async function c(e){l.value||(G.emit("modal-will-close",{modal:i,result:e}),await u(),l.value=!0,G.emit("modal-closed",{modal:i,result:e}))}return W("close-modal",(async({id:e,result:t})=>{e===i.id&&await c(t)})),W("hide-modal",(async({id:e})=>{e===i.id&&await u()})),W("show-modal",(async({id:e})=>{e===i.id&&await async function(){n.value?.$el&&(a.value=!1)}()})),r({close:c,cancellable:e.toRef(o,"cancellable")}),(r,o)=>(e.openBlock(),e.createBlock(e.unref(s.Dialog),{ref_key:"$root",ref:n,open:!0,onClose:o[0]||(o[0]=e=>t.cancellable&&c())},{default:e.withCtx((()=>[e.renderSlot(r.$slots,"default",{close:c})])),_:3},512))}});Q.__file="src/components/headless/modals/AGHeadlessModal.vue";var X=e.defineComponent({__name:"AGModalContext",props:{modal:_(),childIndex:x()},setup(t){const r=t;return e.provide("modal",{modal:e.toRef(r,"modal"),childIndex:e.toRef(r,"childIndex")}),(r,o)=>(e.openBlock(),e.createBlock(e.resolveDynamicComponent(t.modal.component),e.normalizeProps(e.guardReactiveProps(t.modal.properties)),null,16))}});X.__file="src/components/modals/AGModalContext.vue";const Y=e.createElementVNode("div",{class:"pointer-events-none fixed inset-0 z-50 bg-black/30"},null,-1);var Z=e.defineComponent({__name:"AGHeadlessModalPanel",setup(t){const r=h("modal","could not obtain modal reference from <AGHeadlessModalPanel>, did you render this component manually? Show it using $ui.openModal() instead"),o=e.computed((()=>H.modals[r.childIndex]??null));return(t,n)=>(e.openBlock(),e.createBlock(e.unref(s.DialogPanel),null,{default:e.withCtx((()=>[e.renderSlot(t.$slots,"default"),o.value?(e.openBlock(),e.createElementBlock(e.Fragment,{key:0},[Y,e.createVNode(X,{"child-index":e.unref(r).childIndex+1,modal:o.value},null,8,["child-index","modal"])],64)):e.createCommentVNode("v-if",!0)])),_:3}))}});Z.__file="src/components/headless/modals/AGHeadlessModalPanel.vue";const ee={class:"fixed inset-0 flex items-center justify-center"},te={class:"flex max-h-full flex-col overflow-auto p-4"};var re=e.defineComponent({__name:"AGModal",props:{cancellable:d(!0)},setup(t,{expose:r}){const o=e.ref();return r({close:async()=>o.value?.close(),cancellable:e.computed((()=>!!o.value?.cancellable))}),(r,s)=>(e.openBlock(),e.createBlock(Q,{ref_key:"$headlessModal",ref:o,cancellable:t.cancellable,class:"relative z-50"},{default:e.withCtx((({close:t})=>[e.createElementVNode("div",ee,[e.createVNode(Z,{class:"flex max-h-full max-w-full flex-col overflow-hidden bg-white"},{default:e.withCtx((()=>[e.createElementVNode("div",te,[e.renderSlot(r.$slots,"default",{close:t})])])),_:2},1024)])])),_:3},8,["cancellable"]))}});function oe(e){return t=a.marked(e,{mangle:!1,headerIds:!1}),u.default.sanitize(t,{ADD_ATTR:["target"]});var t}re.__file="src/components/modals/AGModal.vue";var se=e.defineComponent({__name:"AGMarkdown",props:{as:y("div"),langKey:y(),text:y(),inline:d(),raw:d()},setup(t){const r=t,o=e.computed((()=>r.text??(r.langKey&&D(r.langKey)))),s=e.computed((()=>{if(!o.value)return null;let e=oe(o.value);return r.inline&&(e=e.replace("<p>","<span>").replace("</p>","</span>")),e})),n=()=>e.h(r.as,{class:r.raw?"":"prose",innerHTML:s.value});return(t,r)=>(e.openBlock(),e.createBlock(n))}});se.__file="src/components/basic/AGMarkdown.vue";var ne=e.defineComponent({__name:"AGAlertModal",props:{title:y(),message:b()},setup:t=>(r,o)=>(e.openBlock(),e.createBlock(re,null,{default:e.withCtx((()=>[t.title?(e.openBlock(),e.createBlock(se,{key:0,text:t.title,as:"h2",class:"font-semibold",raw:"",inline:""},null,8,["text"])):e.createCommentVNode("v-if",!0),e.createVNode(se,{text:t.message},null,8,["text"])])),_:1}))});ne.__file="src/components/modals/AGAlertModal.vue";var ae=e.defineComponent({__name:"AGHeadlessButton",props:{url:y(),route:y(),routeParams:g((()=>({}))),routeQuery:g((()=>({}))),submit:d()},setup(r){const{url:o,route:s,routeParams:n,routeQuery:a,submit:l}=r,i=e.computed((()=>s?{tag:"router-link",props:{to:t.objectWithoutEmpty({name:s,params:n,query:a})}}:o?{tag:"a",props:{target:"_blank",href:o}}:{tag:"button",props:{type:l?"submit":"button"}}));return(t,r)=>(e.openBlock(),e.createBlock(e.resolveDynamicComponent(i.value.tag),e.normalizeProps(e.guardReactiveProps(i.value.props)),{default:e.withCtx((()=>[e.renderSlot(t.$slots,"default")])),_:3},16))}});ae.__file="src/components/headless/forms/AGHeadlessButton.vue";var le=e.defineComponent({__name:"AGButton",props:{clear:d(),secondary:d()},setup(t){const r=t,o=e.computed((()=>r.secondary?"text-white bg-gray-600 hover:bg-gray-500 focus-visible:outline-offset-2 focus-visible:outline-gray-600":r.clear?"hover:bg-gray-500/20 focus-visible:outline-gray-500/60":["text-white bg-indigo-600","hover:bg-indigo-500","focus-visible:outline-offset-2 focus-visible:outline-indigo-600"].join(" ")));return(t,r)=>(e.openBlock(),e.createBlock(ae,{class:e.normalizeClass(["px-2.5 py-1.5 focus-visible:outline focus-visible:outline-2",o.value])},{default:e.withCtx((()=>[e.renderSlot(t.$slots,"default")])),_:3},8,["class"]))}});le.__file="src/components/forms/AGButton.vue";const ie={class:"mt-2 flex flex-row-reverse gap-2"};var ue=e.defineComponent({__name:"AGConfirmModal",props:{title:y(),message:b()},setup:t=>(r,o)=>(e.openBlock(),e.createBlock(re,{cancellable:!1},{default:e.withCtx((({close:o})=>[t.title?(e.openBlock(),e.createBlock(se,{key:0,text:t.title,as:"h1"},null,8,["text"])):e.createCommentVNode("v-if",!0),e.createVNode(se,{text:t.message},null,8,["text"]),e.createElementVNode("div",ie,[e.createVNode(le,{onClick:e=>o(!0)},{default:e.withCtx((()=>[e.createTextVNode(e.toDisplayString(r.$td("ui.ok","OK")),1)])),_:2},1032,["onClick"]),e.createVNode(le,{secondary:"",onClick:e=>o()},{default:e.withCtx((()=>[e.createTextVNode(e.toDisplayString(r.$td("ui.cancel","Cancel")),1)])),_:2},1032,["onClick"])])])),_:1}))});ue.__file="src/components/modals/AGConfirmModal.vue";var ce=e.defineComponent({__name:"AGLoadingModal",props:{message:y()},setup(t){const r=t,o=e.computed((()=>r.message??R("ui.loading","Loading...")));return(t,r)=>(e.openBlock(),e.createBlock(re,{cancellable:!1},{default:e.withCtx((()=>[e.createVNode(se,{text:o.value},null,8,["text"])])),_:1}))}});ce.__file="src/components/modals/AGLoadingModal.vue";const de={$ui:H};var pe={async install(e,t){const r={[V.AlertModal]:ne,[V.ConfirmModal]:ue,[V.LoadingModal]:ce};Object.entries({...r,...t.components}).forEach((e=>{let[t,r]=e;return H.registerComponent(t,r)})),await P(e,de)}};const me={key:0};var fe=e.defineComponent({__name:"AGAppOverlays",setup(t){const r=e.ref(null),o=e.ref(!0),s=e.computed((()=>H.modals[0]??null));return W("show-overlays-backdrop",(async()=>{r.value&&o.value&&(o.value=!1,r.value.classList.remove("opacity-0"))})),W("hide-overlays-backdrop",(async()=>{r.value&&!o.value&&(o.value=!0,r.value.classList.add("opacity-0"))})),(t,o)=>(e.openBlock(),e.createElementBlock(e.Fragment,null,[e.createElementVNode("div",{ref_key:"$backdrop",ref:r,class:"pointer-events-none fixed inset-0 z-50 bg-black/30 opacity-0"},null,512),s.value?(e.openBlock(),e.createElementBlock("aside",me,[e.createVNode(X,{"child-index":1,modal:s.value},null,8,["modal"])])):e.createCommentVNode("v-if",!0)],64))}});fe.__file="src/components/AGAppOverlays.vue";const he={class:"flex h-full flex-col text-base font-normal leading-tight text-gray-900 antialiased"};var ve=e.defineComponent({__name:"AGAppLayout",setup:t=>(t,r)=>(e.openBlock(),e.createElementBlock("div",he,[e.renderSlot(t.$slots,"default"),e.createVNode(fe)]))});ve.__file="src/components/AGAppLayout.vue";var ge=e.defineComponent({__name:"AGHeadlessInput",props:{as:y("div"),name:y(),modelValue:v([String,Number,Boolean])},emits:["update:modelValue"],setup(r,{expose:o,emit:s}){const n=r,a=e.computed((()=>l&&n.name?l.errors[n.name]??null:null)),l=e.inject("form",null),i={id:`input-${t.uuid()}`,value:e.computed((()=>l&&n.name?l.getFieldValue(n.name):n.modelValue)),errors:e.readonly(a),update(e){l&&n.name?l.setFieldValue(n.name,e):s("update:modelValue",e)}};return e.provide("input",i),o(i),(t,o)=>r.as?(e.openBlock(),e.createBlock(e.resolveDynamicComponent(r.as),{key:0},{default:e.withCtx((()=>[e.renderSlot(t.$slots,"default")])),_:3})):e.renderSlot(t.$slots,"default",{key:1})}});ge.__file="src/components/headless/forms/AGHeadlessInput.vue";const xe=["id"];var _e=e.defineComponent({__name:"AGHeadlessInputError",setup(t){const r=h("input","<AGHeadlessInputError> must be a child of a <AGHeadlessInput>"),o=e.computed((()=>r.errors?R(`errors.${r.errors[0]}`,`Error: ${r.errors[0]}`):null));return(t,s)=>o.value?(e.openBlock(),e.createElementBlock("p",{key:0,id:`${e.unref(r).id}-error`},e.toDisplayString(o.value),9,xe)):e.createCommentVNode("v-if",!0)}});_e.__file="src/components/headless/forms/AGHeadlessInputError.vue";const be=["id","type","value","aria-invalid","aria-describedby","checked"];var ye=e.defineComponent({__name:"AGHeadlessInputInput",props:{type:y("text")},setup(t){const r=t,o=e.ref(),s=h("input","<AGHeadlessInputInput> must be a child of a <AGHeadlessInput>"),n=e.computed((()=>s.value)),a=e.computed((()=>{if("checkbox"===r.type)return!!n.value}));function l(){o.value&&s.update("checkbox"===r.type?o.value.checked:o.value.value)}return(r,i)=>(e.openBlock(),e.createElementBlock("input",{id:e.unref(s).id,ref_key:"$input",ref:o,type:t.type,value:n.value,"aria-invalid":e.unref(s).errors?"true":"false","aria-describedby":e.unref(s).errors?`${e.unref(s).id}-error`:void 0,checked:a.value,onInput:l},null,40,be))}});ye.__file="src/components/headless/forms/AGHeadlessInputInput.vue";const ke=["for"];var je=e.defineComponent({__name:"AGHeadlessInputLabel",setup(t){const r=h("input","<AGHeadlessInputLabel> must be a child of a <AGHeadlessInput>");return(t,o)=>(e.openBlock(),e.createElementBlock("label",{for:e.unref(r).id},[e.renderSlot(t.$slots,"default")],8,ke))}});je.__file="src/components/headless/forms/AGHeadlessInputLabel.vue";const Ae={class:"ml-2"};var Se=e.defineComponent({inheritAttrs:!1,__name:"AGCheckbox",props:{name:y()},setup(t){const r=p();return(o,s)=>(e.openBlock(),e.createBlock(ge,{ref_key:"$input",ref:r,name:t.name,class:"flex"},{default:e.withCtx((()=>[e.createVNode(ye,e.mergeProps(o.$attrs,{type:"checkbox",class:{"text-indigo-600 focus:ring-indigo-600":!e.unref(r)?.errors,"border-red-200 text-red-600 focus:ring-red-600":e.unref(r)?.errors}}),null,16,["class"]),e.createElementVNode("div",Ae,[o.$slots.default?(e.openBlock(),e.createBlock(je,{key:0},{default:e.withCtx((()=>[e.renderSlot(o.$slots,"default")])),_:3})):e.createCommentVNode("v-if",!0),e.createVNode(_e,{class:"text-sm text-red-600"})])])),_:3},8,["name"]))}});Se.__file="src/components/forms/AGCheckbox.vue";const we=["onSubmit"];var Ce=e.defineComponent({__name:"AGForm",props:{form:g()},emits:["submit"],setup(t,{emit:r}){const o=t;function s(){o.form&&!o.form.submit()||r("submit")}return e.provide("form",o.form),(t,r)=>(e.openBlock(),e.createElementBlock("form",{onSubmit:e.withModifiers(s,["prevent"])},[e.renderSlot(t.$slots,"default")],40,we))}});Ce.__file="src/components/forms/AGForm.vue";const Ee={class:"absolute bottom-0 left-0 translate-y-full"};var Ge=e.defineComponent({inheritAttrs:!1,__name:"AGInput",props:{name:y()},setup(t){const r=p(),[o,s]=J();return(n,a)=>(e.openBlock(),e.createBlock(ge,{ref_key:"$input",ref:r,class:e.normalizeClass(["relative flex flex-col items-center",e.unref(s)]),name:t.name},{default:e.withCtx((()=>[e.createVNode(ye,e.mergeProps(e.unref(o),{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":e.unref(r)?.errors}]}),null,16,["class"]),e.createElementVNode("div",Ee,[e.createVNode(_e,{class:"mt-1 text-sm text-red-500"})])])),_:1},8,["class","name"]))}});Ge.__file="src/components/forms/AGInput.vue";var Be=e.defineComponent({__name:"AGHeadlessModalTitle",props:{as:y("h2")},setup:t=>(r,o)=>(e.openBlock(),e.createBlock(e.unref(s.DialogTitle),{as:t.as},{default:e.withCtx((()=>[e.renderSlot(r.$slots,"default")])),_:3},8,["as"]))});Be.__file="src/components/headless/modals/AGHeadlessModalTitle.vue";const qe={String:"string",Number:"number",Boolean:"boolean"};class Me extends t.MagicObject{constructor(t){super(),i.default(this,"errors",void 0),i.default(this,"_fields",void 0),i.default(this,"_data",void 0),i.default(this,"_valid",void 0),i.default(this,"_submitted",void 0),i.default(this,"_errors",void 0),this._fields=t,this._submitted=e.ref(!1),this._data=this.getInitialData(t),this._errors=this.getInitialErrors(t),this._valid=e.computed((()=>!Object.values(this._errors).some((e=>null!==e)))),this.errors=e.readonly(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,o]=t;return e[r]=this.getFieldErrors(r,o),e}),{});return this.resetErrors(e),this.valid}reset(){this._submitted.value=!1,this.resetData(),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(t){if(this.static().isConjuring())return{};const r=Object.entries(t).reduce(((e,t)=>{let[r,o]=t;return e[r]=o.default??null,e}),{});return e.reactive(r)}getInitialErrors(t){if(this.static().isConjuring())return{};const r=Object.keys(t).reduce(((e,t)=>(e[t]=null,e)),{});return e.reactive(r)}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)}}exports.AGAlertModal=ne,exports.AGAppLayout=ve,exports.AGAppOverlays=fe,exports.AGButton=le,exports.AGCheckbox=Se,exports.AGConfirmModal=ue,exports.AGForm=Ce,exports.AGHeadlessButton=ae,exports.AGHeadlessInput=ge,exports.AGHeadlessInputError=_e,exports.AGHeadlessInputInput=ye,exports.AGHeadlessInputLabel=je,exports.AGHeadlessModal=Q,exports.AGHeadlessModalPanel=Z,exports.AGHeadlessModalTitle=Be,exports.AGInput=Ge,exports.AGLoadingModal=ce,exports.AGMarkdown=se,exports.AGModal=re,exports.AGModalContext=X,exports.App=M,exports.AppService=q,exports.Errors=F,exports.Events=G,exports.EventsService=E,exports.FormFieldTypes=qe,exports.Lang=O,exports.Service=C,exports.UI=H,exports.UIComponents=V,exports.arrayProp=function(e){return{type:Array,default:e??(()=>[])}},exports.booleanInput=function(e){return{default:e,type:qe.Boolean}},exports.booleanProp=d,exports.bootServices=P,exports.bootstrapApplication=async function(t){let r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const o=[j,z,U,$,pe,...r.plugins??[]],s=e.createApp(t);await Promise.all(o.map((e=>e.install(s,r)))??[]),s.mount("#app"),G.emit("application-mounted")},exports.componentRef=p,exports.defineDirective=m,exports.definePlugin=c,exports.defineServiceState=w,exports.enumProp=function(e,t){const r=Object.values(e);return{type:String,default:t??r[0]??null,validator:e=>r.includes(e)}},exports.injectOrFail=function(r,o){return e.inject(r)??t.fail(o??`Could not resolve '${r}' injection key`)},exports.injectReactive=f,exports.injectReactiveOrFail=h,exports.mixedProp=v,exports.numberInput=function(e){return{default:e,type:qe.Number}},exports.numberProp=function(){return{type:Number,default:arguments.length>0&&void 0!==arguments[0]?arguments[0]:null}},exports.objectProp=g,exports.onCleanMounted=function(r){let o=t.noop;e.onMounted((()=>o=r())),e.onUnmounted((()=>o()))},exports.requiredArrayProp=function(){return{type:Array,required:!0}},exports.requiredBooleanInput=function(e){return{default:e,type:qe.Boolean,rules:"required"}},exports.requiredEnumProp=function(e){const t=Object.values(e);return{type:String,required:!0,validator:e=>t.includes(e)}},exports.requiredMixedProp=function(e){return{type:e,required:!0}},exports.requiredNumberInput=function(e){return{default:e,type:qe.Number,rules:"required"}},exports.requiredNumberProp=x,exports.requiredObjectProp=_,exports.requiredStringInput=function(e){return{default:e,type:qe.String,rules:"required"}},exports.requiredStringProp=b,exports.stringInput=function(e){return{default:e,type:qe.String}},exports.stringProp=y,exports.translate=D,exports.translateWithDefault=R,exports.useEvent=W,exports.useForm=function(e){return new Me(e)},exports.useInputAttrs=J;
2
2
  //# sourceMappingURL=aerogel-core.cjs.js.map
@@ -11,7 +11,7 @@ import type { Directive } from 'vue';
11
11
  import { ExtractPropTypes } from 'vue';
12
12
  import { Facade } from '@noeldemartin/utils';
13
13
  import type { InjectionKey } from 'vue';
14
- import type { LocationQuery } from 'vue-router';
14
+ import type { JSError } from '@noeldemartin/utils';
15
15
  import { MagicObject } from '@noeldemartin/utils';
16
16
  import type { ObjectValues } from '@noeldemartin/utils';
17
17
  import { PromisedValue } from '@noeldemartin/utils';
@@ -19,7 +19,6 @@ import { PropType } from 'vue';
19
19
  import type { Ref } from 'vue';
20
20
  import { RendererElement } from 'vue';
21
21
  import { RendererNode } from 'vue';
22
- import type { RouteParams } from 'vue-router';
23
22
  import type { UnwrapNestedRefs } from 'vue';
24
23
  import { VNode } from 'vue';
25
24
  import { VNodeProps } from 'vue';
@@ -69,6 +68,12 @@ export declare const AGAppOverlays: DefineComponent< {}, (_ctx: any, _cache:
69
68
  }>, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, VNodeProps & AllowedComponentProps & ComponentCustomProps, Readonly<ExtractPropTypes< {}>>, {}, {}>;
70
69
 
71
70
  export declare const AGButton: DefineComponent< {
71
+ clear: {
72
+ type: PropType<boolean>;
73
+ validator?(value: unknown): boolean;
74
+ } & {
75
+ default: boolean | (() => boolean) | null;
76
+ };
72
77
  secondary: {
73
78
  type: PropType<boolean>;
74
79
  validator?(value: unknown): boolean;
@@ -78,6 +83,12 @@ default: boolean | (() => boolean) | null;
78
83
  }, (_ctx: any, _cache: any) => VNode<RendererNode, RendererElement, {
79
84
  [key: string]: any;
80
85
  }>, unknown, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, VNodeProps & AllowedComponentProps & ComponentCustomProps, Readonly<ExtractPropTypes< {
86
+ clear: {
87
+ type: PropType<boolean>;
88
+ validator?(value: unknown): boolean;
89
+ } & {
90
+ default: boolean | (() => boolean) | null;
91
+ };
81
92
  secondary: {
82
93
  type: PropType<boolean>;
83
94
  validator?(value: unknown): boolean;
@@ -85,9 +96,30 @@ validator?(value: unknown): boolean;
85
96
  default: boolean | (() => boolean) | null;
86
97
  };
87
98
  }>>, {
99
+ clear: boolean;
88
100
  secondary: boolean;
89
101
  }, {}>;
90
102
 
103
+ export declare const AGCheckbox: DefineComponent< {
104
+ name: {
105
+ type: PropType<string | null>;
106
+ validator?(value: unknown): boolean;
107
+ } & {
108
+ default: string | (() => string | null) | null;
109
+ };
110
+ }, (_ctx: any, _cache: any) => VNode<RendererNode, RendererElement, {
111
+ [key: string]: any;
112
+ }>, unknown, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, VNodeProps & AllowedComponentProps & ComponentCustomProps, Readonly<ExtractPropTypes< {
113
+ name: {
114
+ type: PropType<string | null>;
115
+ validator?(value: unknown): boolean;
116
+ } & {
117
+ default: string | (() => string | null) | null;
118
+ };
119
+ }>>, {
120
+ name: string | null;
121
+ }, {}>;
122
+
91
123
  export declare const AGConfirmModal: DefineComponent< {
92
124
  title: {
93
125
  type: PropType<string | null>;
@@ -156,16 +188,16 @@ validator?(value: unknown): boolean;
156
188
  default: string | (() => string | null) | null;
157
189
  };
158
190
  routeParams: {
159
- type: PropType<RouteParams>;
191
+ type: PropType< {}>;
160
192
  validator?(value: unknown): boolean;
161
193
  } & {
162
- default: RouteParams | (() => RouteParams) | null;
194
+ default: {} | (() => {}) | null;
163
195
  };
164
196
  routeQuery: {
165
- type: PropType<LocationQuery>;
197
+ type: PropType< {}>;
166
198
  validator?(value: unknown): boolean;
167
199
  } & {
168
- default: LocationQuery | (() => LocationQuery) | null;
200
+ default: {} | (() => {}) | null;
169
201
  };
170
202
  submit: {
171
203
  type: PropType<boolean>;
@@ -189,16 +221,16 @@ validator?(value: unknown): boolean;
189
221
  default: string | (() => string | null) | null;
190
222
  };
191
223
  routeParams: {
192
- type: PropType<RouteParams>;
224
+ type: PropType< {}>;
193
225
  validator?(value: unknown): boolean;
194
226
  } & {
195
- default: RouteParams | (() => RouteParams) | null;
227
+ default: {} | (() => {}) | null;
196
228
  };
197
229
  routeQuery: {
198
- type: PropType<LocationQuery>;
230
+ type: PropType< {}>;
199
231
  validator?(value: unknown): boolean;
200
232
  } & {
201
- default: LocationQuery | (() => LocationQuery) | null;
233
+ default: {} | (() => {}) | null;
202
234
  };
203
235
  submit: {
204
236
  type: PropType<boolean>;
@@ -209,17 +241,17 @@ default: boolean | (() => boolean) | null;
209
241
  }>>, {
210
242
  url: string | null;
211
243
  route: string | null;
212
- routeParams: RouteParams;
213
- routeQuery: LocationQuery;
244
+ routeParams: {};
245
+ routeQuery: {};
214
246
  submit: boolean;
215
247
  }, {}>;
216
248
 
217
249
  export declare const AGHeadlessInput: DefineComponent< {
218
250
  as: {
219
- type: PropType<string | null>;
251
+ type: PropType<string>;
220
252
  validator?(value: unknown): boolean;
221
253
  } & {
222
- default: string | (() => string | null) | null;
254
+ default: string | (() => string) | null;
223
255
  };
224
256
  name: {
225
257
  type: PropType<string | null>;
@@ -228,19 +260,19 @@ validator?(value: unknown): boolean;
228
260
  default: string | (() => string | null) | null;
229
261
  };
230
262
  modelValue: {
231
- type: PropType<string | null>;
263
+ type: PropType<string | number | boolean | null>;
232
264
  validator?(value: unknown): boolean;
233
265
  } & {
234
- default: string | (() => string | null) | null;
266
+ default: string | number | boolean | (() => string | number | boolean | null) | null;
235
267
  };
236
268
  }, (_ctx: any, _cache: any) => VNode<RendererNode, RendererElement, {
237
269
  [key: string]: any;
238
270
  }>, unknown, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, "update:modelValue"[], "update:modelValue", VNodeProps & AllowedComponentProps & ComponentCustomProps, Readonly<ExtractPropTypes< {
239
271
  as: {
240
- type: PropType<string | null>;
272
+ type: PropType<string>;
241
273
  validator?(value: unknown): boolean;
242
274
  } & {
243
- default: string | (() => string | null) | null;
275
+ default: string | (() => string) | null;
244
276
  };
245
277
  name: {
246
278
  type: PropType<string | null>;
@@ -249,26 +281,42 @@ validator?(value: unknown): boolean;
249
281
  default: string | (() => string | null) | null;
250
282
  };
251
283
  modelValue: {
252
- type: PropType<string | null>;
284
+ type: PropType<string | number | boolean | null>;
253
285
  validator?(value: unknown): boolean;
254
286
  } & {
255
- default: string | (() => string | null) | null;
287
+ default: string | number | boolean | (() => string | number | boolean | null) | null;
256
288
  };
257
289
  }>> & {
258
290
  "onUpdate:modelValue"?: ((...args: any[]) => any) | undefined;
259
291
  }, {
260
- as: string | null;
292
+ as: string;
261
293
  name: string | null;
262
- modelValue: string | null;
294
+ modelValue: string | number | boolean | null;
263
295
  }, {}>;
264
296
 
265
297
  export declare const AGHeadlessInputError: DefineComponent< {}, (_ctx: any, _cache: any) => VNode<RendererNode, RendererElement, {
266
298
  [key: string]: any;
267
299
  }>, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, VNodeProps & AllowedComponentProps & ComponentCustomProps, Readonly<ExtractPropTypes< {}>>, {}, {}>;
268
300
 
269
- export declare const AGHeadlessInputInput: DefineComponent< {}, (_ctx: any, _cache: any) => VNode<RendererNode, RendererElement, {
301
+ export declare const AGHeadlessInputInput: DefineComponent< {
302
+ type: {
303
+ type: PropType<string>;
304
+ validator?(value: unknown): boolean;
305
+ } & {
306
+ default: string | (() => string) | null;
307
+ };
308
+ }, (_ctx: any, _cache: any) => VNode<RendererNode, RendererElement, {
270
309
  [key: string]: any;
271
- }>, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, VNodeProps & AllowedComponentProps & ComponentCustomProps, Readonly<ExtractPropTypes< {}>>, {}, {}>;
310
+ }>, unknown, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, VNodeProps & AllowedComponentProps & ComponentCustomProps, Readonly<ExtractPropTypes< {
311
+ type: {
312
+ type: PropType<string>;
313
+ validator?(value: unknown): boolean;
314
+ } & {
315
+ default: string | (() => string) | null;
316
+ };
317
+ }>>, {
318
+ type: string;
319
+ }, {}>;
272
320
 
273
321
  export declare const AGHeadlessInputLabel: DefineComponent< {}, (_ctx: any, _cache: any) => VNode<RendererNode, RendererElement, {
274
322
  [key: string]: any;
@@ -338,6 +386,26 @@ default: string | (() => string | null) | null;
338
386
  name: string | null;
339
387
  }, {}>;
340
388
 
389
+ export declare const AGLoadingModal: DefineComponent< {
390
+ message: {
391
+ type: PropType<string | null>;
392
+ validator?(value: unknown): boolean;
393
+ } & {
394
+ default: string | (() => string | null) | null;
395
+ };
396
+ }, (_ctx: any, _cache: any) => VNode<RendererNode, RendererElement, {
397
+ [key: string]: any;
398
+ }>, unknown, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, VNodeProps & AllowedComponentProps & ComponentCustomProps, Readonly<ExtractPropTypes< {
399
+ message: {
400
+ type: PropType<string | null>;
401
+ validator?(value: unknown): boolean;
402
+ } & {
403
+ default: string | (() => string | null) | null;
404
+ };
405
+ }>>, {
406
+ message: string | null;
407
+ }, {}>;
408
+
341
409
  export declare const AGMarkdown: DefineComponent< {
342
410
  as: {
343
411
  type: PropType<string>;
@@ -410,9 +478,25 @@ inline: boolean;
410
478
  raw: boolean;
411
479
  }, {}>;
412
480
 
413
- export declare const AGModal: DefineComponent< {}, (_ctx: any, _cache: any) => VNode<RendererNode, RendererElement, {
481
+ export declare const AGModal: DefineComponent< {
482
+ cancellable: {
483
+ type: PropType<boolean>;
484
+ validator?(value: unknown): boolean;
485
+ } & {
486
+ default: boolean | (() => boolean) | null;
487
+ };
488
+ }, (_ctx: any, _cache: any) => VNode<RendererNode, RendererElement, {
414
489
  [key: string]: any;
415
- }>, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, VNodeProps & AllowedComponentProps & ComponentCustomProps, Readonly<ExtractPropTypes< {}>>, {}, {}>;
490
+ }>, unknown, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, VNodeProps & AllowedComponentProps & ComponentCustomProps, Readonly<ExtractPropTypes< {
491
+ cancellable: {
492
+ type: PropType<boolean>;
493
+ validator?(value: unknown): boolean;
494
+ } & {
495
+ default: boolean | (() => boolean) | null;
496
+ };
497
+ }>>, {
498
+ cancellable: boolean;
499
+ }, {}>;
416
500
 
417
501
  export declare const AGModalContext: DefineComponent< {
418
502
  modal: {
@@ -446,7 +530,8 @@ required: true;
446
530
 
447
531
  export declare const App: Facade<AppService, Constructor<AppService>>;
448
532
 
449
- export declare class AppService extends _default {
533
+ export declare class AppService extends _default_2 {
534
+ protected boot(): Promise<void>;
450
535
  }
451
536
 
452
537
  export declare function arrayProp<T>(defaultValue?: () => T[]): OptionalProp<T[]>;
@@ -456,6 +541,8 @@ declare type BaseProp<T> = {
456
541
  validator?(value: unknown): boolean;
457
542
  };
458
543
 
544
+ export declare function booleanInput(defaultValue?: boolean): FormFieldDefinition<typeof FormFieldTypes.Boolean>;
545
+
459
546
  export declare function booleanProp(defaultValue?: boolean): OptionalProp<boolean>;
460
547
 
461
548
  export declare function bootServices(app: App_2, services: Record<string, Service>): Promise<void>;
@@ -466,17 +553,30 @@ export declare function componentRef<T>(): Ref<UnwrapNestedRefs<T> | undefined>;
466
553
 
467
554
  export declare type ComputedStateDefinition<TState extends ServiceState, TComputedState extends ServiceState> = {
468
555
  [K in keyof TComputedState]: (state: TState) => TComputedState[K];
469
- };
556
+ } & ThisType<{
557
+ readonly [K in keyof TComputedState]: TComputedState[K];
558
+ }>;
470
559
 
471
560
  declare const _default: Constructor< {
561
+ logs: ErrorReportLog[];
562
+ startupErrors: ErrorReport[];
563
+ }> & Constructor< {
564
+ hasErrors: boolean;
565
+ hasNewErrors: boolean;
566
+ hasStartupErrors: boolean;
567
+ }> & Constructor<Service<DefaultServiceState, {}, Partial<DefaultServiceState>>> & Service;
568
+
569
+ declare const _default_2: Constructor< {
472
570
  environment: "production" | "development" | "testing";
571
+ isMounted: boolean;
473
572
  }> & Constructor< {
474
573
  isDevelopment: boolean;
475
- }> & Constructor<Service<DefaultServiceState, {}>> & Service;
574
+ isTesting: boolean;
575
+ }> & Constructor<Service<DefaultServiceState, {}, Partial<DefaultServiceState>>> & Service;
476
576
 
477
- declare const _default_2: Constructor< {
577
+ declare const _default_3: Constructor< {
478
578
  modals: Modal<unknown>[];
479
- }> & Constructor< {}> & Constructor<Service<DefaultServiceState, {}>> & Service;
579
+ }> & Constructor< {}> & Constructor<Service<DefaultServiceState, {}, Partial<DefaultServiceState>>> & Service;
480
580
 
481
581
  export declare type DefaultServices = typeof defaultServices;
482
582
 
@@ -485,19 +585,56 @@ declare const defaultServices: {
485
585
  $events: Facade<EventsService, Constructor<EventsService>>;
486
586
  };
487
587
 
488
- export declare type DefaultServiceState = {};
588
+ export declare type DefaultServiceState = any;
489
589
 
490
590
  export declare function defineDirective(directive: Directive): Directive;
491
591
 
492
592
  export declare function definePlugin<T extends Plugin_2>(plugin: T): T;
493
593
 
494
594
  export declare function defineServiceState<State extends ServiceState = ServiceState, ComputedState extends ServiceState = {}>(options: {
595
+ name: string;
495
596
  initialState: State;
597
+ persist?: (keyof State)[];
496
598
  computed?: ComputedStateDefinition<State, ComputedState>;
497
- }): Constructor<State> & Constructor<ComputedState> & ServiceConstructor;
599
+ serialize?: (state: Partial<State>) => Partial<State>;
600
+ }): Constructor<State> & Constructor<ComputedState> & Constructor<Service<State, ComputedState, Partial<State>>>;
498
601
 
499
602
  export declare function enumProp<Enum extends Record<string, unknown>>(enumeration: Enum, defaultValue?: Enum[keyof Enum]): OptionalProp<Enum[keyof Enum]>;
500
603
 
604
+ export declare interface ErrorReport {
605
+ title: string;
606
+ description?: string;
607
+ details?: string;
608
+ error?: Error | JSError | unknown;
609
+ }
610
+
611
+ export declare interface ErrorReportLog {
612
+ report: ErrorReport;
613
+ seen: boolean;
614
+ date: Date;
615
+ }
616
+
617
+ export declare const Errors: Facade<ErrorsService, Constructor<ErrorsService>>;
618
+
619
+ export declare type ErrorSource = string | Error | JSError | unknown;
620
+
621
+ declare class ErrorsService extends _default {
622
+ forceReporting: boolean;
623
+ private enabled;
624
+ enable(): void;
625
+ disable(): void;
626
+ inspect(error: ErrorSource | ErrorReport[]): Promise<void>;
627
+ report(error: ErrorSource, message?: string): Promise<void>;
628
+ see(report: ErrorReport): void;
629
+ seeAll(): void;
630
+ private logError;
631
+ private createErrorReport;
632
+ private createStartupErrorReport;
633
+ private createErrorReportFromError;
634
+ }
635
+
636
+ export declare type ErrorsServices = typeof services;
637
+
501
638
  declare type EventListener_2<T = unknown> = (payload: T) => unknown;
502
639
  export { EventListener_2 as EventListener }
503
640
 
@@ -574,15 +711,16 @@ export declare type FormFieldType = ObjectValues<typeof FormFieldTypes>;
574
711
  export declare const FormFieldTypes: {
575
712
  readonly String: "string";
576
713
  readonly Number: "number";
714
+ readonly Boolean: "boolean";
577
715
  };
578
716
 
579
- export declare type GetFormFieldValue<TType> = TType extends typeof FormFieldTypes.String ? string : TType extends typeof FormFieldTypes.Number ? number : never;
717
+ export declare type GetFormFieldValue<TType> = TType extends typeof FormFieldTypes.String ? string : TType extends typeof FormFieldTypes.Number ? number : TType extends typeof FormFieldTypes.Boolean ? boolean : never;
580
718
 
581
719
  export declare interface IAGHeadlessInput {
582
720
  id: string;
583
- value: ComputedRef<string | number | null>;
721
+ value: ComputedRef<string | number | boolean | null>;
584
722
  errors: DeepReadonly<Ref<string[] | null>>;
585
- update(value: string | number | null): void;
723
+ update(value: string | number | boolean | null): void;
586
724
  }
587
725
 
588
726
  export declare interface IAGHeadlessModal extends IAGModal {
@@ -614,7 +752,7 @@ declare class LangService extends Service {
614
752
  translateWithDefault(key: string, parameters: Record<string, unknown>, defaultMessage: string): string;
615
753
  }
616
754
 
617
- export declare type LangServices = typeof services;
755
+ export declare type LangServices = typeof services_2;
618
756
 
619
757
  export declare function mixedProp<T>(type: PropType<T>): OptionalProp<T | null>;
620
758
 
@@ -656,6 +794,8 @@ export { Plugin_2 as Plugin }
656
794
 
657
795
  export declare function requiredArrayProp<T>(): RequiredProp<T[]>;
658
796
 
797
+ export declare function requiredBooleanInput(defaultValue?: boolean): FormFieldDefinition<typeof FormFieldTypes.Boolean, 'required'>;
798
+
659
799
  export declare function requiredEnumProp<Enum extends Record<string, unknown>>(enumeration: Enum): RequiredProp<Enum[keyof Enum]>;
660
800
 
661
801
  export declare function requiredMixedProp<T>(type: PropType<T>): RequiredProp<T>;
@@ -674,25 +814,30 @@ export declare function requiredStringInput(defaultValue?: string): FormFieldDef
674
814
 
675
815
  export declare function requiredStringProp(): RequiredProp<string>;
676
816
 
677
- export declare class Service<State extends ServiceState = DefaultServiceState, ComputedState extends ServiceState = {}> extends MagicObject {
678
- protected _namespace: string;
817
+ export declare class Service<State extends ServiceState = DefaultServiceState, ComputedState extends ServiceState = {}, ServiceStorage extends Partial<State> = Partial<State>> extends MagicObject {
818
+ static persist: string[];
819
+ protected _name: string;
679
820
  private _booted;
680
- private _state;
681
- private _computedState;
821
+ private _computedStateKeys;
822
+ private _store?;
682
823
  constructor();
683
824
  get booted(): PromisedValue<void>;
684
- launch(namespace?: string): Promise<void>;
825
+ launch(): Promise<void>;
826
+ hasState<P extends keyof State>(property: P): boolean;
827
+ getState(): State;
828
+ getState<P extends keyof State>(property: P): State[P];
829
+ setState<P extends keyof State>(property: P, value: State[P]): void;
830
+ setState(state: Partial<State>): void;
685
831
  protected __get(property: string): unknown;
686
832
  protected __set(property: string, value: unknown): void;
687
- protected hasState<P extends keyof State>(property: P): boolean;
688
- protected hasComputedState<P extends keyof State>(property: P): boolean;
689
- protected getState(): State;
690
- protected getState<P extends keyof State>(property: P): State[P];
691
- protected getComputedState<P extends keyof ComputedState>(property: P): ComputedState[P];
692
- protected setState(state: Partial<State>): void;
833
+ protected onStateUpdated(state: Partial<State>): void;
834
+ protected usesStore(): boolean;
835
+ protected getName(): string | null;
693
836
  protected getInitialState(): State;
694
837
  protected getComputedStateDefinition(): ComputedStateDefinition<State, ComputedState>;
838
+ protected serializePersistedState(state: Partial<State>): Partial<State>;
695
839
  protected boot(): Promise<void>;
840
+ protected restorePersistedState(): void;
696
841
  }
697
842
 
698
843
  export declare type ServiceConstructor<T extends Service = Service> = Constructor<T> & typeof Service;
@@ -701,10 +846,14 @@ export declare interface Services extends DefaultServices {
701
846
  }
702
847
 
703
848
  declare const services: {
704
- $lang: Facade<LangService, Constructor<LangService>>;
849
+ $errors: Facade<ErrorsService, Constructor<ErrorsService>>;
705
850
  };
706
851
 
707
852
  declare const services_2: {
853
+ $lang: Facade<LangService, Constructor<LangService>>;
854
+ };
855
+
856
+ declare const services_3: {
708
857
  $ui: Facade<UIService, Constructor<UIService>>;
709
858
  };
710
859
 
@@ -730,15 +879,18 @@ export declare type UIComponent = ObjectValues<typeof UIComponents>;
730
879
  export declare const UIComponents: {
731
880
  readonly AlertModal: "alert-modal";
732
881
  readonly ConfirmModal: "confirm-modal";
882
+ readonly LoadingModal: "loading-modal";
733
883
  };
734
884
 
735
- declare class UIService extends _default_2 {
885
+ declare class UIService extends _default_3 {
736
886
  private modalCallbacks;
737
887
  private components;
738
888
  alert(message: string): void;
739
889
  alert(title: string, message: string): void;
740
890
  confirm(message: string): Promise<boolean>;
741
891
  confirm(title: string, message: string): Promise<boolean>;
892
+ loading<T>(operation: Promise<T>): Promise<T>;
893
+ loading<T>(message: string, operation: Promise<T>): Promise<T>;
742
894
  registerComponent(name: UIComponent, component: Component): void;
743
895
  openModal<TModalComponent extends ModalComponent>(component: TModalComponent, properties?: ModalProperties<TModalComponent>): Promise<Modal<ModalResult<TModalComponent>>>;
744
896
  closeModal(id: string, result?: unknown): Promise<void>;
@@ -747,7 +899,7 @@ declare class UIService extends _default_2 {
747
899
  private watchModalEvents;
748
900
  }
749
901
 
750
- export declare type UIServices = typeof services_2;
902
+ export declare type UIServices = typeof services_3;
751
903
 
752
904
  export declare type UnknownEvent<T> = T extends keyof EventsPayload ? never : T;
753
905
 
@@ -759,14 +911,18 @@ export declare function useEvent<Event extends string>(event: UnknownEvent<Event
759
911
 
760
912
  export declare function useForm<const T extends FormFieldDefinitions>(fields: T): Form<T> & FormData_2<T>;
761
913
 
914
+ export declare function useInputAttrs(): [ComputedRef<{}>, ComputedRef<unknown>];
915
+
762
916
  export { }
763
917
 
918
+ export interface Services extends ErrorsServices {}
919
+
764
920
  declare global {
765
921
  export const __AG_BASE_PATH: string | undefined;
766
922
  export const __AG_ENV: 'production' | 'development' | 'testing';
767
923
  }
768
924
 
769
- interface Services extends LangServices {}
925
+ export interface Services extends LangServices {}
770
926
 
771
927
  declare module '@vue/runtime-core' {
772
928
  interface ComponentCustomProperties {
@@ -774,6 +930,10 @@ declare module '@vue/runtime-core' {
774
930
  }
775
931
  }
776
932
 
933
+ interface AerogelOptions {
934
+ services?: Record<string, Service>;
935
+ }
936
+
777
937
  declare module '@vue/runtime-core' {
778
938
  interface ComponentCustomProperties extends Services {}
779
939
  }
@@ -790,4 +950,4 @@ declare module '@vue/runtime-core' {
790
950
  components?: Partial<Record<UIComponent, Component>>;
791
951
  }
792
952
 
793
- interface Services extends UIServices {}
953
+ export interface Services extends UIServices {}