@aerogel/core 0.0.0-next.7f6ed5a1f91688a86bf5ede2adc465e4fd6cfdea → 0.0.0-next.8323c60b905020dcb3bd9d4b0bc8d9b6529e1082

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 (187) hide show
  1. package/dist/aerogel-core.css +1 -0
  2. package/dist/aerogel-core.d.ts +2547 -422
  3. package/dist/aerogel-core.js +3722 -0
  4. package/dist/aerogel-core.js.map +1 -0
  5. package/package.json +39 -37
  6. package/src/bootstrap/bootstrap.test.ts +7 -66
  7. package/src/bootstrap/index.ts +46 -33
  8. package/src/bootstrap/options.ts +8 -1
  9. package/src/components/AppLayout.vue +14 -0
  10. package/src/components/AppModals.vue +14 -0
  11. package/src/components/AppOverlays.vue +9 -0
  12. package/src/components/AppToasts.vue +16 -0
  13. package/src/components/contracts/AlertModal.ts +19 -0
  14. package/src/components/contracts/Button.ts +16 -0
  15. package/src/components/contracts/ConfirmModal.ts +48 -0
  16. package/src/components/contracts/DropdownMenu.ts +25 -0
  17. package/src/components/contracts/ErrorReportModal.ts +33 -0
  18. package/src/components/contracts/Input.ts +26 -0
  19. package/src/components/contracts/LoadingModal.ts +26 -0
  20. package/src/components/contracts/Modal.ts +21 -0
  21. package/src/components/contracts/PromptModal.ts +34 -0
  22. package/src/components/contracts/Select.ts +45 -0
  23. package/src/components/contracts/Toast.ts +15 -0
  24. package/src/components/contracts/index.ts +11 -0
  25. package/src/components/headless/HeadlessButton.vue +51 -0
  26. package/src/components/headless/HeadlessInput.vue +59 -0
  27. package/src/components/headless/HeadlessInputDescription.vue +27 -0
  28. package/src/components/headless/HeadlessInputError.vue +22 -0
  29. package/src/components/headless/HeadlessInputInput.vue +86 -0
  30. package/src/components/headless/HeadlessInputLabel.vue +18 -0
  31. package/src/components/headless/HeadlessInputTextArea.vue +40 -0
  32. package/src/components/headless/HeadlessModal.vue +57 -0
  33. package/src/components/headless/HeadlessModalContent.vue +30 -0
  34. package/src/components/headless/HeadlessModalDescription.vue +12 -0
  35. package/src/components/headless/HeadlessModalOverlay.vue +12 -0
  36. package/src/components/headless/HeadlessModalTitle.vue +12 -0
  37. package/src/components/headless/HeadlessSelect.vue +120 -0
  38. package/src/components/headless/HeadlessSelectError.vue +25 -0
  39. package/src/components/headless/HeadlessSelectLabel.vue +25 -0
  40. package/src/components/headless/HeadlessSelectOption.vue +34 -0
  41. package/src/components/headless/HeadlessSelectOptions.vue +42 -0
  42. package/src/components/headless/HeadlessSelectTrigger.vue +22 -0
  43. package/src/components/headless/HeadlessSelectValue.vue +18 -0
  44. package/src/components/headless/HeadlessSwitch.vue +96 -0
  45. package/src/components/headless/HeadlessToast.vue +18 -0
  46. package/src/components/headless/HeadlessToastAction.vue +13 -0
  47. package/src/components/headless/index.ts +20 -2
  48. package/src/components/index.ts +6 -6
  49. package/src/components/ui/AdvancedOptions.vue +18 -0
  50. package/src/components/ui/AlertModal.vue +17 -0
  51. package/src/components/ui/Button.vue +115 -0
  52. package/src/components/ui/Checkbox.vue +56 -0
  53. package/src/components/ui/ConfirmModal.vue +50 -0
  54. package/src/components/ui/DropdownMenu.vue +32 -0
  55. package/src/components/ui/DropdownMenuOption.vue +22 -0
  56. package/src/components/ui/DropdownMenuOptions.vue +44 -0
  57. package/src/components/ui/EditableContent.vue +82 -0
  58. package/src/components/ui/ErrorLogs.vue +19 -0
  59. package/src/components/ui/ErrorLogsModal.vue +48 -0
  60. package/src/components/ui/ErrorMessage.vue +15 -0
  61. package/src/components/ui/ErrorReportModal.vue +73 -0
  62. package/src/components/ui/ErrorReportModalButtons.vue +118 -0
  63. package/src/components/ui/ErrorReportModalTitle.vue +24 -0
  64. package/src/components/ui/Form.vue +24 -0
  65. package/src/components/ui/Input.vue +56 -0
  66. package/src/components/ui/Link.vue +12 -0
  67. package/src/components/ui/LoadingModal.vue +34 -0
  68. package/src/components/ui/Markdown.vue +97 -0
  69. package/src/components/ui/Modal.vue +131 -0
  70. package/src/components/ui/ModalContext.vue +31 -0
  71. package/src/components/ui/ProgressBar.vue +51 -0
  72. package/src/components/ui/PromptModal.vue +38 -0
  73. package/src/components/ui/Select.vue +27 -0
  74. package/src/components/ui/SelectLabel.vue +21 -0
  75. package/src/components/ui/SelectOption.vue +29 -0
  76. package/src/components/ui/SelectOptions.vue +35 -0
  77. package/src/components/ui/SelectTrigger.vue +29 -0
  78. package/src/components/ui/Setting.vue +31 -0
  79. package/src/components/ui/SettingsModal.vue +15 -0
  80. package/src/components/ui/StartupCrash.vue +31 -0
  81. package/src/components/ui/Switch.vue +11 -0
  82. package/src/components/ui/TextArea.vue +56 -0
  83. package/src/components/ui/Toast.vue +46 -0
  84. package/src/components/ui/index.ts +35 -0
  85. package/src/directives/index.ts +29 -6
  86. package/src/directives/measure.ts +46 -0
  87. package/src/errors/Errors.state.ts +31 -0
  88. package/src/errors/Errors.ts +200 -0
  89. package/src/errors/JobCancelledError.ts +3 -0
  90. package/src/errors/index.ts +53 -0
  91. package/src/errors/settings/Debug.vue +32 -0
  92. package/src/errors/settings/index.ts +10 -0
  93. package/src/errors/utils.ts +35 -0
  94. package/src/forms/FormController.test.ts +113 -0
  95. package/src/forms/FormController.ts +255 -0
  96. package/src/forms/index.ts +3 -2
  97. package/src/forms/utils.ts +87 -14
  98. package/src/forms/validation.ts +50 -0
  99. package/src/index.css +76 -0
  100. package/src/{main.ts → index.ts} +5 -0
  101. package/src/jobs/Job.ts +147 -0
  102. package/src/jobs/index.ts +10 -0
  103. package/src/jobs/listeners.ts +3 -0
  104. package/src/jobs/status.ts +4 -0
  105. package/src/lang/DefaultLangProvider.ts +46 -0
  106. package/src/lang/Lang.state.ts +11 -0
  107. package/src/lang/Lang.ts +63 -9
  108. package/src/lang/index.ts +22 -75
  109. package/src/lang/settings/Language.vue +48 -0
  110. package/src/lang/settings/index.ts +10 -0
  111. package/src/lang/utils.ts +4 -0
  112. package/src/plugins/Plugin.ts +8 -0
  113. package/src/plugins/index.ts +29 -0
  114. package/src/services/App.state.ts +50 -0
  115. package/src/services/App.ts +63 -0
  116. package/src/services/Cache.ts +43 -0
  117. package/src/services/Events.test.ts +39 -0
  118. package/src/services/Events.ts +110 -36
  119. package/src/services/Service.ts +273 -35
  120. package/src/services/Storage.ts +20 -0
  121. package/src/services/index.ts +45 -8
  122. package/src/services/store.ts +30 -0
  123. package/src/services/utils.ts +18 -0
  124. package/src/testing/index.ts +30 -0
  125. package/src/testing/setup.ts +11 -0
  126. package/src/types/vite.d.ts +0 -2
  127. package/src/ui/UI.state.ts +21 -13
  128. package/src/ui/UI.ts +350 -53
  129. package/src/ui/index.ts +40 -25
  130. package/src/ui/utils.ts +16 -0
  131. package/src/utils/app.ts +7 -0
  132. package/src/utils/classes.ts +41 -0
  133. package/src/utils/composition/events.ts +4 -5
  134. package/src/utils/composition/forms.ts +27 -0
  135. package/src/utils/composition/hooks.ts +9 -0
  136. package/src/utils/composition/persistent.test.ts +33 -0
  137. package/src/utils/composition/persistent.ts +11 -0
  138. package/src/utils/composition/state.test.ts +47 -0
  139. package/src/utils/composition/state.ts +33 -0
  140. package/src/utils/index.ts +9 -0
  141. package/src/utils/markdown.test.ts +50 -0
  142. package/src/utils/markdown.ts +60 -4
  143. package/src/utils/types.ts +3 -0
  144. package/src/utils/vue.ts +38 -121
  145. package/.eslintrc.js +0 -3
  146. package/dist/aerogel-core.cjs.js +0 -2
  147. package/dist/aerogel-core.cjs.js.map +0 -1
  148. package/dist/aerogel-core.esm.js +0 -2
  149. package/dist/aerogel-core.esm.js.map +0 -1
  150. package/noeldemartin.config.js +0 -2
  151. package/src/bootstrap/hooks.ts +0 -19
  152. package/src/components/AGAppLayout.vue +0 -11
  153. package/src/components/AGAppOverlays.vue +0 -39
  154. package/src/components/basic/AGMarkdown.vue +0 -20
  155. package/src/components/basic/index.ts +0 -3
  156. package/src/components/forms/AGButton.vue +0 -11
  157. package/src/components/forms/AGForm.vue +0 -26
  158. package/src/components/forms/AGInput.vue +0 -32
  159. package/src/components/forms/index.ts +0 -5
  160. package/src/components/headless/forms/AGHeadlessButton.vue +0 -51
  161. package/src/components/headless/forms/AGHeadlessInput.ts +0 -8
  162. package/src/components/headless/forms/AGHeadlessInput.vue +0 -54
  163. package/src/components/headless/forms/AGHeadlessInputError.vue +0 -22
  164. package/src/components/headless/forms/AGHeadlessInputInput.vue +0 -29
  165. package/src/components/headless/forms/index.ts +0 -4
  166. package/src/components/headless/modals/AGHeadlessModal.ts +0 -7
  167. package/src/components/headless/modals/AGHeadlessModal.vue +0 -84
  168. package/src/components/headless/modals/AGHeadlessModalPanel.vue +0 -20
  169. package/src/components/headless/modals/AGHeadlessModalTitle.vue +0 -13
  170. package/src/components/headless/modals/index.ts +0 -6
  171. package/src/components/modals/AGAlertModal.vue +0 -15
  172. package/src/components/modals/AGModal.ts +0 -6
  173. package/src/components/modals/AGModal.vue +0 -18
  174. package/src/components/modals/AGModalContext.ts +0 -8
  175. package/src/components/modals/AGModalContext.vue +0 -22
  176. package/src/components/modals/index.ts +0 -5
  177. package/src/directives/initial-focus.ts +0 -11
  178. package/src/forms/Form.test.ts +0 -37
  179. package/src/forms/Form.ts +0 -154
  180. package/src/forms/composition.ts +0 -6
  181. package/src/lang/helpers.ts +0 -5
  182. package/src/models/index.ts +0 -18
  183. package/src/routing/index.ts +0 -33
  184. package/src/testing/stubs/lang/en.yaml +0 -1
  185. package/src/testing/stubs/models/User.ts +0 -3
  186. package/tsconfig.json +0 -19
  187. package/vite.config.ts +0 -17
