@aerogel/core 0.0.0-next.fd1bd21aea7a9ab8c4eab69a5f5776db5de8bf35 → 0.1.0

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 (213) hide show
  1. package/dist/aerogel-core.css +1 -0
  2. package/dist/aerogel-core.d.ts +2263 -1698
  3. package/dist/aerogel-core.js +3809 -0
  4. package/dist/aerogel-core.js.map +1 -0
  5. package/package.json +32 -37
  6. package/src/bootstrap/bootstrap.test.ts +4 -8
  7. package/src/bootstrap/index.ts +25 -16
  8. package/src/bootstrap/options.ts +1 -1
  9. package/src/components/AppLayout.vue +14 -0
  10. package/src/components/{AGAppModals.vue → AppModals.vue} +3 -4
  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/{forms/AGHeadlessInputDescription.vue → HeadlessInputDescription.vue} +7 -8
  28. package/src/components/headless/{forms/AGHeadlessInputError.vue → HeadlessInputError.vue} +4 -8
  29. package/src/components/headless/HeadlessInputInput.vue +86 -0
  30. package/src/components/headless/{forms/AGHeadlessInputLabel.vue → HeadlessInputLabel.vue} +3 -7
  31. package/src/components/headless/{forms/AGHeadlessInputTextArea.vue → HeadlessInputTextArea.vue} +11 -11
  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/{forms/AGHeadlessSelectError.vue → HeadlessSelectError.vue} +5 -6
  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 -3
  48. package/src/components/index.ts +6 -9
  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/{modals/AGErrorReportModalButtons.vue → ui/ErrorReportModalButtons.vue} +34 -27
  63. package/src/components/ui/ErrorReportModalTitle.vue +24 -0
  64. package/src/components/{forms/AGForm.vue → ui/Form.vue} +4 -5
  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 +76 -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 +9 -5
  86. package/src/directives/measure.ts +33 -8
  87. package/src/errors/Errors.state.ts +2 -1
  88. package/src/errors/Errors.ts +56 -33
  89. package/src/errors/JobCancelledError.ts +3 -0
  90. package/src/errors/index.ts +15 -8
  91. package/src/errors/settings/Debug.vue +14 -0
  92. package/src/errors/settings/index.ts +10 -0
  93. package/src/errors/utils.ts +17 -1
  94. package/src/forms/FormController.test.ts +113 -0
  95. package/src/forms/{Form.ts → FormController.ts} +73 -42
  96. package/src/forms/index.ts +3 -3
  97. package/src/forms/utils.ts +65 -24
  98. package/src/forms/validation.ts +50 -0
  99. package/src/index.css +76 -0
  100. package/src/jobs/Job.ts +144 -2
  101. package/src/jobs/index.ts +4 -1
  102. package/src/jobs/listeners.ts +3 -0
  103. package/src/jobs/status.ts +4 -0
  104. package/src/lang/DefaultLangProvider.ts +46 -0
  105. package/src/lang/Lang.state.ts +11 -0
  106. package/src/lang/Lang.ts +48 -21
  107. package/src/lang/index.ts +12 -6
  108. package/src/lang/settings/Language.vue +48 -0
  109. package/src/lang/settings/index.ts +10 -0
  110. package/src/plugins/Plugin.ts +1 -1
  111. package/src/plugins/index.ts +10 -7
  112. package/src/services/App.state.ts +36 -3
  113. package/src/services/App.ts +19 -3
  114. package/src/services/Cache.ts +1 -1
  115. package/src/services/Events.test.ts +8 -8
  116. package/src/services/Events.ts +16 -12
  117. package/src/services/Service.ts +135 -59
  118. package/src/services/Storage.ts +20 -0
  119. package/src/services/index.ts +16 -7
  120. package/src/services/utils.ts +18 -0
  121. package/src/testing/index.ts +8 -3
  122. package/src/testing/setup.ts +11 -0
  123. package/src/ui/UI.state.ts +14 -12
  124. package/src/ui/UI.ts +250 -123
  125. package/src/ui/index.ts +28 -28
  126. package/src/ui/utils.ts +16 -0
  127. package/src/utils/app.ts +7 -0
  128. package/src/utils/classes.ts +41 -0
  129. package/src/utils/composition/events.ts +4 -6
  130. package/src/utils/composition/forms.ts +20 -4
  131. package/src/utils/composition/persistent.test.ts +33 -0
  132. package/src/utils/composition/persistent.ts +11 -0
  133. package/src/utils/composition/state.test.ts +47 -0
  134. package/src/utils/composition/state.ts +33 -0
  135. package/src/utils/index.ts +6 -1
  136. package/src/utils/markdown.test.ts +50 -0
  137. package/src/utils/markdown.ts +53 -6
  138. package/src/utils/types.ts +3 -0
  139. package/src/utils/vue.ts +38 -132
  140. package/dist/aerogel-core.cjs.js +0 -2
  141. package/dist/aerogel-core.cjs.js.map +0 -1
  142. package/dist/aerogel-core.esm.js +0 -2
  143. package/dist/aerogel-core.esm.js.map +0 -1
  144. package/histoire.config.ts +0 -7
  145. package/noeldemartin.config.js +0 -5
  146. package/postcss.config.js +0 -6
  147. package/src/assets/histoire.css +0 -3
  148. package/src/components/AGAppLayout.vue +0 -16
  149. package/src/components/AGAppOverlays.vue +0 -41
  150. package/src/components/AGAppSnackbars.vue +0 -13
  151. package/src/components/constants.ts +0 -8
  152. package/src/components/forms/AGButton.vue +0 -44
  153. package/src/components/forms/AGCheckbox.vue +0 -41
  154. package/src/components/forms/AGInput.vue +0 -40
  155. package/src/components/forms/AGSelect.story.vue +0 -46
  156. package/src/components/forms/AGSelect.vue +0 -60
  157. package/src/components/forms/index.ts +0 -5
  158. package/src/components/headless/forms/AGHeadlessButton.vue +0 -56
  159. package/src/components/headless/forms/AGHeadlessInput.ts +0 -32
  160. package/src/components/headless/forms/AGHeadlessInput.vue +0 -57
  161. package/src/components/headless/forms/AGHeadlessInputInput.vue +0 -81
  162. package/src/components/headless/forms/AGHeadlessSelect.ts +0 -42
  163. package/src/components/headless/forms/AGHeadlessSelect.vue +0 -77
  164. package/src/components/headless/forms/AGHeadlessSelectButton.vue +0 -24
  165. package/src/components/headless/forms/AGHeadlessSelectLabel.vue +0 -24
  166. package/src/components/headless/forms/AGHeadlessSelectOption.ts +0 -4
  167. package/src/components/headless/forms/AGHeadlessSelectOption.vue +0 -39
  168. package/src/components/headless/forms/AGHeadlessSelectOptions.ts +0 -3
  169. package/src/components/headless/forms/composition.ts +0 -10
  170. package/src/components/headless/forms/index.ts +0 -17
  171. package/src/components/headless/modals/AGHeadlessModal.ts +0 -34
  172. package/src/components/headless/modals/AGHeadlessModal.vue +0 -86
  173. package/src/components/headless/modals/AGHeadlessModalPanel.vue +0 -28
  174. package/src/components/headless/modals/AGHeadlessModalTitle.vue +0 -13
  175. package/src/components/headless/modals/index.ts +0 -4
  176. package/src/components/headless/snackbars/AGHeadlessSnackbar.vue +0 -10
  177. package/src/components/headless/snackbars/index.ts +0 -40
  178. package/src/components/lib/AGErrorMessage.vue +0 -16
  179. package/src/components/lib/AGLink.vue +0 -9
  180. package/src/components/lib/AGMarkdown.vue +0 -41
  181. package/src/components/lib/AGMeasured.vue +0 -15
  182. package/src/components/lib/AGStartupCrash.vue +0 -31
  183. package/src/components/lib/index.ts +0 -5
  184. package/src/components/modals/AGAlertModal.ts +0 -15
  185. package/src/components/modals/AGAlertModal.vue +0 -14
  186. package/src/components/modals/AGConfirmModal.ts +0 -27
  187. package/src/components/modals/AGConfirmModal.vue +0 -26
  188. package/src/components/modals/AGErrorReportModal.ts +0 -46
  189. package/src/components/modals/AGErrorReportModal.vue +0 -54
  190. package/src/components/modals/AGErrorReportModalTitle.vue +0 -25
  191. package/src/components/modals/AGLoadingModal.ts +0 -23
  192. package/src/components/modals/AGLoadingModal.vue +0 -15
  193. package/src/components/modals/AGModal.ts +0 -10
  194. package/src/components/modals/AGModal.vue +0 -39
  195. package/src/components/modals/AGModalContext.ts +0 -8
  196. package/src/components/modals/AGModalContext.vue +0 -22
  197. package/src/components/modals/AGModalTitle.vue +0 -9
  198. package/src/components/modals/AGPromptModal.ts +0 -30
  199. package/src/components/modals/AGPromptModal.vue +0 -34
  200. package/src/components/modals/index.ts +0 -17
  201. package/src/components/snackbars/AGSnackbar.vue +0 -36
  202. package/src/components/snackbars/index.ts +0 -3
  203. package/src/components/utils.ts +0 -10
  204. package/src/directives/initial-focus.ts +0 -11
  205. package/src/forms/Form.test.ts +0 -58
  206. package/src/forms/composition.ts +0 -6
  207. package/src/main.histoire.ts +0 -1
  208. package/src/utils/tailwindcss.test.ts +0 -26
  209. package/src/utils/tailwindcss.ts +0 -7
  210. package/tailwind.config.js +0 -4
  211. package/tsconfig.json +0 -11
  212. package/vite.config.ts +0 -14
  213. /package/src/{main.ts → index.ts} +0 -0