@@ -1,2 +0,0 @@
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");require("core-js/modules/esnext.async-iterator.reduce.js"),require("core-js/modules/esnext.iterator.reduce.js");var r=require("vue-i18n"),o=require("@babel/runtime/helpers/defineProperty"),s=require("soukai"),n=require("vue-router");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 a=require("@headlessui/vue"),l=require("dompurify"),i=require("marked");function u(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 d=u(o),c=u(l);const p=[];function m(){return{type:Boolean,default:arguments.length>0&&void 0!==arguments[0]&&arguments[0]}}function f(){return e.ref()}function v(e){return e}function h(t){const r=e.inject(t);return r?e.reactive(r):void 0}function _(e,r){return h(e)??t.fail(r??`Could not resolve '${e}' injection key`)}function x(){return{type:Object,default:arguments.length>0&&void 0!==arguments[0]?arguments[0]:null}}function g(){return{type:Number,required:!0}}function y(){return{type:Object,required:!0}}function b(){return{type:String,required:!0}}function k(){return{type:String,default:arguments.length>0&&void 0!==arguments[0]?arguments[0]:null}}const A={"initial-focus":{mounted(e,t){let{value:r}=t;!1!==r&&e.focus()}}};var w=async e=>{Object.entries(A).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 j(e){return class extends C{getInitialState(){return e.initialState}}}class C extends t.MagicObject{constructor(){super(),d.default(this,"_namespace",void 0),d.default(this,"_booted",void 0),d.default(this,"_state",void 0),this._namespace=new.target.name,this._booted=new t.PromisedValue,this._state=e.reactive(this.getInitialState())}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):super.__get(e)}__set(e,t){this.setState({[e]:t})}hasState(e){return e in this._state}getState(e){return e?this._state[e]:this._state}setState(e){Object.assign(this._state,e)}getInitialState(){return{}}async boot(){}}class B extends C{constructor(){super(...arguments),d.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 B);const S={$events:G};async function q(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 M=e=>q(e,S);var P=t.facade(new class extends C{constructor(){super(...arguments),d.default(this,"i18n",void 0)}setup(){this.i18n=r.useI18n()}translate(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return this.i18n?.t(e,t)??e}});function I(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return P.translate(e,t)}const E={$lang:P};async function $(e){const o=e.defaultLocale??"en",s=e.fallbackLocale??"en",n=function(e){return Object.entries(e).reduce(((e,r)=>{let[o,s]=r;const n=t.stringMatch(o,/.*\/lang\/(.+)\.yaml/)?.[1];return n&&(e[n]=()=>s().then((e=>{let{default:t}=e;return t}))),e}),{})}(e.messages),a=n[o]??t.fail(`Missing messages for '${o}' locale`),l={[o]:await a()};return r.createI18n({locale:o,fallbackLocale:s,messages:l})}var O=async(e,t)=>{const r=function(e){return e.lang?e.lang:e.langMessages?{messages:e.langMessages}:null}(t);if(!r)return;var o;o=()=>P.setup(),p.push(o);const s=await $(r);e.use(s),await q(e,E)},H=async(e,t)=>{t.models&&(s.setEngine(new s.IndexedDBEngine),s.bootModelsFromViteGlob(t.models))};var V=async(e,t)=>{if(!t.routes)return;const r=function(e){return n.createRouter({history:n.createWebHistory(e.basePath),routes:e.routes})}({routes:t.routes,basePath:t.basePath??__AG_BASE_PATH});e.use(r)},N=j({initialState:{modals:[]}});const F={AlertModal:"alert-modal"};var D=t.facade(new class extends N{constructor(){super(...arguments),d.default(this,"modalCallbacks",{}),d.default(this,"components",{})}alert(e){this.openModal(this.requireComponent(F.AlertModal),{message:e})}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}))}))}});function R(t,r){const o=G.on(t,r);e.onUnmounted((()=>o()))}var L=e.defineComponent({__name:"AGHeadlessModal",props:{cancellable:m(!0)},setup(t,{expose:r}){const o=t,s=e.ref(null),n=e.ref(!0),l=e.ref(!1),{modal:i}=_("modal");async function u(){s.value?.$el&&(n.value=!0)}async function d(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 R("close-modal",(async({id:e,result:t})=>{e===i.id&&await d(t)})),R("hide-modal",(async({id:e})=>{e===i.id&&await u()})),R("show-modal",(async({id:e})=>{e===i.id&&await async function(){s.value?.$el&&(n.value=!1)}()})),r({close:d,cancellable:e.toRef(o,"cancellable")}),(r,o)=>(e.openBlock(),e.createBlock(e.unref(a.Dialog),{ref_key:"$root",ref:s,open:!0,onClose:o[0]||(o[0]=e=>t.cancellable&&d())},{default:e.withCtx((()=>[e.renderSlot(r.$slots,"default",{close:d})])),_:3},512))}});L.__file="src/components/headless/modals/AGHeadlessModal.vue";var T=e.defineComponent({__name:"AGModalContext",props:{modal:y(),childIndex:g()},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))}});T.__file="src/components/modals/AGModalContext.vue";var z=e.defineComponent({__name:"AGHeadlessModalPanel",setup(t){const r=_("modal"),o=e.computed((()=>D.modals[r.childIndex]??null));return(t,s)=>(e.openBlock(),e.createBlock(e.unref(a.DialogPanel),null,{default:e.withCtx((()=>[e.renderSlot(t.$slots,"default"),o.value?(e.openBlock(),e.createBlock(T,{key:0,"child-index":e.unref(r).childIndex+1,modal:o.value},null,8,["child-index","modal"])):e.createCommentVNode("v-if",!0)])),_:3}))}});z.__file="src/components/headless/modals/AGHeadlessModalPanel.vue";const U={class:"fixed inset-0 flex items-center justify-center"},K={class:"flex max-h-full flex-col overflow-auto p-4"};var Q=e.defineComponent({__name:"AGModal",setup:t=>(t,r)=>(e.openBlock(),e.createBlock(L,{class:"relative z-50"},{default:e.withCtx((({close:r})=>[e.createElementVNode("div",U,[e.createVNode(z,{class:"flex max-h-full max-w-full flex-col overflow-hidden bg-white"},{default:e.withCtx((()=>[e.createElementVNode("div",K,[e.renderSlot(t.$slots,"default",{close:r})])])),_:2},1024)])])),_:3}))});function W(e){return t=i.marked(e,{mangle:!1,headerIds:!1}),c.default.sanitize(t,{ADD_ATTR:["target"]});var t}Q.__file="src/components/modals/AGModal.vue";var J=e.defineComponent({__name:"AGMarkdown",props:{langKey:k(),text:k()},setup(t){const r=t,o=e.computed((()=>r.text??(r.langKey&&I(r.langKey)))),s=e.computed((()=>o.value&&W(o.value))),n=()=>e.h("div",{class:"prose",innerHTML:s.value});return(t,r)=>(e.openBlock(),e.createBlock(n))}});J.__file="src/components/basic/AGMarkdown.vue";var X=e.defineComponent({__name:"AGAlertModal",props:{message:b()},setup:t=>(r,o)=>(e.openBlock(),e.createBlock(Q,null,{default:e.withCtx((()=>[e.createVNode(J,{text:t.message},null,8,["text"])])),_:1}))});X.__file="src/components/modals/AGAlertModal.vue";const Y={$ui:D};var Z=async(e,t)=>{const r={[F.AlertModal]:X};Object.entries({...r,...t.components}).forEach((e=>{let[t,r]=e;return D.registerComponent(t,r)})),await q(e,Y)};const ee={key:0};var te=e.defineComponent({__name:"AGAppOverlays",setup(t){const r=e.ref(null),o=e.ref(!0),s=e.computed((()=>D.modals[0]??null));return R("show-overlays-backdrop",(async()=>{r.value&&o.value&&(o.value=!1,r.value.classList.remove("opacity-0"))})),R("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",ee,[e.createVNode(T,{"child-index":1,modal:s.value},null,8,["modal"])])):e.createCommentVNode("v-if",!0)],64))}});te.__file="src/components/AGAppOverlays.vue";const re={class:"flex h-full flex-col text-base font-normal leading-tight text-gray-900 antialiased"};var oe=e.defineComponent({__name:"AGAppLayout",setup:t=>(t,r)=>(e.openBlock(),e.createElementBlock("div",re,[e.renderSlot(t.$slots,"default"),e.createVNode(te)]))});oe.__file="src/components/AGAppLayout.vue";var se=e.defineComponent({__name:"AGHeadlessButton",props:{url:k(),route:k(),routeParams:x((()=>({}))),routeQuery:x((()=>({}))),submit:m()},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))}});se.__file="src/components/headless/forms/AGHeadlessButton.vue";var ne=e.defineComponent({__name:"AGButton",setup:t=>(t,r)=>(e.openBlock(),e.createBlock(se,{class:"bg-indigo-600 px-2.5 py-1.5 text-white hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600"},{default:e.withCtx((()=>[e.renderSlot(t.$slots,"default")])),_:3}))});ne.__file="src/components/forms/AGButton.vue";const ae=["onSubmit"];var le=e.defineComponent({__name:"AGForm",props:{form:x()},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:k(),name:k(),modelValue:k()},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"),i={id: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=["value","aria-invalid","aria-describedby"];var de=e.defineComponent({__name:"AGHeadlessInputInput",setup(t){const r=e.ref(),o=_("input"),s=e.computed((()=>o.value));function n(){r.value&&o.update(r.value.value)}return(t,a)=>(e.openBlock(),e.createElementBlock("input",{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=_("input"),o=e.computed((()=>r.errors?I(`errors.${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:k()},setup(t){const r=f();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";var fe=e.defineComponent({__name:"AGHeadlessModalTitle",props:{as:k("h2")},setup:t=>(r,o)=>(e.openBlock(),e.createBlock(e.unref(a.DialogTitle),{as:t.as},{default:e.withCtx((()=>[e.renderSlot(r.$slots,"default")])),_:3},8,["as"]))});fe.__file="src/components/headless/modals/AGHeadlessModalTitle.vue";const ve={String:"string",Number:"number"};class he extends t.MagicObject{constructor(t){super(),d.default(this,"errors",void 0),d.default(this,"_fields",void 0),d.default(this,"_data",void 0),d.default(this,"_valid",void 0),d.default(this,"_submitted",void 0),d.default(this,"_errors",void 0),this._fields=t,this._submitted=e.ref(!1),this._valid=e.ref(!0),this._data=this.getInitialData(t),this._errors=this.getInitialErrors(t),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 Object.assign(this._errors,e),this._valid.value=!Object.values(e).some((e=>null!==e))}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)}}exports.AGAppLayout=oe,exports.AGButton=ne,exports.AGForm=le,exports.AGHeadlessButton=se,exports.AGHeadlessInput=ie,exports.AGHeadlessModal=L,exports.AGHeadlessModalPanel=z,exports.AGHeadlessModalTitle=fe,exports.AGInput=me,exports.AGMarkdown=J,exports.AGModal=Q,exports.AGModalContext=T,exports.Events=G,exports.EventsService=B,exports.FormFieldTypes=ve,exports.Lang=P,exports.Service=C,exports.UI=D,exports.UIComponents=F,exports.arrayProp=function(e){return{type:Array,default:e??(()=>[])}},exports.booleanProp=m,exports.bootServices=q,exports.bootstrapApplication=async function(t){let r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const o=[w,O,H,V,M,Z],s=e.createApp({data:()=>({ready:!1}),mounted(){p.forEach((e=>e())),this.ready=!0},render(){return this.ready?e.h(t):null}});await Promise.all(o.map((e=>e(s,r)))),s.mount("#app")},exports.componentRef=f,exports.defineDirective=v,exports.defineServiceState=j,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=h,exports.injectReactiveOrFail=_,exports.lang=I,exports.mixedProp=function(e){return{type:e,default:null}},exports.numberInput=function(e){return{default:e,type:ve.Number}},exports.numberProp=function(){return{type:Number,default:arguments.length>0&&void 0!==arguments[0]?arguments[0]:null}},exports.objectProp=x,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:ve.Number,rules:"required"}},exports.requiredNumberProp=g,exports.requiredObjectProp=y,exports.requiredStringInput=function(e){return{default:e,type:ve.String,rules:"required"}},exports.requiredStringProp=b,exports.stringInput=function(e){return{default:e,type:ve.String}},exports.stringProp=k,exports.useForm=function(e){return new he(e)};
2
- //# sourceMappingURL=aerogel-core.cjs.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"aerogel-core.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -1,2 +0,0 @@
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,markRaw as a,nextTick as r,onUnmounted as o,defineComponent as n,toRef as l,openBlock as i,createBlock as u,unref as d,withCtx as c,renderSlot as m,provide as p,resolveDynamicComponent as f,normalizeProps as h,guardReactiveProps as v,computed as _,createCommentVNode as g,createElementVNode as y,createVNode as b,h as A,createApp as x,createElementBlock as w,Fragment as j,withModifiers as G,readonly as k,toDisplayString as M,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 I,JSError as S,MagicObject as C,PromisedValue as H,facade as O,arr as P,tap as E,stringMatch as q,uuid as B,objectWithoutEmpty as F}from"@noeldemartin/utils";import"core-js/modules/esnext.async-iterator.reduce.js";import"core-js/modules/esnext.iterator.reduce.js";import{useI18n as L,createI18n as V}from"vue-i18n";import T from"@babel/runtime/helpers/esm/defineProperty";import{setEngine as N,IndexedDBEngine as D,bootModelsFromViteGlob as z}from"soukai";import{createRouter as K,createWebHistory as Q}from"vue-router";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 R,DialogPanel as U,DialogTitle as J}from"@headlessui/vue";import W from"dompurify";import{marked as X}from"marked";import"core-js/modules/esnext.async-iterator.some.js";import"core-js/modules/esnext.iterator.some.js";const Y=[];function Z(e){return{type:Array,default:e??(()=>[])}}function ee(){return{type:Boolean,default:arguments.length>0&&void 0!==arguments[0]&&arguments[0]}}function te(){return e()}function se(e){return e}function ae(e,t){const s=Object.values(e);return{type:String,default:t??s[0]??null,validator:e=>s.includes(e)}}function re(e){const a=t(e);return a?s(a):void 0}function oe(e,t){return re(e)??I(t??`Could not resolve '${e}' injection key`)}function ne(e,s){return t(e)??I(s??`Could not resolve '${e}' injection key`)}function le(e){return{type:e,default:null}}function ie(){return{type:Number,default:arguments.length>0&&void 0!==arguments[0]?arguments[0]:null}}function ue(){return{type:Object,default:arguments.length>0&&void 0!==arguments[0]?arguments[0]:null}}function de(){return{type:Array,required:!0}}function ce(e){const t=Object.values(e);return{type:String,required:!0,validator:e=>t.includes(e)}}function me(e){return{type:e,required:!0}}function pe(){return{type:Number,required:!0}}function fe(){return{type:Object,required:!0}}function he(){return{type:String,required:!0}}function ve(){return{type:String,default:arguments.length>0&&void 0!==arguments[0]?arguments[0]:null}}const _e={"initial-focus":{mounted(e,t){let{value:s}=t;!1!==s&&e.focus()}}};var ge=async e=>{Object.entries(_e).forEach((t=>{let[s,a]=t;return e.directive(s,a)}))};class ServiceBootError extends S{constructor(e,t){super(`Service '${e}' failed booting`,{cause:t})}}function ye(e){return class extends be{getInitialState(){return e.initialState}}}class be extends C{constructor(){super(),T(this,"_namespace",void 0),T(this,"_booted",void 0),T(this,"_state",void 0),this._namespace=new.target.name,this._booted=new H,this._state=s(this.getInitialState())}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):super.__get(e)}__set(e,t){this.setState({[e]:t})}hasState(e){return e in this._state}getState(e){return e?this._state[e]:this._state}setState(e){Object.assign(this._state,e)}getInitialState(){return{}}async boot(){}}class Ae extends be{constructor(){super(...arguments),T(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]??=P([])).push(t),()=>this.off(e,t)}once(e,t){let s=null;return E((()=>s&&this.off(e,s)),(a=>{(this.listeners[e]??=P([])).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 xe=O(new Ae);const we={$events:xe};async function je(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 Ge=e=>je(e,we);var ke=O(new class extends be{constructor(){super(...arguments),T(this,"i18n",void 0)}setup(){this.i18n=L()}translate(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return this.i18n?.t(e,t)??e}});function Me(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return ke.translate(e,t)}const $e={$lang:ke};async function Ie(e){const t=e.defaultLocale??"en",s=e.fallbackLocale??"en",a=function(e){return Object.entries(e).reduce(((e,t)=>{let[s,a]=t;const r=q(s,/.*\/lang\/(.+)\.yaml/)?.[1];return r&&(e[r]=()=>a().then((e=>{let{default:t}=e;return t}))),e}),{})}(e.messages),r=a[t]??I(`Missing messages for '${t}' locale`),o={[t]:await r()};return V({locale:t,fallbackLocale:s,messages:o})}var Se=async(e,t)=>{const s=function(e){return e.lang?e.lang:e.langMessages?{messages:e.langMessages}:null}(t);if(!s)return;var a;a=()=>ke.setup(),Y.push(a);const r=await Ie(s);e.use(r),await je(e,$e)},Ce=async(e,t)=>{t.models&&(N(new D),z(t.models))};var He=async(e,t)=>{if(!t.routes)return;const s=function(e){return K({history:Q(e.basePath),routes:e.routes})}({routes:t.routes,basePath:t.basePath??__AG_BASE_PATH});e.use(s)},Oe=ye({initialState:{modals:[]}});const Pe={AlertModal:"alert-modal"};var Ee=O(new class extends Oe{constructor(){super(...arguments),T(this,"modalCallbacks",{}),T(this,"components",{})}alert(e){this.openModal(this.requireComponent(Pe.AlertModal),{message:e})}registerComponent(e,t){this.components[e]=t}async openModal(e,t){const s=B(),o={},n={id:s,properties:t??{},component:a(e),beforeClose:new Promise((e=>o.willClose=e)),afterClose:new Promise((e=>o.closed=e))},l=this.modals.at(-1),i=this.modals.concat(n);return this.modalCallbacks[n.id]=o,this.setState({modals:i}),await r(),await(l&&xe.emit("hide-modal",{id:l.id})),await Promise.all([l||xe.emit("show-overlays-backdrop"),xe.emit("show-modal",{id:n.id})]),n}async closeModal(e,t){await xe.emit("close-modal",{id:e,result:t})}async boot(){await super.boot(),this.watchModalEvents()}requireComponent(e){return this.components[e]??I(`UI Component '${e}' is not defined!`)}watchModalEvents(){xe.on("modal-will-close",(e=>{let{modal:t,result:s}=e;this.modalCallbacks[t.id]?.willClose?.(s),1===this.modals.length&&xe.emit("hide-overlays-backdrop")})),xe.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&&xe.emit("show-modal",{id:a.id}))}))}});function qe(e,t){const s=xe.on(e,t);o((()=>s()))}var Be=n({__name:"AGHeadlessModal",props:{cancellable:ee(!0)},setup(t,{expose:s}){const a=t,r=e(null),o=e(!0),n=e(!1),{modal:p}=oe("modal");async function f(){r.value?.$el&&(o.value=!0)}async function h(e){n.value||(xe.emit("modal-will-close",{modal:p,result:e}),await f(),n.value=!0,xe.emit("modal-closed",{modal:p,result:e}))}return qe("close-modal",(async({id:e,result:t})=>{e===p.id&&await h(t)})),qe("hide-modal",(async({id:e})=>{e===p.id&&await f()})),qe("show-modal",(async({id:e})=>{e===p.id&&await async function(){r.value?.$el&&(o.value=!1)}()})),s({close:h,cancellable:l(a,"cancellable")}),(e,s)=>(i(),u(d(R),{ref_key:"$root",ref:r,open:!0,onClose:s[0]||(s[0]=e=>t.cancellable&&h())},{default:c((()=>[m(e.$slots,"default",{close:h})])),_:3},512))}});Be.__file="src/components/headless/modals/AGHeadlessModal.vue";var Fe=n({__name:"AGModalContext",props:{modal:fe(),childIndex:pe()},setup(e){const t=e;return p("modal",{modal:l(t,"modal"),childIndex:l(t,"childIndex")}),(t,s)=>(i(),u(f(e.modal.component),h(v(e.modal.properties)),null,16))}});Fe.__file="src/components/modals/AGModalContext.vue";var Le=n({__name:"AGHeadlessModalPanel",setup(e){const t=oe("modal"),s=_((()=>Ee.modals[t.childIndex]??null));return(e,a)=>(i(),u(d(U),null,{default:c((()=>[m(e.$slots,"default"),s.value?(i(),u(Fe,{key:0,"child-index":d(t).childIndex+1,modal:s.value},null,8,["child-index","modal"])):g("v-if",!0)])),_:3}))}});Le.__file="src/components/headless/modals/AGHeadlessModalPanel.vue";const Ve={class:"fixed inset-0 flex items-center justify-center"},Te={class:"flex max-h-full flex-col overflow-auto p-4"};var Ne=n({__name:"AGModal",setup:e=>(e,t)=>(i(),u(Be,{class:"relative z-50"},{default:c((({close:t})=>[y("div",Ve,[b(Le,{class:"flex max-h-full max-w-full flex-col overflow-hidden bg-white"},{default:c((()=>[y("div",Te,[m(e.$slots,"default",{close:t})])])),_:2},1024)])])),_:3}))});function De(e){return t=X(e,{mangle:!1,headerIds:!1}),W.sanitize(t,{ADD_ATTR:["target"]});var t}Ne.__file="src/components/modals/AGModal.vue";var ze=n({__name:"AGMarkdown",props:{langKey:ve(),text:ve()},setup(e){const t=e,s=_((()=>t.text??(t.langKey&&Me(t.langKey)))),a=_((()=>s.value&&De(s.value))),r=()=>A("div",{class:"prose",innerHTML:a.value});return(e,t)=>(i(),u(r))}});ze.__file="src/components/basic/AGMarkdown.vue";var Ke=n({__name:"AGAlertModal",props:{message:he()},setup:e=>(t,s)=>(i(),u(Ne,null,{default:c((()=>[b(ze,{text:e.message},null,8,["text"])])),_:1}))});Ke.__file="src/components/modals/AGAlertModal.vue";const Qe={$ui:Ee};var Re=async(e,t)=>{const s={[Pe.AlertModal]:Ke};Object.entries({...s,...t.components}).forEach((e=>{let[t,s]=e;return Ee.registerComponent(t,s)})),await je(e,Qe)};async function Ue(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const s=[ge,Se,Ce,He,Ge,Re],a=x({data:()=>({ready:!1}),mounted(){Y.forEach((e=>e())),this.ready=!0},render(){return this.ready?A(e):null}});await Promise.all(s.map((e=>e(a,t)))),a.mount("#app")}const Je={key:0};var We=n({__name:"AGAppOverlays",setup(t){const s=e(null),a=e(!0),r=_((()=>Ee.modals[0]??null));return qe("show-overlays-backdrop",(async()=>{s.value&&a.value&&(a.value=!1,s.value.classList.remove("opacity-0"))})),qe("hide-overlays-backdrop",(async()=>{s.value&&!a.value&&(a.value=!0,s.value.classList.add("opacity-0"))})),(e,t)=>(i(),w(j,null,[y("div",{ref_key:"$backdrop",ref:s,class:"pointer-events-none fixed inset-0 z-50 bg-black/30 opacity-0"},null,512),r.value?(i(),w("aside",Je,[b(Fe,{"child-index":1,modal:r.value},null,8,["modal"])])):g("v-if",!0)],64))}});We.__file="src/components/AGAppOverlays.vue";const Xe={class:"flex h-full flex-col text-base font-normal leading-tight text-gray-900 antialiased"};var Ye=n({__name:"AGAppLayout",setup:e=>(e,t)=>(i(),w("div",Xe,[m(e.$slots,"default"),b(We)]))});Ye.__file="src/components/AGAppLayout.vue";var Ze=n({__name:"AGHeadlessButton",props:{url:ve(),route:ve(),routeParams:ue((()=>({}))),routeQuery:ue((()=>({}))),submit:ee()},setup(e){const{url:t,route:s,routeParams:a,routeQuery:r,submit:o}=e,n=_((()=>s?{tag:"router-link",props:{to:F({name:s,params:a,query:r})}}:t?{tag:"a",props:{target:"_blank",href:t}}:{tag:"button",props:{type:o?"submit":"button"}}));return(e,t)=>(i(),u(f(n.value.tag),h(v(n.value.props)),{default:c((()=>[m(e.$slots,"default")])),_:3},16))}});Ze.__file="src/components/headless/forms/AGHeadlessButton.vue";var et=n({__name:"AGButton",setup:e=>(e,t)=>(i(),u(Ze,{class:"bg-indigo-600 px-2.5 py-1.5 text-white hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600"},{default:c((()=>[m(e.$slots,"default")])),_:3}))});et.__file="src/components/forms/AGButton.vue";const tt=["onSubmit"];var st=n({__name:"AGForm",props:{form:ue()},emits:["submit"],setup(e,{emit:t}){const s=e;function a(){s.form&&!s.form.submit()||t("submit")}return p("form",s.form),(e,t)=>(i(),w("form",{onSubmit:G(a,["prevent"])},[m(e.$slots,"default")],40,tt))}});st.__file="src/components/forms/AGForm.vue";var at=n({__name:"AGHeadlessInput",props:{as:ve(),name:ve(),modelValue:ve()},emits:["update:modelValue"],setup(e,{expose:s,emit:a}){const r=e,o=_((()=>n&&r.name?n.errors[r.name]??null:null)),n=t("form"),l={id:B(),value:_((()=>n&&r.name?n.getFieldValue(r.name):r.modelValue)),errors:k(o),update(e){n&&r.name?n.setFieldValue(r.name,e):a("update:modelValue",e)}};return p("input",l),s(l),(t,s)=>e.as?(i(),u(f(e.as),{key:0},{default:c((()=>[m(t.$slots,"default")])),_:3})):m(t.$slots,"default",{key:1})}});at.__file="src/components/headless/forms/AGHeadlessInput.vue";const rt=["value","aria-invalid","aria-describedby"];var ot=n({__name:"AGHeadlessInputInput",setup(t){const s=e(),a=oe("input"),r=_((()=>a.value));function o(){s.value&&a.update(s.value.value)}return(e,t)=>(i(),w("input",{ref_key:"$input",ref:s,type:"text",value:r.value,"aria-invalid":d(a).errors?"true":"false","aria-describedby":d(a).errors?`${d(a).id}-error`:void 0,onInput:o},null,40,rt))}});ot.__file="src/components/headless/forms/AGHeadlessInputInput.vue";const nt=["id"];var lt=n({__name:"AGHeadlessInputError",setup(e){const t=oe("input"),s=_((()=>t.errors?Me(`errors.${t.errors[0]}`):null));return(e,a)=>s.value?(i(),w("p",{key:0,id:`${d(t).id}-error`},M(s.value),9,nt)):g("v-if",!0)}});lt.__file="src/components/headless/forms/AGHeadlessInputError.vue";var it=n({inheritAttrs:!1,__name:"AGInput",props:{name:ve()},setup(e){const t=te();return(s,a)=>(i(),u(at,{ref_key:"$input",ref:t,as:"div",class:"flex flex-col items-center",name:e.name},{default:c((()=>[b(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":d(t)?.errors}]}),null,16,["class"]),b(lt,{class:"mt-1 text-sm text-red-500"})])),_:1},8,["name"]))}});it.__file="src/components/forms/AGInput.vue";var ut=n({__name:"AGHeadlessModalTitle",props:{as:ve("h2")},setup:e=>(t,s)=>(i(),u(d(J),{as:e.as},{default:c((()=>[m(t.$slots,"default")])),_:3},8,["as"]))});ut.__file="src/components/headless/modals/AGHeadlessModalTitle.vue";const dt={String:"string",Number:"number"};class ct extends C{constructor(t){super(),T(this,"errors",void 0),T(this,"_fields",void 0),T(this,"_data",void 0),T(this,"_valid",void 0),T(this,"_submitted",void 0),T(this,"_errors",void 0),this._fields=t,this._submitted=e(!1),this._valid=e(!0),this._data=this.getInitialData(t),this._errors=this.getInitialErrors(t),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 Object.assign(this._errors,e),this._valid.value=!Object.values(e).some((e=>null!==e))}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)}}function mt(e){return new ct(e)}function pt(e){return{default:e,type:dt.Number,rules:"required"}}function ft(e){return{default:e,type:dt.String,rules:"required"}}function ht(e){return{default:e,type:dt.Number}}function vt(e){return{default:e,type:dt.String}}export{Ye as AGAppLayout,et as AGButton,st as AGForm,Ze as AGHeadlessButton,at as AGHeadlessInput,Be as AGHeadlessModal,Le as AGHeadlessModalPanel,ut as AGHeadlessModalTitle,it as AGInput,ze as AGMarkdown,Ne as AGModal,Fe as AGModalContext,xe as Events,Ae as EventsService,dt as FormFieldTypes,ke as Lang,be as Service,Ee as UI,Pe as UIComponents,Z as arrayProp,ee as booleanProp,je as bootServices,Ue as bootstrapApplication,te as componentRef,se as defineDirective,ye as defineServiceState,ae as enumProp,ne as injectOrFail,re as injectReactive,oe as injectReactiveOrFail,Me as lang,le as mixedProp,ht as numberInput,ie as numberProp,ue as objectProp,de as requiredArrayProp,ce as requiredEnumProp,me as requiredMixedProp,pt as requiredNumberInput,pe as requiredNumberProp,fe as requiredObjectProp,ft as requiredStringInput,he as requiredStringProp,vt as stringInput,ve as stringProp,mt as useForm};
2
- //# sourceMappingURL=aerogel-core.esm.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"aerogel-core.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -1,2 +0,0 @@
1
- /** @type {import('@noeldemartin/scripts').Config} */
2
- module.exports = { vue: true };
@@ -1,19 +0,0 @@
1
- import type { App } from 'vue';
2
-
3
- import type { BootstrapOptions } from '@/bootstrap/options';
4
-
5
- const mountedHooks: Function[] = [];
6
-
7
- export type BootstrapHook = (app: App, options: BootstrapOptions) => Promise<void>;
8
-
9
- export function onAppMounted(hook: Function): void {
10
- mountedHooks.push(hook);
11
- }
12
-
13
- export function runAppMountedHooks(): void {
14
- mountedHooks.forEach((hook) => hook());
15
- }
16
-
17
- export function defineBootstrapHook<T extends BootstrapHook>(hook: T): T {
18
- return hook;
19
- }
@@ -1,11 +0,0 @@
1
- <template>
2
- <div class="flex h-full flex-col text-base font-normal leading-tight text-gray-900 antialiased">
3
- <slot />
4
-
5
- <AGAppOverlays />
6
- </div>
7
- </template>
8
-
9
- <script setup lang="ts">
10
- import AGAppOverlays from './AGAppOverlays.vue';
11
- </script>
@@ -1,39 +0,0 @@
1
- <template>
2
- <div ref="$backdrop" class="pointer-events-none fixed inset-0 z-50 bg-black/30 opacity-0" />
3
- <aside v-if="modal">
4
- <AGModalContext :child-index="1" :modal="modal" />
5
- </aside>
6
- </template>
7
-
8
- <script setup lang="ts">
9
- import { computed, ref } from 'vue';
10
-
11
- import UI from '@/ui/UI';
12
- import { useEvent } from '@/utils/composition/events';
13
-
14
- import AGModalContext from './modals/AGModalContext.vue';
15
-
16
- const $backdrop = ref<HTMLElement | null>(null);
17
- const backdropHidden = ref(true);
18
- const modal = computed(() => UI.modals[0] ?? null);
19
-
20
- useEvent('show-overlays-backdrop', async () => {
21
- if (!$backdrop.value || !backdropHidden.value) {
22
- return;
23
- }
24
-
25
- backdropHidden.value = false;
26
-
27
- $backdrop.value.classList.remove('opacity-0');
28
- });
29
-
30
- useEvent('hide-overlays-backdrop', async () => {
31
- if (!$backdrop.value || backdropHidden.value) {
32
- return;
33
- }
34
-
35
- backdropHidden.value = true;
36
-
37
- $backdrop.value.classList.add('opacity-0');
38
- });
39
- </script>
@@ -1,20 +0,0 @@
1
- <template>
2
- <root />
3
- </template>
4
-
5
- <script setup lang="ts">
6
- import { computed, h } from 'vue';
7
-
8
- import { renderMarkdown } from '@/utils/markdown';
9
- import { stringProp } from '@/utils/vue';
10
- import { lang } from '@/lang/helpers';
11
-
12
- const props = defineProps({
13
- langKey: stringProp(),
14
- text: stringProp(),
15
- });
16
-
17
- const markdown = computed(() => props.text ?? (props.langKey && lang(props.langKey)));
18
- const html = computed(() => markdown.value && renderMarkdown(markdown.value));
19
- const root = () => h('div', { class: 'prose', innerHTML: html.value });
20
- </script>
@@ -1,3 +0,0 @@
1
- import AGMarkdown from './AGMarkdown.vue';
2
-
3
- export { AGMarkdown };
@@ -1,11 +0,0 @@
1
- <template>
2
- <AGHeadlessButton
3
- class="bg-indigo-600 px-2.5 py-1.5 text-white hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600"
4
- >
5
- <slot />
6
- </AGHeadlessButton>
7
- </template>
8
-
9
- <script setup lang="ts">
10
- import AGHeadlessButton from '../headless/forms/AGHeadlessButton.vue';
11
- </script>
@@ -1,26 +0,0 @@
1
- <template>
2
- <form @submit.prevent="submit">
3
- <slot />
4
- </form>
5
- </template>
6
-
7
- <script setup lang="ts">
8
- import { provide } from 'vue';
9
-
10
- import { objectProp } from '@/utils/vue';
11
- import type Form from '@/forms/Form';
12
-
13
- const props = defineProps({ form: objectProp<Form>() });
14
-
15
- const emit = defineEmits<{ submit: [] }>();
16
-
17
- provide('form', props.form);
18
-
19
- function submit() {
20
- if (props.form && !props.form.submit()) {
21
- return;
22
- }
23
-
24
- emit('submit');
25
- }
26
- </script>
@@ -1,32 +0,0 @@
1
- <template>
2
- <AGHeadlessInput
3
- ref="$input"
4
- as="div"
5
- class="flex flex-col items-center"
6
- :name="name"
7
- >
8
- <AGHeadlessInputInput
9
- v-bind="$attrs"
10
- 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"
11
- :class="{
12
- 'ring-1 ring-red-500': $input?.errors,
13
- }"
14
- />
15
- <AGHeadlessInputError class="mt-1 text-sm text-red-500" />
16
- </AGHeadlessInput>
17
- </template>
18
-
19
- <script setup lang="ts">
20
- import { componentRef, stringProp } from '@/utils/vue';
21
-
22
- import type { IAGHeadlessInput } from '@/components/headless/forms/AGHeadlessInput';
23
-
24
- import AGHeadlessInput from '../headless/forms/AGHeadlessInput.vue';
25
- import AGHeadlessInputInput from '../headless/forms/AGHeadlessInputInput.vue';
26
- import AGHeadlessInputError from '../headless/forms/AGHeadlessInputError.vue';
27
-
28
- defineProps({ name: stringProp() });
29
- defineOptions({ inheritAttrs: false });
30
-
31
- const $input = componentRef<IAGHeadlessInput>();
32
- </script>
@@ -1,5 +0,0 @@
1
- import AGButton from './AGButton.vue';
2
- import AGForm from './AGForm.vue';
3
- import AGInput from './AGInput.vue';
4
-
5
- export { AGButton, AGForm, AGInput };
@@ -1,51 +0,0 @@
1
- <template>
2
- <component :is="component.tag" v-bind="component.props">
3
- <slot />
4
- </component>
5
- </template>
6
-
7
- <script setup lang="ts">
8
- import { computed } from 'vue';
9
- import { objectWithoutEmpty } from '@noeldemartin/utils';
10
- import type { LocationQuery, RouteLocation, RouteParams } from 'vue-router';
11
-
12
- import { booleanProp, objectProp, stringProp } from '@/utils/vue';
13
-
14
- const { url, route, routeParams, routeQuery, submit } = defineProps({
15
- url: stringProp(),
16
- route: stringProp(),
17
- routeParams: objectProp<RouteParams>(() => ({})),
18
- routeQuery: objectProp<LocationQuery>(() => ({})),
19
- submit: booleanProp(),
20
- });
21
-
22
- const component = computed(() => {
23
- if (route) {
24
- return {
25
- tag: 'router-link',
26
- props: {
27
- to: objectWithoutEmpty<Partial<RouteLocation>>({
28
- name: route,
29
- params: routeParams,
30
- query: routeQuery,
31
- }),
32
- },
33
- };
34
- }
35
-
36
- if (url) {
37
- return {
38
- tag: 'a',
39
- props: {
40
- target: '_blank',
41
- href: url,
42
- },
43
- };
44
- }
45
-
46
- return {
47
- tag: 'button',
48
- props: { type: submit ? 'submit' : 'button' },
49
- };
50
- });
51
- </script>
@@ -1,8 +0,0 @@
1
- import type { ComputedRef, DeepReadonly, Ref } from 'vue';
2
-
3
- export interface IAGHeadlessInput {
4
- id: string;
5
- value: ComputedRef<string | number | null>;
6
- errors: DeepReadonly<Ref<string[] | null>>;
7
- update(value: string | number | null): void;
8
- }
@@ -1,54 +0,0 @@
1
- <template>
2
- <component :is="as" v-if="as">
3
- <slot />
4
- </component>
5
- <slot v-else />
6
- </template>
7
-
8
- <script setup lang="ts">
9
- import { computed, inject, provide, readonly } from 'vue';
10
- import { uuid } from '@noeldemartin/utils';
11
-
12
- import { stringProp } from '@/utils/vue';
13
- import type Form from '@/forms/Form';
14
-
15
- import type { IAGHeadlessInput } from './AGHeadlessInput';
16
-
17
- const emit = defineEmits(['update:modelValue']);
18
- const props = defineProps({
19
- as: stringProp(),
20
- name: stringProp(),
21
- modelValue: stringProp(),
22
- });
23
- const errors = computed(() => {
24
- if (!form || !props.name) {
25
- return null;
26
- }
27
-
28
- return form.errors[props.name] ?? null;
29
- });
30
- const form = inject<Form>('form');
31
- const publicApi: IAGHeadlessInput = {
32
- id: uuid(),
33
- value: computed(() => {
34
- if (form && props.name) {
35
- return form.getFieldValue(props.name);
36
- }
37
-
38
- return props.modelValue;
39
- }),
40
- errors: readonly(errors),
41
- update(value) {
42
- if (form && props.name) {
43
- form.setFieldValue(props.name, value);
44
-
45
- return;
46
- }
47
-
48
- emit('update:modelValue', value);
49
- },
50
- };
51
-
52
- provide<IAGHeadlessInput>('input', publicApi);
53
- defineExpose<IAGHeadlessInput>(publicApi);
54
- </script>
@@ -1,22 +0,0 @@
1
- <template>
2
- <p v-if="errorMessage" :id="`${input.id}-error`">
3
- {{ errorMessage }}
4
- </p>
5
- </template>
6
-
7
- <script setup lang="ts">
8
- import { injectReactiveOrFail } from '@/utils';
9
-
10
- import type { IAGHeadlessInput } from './AGHeadlessInput';
11
- import { computed } from 'vue';
12
- import { lang } from '@/lang';
13
-
14
- const input = injectReactiveOrFail<IAGHeadlessInput>('input');
15
- const errorMessage = computed(() => {
16
- if (!input.errors) {
17
- return null;
18
- }
19
-
20
- return lang(`errors.${input.errors[0]}`);
21
- });
22
- </script>
@@ -1,29 +0,0 @@
1
- <template>
2
- <input
3
- ref="$input"
4
- type="text"
5
- :value="value"
6
- :aria-invalid="input.errors ? 'true' : 'false'"
7
- :aria-describedby="input.errors ? `${input.id}-error` : undefined"
8
- @input="update"
9
- >
10
- </template>
11
-
12
- <script setup lang="ts">
13
- import { computed, ref } from 'vue';
14
-
15
- import { injectReactiveOrFail } from '@/utils';
16
- import type { IAGHeadlessInput } from '@/components/headless/forms/AGHeadlessInput';
17
-
18
- const $input = ref<HTMLInputElement>();
19
- const input = injectReactiveOrFail<IAGHeadlessInput>('input');
20
- const value = computed(() => input.value);
21
-
22
- function update() {
23
- if (!$input.value) {
24
- return;
25
- }
26
-
27
- input.update($input.value.value);
28
- }
29
- </script>
@@ -1,4 +0,0 @@
1
- import AGHeadlessButton from './AGHeadlessButton.vue';
2
- import AGHeadlessInput from './AGHeadlessInput.vue';
3
-
4
- export { AGHeadlessButton, AGHeadlessInput };
@@ -1,7 +0,0 @@
1
- import type { IAGModal } from '@/components/modals/AGModal';
2
-
3
- export interface IAGHeadlessModal extends IAGModal {}
4
-
5
- export interface IAGHeadlessModalDefaultSlotProps {
6
- close(result?: unknown): Promise<void>;
7
- }
@@ -1,84 +0,0 @@
1
- <template>
2
- <Dialog ref="$root" :open="true" @close="cancellable && close()">
3
- <slot :close="close" />
4
- </Dialog>
5
- </template>
6
-
7
- <script setup lang="ts">
8
- import { ref, toRef } from 'vue';
9
- import { Dialog } from '@headlessui/vue';
10
- import type { VNode } from 'vue';
11
-
12
- import Events from '@/services/Events';
13
- import { useEvent } from '@/utils/composition/events';
14
- import { booleanProp, injectReactiveOrFail } from '@/utils/vue';
15
- import type { IAGModalContext } from '@/components/modals/AGModalContext';
16
-
17
- import type { IAGHeadlessModal, IAGHeadlessModalDefaultSlotProps } from './AGHeadlessModal';
18
-
19
- const props = defineProps({
20
- cancellable: booleanProp(true),
21
- });
22
-
23
- const $root = ref<{ $el?: HTMLElement } | null>(null);
24
- const hidden = ref(true);
25
- const closed = ref(false);
26
- const { modal } = injectReactiveOrFail<IAGModalContext>('modal');
27
-
28
- async function hide(): Promise<void> {
29
- if (!$root.value?.$el) {
30
- return;
31
- }
32
-
33
- hidden.value = true;
34
- }
35
-
36
- async function show(): Promise<void> {
37
- if (!$root.value?.$el) {
38
- return;
39
- }
40
-
41
- hidden.value = false;
42
- }
43
-
44
- async function close(result?: unknown) {
45
- if (closed.value) {
46
- return;
47
- }
48
-
49
- Events.emit('modal-will-close', { modal, result });
50
-
51
- await hide();
52
-
53
- closed.value = true;
54
-
55
- Events.emit('modal-closed', { modal, result });
56
- }
57
-
58
- useEvent('close-modal', async ({ id, result }) => {
59
- if (id !== modal.id) {
60
- return;
61
- }
62
-
63
- await close(result);
64
- });
65
-
66
- useEvent('hide-modal', async ({ id }) => {
67
- if (id !== modal.id) {
68
- return;
69
- }
70
-
71
- await hide();
72
- });
73
-
74
- useEvent('show-modal', async ({ id }) => {
75
- if (id !== modal.id) {
76
- return;
77
- }
78
-
79
- await show();
80
- });
81
-
82
- defineSlots<{ default(props: IAGHeadlessModalDefaultSlotProps): VNode[] }>();
83
- defineExpose<IAGHeadlessModal>({ close, cancellable: toRef(props, 'cancellable') });
84
- </script>
@@ -1,20 +0,0 @@
1
- <template>
2
- <DialogPanel>
3
- <slot />
4
- <AGModalContext v-if="childModal" :child-index="modal.childIndex + 1" :modal="childModal" />
5
- </DialogPanel>
6
- </template>
7
-
8
- <script setup lang="ts">
9
- import { computed } from 'vue';
10
- import { DialogPanel } from '@headlessui/vue';
11
-
12
- import UI from '@/ui/UI';
13
- import { injectReactiveOrFail } from '@/utils/vue';
14
- import type { IAGModalContext } from '@/components/modals/AGModalContext';
15
-
16
- import AGModalContext from '../../modals/AGModalContext.vue';
17
-
18
- const modal = injectReactiveOrFail<IAGModalContext>('modal');
19
- const childModal = computed(() => UI.modals[modal.childIndex] ?? null);
20
- </script>
@@ -1,13 +0,0 @@
1
- <template>
2
- <DialogTitle :as="as">
3
- <slot />
4
- </DialogTitle>
5
- </template>
6
-
7
- <script setup lang="ts">
8
- import { DialogTitle } from '@headlessui/vue';
9
-
10
- import { stringProp } from '@/utils/vue';
11
-
12
- defineProps({ as: stringProp('h2') });
13
- </script>
@@ -1,6 +0,0 @@
1
- import AGHeadlessModal from './AGHeadlessModal.vue';
2
- import AGHeadlessModalPanel from './AGHeadlessModalPanel.vue';
3
- import AGHeadlessModalTitle from './AGHeadlessModalTitle.vue';
4
- import type { IAGHeadlessModal } from './AGHeadlessModal';
5
-
6
- export { AGHeadlessModal, AGHeadlessModalPanel, AGHeadlessModalTitle, IAGHeadlessModal };
@@ -1,15 +0,0 @@
1
- <template>
2
- <AGModal>
3
- <AGMarkdown :text="message" />
4
- </AGModal>
5
- </template>
6
-
7
- <script setup lang="ts">
8
- import { requiredStringProp } from '@/utils/vue';
9
-
10
- import AGModal from './AGModal.vue';
11
-
12
- import AGMarkdown from '../basic/AGMarkdown.vue';
13
-
14
- defineProps({ message: requiredStringProp() });
15
- </script>
@@ -1,6 +0,0 @@
1
- import type { Ref } from 'vue';
2
-
3
- export interface IAGModal {
4
- cancellable: Ref<boolean>;
5
- close(): Promise<void>;
6
- }
@@ -1,18 +0,0 @@
1
- <template>
2
- <AGHeadlessModal v-slot="{ close }: IAGHeadlessModalDefaultSlotProps" class="relative z-50">
3
- <div class="fixed inset-0 flex items-center justify-center">
4
- <AGHeadlessModalPanel class="flex max-h-full max-w-full flex-col overflow-hidden bg-white">
5
- <div class="flex max-h-full flex-col overflow-auto p-4">
6
- <slot :close="close" />
7
- </div>
8
- </AGHeadlessModalPanel>
9
- </div>
10
- </AGHeadlessModal>
11
- </template>
12
-
13
- <script setup lang="ts">
14
- import type { IAGHeadlessModalDefaultSlotProps } from '@/components/headless/modals/AGHeadlessModal';
15
-
16
- import AGHeadlessModal from '../headless/modals/AGHeadlessModal.vue';
17
- import AGHeadlessModalPanel from '../headless/modals/AGHeadlessModalPanel.vue';
18
- </script>
@@ -1,8 +0,0 @@
1
- import type { Ref } from 'vue';
2
-
3
- import type { Modal } from '@/ui/UI.state';
4
-
5
- export interface IAGModalContext {
6
- modal: Ref<Modal>;
7
- childIndex: Ref<number>;
8
- }