@@ -1,2 +0,0 @@
1
- import{ref as e,computed as t,watch as s,inject as r,reactive as o,markRaw as n,nextTick as a,onUnmounted as l,useAttrs as i,onMounted as u,defineComponent as c,toRef as d,openBlock as p,createBlock as m,unref as f,withCtx as h,renderSlot as v,provide as g,resolveDynamicComponent as _,normalizeProps as b,guardReactiveProps as y,createElementBlock as x,Fragment as A,createVNode as w,createCommentVNode as G,createElementVNode as k,h as S,mergeProps as C,normalizeClass as j,createTextVNode as $,toDisplayString as M,renderList as H,watchEffect as E,withModifiers as T,readonly as I,useSlots as L,createApp as R,resolveDirective as P,withDirectives as O}from"vue";import"core-js/modules/esnext.async-iterator.reduce.js";import"core-js/modules/esnext.iterator.constructor.js";import"core-js/modules/esnext.iterator.reduce.js";import"core-js/modules/esnext.async-iterator.map.js";import"core-js/modules/esnext.iterator.map.js";import D from"@babel/runtime/helpers/esm/defineProperty";import{JSError as B,tap as V,MagicObject as q,PromisedValue as z,Storage as U,objectOnly as F,isEmpty as N,objectDeepClone as K,facade as W,arrayRemove as Q,fail as Z,updateLocationQueryParameters as Y,forever as J,after as X,uuid as ee,isObject as te,objectWithoutEmpty as se,toString as re,objectWithout as oe,noop as ne,stringExcerpt as ae}from"@noeldemartin/utils";import"core-js/modules/esnext.async-iterator.for-each.js";import"core-js/modules/esnext.iterator.for-each.js";import"core-js/modules/esnext.set.add-all.js";import"core-js/modules/esnext.set.delete-all.js";import"core-js/modules/esnext.set.difference.js";import"core-js/modules/esnext.set.every.js";import"core-js/modules/esnext.set.filter.js";import"core-js/modules/esnext.set.find.js";import"core-js/modules/esnext.set.intersection.js";import"core-js/modules/esnext.set.is-disjoint-from.js";import"core-js/modules/esnext.set.is-subset-of.js";import"core-js/modules/esnext.set.is-superset-of.js";import"core-js/modules/esnext.set.join.js";import"core-js/modules/esnext.set.map.js";import"core-js/modules/esnext.set.reduce.js";import"core-js/modules/esnext.set.some.js";import"core-js/modules/esnext.set.symmetric-difference.js";import"core-js/modules/esnext.set.union.js";import{createPinia as le,setActivePinia as ie,defineStore as ue}from"pinia";import ce from"virtual:aerogel";import"core-js/modules/esnext.async-iterator.filter.js";import"core-js/modules/esnext.iterator.filter.js";import"core-js/modules/esnext.string.at.js";import"core-js/modules/esnext.async-iterator.some.js";import"core-js/modules/esnext.iterator.some.js";import{Dialog as de,DialogPanel as pe,DialogTitle as me,Listbox as fe,ListboxButton as he,ListboxLabel as ve,ListboxOption as ge,ListboxOptions as _e}from"@headlessui/vue";export{ListboxOptions as AGHeadlessSelectOptions}from"@headlessui/vue";import be from"dompurify";import{marked as ye,Renderer as xe}from"marked";import"core-js/modules/esnext.weak-map.delete-all.js";import"core-js/modules/esnext.weak-map.emplace.js";class ServiceBootError extends B{constructor(e,t){super(`Service '${e}' failed booting`,{cause:t})}}let Ae=null;function we(){return Ae??Ge()}function Ge(){return V(le(),(e=>{Ae=e,ie(e)}))}function ke(){return Ae??we()}function Se(e,t){return we(),ue(e,t)()}function Ce(e){var t;return D(t=class extends je{usesStore(){return!0}getName(){return e.name??null}getInitialState(){return"function"==typeof e.initialState?e.initialState():Object.entries(e.initialState).reduce(((e,t)=>{let[s,r]=t;try{r=structuredClone(r)}catch(e){console.warn(`Could not clone '${s}' state from ${this.getName()} service, this may cause problems if you're using multiple instances of the service (for example, in unit tests).\nTo fix this problem, declare your initialState as a function instead.`)}return e[s]=r,e}),{})}getComputedStateDefinition(){return e.computed??{}}serializePersistedState(t){return e.serialize?.(t)??t}},"persist",e.persist??[]),t}class je extends q{constructor(){super(),D(this,"_name",void 0),D(this,"_booted",void 0),D(this,"_computedStateKeys",void 0),D(this,"_store",void 0);const e=this.getComputedStateDefinition();this._name=this.getName()??new.target.name,this._booted=new z,this._computedStateKeys=new Set(Object.keys(e)),this._store=this.usesStore()&&Se(this._name,{state:()=>this.getInitialState(),getters:e})}get booted(){return this._booted}launch(){const handleError=e=>this._booted.reject(new ServiceBootError(this._name,e));try{this.frameworkBoot().then((()=>this.boot())).then((()=>this._booted.resolve())).catch(handleError)}catch(e){handleError(e)}return this._booted}hasPersistedState(){return U.has(this._name)}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 s="string"==typeof e?{[e]:t}:e;Object.assign(this._store.$state,s),this.onStateUpdated(s)}__get(e){return this.hasState(e)?this.getState(e):super.__get(e)}__set(e,t){this.setState({[e]:t})}onStateUpdated(e){const t=this.constructor.persist,s=F(e,t);if(N(s))return;const r=U.get(this._name);r&&U.set(this._name,{...r,...this.serializePersistedState(K(s))})}usesStore(){return!1}getName(){return null}getInitialState(){return{}}getComputedStateDefinition(){return{}}serializePersistedState(e){return e}async frameworkBoot(){this.initializePersistedState()}async boot(){}initializePersistedState(){const e=this.constructor.persist;if(this.usesStore()&&!N(e))if(U.has(this._name)){const e=U.require(this._name);this.setState(e)}else U.set(this._name,F(this.getState(),e))}}D(je,"persist",[]);const $e={Low:-256,Default:0,High:256};class Me extends je{constructor(){super(...arguments),D(this,"listeners",{})}async boot(){Object.entries(globalThis.__aerogelEvents__??{}).forEach((e=>{let[t,s]=e;return this.on(t,s)}))}async emit(e,t){const s=this.listeners[e]??{priorities:[],handlers:{}};for(const e of s.priorities)await Promise.all(s.handlers[e]?.map((e=>e(t)))??[])}on(e,t,s){const r="function"==typeof t?{}:t,o="function"==typeof t?t:s;return this.registerListener(e,r,o),()=>this.off(e,o)}once(e,t,s){let r=null;const o="function"==typeof t?{}:t,n="function"==typeof t?t:s;return V((()=>r&&this.off(e,r)),(t=>{r=function(){return t(),n(...arguments)},this.registerListener(e,o,n)}))}off(e,t){const s=this.listeners[e];if(!s)return;const r=[...s.priorities];for(const e of r)Q(s.handlers[e]??[],t),0===s.handlers[e]?.length&&(delete s.handlers[e],Q(s.priorities,e));0===s.priorities.length&&delete this.listeners[e]}registerListener(e,t,s){const r=t.priority??0;e in this.listeners||(this.listeners[e]={priorities:[],handlers:{}});const o=this.listeners[e]?.priorities??Z(`priorities missing for event '${e}'`),n=this.listeners[e]?.handlers??Z(`handlers missing for event '${e}'`);o.includes(r)||(o.push(r),o.sort(((e,t)=>t-e)),n[r]=[]),n[r]?.push(s)}}var He=W(Me),Ee=Ce({name:"app",initialState:{plugins:{},environment:ce.environment,sourceUrl:ce.sourceUrl},computed:{development:e=>"development"===e.environment,testing:e=>"test"===e.environment||"testing"===e.environment}});class Te extends Ee{constructor(){super(...arguments),D(this,"ready",new z),D(this,"mounted",new z)}isReady(){return this.ready.isResolved()}isMounted(){return this.mounted.isResolved()}async whenReady(e){return await this.ready.then(e)}async reload(e){e&&Y(e),location.reload(),await J()}plugin(e){return this.plugins[e]??null}async boot(){He.once("application-ready",(()=>this.ready.resolve())),He.once("application-mounted",(()=>this.mounted.resolve()))}}var Ie=W(Te);function Le(e){return e}async function Re(e){for(var t=arguments.length,s=new Array(t>1?t-1:0),r=1;r<t;r++)s[r-1]=arguments[r];Ie.setState("plugins",e.reduce(((e,t)=>(t.name&&(e[t.name]=t),e)),{})),await Promise.all(e.map((e=>e.install(...s)))??[])}function Pe(e){return{type:Array,default:e??(()=>[])}}function Oe(){return{type:Boolean,default:arguments.length>0&&void 0!==arguments[0]&&arguments[0]}}function De(){return e()}function Be(r){const o=e(),n=t(r);return s(n,(async()=>o.value=await n.value),{immediate:!0}),o}function Ve(e){return e}function qe(e,t){const s=Object.values(e);return{type:String,default:t??s[0]??null,validator:e=>s.includes(e)}}function ze(e){const t=r(e);return t?o(t):void 0}function Ue(e,t){return ze(e)??Z(t??`Could not resolve '${e}' injection key`)}function Fe(e,t){return r(e)??Z(t??`Could not resolve '${e}' injection key`)}function Ne(e){return{type:e,default:null}}function Ke(){return{type:Number,default:arguments.length>0&&void 0!==arguments[0]?arguments[0]:null}}function We(){return{type:Object,default:arguments.length>0&&void 0!==arguments[0]?arguments[0]:null}}function Qe(){return{type:Array,required:!0}}function Ze(e){const t=Object.values(e);return{type:String,required:!0,validator:e=>t.includes(e)}}function Ye(e){return{type:e,required:!0}}function Je(){return{type:Number,required:!0}}function Xe(){return{type:Object,required:!0}}function et(){return{type:String,required:!0}}function tt(){return{type:String,default:arguments.length>0&&void 0!==arguments[0]?arguments[0]:null}}const st={"initial-focus":{mounted(e,t){let{value:s}=t;!1!==s&&e.focus()}},measure:{mounted(e,t){let{value:s}=t;const r="function"==typeof s?s:null,o=e.getBoundingClientRect();e.style.setProperty("--width",`${o.width}px`),e.style.setProperty("--height",`${o.height}px`),r?.({width:o.width,height:o.height})}}};var rt={install(e,t){const s={...st,...t.directives};for(const[t,r]of Object.entries(s))e.directive(t,r)}};class ot extends je{constructor(){super(...arguments),D(this,"cache",void 0)}async get(e){const t=await this.open();return await t.match(e)??null}async store(e,t){const s=await this.open();await s.put(e,t)}async replace(e,t){const s=await this.open();0!==(await s.keys(e)).length&&await s.put(e,t)}async open(){return this.cache=this.cache??V(new z,(e=>{caches.open("app").then((t=>e.resolve(t)))}))}}var nt=W(ot);const at={$app:Ie,$events:He};async function lt(e,t){await Promise.all(Object.entries(t).map((async t=>{let[s,r]=t;await r.launch().catch((t=>e.config.errorHandler?.(t,null,`Failed launching ${s}.`)))}))),Object.assign(e.config.globalProperties,t),Ie.development&&Object.assign(window,t)}var it={async install(e,t){const s={...at,...t.services};e.use(ke()),await lt(e,s)}},ut=Ce({name:"ui",initialState:{modals:[],snackbars:[]}});const ct={AlertModal:"alert-modal",ConfirmModal:"confirm-modal",ErrorReportModal:"error-report-modal",LoadingModal:"loading-modal",PromptModal:"prompt-modal",Snackbar:"snackbar",StartupCrash:"startup-crash"};class dt extends ut{constructor(){super(...arguments),D(this,"modalCallbacks",{}),D(this,"components",{})}requireComponent(e){return this.components[e]??Z(`UI Component '${e}' is not defined!`)}alert(e,t){this.openModal(this.requireComponent(ct.AlertModal),"string"!=typeof t?{message:e}:{title:e,message:t})}async confirm(e,t,s){const r=await this.openModal(this.requireComponent(ct.ConfirmModal),"string"!=typeof t?{message:e,...t??{}}:{title:e,message:t,...s??{}});return await r.beforeClose??!1}async prompt(e,t,s){const r=s?.trim??!0,o=await this.openModal(this.requireComponent(ct.PromptModal),"string"!=typeof t?{message:e,...t??{}}:{title:e,message:t,...s??{}}),n=await o.beforeClose;return(r?n?.trim():n)??null}async loading(e,t){const s=await this.openModal(this.requireComponent(ct.LoadingModal),"string"!=typeof e?{}:{message:e});try{t="string"==typeof e?t:e;const[s]=await Promise.all([t,X({seconds:1})]);return s}finally{await this.closeModal(s.id)}}showSnackbar(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const s={id:ee(),properties:{message:e,...t},component:n(t.component??this.requireComponent(ct.Snackbar))};this.setState("snackbars",this.snackbars.concat(s)),setTimeout((()=>this.hideSnackbar(s.id)),5e3)}hideSnackbar(e){this.setState("snackbars",this.snackbars.filter((t=>t.id!==e)))}registerComponent(e,t){this.components[e]=t}async openModal(e,t){const s=ee(),r={},o={id:s,properties:t??{},component:n(e),beforeClose:new Promise((e=>r.willClose=e)),afterClose:new Promise((e=>r.closed=e))},l=this.modals.at(-1),i=this.modals.concat(o);return this.modalCallbacks[o.id]=r,this.setState({modals:i}),await a(),await(l&&He.emit("hide-modal",{id:l.id})),await Promise.all([l||He.emit("show-overlays-backdrop"),He.emit("show-modal",{id:o.id})]),o}async closeModal(e,t){await He.emit("close-modal",{id:e,result:t})}async boot(){this.watchModalEvents(),this.watchMountedEvent()}watchModalEvents(){He.on("modal-will-close",(e=>{let{modal:t,result:s}=e;this.modalCallbacks[t.id]?.willClose?.(s),1===this.modals.length&&He.emit("hide-overlays-backdrop")})),He.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 r=this.modals.at(-1);await(r&&He.emit("show-modal",{id:r.id}))}))}watchMountedEvent(){He.once("application-mounted",(async()=>{const e=document.getElementById("splash");e&&("0"!==window.getComputedStyle(e).opacity&&(e.style.opacity="0",await X({ms:600})),e.remove())}))}}var pt=W(dt);var mt=W(class extends je{constructor(){super(),D(this,"provider",void 0),this.provider={translate:e=>(Ie.development&&console.warn("Lang provider is missing"),e),translateWithDefault:(e,t)=>(Ie.development&&console.warn("Lang provider is missing"),t)}}setProvider(e){this.provider=e}translate(e,t){return this.provider.translate(e,t)??e}translateWithDefault(e,t){let s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return this.provider.translateWithDefault(e,t,s)}});const ft=mt.translate.bind(mt),ht=mt.translateWithDefault.bind(mt);var vt=Ce({name:"errors",initialState:{logs:[],startupErrors:[]},computed:{hasErrors:e=>{let{logs:t}=e;return t.length>0},hasNewErrors:e=>{let{logs:t}=e;return t.some((e=>!e.seen))},hasStartupErrors:e=>{let{startupErrors:t}=e;return t.length>0}}});const gt={Primary:"primary",Secondary:"secondary",Danger:"danger",Clear:"clear"};var _t=W(class extends vt{constructor(){super(...arguments),D(this,"forceReporting",!1),D(this,"enabled",!0)}enable(){this.enabled=!0}disable(){this.enabled=!1}async inspect(e){const t=Array.isArray(e)?e:[await this.createErrorReport(e)];0!==t.length?pt.openModal(pt.requireComponent(ct.ErrorReportModal),{reports:t}):pt.alert(ht("errors.inspectEmpty","Nothing to inspect!"))}async report(e,t){if(await He.emit("error",{error:e,message:t}),Ie.testing)throw e;if(Ie.development&&this.logError(e),!this.enabled)throw e;if(!Ie.isMounted()){const t=await this.createStartupErrorReport(e);return void(t&&this.setState({startupErrors:this.startupErrors.concat(t)}))}const s=await this.createErrorReport(e),r={report:s,seen:!1,date:new Date};pt.showSnackbar(t??ht("errors.notice","Something went wrong, but it's not your fault. Try again!"),{color:gt.Danger,actions:[{text:ht("errors.viewDetails","View details"),dismiss:!0,handler:()=>pt.openModal(pt.requireComponent(ct.ErrorReportModal),{reports:[s]})}]}),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),te(e)&&e.cause&&this.logError(e.cause)}async createErrorReport(e){return"string"==typeof e?{title:e}:e instanceof Error||e instanceof B?this.createErrorReportFromError(e):te(e)?se({title:re(e.name??e.title??ht("errors.unknown","Unknown Error")),description:re(e.message??e.description??ht("errors.unknownDescription","Unknown error object")),error:e}):{title:ht("errors.unknown","Unknown Error"),error:e}}async createStartupErrorReport(e){return e instanceof ServiceBootError?e.cause instanceof ServiceBootError?null:this.createErrorReport(e.cause):this.createErrorReport(e)}createErrorReportFromError(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return{title:e.name,description:e.message,details:e.stack,error:e,...t}}});function bt(e){return"string"==typeof e?e:e instanceof Error||e instanceof B?e.message:te(e)?re(e.message??e.description??"Unknown error object"):ht("errors.unknown","Unknown Error")}const yt={$errors:_t};function xt(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:()=>!1;const s=e=>t(e)||(e=>(_t.report(e),!0))(e);e.config.errorHandler=s,globalThis.onerror=(e,t,r,o,n)=>s(n??e),globalThis.onunhandledrejection=e=>s(e.reason)}var At={async install(e,t){xt(e,t.handleError),await lt(e,yt)}};const wt={$lang:mt};var Gt={async install(e){e.config.globalProperties.$t??=ft,e.config.globalProperties.$td=ht,await lt(e,wt)}},kt={async install(){"testing"===import.meta.env.MODE&&(globalThis.testingRuntime={on:function(){return He.on(...arguments)}})}};function St(e,t){const s=He.on(e,t);l((()=>s()))}function Ct(){const e=i(),s=t((()=>e.class));return[t((()=>oe(e,"class"))),s]}function jt(e){let t=ne;u((()=>t=e())),l((()=>t()))}function $t(e){return e.split(/\s+/).filter((e=>!/^(hover|focus|focus-visible):/.test(e))).join(" ").trim()}function Mt(e,t){return Object.keys(t).reduce(((t,s)=>(t[s]=e[s],t)),{})}const Ht={cancellable:Oe(!0),title:tt()};function Et(){return Ht}function Tt(e){return Mt(e,Ht)}function It(e){return{close:async()=>e.value?.close(),cancellable:t((()=>!!e.value?.cancellable))}}var Lt=c({__name:"AGHeadlessModal",props:Et(),setup(t,{expose:s}){const r=t,o=e(null),n=e(!0),a=e(!1),{modal:l}=Ue("modal","could not obtain modal reference from <AGHeadlessModal>, did you render this component manually? Show it using $ui.openModal() instead");async function i(){o.value?.$el&&(n.value=!0)}async function u(e){a.value||(He.emit("modal-will-close",{modal:l,result:e}),await i(),a.value=!0,He.emit("modal-closed",{modal:l,result:e}))}return St("close-modal",(async({id:e,result:t})=>{e===l.id&&await u(t)})),St("hide-modal",(async({id:e})=>{e===l.id&&await i()})),St("show-modal",(async({id:e})=>{e===l.id&&await async function(){o.value?.$el&&(n.value=!1)}()})),s({close:u,cancellable:d(r,"cancellable")}),(e,t)=>(p(),m(f(de),{ref_key:"$root",ref:o,open:!0,onClose:t[0]||(t[0]=t=>e.cancellable&&u())},{default:h((()=>[v(e.$slots,"default",{close:u})])),_:3},512))}});Lt.__file="src/components/headless/modals/AGHeadlessModal.vue";var Rt=c({__name:"AGModalContext",props:{modal:Xe(),childIndex:Je()},setup(e){const t=e;return g("modal",{modal:d(t,"modal"),childIndex:d(t,"childIndex")}),(t,s)=>(p(),m(_(e.modal.component),b(y(e.modal.properties)),null,16))}});Rt.__file="src/components/modals/AGModalContext.vue";const Pt=k("div",{class:"pointer-events-none fixed inset-0 z-50 bg-black/30"},null,-1);var Ot=c({__name:"AGHeadlessModalPanel",setup(e){const s=Ue("modal","could not obtain modal reference from <AGHeadlessModalPanel>, did you render this component manually? Show it using $ui.openModal() instead"),r=t((()=>pt.modals[s.childIndex]??null));return(e,t)=>(p(),m(f(pe),null,{default:h((()=>[v(e.$slots,"default"),r.value?(p(),x(A,{key:0},[Pt,w(Rt,{"child-index":f(s).childIndex+1,modal:r.value},null,8,["child-index","modal"])],64)):G("v-if",!0)])),_:3}))}});Ot.__file="src/components/headless/modals/AGHeadlessModalPanel.vue";var Dt=c({__name:"AGHeadlessModalTitle",props:{as:tt("h2")},setup:e=>(t,s)=>(p(),m(f(me),{as:e.as},{default:h((()=>[v(t.$slots,"default")])),_:3},8,["as"]))});function Bt(e){return t=ye(e,{mangle:!1,headerIds:!1,renderer:V(new xe,(e=>{e.link=function(e,t,s){return xe.prototype.link.apply(this,[e,t,s]).replace("<a",'<a target="_blank"')}}))}),be.sanitize(t,{ADD_ATTR:["target"]});var t}Dt.__file="src/components/headless/modals/AGHeadlessModalTitle.vue";var Vt=c({__name:"AGMarkdown",props:{as:tt(),inline:Oe(),langKey:tt(),langParams:We(),text:tt()},setup(e){const s=e,r=i(),o=t((()=>s.text??(s.langKey&&ft(s.langKey,s.langParams??{})))),n=t((()=>{if(!o.value)return null;let e=Bt(o.value);return s.inline&&(e=e.replace("<p>","<span>").replace("</p>","</span>")),e})),a=()=>S(s.as??(s.inline?"span":"div"),{innerHTML:n.value,...r,class:`${r.class??""} ${s.inline?"":"prose"}`});return(e,t)=>(p(),m(a))}});Vt.__file="src/components/lib/AGMarkdown.vue";const qt={class:"fixed inset-0 flex items-center justify-center p-8"};var zt=c({inheritAttrs:!1,__name:"AGModal",props:Et(),setup(t,{expose:s}){const r=t,o=e();return s(It(o)),(e,t)=>(p(),m(Lt,C({ref_key:"$modal",ref:o},r,{class:"relative z-50"}),{default:h((({close:t})=>[k("div",qt,[w(Ot,{class:"flex max-h-full max-w-full flex-col overflow-hidden bg-white p-4"},{default:h((()=>[e.title?(p(),m(Dt,{key:0,class:"mb-2 text-lg font-semibold"},{default:h((()=>[w(Vt,{text:e.title,inline:""},null,8,["text"])])),_:1})):G("v-if",!0),k("div",C({class:"flex max-h-full flex-col overflow-auto"},e.$attrs),[v(e.$slots,"default",{close:t})],16)])),_:2},1024)])])),_:3},16))}});zt.__file="src/components/modals/AGModal.vue";const Ut={title:tt(),message:et()};function Ft(){return Ut}var Nt=c({__name:"AGAlertModal",props:Ft(),setup:e=>(e,t)=>(p(),m(zt,{title:e.title},{default:h((()=>[w(Vt,{text:e.message},null,8,["text"])])),_:1},8,["title"]))});Nt.__file="src/components/modals/AGAlertModal.vue";const Kt={title:tt(),message:et(),acceptText:tt(),cancelText:tt()};function Wt(){return Kt}function Qt(e){return{renderedAcceptText:t((()=>e.acceptText??ht("ui.accept","Ok"))),renderedCancelText:t((()=>e.cancelText??ht("ui.cancel","Cancel")))}}var Zt=c({__name:"AGHeadlessButton",props:{as:We(),href:tt(),url:tt(),route:tt(),routeParams:We((()=>({}))),routeQuery:We((()=>({}))),submit:Oe()},setup(e){const s=e,r=t((()=>s.as?{as:s.as,props:{}}:s.route?{as:"router-link",props:{to:se({name:s.route,params:s.routeParams,query:s.routeQuery})}}:s.href||s.url?{as:"a",props:{target:"_blank",href:s.href||s.url}}:{as:"button",props:{type:s.submit?"submit":"button"}}));return(e,t)=>(p(),m(_(r.value.as),b(y(r.value.props)),{default:h((()=>[v(e.$slots,"default")])),_:3},16))}});Zt.__file="src/components/headless/forms/AGHeadlessButton.vue";var Yt=c({__name:"AGButton",props:{color:qe(gt,gt.Primary)},setup(e){const s=e,r=t((()=>{switch(s.color){case gt.Secondary:return["text-white bg-gray-600","hover:bg-gray-500","focus-visible:outline-offset-2 focus-visible:outline-gray-600"].join(" ");case gt.Clear:return"hover:bg-gray-500/20 focus-visible:outline-gray-500/60";case gt.Danger:return["text-white bg-red-600","hover:bg-red-500","focus-visible:outline-offset-2 focus-visible:outline-red-600"].join(" ");default:return["text-white bg-indigo-600","hover:bg-indigo-500","focus-visible:outline-offset-2 focus-visible:outline-indigo-600"].join(" ")}}));return(e,t)=>(p(),m(Zt,{class:j(["px-2.5 py-1.5 focus-visible:outline focus-visible:outline-2",r.value])},{default:h((()=>[v(e.$slots,"default")])),_:3},8,["class"]))}});Yt.__file="src/components/forms/AGButton.vue";const Jt={class:"mt-2 flex flex-row-reverse gap-2"};var Xt=c({__name:"AGConfirmModal",props:Wt(),setup(e){const t=e,{renderedAcceptText:s,renderedCancelText:r}=Qt(t);return(e,t)=>(p(),m(zt,{cancellable:!1,title:e.title},{default:h((({close:t})=>[w(Vt,{text:e.message},null,8,["text"]),k("div",Jt,[w(Yt,{onClick:e=>t(!0)},{default:h((()=>[$(M(f(s)),1)])),_:2},1032,["onClick"]),w(Yt,{color:"secondary",onClick:e=>t()},{default:h((()=>[$(M(f(r)),1)])),_:2},1032,["onClick"])])])),_:1},8,["title"]))}});Xt.__file="src/components/modals/AGConfirmModal.vue";const es={viewBox:"0 0 20 20",width:"1.2em",height:"1.2em"},ts=[k("path",{fill:"currentColor",d:"m12.95 10.707l.707-.707L8 4.343L6.586 5.757L10.828 10l-4.242 4.243L8 15.657l4.95-4.95z"},null,-1)];var ss={name:"zondicons-cheveron-right",render:function(e,t){return p(),x("svg",es,[...ts])}};const rs={viewBox:"0 0 20 20",width:"1.2em",height:"1.2em"},os=[k("path",{fill:"currentColor",d:"M7.05 9.293L6.343 10L12 15.657l1.414-1.414L9.172 10l4.242-4.243L12 4.343z"},null,-1)];var ns={name:"zondicons-cheveron-left",render:function(e,t){return p(),x("svg",rs,[...os])}};const as={reports:Qe()};function ls(){return as}function is(s){const r=e(0),o=t((()=>s.reports[r.value])),n=t((()=>o.value.details?.trim()||ht("errors.detailsEmpty","This error is missing a stacktrace."))),a=ht("errors.previousReport","Show previous report"),l=ht("errors.nextReport","Show next report");return{activeReportIndex:r,details:n,nextReportText:l,previousReportText:a,report:o}}const us={viewBox:"0 0 24 24",width:"1.2em",height:"1.2em"},cs=[k("path",{fill:"currentColor",d:"M20 19V7H4v12h16m0-16a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h16m-7 14v-2h5v2h-5m-3.42-4L5.57 9H8.4l3.3 3.3c.39.39.39 1.03 0 1.42L8.42 17H5.59l3.99-4Z"},null,-1)];var ds={name:"mdi-console",render:function(e,t){return p(),x("svg",us,[...cs])}};const ps={viewBox:"0 0 20 20",width:"1.2em",height:"1.2em"},ms=[k("path",{fill:"currentColor",d:"M6 6V2c0-1.1.9-2 2-2h10a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2h-4v4a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V8c0-1.1.9-2 2-2h4zm2 0h4a2 2 0 0 1 2 2v4h4V2H8v4zM2 8v10h10V8H2z"},null,-1)];var fs={name:"zondicons-copy",render:function(e,t){return p(),x("svg",ps,[...ms])}};const hs={viewBox:"0 0 24 24",width:"1.2em",height:"1.2em"},vs=[k("path",{fill:"currentColor",d:"M12 2A10 10 0 0 0 2 12c0 4.42 2.87 8.17 6.84 9.5c.5.08.66-.23.66-.5v-1.69c-2.77.6-3.36-1.34-3.36-1.34c-.46-1.16-1.11-1.47-1.11-1.47c-.91-.62.07-.6.07-.6c1 .07 1.53 1.03 1.53 1.03c.87 1.52 2.34 1.07 2.91.83c.09-.65.35-1.09.63-1.34c-2.22-.25-4.55-1.11-4.55-4.92c0-1.11.38-2 1.03-2.71c-.1-.25-.45-1.29.1-2.64c0 0 .84-.27 2.75 1.02c.79-.22 1.65-.33 2.5-.33c.85 0 1.71.11 2.5.33c1.91-1.29 2.75-1.02 2.75-1.02c.55 1.35.2 2.39.1 2.64c.65.71 1.03 1.6 1.03 2.71c0 3.82-2.34 4.66-4.57 4.91c.36.31.69.92.69 1.85V21c0 .27.16.59.67.5C19.14 20.16 22 16.42 22 12A10 10 0 0 0 12 2Z"},null,-1)];var gs={name:"mdi-github",render:function(e,t){return p(),x("svg",hs,[...vs])}};const _s={class:"flex"};var bs=c({__name:"AGErrorReportModalButtons",props:{report:Xe()},setup(e){const s=e,r=t((()=>s.report.description?`${s.report.title}: ${s.report.description}`:s.report.title)),o=t((()=>{if(!Ie.sourceUrl)return!1;const e=encodeURIComponent(r.value),t=encodeURIComponent(["[Please, explain here what you were trying to do when this error appeared]","","Error details:","```",ae(s.report.details??"Details missing from report",1800-e.length-Ie.sourceUrl.length).trim(),"```"].join("\n"));return`${Ie.sourceUrl}/issues/new?title=${e}&body=${t}`})),n=t((()=>V([{id:"clipboard",description:"Copy to clipboard",iconComponent:fs,async handler(){await navigator.clipboard.writeText(`${r.value}\n\n${s.report.details}`),pt.showSnackbar(ht("errors.copiedToClipboard","Debug information copied to clipboard"))}},{id:"console",description:"Log to console",iconComponent:ds,handler(){const e=s.report.error??s.report;window.error=e,console.error(e),pt.showSnackbar(ht("errors.addedToConsole","You can now use the **error** variable in the console"))}}],(e=>{o.value&&e.push({id:"github",description:"Report in GitHub",iconComponent:gs,url:o.value})}))));return(e,t)=>(p(),x("div",_s,[(p(!0),x(A,null,H(n.value,((t,s)=>v(e.$slots,"default",C(t,{key:s}),(()=>[w(Yt,{color:"clear",url:t.url,title:e.$td(`errors.report_${t.id}`,t.description),"aria-label":e.$td(`errors.report_${t.id}`,t.description),onClick:t.handler},{default:h((()=>[(p(),m(_(t.iconComponent),{class:"h-4 w-4","aria-hidden":"true"}))])),_:2},1032,["url","title","aria-label","onClick"])])))),128))]))}});bs.__file="src/components/modals/AGErrorReportModalButtons.vue";var ys=c({__name:"AGErrorReportModalTitle",props:{report:Xe(),currentReport:Ke(),totalReports:Ke()},setup(e){const s=e,r=t((()=>!s.totalReports||s.totalReports<=1?s.report.title:`${s.report.title} (${s.currentReport}/${s.totalReports})`));return(e,t)=>(p(),m(Vt,{text:r.value,inline:""},null,8,["text"]))}});ys.__file="src/components/modals/AGErrorReportModalTitle.vue";const xs={class:"flex items-center justify-between text-lg font-medium"},As={class:"flex items-center"},ws=["textContent"];var Gs=c({__name:"AGErrorReportModal",props:ls(),setup(e){const t=e,{activeReportIndex:s,details:r,nextReportText:o,previousReportText:n,report:a}=is(t);return(e,t)=>(p(),m(zt,null,{default:h((()=>[k("div",null,[k("h2",xs,[k("div",As,[w(ys,{report:f(a),"current-report":f(s)+1,"total-reports":e.reports.length},null,8,["report","current-report","total-reports"]),e.reports.length>1?(p(),x(A,{key:0},[w(Yt,{color:"clear",disabled:0===f(s),title:f(n),"aria-label":f(n),onClick:t[0]||(t[0]=e=>s.value--)},{default:h((()=>[w(f(ns),{"aria-hidden":"true",class:"h-4 w-4"})])),_:1},8,["disabled","title","aria-label"]),w(Yt,{color:"clear",disabled:f(s)===e.reports.length-1,title:f(o),"aria-label":f(o),onClick:t[1]||(t[1]=e=>s.value++)},{default:h((()=>[w(f(ss),{"aria-hidden":"true",class:"h-4 w-4"})])),_:1},8,["disabled","title","aria-label"])],64)):G("v-if",!0)]),w(bs,{report:f(a)},null,8,["report"])]),f(a).description?(p(),m(Vt,{key:0,text:f(a).description,class:"mt-2"},null,8,["text"])):G("v-if",!0)]),k("pre",{class:"h-full overflow-auto bg-gray-200 p-4 text-xs text-red-900",textContent:M(f(r))},null,8,ws)])),_:1}))}});Gs.__file="src/components/modals/AGErrorReportModal.vue";const ks={message:tt()};function Ss(){return ks}function Cs(e){return{renderedMessage:t((()=>e.message??ht("ui.loading","Loading...")))}}var js=c({__name:"AGLoadingModal",props:Ss(),setup(e){const t=e,{renderedMessage:s}=Cs(t);return(e,t)=>(p(),m(zt,{cancellable:!1},{default:h((()=>[w(Vt,{text:f(s)},null,8,["text"])])),_:1}))}});js.__file="src/components/modals/AGLoadingModal.vue";const $s={title:tt(),message:et(),label:tt(),defaultValue:tt(),placeholder:tt(),acceptText:tt(),cancelText:tt()};function Ms(){return $s}function Hs(e){return{renderedAcceptText:t((()=>e.acceptText??ht("ui.accept","Ok"))),renderedCancelText:t((()=>e.cancelText??ht("ui.cancel","Cancel")))}}var Es=c({__name:"AGForm",props:{form:We()},emits:["submit"],setup(e,{emit:t}){let s;const r=e,o=t;return E((e=>{s?.(),s=r.form?.on("submit",(()=>o("submit"))),e((()=>s?.()))})),g("form",r.form),(t,s)=>(p(),x("form",{onSubmit:s[0]||(s[0]=T((t=>e.form?.submit()),["prevent"]))},[v(t.$slots,"default")],32))}});Es.__file="src/components/forms/AGForm.vue";const Ts={name:tt(),label:tt(),description:tt(),modelValue:Ne([String,Number,Boolean])};function Is(){return Ts}function Ls(e){return Mt(e,Ts)}var Rs=c({__name:"AGHeadlessInput",props:{as:tt("div"),...Is()},emits:["update:modelValue"],setup(e,{expose:s,emit:o}){const n=o,a=e,l=t((()=>i&&a.name?i.errors[a.name]??null:null)),i=r("form",null),u={id:`input-${ee()}`,name:t((()=>a.name)),label:t((()=>a.label)),description:t((()=>a.description)),value:t((()=>i&&a.name?i.getFieldValue(a.name):a.modelValue)),errors:I(l),update(e){i&&a.name?i.setFieldValue(a.name,e):n("update:modelValue",e)}};return g("input",u),s(u),(t,s)=>e.as?(p(),m(_(e.as),{key:0},{default:h((()=>[v(t.$slots,"default")])),_:3})):v(t.$slots,"default",{key:1})}});Rs.__file="src/components/headless/forms/AGHeadlessInput.vue";var Ps=c({inheritAttrs:!1,__name:"AGHeadlessInputDescription",setup(e){const s=Ue("input","<AGHeadlessInputDescription> must be a child of a <AGHeadlessInput>"),r=t((()=>"string"==typeof s.description?s.description:"")),o=t((()=>!!s.description));return(e,t)=>v(e.$slots,"default",{id:`${f(s).id}-description`},(()=>[o.value?(p(),m(Vt,C({key:0},e.$attrs,{id:`${f(s).id}-description`,text:r.value}),null,16,["id","text"])):G("v-if",!0)]))}});Ps.__file="src/components/headless/forms/AGHeadlessInputDescription.vue";const Os=["id"];var Ds=c({__name:"AGHeadlessInputError",setup(e){const s=Ue("input","<AGHeadlessInputError> must be a child of a <AGHeadlessInput>"),r=t((()=>s.errors?ht(`errors.${s.errors[0]}`,`Error: ${s.errors[0]}`):null));return(e,t)=>r.value?(p(),x("p",{key:0,id:`${f(s).id}-error`},M(r.value),9,Os)):G("v-if",!0)}});function Bs(e,t){const s=r("form",null),o=s?.on("focus",(s=>e.name===s&&t()));l((()=>o?.()))}Ds.__file="src/components/headless/forms/AGHeadlessInputError.vue";const Vs=["id","name","type","aria-invalid","aria-describedby","checked"];var qs=c({__name:"AGHeadlessInputInput",props:{type:tt("text")},setup(s){const r=s,o=e(),n=Ue("input","<AGHeadlessInputInput> must be a child of a <AGHeadlessInput>"),a=t((()=>n.name??void 0)),l=t((()=>n.value)),i=t((()=>{if("checkbox"===r.type)return!!l.value}));function u(){o.value&&n.update(function(){if(!o.value)return null;switch(r.type){case"checkbox":return o.value.checked;case"date":return o.value.valueAsDate;default:return o.value.value}}())}return Bs(n,(()=>o.value?.focus())),E((()=>{o.value&&("date"!==r.type?o.value.value=l.value:o.value.valueAsDate=l.value)})),(e,t)=>(p(),x("input",{id:f(n).id,ref_key:"$input",ref:o,name:a.value,type:s.type,"aria-invalid":f(n).errors?"true":"false","aria-describedby":f(n).errors?`${f(n).id}-error`:f(n).description?`${f(n).id}-description`:void 0,checked:i.value,onInput:u},null,40,Vs))}});qs.__file="src/components/headless/forms/AGHeadlessInputInput.vue";const zs=["for"];var Us=c({__name:"AGHeadlessInputLabel",setup(e){const s=Ue("input","<AGHeadlessInputLabel> must be a child of a <AGHeadlessInput>"),r=L(),o=t((()=>!(!s.label&&!r.default)));return(e,t)=>o.value?(p(),x("label",{key:0,for:f(s).id},[v(e.$slots,"default",{},(()=>[$(M(f(s).label),1)]))],8,zs)):G("v-if",!0)}});Us.__file="src/components/headless/forms/AGHeadlessInputLabel.vue";const Fs={class:"absolute bottom-0 left-0 translate-y-full"};var Ns=c({inheritAttrs:!1,__name:"AGInput",props:Is(),setup(e){const t=e,s=De(),[r,o]=Ct();return(e,n)=>(p(),m(Rs,C({ref_key:"$input",ref:s,class:["relative flex flex-col items-center",f(o)]},t),{default:h((()=>[w(Us,{class:"sr-only"}),w(qs,C(f(r),{class:["block w-full border-0 py-1.5 text-gray-900 ring-1 ring-inset ring-gray-300 placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-indigo-600",{"ring-1 ring-red-500":f(s)?.errors}]}),null,16,["class"]),w(Ps),k("div",Fs,[w(Ds,{class:"mt-1 text-sm text-red-500"})])])),_:1},16,["class"]))}});Ns.__file="src/components/forms/AGInput.vue";const Ks={String:"string",Number:"number",Boolean:"boolean",Object:"object",Date:"date"},Ws=new WeakMap;class Qs extends q{constructor(s){super(),D(this,"errors",void 0),D(this,"_fields",void 0),D(this,"_data",void 0),D(this,"_submitted",void 0),D(this,"_errors",void 0),D(this,"_listeners",{}),this._fields=s,this._submitted=e(!1),this._data=this.getInitialData(s),this._errors=this.getInitialErrors(s),Ws.set(this,t((()=>!Object.values(this._errors).some((e=>null!==e))))),this.errors=I(this._errors)}get valid(){return!!Ws.get(this)?.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]}data(){return{...this._data}}validate(){const e=Object.entries(this._fields).reduce(((e,t)=>{let[s,r]=t;return e[s]=this.getFieldErrors(s,r),e}),{});return this.resetErrors(e),this.valid}reset(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this._submitted.value=!1,e.keepData||this.resetData(),e.keepErrors||this.resetErrors()}submit(){this._submitted.value=!0;const e=this.validate();return e&&this._listeners.submit?.forEach((e=>e())),e}on(e,t){return this._listeners[e]??=[],this._listeners[e]?.push(t),()=>this.off(e,t)}off(e,t){Q(this._listeners[e]??[],t)}async focus(e){await a(),this._listeners.focus?.forEach((t=>t(e)))}__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,r]=t;return e[s]=r.default??null,e}),{});return o(t)}getInitialErrors(e){if(this.static().isConjuring())return{};const t=Object.keys(e).reduce(((e,t)=>(e[t]=null,e)),{});return o(t)}resetData(){for(const[e,t]of Object.entries(this._fields))this._data[e]=t.default??null}resetErrors(e){Object.keys(this._errors).forEach((e=>delete this._errors[e])),e&&Object.assign(this._errors,e)}}function Zs(e){return new Qs(e)}function Ys(e){return{default:e,type:Ks.Boolean}}function Js(e){return{default:e,type:Ks.Date}}function Xs(e){return{default:e,type:Ks.Boolean,rules:"required"}}function er(e){return{default:e,type:Ks.Date,rules:"required"}}function tr(e){return{default:e,type:Ks.Number,rules:"required"}}function sr(e){return{default:e,type:Ks.String,rules:"required"}}function rr(e){return{default:e,type:Ks.Number}}function or(e){return{default:e,type:Ks.String}}const nr={class:"mt-2 flex flex-row-reverse gap-2"};var ar=c({__name:"AGPromptModal",props:Ms(),setup(e){const t=e,s=Zs({draft:sr(t.defaultValue??"")}),{renderedAcceptText:r,renderedCancelText:o}=Hs(t);return(e,t)=>(p(),m(zt,{cancellable:!1,title:e.title},{default:h((({close:t})=>[w(Vt,{text:e.message},null,8,["text"]),w(Es,{form:f(s),onSubmit:e=>t(f(s).draft)},{default:h((()=>[w(Ns,{name:"draft",placeholder:e.placeholder,label:e.label},null,8,["placeholder","label"]),k("div",nr,[w(Yt,{submit:""},{default:h((()=>[$(M(f(r)),1)])),_:1}),w(Yt,{color:"secondary",onClick:e=>t()},{default:h((()=>[$(M(f(o)),1)])),_:2},1032,["onClick"])])])),_:2},1032,["form","onSubmit"])])),_:1},8,["title"]))}});ar.__file="src/components/modals/AGPromptModal.vue";const lr={class:"pointer-events-auto"};var ir=c({__name:"AGHeadlessSnackbar",setup:e=>(e,t)=>(p(),x("div",lr,[v(e.$slots,"default")]))});ir.__file="src/components/headless/snackbars/AGHeadlessSnackbar.vue";const ur=oe(gt,["Primary","Clear"]),cr={id:et(),message:et(),actions:Pe((()=>[])),color:qe(ur,gt.Secondary)};function dr(){return cr}function pr(e){return{activate:function(t){t.handler?.(),t.dismiss&&pt.hideSnackbar(e.id)}}}var mr=c({__name:"AGSnackbar",props:dr(),setup(e){const s=e,{activate:r}=pr(s),o=t((()=>s.color===gt.Danger?"bg-red-200 text-red-900":"bg-gray-900 text-white"));return(e,t)=>(p(),m(ir,{class:j(["flex flex-row items-center justify-center gap-3 p-4",o.value])},{default:h((()=>[w(Vt,{text:e.message,inline:""},null,8,["text"]),(p(!0),x(A,null,H(e.actions,((t,s)=>(p(),m(Yt,{key:s,color:e.color,onClick:e=>f(r)(t)},{default:h((()=>[$(M(t.text),1)])),_:2},1032,["color","onClick"])))),128))])),_:1},8,["class"]))}});mr.__file="src/components/snackbars/AGSnackbar.vue";const fr={class:"grid flex-grow place-items-center"},hr={class:"flex flex-col items-center space-y-6 p-8"},vr={class:"mt-2 text-center text-4xl font-medium text-red-600"},gr={class:"mt-4 flex flex-col space-y-4"};var _r=c({__name:"AGStartupCrash",setup:e=>(e,t)=>(p(),x("div",fr,[k("div",hr,[k("h1",vr,M(e.$td("startupCrash.title","Something went wrong!")),1),w(Vt,{text:e.$td("startupCrash.message","Something failed trying to start the application.\n\nHere's some things you can do:"),class:"mt-4 text-center"},null,8,["text"]),k("div",gr,[w(Yt,{color:"danger",onClick:t[0]||(t[0]=t=>e.$app.reload())},{default:h((()=>[$(M(e.$td("startupCrash.reload","Try again")),1)])),_:1}),w(Yt,{color:"danger",onClick:t[1]||(t[1]=t=>e.$errors.inspect(e.$errors.startupErrors))},{default:h((()=>[$(M(e.$td("startupCrash.inspect","View error details")),1)])),_:1})])])]))});_r.__file="src/components/lib/AGStartupCrash.vue";const br={$ui:pt};var yr={async install(e,t){const s={[ct.AlertModal]:Nt,[ct.ConfirmModal]:Xt,[ct.ErrorReportModal]:Gs,[ct.LoadingModal]:js,[ct.PromptModal]:ar,[ct.Snackbar]:mr,[ct.StartupCrash]:_r};Object.entries({...s,...t.components}).forEach((e=>{let[t,s]=e;return pt.registerComponent(t,s)})),await lt(e,br)}};async function xr(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const s=[kt,rt,At,Gt,it,yr,...t.plugins??[]];await Re(s,e,t),await(t.install?.(e)),await He.emit("application-ready")}async function Ar(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const s=R(e);await xr(s,t),s.mount("#app"),s._container?.classList.remove("loading"),await He.emit("application-mounted")}const wr={key:0};var Gr=c({__name:"AGAppModals",setup(e){const s=t((()=>pt.modals[0]??null));return(e,t)=>s.value?(p(),x("aside",wr,[w(Rt,{"child-index":1,modal:s.value},null,8,["modal"])])):G("v-if",!0)}});Gr.__file="src/components/AGAppModals.vue";const kr={"aria-live":"assertive",class:"z-60 pointer-events-none fixed inset-0 flex items-end px-4 py-6 sm:p-6"},Sr={class:"flex w-full flex-col items-end space-y-4"};const Cr={render:function(e,t){return p(),x("div",kr,[k("div",Sr,[(p(!0),x(A,null,H(e.$ui.snackbars,(e=>(p(),m(_(e.component),C({id:e.id,key:e.id},e.properties),null,16,["id"])))),128))])])},__file:"src/components/AGAppSnackbars.vue"};var jr=Cr,$r=c({__name:"AGAppOverlays",setup(t){const s=e(null),r=e(!0);return St("show-overlays-backdrop",(async()=>{s.value&&r.value&&(r.value=!1,s.value.classList.remove("opacity-0"))})),St("hide-overlays-backdrop",(async()=>{s.value&&!r.value&&(r.value=!0,s.value.classList.add("opacity-0"))})),(e,t)=>(p(),x(A,null,[k("div",{id:"aerogel-overlays-backdrop",ref_key:"$backdrop",ref:s,class:"pointer-events-none fixed inset-0 z-50 bg-black/30 opacity-0"},null,512),w(Gr),w(jr)],64))}});$r.__file="src/components/AGAppOverlays.vue";const Mr={class:"flex min-h-full flex-col text-base font-normal leading-tight text-gray-900 antialiased"};var Hr=c({__name:"AGAppLayout",setup:e=>(e,t)=>(p(),x("div",Mr,[e.$errors.hasStartupErrors?v(e.$slots,"startup-crash",{key:0},(()=>[(p(),m(_(e.$ui.requireComponent(f(ct).StartupCrash))))])):v(e.$slots,"default",{key:1}),w($r)]))});Hr.__file="src/components/AGAppLayout.vue";const Er={class:"ml-2"};var Tr=c({inheritAttrs:!1,__name:"AGCheckbox",props:{name:tt()},emits:["update:modelValue"],setup(e){const t=De();return(s,r)=>(p(),m(Rs,{ref_key:"$input",ref:t,name:e.name,class:"flex","onUpdate:modelValue":r[0]||(r[0]=e=>s.$emit("update:modelValue",e))},{default:h((()=>[w(qs,C(s.$attrs,{type:"checkbox",class:{"text-indigo-600 focus:ring-indigo-600":!f(t)?.errors,"border-red-200 text-red-600 focus:ring-red-600":f(t)?.errors}}),null,16,["class"]),k("div",Er,[s.$slots.default?(p(),m(Us,{key:0},{default:h((()=>[v(s.$slots,"default")])),_:3})):G("v-if",!0),w(Ds,{class:"text-sm text-red-600"})])])),_:3},8,["name"]))}});Tr.__file="src/components/forms/AGCheckbox.vue";const Ir={viewBox:"0 0 20 20",width:"1.2em",height:"1.2em"},Lr=[k("path",{fill:"currentColor",d:"m9.293 12.95l.707.707L15.657 8l-1.414-1.414L10 10.828L5.757 6.586L4.343 8z"},null,-1)];var Rr={name:"zondicons-cheveron-down",render:function(e,t){return p(),x("svg",Ir,[...Lr])}};const Pr={name:tt(),label:tt(),options:Qe(),noSelectionText:tt(),optionsText:Ne()},Or=["update:modelValue"];function Dr(){return Pr}function Br(){return[...Or]}function Vr(e){return Mt(e,Pr)}var qr=c({__name:"AGHeadlessSelect",props:{modelValue:Ne(),...Dr()},emits:Br(),setup(e,{expose:s,emit:o}){const n=o,a=e,l=t((()=>"function"==typeof a.optionsText?a.optionsText:"string"==typeof a.optionsText?e=>re(e[a.optionsText]):e=>re(e))),i=r("form",null),u=t((()=>a.noSelectionText??ht("select.noSelection","-"))),c=t((()=>i&&a.name?i.getFieldValue(a.name):a.modelValue)),d=t((()=>i&&a.name?i.errors[a.name]??null:null));function _(e){i&&a.name?i.setFieldValue(a.name,e):n("update:modelValue",e)}const b={id:`select-${ee()}`,noSelectionText:u,selectedOption:c,errors:d,options:t((()=>a.options)),label:t((()=>a.label)),buttonText:t((()=>null===c.value?u.value:l.value(c.value))),renderText:l,update:_};return g("select",b),s(b),(e,t)=>(p(),m(f(fe),{"model-value":c.value,"onUpdate:modelValue":t[0]||(t[0]=e=>_(e))},{default:h((({value:t,open:s,disabled:r})=>[v(e.$slots,"default",{value:t,open:s,disabled:r})])),_:3},8,["model-value"]))}});qr.__file="src/components/headless/forms/AGHeadlessSelect.vue";var zr=c({__name:"AGHeadlessSelectButton",props:{textClass:tt()},setup(e){const t=Ue("select","<AGHeadlessSelectButton> must be a child of a <AGHeadlessSelect>");return(s,r)=>(p(),m(f(he),null,{default:h((({value:r,open:o,disabled:n})=>[v(s.$slots,"default",{value:r,open:o,disabled:n},(()=>[k("span",{class:j(e.textClass)},M(f(t)?.buttonText),3)])),v(s.$slots,"icon")])),_:3}))}});zr.__file="src/components/headless/forms/AGHeadlessSelectButton.vue";const Ur=["id"];var Fr=c({__name:"AGHeadlessSelectError",setup(e){const s=Ue("select","<AGHeadlessSelectError> must be a child of a <AGHeadlessSelect>"),r=t((()=>s.errors?ht(`errors.${s.errors[0]}`,`Error: ${s.errors[0]}`):null));return(e,t)=>r.value?(p(),x("p",{key:0,id:`${f(s).id}-error`},M(r.value),9,Ur)):G("v-if",!0)}});Fr.__file="src/components/headless/forms/AGHeadlessSelectError.vue";var Nr=c({__name:"AGHeadlessSelectLabel",setup(e){const s=Ue("select","<AGHeadlessSelectLabel> must be a child of a <AGHeadlessSelect>"),r=L(),o=t((()=>!(!s.label&&!r.default)));return(e,t)=>o.value?(p(),m(f(ve),{key:0},{default:h((({open:t,disabled:r})=>[v(e.$slots,"default",{open:t,disabled:r},(()=>[$(M(f(s).label),1)]))])),_:3})):G("v-if",!0)}});Nr.__file="src/components/headless/forms/AGHeadlessSelectLabel.vue";var Kr=c({__name:"AGHeadlessSelectOption",props:{value:Ye(),selectedClass:tt(),unselectedClass:tt(),activeClass:tt(),inactiveClass:tt()},setup(e){const t=Ue("select","<AGHeadlessSelectOption> must be a child of a <AGHeadlessSelect>");return(s,r)=>(p(),m(f(ge),{value:e.value,as:"template"},{default:h((({active:r,selected:o,disabled:n})=>[v(s.$slots,"default",{active:r,selected:o,disabled:n},(()=>[k("li",{class:j({[e.activeClass??"active"]:r,[e.inactiveClass??"inactive"]:!r,[e.selectedClass??"selected"]:o,[e.unselectedClass??"unselected"]:!o})},M(f(t).renderText(e.value)),3)]))])),_:3},8,["value"]))}});Kr.__file="src/components/headless/forms/AGHeadlessSelectOption.vue";const Wr={class:"pointer-events-none absolute inset-y-0 right-0 flex items-center pr-2"};var Qr=c({__name:"AGSelect",props:Dr(),emits:Br(),setup(e){const t=e,s=De();return(e,r)=>(p(),m(qr,C(t,{ref_key:"$select",ref:s,as:"div","onUpdate:modelValue":r[0]||(r[0]=t=>e.$emit("update:modelValue",t))}),{default:h((()=>[w(Nr,{class:"block text-sm font-medium leading-6 text-gray-900"}),k("div",{class:j(["relative",{"mt-2":f(s)?.label}])},[w(zr,{class:j(["relative w-full cursor-default bg-white py-1.5 pl-3 pr-10 text-left text-gray-900 ring-1 ring-inset ring-gray-300 focus:outline-none focus:ring-2 focus:ring-indigo-600",{"ring-1 ring-red-500":f(s)?.errors}]),"text-class":"block truncate"},{icon:h((()=>[k("span",Wr,[w(f(Rr),{class:"h-5 w-5 text-gray-400"})])])),_:1},8,["class"]),w(f(_e),{class:"absolute z-10 mt-1 max-h-60 w-full overflow-auto border bg-white py-1 text-base ring-1 ring-black ring-opacity-5 focus:outline-none"},{default:h((()=>[(p(!0),x(A,null,H(f(s)?.options??[],((e,t)=>(p(),m(Kr,{key:t,value:e,class:"relative block cursor-default select-none truncate py-2 pl-3 pr-9","selected-class":"font-semibold","unselected-class":"font-normal","active-class":"bg-indigo-600 text-white","inactive-class":"text-gray-900"},null,8,["value"])))),128))])),_:1})],2),w(Fr,{class:"mt-2 text-sm text-red-600"})])),_:1},16))}});Qr.__file="src/components/forms/AGSelect.vue";const Zr=["id","name","value","aria-invalid","aria-describedby"];var Yr=c({__name:"AGHeadlessInputTextArea",setup(s){const r=e(),o=Ue("input","<AGHeadlessInputTextArea> must be a child of a <AGHeadlessInput>"),n=t((()=>o.name??void 0)),a=t((()=>o.value));function l(){r.value&&o.update(r.value.value)}return Bs(o,(()=>r.value?.focus())),(e,t)=>(p(),x("textarea",{id:f(o).id,ref_key:"$textArea",ref:r,name:n.value,value:a.value,"aria-invalid":f(o).errors?"true":"false","aria-describedby":f(o).errors?`${f(o).id}-error`:f(o).description?`${f(o).id}-description`:void 0,onInput:l},null,40,Zr))}});Yr.__file="src/components/headless/forms/AGHeadlessInputTextArea.vue";var Jr=c({__name:"AGErrorMessage",props:{error:Xe()},setup(e){const s=e,r=t((()=>bt(s.error)));return(e,t)=>(p(),m(Vt,{text:r.value,inline:""},null,8,["text"]))}});Jr.__file="src/components/lib/AGErrorMessage.vue";var Xr=c({__name:"AGLink",setup:e=>(e,t)=>(p(),m(Zt,{class:"font-medium hover:underline"},{default:h((()=>[v(e.$slots,"default")])),_:3}))});Xr.__file="src/components/lib/AGLink.vue";var eo=c({__name:"AGMeasured",props:{as:tt("span")},setup(t){const s=e(!1);return(e,r)=>{const o=P("measure");return O((p(),m(_(t.as),{class:j({"!invisible !absolute !w-auto":!s.value})},{default:h((()=>[v(e.$slots,"default")])),_:3},8,["class"])),[[o,()=>s.value=!0]])}}});eo.__file="src/components/lib/AGMeasured.vue";var to=c({__name:"AGModalTitle",setup:e=>(e,t)=>(p(),m(Dt,{class:"mb-2 font-semibold"},{default:h((()=>[v(e.$slots,"default")])),_:3}))});to.__file="src/components/modals/AGModalTitle.vue";class so{}async function ro(e){await e.run()}export{Nt as AGAlertModal,Hr as AGAppLayout,$r as AGAppOverlays,Yt as AGButton,Tr as AGCheckbox,Xt as AGConfirmModal,Jr as AGErrorMessage,bs as AGErrorReportModalButtons,ys as AGErrorReportModalTitle,Es as AGForm,Zt as AGHeadlessButton,Rs as AGHeadlessInput,Ps as AGHeadlessInputDescription,Ds as AGHeadlessInputError,qs as AGHeadlessInputInput,Us as AGHeadlessInputLabel,Yr as AGHeadlessInputTextArea,Lt as AGHeadlessModal,Ot as AGHeadlessModalPanel,Dt as AGHeadlessModalTitle,qr as AGHeadlessSelect,zr as AGHeadlessSelectButton,Fr as AGHeadlessSelectError,Nr as AGHeadlessSelectLabel,Kr as AGHeadlessSelectOption,ir as AGHeadlessSnackbar,Ns as AGInput,Xr as AGLink,js as AGLoadingModal,Vt as AGMarkdown,eo as AGMeasured,zt as AGModal,Rt as AGModalContext,to as AGModalTitle,ar as AGPromptModal,Qr as AGSelect,mr as AGSnackbar,_r as AGStartupCrash,Ie as App,Te as AppService,nt as Cache,ot as CacheService,gt as Colors,_t as Errors,$e as EventListenerPriorities,He as Events,Me as EventsService,Qs as Form,Ks as FormFieldTypes,so as Job,mt as Lang,je as Service,ur as SnackbarColors,pt as UI,ct as UIComponents,dt as UIService,Ut as alertModalProps,Pe as arrayProp,Ys as booleanInput,Oe as booleanProp,lt as bootServices,Ar as bootstrap,xr as bootstrapApplication,De as componentRef,Be as computedAsync,Kt as confirmModalProps,Js as dateInput,Ve as defineDirective,Le as definePlugin,Ce as defineServiceState,Se as defineServiceStore,ro as dispatch,qe as enumProp,as as errorReportModalProps,Ls as extractInputProps,Tt as extractModalProps,Vr as extractSelectProps,bt as getErrorMessage,ke as getPiniaStore,Fe as injectOrFail,ze as injectReactive,Ue as injectReactiveOrFail,Ts as inputProps,Re as installPlugins,ks as loadingModalProps,Ne as mixedProp,Ht as modalProps,rr as numberInput,Ke as numberProp,We as objectProp,jt as onCleanMounted,Bs as onFormFocus,$s as promptModalProps,$t as removeInteractiveClasses,Qe as requiredArrayProp,Xs as requiredBooleanInput,er as requiredDateInput,Ze as requiredEnumProp,Ye as requiredMixedProp,tr as requiredNumberInput,Je as requiredNumberProp,Xe as requiredObjectProp,sr as requiredStringInput,et as requiredStringProp,Ge as resetPiniaStore,Or as selectEmits,Pr as selectProps,cr as snackbarProps,or as stringInput,tt as stringProp,ft as translate,ht as translateWithDefault,Ft as useAlertModalProps,Qt as useConfirmModal,Wt as useConfirmModalProps,is as useErrorReportModal,ls as useErrorReportModalProps,St as useEvent,Zs as useForm,Ct as useInputAttrs,Is as useInputProps,Cs as useLoadingModal,Ss as useLoadingModalProps,It as useModalExpose,Et as useModalProps,Hs as usePromptModal,Ms as usePromptModalProps,Br as useSelectEmits,Dr as useSelectProps,pr as useSnackbar,dr as useSnackbarProps};
2
- //# sourceMappingURL=aerogel-core.esm.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"aerogel-core.esm.js","sources":["../src/errors/ServiceBootError.ts","../src/services/store.ts","../src/services/Service.ts","../src/services/Events.ts","../src/services/App.state.ts","../src/services/App.ts","../src/plugins/index.ts","../src/utils/vue.ts","../src/directives/index.ts","../src/directives/initial-focus.ts","../src/directives/measure.ts","../src/services/Cache.ts","../src/services/index.ts","../src/ui/UI.state.ts","../src/ui/UI.ts","../src/lang/Lang.ts","../src/lang/utils.ts","../src/errors/Errors.state.ts","../src/components/constants.ts","../src/errors/Errors.ts","../src/errors/utils.ts","../src/errors/index.ts","../src/lang/index.ts","../src/testing/index.ts","../src/utils/composition/events.ts","../src/utils/composition/forms.ts","../src/utils/composition/hooks.ts","../src/utils/tailwindcss.ts","../src/components/utils.ts","../src/components/headless/modals/AGHeadlessModal.ts","../src/components/headless/modals/AGHeadlessModal.vue","../src/components/modals/AGModalContext.vue","../src/components/headless/modals/AGHeadlessModalPanel.vue","../src/utils/markdown.ts","../src/components/lib/AGMarkdown.vue","../src/components/modals/AGModal.vue","../src/components/modals/AGAlertModal.ts","../src/components/modals/AGConfirmModal.ts","../src/components/headless/forms/AGHeadlessButton.vue","../src/components/forms/AGButton.vue","../src/components/modals/AGConfirmModal.vue","../src/components/modals/AGErrorReportModal.ts","../src/components/modals/AGErrorReportModalButtons.vue","../src/components/modals/AGErrorReportModalTitle.vue","../src/components/modals/AGErrorReportModal.vue","../src/components/modals/AGLoadingModal.ts","../src/components/modals/AGLoadingModal.vue","../src/components/modals/AGPromptModal.ts","../src/components/forms/AGForm.vue","../src/components/headless/forms/AGHeadlessInput.ts","../src/components/headless/forms/AGHeadlessInput.vue","../src/components/headless/forms/AGHeadlessInputDescription.vue","../src/components/headless/forms/AGHeadlessInputError.vue","../src/components/headless/forms/composition.ts","../src/components/headless/forms/AGHeadlessInputInput.vue","../src/components/headless/forms/AGHeadlessInputLabel.vue","../src/components/forms/AGInput.vue","../src/forms/Form.ts","../src/forms/composition.ts","../src/forms/utils.ts","../src/components/modals/AGPromptModal.vue","../src/components/headless/snackbars/index.ts","../src/components/snackbars/AGSnackbar.vue","../src/ui/index.ts","../src/bootstrap/index.ts","../src/components/AGAppModals.vue","../src/components/AGAppSnackbars.vue?vue&type=template&id=7942f27a&lang.js","../src/components/AGAppOverlays.vue","../src/components/forms/AGCheckbox.vue","../src/components/headless/forms/AGHeadlessSelect.ts","../src/components/headless/forms/AGHeadlessSelect.vue","../src/components/headless/forms/AGHeadlessSelectButton.vue","../src/components/headless/forms/AGHeadlessSelectError.vue","../src/components/headless/forms/AGHeadlessSelectLabel.vue","../src/components/headless/forms/AGHeadlessSelectOption.vue","../src/components/forms/AGSelect.vue","../src/components/headless/forms/AGHeadlessInputTextArea.vue","../src/components/lib/AGErrorMessage.vue","../src/components/lib/AGMeasured.vue","../src/jobs/Job.ts","../src/jobs/index.ts"],"sourcesContent":["import { JSError } from '@noeldemartin/utils';\n\nexport default class ServiceBootError extends JSError {\n\n constructor(serviceNamespace: string, cause: unknown) {\n super(`Service '${serviceNamespace}' failed booting`, { cause });\n }\n\n}\n","import { tap } from '@noeldemartin/utils';\nimport { createPinia, defineStore, setActivePinia } from 'pinia';\nimport type { DefineStoreOptions, Pinia, StateTree, Store, _GettersTree } from 'pinia';\n\nlet _store: Pinia | null = null;\n\nfunction initializePiniaStore(): Pinia {\n return _store ?? resetPiniaStore();\n}\n\nexport function resetPiniaStore(): Pinia {\n return tap(createPinia(), (store) => {\n _store = store;\n\n setActivePinia(store);\n });\n}\n\nexport function getPiniaStore(): Pinia {\n return _store ?? initializePiniaStore();\n}\n\nexport function defineServiceStore<Id extends string, S extends StateTree = {}, G extends _GettersTree<S> = {}, A = {}>(\n name: Id,\n options: Omit<DefineStoreOptions<Id, S, G, A>, 'id'>,\n): Store<Id, S, G, A> {\n initializePiniaStore();\n\n return defineStore(name, options)();\n}\n","import { MagicObject, PromisedValue, Storage, isEmpty, objectDeepClone, objectOnly } from '@noeldemartin/utils';\nimport type { Constructor } from '@noeldemartin/utils';\nimport type { MaybeRef } from 'vue';\nimport type { Store } from 'pinia';\n\nimport ServiceBootError from '@/errors/ServiceBootError';\nimport { defineServiceStore } from '@/services/store';\n\nexport type ServiceState = Record<string, any>; // eslint-disable-line @typescript-eslint/no-explicit-any\nexport type DefaultServiceState = any; // eslint-disable-line @typescript-eslint/no-explicit-any\nexport type ServiceConstructor<T extends Service = Service> = Constructor<T> & typeof Service;\nexport type UnrefServiceState<State extends ServiceState> = {\n [K in keyof State]: State[K] extends MaybeRef<infer T> ? T : State[K];\n};\n\nexport type ComputedStateDefinition<TState extends ServiceState, TComputedState extends ServiceState> = {\n [K in keyof TComputedState]: (state: UnrefServiceState<TState>) => TComputedState[K];\n} & ThisType<{\n readonly [K in keyof TComputedState]: TComputedState[K];\n}>;\n\nexport function defineServiceState<\n State extends ServiceState = ServiceState,\n ComputedState extends ServiceState = {}\n>(options: {\n name: string;\n initialState: State | (() => State);\n persist?: (keyof State)[];\n computed?: ComputedStateDefinition<State, ComputedState>;\n serialize?: (state: Partial<State>) => Partial<State>;\n}): Constructor<UnrefServiceState<State>> &\n Constructor<ComputedState> &\n Constructor<Service<UnrefServiceState<State>, ComputedState, Partial<UnrefServiceState<State>>>> {\n return class extends Service<UnrefServiceState<State>, ComputedState> {\n\n public static persist = (options.persist as string[]) ?? [];\n\n protected usesStore(): boolean {\n return true;\n }\n\n protected getName(): string | null {\n return options.name ?? null;\n }\n\n protected getInitialState(): UnrefServiceState<State> {\n if (typeof options.initialState === 'function') {\n return options.initialState();\n }\n\n return Object.entries(options.initialState).reduce((state, [key, value]) => {\n try {\n value = structuredClone(value);\n } catch (error) {\n // eslint-disable-next-line no-console\n console.warn(\n `Could not clone '${key}' state from ${this.getName()} service, ` +\n 'this may cause problems if you\\'re using multiple instances of the service ' +\n '(for example, in unit tests).\\n' +\n 'To fix this problem, declare your initialState as a function instead.',\n );\n }\n\n state[key as keyof State] = value;\n\n return state;\n }, {} as UnrefServiceState<State>);\n }\n\n protected getComputedStateDefinition(): ComputedStateDefinition<UnrefServiceState<State>, ComputedState> {\n return (options.computed ?? {}) as ComputedStateDefinition<UnrefServiceState<State>, ComputedState>;\n }\n\n protected serializePersistedState(state: Partial<State>): Partial<State> {\n return options.serialize?.(state) ?? state;\n }\n\n } as unknown as Constructor<UnrefServiceState<State>> &\n Constructor<ComputedState> &\n Constructor<Service<UnrefServiceState<State>, ComputedState, Partial<UnrefServiceState<State>>>>;\n}\n\nexport default class Service<\n State extends ServiceState = DefaultServiceState,\n ComputedState extends ServiceState = {},\n ServiceStorage extends Partial<State> = Partial<State>\n> extends MagicObject {\n\n public static persist: string[] = [];\n\n protected _name: string;\n private _booted: PromisedValue<void>;\n private _computedStateKeys: Set<keyof State>;\n private _store: Store | false;\n\n constructor() {\n super();\n\n const getters = this.getComputedStateDefinition();\n\n this._name = this.getName() ?? new.target.name;\n this._booted = new PromisedValue();\n this._computedStateKeys = new Set(Object.keys(getters));\n this._store =\n this.usesStore() &&\n defineServiceStore(this._name, {\n state: () => this.getInitialState(),\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getters: getters as any,\n });\n }\n\n public get booted(): PromisedValue<void> {\n return this._booted;\n }\n\n public launch(): Promise<void> {\n const handleError = (error: unknown) => this._booted.reject(new ServiceBootError(this._name, error));\n\n try {\n this.frameworkBoot()\n .then(() => this.boot())\n .then(() => this._booted.resolve())\n .catch(handleError);\n } catch (error) {\n handleError(error);\n }\n\n return this._booted;\n }\n\n public hasPersistedState(): boolean {\n return Storage.has(this._name);\n }\n\n public hasState<P extends keyof State>(property: P): boolean {\n if (!this._store) {\n return false;\n }\n\n return property in this._store.$state || this._computedStateKeys.has(property);\n }\n\n public getState(): State;\n public getState<P extends keyof State>(property: P): State[P];\n public getState<P extends keyof State>(property?: P): State | State[P] {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const store = this._store as any;\n\n if (property) {\n return store ? store[property] : undefined;\n }\n\n return store ? store : {};\n }\n\n public setState<P extends keyof State>(property: P, value: State[P]): void;\n public setState(state: Partial<State>): void;\n public setState<P extends keyof State>(stateOrProperty: P | Partial<State>, value?: State[P]): void {\n if (!this._store) {\n return;\n }\n\n const state = (\n typeof stateOrProperty === 'string' ? { [stateOrProperty]: value } : stateOrProperty\n ) as Partial<State>;\n\n Object.assign(this._store.$state, state);\n\n this.onStateUpdated(state);\n }\n\n protected __get(property: string): unknown {\n if (this.hasState(property)) {\n return this.getState(property);\n }\n\n return super.__get(property);\n }\n\n protected __set(property: string, value: unknown): void {\n this.setState({ [property]: value } as Partial<State>);\n }\n\n protected onStateUpdated(state: Partial<State>): void {\n // TODO fix this.static()\n const persist = (this.constructor as unknown as { persist: string[] }).persist;\n const persisted = objectOnly(state, persist);\n\n if (isEmpty(persisted)) {\n return;\n }\n\n const storage = Storage.get<ServiceStorage>(this._name);\n\n if (!storage) {\n return;\n }\n\n Storage.set(this._name, {\n ...storage,\n ...this.serializePersistedState(objectDeepClone(persisted) as Partial<State>),\n });\n }\n\n protected usesStore(): boolean {\n return false;\n }\n\n protected getName(): string | null {\n return null;\n }\n\n protected getInitialState(): State {\n return {} as State;\n }\n\n protected getComputedStateDefinition(): ComputedStateDefinition<State, ComputedState> {\n return {} as ComputedStateDefinition<State, ComputedState>;\n }\n\n protected serializePersistedState(state: Partial<State>): Partial<State> {\n return state;\n }\n\n protected async frameworkBoot(): Promise<void> {\n this.initializePersistedState();\n }\n\n protected async boot(): Promise<void> {\n // Placeholder for overrides, don't place any functionality here.\n }\n\n protected initializePersistedState(): void {\n // TODO fix this.static()\n const persist = (this.constructor as unknown as { persist: string[] }).persist;\n\n if (!this.usesStore() || isEmpty(persist)) {\n return;\n }\n\n if (Storage.has(this._name)) {\n const persisted = Storage.require<ServiceStorage>(this._name);\n this.setState(persisted);\n\n return;\n }\n\n Storage.set(this._name, objectOnly(this.getState(), persist));\n }\n\n}\n","import { arrayRemove, facade, fail, tap } from '@noeldemartin/utils';\n\nimport Service from '@/services/Service';\n\nexport interface EventsPayload {}\nexport interface EventListenerOptions {\n priority: number;\n}\nexport type AerogelGlobalEvents = Partial<{ [Event in EventWithoutPayload]: () => unknown }> &\n Partial<{ [Event in EventWithPayload]: EventListener<EventsPayload[Event]> }>;\n\nexport type EventListener<T = unknown> = (payload: T) => unknown;\nexport type UnknownEvent<T> = T extends keyof EventsPayload ? never : T;\n\nexport type EventWithoutPayload = {\n [K in keyof EventsPayload]: EventsPayload[K] extends void ? K : never;\n}[keyof EventsPayload];\n\nexport type EventWithPayload = {\n [K in keyof EventsPayload]: EventsPayload[K] extends void ? never : K;\n}[keyof EventsPayload];\n\nexport const EventListenerPriorities = {\n Low: -256,\n Default: 0,\n High: 256,\n} as const;\n\nexport class EventsService extends Service {\n\n private listeners: Record<string, { priorities: number[]; handlers: Record<number, EventListener[]> }> = {};\n\n protected async boot(): Promise<void> {\n Object.entries(globalThis.__aerogelEvents__ ?? {}).forEach(([event, listener]) =>\n this.on(event as string, listener as EventListener));\n }\n\n public emit<Event extends EventWithoutPayload>(event: Event): Promise<void>;\n public emit<Event extends EventWithPayload>(event: Event, payload: EventsPayload[Event]): Promise<void>;\n public emit<Event extends string>(event: UnknownEvent<Event>, payload?: unknown): Promise<void>;\n public async emit(event: string, payload?: unknown): Promise<void> {\n const listeners = this.listeners[event] ?? { priorities: [], handlers: {} };\n\n for (const priority of listeners.priorities) {\n await Promise.all(listeners.handlers[priority]?.map((listener) => listener(payload)) ?? []);\n }\n }\n\n /* eslint-disable max-len */\n public on<Event extends EventWithoutPayload>(event: Event, listener: () => unknown): () => void;\n public on<Event extends EventWithoutPayload>(event: Event, options: Partial<EventListenerOptions>, listener: () => unknown): () => void; // prettier-ignore\n public on<Event extends EventWithPayload>(event: Event, listener: EventListener<EventsPayload[Event]>): () => void | void; // prettier-ignore\n public on<Event extends EventWithPayload>(event: Event, options: Partial<EventListenerOptions>, listener: EventListener<EventsPayload[Event]>): () => void | void; // prettier-ignore\n public on<Event extends string>(event: UnknownEvent<Event>, listener: EventListener): () => void;\n public on<Event extends string>(event: UnknownEvent<Event>, options: Partial<EventListenerOptions>, listener: EventListener): () => void; // prettier-ignore\n /* eslint-enable max-len */\n\n public on(\n event: string,\n optionsOrListener: Partial<EventListenerOptions> | EventListener,\n listener?: EventListener,\n ): () => void {\n const options = typeof optionsOrListener === 'function' ? {} : optionsOrListener;\n const handler = typeof optionsOrListener === 'function' ? optionsOrListener : (listener as EventListener);\n\n this.registerListener(event, options, handler);\n\n return () => this.off(event, handler);\n }\n\n /* eslint-disable max-len */\n public once<Event extends EventWithoutPayload>(event: Event, listener: () => unknown): () => void;\n public once<Event extends EventWithoutPayload>(event: Event, options: Partial<EventListenerOptions>, listener: () => unknown): () => void; // prettier-ignore\n public once<Event extends EventWithPayload>(event: Event, listener: EventListener<EventsPayload[Event]>): () => void | void; // prettier-ignore\n public once<Event extends EventWithPayload>(event: Event, options: Partial<EventListenerOptions>, listener: EventListener<EventsPayload[Event]>): () => void | void; // prettier-ignore\n public once<Event extends string>(event: UnknownEvent<Event>, listener: EventListener): () => void;\n public once<Event extends string>(event: UnknownEvent<Event>, options: Partial<EventListenerOptions>, listener: EventListener): () => void; // prettier-ignore\n /* eslint-enable max-len */\n\n public once(\n event: string,\n optionsOrListener: Partial<EventListenerOptions> | EventListener,\n listener?: EventListener,\n ): () => void {\n let onceListener: EventListener | null = null;\n const options = typeof optionsOrListener === 'function' ? {} : optionsOrListener;\n const handler = typeof optionsOrListener === 'function' ? optionsOrListener : (listener as EventListener);\n\n return tap(\n () => onceListener && this.off(event, onceListener),\n (off) => {\n onceListener = (...args) => {\n off();\n\n return handler(...args);\n };\n\n this.registerListener(event, options, handler);\n },\n );\n }\n\n public off(event: string, listener: EventListener): void {\n const listeners = this.listeners[event];\n\n if (!listeners) {\n return;\n }\n\n const priorities = [...listeners.priorities];\n\n for (const priority of priorities) {\n arrayRemove(listeners.handlers[priority] ?? [], listener);\n\n if (listeners.handlers[priority]?.length === 0) {\n delete listeners.handlers[priority];\n arrayRemove(listeners.priorities, priority);\n }\n }\n\n if (listeners.priorities.length === 0) {\n delete this.listeners[event];\n }\n }\n\n protected registerListener(event: string, options: Partial<EventListenerOptions>, handler: EventListener): void {\n const priority = options.priority ?? 0;\n\n if (!(event in this.listeners)) {\n this.listeners[event] = { priorities: [], handlers: {} };\n }\n\n const priorities =\n this.listeners[event]?.priorities ?? fail<number[]>(`priorities missing for event '${event}'`);\n const handlers =\n this.listeners[event]?.handlers ??\n fail<Record<number, EventListener[]>>(`handlers missing for event '${event}'`);\n\n if (!priorities.includes(priority)) {\n priorities.push(priority);\n priorities.sort((a, b) => b - a);\n handlers[priority] = [];\n }\n\n handlers[priority]?.push(handler);\n }\n\n}\n\nexport default facade(EventsService);\n\ndeclare global {\n // eslint-disable-next-line no-var\n var __aerogelEvents__: AerogelGlobalEvents | undefined;\n}\n","import Aerogel from 'virtual:aerogel';\n\nimport { defineServiceState } from '@/services/Service';\nimport type { Plugin } from '@/plugins/Plugin';\n\nexport default defineServiceState({\n name: 'app',\n initialState: {\n plugins: {} as Record<string, Plugin>,\n environment: Aerogel.environment,\n sourceUrl: Aerogel.sourceUrl,\n },\n computed: {\n development: (state) => state.environment === 'development',\n testing: (state) => state.environment === 'test' || state.environment === 'testing',\n },\n});\n","import { PromisedValue, facade, forever, updateLocationQueryParameters } from '@noeldemartin/utils';\n\nimport Events from '@/services/Events';\nimport type { Plugin } from '@/plugins';\n\nimport Service from './App.state';\n\nexport class AppService extends Service {\n\n public readonly ready = new PromisedValue<void>();\n public readonly mounted = new PromisedValue<void>();\n\n public isReady(): boolean {\n return this.ready.isResolved();\n }\n\n public isMounted(): boolean {\n return this.mounted.isResolved();\n }\n\n public async whenReady<T>(callback: () => T): Promise<T> {\n const result = await this.ready.then(callback);\n\n return result;\n }\n\n public async reload(queryParameters?: Record<string, string | undefined>): Promise<void> {\n queryParameters && updateLocationQueryParameters(queryParameters);\n\n location.reload();\n\n // Stall until the reload happens\n await forever();\n }\n\n public plugin<T extends Plugin = Plugin>(name: string): T | null {\n return (this.plugins[name] as T) ?? null;\n }\n\n protected async boot(): Promise<void> {\n Events.once('application-ready', () => this.ready.resolve());\n Events.once('application-mounted', () => this.mounted.resolve());\n }\n\n}\n\nexport default facade(AppService);\n","import type { GetClosureArgs } from '@noeldemartin/utils';\n\nimport App from '@/services/App';\n\nimport type { Plugin } from './Plugin';\n\nexport * from './Plugin';\n\nexport function definePlugin<T extends Plugin>(plugin: T): T {\n return plugin;\n}\n\nexport async function installPlugins(plugins: Plugin[], ...args: GetClosureArgs<Plugin['install']>): Promise<void> {\n App.setState(\n 'plugins',\n plugins.reduce((pluginsMap, plugin) => {\n if (plugin.name) {\n pluginsMap[plugin.name] = plugin;\n }\n\n return pluginsMap;\n }, {} as Record<string, Plugin>),\n );\n\n await Promise.all(plugins.map((plugin) => plugin.install(...args)) ?? []);\n}\n","import { fail } from '@noeldemartin/utils';\nimport { computed, inject, reactive, ref, watch } from 'vue';\nimport type { Directive, InjectionKey, PropType, Ref, UnwrapNestedRefs } from 'vue';\n\ntype BaseProp<T> = {\n type?: PropType<T>;\n validator?(value: unknown): boolean;\n};\n\ntype RequiredProp<T> = BaseProp<T> & { required: true };\ntype OptionalProp<T> = BaseProp<T> & { default: T | (() => T) | null };\n\nexport type ComponentProps = Record<string, unknown>;\n\nexport function arrayProp<T>(defaultValue?: () => T[]): OptionalProp<T[]> {\n return {\n type: Array as PropType<T[]>,\n default: defaultValue ?? (() => []),\n };\n}\n\nexport function booleanProp(defaultValue: boolean = false): OptionalProp<boolean> {\n return {\n type: Boolean,\n default: defaultValue,\n };\n}\n\nexport function componentRef<T>(): Ref<UnwrapNestedRefs<T> | undefined> {\n return ref<UnwrapNestedRefs<T>>();\n}\n\nexport function computedAsync<T>(getter: () => Promise<T>): Ref<T | undefined> {\n const result = ref<T>();\n const asyncValue = computed(getter);\n\n watch(asyncValue, async () => (result.value = await asyncValue.value), { immediate: true });\n\n return result;\n}\n\nexport function defineDirective(directive: Directive): Directive {\n return directive;\n}\n\nexport function enumProp<Enum extends Record<string, unknown>>(\n enumeration: Enum,\n defaultValue?: Enum[keyof Enum],\n): OptionalProp<Enum[keyof Enum]> {\n const values = Object.values(enumeration) as Enum[keyof Enum][];\n\n return {\n type: String as unknown as PropType<Enum[keyof Enum]>,\n default: defaultValue ?? values[0] ?? null,\n validator: (value) => values.includes(value as Enum[keyof Enum]),\n };\n}\n\nexport function injectReactive<T extends object>(key: InjectionKey<T> | string): UnwrapNestedRefs<T> | undefined {\n const value = inject(key);\n\n return value ? reactive<T>(value) : undefined;\n}\n\nexport function injectReactiveOrFail<T extends object>(\n key: InjectionKey<T> | string,\n errorMessage?: string,\n): UnwrapNestedRefs<T> {\n return injectReactive(key) ?? fail(errorMessage ?? `Could not resolve '${key}' injection key`);\n}\n\nexport function injectOrFail<T>(key: InjectionKey<T> | string, errorMessage?: string): T {\n return inject(key) ?? fail(errorMessage ?? `Could not resolve '${key}' injection key`);\n}\n\nexport function mixedProp<T>(type?: PropType<T>): OptionalProp<T | null> {\n return {\n type,\n default: null,\n };\n}\n\nexport function numberProp(): OptionalProp<number | null>;\nexport function numberProp(defaultValue: number): OptionalProp<number>;\nexport function numberProp(defaultValue: number | null = null): OptionalProp<number | null> {\n return {\n type: Number,\n default: defaultValue,\n };\n}\n\nexport function objectProp<T = Object>(): OptionalProp<T | null>;\nexport function objectProp<T>(defaultValue: () => T): OptionalProp<T>;\nexport function objectProp<T = Object>(defaultValue: (() => T) | null = null): OptionalProp<T | null> {\n return {\n type: Object,\n default: defaultValue,\n };\n}\n\nexport function requiredArrayProp<T>(): RequiredProp<T[]> {\n return {\n type: Array as PropType<T[]>,\n required: true,\n };\n}\n\nexport function requiredEnumProp<Enum extends Record<string, unknown>>(\n enumeration: Enum,\n): RequiredProp<Enum[keyof Enum]> {\n const values = Object.values(enumeration);\n\n return {\n type: String as unknown as PropType<Enum[keyof Enum]>,\n required: true,\n validator: (value) => values.includes(value),\n };\n}\n\nexport function requiredMixedProp<T>(type?: PropType<T>): RequiredProp<T> {\n return {\n type,\n required: true,\n };\n}\n\nexport function requiredNumberProp(): RequiredProp<number> {\n return {\n type: Number,\n required: true,\n };\n}\n\nexport function requiredObjectProp<T = Object>(): RequiredProp<T> {\n return {\n type: Object,\n required: true,\n };\n}\n\nexport function requiredStringProp(): RequiredProp<string> {\n return {\n type: String,\n required: true,\n };\n}\n\nexport function stringProp(): OptionalProp<string | null>;\nexport function stringProp(defaultValue: string): OptionalProp<string>;\nexport function stringProp(defaultValue: string | null = null): OptionalProp<string | null> {\n return {\n type: String,\n default: defaultValue,\n };\n}\n","import type { Directive } from 'vue';\n\nimport { definePlugin } from '@/plugins';\n\nimport initialFocus from './initial-focus';\nimport measure from './measure';\n\nconst builtInDirectives: Record<string, Directive> = {\n 'initial-focus': initialFocus,\n 'measure': measure,\n};\n\nexport * from './measure';\n\nexport default definePlugin({\n install(app, options) {\n const directives = {\n ...builtInDirectives,\n ...options.directives,\n };\n\n for (const [name, directive] of Object.entries(directives)) {\n app.directive(name, directive);\n }\n },\n});\n\ndeclare module '@/bootstrap/options' {\n export interface AerogelOptions {\n directives?: Record<string, Directive>;\n }\n}\n","import { defineDirective } from '@/utils/vue';\n\nexport default defineDirective({\n mounted(element: HTMLElement, { value }) {\n if (value === false) {\n return;\n }\n\n element.focus();\n },\n});\n","import { defineDirective } from '@/utils/vue';\n\nexport interface ElementSize {\n width: number;\n height: number;\n}\n\nexport type MeasureDirectiveListener = (size: ElementSize) => unknown;\n\nexport default defineDirective({\n mounted(element: HTMLElement, { value }) {\n const listener = typeof value === 'function' ? (value as MeasureDirectiveListener) : null;\n const sizes = element.getBoundingClientRect();\n\n // TODO guard with modifiers.css once typed properly\n element.style.setProperty('--width', `${sizes.width}px`);\n element.style.setProperty('--height', `${sizes.height}px`);\n\n listener?.({ width: sizes.width, height: sizes.height });\n },\n});\n","import { PromisedValue, facade, tap } from '@noeldemartin/utils';\n\nimport Service from '@/services/Service';\n\nexport class CacheService extends Service {\n\n private cache?: PromisedValue<Cache> = undefined;\n\n public async get(url: string): Promise<Response | null> {\n const cache = await this.open();\n const response = await cache.match(url);\n\n return response ?? null;\n }\n\n public async store(url: string, response: Response): Promise<void> {\n const cache = await this.open();\n\n await cache.put(url, response);\n }\n\n public async replace(url: string, response: Response): Promise<void> {\n const cache = await this.open();\n const keys = await cache.keys(url);\n\n if (keys.length === 0) {\n return;\n }\n\n await cache.put(url, response);\n }\n\n protected async open(): Promise<Cache> {\n return (this.cache =\n this.cache ??\n tap(new PromisedValue<Cache>(), (cache) => {\n caches.open('app').then((instance) => cache.resolve(instance));\n }));\n }\n\n}\n\nexport default facade(CacheService);\n","import type { App as VueApp } from 'vue';\n\nimport { definePlugin } from '@/plugins';\n\nimport App from './App';\nimport Cache from './Cache';\nimport Events from './Events';\nimport Service from './Service';\nimport { getPiniaStore } from './store';\n\nexport * from './App';\nexport * from './Cache';\nexport * from './Events';\nexport * from './Service';\nexport * from './store';\n\nexport { App, Cache, Events, Service };\n\nconst defaultServices = {\n $app: App,\n $events: Events,\n};\n\nexport type DefaultServices = typeof defaultServices;\n\nexport interface Services extends DefaultServices {}\n\nexport async function bootServices(app: VueApp, services: Record<string, Service>): Promise<void> {\n await Promise.all(\n Object.entries(services).map(async ([name, service]) => {\n await service\n .launch()\n .catch((error) => app.config.errorHandler?.(error, null, `Failed launching ${name}.`));\n }),\n );\n\n Object.assign(app.config.globalProperties, services);\n\n App.development && Object.assign(window, services);\n}\n\nexport default definePlugin({\n async install(app, options) {\n const services = {\n ...defaultServices,\n ...options.services,\n };\n\n app.use(getPiniaStore());\n\n await bootServices(app, services);\n },\n});\n\ndeclare module '@/bootstrap/options' {\n export interface AerogelOptions {\n services?: Record<string, Service>;\n }\n}\n\ndeclare module '@vue/runtime-core' {\n interface ComponentCustomProperties extends Services {}\n}\n","import type { Component } from 'vue';\n\nimport { defineServiceState } from '@/services/Service';\n\nexport interface Modal<T = unknown> {\n id: string;\n properties: Record<string, unknown>;\n component: Component;\n beforeClose: Promise<T | undefined>;\n afterClose: Promise<T | undefined>;\n}\n\nexport interface ModalComponent<\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n Properties extends Record<string, unknown> = Record<string, unknown>,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n Result = unknown\n> {}\n\nexport interface Snackbar {\n id: string;\n component: Component;\n properties: Record<string, unknown>;\n}\n\nexport default defineServiceState({\n name: 'ui',\n initialState: {\n modals: [] as Modal[],\n snackbars: [] as Snackbar[],\n },\n});\n","import { after, facade, fail, uuid } from '@noeldemartin/utils';\nimport { markRaw, nextTick } from 'vue';\nimport type { Component } from 'vue';\nimport type { ObjectValues } from '@noeldemartin/utils';\n\nimport Events from '@/services/Events';\nimport type { SnackbarAction, SnackbarColor } from '@/components/headless/snackbars';\nimport type { AGAlertModalProps, AGConfirmModalProps, AGLoadingModalProps, AGPromptModalProps } from '@/components';\n\nimport Service from './UI.state';\nimport type { Modal, ModalComponent, Snackbar } from './UI.state';\n\ninterface ModalCallbacks<T = unknown> {\n willClose(result: T | undefined): void;\n closed(result: T | undefined): void;\n}\n\ntype ModalProperties<TComponent> = TComponent extends ModalComponent<infer TProperties, unknown> ? TProperties : never;\ntype ModalResult<TComponent> = TComponent extends ModalComponent<Record<string, unknown>, infer TResult>\n ? TResult\n : never;\n\nexport const UIComponents = {\n AlertModal: 'alert-modal',\n ConfirmModal: 'confirm-modal',\n ErrorReportModal: 'error-report-modal',\n LoadingModal: 'loading-modal',\n PromptModal: 'prompt-modal',\n Snackbar: 'snackbar',\n StartupCrash: 'startup-crash',\n} as const;\n\nexport type UIComponent = ObjectValues<typeof UIComponents>;\n\nexport interface ConfirmOptions {\n acceptText?: string;\n cancelText?: string;\n}\n\nexport interface PromptOptions {\n label?: string;\n defaultValue?: string;\n placeholder?: string;\n acceptText?: string;\n cancelText?: string;\n trim?: boolean;\n}\n\nexport interface ShowSnackbarOptions {\n component?: Component;\n color?: SnackbarColor;\n actions?: SnackbarAction[];\n}\n\nexport class UIService extends Service {\n\n private modalCallbacks: Record<string, Partial<ModalCallbacks>> = {};\n private components: Partial<Record<UIComponent, Component>> = {};\n\n public requireComponent(name: UIComponent): Component {\n return this.components[name] ?? fail(`UI Component '${name}' is not defined!`);\n }\n\n public alert(message: string): void;\n public alert(title: string, message: string): void;\n public alert(messageOrTitle: string, message?: string): void {\n const getProperties = (): AGAlertModalProps => {\n if (typeof message !== 'string') {\n return { message: messageOrTitle };\n }\n\n return {\n title: messageOrTitle,\n message,\n };\n };\n\n this.openModal(this.requireComponent(UIComponents.AlertModal), getProperties());\n }\n\n public async confirm(message: string, options?: ConfirmOptions): Promise<boolean>;\n public async confirm(title: string, message: string, options?: ConfirmOptions): Promise<boolean>;\n public async confirm(\n messageOrTitle: string,\n messageOrOptions?: string | ConfirmOptions,\n options?: ConfirmOptions,\n ): Promise<boolean> {\n const getProperties = (): AGConfirmModalProps => {\n if (typeof messageOrOptions !== 'string') {\n return {\n message: messageOrTitle,\n ...(messageOrOptions ?? {}),\n };\n }\n\n return {\n title: messageOrTitle,\n message: messageOrOptions,\n ...(options ?? {}),\n };\n };\n\n const modal = await this.openModal<ModalComponent<AGConfirmModalProps, boolean>>(\n this.requireComponent(UIComponents.ConfirmModal),\n getProperties(),\n );\n const result = await modal.beforeClose;\n\n return result ?? false;\n }\n\n public async prompt(message: string, options?: PromptOptions): Promise<string | null>;\n public async prompt(title: string, message: string, options?: PromptOptions): Promise<string | null>;\n public async prompt(\n messageOrTitle: string,\n messageOrOptions?: string | PromptOptions,\n options?: PromptOptions,\n ): Promise<string | null> {\n const trim = options?.trim ?? true;\n const getProperties = (): AGPromptModalProps => {\n if (typeof messageOrOptions !== 'string') {\n return {\n message: messageOrTitle,\n ...(messageOrOptions ?? {}),\n };\n }\n\n return {\n title: messageOrTitle,\n message: messageOrOptions,\n ...(options ?? {}),\n };\n };\n\n const modal = await this.openModal<ModalComponent<AGPromptModalProps, string | null>>(\n this.requireComponent(UIComponents.PromptModal),\n getProperties(),\n );\n const rawResult = await modal.beforeClose;\n const result = trim ? rawResult?.trim() : rawResult;\n\n return result ?? null;\n }\n\n public async loading<T>(operation: Promise<T>): Promise<T>;\n public async loading<T>(message: string, operation: Promise<T>): Promise<T>;\n public async loading<T>(messageOrOperation: string | Promise<T>, operation?: Promise<T>): Promise<T> {\n const getProperties = (): AGLoadingModalProps => {\n if (typeof messageOrOperation !== 'string') {\n return {};\n }\n\n return { message: messageOrOperation };\n };\n\n const modal = await this.openModal(this.requireComponent(UIComponents.LoadingModal), getProperties());\n\n try {\n operation = typeof messageOrOperation === 'string' ? (operation as Promise<T>) : messageOrOperation;\n\n const [result] = await Promise.all([operation, after({ seconds: 1 })]);\n\n return result;\n } finally {\n await this.closeModal(modal.id);\n }\n }\n\n public showSnackbar(message: string, options: ShowSnackbarOptions = {}): void {\n const snackbar: Snackbar = {\n id: uuid(),\n properties: { message, ...options },\n component: markRaw(options.component ?? this.requireComponent(UIComponents.Snackbar)),\n };\n\n this.setState('snackbars', this.snackbars.concat(snackbar));\n\n setTimeout(() => this.hideSnackbar(snackbar.id), 5000);\n }\n\n public hideSnackbar(id: string): void {\n this.setState(\n 'snackbars',\n this.snackbars.filter((snackbar) => snackbar.id !== id),\n );\n }\n\n public registerComponent(name: UIComponent, component: Component): void {\n this.components[name] = component;\n }\n\n public async openModal<TModalComponent extends ModalComponent>(\n component: TModalComponent,\n properties?: ModalProperties<TModalComponent>,\n ): Promise<Modal<ModalResult<TModalComponent>>> {\n const id = uuid();\n const callbacks: Partial<ModalCallbacks<ModalResult<TModalComponent>>> = {};\n const modal: Modal<ModalResult<TModalComponent>> = {\n id,\n properties: properties ?? {},\n component: markRaw(component),\n beforeClose: new Promise((resolve) => (callbacks.willClose = resolve)),\n afterClose: new Promise((resolve) => (callbacks.closed = resolve)),\n };\n const activeModal = this.modals.at(-1);\n const modals = this.modals.concat(modal);\n\n this.modalCallbacks[modal.id] = callbacks;\n\n this.setState({ modals });\n\n await nextTick();\n await (activeModal && Events.emit('hide-modal', { id: activeModal.id }));\n await Promise.all([\n activeModal || Events.emit('show-overlays-backdrop'),\n Events.emit('show-modal', { id: modal.id }),\n ]);\n\n return modal;\n }\n\n public async closeModal(id: string, result?: unknown): Promise<void> {\n await Events.emit('close-modal', { id, result });\n }\n\n protected async boot(): Promise<void> {\n this.watchModalEvents();\n this.watchMountedEvent();\n }\n\n private watchModalEvents(): void {\n Events.on('modal-will-close', ({ modal, result }) => {\n this.modalCallbacks[modal.id]?.willClose?.(result);\n\n if (this.modals.length === 1) {\n Events.emit('hide-overlays-backdrop');\n }\n });\n\n Events.on('modal-closed', async ({ modal, result }) => {\n this.setState(\n 'modals',\n this.modals.filter((m) => m.id !== modal.id),\n );\n\n this.modalCallbacks[modal.id]?.closed?.(result);\n\n delete this.modalCallbacks[modal.id];\n\n const activeModal = this.modals.at(-1);\n\n await (activeModal && Events.emit('show-modal', { id: activeModal.id }));\n });\n }\n\n private watchMountedEvent(): void {\n Events.once('application-mounted', async () => {\n const splash = document.getElementById('splash');\n\n if (!splash) {\n return;\n }\n\n if (window.getComputedStyle(splash).opacity !== '0') {\n splash.style.opacity = '0';\n\n await after({ ms: 600 });\n }\n\n splash.remove();\n });\n }\n\n}\n\nexport default facade(UIService);\n\ndeclare module '@/services/Events' {\n export interface EventsPayload {\n 'close-modal': { id: string; result?: unknown };\n 'hide-modal': { id: string };\n 'hide-overlays-backdrop': void;\n 'modal-closed': { modal: Modal; result?: unknown };\n 'modal-will-close': { modal: Modal; result?: unknown };\n 'show-modal': { id: string };\n 'show-overlays-backdrop': void;\n }\n}\n","import { facade } from '@noeldemartin/utils';\n\nimport App from '@/services/App';\nimport Service from '@/services/Service';\n\nexport interface LangProvider {\n translate(key: string, parameters?: Record<string, unknown>): string;\n translateWithDefault(key: string, defaultMessage: string, parameters?: Record<string, unknown>): string;\n}\n\nexport class LangService extends Service {\n\n private provider: LangProvider;\n\n constructor() {\n super();\n\n this.provider = {\n translate: (key) => {\n // eslint-disable-next-line no-console\n App.development && console.warn('Lang provider is missing');\n\n return key;\n },\n translateWithDefault: (_, defaultMessage) => {\n // eslint-disable-next-line no-console\n App.development && console.warn('Lang provider is missing');\n\n return defaultMessage;\n },\n };\n }\n\n public setProvider(provider: LangProvider): void {\n this.provider = provider;\n }\n\n public translate(key: string, parameters?: Record<string, unknown>): string {\n return this.provider.translate(key, parameters) ?? key;\n }\n\n public translateWithDefault(key: string, defaultMessage: string, parameters: Record<string, unknown> = {}): string {\n return this.provider.translateWithDefault(key, defaultMessage, parameters);\n }\n\n}\n\nexport default facade(LangService);\n","import Lang from './Lang';\n\nexport const translate = Lang.translate.bind(Lang);\nexport const translateWithDefault = Lang.translateWithDefault.bind(Lang);\n","import type { JSError } from '@noeldemartin/utils';\n\nimport { defineServiceState } from '@/services';\n\nexport type ErrorSource = string | Error | JSError | unknown;\n\nexport interface ErrorReport {\n title: string;\n description?: string;\n details?: string;\n error?: Error | JSError | unknown;\n}\n\nexport interface ErrorReportLog {\n report: ErrorReport;\n seen: boolean;\n date: Date;\n}\n\nexport default defineServiceState({\n name: 'errors',\n initialState: {\n logs: [] as ErrorReportLog[],\n startupErrors: [] as ErrorReport[],\n },\n computed: {\n hasErrors: ({ logs }) => logs.length > 0,\n hasNewErrors: ({ logs }) => logs.some((error) => !error.seen),\n hasStartupErrors: ({ startupErrors }) => startupErrors.length > 0,\n },\n});\n","export const Colors = {\n Primary: 'primary',\n Secondary: 'secondary',\n Danger: 'danger',\n Clear: 'clear',\n} as const;\n\nexport type Color = (typeof Colors)[keyof typeof Colors];\n","import { JSError, facade, isObject, objectWithoutEmpty, toString } from '@noeldemartin/utils';\n\nimport App from '@/services/App';\nimport ServiceBootError from '@/errors/ServiceBootError';\nimport UI, { UIComponents } from '@/ui/UI';\nimport { translateWithDefault } from '@/lang/utils';\n\nimport Service from './Errors.state';\nimport { Colors } from '@/components/constants';\nimport { Events } from '@/services';\nimport type { AGErrorReportModalProps } from '@/components/modals/AGErrorReportModal';\nimport type { ErrorReport, ErrorReportLog, ErrorSource } from './Errors.state';\nimport type { ModalComponent } from '@/ui/UI.state';\n\nexport class ErrorsService extends Service {\n\n public forceReporting: boolean = false;\n private enabled: boolean = true;\n\n public enable(): void {\n this.enabled = true;\n }\n\n public disable(): void {\n this.enabled = false;\n }\n\n public async inspect(error: ErrorSource | ErrorReport[]): Promise<void> {\n const reports = Array.isArray(error) ? (error as ErrorReport[]) : [await this.createErrorReport(error)];\n\n if (reports.length === 0) {\n UI.alert(translateWithDefault('errors.inspectEmpty', 'Nothing to inspect!'));\n\n return;\n }\n\n UI.openModal<ModalComponent<AGErrorReportModalProps>>(UI.requireComponent(UIComponents.ErrorReportModal), {\n reports,\n });\n }\n\n public async report(error: ErrorSource, message?: string): Promise<void> {\n await Events.emit('error', { error, message });\n\n if (App.testing) {\n throw error;\n }\n\n if (App.development) {\n this.logError(error);\n }\n\n if (!this.enabled) {\n throw error;\n }\n\n if (!App.isMounted()) {\n const startupError = await this.createStartupErrorReport(error);\n\n if (startupError) {\n this.setState({ startupErrors: this.startupErrors.concat(startupError) });\n }\n\n return;\n }\n\n const report = await this.createErrorReport(error);\n const log: ErrorReportLog = {\n report,\n seen: false,\n date: new Date(),\n };\n\n UI.showSnackbar(\n message ??\n translateWithDefault('errors.notice', 'Something went wrong, but it\\'s not your fault. Try again!'),\n {\n color: Colors.Danger,\n actions: [\n {\n text: translateWithDefault('errors.viewDetails', 'View details'),\n dismiss: true,\n handler: () =>\n UI.openModal<ModalComponent<AGErrorReportModalProps>>(\n UI.requireComponent(UIComponents.ErrorReportModal),\n { reports: [report] },\n ),\n },\n ],\n },\n );\n\n this.setState({ logs: [log].concat(this.logs) });\n }\n\n public see(report: ErrorReport): void {\n this.setState({\n logs: this.logs.map((log) => {\n if (log.report !== report) {\n return log;\n }\n\n return {\n ...log,\n seen: true,\n };\n }),\n });\n }\n\n public seeAll(): void {\n this.setState({\n logs: this.logs.map((log) => ({\n ...log,\n seen: true,\n })),\n });\n }\n\n private logError(error: unknown): void {\n // eslint-disable-next-line no-console\n console.error(error);\n\n if (isObject(error) && error.cause) {\n this.logError(error.cause);\n }\n }\n\n private async createErrorReport(error: ErrorSource): Promise<ErrorReport> {\n if (typeof error === 'string') {\n return { title: error };\n }\n\n if (error instanceof Error || error instanceof JSError) {\n return this.createErrorReportFromError(error);\n }\n\n if (isObject(error)) {\n return objectWithoutEmpty({\n title: toString(\n error['name'] ?? error['title'] ?? translateWithDefault('errors.unknown', 'Unknown Error'),\n ),\n description: toString(\n error['message'] ??\n error['description'] ??\n translateWithDefault('errors.unknownDescription', 'Unknown error object'),\n ),\n error,\n });\n }\n\n return {\n title: translateWithDefault('errors.unknown', 'Unknown Error'),\n error,\n };\n }\n\n private async createStartupErrorReport(error: ErrorSource): Promise<ErrorReport | null> {\n if (error instanceof ServiceBootError) {\n // Ignore second-order boot errors in order to have a cleaner startup crash screen.\n return error.cause instanceof ServiceBootError ? null : this.createErrorReport(error.cause);\n }\n\n return this.createErrorReport(error);\n }\n\n private createErrorReportFromError(error: Error | JSError, defaults: Partial<ErrorReport> = {}): ErrorReport {\n return {\n title: error.name,\n description: error.message,\n details: error.stack,\n error,\n ...defaults,\n };\n }\n\n}\n\nexport default facade(ErrorsService);\n\ndeclare module '@/services/Events' {\n export interface EventsPayload {\n error: { error: ErrorSource; message?: string };\n }\n}\n","import { JSError, isObject, toString } from '@noeldemartin/utils';\nimport { translateWithDefault } from '@/lang/utils';\nimport type { ErrorSource } from './Errors.state';\n\nexport function getErrorMessage(error: ErrorSource): string {\n if (typeof error === 'string') {\n return error;\n }\n\n if (error instanceof Error || error instanceof JSError) {\n return error.message;\n }\n\n if (isObject(error)) {\n return toString(error['message'] ?? error['description'] ?? 'Unknown error object');\n }\n\n return translateWithDefault('errors.unknown', 'Unknown Error');\n}\n","import type { App } from 'vue';\n\nimport { bootServices } from '@/services';\nimport { definePlugin } from '@/plugins';\n\nimport Errors from './Errors';\nimport { ErrorReport, ErrorReportLog, ErrorSource } from './Errors.state';\n\nexport * from './utils';\nexport { Errors, ErrorSource, ErrorReport, ErrorReportLog };\n\nconst services = { $errors: Errors };\nconst frameworkHandler: ErrorHandler = (error) => {\n Errors.report(error);\n\n return true;\n};\n\nfunction setUpErrorHandler(app: App, baseHandler: ErrorHandler = () => false): void {\n const errorHandler: ErrorHandler = (error) => baseHandler(error) || frameworkHandler(error);\n\n app.config.errorHandler = errorHandler;\n globalThis.onerror = (event, _, __, ___, error) => errorHandler(error ?? event);\n globalThis.onunhandledrejection = (event) => errorHandler(event.reason);\n}\n\nexport type ErrorHandler = (error: ErrorSource) => boolean;\nexport type ErrorsServices = typeof services;\n\nexport default definePlugin({\n async install(app, options) {\n setUpErrorHandler(app, options.handleError);\n\n await bootServices(app, services);\n },\n});\n\ndeclare module '@/bootstrap/options' {\n export interface AerogelOptions {\n handleError?(error: ErrorSource): boolean;\n }\n}\n\ndeclare module '@/services' {\n export interface Services extends ErrorsServices {}\n}\n","import { bootServices } from '@/services';\nimport { definePlugin } from '@/plugins';\n\nimport Lang, { LangProvider } from './Lang';\nimport { translate, translateWithDefault } from './utils';\n\nexport { Lang, LangProvider, translate, translateWithDefault };\n\nconst services = { $lang: Lang };\n\nexport type LangServices = typeof services;\n\nexport default definePlugin({\n async install(app) {\n app.config.globalProperties.$t ??= translate;\n app.config.globalProperties.$td = translateWithDefault;\n\n await bootServices(app, services);\n },\n});\n\ndeclare module '@/services' {\n export interface Services extends LangServices {}\n}\n\ndeclare module '@vue/runtime-core' {\n interface ComponentCustomProperties {\n $td: typeof translateWithDefault;\n }\n}\n","import type { GetClosureArgs } from '@noeldemartin/utils';\n\nimport Events from '@/services/Events';\nimport { definePlugin } from '@/plugins';\n\nexport interface AerogelTestingRuntime {\n on: (typeof Events)['on'];\n}\n\nexport default definePlugin({\n async install() {\n if (import.meta.env.MODE !== 'testing') {\n return;\n }\n\n globalThis.testingRuntime = {\n on: ((...args: GetClosureArgs<(typeof Events)['on']>) => Events.on(...args)) as (typeof Events)['on'],\n };\n },\n});\n\ndeclare global {\n // eslint-disable-next-line no-var\n var testingRuntime: AerogelTestingRuntime | undefined;\n}\n","import { onUnmounted } from 'vue';\n\nimport Events from '@/services/Events';\nimport type {\n EventListener,\n EventWithPayload,\n EventWithoutPayload,\n EventsPayload,\n UnknownEvent,\n} from '@/services/Events';\n\nexport function useEvent<Event extends EventWithoutPayload>(event: Event, listener: () => unknown): void;\nexport function useEvent<Event extends EventWithPayload>(\n event: Event,\n listener: EventListener<EventsPayload[Event]>\n): void;\nexport function useEvent<Payload>(event: string, listener: (payload: Payload) => unknown): void;\nexport function useEvent<Event extends string>(event: UnknownEvent<Event>, listener: EventListener): void;\n\nexport function useEvent(event: string, listener: EventListener): void {\n const unsubscribe = Events.on(event, listener);\n\n onUnmounted(() => unsubscribe());\n}\n","import { objectWithout } from '@noeldemartin/utils';\nimport { computed, useAttrs } from 'vue';\nimport type { ComputedRef } from 'vue';\n\nexport function useInputAttrs(): [ComputedRef<{}>, ComputedRef<unknown>] {\n const attrs = useAttrs();\n const className = computed(() => attrs.class);\n const inputAttrs = computed(() => objectWithout(attrs, 'class'));\n\n return [inputAttrs, className];\n}\n","import { noop } from '@noeldemartin/utils';\nimport { onMounted, onUnmounted } from 'vue';\n\nexport function onCleanMounted(operation: () => Function): void {\n let cleanUp: Function = noop;\n\n onMounted(() => (cleanUp = operation()));\n onUnmounted(() => cleanUp());\n}\n","export function removeInteractiveClasses(classes: string): string {\n return classes\n .split(/\\s+/)\n .filter((className) => !/^(hover|focus|focus-visible):/.test(className))\n .join(' ')\n .trim();\n}\n","export function extractComponentProps<T extends Record<string, unknown>>(\n values: Record<string, unknown>,\n definitions: Record<string, unknown>,\n): T {\n return Object.keys(definitions).reduce((extracted, prop) => {\n extracted[prop] = values[prop];\n\n return extracted;\n }, {} as Record<string, unknown>) as T;\n}\n","import { computed } from 'vue';\nimport type { ExtractPropTypes, Ref } from 'vue';\n\nimport { booleanProp, stringProp } from '@/utils';\nimport { extractComponentProps } from '@/components/utils';\nimport type { IAGModal } from '@/components/modals/AGModal';\n\nexport interface IAGHeadlessModal extends IAGModal {}\n\nexport interface IAGHeadlessModalDefaultSlotProps {\n close(result?: unknown): Promise<void>;\n}\n\nexport const modalProps = {\n cancellable: booleanProp(true),\n title: stringProp(),\n};\n\nexport function useModalProps(): typeof modalProps {\n return modalProps;\n}\n\nexport function extractModalProps<T extends ExtractPropTypes<typeof modalProps>>(\n props: T,\n): Pick<T, keyof typeof modalProps> {\n return extractComponentProps(props, modalProps);\n}\n\nexport function useModalExpose($modal: Ref<IAGHeadlessModal | undefined>): IAGModal {\n return {\n close: async () => $modal.value?.close(),\n cancellable: computed(() => !!$modal.value?.cancellable),\n };\n}\n","<template>\n <Dialog ref=\"$root\" :open=\"true\" @close=\"cancellable && close()\">\n <slot :close=\"close\" />\n </Dialog>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, toRef } from 'vue';\nimport { Dialog } from '@headlessui/vue';\nimport type { VNode } from 'vue';\n\nimport Events from '@/services/Events';\nimport { useEvent } from '@/utils/composition/events';\nimport { injectReactiveOrFail } from '@/utils/vue';\nimport type { IAGModalContext } from '@/components/modals/AGModalContext';\n\nimport { useModalProps } from './AGHeadlessModal';\nimport type { IAGHeadlessModal, IAGHeadlessModalDefaultSlotProps } from './AGHeadlessModal';\n\nconst props = defineProps(useModalProps());\nconst $root = ref<{ $el?: HTMLElement } | null>(null);\nconst hidden = ref(true);\nconst closed = ref(false);\nconst { modal } = injectReactiveOrFail<IAGModalContext>(\n 'modal',\n 'could not obtain modal reference from <AGHeadlessModal>, ' +\n 'did you render this component manually? Show it using $ui.openModal() instead',\n);\n\nasync function hide(): Promise<void> {\n if (!$root.value?.$el) {\n return;\n }\n\n hidden.value = true;\n}\n\nasync function show(): Promise<void> {\n if (!$root.value?.$el) {\n return;\n }\n\n hidden.value = false;\n}\n\nasync function close(result?: unknown) {\n if (closed.value) {\n return;\n }\n\n Events.emit('modal-will-close', { modal, result });\n\n await hide();\n\n closed.value = true;\n\n Events.emit('modal-closed', { modal, result });\n}\n\nuseEvent('close-modal', async ({ id, result }) => {\n if (id !== modal.id) {\n return;\n }\n\n await close(result);\n});\n\nuseEvent('hide-modal', async ({ id }) => {\n if (id !== modal.id) {\n return;\n }\n\n await hide();\n});\n\nuseEvent('show-modal', async ({ id }) => {\n if (id !== modal.id) {\n return;\n }\n\n await show();\n});\n\ndefineSlots<{ default(props: IAGHeadlessModalDefaultSlotProps): VNode[] }>();\ndefineExpose<IAGHeadlessModal>({ close, cancellable: toRef(props, 'cancellable') });\n</script>\n","<template>\n <component :is=\"modal.component\" v-bind=\"modal.properties\" />\n</template>\n\n<script setup lang=\"ts\">\nimport { provide, toRef } from 'vue';\n\nimport { requiredNumberProp, requiredObjectProp } from '@/utils/vue';\nimport type { Modal } from '@/ui/UI.state';\n\nimport type { IAGModalContext } from './AGModalContext';\n\nconst props = defineProps({\n modal: requiredObjectProp<Modal>(),\n childIndex: requiredNumberProp(),\n});\n\nprovide<IAGModalContext>('modal', {\n modal: toRef(props, 'modal'),\n childIndex: toRef(props, 'childIndex'),\n});\n</script>\n","<template>\n <DialogPanel>\n <slot />\n\n <template v-if=\"childModal\">\n <div class=\"pointer-events-none fixed inset-0 z-50 bg-black/30\" />\n <AGModalContext :child-index=\"modal.childIndex + 1\" :modal=\"childModal\" />\n </template>\n </DialogPanel>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { DialogPanel } from '@headlessui/vue';\n\nimport UI from '@/ui/UI';\nimport { injectReactiveOrFail } from '@/utils/vue';\nimport type { IAGModalContext } from '@/components/modals/AGModalContext';\n\nimport AGModalContext from '../../modals/AGModalContext.vue';\n\nconst modal = injectReactiveOrFail<IAGModalContext>(\n 'modal',\n 'could not obtain modal reference from <AGHeadlessModalPanel>, ' +\n 'did you render this component manually? Show it using $ui.openModal() instead',\n);\nconst childModal = computed(() => UI.modals[modal.childIndex] ?? null);\n</script>\n","import { tap } from '@noeldemartin/utils';\nimport DOMPurify from 'dompurify';\nimport { Renderer, marked } from 'marked';\n\nfunction makeRenderer(): Renderer {\n return tap(new Renderer(), (renderer) => {\n renderer.link = function(href, title, text) {\n return Renderer.prototype.link.apply(this, [href, title, text]).replace('<a', '<a target=\"_blank\"');\n };\n });\n}\n\nexport function renderMarkdown(markdown: string): string {\n return safeHtml(marked(markdown, { mangle: false, headerIds: false, renderer: makeRenderer() }));\n}\n\nexport function safeHtml(html: string): string {\n // TODO improve target=\"_blank\" exception\n // See https://github.com/cure53/DOMPurify/issues/317\n return DOMPurify.sanitize(html, { ADD_ATTR: ['target'] });\n}\n","<template>\n <root />\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, h, useAttrs } from 'vue';\n\nimport { renderMarkdown } from '@/utils/markdown';\nimport { booleanProp, objectProp, stringProp } from '@/utils/vue';\nimport { translate } from '@/lang';\n\nconst props = defineProps({\n as: stringProp(),\n inline: booleanProp(),\n langKey: stringProp(),\n langParams: objectProp<Record<string, unknown>>(),\n text: stringProp(),\n});\n\nconst attrs = useAttrs();\nconst markdown = computed(() => props.text ?? (props.langKey && translate(props.langKey, props.langParams ?? {})));\nconst html = computed(() => {\n if (!markdown.value) {\n return null;\n }\n\n let renderedHtml = renderMarkdown(markdown.value);\n\n if (props.inline) {\n renderedHtml = renderedHtml.replace('<p>', '<span>').replace('</p>', '</span>');\n }\n\n return renderedHtml;\n});\nconst root = () =>\n h(props.as ?? (props.inline ? 'span' : 'div'), {\n innerHTML: html.value,\n ...attrs,\n class: `${attrs.class ?? ''} ${props.inline ? '' : 'prose'}`,\n });\n</script>\n","<template>\n <AGHeadlessModal\n ref=\"$modal\"\n v-slot=\"{ close }: IAGHeadlessModalDefaultSlotProps\"\n v-bind=\"props\"\n class=\"relative z-50\"\n >\n <div class=\"fixed inset-0 flex items-center justify-center p-8\">\n <AGHeadlessModalPanel class=\"flex max-h-full max-w-full flex-col overflow-hidden bg-white p-4\">\n <AGHeadlessModalTitle v-if=\"title\" class=\"mb-2 text-lg font-semibold\">\n <AGMarkdown :text=\"title\" inline />\n </AGHeadlessModalTitle>\n <div class=\"flex max-h-full flex-col overflow-auto\" v-bind=\"$attrs\">\n <slot :close=\"close\" />\n </div>\n </AGHeadlessModalPanel>\n </div>\n </AGHeadlessModal>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref } from 'vue';\n\nimport { useModalExpose, useModalProps } from '@/components/headless/modals/AGHeadlessModal';\nimport type { IAGHeadlessModal, IAGHeadlessModalDefaultSlotProps } from '@/components/headless/modals/AGHeadlessModal';\n\nimport type { IAGModal } from './AGModal';\n\nimport AGHeadlessModal from '../headless/modals/AGHeadlessModal.vue';\nimport AGHeadlessModalPanel from '../headless/modals/AGHeadlessModalPanel.vue';\nimport AGHeadlessModalTitle from '../headless/modals/AGHeadlessModalTitle.vue';\nimport AGMarkdown from '../lib/AGMarkdown.vue';\n\nconst props = defineProps(useModalProps());\nconst $modal = ref<IAGHeadlessModal>();\n\ndefineOptions({ inheritAttrs: false });\ndefineExpose<IAGModal>(useModalExpose($modal));\n</script>\n","import type { ExtractPropTypes } from 'vue';\nimport type { ObjectWithoutEmpty } from '@noeldemartin/utils';\n\nimport { requiredStringProp, stringProp } from '@/utils';\n\nexport const alertModalProps = {\n title: stringProp(),\n message: requiredStringProp(),\n};\n\nexport type AGAlertModalProps = ObjectWithoutEmpty<ExtractPropTypes<typeof alertModalProps>>;\n\nexport function useAlertModalProps(): typeof alertModalProps {\n return alertModalProps;\n}\n","import { computed } from 'vue';\nimport type { ExtractPropTypes } from 'vue';\nimport type { ObjectWithoutEmpty } from '@noeldemartin/utils';\n\nimport { requiredStringProp, stringProp } from '@/utils';\nimport { translateWithDefault } from '@/lang';\n\nexport const confirmModalProps = {\n title: stringProp(),\n message: requiredStringProp(),\n acceptText: stringProp(),\n cancelText: stringProp(),\n};\n\nexport type AGConfirmModalProps = ObjectWithoutEmpty<ExtractPropTypes<typeof confirmModalProps>>;\n\nexport function useConfirmModalProps(): typeof confirmModalProps {\n return confirmModalProps;\n}\n\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\nexport function useConfirmModal(props: ExtractPropTypes<typeof confirmModalProps>) {\n const renderedAcceptText = computed(() => props.acceptText ?? translateWithDefault('ui.accept', 'Ok'));\n const renderedCancelText = computed(() => props.cancelText ?? translateWithDefault('ui.cancel', 'Cancel'));\n\n return { renderedAcceptText, renderedCancelText };\n}\n","<template>\n <component :is=\"component.as\" v-bind=\"component.props\">\n <slot />\n </component>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { objectWithoutEmpty } from '@noeldemartin/utils';\n\nimport { booleanProp, objectProp, stringProp } from '@/utils/vue';\n\nconst props = defineProps({\n as: objectProp(),\n href: stringProp(),\n url: stringProp(),\n route: stringProp(),\n routeParams: objectProp(() => ({})),\n routeQuery: objectProp(() => ({})),\n submit: booleanProp(),\n});\n\nconst component = computed(() => {\n if (props.as) {\n return { as: props.as, props: {} };\n }\n\n if (props.route) {\n return {\n as: 'router-link',\n props: {\n to: objectWithoutEmpty({\n name: props.route,\n params: props.routeParams,\n query: props.routeQuery,\n }),\n },\n };\n }\n\n if (props.href || props.url) {\n return {\n as: 'a',\n props: {\n target: '_blank',\n href: props.href || props.url,\n },\n };\n }\n\n return {\n as: 'button',\n props: { type: props.submit ? 'submit' : 'button' },\n };\n});\n</script>\n","<template>\n <AGHeadlessButton class=\"px-2.5 py-1.5 focus-visible:outline focus-visible:outline-2\" :class=\"colorClasses\">\n <slot />\n </AGHeadlessButton>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\n\nimport { enumProp } from '@/utils/vue';\nimport { Colors } from '@/components/constants';\n\nimport AGHeadlessButton from '../headless/forms/AGHeadlessButton.vue';\n\nconst props = defineProps({\n color: enumProp(Colors, Colors.Primary),\n});\n\nconst colorClasses = computed(() => {\n switch (props.color) {\n case Colors.Secondary:\n return [\n 'text-white bg-gray-600',\n 'hover:bg-gray-500',\n 'focus-visible:outline-offset-2 focus-visible:outline-gray-600',\n ].join(' ');\n case Colors.Clear:\n return 'hover:bg-gray-500/20 focus-visible:outline-gray-500/60';\n case Colors.Danger:\n return [\n 'text-white bg-red-600',\n 'hover:bg-red-500',\n 'focus-visible:outline-offset-2 focus-visible:outline-red-600',\n ].join(' ');\n case Colors.Primary:\n default:\n return [\n 'text-white bg-indigo-600',\n 'hover:bg-indigo-500',\n 'focus-visible:outline-offset-2 focus-visible:outline-indigo-600',\n ].join(' ');\n }\n});\n</script>\n","<template>\n <AGModal v-slot=\"{ close }: IAGModalDefaultSlotProps\" :cancellable=\"false\" :title=\"title\">\n <AGMarkdown :text=\"message\" />\n\n <div class=\"mt-2 flex flex-row-reverse gap-2\">\n <AGButton @click=\"close(true)\">\n {{ renderedAcceptText }}\n </AGButton>\n <AGButton color=\"secondary\" @click=\"close()\">\n {{ renderedCancelText }}\n </AGButton>\n </div>\n </AGModal>\n</template>\n\n<script setup lang=\"ts\">\nimport AGModal from './AGModal.vue';\nimport { useConfirmModal, useConfirmModalProps } from './AGConfirmModal';\nimport type { IAGModalDefaultSlotProps } from './AGModal';\n\nimport AGButton from '../forms/AGButton.vue';\nimport AGMarkdown from '../lib/AGMarkdown.vue';\n\nconst props = defineProps(useConfirmModalProps());\nconst { renderedAcceptText, renderedCancelText } = useConfirmModal(props);\n</script>\n","import { computed, ref } from 'vue';\nimport type { Component, ExtractPropTypes } from 'vue';\nimport type { ObjectWithoutEmpty } from '@noeldemartin/utils';\n\nimport { requiredArrayProp } from '@/utils/vue';\nimport { translateWithDefault } from '@/lang';\nimport type { ErrorReport } from '@/errors';\n\nexport interface IAGErrorReportModalButtonsDefaultSlotProps {\n id: string;\n description: string;\n iconComponent: Component;\n url?: string;\n handler?(): void;\n}\n\nexport const errorReportModalProps = {\n reports: requiredArrayProp<ErrorReport>(),\n};\n\nexport type AGErrorReportModalProps = ObjectWithoutEmpty<ExtractPropTypes<typeof errorReportModalProps>>;\n\nexport function useErrorReportModalProps(): typeof errorReportModalProps {\n return errorReportModalProps;\n}\n\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\nexport function useErrorReportModal(props: ExtractPropTypes<typeof errorReportModalProps>) {\n const activeReportIndex = ref(0);\n const report = computed(() => props.reports[activeReportIndex.value] as ErrorReport);\n const details = computed(\n () =>\n report.value.details?.trim() ||\n translateWithDefault('errors.detailsEmpty', 'This error is missing a stacktrace.'),\n );\n const previousReportText = translateWithDefault('errors.previousReport', 'Show previous report');\n const nextReportText = translateWithDefault('errors.nextReport', 'Show next report');\n\n return {\n activeReportIndex,\n details,\n nextReportText,\n previousReportText,\n report,\n };\n}\n","<template>\n <div class=\"flex\">\n <slot v-for=\"(button, i) of buttons\" v-bind=\"(button as unknown as ComponentProps)\" :key=\"i\">\n <AGButton\n color=\"clear\"\n :url=\"button.url\"\n :title=\"$td(`errors.report_${button.id}`, button.description)\"\n :aria-label=\"$td(`errors.report_${button.id}`, button.description)\"\n @click=\"button.handler\"\n >\n <component :is=\"button.iconComponent\" class=\"h-4 w-4\" aria-hidden=\"true\" />\n </AGButton>\n </slot>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport IconConsole from '~icons/mdi/console';\nimport IconCopy from '~icons/zondicons/copy';\nimport IconGitHub from '~icons/mdi/github';\n\nimport { computed } from 'vue';\nimport { stringExcerpt, tap } from '@noeldemartin/utils';\n\nimport App from '@/services/App';\nimport UI from '@/ui/UI';\nimport { requiredObjectProp } from '@/utils/vue';\nimport { translateWithDefault } from '@/lang/utils';\nimport type { ComponentProps } from '@/utils/vue';\nimport type { ErrorReport } from '@/errors';\n\nimport AGButton from '../forms/AGButton.vue';\nimport type { IAGErrorReportModalButtonsDefaultSlotProps } from './AGErrorReportModal';\n\nconst props = defineProps({\n report: requiredObjectProp<ErrorReport>(),\n});\nconst summary = computed(() =>\n props.report.description ? `${props.report.title}: ${props.report.description}` : props.report.title);\nconst githubReportUrl = computed(() => {\n if (!App.sourceUrl) {\n return false;\n }\n\n const issueTitle = encodeURIComponent(summary.value);\n const issueBody = encodeURIComponent(\n [\n '[Please, explain here what you were trying to do when this error appeared]',\n '',\n 'Error details:',\n '```',\n stringExcerpt(\n props.report.details ?? 'Details missing from report',\n 1800 - issueTitle.length - App.sourceUrl.length,\n ).trim(),\n '```',\n ].join('\\n'),\n );\n\n return `${App.sourceUrl}/issues/new?title=${issueTitle}&body=${issueBody}`;\n});\nconst buttons = computed(() =>\n tap(\n [\n {\n id: 'clipboard',\n description: 'Copy to clipboard',\n iconComponent: IconCopy,\n async handler() {\n await navigator.clipboard.writeText(`${summary.value}\\n\\n${props.report.details}`);\n\n UI.showSnackbar(\n translateWithDefault('errors.copiedToClipboard', 'Debug information copied to clipboard'),\n );\n },\n },\n {\n id: 'console',\n description: 'Log to console',\n iconComponent: IconConsole,\n handler() {\n const error = props.report.error ?? props.report;\n\n (window as { error?: unknown }).error = error;\n\n // eslint-disable-next-line no-console\n console.error(error);\n\n UI.showSnackbar(\n translateWithDefault(\n 'errors.addedToConsole',\n 'You can now use the **error** variable in the console',\n ),\n );\n },\n },\n ],\n (reportButtons: IAGErrorReportModalButtonsDefaultSlotProps[]) => {\n if (!githubReportUrl.value) {\n return;\n }\n\n reportButtons.push({\n id: 'github',\n description: 'Report in GitHub',\n iconComponent: IconGitHub,\n url: githubReportUrl.value,\n });\n },\n ));\n</script>\n","<template>\n <AGMarkdown :text=\"text\" inline />\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\n\nimport { numberProp, requiredObjectProp } from '@/utils/vue';\nimport type { ErrorReport } from '@/errors';\n\nimport AGMarkdown from '../lib/AGMarkdown.vue';\n\nconst props = defineProps({\n report: requiredObjectProp<ErrorReport>(),\n currentReport: numberProp(),\n totalReports: numberProp(),\n});\nconst text = computed(() => {\n if (!props.totalReports || props.totalReports <= 1) {\n return props.report.title;\n }\n\n return `${props.report.title} (${props.currentReport}/${props.totalReports})`;\n});\n</script>\n","<template>\n <AGModal>\n <div>\n <h2 class=\"flex items-center justify-between text-lg font-medium\">\n <div class=\"flex items-center\">\n <AGErrorReportModalTitle\n :report=\"report\"\n :current-report=\"activeReportIndex + 1\"\n :total-reports=\"reports.length\"\n />\n <template v-if=\"reports.length > 1\">\n <AGButton\n color=\"clear\"\n :disabled=\"activeReportIndex === 0\"\n :title=\"previousReportText\"\n :aria-label=\"previousReportText\"\n @click=\"activeReportIndex--\"\n >\n <IconCheveronLeft aria-hidden=\"true\" class=\"h-4 w-4\" />\n </AGButton>\n <AGButton\n color=\"clear\"\n :disabled=\"activeReportIndex === reports.length - 1\"\n :title=\"nextReportText\"\n :aria-label=\"nextReportText\"\n @click=\"activeReportIndex++\"\n >\n <IconCheveronRight aria-hidden=\"true\" class=\"h-4 w-4\" />\n </AGButton>\n </template>\n </div>\n <AGErrorReportModalButtons :report=\"report\" />\n </h2>\n <AGMarkdown v-if=\"report.description\" :text=\"report.description\" class=\"mt-2\" />\n </div>\n <pre class=\"h-full overflow-auto bg-gray-200 p-4 text-xs text-red-900\" v-text=\"details\" />\n </AGModal>\n</template>\n\n<script setup lang=\"ts\">\nimport IconCheveronRight from '~icons/zondicons/cheveron-right';\nimport IconCheveronLeft from '~icons/zondicons/cheveron-left';\n\nimport { useErrorReportModal, useErrorReportModalProps } from './AGErrorReportModal';\n\nimport AGButton from '../forms/AGButton.vue';\nimport AGErrorReportModalButtons from './AGErrorReportModalButtons.vue';\nimport AGErrorReportModalTitle from './AGErrorReportModalTitle.vue';\nimport AGMarkdown from '../lib/AGMarkdown.vue';\nimport AGModal from './AGModal.vue';\n\nconst props = defineProps(useErrorReportModalProps());\nconst { activeReportIndex, details, nextReportText, previousReportText, report } = useErrorReportModal(props);\n</script>\n","import { computed } from 'vue';\nimport type { ExtractPropTypes } from 'vue';\nimport type { ObjectWithoutEmpty } from '@noeldemartin/utils';\n\nimport { stringProp } from '@/utils';\nimport { translateWithDefault } from '@/lang';\n\nexport const loadingModalProps = {\n message: stringProp(),\n};\n\nexport type AGLoadingModalProps = ObjectWithoutEmpty<ExtractPropTypes<typeof loadingModalProps>>;\n\nexport function useLoadingModalProps(): typeof loadingModalProps {\n return loadingModalProps;\n}\n\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\nexport function useLoadingModal(props: ExtractPropTypes<typeof loadingModalProps>) {\n const renderedMessage = computed(() => props.message ?? translateWithDefault('ui.loading', 'Loading...'));\n\n return { renderedMessage };\n}\n","<template>\n <AGModal :cancellable=\"false\">\n <AGMarkdown :text=\"renderedMessage\" />\n </AGModal>\n</template>\n\n<script setup lang=\"ts\">\nimport AGModal from './AGModal.vue';\nimport { useLoadingModal, useLoadingModalProps } from './AGLoadingModal';\n\nimport AGMarkdown from '../lib/AGMarkdown.vue';\n\nconst props = defineProps(useLoadingModalProps());\nconst { renderedMessage } = useLoadingModal(props);\n</script>\n","import { computed } from 'vue';\nimport type { ExtractPropTypes } from 'vue';\nimport type { ObjectWithoutEmpty } from '@noeldemartin/utils';\n\nimport { requiredStringProp, stringProp } from '@/utils';\nimport { translateWithDefault } from '@/lang';\n\nexport const promptModalProps = {\n title: stringProp(),\n message: requiredStringProp(),\n label: stringProp(),\n defaultValue: stringProp(),\n placeholder: stringProp(),\n acceptText: stringProp(),\n cancelText: stringProp(),\n};\n\nexport type AGPromptModalProps = ObjectWithoutEmpty<ExtractPropTypes<typeof promptModalProps>>;\n\nexport function usePromptModalProps(): typeof promptModalProps {\n return promptModalProps;\n}\n\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\nexport function usePromptModal(props: ExtractPropTypes<typeof promptModalProps>) {\n const renderedAcceptText = computed(() => props.acceptText ?? translateWithDefault('ui.accept', 'Ok'));\n const renderedCancelText = computed(() => props.cancelText ?? translateWithDefault('ui.cancel', 'Cancel'));\n\n return { renderedAcceptText, renderedCancelText };\n}\n","<template>\n <form @submit.prevent=\"form?.submit()\">\n <slot />\n </form>\n</template>\n\n<script setup lang=\"ts\">\nimport { provide, watchEffect } from 'vue';\n\nimport { objectProp } from '@/utils/vue';\nimport type Form from '@/forms/Form';\n\nlet offSubmit: (() => void) | undefined;\nconst props = defineProps({ form: objectProp<Form>() });\nconst emit = defineEmits<{ submit: [] }>();\n\nwatchEffect((onCleanup) => {\n offSubmit?.();\n offSubmit = props.form?.on('submit', () => emit('submit'));\n\n onCleanup(() => offSubmit?.());\n});\n\nprovide('form', props.form);\n</script>\n","import type { ComputedRef, DeepReadonly, ExtractPropTypes, Ref } from 'vue';\n\nimport { mixedProp, stringProp } from '@/utils';\nimport { extractComponentProps } from '@/components/utils';\nimport type { FormFieldValue } from '@/forms/Form';\n\nexport interface IAGHeadlessInput {\n id: string;\n name: ComputedRef<string | null>;\n label: ComputedRef<string | null>;\n description: ComputedRef<string | boolean | null>;\n value: ComputedRef<FormFieldValue | null>;\n errors: DeepReadonly<Ref<string[] | null>>;\n update(value: FormFieldValue | null): void;\n}\n\nexport const inputProps = {\n name: stringProp(),\n label: stringProp(),\n description: stringProp(),\n modelValue: mixedProp<FormFieldValue>([String, Number, Boolean]),\n};\n\nexport function useInputProps(): typeof inputProps {\n return inputProps;\n}\n\nexport function extractInputProps<T extends ExtractPropTypes<typeof inputProps>>(\n props: T,\n): Pick<T, keyof typeof inputProps> {\n return extractComponentProps(props, inputProps);\n}\n","<template>\n <component :is=\"as\" v-if=\"as\">\n <slot />\n </component>\n <slot v-else />\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, inject, provide, readonly } from 'vue';\nimport { uuid } from '@noeldemartin/utils';\n\nimport { stringProp } from '@/utils/vue';\nimport type Form from '@/forms/Form';\n\nimport { useInputProps } from './AGHeadlessInput';\nimport type { IAGHeadlessInput } from './AGHeadlessInput';\n\nconst emit = defineEmits(['update:modelValue']);\nconst props = defineProps({\n as: stringProp('div'),\n ...useInputProps(),\n});\nconst errors = computed(() => {\n if (!form || !props.name) {\n return null;\n }\n\n return form.errors[props.name] ?? null;\n});\nconst form = inject<Form | null>('form', null);\nconst api: IAGHeadlessInput = {\n id: `input-${uuid()}`,\n name: computed(() => props.name),\n label: computed(() => props.label),\n description: computed(() => props.description),\n value: computed(() => {\n if (form && props.name) {\n return form.getFieldValue(props.name);\n }\n\n return props.modelValue;\n }),\n errors: readonly(errors),\n update(value) {\n if (form && props.name) {\n form.setFieldValue(props.name, value);\n\n return;\n }\n\n emit('update:modelValue', value);\n },\n};\n\nprovide<IAGHeadlessInput>('input', api);\ndefineExpose<IAGHeadlessInput>(api);\n</script>\n","<template>\n <slot :id=\"`${input.id}-description`\">\n <AGMarkdown\n v-if=\"show\"\n v-bind=\"$attrs\"\n :id=\"`${input.id}-description`\"\n :text=\"text\"\n />\n </slot>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\n\nimport { injectReactiveOrFail } from '@/utils/vue';\n\nimport AGMarkdown from '../../lib/AGMarkdown.vue';\nimport type { IAGHeadlessInput } from './AGHeadlessInput';\n\ndefineOptions({ inheritAttrs: false });\n\nconst input = injectReactiveOrFail<IAGHeadlessInput>(\n 'input',\n '<AGHeadlessInputDescription> must be a child of a <AGHeadlessInput>',\n);\nconst text = computed(() => (typeof input.description === 'string' ? input.description : ''));\nconst show = computed(() => !!input.description);\n</script>\n","<template>\n <p v-if=\"errorMessage\" :id=\"`${input.id}-error`\">\n {{ errorMessage }}\n </p>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\n\nimport { injectReactiveOrFail } from '@/utils/vue';\nimport { translateWithDefault } from '@/lang/utils';\n\nimport type { IAGHeadlessInput } from './AGHeadlessInput';\n\nconst input = injectReactiveOrFail<IAGHeadlessInput>(\n 'input',\n '<AGHeadlessInputError> must be a child of a <AGHeadlessInput>',\n);\nconst errorMessage = computed(() => {\n if (!input.errors) {\n return null;\n }\n\n return translateWithDefault(`errors.${input.errors[0]}`, `Error: ${input.errors[0]}`);\n});\n</script>\n","import { inject, onUnmounted } from 'vue';\n\nimport type Form from '@/forms/Form';\n\nexport function onFormFocus(input: { name: string | null }, listener: () => unknown): void {\n const form = inject<Form | null>('form', null);\n const stop = form?.on('focus', (name) => input.name === name && listener());\n\n onUnmounted(() => stop?.());\n}\n","<template>\n <input\n :id=\"input.id\"\n ref=\"$input\"\n :name=\"name\"\n :type=\"type\"\n :aria-invalid=\"input.errors ? 'true' : 'false'\"\n :aria-describedby=\"\n input.errors ? `${input.id}-error` : input.description ? `${input.id}-description` : undefined\n \"\n :checked=\"checked\"\n @input=\"update\"\n >\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref, watchEffect } from 'vue';\n\nimport { injectReactiveOrFail, stringProp } from '@/utils';\nimport type { IAGHeadlessInput } from '@/components/headless/forms/AGHeadlessInput';\nimport type { FormFieldValue } from '@/forms/Form';\n\nimport { onFormFocus } from './composition';\n\nconst props = defineProps({\n type: stringProp('text'),\n});\n\nconst $input = ref<HTMLInputElement>();\nconst input = injectReactiveOrFail<IAGHeadlessInput>(\n 'input',\n '<AGHeadlessInputInput> must be a child of a <AGHeadlessInput>',\n);\nconst name = computed(() => input.name ?? undefined);\nconst value = computed(() => input.value);\nconst checked = computed(() => {\n if (props.type !== 'checkbox') {\n return;\n }\n\n return !!value.value;\n});\n\nfunction update() {\n if (!$input.value) {\n return;\n }\n\n input.update(getValue());\n}\n\nfunction getValue(): FormFieldValue | null {\n if (!$input.value) {\n return null;\n }\n\n switch (props.type) {\n case 'checkbox':\n return $input.value.checked;\n case 'date':\n return $input.value.valueAsDate;\n default:\n return $input.value.value;\n }\n}\n\nonFormFocus(input, () => $input.value?.focus());\nwatchEffect(() => {\n if (!$input.value) {\n return;\n }\n\n if (props.type === 'date') {\n $input.value.valueAsDate = value.value as Date;\n\n return;\n }\n\n $input.value.value = value.value as string;\n});\n</script>\n","<template>\n <label v-if=\"show\" :for=\"input.id\">\n <slot>\n {{ input.label }}\n </slot>\n </label>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, useSlots } from 'vue';\n\nimport { injectReactiveOrFail } from '@/utils/vue';\n\nimport type { IAGHeadlessInput } from './AGHeadlessInput';\n\nconst input = injectReactiveOrFail<IAGHeadlessInput>(\n 'input',\n '<AGHeadlessInputLabel> must be a child of a <AGHeadlessInput>',\n);\nconst slots = useSlots();\nconst show = computed(() => !!(input.label || slots.default));\n</script>\n","<template>\n <AGHeadlessInput\n ref=\"$input\"\n class=\"relative flex flex-col items-center\"\n :class=\"className\"\n v-bind=\"props\"\n >\n <AGHeadlessInputLabel class=\"sr-only\" />\n <AGHeadlessInputInput\n v-bind=\"attrs\"\n class=\"block w-full border-0 py-1.5 text-gray-900 ring-1 ring-inset ring-gray-300 placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-indigo-600\"\n :class=\"{\n 'ring-1 ring-red-500': $input?.errors,\n }\"\n />\n <AGHeadlessInputDescription />\n <div class=\"absolute bottom-0 left-0 translate-y-full\">\n <AGHeadlessInputError class=\"mt-1 text-sm text-red-500\" />\n </div>\n </AGHeadlessInput>\n</template>\n\n<script setup lang=\"ts\">\nimport { componentRef } from '@/utils/vue';\nimport { useInputAttrs } from '@/utils/composition/forms';\nimport { useInputProps } from '@/components/headless/forms/AGHeadlessInput';\nimport type { IAGHeadlessInput } from '@/components/headless/forms/AGHeadlessInput';\n\nimport AGHeadlessInput from '../headless/forms/AGHeadlessInput.vue';\nimport AGHeadlessInputDescription from '../headless/forms/AGHeadlessInputDescription.vue';\nimport AGHeadlessInputError from '../headless/forms/AGHeadlessInputError.vue';\nimport AGHeadlessInputInput from '../headless/forms/AGHeadlessInputInput.vue';\nimport AGHeadlessInputLabel from '../headless/forms/AGHeadlessInputLabel.vue';\n\ndefineOptions({ inheritAttrs: false });\n\nconst props = defineProps(useInputProps());\nconst $input = componentRef<IAGHeadlessInput>();\nconst [attrs, className] = useInputAttrs();\n</script>\n","import { MagicObject, arrayRemove } from '@noeldemartin/utils';\nimport { computed, nextTick, reactive, readonly, ref } from 'vue';\nimport type { ObjectValues } from '@noeldemartin/utils';\nimport type { ComputedRef, DeepReadonly, Ref, UnwrapNestedRefs } from 'vue';\n\nexport const FormFieldTypes = {\n String: 'string',\n Number: 'number',\n Boolean: 'boolean',\n Object: 'object',\n Date: 'date',\n} as const;\n\nexport interface FormFieldDefinition<TType extends FormFieldType = FormFieldType, TRules extends string = string> {\n type: TType;\n default?: GetFormFieldValue<TType>;\n rules?: TRules;\n}\n\nexport type FormFieldDefinitions = Record<string, FormFieldDefinition>;\nexport type FormFieldType = ObjectValues<typeof FormFieldTypes>;\nexport type FormFieldValue = GetFormFieldValue<FormFieldType>;\n\nexport type FormData<T> = {\n -readonly [k in keyof T]: T[k] extends FormFieldDefinition<infer TType, infer TRules>\n ? TRules extends 'required'\n ? GetFormFieldValue<TType>\n : GetFormFieldValue<TType> | null\n : never;\n};\n\nexport type FormErrors<T> = {\n [k in keyof T]: string[] | null;\n};\n\nexport type GetFormFieldValue<TType> = TType extends typeof FormFieldTypes.String\n ? string\n : TType extends typeof FormFieldTypes.Number\n ? number\n : TType extends typeof FormFieldTypes.Boolean\n ? boolean\n : TType extends typeof FormFieldTypes.Object\n ? object\n : TType extends typeof FormFieldTypes.Date\n ? Date\n : never;\n\nconst validForms: WeakMap<Form, ComputedRef<boolean>> = new WeakMap();\n\nexport type SubmitFormListener = () => unknown;\nexport type FocusFormListener = (input: string) => unknown;\n\nexport default class Form<Fields extends FormFieldDefinitions = FormFieldDefinitions> extends MagicObject {\n\n public errors: DeepReadonly<UnwrapNestedRefs<FormErrors<Fields>>>;\n\n private _fields: Fields;\n private _data: FormData<Fields>;\n private _submitted: Ref<boolean>;\n private _errors: FormErrors<Fields>;\n private _listeners: { focus?: FocusFormListener[]; submit?: SubmitFormListener[] } = {};\n\n constructor(fields: Fields) {\n super();\n\n this._fields = fields;\n this._submitted = ref(false);\n this._data = this.getInitialData(fields);\n this._errors = this.getInitialErrors(fields);\n\n validForms.set(\n this,\n computed(() => !Object.values(this._errors).some((error) => error !== null)),\n );\n\n this.errors = readonly(this._errors);\n }\n\n public get valid(): boolean {\n return !!validForms.get(this)?.value;\n }\n\n public get submitted(): boolean {\n return this._submitted.value;\n }\n\n public setFieldValue<T extends keyof Fields>(field: T, value: FormData<Fields>[T]): void {\n this._data[field] = value;\n\n if (this._submitted.value) {\n this.validate();\n }\n }\n\n public getFieldValue<T extends keyof Fields>(field: T): GetFormFieldValue<Fields[T]['type']> {\n return this._data[field] as unknown as GetFormFieldValue<Fields[T]['type']>;\n }\n\n public data(): FormData<Fields> {\n return { ...this._data };\n }\n\n public validate(): boolean {\n const errors = Object.entries(this._fields).reduce((formErrors, [name, definition]) => {\n formErrors[name] = this.getFieldErrors(name, definition);\n\n return formErrors;\n }, {} as Record<string, string[] | null>);\n\n this.resetErrors(errors);\n\n return this.valid;\n }\n\n public reset(options: { keepData?: boolean; keepErrors?: boolean } = {}): void {\n this._submitted.value = false;\n\n options.keepData || this.resetData();\n options.keepErrors || this.resetErrors();\n }\n\n public submit(): boolean {\n this._submitted.value = true;\n\n const valid = this.validate();\n\n valid && this._listeners['submit']?.forEach((listener) => listener());\n\n return valid;\n }\n\n public on(event: 'focus', listener: FocusFormListener): () => void;\n public on(event: 'submit', listener: SubmitFormListener): () => void;\n public on(event: 'focus' | 'submit', listener: FocusFormListener | SubmitFormListener): () => void {\n this._listeners[event] ??= [];\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this._listeners[event]?.push(listener as any);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return () => this.off(event as any, listener);\n }\n\n public off(event: 'focus', listener: FocusFormListener): void;\n public off(event: 'submit', listener: SubmitFormListener): void;\n public off(event: 'focus' | 'submit', listener: FocusFormListener | SubmitFormListener): void {\n arrayRemove(this._listeners[event] ?? [], listener);\n }\n\n public async focus(input: string): Promise<void> {\n await nextTick();\n\n this._listeners['focus']?.forEach((listener) => listener(input));\n }\n\n protected __get(property: string): unknown {\n if (!(property in this._fields)) {\n return super.__get(property);\n }\n\n return this._data[property];\n }\n\n protected __set(property: string, value: unknown): void {\n if (!(property in this._fields)) {\n super.__set(property, value);\n\n return;\n }\n\n Object.assign(this._data, { [property]: value });\n }\n\n private getFieldErrors(name: keyof Fields, definition: FormFieldDefinition): string[] | null {\n const errors = [];\n\n if (definition.rules?.includes('required') && !this._data[name]) {\n errors.push('required');\n }\n\n return errors.length > 0 ? errors : null;\n }\n\n private getInitialData(fields: Fields): FormData<Fields> {\n if (this.static().isConjuring()) {\n return {} as FormData<Fields>;\n }\n\n const data = Object.entries(fields).reduce((formData, [name, definition]) => {\n formData[name as keyof Fields] = (definition.default ?? null) as FormData<Fields>[keyof Fields];\n\n return formData;\n }, {} as FormData<Fields>);\n\n return reactive(data) as FormData<Fields>;\n }\n\n private getInitialErrors(fields: Fields): FormErrors<Fields> {\n if (this.static().isConjuring()) {\n return {} as FormErrors<Fields>;\n }\n\n const errors = Object.keys(fields).reduce((formErrors, name) => {\n formErrors[name as keyof Fields] = null;\n\n return formErrors;\n }, {} as FormErrors<Fields>);\n\n return reactive(errors) as FormErrors<Fields>;\n }\n\n private resetData(): void {\n for (const [name, field] of Object.entries(this._fields)) {\n this._data[name as keyof Fields] = (field.default ?? null) as FormData<Fields>[keyof Fields];\n }\n }\n\n private resetErrors(errors?: Record<string, string[] | null>): void {\n Object.keys(this._errors).forEach((key) => delete this._errors[key as keyof Fields]);\n\n errors && Object.assign(this._errors, errors);\n }\n\n}\n","import Form from '@/forms/Form';\nimport type { FormData, FormFieldDefinitions } from '@/forms/Form';\n\nexport function useForm<const T extends FormFieldDefinitions>(fields: T): Form<T> & FormData<T> {\n return new Form(fields) as Form<T> & FormData<T>;\n}\n","import { FormFieldTypes } from './Form';\nimport type { FormFieldDefinition } from './Form';\n\nexport function booleanInput(defaultValue?: boolean): FormFieldDefinition<typeof FormFieldTypes.Boolean> {\n return {\n default: defaultValue,\n type: FormFieldTypes.Boolean,\n };\n}\n\nexport function dateInput(defaultValue?: Date): FormFieldDefinition<typeof FormFieldTypes.Date> {\n return {\n default: defaultValue,\n type: FormFieldTypes.Date,\n };\n}\n\nexport function requiredBooleanInput(\n defaultValue?: boolean,\n): FormFieldDefinition<typeof FormFieldTypes.Boolean, 'required'> {\n return {\n default: defaultValue,\n type: FormFieldTypes.Boolean,\n rules: 'required',\n };\n}\n\nexport function requiredDateInput(defaultValue?: Date): FormFieldDefinition<typeof FormFieldTypes.Date> {\n return {\n default: defaultValue,\n type: FormFieldTypes.Date,\n rules: 'required',\n };\n}\n\nexport function requiredNumberInput(\n defaultValue?: number,\n): FormFieldDefinition<typeof FormFieldTypes.Number, 'required'> {\n return {\n default: defaultValue,\n type: FormFieldTypes.Number,\n rules: 'required',\n };\n}\n\nexport function requiredStringInput(\n defaultValue?: string,\n): FormFieldDefinition<typeof FormFieldTypes.String, 'required'> {\n return {\n default: defaultValue,\n type: FormFieldTypes.String,\n rules: 'required',\n };\n}\n\nexport function numberInput(defaultValue?: number): FormFieldDefinition<typeof FormFieldTypes.Number> {\n return {\n default: defaultValue,\n type: FormFieldTypes.Number,\n };\n}\n\nexport function stringInput(defaultValue?: string): FormFieldDefinition<typeof FormFieldTypes.String> {\n return {\n default: defaultValue,\n type: FormFieldTypes.String,\n };\n}\n","<template>\n <AGModal v-slot=\"{ close }: IAGModalDefaultSlotProps\" :cancellable=\"false\" :title=\"title\">\n <AGMarkdown :text=\"message\" />\n\n <AGForm :form=\"form\" @submit=\"close(form.draft)\">\n <AGInput name=\"draft\" :placeholder=\"placeholder\" :label=\"label\" />\n\n <div class=\"mt-2 flex flex-row-reverse gap-2\">\n <AGButton submit>\n {{ renderedAcceptText }}\n </AGButton>\n <AGButton color=\"secondary\" @click=\"close()\">\n {{ renderedCancelText }}\n </AGButton>\n </div>\n </AGForm>\n </AGModal>\n</template>\n\n<script setup lang=\"ts\">\nimport AGModal from './AGModal.vue';\nimport { usePromptModal, usePromptModalProps } from './AGPromptModal';\nimport type { IAGModalDefaultSlotProps } from './AGModal';\n\nimport AGButton from '../forms/AGButton.vue';\nimport AGForm from '../forms/AGForm.vue';\nimport AGInput from '../forms/AGInput.vue';\nimport AGMarkdown from '../lib/AGMarkdown.vue';\nimport { requiredStringInput, useForm } from '../../forms';\n\nconst props = defineProps(usePromptModalProps());\nconst form = useForm({ draft: requiredStringInput(props.defaultValue ?? '') });\nconst { renderedAcceptText, renderedCancelText } = usePromptModal(props);\n</script>\n","import type { ExtractPropTypes } from 'vue';\nimport type { ObjectWithoutEmpty } from '@noeldemartin/utils';\n\nimport UI from '@/ui/UI';\nimport { arrayProp, enumProp, requiredStringProp } from '@/utils/vue';\nimport { Colors } from '@/components/constants';\nimport { objectWithout } from '@noeldemartin/utils';\n\nexport { default as AGHeadlessSnackbar } from './AGHeadlessSnackbar.vue';\n\nexport const SnackbarColors = objectWithout(Colors, ['Primary', 'Clear']);\nexport const snackbarProps = {\n id: requiredStringProp(),\n message: requiredStringProp(),\n actions: arrayProp<SnackbarAction>(() => []),\n color: enumProp(SnackbarColors, Colors.Secondary),\n};\n\nexport interface SnackbarAction {\n text: string;\n dismiss?: boolean;\n handler?(): unknown;\n}\n\nexport type SnackbarColor = (typeof SnackbarColors)[keyof typeof SnackbarColors];\nexport type AGSnackbarProps = ObjectWithoutEmpty<ExtractPropTypes<typeof snackbarProps>>;\n\nexport function useSnackbarProps(): typeof snackbarProps {\n return snackbarProps;\n}\n\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\nexport function useSnackbar(props: ExtractPropTypes<typeof snackbarProps>) {\n function activate(action: SnackbarAction): void {\n action.handler?.();\n action.dismiss && UI.hideSnackbar(props.id);\n }\n\n return { activate };\n}\n","<template>\n <AGHeadlessSnackbar class=\"flex flex-row items-center justify-center gap-3 p-4\" :class=\"styleClasses\">\n <AGMarkdown :text=\"message\" inline />\n <AGButton\n v-for=\"(action, i) of actions\"\n :key=\"i\"\n :color=\"color\"\n @click=\"activate(action)\"\n >\n {{ action.text }}\n </AGButton>\n </AGHeadlessSnackbar>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\n\nimport { Colors } from '@/components/constants';\nimport { useSnackbar, useSnackbarProps } from '@/components/headless/snackbars';\n\nimport AGButton from '../forms/AGButton.vue';\nimport AGHeadlessSnackbar from '../headless/snackbars/AGHeadlessSnackbar.vue';\nimport AGMarkdown from '../lib/AGMarkdown.vue';\n\nconst props = defineProps(useSnackbarProps());\nconst { activate } = useSnackbar(props);\nconst styleClasses = computed(() => {\n switch (props.color) {\n case Colors.Danger:\n return 'bg-red-200 text-red-900';\n default:\n case Colors.Secondary:\n return 'bg-gray-900 text-white';\n }\n});\n</script>\n","import type { Component } from 'vue';\n\nimport { bootServices } from '@/services';\nimport { definePlugin } from '@/plugins';\n\nimport UI, { UIComponents } from './UI';\nimport AGAlertModal from '../components/modals/AGAlertModal.vue';\nimport AGConfirmModal from '../components/modals/AGConfirmModal.vue';\nimport AGErrorReportModal from '../components/modals/AGErrorReportModal.vue';\nimport AGLoadingModal from '../components/modals/AGLoadingModal.vue';\nimport AGPromptModal from '../components/modals/AGPromptModal.vue';\nimport AGSnackbar from '../components/snackbars/AGSnackbar.vue';\nimport AGStartupCrash from '../components/lib/AGStartupCrash.vue';\nimport type { UIComponent } from './UI';\n\nconst services = { $ui: UI };\n\nexport * from './UI';\nexport { default as UI } from './UI';\n\nexport type UIServices = typeof services;\n\nexport default definePlugin({\n async install(app, options) {\n const defaultComponents = {\n [UIComponents.AlertModal]: AGAlertModal,\n [UIComponents.ConfirmModal]: AGConfirmModal,\n [UIComponents.ErrorReportModal]: AGErrorReportModal,\n [UIComponents.LoadingModal]: AGLoadingModal,\n [UIComponents.PromptModal]: AGPromptModal,\n [UIComponents.Snackbar]: AGSnackbar,\n [UIComponents.StartupCrash]: AGStartupCrash,\n };\n\n Object.entries({\n ...defaultComponents,\n ...options.components,\n }).forEach(([name, component]) => UI.registerComponent(name as UIComponent, component));\n\n await bootServices(app, services);\n },\n});\n\ndeclare module '@/bootstrap/options' {\n export interface AerogelOptions {\n components?: Partial<Record<UIComponent, Component>>;\n }\n}\n\ndeclare module '@/services' {\n export interface Services extends UIServices {}\n}\n","import { createApp } from 'vue';\nimport type { App, Component } from 'vue';\n\nimport directives from '@/directives';\nimport errors from '@/errors';\nimport Events from '@/services/Events';\nimport lang from '@/lang';\nimport services from '@/services';\nimport testing from '@/testing';\nimport ui from '@/ui';\nimport { installPlugins } from '@/plugins';\nimport type { AerogelOptions } from '@/bootstrap/options';\n\nexport { AerogelOptions };\n\nexport async function bootstrapApplication(app: App, options: AerogelOptions = {}): Promise<void> {\n const plugins = [testing, directives, errors, lang, services, ui, ...(options.plugins ?? [])];\n\n await installPlugins(plugins, app, options);\n await options.install?.(app);\n await Events.emit('application-ready');\n}\n\nexport async function bootstrap(rootComponent: Component, options: AerogelOptions = {}): Promise<void> {\n const app = createApp(rootComponent);\n\n await bootstrapApplication(app, options);\n\n app.mount('#app');\n app._container?.classList.remove('loading');\n\n await Events.emit('application-mounted');\n}\n\ndeclare module '@/services/Events' {\n export interface EventsPayload {\n 'application-ready': void;\n 'application-mounted': void;\n }\n}\n","<template>\n <aside v-if=\"modal\">\n <AGModalContext :child-index=\"1\" :modal=\"modal\" />\n </aside>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\n\nimport UI from '@/ui/UI';\n\nimport AGModalContext from './modals/AGModalContext.vue';\n\nconst modal = computed(() => UI.modals[0] ?? null);\n</script>\n","<template>\n <div aria-live=\"assertive\" class=\"z-60 pointer-events-none fixed inset-0 flex items-end px-4 py-6 sm:p-6\">\n <div class=\"flex w-full flex-col items-end space-y-4\">\n <component\n :is=\"snackbar.component\"\n v-for=\"snackbar of $ui.snackbars\"\n :id=\"snackbar.id\"\n :key=\"snackbar.id\"\n v-bind=\"snackbar.properties\"\n />\n </div>\n </div>\n</template>\n","<template>\n <div\n id=\"aerogel-overlays-backdrop\"\n ref=\"$backdrop\"\n class=\"pointer-events-none fixed inset-0 z-50 bg-black/30 opacity-0\"\n />\n <AGAppModals />\n <AGAppSnackbars />\n</template>\n\n<script setup lang=\"ts\">\nimport { ref } from 'vue';\n\nimport { useEvent } from '@/utils/composition/events';\n\nimport AGAppModals from './AGAppModals.vue';\nimport AGAppSnackbars from './AGAppSnackbars.vue';\n\nconst $backdrop = ref<HTMLElement | null>(null);\nconst backdropHidden = ref(true);\n\nuseEvent('show-overlays-backdrop', async () => {\n if (!$backdrop.value || !backdropHidden.value) {\n return;\n }\n\n backdropHidden.value = false;\n\n $backdrop.value.classList.remove('opacity-0');\n});\n\nuseEvent('hide-overlays-backdrop', async () => {\n if (!$backdrop.value || backdropHidden.value) {\n return;\n }\n\n backdropHidden.value = true;\n\n $backdrop.value.classList.add('opacity-0');\n});\n</script>\n","<template>\n <AGHeadlessInput\n ref=\"$input\"\n :name=\"name\"\n class=\"flex\"\n @update:model-value=\"$emit('update:modelValue', $event)\"\n >\n <AGHeadlessInputInput\n v-bind=\"$attrs\"\n type=\"checkbox\"\n :class=\"{\n 'text-indigo-600 focus:ring-indigo-600': !$input?.errors,\n 'border-red-200 text-red-600 focus:ring-red-600': $input?.errors,\n }\"\n />\n\n <div class=\"ml-2\">\n <AGHeadlessInputLabel v-if=\"$slots.default\">\n <slot />\n </AGHeadlessInputLabel>\n <AGHeadlessInputError class=\"text-sm text-red-600\" />\n </div>\n </AGHeadlessInput>\n</template>\n\n<script setup lang=\"ts\">\nimport { componentRef, stringProp } from '@/utils/vue';\n\nimport type { IAGHeadlessInput } from '@/components/headless/forms/AGHeadlessInput';\n\nimport AGHeadlessInput from '../headless/forms/AGHeadlessInput.vue';\nimport AGHeadlessInputError from '../headless/forms/AGHeadlessInputError.vue';\nimport AGHeadlessInputInput from '../headless/forms/AGHeadlessInputInput.vue';\nimport AGHeadlessInputLabel from '../headless/forms/AGHeadlessInputLabel.vue';\n\ndefineProps({ name: stringProp() });\ndefineOptions({ inheritAttrs: false });\ndefineEmits(['update:modelValue']);\n\nconst $input = componentRef<IAGHeadlessInput>();\n</script>\n","import type { ComputedRef, DeepReadonly, ExtractPropTypes, Ref } from 'vue';\nimport type { Writable } from '@noeldemartin/utils';\n\nimport { mixedProp, requiredArrayProp, stringProp } from '@/utils/vue';\nimport { extractComponentProps } from '@/components/utils';\nimport type { FormFieldValue } from '@/forms/Form';\n\nexport interface IAGHeadlessSelect {\n id: string;\n label: ComputedRef<string | null>;\n noSelectionText: ComputedRef<string>;\n buttonText: ComputedRef<string>;\n renderText: ComputedRef<(value: FormFieldValue) => string>;\n selectedOption: ComputedRef<FormFieldValue | null>;\n options: ComputedRef<FormFieldValue[]>;\n errors: DeepReadonly<Ref<string[] | null>>;\n update(value: FormFieldValue): void;\n}\n\nexport const selectProps = {\n name: stringProp(),\n label: stringProp(),\n options: requiredArrayProp<FormFieldValue>(),\n noSelectionText: stringProp(),\n optionsText: mixedProp<string | ((option: FormFieldValue) => string)>(),\n};\n\nexport const selectEmits = ['update:modelValue'] as const;\n\nexport function useSelectProps(): typeof selectProps {\n return selectProps;\n}\n\nexport function useSelectEmits(): Writable<typeof selectEmits> {\n return [...selectEmits];\n}\n\nexport function extractSelectProps<T extends ExtractPropTypes<typeof selectProps>>(\n props: T,\n): Pick<T, keyof typeof selectProps> {\n return extractComponentProps(props, selectProps);\n}\n","<template>\n <Listbox\n v-slot=\"{ value, open, disabled }: ComponentProps\"\n :model-value=\"selectedOption\"\n @update:model-value=\"update($event)\"\n >\n <slot :value=\"value\" :open=\"open\" :disabled=\"disabled\" />\n </Listbox>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, inject, provide } from 'vue';\nimport { toString, uuid } from '@noeldemartin/utils';\nimport { Listbox } from '@headlessui/vue';\n\nimport { mixedProp } from '@/utils/vue';\nimport { translateWithDefault } from '@/lang/utils';\nimport type Form from '@/forms/Form';\nimport type { FormFieldValue } from '@/forms/Form';\nimport type { ComponentProps } from '@/utils/vue';\n\nimport { useSelectEmits, useSelectProps } from './AGHeadlessSelect';\nimport type { IAGHeadlessSelect } from './AGHeadlessSelect';\n\nconst emit = defineEmits(useSelectEmits());\nconst props = defineProps({\n modelValue: mixedProp<FormFieldValue>(),\n ...useSelectProps(),\n});\nconst renderText = computed(() => {\n if (typeof props.optionsText === 'function') {\n return props.optionsText;\n }\n\n if (typeof props.optionsText === 'string') {\n return (option: FormFieldValue): string => toString(option[props.optionsText as keyof FormFieldValue]);\n }\n\n return (option: FormFieldValue) => toString(option);\n});\nconst form = inject<Form | null>('form', null);\nconst noSelectionText = computed(() => props.noSelectionText ?? translateWithDefault('select.noSelection', '-'));\nconst selectedOption = computed(() => (form && props.name ? form.getFieldValue(props.name) : props.modelValue));\nconst errors = computed(() => {\n if (!form || !props.name) {\n return null;\n }\n\n return form.errors[props.name] ?? null;\n});\n\nfunction update(value: FormFieldValue) {\n if (form && props.name) {\n form.setFieldValue(props.name, value);\n\n return;\n }\n\n emit('update:modelValue', value);\n}\n\nconst api: IAGHeadlessSelect = {\n id: `select-${uuid()}`,\n noSelectionText,\n selectedOption,\n errors,\n options: computed(() => props.options),\n label: computed(() => props.label),\n buttonText: computed(() =>\n selectedOption.value === null ? noSelectionText.value : renderText.value(selectedOption.value)),\n renderText,\n update,\n};\n\nprovide<IAGHeadlessSelect>('select', api);\ndefineExpose<IAGHeadlessSelect>(api);\n</script>\n","<template>\n <ListboxButton v-slot=\"{ value, open, disabled }: ComponentProps\">\n <slot :value=\"value\" :open=\"open\" :disabled=\"disabled\">\n <span :class=\"textClass\">{{ select?.buttonText }}</span>\n </slot>\n <slot name=\"icon\" />\n </ListboxButton>\n</template>\n\n<script setup lang=\"ts\">\nimport { ListboxButton } from '@headlessui/vue';\n\nimport { injectReactiveOrFail, stringProp } from '@/utils/vue';\nimport type { ComponentProps } from '@/utils/vue';\n\nimport type { IAGHeadlessSelect } from './AGHeadlessSelect';\n\ndefineProps({ textClass: stringProp() });\n\nconst select = injectReactiveOrFail<IAGHeadlessSelect>(\n 'select',\n '<AGHeadlessSelectButton> must be a child of a <AGHeadlessSelect>',\n);\n</script>\n","<template>\n <p v-if=\"errorMessage\" :id=\"`${select.id}-error`\">\n {{ errorMessage }}\n </p>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\n\nimport { injectReactiveOrFail } from '@/utils/vue';\nimport { translateWithDefault } from '@/lang/utils';\n\nimport type { IAGHeadlessSelect } from './AGHeadlessSelect';\n\nconst select = injectReactiveOrFail<IAGHeadlessSelect>(\n 'select',\n '<AGHeadlessSelectError> must be a child of a <AGHeadlessSelect>',\n);\nconst errorMessage = computed(() => {\n if (!select.errors) {\n return null;\n }\n\n return translateWithDefault(`errors.${select.errors[0]}`, `Error: ${select.errors[0]}`);\n});\n</script>\n","<template>\n <ListboxLabel v-if=\"show\" v-slot=\"{ open, disabled }: ComponentProps\">\n <slot :open=\"open\" :disabled=\"disabled\">\n {{ select.label }}\n </slot>\n </ListboxLabel>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, useSlots } from 'vue';\nimport { ListboxLabel } from '@headlessui/vue';\n\nimport { injectReactiveOrFail } from '@/utils/vue';\nimport type { ComponentProps } from '@/utils/vue';\n\nimport type { IAGHeadlessSelect } from './AGHeadlessSelect';\n\nconst select = injectReactiveOrFail<IAGHeadlessSelect>(\n 'select',\n '<AGHeadlessSelectLabel> must be a child of a <AGHeadlessSelect>',\n);\nconst slots = useSlots();\nconst show = computed(() => !!(select.label || slots.default));\n</script>\n","<template>\n <ListboxOption v-slot=\"{ active, selected, disabled }: ComponentProps\" :value=\"value\" as=\"template\">\n <slot :active=\"active\" :selected=\"selected\" :disabled=\"disabled\">\n <li\n :class=\"{\n [activeClass ?? 'active']: active,\n [inactiveClass ?? 'inactive']: !active,\n [selectedClass ?? 'selected']: selected,\n [unselectedClass ?? 'unselected']: !selected,\n }\"\n >\n {{ select.renderText(value) }}\n </li>\n </slot>\n </ListboxOption>\n</template>\n\n<script setup lang=\"ts\">\nimport { ListboxOption } from '@headlessui/vue';\n\nimport { injectReactiveOrFail, requiredMixedProp, stringProp } from '@/utils/vue';\nimport type { ComponentProps } from '@/utils/vue';\nimport type { FormFieldValue } from '@/forms/Form';\n\nimport type { IAGHeadlessSelect } from './AGHeadlessSelect';\n\ndefineProps({\n value: requiredMixedProp<FormFieldValue>(),\n selectedClass: stringProp(),\n unselectedClass: stringProp(),\n activeClass: stringProp(),\n inactiveClass: stringProp(),\n});\n\nconst select = injectReactiveOrFail<IAGHeadlessSelect>(\n 'select',\n '<AGHeadlessSelectOption> must be a child of a <AGHeadlessSelect>',\n);\n</script>\n","<template>\n <AGHeadlessSelect\n v-bind=\"props\"\n ref=\"$select\"\n as=\"div\"\n @update:model-value=\"$emit('update:modelValue', $event)\"\n >\n <AGHeadlessSelectLabel class=\"block text-sm font-medium leading-6 text-gray-900\" />\n <div class=\"relative\" :class=\"{ 'mt-2': $select?.label }\">\n <AGHeadlessSelectButton\n class=\"relative w-full cursor-default bg-white py-1.5 pl-3 pr-10 text-left text-gray-900 ring-1 ring-inset ring-gray-300 focus:outline-none focus:ring-2 focus:ring-indigo-600\"\n text-class=\"block truncate\"\n :class=\"{\n 'ring-1 ring-red-500': $select?.errors,\n }\"\n >\n <template #icon>\n <span class=\"pointer-events-none absolute inset-y-0 right-0 flex items-center pr-2\">\n <IconCheveronDown class=\"h-5 w-5 text-gray-400\" />\n </span>\n </template>\n </AGHeadlessSelectButton>\n <AGHeadlessSelectOptions\n class=\"absolute z-10 mt-1 max-h-60 w-full overflow-auto border bg-white py-1 text-base ring-1 ring-black ring-opacity-5 focus:outline-none\"\n >\n <AGHeadlessSelectOption\n v-for=\"(option, index) in $select?.options ?? []\"\n :key=\"index\"\n :value=\"option\"\n class=\"relative block cursor-default select-none truncate py-2 pl-3 pr-9\"\n selected-class=\"font-semibold\"\n unselected-class=\"font-normal\"\n active-class=\"bg-indigo-600 text-white\"\n inactive-class=\"text-gray-900\"\n />\n </AGHeadlessSelectOptions>\n </div>\n <AGHeadlessSelectError class=\"mt-2 text-sm text-red-600\" />\n </AGHeadlessSelect>\n</template>\n\n<script setup lang=\"ts\">\nimport IconCheveronDown from '~icons/zondicons/cheveron-down';\n\nimport { componentRef } from '@/utils/vue';\nimport { useSelectEmits, useSelectProps } from '@/components/headless/forms/AGHeadlessSelect';\nimport type { IAGHeadlessSelect } from '@/components/headless/forms/AGHeadlessSelect';\n\nimport AGHeadlessSelect from '../headless/forms/AGHeadlessSelect.vue';\nimport AGHeadlessSelectButton from '../headless/forms/AGHeadlessSelectButton.vue';\nimport AGHeadlessSelectError from '../headless/forms/AGHeadlessSelectError.vue';\nimport AGHeadlessSelectLabel from '../headless/forms/AGHeadlessSelectLabel.vue';\nimport AGHeadlessSelectOption from '../headless/forms/AGHeadlessSelectOption.vue';\nimport AGHeadlessSelectOptions from '../headless/forms/AGHeadlessSelectOptions';\n\ndefineEmits(useSelectEmits());\n\nconst props = defineProps(useSelectProps());\nconst $select = componentRef<IAGHeadlessSelect>();\n</script>\n","<template>\n <textarea\n :id=\"input.id\"\n ref=\"$textArea\"\n :name=\"name\"\n :value=\"value\"\n :aria-invalid=\"input.errors ? 'true' : 'false'\"\n :aria-describedby=\"\n input.errors ? `${input.id}-error` : input.description ? `${input.id}-description` : undefined\n \"\n @input=\"update\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref } from 'vue';\n\nimport { injectReactiveOrFail } from '@/utils';\nimport type { IAGHeadlessInput } from '@/components/headless/forms/AGHeadlessInput';\n\nimport { onFormFocus } from './composition';\n\nconst $textArea = ref<HTMLTextAreaElement>();\nconst input = injectReactiveOrFail<IAGHeadlessInput>(\n 'input',\n '<AGHeadlessInputTextArea> must be a child of a <AGHeadlessInput>',\n);\nconst name = computed(() => input.name ?? undefined);\nconst value = computed(() => input.value as string);\n\nfunction update() {\n if (!$textArea.value) {\n return;\n }\n\n input.update($textArea.value.value);\n}\n\nonFormFocus(input, () => $textArea.value?.focus());\n</script>\n","<template>\n <AGMarkdown :text=\"message\" inline />\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\n\nimport { requiredObjectProp } from '@/utils/vue';\nimport { getErrorMessage } from '@/errors/utils';\nimport type { ErrorSource } from '@/errors/Errors.state';\n\nimport AGMarkdown from './AGMarkdown.vue';\n\nconst props = defineProps({ error: requiredObjectProp<ErrorSource>() });\nconst message = computed(() => getErrorMessage(props.error));\n</script>\n","<template>\n <component :is=\"as\" v-measure=\"() => (measured = true)\" :class=\"{ '!invisible !absolute !w-auto': !measured }\">\n <slot />\n </component>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref } from 'vue';\n\nimport { stringProp } from '@/utils/vue';\n\ndefineProps({ as: stringProp('span') });\n\nconst measured = ref(false);\n</script>\n","export default abstract class Job {\n\n public abstract run(): Promise<void>;\n\n}\n","import Job from './Job';\n\nexport { Job };\n\nexport async function dispatch(job: Job): Promise<void> {\n await job.run();\n}\n"],"names":["ServiceBootError","JSError","constructor","serviceNamespace","cause","super","_store","initializePiniaStore","resetPiniaStore","tap","createPinia","store","setActivePinia","getPiniaStore","defineServiceStore","name","options","defineStore","defineServiceState","_class","_defineProperty","Service","usesStore","getName","getInitialState","initialState","Object","entries","reduce","state","_ref","key","value","structuredClone","error","console","warn","this","getComputedStateDefinition","computed","serializePersistedState","serialize","persist","MagicObject","getters","_name","_booted","PromisedValue","_computedStateKeys","Set","keys","booted","launch","handleError","reject","frameworkBoot","then","boot","resolve","catch","hasPersistedState","Storage","has","hasState","property","$state","getState","undefined","setState","stateOrProperty","assign","onStateUpdated","__get","__set","persisted","objectOnly","isEmpty","storage","get","set","objectDeepClone","initializePersistedState","require","EventListenerPriorities","Low","Default","High","EventsService","arguments","globalThis","__aerogelEvents__","forEach","event","listener","on","emit","payload","listeners","priorities","handlers","priority","Promise","all","map","optionsOrListener","handler","registerListener","off","once","onceListener","arrayRemove","length","fail","includes","push","sort","a","b","facade","Service$2","plugins","environment","Aerogel","sourceUrl","development","testing","AppService","isReady","ready","isResolved","isMounted","mounted","whenReady","callback","reload","queryParameters","updateLocationQueryParameters","location","forever","plugin","Events","definePlugin","async","installPlugins","_len","args","Array","_key","App","pluginsMap","install","arrayProp","defaultValue","type","default","booleanProp","Boolean","componentRef","ref","computedAsync","getter","result","asyncValue","watch","immediate","defineDirective","directive","enumProp","enumeration","values","String","validator","injectReactive","inject","reactive","injectReactiveOrFail","errorMessage","injectOrFail","mixedProp","numberProp","Number","objectProp","requiredArrayProp","required","requiredEnumProp","requiredMixedProp","requiredNumberProp","requiredObjectProp","requiredStringProp","stringProp","builtInDirectives","element","focus","measure","sizes","getBoundingClientRect","style","setProperty","width","height","directives","app","CacheService","url","cache","open","match","response","put","replace","caches","instance","defaultServices","$app","$events","bootServices","services","service","config","errorHandler","globalProperties","window","services$3","use","Service$1","modals","snackbars","UIComponents","AlertModal","ConfirmModal","ErrorReportModal","LoadingModal","PromptModal","Snackbar","StartupCrash","UIService","requireComponent","components","alert","messageOrTitle","message","openModal","title","confirm","messageOrOptions","modal","beforeClose","prompt","trim","rawResult","loading","messageOrOperation","operation","after","seconds","closeModal","id","showSnackbar","snackbar","uuid","properties","component","markRaw","concat","setTimeout","hideSnackbar","filter","registerComponent","callbacks","willClose","afterClose","closed","activeModal","at","modalCallbacks","nextTick","watchModalEvents","watchMountedEvent","_ref2","m","splash","document","getElementById","getComputedStyle","opacity","ms","remove","provider","translate","translateWithDefault","_","defaultMessage","setProvider","parameters","Lang","bind","logs","startupErrors","hasErrors","hasNewErrors","some","seen","hasStartupErrors","_ref3","Colors","Primary","Secondary","Danger","Clear","enable","enabled","disable","inspect","reports","isArray","createErrorReport","UI","report","logError","startupError","createStartupErrorReport","log","date","Date","color","actions","text","dismiss","see","seeAll","isObject","Error","createErrorReportFromError","objectWithoutEmpty","toString","description","defaults","details","stack","getErrorMessage","$errors","Errors","setUpErrorHandler","baseHandler","frameworkHandler","onerror","__","___","onunhandledrejection","reason","errors","$lang","lang","$t","$td","env","MODE","testingRuntime","useEvent","unsubscribe","onUnmounted","useInputAttrs","attrs","useAttrs","className","class","objectWithout","onCleanMounted","cleanUp","noop","onMounted","removeInteractiveClasses","classes","split","test","join","extractComponentProps","definitions","extracted","prop","modalProps","cancellable","useModalProps","extractModalProps","props","useModalExpose","$modal","close","__props","$root","hidden","hide","$el","show","__expose","toRef","provide","childIndex","childModal","renderMarkdown","markdown","html","marked","mangle","headerIds","renderer","Renderer","link","href","prototype","apply","DOMPurify","sanitize","ADD_ATTR","langKey","langParams","renderedHtml","inline","root","h","as","innerHTML","alertModalProps","useAlertModalProps","confirmModalProps","acceptText","cancelText","useConfirmModalProps","useConfirmModal","renderedAcceptText","renderedCancelText","route","to","params","routeParams","query","routeQuery","target","submit","colorClasses","errorReportModalProps","useErrorReportModalProps","useErrorReportModal","activeReportIndex","previousReportText","nextReportText","summary","githubReportUrl","issueTitle","encodeURIComponent","issueBody","stringExcerpt","buttons","iconComponent","IconCopy","navigator","clipboard","writeText","IconConsole","reportButtons","IconGitHub","totalReports","currentReport","loadingModalProps","useLoadingModalProps","useLoadingModal","renderedMessage","promptModalProps","label","placeholder","usePromptModalProps","usePromptModal","offSubmit","__emit","watchEffect","onCleanup","form","inputProps","modelValue","useInputProps","extractInputProps","api","getFieldValue","readonly","update","setFieldValue","input","onFormFocus","stop","$input","checked","valueAsDate","getValue","slots","useSlots","FormFieldTypes","validForms","WeakMap","Form","fields","_fields","_submitted","_data","getInitialData","_errors","getInitialErrors","valid","submitted","field","validate","data","formErrors","definition","getFieldErrors","resetErrors","reset","keepData","resetData","keepErrors","_listeners","rules","static","isConjuring","formData","useForm","booleanInput","dateInput","requiredBooleanInput","requiredDateInput","requiredNumberInput","requiredStringInput","numberInput","stringInput","draft","SnackbarColors","snackbarProps","useSnackbarProps","useSnackbar","activate","action","styleClasses","$ui","ui","defaultComponents","AGAlertModal","AGConfirmModal","AGErrorReportModal","AGLoadingModal","AGPromptModal","AGSnackbar","AGStartupCrash","bootstrapApplication","bootstrap","rootComponent","createApp","mount","_container","classList","_hoisted_2","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_Fragment","_renderList","_ctx","_createBlock","_resolveDynamicComponent","_mergeProps","$backdrop","backdropHidden","add","selectProps","noSelectionText","optionsText","selectEmits","useSelectProps","useSelectEmits","extractSelectProps","renderText","option","selectedOption","buttonText","select","$select","$textArea","measured","Job","dispatch","job","run"],"mappings":"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"}
@@ -1,7 +0,0 @@
1
- import { defineConfig } from 'histoire';
2
- import { HstVue } from '@histoire/plugin-vue';
3
-
4
- export default defineConfig({
5
- setupFile: '/src/main.histoire.ts',
6
- plugins: [HstVue()],
7
- });
@@ -1,5 +0,0 @@
1
- /** @type {import('@noeldemartin/scripts').Config} */
2
- module.exports = {
3
- vue: true,
4
- icons: true,
5
- };
package/postcss.config.js DELETED
@@ -1,6 +0,0 @@
1
- module.exports = {
2
- plugins: {
3
- tailwindcss: {},
4
- autoprefixer: {},
5
- },
6
- };