@aerogel/core 0.0.0-next.d34923f3b144e8f6720e6a9cdadb2cd4fb4ab289 → 0.0.0-next.d4f3ae130b52cace673d7c95681c19256ee1acb4

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 (203) hide show
  1. package/dist/aerogel-core.css +1 -0
  2. package/dist/aerogel-core.d.ts +2058 -1789
  3. package/dist/aerogel-core.js +3287 -0
  4. package/dist/aerogel-core.js.map +1 -0
  5. package/package.json +31 -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 +20 -0
  17. package/src/components/contracts/ErrorReportModal.ts +32 -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/{forms/AGHeadlessInputInput.vue → HeadlessInputInput.vue} +17 -25
  30. package/src/components/headless/{forms/AGHeadlessInputLabel.vue → HeadlessInputLabel.vue} +3 -7
  31. package/src/components/headless/{forms/AGHeadlessInputTextArea.vue → HeadlessInputTextArea.vue} +11 -13
  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/HeadlessToast.vue +18 -0
  45. package/src/components/headless/HeadlessToastAction.vue +13 -0
  46. package/src/components/headless/index.ts +19 -3
  47. package/src/components/index.ts +6 -10
  48. package/src/components/ui/AdvancedOptions.vue +18 -0
  49. package/src/components/ui/AlertModal.vue +17 -0
  50. package/src/components/ui/Button.vue +100 -0
  51. package/src/components/ui/Checkbox.vue +56 -0
  52. package/src/components/ui/ConfirmModal.vue +50 -0
  53. package/src/components/ui/DropdownMenu.vue +32 -0
  54. package/src/components/ui/DropdownMenuOption.vue +14 -0
  55. package/src/components/ui/DropdownMenuOptions.vue +27 -0
  56. package/src/components/ui/EditableContent.vue +82 -0
  57. package/src/components/ui/ErrorMessage.vue +15 -0
  58. package/src/components/ui/ErrorReportModal.vue +72 -0
  59. package/src/components/{modals/AGErrorReportModalButtons.vue → ui/ErrorReportModalButtons.vue} +34 -27
  60. package/src/components/ui/ErrorReportModalTitle.vue +24 -0
  61. package/src/components/{forms/AGForm.vue → ui/Form.vue} +4 -5
  62. package/src/components/ui/Input.vue +56 -0
  63. package/src/components/ui/Link.vue +12 -0
  64. package/src/components/ui/LoadingModal.vue +34 -0
  65. package/src/components/ui/Markdown.vue +85 -0
  66. package/src/components/ui/Modal.vue +123 -0
  67. package/src/components/ui/ModalContext.vue +31 -0
  68. package/src/components/ui/ProgressBar.vue +51 -0
  69. package/src/components/ui/PromptModal.vue +38 -0
  70. package/src/components/ui/Select.vue +27 -0
  71. package/src/components/ui/SelectLabel.vue +17 -0
  72. package/src/components/ui/SelectOption.vue +29 -0
  73. package/src/components/ui/SelectOptions.vue +35 -0
  74. package/src/components/ui/SelectTrigger.vue +29 -0
  75. package/src/components/ui/SettingsModal.vue +15 -0
  76. package/src/components/{lib/AGStartupCrash.vue → ui/StartupCrash.vue} +8 -8
  77. package/src/components/ui/Toast.vue +46 -0
  78. package/src/components/ui/index.ts +30 -0
  79. package/src/directives/index.ts +9 -5
  80. package/src/directives/measure.ts +33 -8
  81. package/src/errors/Errors.state.ts +1 -1
  82. package/src/errors/Errors.ts +14 -23
  83. package/src/errors/JobCancelledError.ts +3 -0
  84. package/src/errors/index.ts +9 -6
  85. package/src/errors/utils.ts +17 -1
  86. package/src/forms/FormController.test.ts +110 -0
  87. package/src/forms/{Form.ts → FormController.ts} +64 -42
  88. package/src/forms/index.ts +3 -3
  89. package/src/forms/utils.ts +40 -24
  90. package/src/forms/validation.ts +19 -0
  91. package/src/index.css +73 -0
  92. package/src/jobs/Job.ts +144 -2
  93. package/src/jobs/index.ts +4 -1
  94. package/src/jobs/listeners.ts +3 -0
  95. package/src/jobs/status.ts +4 -0
  96. package/src/lang/DefaultLangProvider.ts +46 -0
  97. package/src/lang/Lang.state.ts +11 -0
  98. package/src/lang/Lang.ts +40 -17
  99. package/src/lang/index.ts +12 -6
  100. package/src/lang/settings/Language.vue +48 -0
  101. package/src/lang/settings/index.ts +10 -0
  102. package/src/plugins/Plugin.ts +1 -1
  103. package/src/plugins/index.ts +10 -7
  104. package/src/services/App.state.ts +23 -4
  105. package/src/services/App.ts +16 -3
  106. package/src/services/Cache.ts +1 -1
  107. package/src/services/Events.test.ts +8 -8
  108. package/src/services/Events.ts +16 -12
  109. package/src/services/Service.ts +125 -54
  110. package/src/services/Storage.ts +20 -0
  111. package/src/services/index.ts +14 -5
  112. package/src/services/utils.ts +18 -0
  113. package/src/testing/index.ts +4 -3
  114. package/src/testing/setup.ts +11 -0
  115. package/src/ui/UI.state.ts +14 -12
  116. package/src/ui/UI.ts +232 -126
  117. package/src/ui/index.ts +28 -28
  118. package/src/ui/utils.ts +16 -0
  119. package/src/utils/classes.ts +41 -0
  120. package/src/utils/composition/events.ts +4 -6
  121. package/src/utils/composition/forms.ts +20 -4
  122. package/src/utils/composition/persistent.test.ts +33 -0
  123. package/src/utils/composition/persistent.ts +11 -0
  124. package/src/utils/composition/state.test.ts +47 -0
  125. package/src/utils/composition/state.ts +33 -0
  126. package/src/utils/index.ts +5 -1
  127. package/src/utils/markdown.test.ts +50 -0
  128. package/src/utils/markdown.ts +19 -6
  129. package/src/utils/types.ts +3 -0
  130. package/src/utils/vue.ts +38 -132
  131. package/dist/aerogel-core.cjs.js +0 -2
  132. package/dist/aerogel-core.cjs.js.map +0 -1
  133. package/dist/aerogel-core.esm.js +0 -2
  134. package/dist/aerogel-core.esm.js.map +0 -1
  135. package/histoire.config.ts +0 -7
  136. package/noeldemartin.config.js +0 -5
  137. package/postcss.config.js +0 -6
  138. package/src/assets/histoire.css +0 -3
  139. package/src/components/AGAppLayout.vue +0 -16
  140. package/src/components/AGAppOverlays.vue +0 -41
  141. package/src/components/AGAppSnackbars.vue +0 -13
  142. package/src/components/constants.ts +0 -8
  143. package/src/components/forms/AGButton.vue +0 -44
  144. package/src/components/forms/AGCheckbox.vue +0 -41
  145. package/src/components/forms/AGInput.vue +0 -40
  146. package/src/components/forms/AGSelect.story.vue +0 -46
  147. package/src/components/forms/AGSelect.vue +0 -60
  148. package/src/components/forms/index.ts +0 -5
  149. package/src/components/headless/forms/AGHeadlessButton.vue +0 -56
  150. package/src/components/headless/forms/AGHeadlessInput.ts +0 -33
  151. package/src/components/headless/forms/AGHeadlessInput.vue +0 -64
  152. package/src/components/headless/forms/AGHeadlessSelect.ts +0 -42
  153. package/src/components/headless/forms/AGHeadlessSelect.vue +0 -77
  154. package/src/components/headless/forms/AGHeadlessSelectButton.vue +0 -24
  155. package/src/components/headless/forms/AGHeadlessSelectLabel.vue +0 -24
  156. package/src/components/headless/forms/AGHeadlessSelectOption.ts +0 -4
  157. package/src/components/headless/forms/AGHeadlessSelectOption.vue +0 -39
  158. package/src/components/headless/forms/AGHeadlessSelectOptions.ts +0 -3
  159. package/src/components/headless/forms/composition.ts +0 -10
  160. package/src/components/headless/forms/index.ts +0 -17
  161. package/src/components/headless/modals/AGHeadlessModal.ts +0 -34
  162. package/src/components/headless/modals/AGHeadlessModal.vue +0 -86
  163. package/src/components/headless/modals/AGHeadlessModalPanel.vue +0 -28
  164. package/src/components/headless/modals/AGHeadlessModalTitle.vue +0 -13
  165. package/src/components/headless/modals/index.ts +0 -4
  166. package/src/components/headless/snackbars/AGHeadlessSnackbar.vue +0 -10
  167. package/src/components/headless/snackbars/index.ts +0 -40
  168. package/src/components/interfaces.ts +0 -9
  169. package/src/components/lib/AGErrorMessage.vue +0 -16
  170. package/src/components/lib/AGLink.vue +0 -9
  171. package/src/components/lib/AGMarkdown.vue +0 -41
  172. package/src/components/lib/AGMeasured.vue +0 -15
  173. package/src/components/lib/index.ts +0 -5
  174. package/src/components/modals/AGAlertModal.ts +0 -15
  175. package/src/components/modals/AGAlertModal.vue +0 -14
  176. package/src/components/modals/AGConfirmModal.ts +0 -33
  177. package/src/components/modals/AGConfirmModal.vue +0 -26
  178. package/src/components/modals/AGErrorReportModal.ts +0 -46
  179. package/src/components/modals/AGErrorReportModal.vue +0 -54
  180. package/src/components/modals/AGErrorReportModalTitle.vue +0 -25
  181. package/src/components/modals/AGLoadingModal.ts +0 -23
  182. package/src/components/modals/AGLoadingModal.vue +0 -15
  183. package/src/components/modals/AGModal.ts +0 -10
  184. package/src/components/modals/AGModal.vue +0 -39
  185. package/src/components/modals/AGModalContext.ts +0 -8
  186. package/src/components/modals/AGModalContext.vue +0 -22
  187. package/src/components/modals/AGModalTitle.vue +0 -9
  188. package/src/components/modals/AGPromptModal.ts +0 -36
  189. package/src/components/modals/AGPromptModal.vue +0 -34
  190. package/src/components/modals/index.ts +0 -17
  191. package/src/components/snackbars/AGSnackbar.vue +0 -36
  192. package/src/components/snackbars/index.ts +0 -3
  193. package/src/components/utils.ts +0 -10
  194. package/src/directives/initial-focus.ts +0 -11
  195. package/src/forms/Form.test.ts +0 -58
  196. package/src/forms/composition.ts +0 -6
  197. package/src/main.histoire.ts +0 -1
  198. package/src/utils/tailwindcss.test.ts +0 -26
  199. package/src/utils/tailwindcss.ts +0 -7
  200. package/tailwind.config.js +0 -4
  201. package/tsconfig.json +0 -11
  202. package/vite.config.ts +0 -14
  203. /package/src/{main.ts → index.ts} +0 -0
@@ -1,24 +1,22 @@
1
1
  import { onUnmounted } from 'vue';
2
2
 
3
- import Events from '@/services/Events';
3
+ import Events from '@aerogel/core/services/Events';
4
4
  import type {
5
5
  EventListener,
6
6
  EventWithPayload,
7
7
  EventWithoutPayload,
8
8
  EventsPayload,
9
- UnknownEvent,
10
- } from '@/services/Events';
9
+ } from '@aerogel/core/services/Events';
11
10
 
12
11
  export function useEvent<Event extends EventWithoutPayload>(event: Event, listener: () => unknown): void;
13
12
  export function useEvent<Event extends EventWithPayload>(
14
13
  event: Event,
15
14
  listener: EventListener<EventsPayload[Event]>
16
15
  ): void;
17
- export function useEvent<Payload>(event: string, listener: (payload: Payload) => unknown): void;
18
- export function useEvent<Event extends string>(event: UnknownEvent<Event>, listener: EventListener): void;
19
16
 
20
17
  export function useEvent(event: string, listener: EventListener): void {
21
- const unsubscribe = Events.on(event, listener);
18
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
19
+ const unsubscribe = Events.on(event as any, listener);
22
20
 
23
21
  onUnmounted(() => unsubscribe());
24
22
  }
@@ -1,11 +1,27 @@
1
1
  import { objectWithout } from '@noeldemartin/utils';
2
- import { computed, useAttrs } from 'vue';
2
+ import { computed, inject, onUnmounted, useAttrs } from 'vue';
3
+ import type { ClassValue } from 'clsx';
3
4
  import type { ComputedRef } from 'vue';
5
+ import type { Nullable } from '@noeldemartin/utils';
4
6
 
5
- export function useInputAttrs(): [ComputedRef<{}>, ComputedRef<unknown>] {
7
+ import FormController from '@aerogel/core/forms/FormController';
8
+ import type { FormData, FormFieldDefinitions } from '@aerogel/core/forms/FormController';
9
+
10
+ export function onFormFocus(input: { name: Nullable<string> }, listener: () => unknown): void {
11
+ const form = inject<FormController | null>('form', null);
12
+ const stop = form?.on('focus', (name) => input.name === name && listener());
13
+
14
+ onUnmounted(() => stop?.());
15
+ }
16
+
17
+ export function useForm<const T extends FormFieldDefinitions>(fields: T): FormController<T> & FormData<T> {
18
+ return new FormController(fields) as FormController<T> & FormData<T>;
19
+ }
20
+
21
+ export function useInputAttrs(): [ComputedRef<{}>, ComputedRef<ClassValue>] {
6
22
  const attrs = useAttrs();
7
- const className = computed(() => attrs.class);
23
+ const classes = computed(() => attrs.class);
8
24
  const inputAttrs = computed(() => objectWithout(attrs, 'class'));
9
25
 
10
- return [inputAttrs, className];
26
+ return [inputAttrs, classes as ComputedRef<ClassValue>];
11
27
  }
@@ -0,0 +1,33 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { nextTick } from 'vue';
3
+ import { Storage } from '@noeldemartin/utils';
4
+
5
+ import { persistent } from './persistent';
6
+
7
+ describe('Vue persistent helper', () => {
8
+
9
+ it('serializes to localStorage', async () => {
10
+ // Arrange
11
+ const store = persistent<{ foo?: string }>('foobar', {});
12
+
13
+ // Act
14
+ store.foo = 'bar';
15
+
16
+ await nextTick();
17
+
18
+ // Assert
19
+ expect(Storage.get('foobar')).toEqual({ foo: 'bar' });
20
+ });
21
+
22
+ it('reads from localStorage', async () => {
23
+ // Arrange
24
+ Storage.set('foobar', { foo: 'bar' });
25
+
26
+ // Act
27
+ const store = persistent<{ foo?: string }>('foobar', {});
28
+
29
+ // Assert
30
+ expect(store.foo).toEqual('bar');
31
+ });
32
+
33
+ });
@@ -0,0 +1,11 @@
1
+ import { reactive, toRaw, watch } from 'vue';
2
+ import { Storage } from '@noeldemartin/utils';
3
+ import type { UnwrapNestedRefs } from 'vue';
4
+
5
+ export function persistent<T extends object>(name: string, defaults: T): UnwrapNestedRefs<T> {
6
+ const store = reactive<T>(Storage.get<T>(name) ?? defaults);
7
+
8
+ watch(store, () => Storage.set(name, toRaw(store)));
9
+
10
+ return store;
11
+ }
@@ -0,0 +1,47 @@
1
+ import { after } from '@noeldemartin/utils';
2
+ import { describe, expect, it } from 'vitest';
3
+ import { ref } from 'vue';
4
+
5
+ import { computedDebounce } from './state';
6
+
7
+ describe('Vue state helpers', () => {
8
+
9
+ it('computes debounced state', async () => {
10
+ // Initial
11
+ const state = ref(0);
12
+ const value = computedDebounce({ delay: 90 }, () => state.value);
13
+
14
+ expect(value.value).toBe(null);
15
+
16
+ await after({ ms: 100 });
17
+
18
+ expect(value.value).toBe(0);
19
+
20
+ // Update
21
+ state.value = 42;
22
+
23
+ expect(value.value).toBe(0);
24
+
25
+ await after({ ms: 100 });
26
+
27
+ expect(value.value).toBe(42);
28
+
29
+ // Debounced Update
30
+ state.value = 23;
31
+
32
+ expect(value.value).toBe(42);
33
+
34
+ await after({ ms: 50 });
35
+
36
+ state.value = 32;
37
+
38
+ await after({ ms: 50 });
39
+
40
+ expect(value.value).toBe(42);
41
+
42
+ await after({ ms: 100 });
43
+
44
+ expect(value.value).toBe(32);
45
+ });
46
+
47
+ });
@@ -0,0 +1,33 @@
1
+ import { debounce } from '@noeldemartin/utils';
2
+ import { computed, ref, watch, watchEffect } from 'vue';
3
+ import type { ComputedGetter, ComputedRef, Ref } from 'vue';
4
+
5
+ export interface ComputedDebounceOptions<T> {
6
+ initial?: T;
7
+ delay?: number;
8
+ }
9
+
10
+ export function computedAsync<T>(getter: () => Promise<T>): Ref<T | undefined> {
11
+ const result = ref<T>();
12
+ const asyncValue = computed(getter);
13
+
14
+ watch(asyncValue, async () => (result.value = await asyncValue.value), { immediate: true });
15
+
16
+ return result;
17
+ }
18
+
19
+ export function computedDebounce<T>(options: ComputedDebounceOptions<T>, getter: ComputedGetter<T>): ComputedRef<T>;
20
+ export function computedDebounce<T>(getter: ComputedGetter<T>): ComputedRef<T | null>;
21
+ export function computedDebounce<T>(
22
+ optionsOrGetter: ComputedGetter<T> | ComputedDebounceOptions<T>,
23
+ inputGetter?: ComputedGetter<T>,
24
+ ): ComputedRef<T> {
25
+ const inputOptions = inputGetter ? (optionsOrGetter as ComputedDebounceOptions<T>) : {};
26
+ const getter = inputGetter ?? (optionsOrGetter as ComputedGetter<T>);
27
+ const state = ref(inputOptions.initial ?? null);
28
+ const update = debounce((value) => (state.value = value), inputOptions.delay ?? 300);
29
+
30
+ watchEffect(() => update(getter()));
31
+
32
+ return state as unknown as ComputedRef<T>;
33
+ }
@@ -1,5 +1,9 @@
1
+ export * from './classes';
1
2
  export * from './composition/events';
2
3
  export * from './composition/forms';
3
4
  export * from './composition/hooks';
4
- export * from './tailwindcss';
5
+ export * from './composition/persistent';
6
+ export * from './composition/state';
7
+ export * from './markdown';
8
+ export * from './types';
5
9
  export * from './vue';
@@ -0,0 +1,50 @@
1
+ /* eslint-disable max-len */
2
+ import { describe, expect, it } from 'vitest';
3
+
4
+ import { renderMarkdown } from './markdown';
5
+
6
+ describe('Markdown utils', () => {
7
+
8
+ it('renders basic markdown', () => {
9
+ // Arrange
10
+ const expectedHTML = `
11
+ <h1>Title</h1>
12
+ <p>body with <a target="_blank" href="https://example.com">link</a></p>
13
+ <ul>
14
+ <li>One</li>
15
+ <li>Two</li>
16
+ <li>Three</li>
17
+ </ul>
18
+ `;
19
+
20
+ // Act
21
+ const html = renderMarkdown(
22
+ ['# Title', 'body with [link](https://example.com)', '- One', '- Two', '- Three'].join('\n'),
23
+ );
24
+
25
+ // Assert
26
+ expect(normalizeHTML(html)).toMatch(new RegExp(normalizeHTML(expectedHTML)));
27
+ });
28
+
29
+ it('renders button links', () => {
30
+ // Arrange
31
+ const expectedHTML = `
32
+ <p><button type="button" data-markdown-action="do-something">link</button></p>
33
+ `;
34
+
35
+ // Act
36
+ const html = renderMarkdown('[link](#action:do-something)');
37
+
38
+ // Assert
39
+ expect(normalizeHTML(html)).toMatch(new RegExp(normalizeHTML(expectedHTML)));
40
+ });
41
+
42
+ });
43
+
44
+ function normalizeHTML(html: string): string {
45
+ return html
46
+ .split('\n')
47
+ .map((line) => line.trim())
48
+ .join('\n')
49
+ .trim();
50
+ }
@@ -1,21 +1,34 @@
1
- import { tap } from '@noeldemartin/utils';
2
1
  import DOMPurify from 'dompurify';
2
+ import { stringMatchAll, tap } from '@noeldemartin/utils';
3
3
  import { Renderer, marked } from 'marked';
4
4
 
5
5
  function makeRenderer(): Renderer {
6
6
  return tap(new Renderer(), (renderer) => {
7
- renderer.link = function(href, title, text) {
8
- return Renderer.prototype.link.apply(this, [href, title, text]).replace('<a', '<a target="_blank"');
7
+ renderer.link = function(link) {
8
+ return Renderer.prototype.link.apply(this, [link]).replace('<a', '<a target="_blank"');
9
9
  };
10
10
  });
11
11
  }
12
12
 
13
+ function renderActionLinks(html: string): string {
14
+ const matches = stringMatchAll<3>(html, /<a[^>]*href="#action:([^"]+)"[^>]*>([^<]+)<\/a>/g);
15
+
16
+ for (const [link, action, text] of matches) {
17
+ html = html.replace(link, `<button type="button" data-markdown-action="${action}">${text}</button>`);
18
+ }
19
+
20
+ return html;
21
+ }
22
+
13
23
  export function renderMarkdown(markdown: string): string {
14
- return safeHtml(marked(markdown, { mangle: false, headerIds: false, renderer: makeRenderer() }));
24
+ let html = marked(markdown, { renderer: makeRenderer(), async: false });
25
+
26
+ html = safeHtml(html);
27
+ html = renderActionLinks(html);
28
+
29
+ return html;
15
30
  }
16
31
 
17
32
  export function safeHtml(html: string): string {
18
- // TODO improve target="_blank" exception
19
- // See https://github.com/cure53/DOMPurify/issues/317
20
33
  return DOMPurify.sanitize(html, { ADD_ATTR: ['target'] });
21
34
  }
@@ -0,0 +1,3 @@
1
+ import type { Nullable } from '@noeldemartin/utils';
2
+
3
+ export type Falsifiable<T> = Nullable<T> | false;
package/src/utils/vue.ts CHANGED
@@ -1,61 +1,26 @@
1
- import { fail } from '@noeldemartin/utils';
2
- import { computed, inject, reactive, ref, watch } from 'vue';
3
- import type { Directive, InjectionKey, PropType, Ref, UnwrapNestedRefs } from 'vue';
4
-
5
- type BaseProp<T> = {
6
- type?: PropType<T>;
7
- validator?(value: unknown): boolean;
8
- };
9
-
10
- type RequiredProp<T> = BaseProp<T> & { required: true };
11
- type OptionalProp<T> = BaseProp<T> & { default: T | (() => T) | null };
12
-
13
- export type ComponentProps = Record<string, unknown>;
14
-
15
- export function arrayProp<T>(defaultValue?: () => T[]): OptionalProp<T[]> {
16
- return {
17
- type: Array as PropType<T[]>,
18
- default: defaultValue ?? (() => []),
19
- };
20
- }
21
-
22
- export function booleanProp(defaultValue: boolean = false): OptionalProp<boolean> {
23
- return {
24
- type: Boolean,
25
- default: defaultValue,
26
- };
27
- }
28
-
29
- export function componentRef<T>(): Ref<UnwrapNestedRefs<T> | undefined> {
30
- return ref<UnwrapNestedRefs<T>>();
31
- }
32
-
33
- export function computedAsync<T>(getter: () => Promise<T>): Ref<T | undefined> {
34
- const result = ref<T>();
35
- const asyncValue = computed(getter);
36
-
37
- watch(asyncValue, async () => (result.value = await asyncValue.value), { immediate: true });
38
-
39
- return result;
40
- }
41
-
42
- export function defineDirective(directive: Directive): Directive {
1
+ import { fail, toString } from '@noeldemartin/utils';
2
+ import { Comment, Static, Text, inject, reactive } from 'vue';
3
+ import type { Directive, InjectionKey, MaybeRef, Ref, UnwrapNestedRefs, VNode } from 'vue';
4
+
5
+ export type AcceptRefs<T> = { [K in keyof T]: T[K] | RefUnion<T[K]> };
6
+ export type RefUnion<T> = T extends infer R ? Ref<R> : never;
7
+ export type Unref<T> = { [K in keyof T]: T[K] extends MaybeRef<infer Value> ? Value : T[K] };
8
+
9
+ function renderVNodeAttrs(node: VNode): string {
10
+ return Object.entries(node.props ?? {}).reduce((attrs, [name, value]) => {
11
+ return attrs + `${name}="${toString(value)}"`;
12
+ }, '');
13
+ }
14
+
15
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
16
+ export function defineDirective<TValue = any, TModifiers extends string = string>(
17
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
18
+ directive: Directive<any, TValue, TModifiers>,
19
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
20
+ ): Directive<any, TValue, TModifiers> {
43
21
  return directive;
44
22
  }
45
23
 
46
- export function enumProp<Enum extends Record<string, unknown>>(
47
- enumeration: Enum,
48
- defaultValue?: Enum[keyof Enum],
49
- ): OptionalProp<Enum[keyof Enum]> {
50
- const values = Object.values(enumeration) as Enum[keyof Enum][];
51
-
52
- return {
53
- type: String as unknown as PropType<Enum[keyof Enum]>,
54
- default: defaultValue ?? values[0] ?? null,
55
- validator: (value) => values.includes(value as Enum[keyof Enum]),
56
- };
57
- }
58
-
59
24
  export function injectReactive<T extends object>(key: InjectionKey<T> | string): UnwrapNestedRefs<T> | undefined {
60
25
  const value = inject(key);
61
26
 
@@ -66,90 +31,31 @@ export function injectReactiveOrFail<T extends object>(
66
31
  key: InjectionKey<T> | string,
67
32
  errorMessage?: string,
68
33
  ): UnwrapNestedRefs<T> {
69
- return injectReactive(key) ?? fail(errorMessage ?? `Could not resolve '${key}' injection key`);
34
+ return injectReactive(key) ?? fail(errorMessage ?? `Could not resolve '${toString(key)}' injection key`);
70
35
  }
71
36
 
72
37
  export function injectOrFail<T>(key: InjectionKey<T> | string, errorMessage?: string): T {
73
- return inject(key) ?? fail(errorMessage ?? `Could not resolve '${key}' injection key`);
74
- }
75
-
76
- export function mixedProp<T>(type?: PropType<T>): OptionalProp<T | null> {
77
- return {
78
- type,
79
- default: null,
80
- };
81
- }
82
-
83
- export function numberProp(): OptionalProp<number | null>;
84
- export function numberProp(defaultValue: number): OptionalProp<number>;
85
- export function numberProp(defaultValue: number | null = null): OptionalProp<number | null> {
86
- return {
87
- type: Number,
88
- default: defaultValue,
89
- };
90
- }
91
-
92
- export function objectProp<T = Object>(): OptionalProp<T | null>;
93
- export function objectProp<T>(defaultValue: () => T): OptionalProp<T>;
94
- export function objectProp<T = Object>(defaultValue: (() => T) | null = null): OptionalProp<T | null> {
95
- return {
96
- type: Object,
97
- default: defaultValue,
98
- };
99
- }
100
-
101
- export function requiredArrayProp<T>(): RequiredProp<T[]> {
102
- return {
103
- type: Array as PropType<T[]>,
104
- required: true,
105
- };
106
- }
107
-
108
- export function requiredEnumProp<Enum extends Record<string, unknown>>(
109
- enumeration: Enum,
110
- ): RequiredProp<Enum[keyof Enum]> {
111
- const values = Object.values(enumeration);
112
-
113
- return {
114
- type: String as unknown as PropType<Enum[keyof Enum]>,
115
- required: true,
116
- validator: (value) => values.includes(value),
117
- };
38
+ return inject(key) ?? fail(errorMessage ?? `Could not resolve '${toString(key)}' injection key`);
118
39
  }
119
40
 
120
- export function requiredMixedProp<T>(type?: PropType<T>): RequiredProp<T> {
121
- return {
122
- type,
123
- required: true,
124
- };
125
- }
41
+ export function renderVNode(node: VNode | string): string {
42
+ if (typeof node === 'string') {
43
+ return node;
44
+ }
126
45
 
127
- export function requiredNumberProp(): RequiredProp<number> {
128
- return {
129
- type: Number,
130
- required: true,
131
- };
132
- }
46
+ if (node.type === Comment) {
47
+ return '';
48
+ }
133
49
 
134
- export function requiredObjectProp<T = Object>(): RequiredProp<T> {
135
- return {
136
- type: Object,
137
- required: true,
138
- };
139
- }
50
+ if (node.type === Text || node.type === Static) {
51
+ return node.children as string;
52
+ }
140
53
 
141
- export function requiredStringProp(): RequiredProp<string> {
142
- return {
143
- type: String,
144
- required: true,
145
- };
146
- }
54
+ if (node.type === 'br') {
55
+ return '\n\n';
56
+ }
147
57
 
148
- export function stringProp(): OptionalProp<string | null>;
149
- export function stringProp(defaultValue: string): OptionalProp<string>;
150
- export function stringProp(defaultValue: string | null = null): OptionalProp<string | null> {
151
- return {
152
- type: String,
153
- default: defaultValue,
154
- };
58
+ return `<${node.type} ${renderVNodeAttrs(node)}>${Array.from(node.children as Array<VNode | string>)
59
+ .map(renderVNode)
60
+ .join('')}</${node.type}>`;
155
61
  }
@@ -1,2 +0,0 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("vue");require("core-js/modules/esnext.async-iterator.reduce.js"),require("core-js/modules/esnext.iterator.constructor.js"),require("core-js/modules/esnext.iterator.reduce.js"),require("core-js/modules/esnext.async-iterator.map.js"),require("core-js/modules/esnext.iterator.map.js");var t=require("@babel/runtime/helpers/defineProperty"),r=require("virtual:aerogel"),o=require("@noeldemartin/utils");require("core-js/modules/esnext.async-iterator.for-each.js"),require("core-js/modules/esnext.iterator.for-each.js"),require("core-js/modules/esnext.set.add-all.js"),require("core-js/modules/esnext.set.delete-all.js"),require("core-js/modules/esnext.set.difference.js"),require("core-js/modules/esnext.set.every.js"),require("core-js/modules/esnext.set.filter.js"),require("core-js/modules/esnext.set.find.js"),require("core-js/modules/esnext.set.intersection.js"),require("core-js/modules/esnext.set.is-disjoint-from.js"),require("core-js/modules/esnext.set.is-subset-of.js"),require("core-js/modules/esnext.set.is-superset-of.js"),require("core-js/modules/esnext.set.join.js"),require("core-js/modules/esnext.set.map.js"),require("core-js/modules/esnext.set.reduce.js"),require("core-js/modules/esnext.set.some.js"),require("core-js/modules/esnext.set.symmetric-difference.js"),require("core-js/modules/esnext.set.union.js");var s=require("pinia");require("core-js/modules/esnext.async-iterator.filter.js"),require("core-js/modules/esnext.iterator.filter.js"),require("core-js/modules/esnext.string.at.js"),require("core-js/modules/esnext.async-iterator.some.js"),require("core-js/modules/esnext.iterator.some.js");var n=require("@headlessui/vue"),a=require("dompurify"),l=require("marked");function i(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}require("core-js/modules/esnext.weak-map.delete-all.js"),require("core-js/modules/esnext.weak-map.emplace.js");var c=i(t),u=i(r),d=i(a);class ServiceBootError extends o.JSError{constructor(e,t){super(`Service '${e}' failed booting`,{cause:t})}}let p=null;function m(){return p??f()}function f(){return o.tap(s.createPinia(),(e=>{p=e,s.setActivePinia(e)}))}function h(){return p??m()}function v(e,t){return m(),s.defineStore(e,t)()}function x(e){var t;return t=class extends g{usesStore(){return!0}getName(){return e.name??null}getInitialState(){return"function"==typeof e.initialState?e.initialState():Object.entries(e.initialState).reduce(((e,t)=>{let[r,o]=t;try{o=structuredClone(o)}catch(e){console.warn(`Could not clone '${r}' 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[r]=o,e}),{})}getComputedStateDefinition(){return e.computed??{}}serializePersistedState(t){return e.serialize?.(t)??t}},c.default(t,"persist",e.persist??[]),t}class g extends o.MagicObject{constructor(){super(),c.default(this,"_name",void 0),c.default(this,"_booted",void 0),c.default(this,"_computedStateKeys",void 0),c.default(this,"_store",void 0);const e=this.getComputedStateDefinition();this._name=this.getName()??new.target.name,this._booted=new o.PromisedValue,this._computedStateKeys=new Set(Object.keys(e)),this._store=this.usesStore()&&v(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 o.Storage.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 r="string"==typeof e?{[e]:t}:e;Object.assign(this._store.$state,r),this.onStateUpdated(r)}__get(e){return this.hasState(e)?this.getState(e):super.__get(e)}__set(e,t){this.setState({[e]:t})}onStateUpdated(e){const t=this.constructor.persist,r=o.objectOnly(e,t);if(o.isEmpty(r))return;const s=o.Storage.get(this._name);s&&o.Storage.set(this._name,{...s,...this.serializePersistedState(o.objectDeepClone(r))})}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()&&!o.isEmpty(e))if(o.Storage.has(this._name)){const e=o.Storage.require(this._name);this.setState(e)}else o.Storage.set(this._name,o.objectOnly(this.getState(),e))}}c.default(g,"persist",[]);class b extends g{constructor(){super(...arguments),c.default(this,"listeners",{})}async boot(){Object.entries(globalThis.__aerogelEvents__??{}).forEach((e=>{let[t,r]=e;return this.on(t,r)}))}async emit(e,t){const r=this.listeners[e]??{priorities:[],handlers:{}};for(const e of r.priorities)await Promise.all(r.handlers[e]?.map((e=>e(t)))??[])}on(e,t,r){const o="function"==typeof t?{}:t,s="function"==typeof t?t:r;return this.registerListener(e,o,s),()=>this.off(e,s)}once(e,t,r){let s=null;const n="function"==typeof t?{}:t,a="function"==typeof t?t:r;return o.tap((()=>s&&this.off(e,s)),(t=>{s=function(){return t(),a(...arguments)},this.registerListener(e,n,a)}))}off(e,t){const r=this.listeners[e];if(!r)return;const s=[...r.priorities];for(const e of s)o.arrayRemove(r.handlers[e]??[],t),0===r.handlers[e]?.length&&(delete r.handlers[e],o.arrayRemove(r.priorities,e));0===r.priorities.length&&delete this.listeners[e]}registerListener(e,t,r){const s=t.priority??0;e in this.listeners||(this.listeners[e]={priorities:[],handlers:{}});const n=this.listeners[e]?.priorities??o.fail(`priorities missing for event '${e}'`),a=this.listeners[e]?.handlers??o.fail(`handlers missing for event '${e}'`);n.includes(s)||(n.push(s),n.sort(((e,t)=>t-e)),a[s]=[]),a[s]?.push(r)}}var _=o.facade(b),y=x({name:"app",initialState:{plugins:{},environment:u.default.environment,version:u.default.version,sourceUrl:u.default.sourceUrl},computed:{development:e=>"development"===e.environment,testing:e=>"test"===e.environment||"testing"===e.environment,versionName(e){return this.development?"dev."+u.default.sourceHash.toString().substring(0,7):`v${e.version}`},versionUrl(e){return e.sourceUrl+(this.development?`/tree/${u.default.sourceHash}`:`/releases/tag/${this.versionName}`)}}});class k extends y{constructor(){super(...arguments),c.default(this,"name",u.default.name),c.default(this,"ready",new o.PromisedValue),c.default(this,"mounted",new o.PromisedValue)}isReady(){return this.ready.isResolved()}isMounted(){return this.mounted.isResolved()}async whenReady(e){return await this.ready.then(e)}async reload(e){e&&o.updateLocationQueryParameters(e),location.reload(),await o.forever()}plugin(e){return this.plugins[e]??null}async boot(){_.once("application-ready",(()=>this.ready.resolve())),_.once("application-mounted",(()=>this.mounted.resolve()))}}var C=o.facade(k);function w(e){return e}async function S(e){for(var t=arguments.length,r=new Array(t>1?t-1:0),o=1;o<t;o++)r[o-1]=arguments[o];C.setState("plugins",e.reduce(((e,t)=>(t.name&&(e[t.name]=t),e)),{})),await Promise.all(e.map((e=>e.install(...r)))??[])}function A(e){return{type:Array,default:e??(()=>[])}}function E(){return{type:Boolean,default:arguments.length>0&&void 0!==arguments[0]&&arguments[0]}}function B(){return e.ref()}function G(e){return e}function j(e,t){const r=Object.values(e);return{type:String,default:t??r[0]??null,validator:e=>r.includes(e)}}function V(t){const r=e.inject(t);return r?e.reactive(r):void 0}function M(e,t){return V(e)??o.fail(t??`Could not resolve '${e}' injection key`)}function $(e){return{type:e,default:null}}function P(){return{type:Number,default:arguments.length>0&&void 0!==arguments[0]?arguments[0]:null}}function N(){return{type:Object,default:arguments.length>0&&void 0!==arguments[0]?arguments[0]:null}}function H(){return{type:Array,required:!0}}function T(e){return{type:e,required:!0}}function q(){return{type:Number,required:!0}}function I(){return{type:Object,required:!0}}function D(){return{type:String,required:!0}}function R(){return{type:String,default:arguments.length>0&&void 0!==arguments[0]?arguments[0]:null}}const L={"initial-focus":{mounted(e,t){let{value:r}=t;!1!==r&&e.focus()}},measure:{mounted(e,t){let{value:r}=t;const o="function"==typeof r?r:null,s=e.getBoundingClientRect();e.style.setProperty("--width",`${s.width}px`),e.style.setProperty("--height",`${s.height}px`),o?.({width:s.width,height:s.height})}}};var O={install(e,t){const r={...L,...t.directives};for(const[t,o]of Object.entries(r))e.directive(t,o)}};class z extends g{constructor(){super(...arguments),c.default(this,"cache",void 0)}async get(e){const t=await this.open();return await t.match(e)??null}async store(e,t){const r=await this.open();await r.put(e,t)}async replace(e,t){const r=await this.open();0!==(await r.keys(e)).length&&await r.put(e,t)}async open(){return this.cache=this.cache??o.tap(new o.PromisedValue,(e=>{caches.open("app").then((t=>e.resolve(t)))}))}}var F=o.facade(z);const U={$app:C,$events:_};async function W(e,t){await Promise.all(Object.entries(t).map((async t=>{let[r,o]=t;await o.launch().catch((t=>e.config.errorHandler?.(t,null,`Failed launching ${r}.`)))}))),Object.assign(e.config.globalProperties,t),C.development&&Object.assign(window,t)}var K={async install(e,t){const r={...U,...t.services};e.use(h()),await W(e,r)}},J=x({name:"ui",initialState:{modals:[],snackbars:[]}});const Q={AlertModal:"alert-modal",ConfirmModal:"confirm-modal",ErrorReportModal:"error-report-modal",LoadingModal:"loading-modal",PromptModal:"prompt-modal",Snackbar:"snackbar",StartupCrash:"startup-crash"};class Z extends J{constructor(){super(...arguments),c.default(this,"modalCallbacks",{}),c.default(this,"components",{})}requireComponent(e){return this.components[e]??o.fail(`UI Component '${e}' is not defined!`)}alert(e,t){this.openModal(this.requireComponent(Q.AlertModal),"string"!=typeof t?{message:e}:{title:e,message:t})}async confirm(e,t,r){const o=await this.openModal(this.requireComponent(Q.ConfirmModal),"string"!=typeof t?{message:e,...t??{}}:{title:e,message:t,...r??{}});return await o.beforeClose??!1}async prompt(e,t,r){const o=r?.trim??!0,s=await this.openModal(this.requireComponent(Q.PromptModal),"string"!=typeof t?{message:e,...t??{}}:{title:e,message:t,...r??{}}),n=await s.beforeClose;return(o&&"string"==typeof n?n?.trim():n)??null}async loading(e,t){const r=await this.openModal(this.requireComponent(Q.LoadingModal),"string"!=typeof e?{}:{message:e});try{t="string"==typeof e?t:e;const[r]=await Promise.all([t,o.after({seconds:1})]);return r}finally{await this.closeModal(r.id)}}showSnackbar(t){let r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const s={id:o.uuid(),properties:{message:t,...r},component:e.markRaw(r.component??this.requireComponent(Q.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(t,r){const s=o.uuid(),n={},a={id:s,properties:r??{},component:e.markRaw(t),beforeClose:new Promise((e=>n.willClose=e)),afterClose:new Promise((e=>n.closed=e))},l=this.modals.at(-1),i=this.modals.concat(a);return this.modalCallbacks[a.id]=n,this.setState({modals:i}),await e.nextTick(),await(l&&_.emit("hide-modal",{id:l.id})),await Promise.all([l||_.emit("show-overlays-backdrop"),_.emit("show-modal",{id:a.id})]),a}async closeModal(e,t){await _.emit("close-modal",{id:e,result:t})}async boot(){this.watchModalEvents(),this.watchMountedEvent()}watchModalEvents(){_.on("modal-will-close",(e=>{let{modal:t,result:r}=e;this.modalCallbacks[t.id]?.willClose?.(r),1===this.modals.length&&_.emit("hide-overlays-backdrop")})),_.on("modal-closed",(async e=>{let{modal:t,result:r}=e;this.setState("modals",this.modals.filter((e=>e.id!==t.id))),this.modalCallbacks[t.id]?.closed?.(r),delete this.modalCallbacks[t.id];const o=this.modals.at(-1);await(o&&_.emit("show-modal",{id:o.id}))}))}watchMountedEvent(){_.once("application-mounted",(async()=>{const e=document.getElementById("splash");e&&("0"!==window.getComputedStyle(e).opacity&&(e.style.opacity="0",await o.after({ms:600})),e.remove())}))}}var Y=o.facade(Z);var X=o.facade(class extends g{constructor(){super(),c.default(this,"provider",void 0),this.provider={translate:e=>(C.development&&console.warn("Lang provider is missing"),e),translateWithDefault:(e,t)=>(C.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 r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return this.provider.translateWithDefault(e,t,r)}});const ee=X.translate.bind(X),te=X.translateWithDefault.bind(X);var re=x({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 oe={Primary:"primary",Secondary:"secondary",Danger:"danger",Clear:"clear"};var se=o.facade(class extends re{constructor(){super(...arguments),c.default(this,"forceReporting",!1),c.default(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?Y.openModal(Y.requireComponent(Q.ErrorReportModal),{reports:t}):Y.alert(te("errors.inspectEmpty","Nothing to inspect!"))}async report(e,t){if(await _.emit("error",{error:e,message:t}),C.testing)throw e;if(C.development&&this.logError(e),!this.enabled)throw e;if(!C.isMounted()){const t=await this.createStartupErrorReport(e);return void(t&&this.setState({startupErrors:this.startupErrors.concat(t)}))}const r=await this.createErrorReport(e),o={report:r,seen:!1,date:new Date};Y.showSnackbar(t??te("errors.notice","Something went wrong, but it's not your fault. Try again!"),{color:oe.Danger,actions:[{text:te("errors.viewDetails","View details"),dismiss:!0,handler:()=>Y.openModal(Y.requireComponent(Q.ErrorReportModal),{reports:[r]})}]}),this.setState({logs:[o].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),o.isObject(e)&&e.cause&&this.logError(e.cause)}async createErrorReport(e){return"string"==typeof e?{title:e}:e instanceof Error||e instanceof o.JSError?this.createErrorReportFromError(e):o.isObject(e)?o.objectWithoutEmpty({title:o.toString(e.name??e.title??te("errors.unknown","Unknown Error")),description:o.toString(e.message??e.description??te("errors.unknownDescription","Unknown error object")),error:e}):{title:te("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 ne(e){return"string"==typeof e?e:e instanceof Error||e instanceof o.JSError?e.message:o.isObject(e)?o.toString(e.message??e.description??"Unknown error object"):te("errors.unknown","Unknown Error")}const ae={$errors:se};function le(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:()=>!1;const r=e=>t(e)||(e=>(se.report(e),!0))(e);e.config.errorHandler=r,globalThis.onerror=(e,t,o,s,n)=>r(n??e),globalThis.onunhandledrejection=e=>r(e.reason)}var ie={async install(e,t){le(e,t.handleError),await W(e,ae)}};const ce={$lang:X};var ue={async install(e){e.config.globalProperties.$t??=ee,e.config.globalProperties.$td=te,await W(e,ce)}},de={async install(){"testing"===(void 0).MODE&&(globalThis.testingRuntime={on:function(){return _.on(...arguments)}})}};function pe(t,r){const o=_.on(t,r);e.onUnmounted((()=>o()))}function me(){const t=e.useAttrs(),r=e.computed((()=>t.class));return[e.computed((()=>o.objectWithout(t,"class"))),r]}function fe(e,t){return Object.keys(t).reduce(((t,r)=>(t[r]=e[r],t)),{})}const he={cancellable:E(!0),title:R()};function ve(){return he}function xe(t){return{close:async()=>t.value?.close(),cancellable:e.computed((()=>!!t.value?.cancellable))}}var ge=e.defineComponent({__name:"AGHeadlessModal",props:ve(),setup(t,{expose:r}){const o=t,s=e.ref(null),a=e.ref(!0),l=e.ref(!1),{modal:i}=M("modal","could not obtain modal reference from <AGHeadlessModal>, did you render this component manually? Show it using $ui.openModal() instead");async function c(){s.value?.$el&&(a.value=!0)}async function u(e){l.value||(_.emit("modal-will-close",{modal:i,result:e}),await c(),l.value=!0,_.emit("modal-closed",{modal:i,result:e}))}return pe("close-modal",(async({id:e,result:t})=>{e===i.id&&await u(t)})),pe("hide-modal",(async({id:e})=>{e===i.id&&await c()})),pe("show-modal",(async({id:e})=>{e===i.id&&await async function(){s.value?.$el&&(a.value=!1)}()})),r({close:u,cancellable:e.toRef(o,"cancellable")}),(t,r)=>(e.openBlock(),e.createBlock(e.unref(n.Dialog),{ref_key:"$root",ref:s,open:!0,onClose:r[0]||(r[0]=e=>t.cancellable&&u())},{default:e.withCtx((()=>[e.renderSlot(t.$slots,"default",{close:u})])),_:3},512))}});ge.__file="src/components/headless/modals/AGHeadlessModal.vue";var be=e.defineComponent({__name:"AGModalContext",props:{modal:I(),childIndex:q()},setup(t){const r=t;return e.provide("modal",{modal:e.toRef(r,"modal"),childIndex:e.toRef(r,"childIndex")}),(r,o)=>(e.openBlock(),e.createBlock(e.resolveDynamicComponent(t.modal.component),e.normalizeProps(e.guardReactiveProps(t.modal.properties)),null,16))}});be.__file="src/components/modals/AGModalContext.vue";const _e=e.createElementVNode("div",{class:"pointer-events-none fixed inset-0 z-50 bg-black/30"},null,-1);var ye=e.defineComponent({__name:"AGHeadlessModalPanel",setup(t){const r=M("modal","could not obtain modal reference from <AGHeadlessModalPanel>, did you render this component manually? Show it using $ui.openModal() instead"),o=e.computed((()=>Y.modals[r.childIndex]??null));return(t,s)=>(e.openBlock(),e.createBlock(e.unref(n.DialogPanel),null,{default:e.withCtx((()=>[e.renderSlot(t.$slots,"default"),o.value?(e.openBlock(),e.createElementBlock(e.Fragment,{key:0},[_e,e.createVNode(be,{"child-index":e.unref(r).childIndex+1,modal:o.value},null,8,["child-index","modal"])],64)):e.createCommentVNode("v-if",!0)])),_:3}))}});ye.__file="src/components/headless/modals/AGHeadlessModalPanel.vue";var ke=e.defineComponent({__name:"AGHeadlessModalTitle",props:{as:R("h2")},setup:t=>(r,o)=>(e.openBlock(),e.createBlock(e.unref(n.DialogTitle),{as:t.as},{default:e.withCtx((()=>[e.renderSlot(r.$slots,"default")])),_:3},8,["as"]))});function Ce(e){return t=l.marked(e,{mangle:!1,headerIds:!1,renderer:o.tap(new l.Renderer,(e=>{e.link=function(e,t,r){return l.Renderer.prototype.link.apply(this,[e,t,r]).replace("<a",'<a target="_blank"')}}))}),d.default.sanitize(t,{ADD_ATTR:["target"]});var t}ke.__file="src/components/headless/modals/AGHeadlessModalTitle.vue";var we=e.defineComponent({__name:"AGMarkdown",props:{as:R(),inline:E(),langKey:R(),langParams:$(),text:R()},setup(t){const r=t,o=e.useAttrs(),s=e.computed((()=>r.text??(r.langKey&&ee(r.langKey,r.langParams??{})))),n=e.computed((()=>{if(!s.value)return null;let e=Ce(s.value);return r.inline&&(e=e.replace("<p>","<span>").replace("</p>","</span>")),e})),a=()=>e.h(r.as??(r.inline?"span":"div"),{innerHTML:n.value,...o,class:`${o.class??""} ${r.inline?"":"prose"}`});return(t,r)=>(e.openBlock(),e.createBlock(a))}});we.__file="src/components/lib/AGMarkdown.vue";const Se={class:"fixed inset-0 flex items-center justify-center p-8"};var Ae=e.defineComponent({inheritAttrs:!1,__name:"AGModal",props:ve(),setup(t,{expose:r}){const o=t,s=e.ref();return r(xe(s)),(t,r)=>(e.openBlock(),e.createBlock(ge,e.mergeProps({ref_key:"$modal",ref:s},o,{class:"relative z-50"}),{default:e.withCtx((({close:r})=>[e.createElementVNode("div",Se,[e.createVNode(ye,{class:"flex max-h-full max-w-full flex-col overflow-hidden bg-white p-4"},{default:e.withCtx((()=>[t.title?(e.openBlock(),e.createBlock(ke,{key:0,class:"mb-2 text-lg font-semibold"},{default:e.withCtx((()=>[e.createVNode(we,{text:t.title,inline:""},null,8,["text"])])),_:1})):e.createCommentVNode("v-if",!0),e.createElementVNode("div",e.mergeProps({class:"flex max-h-full flex-col overflow-auto"},t.$attrs),[e.renderSlot(t.$slots,"default",{close:r})],16)])),_:2},1024)])])),_:3},16))}});Ae.__file="src/components/modals/AGModal.vue";const Ee={title:R(),message:D()};function Be(){return Ee}var Ge=e.defineComponent({__name:"AGAlertModal",props:Be(),setup:t=>(t,r)=>(e.openBlock(),e.createBlock(Ae,{title:t.title},{default:e.withCtx((()=>[e.createVNode(we,{text:t.message},null,8,["text"])])),_:1},8,["title"]))});Ge.__file="src/components/modals/AGAlertModal.vue";const je={title:R(),message:D(),acceptText:R(),acceptColor:j(oe,oe.Primary),cancelText:R(),cancelColor:j(oe,oe.Clear)};function Ve(){return je}function Me(t){return{renderedAcceptText:e.computed((()=>t.acceptText??te("ui.accept","Ok"))),renderedCancelText:e.computed((()=>t.cancelText??te("ui.cancel","Cancel")))}}var $e=e.defineComponent({__name:"AGHeadlessButton",props:{as:N(),href:R(),url:R(),route:R(),routeParams:N((()=>({}))),routeQuery:N((()=>({}))),submit:E()},setup(t){const r=t,s=e.computed((()=>r.as?{as:r.as,props:{}}:r.route?{as:"router-link",props:{to:o.objectWithoutEmpty({name:r.route,params:r.routeParams,query:r.routeQuery})}}:r.href||r.url?{as:"a",props:{target:"_blank",href:r.href||r.url}}:{as:"button",props:{type:r.submit?"submit":"button"}}));return(t,r)=>(e.openBlock(),e.createBlock(e.resolveDynamicComponent(s.value.as),e.normalizeProps(e.guardReactiveProps(s.value.props)),{default:e.withCtx((()=>[e.renderSlot(t.$slots,"default")])),_:3},16))}});$e.__file="src/components/headless/forms/AGHeadlessButton.vue";var Pe=e.defineComponent({__name:"AGButton",props:{color:j(oe,oe.Primary)},setup(t){const r=t,o=e.computed((()=>{switch(r.color){case oe.Secondary:return["text-white bg-gray-600","hover:bg-gray-500","focus-visible:outline-offset-2 focus-visible:outline-gray-600"].join(" ");case oe.Clear:return"hover:bg-gray-500/20 focus-visible:outline-gray-500/60";case oe.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(t,r)=>(e.openBlock(),e.createBlock($e,{class:e.normalizeClass(["px-2.5 py-1.5 focus-visible:outline focus-visible:outline-2",o.value])},{default:e.withCtx((()=>[e.renderSlot(t.$slots,"default")])),_:3},8,["class"]))}});Pe.__file="src/components/forms/AGButton.vue";const Ne={class:"mt-2 flex flex-row-reverse gap-2"};var He=e.defineComponent({__name:"AGConfirmModal",props:Ve(),setup(t){const r=t,{renderedAcceptText:o,renderedCancelText:s}=Me(r);return(t,r)=>(e.openBlock(),e.createBlock(Ae,{cancellable:!1,title:t.title},{default:e.withCtx((({close:r})=>[e.createVNode(we,{text:t.message},null,8,["text"]),e.createElementVNode("div",Ne,[e.createVNode(Pe,{color:t.acceptColor,onClick:e=>r(!0)},{default:e.withCtx((()=>[e.createTextVNode(e.toDisplayString(e.unref(o)),1)])),_:2},1032,["color","onClick"]),e.createVNode(Pe,{color:t.cancelColor,onClick:e=>r()},{default:e.withCtx((()=>[e.createTextVNode(e.toDisplayString(e.unref(s)),1)])),_:2},1032,["color","onClick"])])])),_:1},8,["title"]))}});He.__file="src/components/modals/AGConfirmModal.vue";const Te={viewBox:"0 0 20 20",width:"1.2em",height:"1.2em"},qe=[e.createElementVNode("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 Ie={name:"zondicons-cheveron-right",render:function(t,r){return e.openBlock(),e.createElementBlock("svg",Te,[...qe])}};const De={viewBox:"0 0 20 20",width:"1.2em",height:"1.2em"},Re=[e.createElementVNode("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 Le={name:"zondicons-cheveron-left",render:function(t,r){return e.openBlock(),e.createElementBlock("svg",De,[...Re])}};const Oe={reports:H()};function ze(){return Oe}function Fe(t){const r=e.ref(0),o=e.computed((()=>t.reports[r.value])),s=e.computed((()=>o.value.details?.trim()||te("errors.detailsEmpty","This error is missing a stacktrace."))),n=te("errors.previousReport","Show previous report"),a=te("errors.nextReport","Show next report");return{activeReportIndex:r,details:s,nextReportText:a,previousReportText:n,report:o}}const Ue={viewBox:"0 0 24 24",width:"1.2em",height:"1.2em"},We=[e.createElementVNode("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 Ke={name:"mdi-console",render:function(t,r){return e.openBlock(),e.createElementBlock("svg",Ue,[...We])}};const Je={viewBox:"0 0 20 20",width:"1.2em",height:"1.2em"},Qe=[e.createElementVNode("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 Ze={name:"zondicons-copy",render:function(t,r){return e.openBlock(),e.createElementBlock("svg",Je,[...Qe])}};const Ye={viewBox:"0 0 24 24",width:"1.2em",height:"1.2em"},Xe=[e.createElementVNode("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 et={name:"mdi-github",render:function(t,r){return e.openBlock(),e.createElementBlock("svg",Ye,[...Xe])}};const tt={class:"flex"};var rt=e.defineComponent({__name:"AGErrorReportModalButtons",props:{report:I()},setup(t){const r=t,s=e.computed((()=>r.report.description?`${r.report.title}: ${r.report.description}`:r.report.title)),n=e.computed((()=>{if(!C.sourceUrl)return!1;const e=encodeURIComponent(s.value),t=encodeURIComponent(["[Please, explain here what you were trying to do when this error appeared]","","Error details:","```",o.stringExcerpt(r.report.details??"Details missing from report",1800-e.length-C.sourceUrl.length).trim(),"```"].join("\n"));return`${C.sourceUrl}/issues/new?title=${e}&body=${t}`})),a=e.computed((()=>o.tap([{id:"clipboard",description:"Copy to clipboard",iconComponent:Ze,async handler(){await navigator.clipboard.writeText(`${s.value}\n\n${r.report.details}`),Y.showSnackbar(te("errors.copiedToClipboard","Debug information copied to clipboard"))}},{id:"console",description:"Log to console",iconComponent:Ke,handler(){const e=r.report.error??r.report;window.error=e,console.error(e),Y.showSnackbar(te("errors.addedToConsole","You can now use the **error** variable in the console"))}}],(e=>{n.value&&e.push({id:"github",description:"Report in GitHub",iconComponent:et,url:n.value})}))));return(t,r)=>(e.openBlock(),e.createElementBlock("div",tt,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(a.value,((r,o)=>e.renderSlot(t.$slots,"default",e.mergeProps(r,{key:o}),(()=>[e.createVNode(Pe,{color:"clear",url:r.url,title:t.$td(`errors.report_${r.id}`,r.description),"aria-label":t.$td(`errors.report_${r.id}`,r.description),onClick:r.handler},{default:e.withCtx((()=>[(e.openBlock(),e.createBlock(e.resolveDynamicComponent(r.iconComponent),{class:"h-4 w-4","aria-hidden":"true"}))])),_:2},1032,["url","title","aria-label","onClick"])])))),128))]))}});rt.__file="src/components/modals/AGErrorReportModalButtons.vue";var ot=e.defineComponent({__name:"AGErrorReportModalTitle",props:{report:I(),currentReport:P(),totalReports:P()},setup(t){const r=t,o=e.computed((()=>!r.totalReports||r.totalReports<=1?r.report.title:`${r.report.title} (${r.currentReport}/${r.totalReports})`));return(t,r)=>(e.openBlock(),e.createBlock(we,{text:o.value,inline:""},null,8,["text"]))}});ot.__file="src/components/modals/AGErrorReportModalTitle.vue";const st={class:"flex items-center justify-between text-lg font-medium"},nt={class:"flex items-center"},at=["textContent"];var lt=e.defineComponent({__name:"AGErrorReportModal",props:ze(),setup(t){const r=t,{activeReportIndex:o,details:s,nextReportText:n,previousReportText:a,report:l}=Fe(r);return(t,r)=>(e.openBlock(),e.createBlock(Ae,null,{default:e.withCtx((()=>[e.createElementVNode("div",null,[e.createElementVNode("h2",st,[e.createElementVNode("div",nt,[e.createVNode(ot,{report:e.unref(l),"current-report":e.unref(o)+1,"total-reports":t.reports.length},null,8,["report","current-report","total-reports"]),t.reports.length>1?(e.openBlock(),e.createElementBlock(e.Fragment,{key:0},[e.createVNode(Pe,{color:"clear",disabled:0===e.unref(o),title:e.unref(a),"aria-label":e.unref(a),onClick:r[0]||(r[0]=e=>o.value--)},{default:e.withCtx((()=>[e.createVNode(e.unref(Le),{"aria-hidden":"true",class:"h-4 w-4"})])),_:1},8,["disabled","title","aria-label"]),e.createVNode(Pe,{color:"clear",disabled:e.unref(o)===t.reports.length-1,title:e.unref(n),"aria-label":e.unref(n),onClick:r[1]||(r[1]=e=>o.value++)},{default:e.withCtx((()=>[e.createVNode(e.unref(Ie),{"aria-hidden":"true",class:"h-4 w-4"})])),_:1},8,["disabled","title","aria-label"])],64)):e.createCommentVNode("v-if",!0)]),e.createVNode(rt,{report:e.unref(l)},null,8,["report"])]),e.unref(l).description?(e.openBlock(),e.createBlock(we,{key:0,text:e.unref(l).description,class:"mt-2"},null,8,["text"])):e.createCommentVNode("v-if",!0)]),e.createElementVNode("pre",{class:"h-full overflow-auto bg-gray-200 p-4 text-xs text-red-900",textContent:e.toDisplayString(e.unref(s))},null,8,at)])),_:1}))}});lt.__file="src/components/modals/AGErrorReportModal.vue";const it={message:R()};function ct(){return it}function ut(t){return{renderedMessage:e.computed((()=>t.message??te("ui.loading","Loading...")))}}var dt=e.defineComponent({__name:"AGLoadingModal",props:ct(),setup(t){const r=t,{renderedMessage:o}=ut(r);return(t,r)=>(e.openBlock(),e.createBlock(Ae,{cancellable:!1},{default:e.withCtx((()=>[e.createVNode(we,{text:e.unref(o)},null,8,["text"])])),_:1}))}});dt.__file="src/components/modals/AGLoadingModal.vue";const pt={title:R(),message:D(),label:R(),defaultValue:R(),placeholder:R(),acceptText:R(),acceptColor:j(oe,oe.Primary),cancelText:R(),cancelColor:j(oe,oe.Clear)};function mt(){return pt}function ft(t){return{renderedAcceptText:e.computed((()=>t.acceptText??te("ui.accept","Ok"))),renderedCancelText:e.computed((()=>t.cancelText??te("ui.cancel","Cancel")))}}var ht=e.defineComponent({__name:"AGForm",props:{form:N()},emits:["submit"],setup(t,{emit:r}){let o;const s=t,n=r;return e.watchEffect((e=>{o?.(),o=s.form?.on("submit",(()=>n("submit"))),e((()=>o?.()))})),e.provide("form",s.form),(r,o)=>(e.openBlock(),e.createElementBlock("form",{onSubmit:o[0]||(o[0]=e.withModifiers((e=>t.form?.submit()),["prevent"]))},[e.renderSlot(r.$slots,"default")],32))}});ht.__file="src/components/forms/AGForm.vue";const vt={name:R(),label:R(),description:R(),modelValue:$([String,Number,Boolean])};function xt(){return vt}var gt=e.defineComponent({__name:"AGHeadlessInput",props:{as:R("div"),...xt()},emits:["update:modelValue"],setup(t,{expose:r,emit:s}){const n=s,a=t,l=e.ref(),i=e.computed((()=>c&&a.name?c.errors[a.name]??null:null)),c=e.inject("form",null),u={$el:e.readonly(l),id:`input-${o.uuid()}`,name:e.computed((()=>a.name)),label:e.computed((()=>a.label)),description:e.computed((()=>a.description)),value:e.computed((()=>c&&a.name?c.getFieldValue(a.name):a.modelValue)),errors:e.readonly(i),update(e){c&&a.name?c.setFieldValue(a.name,e):n("update:modelValue",e)},__setElement(e){l.value=e}};return e.provide("input",u),r(u),(r,o)=>t.as?(e.openBlock(),e.createBlock(e.resolveDynamicComponent(t.as),{key:0},{default:e.withCtx((()=>[e.renderSlot(r.$slots,"default")])),_:3})):e.renderSlot(r.$slots,"default",{key:1})}});gt.__file="src/components/headless/forms/AGHeadlessInput.vue";var bt=e.defineComponent({inheritAttrs:!1,__name:"AGHeadlessInputDescription",setup(t){const r=M("input","<AGHeadlessInputDescription> must be a child of a <AGHeadlessInput>"),o=e.computed((()=>"string"==typeof r.description?r.description:"")),s=e.computed((()=>!!r.description));return(t,n)=>e.renderSlot(t.$slots,"default",{id:`${e.unref(r).id}-description`},(()=>[s.value?(e.openBlock(),e.createBlock(we,e.mergeProps({key:0},t.$attrs,{id:`${e.unref(r).id}-description`,text:o.value}),null,16,["id","text"])):e.createCommentVNode("v-if",!0)]))}});bt.__file="src/components/headless/forms/AGHeadlessInputDescription.vue";const _t=["id"];var yt=e.defineComponent({__name:"AGHeadlessInputError",setup(t){const r=M("input","<AGHeadlessInputError> must be a child of a <AGHeadlessInput>"),o=e.computed((()=>r.errors?te(`errors.${r.errors[0]}`,`Error: ${r.errors[0]}`):null));return(t,s)=>o.value?(e.openBlock(),e.createElementBlock("p",{key:0,id:`${e.unref(r).id}-error`},e.toDisplayString(o.value),9,_t)):e.createCommentVNode("v-if",!0)}});function kt(t,r){const o=e.inject("form",null),s=o?.on("focus",(e=>t.name===e&&r()));e.onUnmounted((()=>s?.()))}yt.__file="src/components/headless/forms/AGHeadlessInputError.vue";const Ct=["id","name","type","aria-invalid","aria-describedby","checked"];var wt=e.defineComponent({__name:"AGHeadlessInputInput",props:{type:R("text")},setup(t){const r=t,o=e.ref(),s=M("input","<AGHeadlessInputInput> must be a child of a <AGHeadlessInput>"),n=e.computed((()=>s.name??void 0)),a=e.computed((()=>s.value)),l=e.computed((()=>{if("checkbox"===r.type)return!!a.value}));function i(){o.value&&s.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 kt(s,(()=>o.value?.focus())),e.watchEffect((()=>s.__setElement(o.value))),e.watchEffect((()=>{o.value&&("date"!==r.type?o.value.value=a.value:o.value.valueAsDate=a.value)})),(r,a)=>(e.openBlock(),e.createElementBlock("input",{id:e.unref(s).id,ref_key:"$input",ref:o,name:n.value,type:t.type,"aria-invalid":e.unref(s).errors?"true":"false","aria-describedby":e.unref(s).errors?`${e.unref(s).id}-error`:e.unref(s).description?`${e.unref(s).id}-description`:void 0,checked:l.value,onInput:i},null,40,Ct))}});wt.__file="src/components/headless/forms/AGHeadlessInputInput.vue";const St=["for"];var At=e.defineComponent({__name:"AGHeadlessInputLabel",setup(t){const r=M("input","<AGHeadlessInputLabel> must be a child of a <AGHeadlessInput>"),o=e.useSlots(),s=e.computed((()=>!(!r.label&&!o.default)));return(t,o)=>s.value?(e.openBlock(),e.createElementBlock("label",{key:0,for:e.unref(r).id},[e.renderSlot(t.$slots,"default",{},(()=>[e.createTextVNode(e.toDisplayString(e.unref(r).label),1)]))],8,St)):e.createCommentVNode("v-if",!0)}});At.__file="src/components/headless/forms/AGHeadlessInputLabel.vue";const Et={class:"absolute bottom-0 left-0 translate-y-full"};var Bt=e.defineComponent({inheritAttrs:!1,__name:"AGInput",props:xt(),setup(t){const r=t,o=B(),[s,n]=me();return(t,a)=>(e.openBlock(),e.createBlock(gt,e.mergeProps({ref_key:"$input",ref:o,class:["relative flex flex-col items-center",e.unref(n)]},r),{default:e.withCtx((()=>[e.createVNode(At,{class:"sr-only"}),e.createVNode(wt,e.mergeProps(e.unref(s),{class:["block w-full border-0 py-1.5 text-gray-900 ring-1 ring-inset ring-gray-300 placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-indigo-600",{"ring-1 ring-red-500":e.unref(o)?.errors}]}),null,16,["class"]),e.createVNode(bt),e.createElementVNode("div",Et,[e.createVNode(yt,{class:"mt-1 text-sm text-red-500"})])])),_:1},16,["class"]))}});Bt.__file="src/components/forms/AGInput.vue";const Gt={String:"string",Number:"number",Boolean:"boolean",Object:"object",Date:"date"},jt=new WeakMap;class Vt extends o.MagicObject{constructor(t){super(),c.default(this,"errors",void 0),c.default(this,"_fields",void 0),c.default(this,"_data",void 0),c.default(this,"_submitted",void 0),c.default(this,"_errors",void 0),c.default(this,"_listeners",{}),this._fields=t,this._submitted=e.ref(!1),this._data=this.getInitialData(t),this._errors=this.getInitialErrors(t),jt.set(this,e.computed((()=>!Object.values(this._errors).some((e=>null!==e))))),this.errors=e.readonly(this._errors)}get valid(){return!!jt.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[r,o]=t;return e[r]=this.getFieldErrors(r,o),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){o.arrayRemove(this._listeners[e]??[],t)}async focus(t){await e.nextTick(),this._listeners.focus?.forEach((e=>e(t)))}__get(e){return e in this._fields?this._data[e]:super.__get(e)}__set(e,t){e in this._fields?Object.assign(this._data,{[e]:t}):super.__set(e,t)}getFieldErrors(e,t){const r=[];return t.rules?.includes("required")&&!this._data[e]&&r.push("required"),r.length>0?r:null}getInitialData(t){if(this.static().isConjuring())return{};const r=Object.entries(t).reduce(((e,t)=>{let[r,o]=t;return e[r]=o.default??null,e}),{});return e.reactive(r)}getInitialErrors(t){if(this.static().isConjuring())return{};const r=Object.keys(t).reduce(((e,t)=>(e[t]=null,e)),{});return e.reactive(r)}resetData(){for(const[e,t]of Object.entries(this._fields))this._data[e]=t.default??null}resetErrors(e){Object.keys(this._errors).forEach((e=>delete this._errors[e])),e&&Object.assign(this._errors,e)}}function Mt(e){return new Vt(e)}function $t(e){return{default:e,type:Gt.String,rules:"required"}}const Pt={class:"mt-2 flex flex-row-reverse gap-2"};var Nt=e.defineComponent({__name:"AGPromptModal",props:mt(),setup(t){const r=t,o=Mt({draft:$t(r.defaultValue??"")}),{renderedAcceptText:s,renderedCancelText:n}=ft(r);return(t,r)=>(e.openBlock(),e.createBlock(Ae,{cancellable:!1,title:t.title},{default:e.withCtx((({close:r})=>[e.createVNode(we,{text:t.message},null,8,["text"]),e.createVNode(ht,{form:e.unref(o),onSubmit:t=>r(e.unref(o).draft)},{default:e.withCtx((()=>[e.createVNode(Bt,{name:"draft",placeholder:t.placeholder,label:t.label},null,8,["placeholder","label"]),e.createElementVNode("div",Pt,[e.createVNode(Pe,{color:t.acceptColor,submit:""},{default:e.withCtx((()=>[e.createTextVNode(e.toDisplayString(e.unref(s)),1)])),_:1},8,["color"]),e.createVNode(Pe,{color:t.cancelColor,onClick:e=>r()},{default:e.withCtx((()=>[e.createTextVNode(e.toDisplayString(e.unref(n)),1)])),_:2},1032,["color","onClick"])])])),_:2},1032,["form","onSubmit"])])),_:1},8,["title"]))}});Nt.__file="src/components/modals/AGPromptModal.vue";const Ht={class:"pointer-events-auto"};var Tt=e.defineComponent({__name:"AGHeadlessSnackbar",setup:t=>(t,r)=>(e.openBlock(),e.createElementBlock("div",Ht,[e.renderSlot(t.$slots,"default")]))});Tt.__file="src/components/headless/snackbars/AGHeadlessSnackbar.vue";const qt=o.objectWithout(oe,["Primary","Clear"]),It={id:D(),message:D(),actions:A((()=>[])),color:j(qt,oe.Secondary)};function Dt(){return It}function Rt(e){return{activate:function(t){t.handler?.(),t.dismiss&&Y.hideSnackbar(e.id)}}}var Lt=e.defineComponent({__name:"AGSnackbar",props:Dt(),setup(t){const r=t,{activate:o}=Rt(r),s=e.computed((()=>r.color===oe.Danger?"bg-red-200 text-red-900":"bg-gray-900 text-white"));return(t,r)=>(e.openBlock(),e.createBlock(Tt,{class:e.normalizeClass(["flex flex-row items-center justify-center gap-3 p-4",s.value])},{default:e.withCtx((()=>[e.createVNode(we,{text:t.message,inline:""},null,8,["text"]),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.actions,((r,s)=>(e.openBlock(),e.createBlock(Pe,{key:s,color:t.color,onClick:t=>e.unref(o)(r)},{default:e.withCtx((()=>[e.createTextVNode(e.toDisplayString(r.text),1)])),_:2},1032,["color","onClick"])))),128))])),_:1},8,["class"]))}});Lt.__file="src/components/snackbars/AGSnackbar.vue";const Ot={class:"grid flex-grow place-items-center"},zt={class:"flex flex-col items-center space-y-6 p-8"},Ft={class:"mt-2 text-center text-4xl font-medium text-red-600"},Ut={class:"mt-4 flex flex-col space-y-4"};var Wt=e.defineComponent({__name:"AGStartupCrash",setup:t=>(t,r)=>(e.openBlock(),e.createElementBlock("div",Ot,[e.createElementVNode("div",zt,[e.createElementVNode("h1",Ft,e.toDisplayString(t.$td("startupCrash.title","Something went wrong!")),1),e.createVNode(we,{text:t.$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"]),e.createElementVNode("div",Ut,[e.createVNode(Pe,{color:"danger",onClick:r[0]||(r[0]=e=>t.$app.reload())},{default:e.withCtx((()=>[e.createTextVNode(e.toDisplayString(t.$td("startupCrash.reload","Try again")),1)])),_:1}),e.createVNode(Pe,{color:"danger",onClick:r[1]||(r[1]=e=>t.$errors.inspect(t.$errors.startupErrors))},{default:e.withCtx((()=>[e.createTextVNode(e.toDisplayString(t.$td("startupCrash.inspect","View error details")),1)])),_:1})])])]))});Wt.__file="src/components/lib/AGStartupCrash.vue";const Kt={$ui:Y};var Jt={async install(e,t){const r={[Q.AlertModal]:Ge,[Q.ConfirmModal]:He,[Q.ErrorReportModal]:lt,[Q.LoadingModal]:dt,[Q.PromptModal]:Nt,[Q.Snackbar]:Lt,[Q.StartupCrash]:Wt};Object.entries({...r,...t.components}).forEach((e=>{let[t,r]=e;return Y.registerComponent(t,r)})),await W(e,Kt)}};async function Qt(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const r=[de,O,ie,ue,K,Jt,...t.plugins??[]];await S(r,e,t),await(t.install?.(e)),await _.emit("application-ready")}const Zt={key:0};var Yt=e.defineComponent({__name:"AGAppModals",setup(t){const r=e.computed((()=>Y.modals[0]??null));return(t,o)=>r.value?(e.openBlock(),e.createElementBlock("aside",Zt,[e.createVNode(be,{"child-index":1,modal:r.value},null,8,["modal"])])):e.createCommentVNode("v-if",!0)}});Yt.__file="src/components/AGAppModals.vue";const Xt={"aria-live":"assertive",class:"pointer-events-none fixed inset-0 z-50 flex items-end px-4 py-6 sm:p-6"},er={class:"flex w-full flex-col items-end space-y-4"};const tr={render:function(t,r){return e.openBlock(),e.createElementBlock("div",Xt,[e.createElementVNode("div",er,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.$ui.snackbars,(t=>(e.openBlock(),e.createBlock(e.resolveDynamicComponent(t.component),e.mergeProps({id:t.id,key:t.id},t.properties),null,16,["id"])))),128))])])},__file:"src/components/AGAppSnackbars.vue"};var rr=tr,or=e.defineComponent({__name:"AGAppOverlays",setup(t){const r=e.ref(null),o=e.ref(!0);return pe("show-overlays-backdrop",(async()=>{r.value&&o.value&&(o.value=!1,r.value.classList.remove("opacity-0"))})),pe("hide-overlays-backdrop",(async()=>{r.value&&!o.value&&(o.value=!0,r.value.classList.add("opacity-0"))})),(t,o)=>(e.openBlock(),e.createElementBlock(e.Fragment,null,[e.createElementVNode("div",{id:"aerogel-overlays-backdrop",ref_key:"$backdrop",ref:r,class:"pointer-events-none fixed inset-0 z-50 bg-black/30 opacity-0"},null,512),e.createVNode(Yt),e.createVNode(rr)],64))}});or.__file="src/components/AGAppOverlays.vue";const sr={class:"flex min-h-full flex-col text-base font-normal leading-tight text-gray-900 antialiased"};var nr=e.defineComponent({__name:"AGAppLayout",setup:t=>(t,r)=>(e.openBlock(),e.createElementBlock("div",sr,[t.$errors.hasStartupErrors?e.renderSlot(t.$slots,"startup-crash",{key:0},(()=>[(e.openBlock(),e.createBlock(e.resolveDynamicComponent(t.$ui.requireComponent(e.unref(Q).StartupCrash))))])):e.renderSlot(t.$slots,"default",{key:1}),e.createVNode(or)]))});nr.__file="src/components/AGAppLayout.vue";const ar={class:"ml-2"};var lr=e.defineComponent({inheritAttrs:!1,__name:"AGCheckbox",props:{name:R()},emits:["update:modelValue"],setup(t){const r=B();return(o,s)=>(e.openBlock(),e.createBlock(gt,{ref_key:"$input",ref:r,name:t.name,class:"flex","onUpdate:modelValue":s[0]||(s[0]=e=>o.$emit("update:modelValue",e))},{default:e.withCtx((()=>[e.createVNode(wt,e.mergeProps(o.$attrs,{type:"checkbox",class:{"text-indigo-600 focus:ring-indigo-600":!e.unref(r)?.errors,"border-red-200 text-red-600 focus:ring-red-600":e.unref(r)?.errors}}),null,16,["class"]),e.createElementVNode("div",ar,[o.$slots.default?(e.openBlock(),e.createBlock(At,{key:0},{default:e.withCtx((()=>[e.renderSlot(o.$slots,"default")])),_:3})):e.createCommentVNode("v-if",!0),e.createVNode(yt,{class:"text-sm text-red-600"})])])),_:3},8,["name"]))}});lr.__file="src/components/forms/AGCheckbox.vue";const ir={viewBox:"0 0 20 20",width:"1.2em",height:"1.2em"},cr=[e.createElementVNode("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 ur={name:"zondicons-cheveron-down",render:function(t,r){return e.openBlock(),e.createElementBlock("svg",ir,[...cr])}};const dr={name:R(),label:R(),options:H(),noSelectionText:R(),optionsText:$()},pr=["update:modelValue"];function mr(){return dr}function fr(){return[...pr]}var hr=e.defineComponent({__name:"AGHeadlessSelect",props:{modelValue:$(),...mr()},emits:fr(),setup(t,{expose:r,emit:s}){const a=s,l=t,i=e.computed((()=>"function"==typeof l.optionsText?l.optionsText:"string"==typeof l.optionsText?e=>o.toString(e[l.optionsText]):e=>o.toString(e))),c=e.inject("form",null),u=e.computed((()=>l.noSelectionText??te("select.noSelection","-"))),d=e.computed((()=>c&&l.name?c.getFieldValue(l.name):l.modelValue)),p=e.computed((()=>c&&l.name?c.errors[l.name]??null:null));function m(e){c&&l.name?c.setFieldValue(l.name,e):a("update:modelValue",e)}const f={id:`select-${o.uuid()}`,noSelectionText:u,selectedOption:d,errors:p,options:e.computed((()=>l.options)),label:e.computed((()=>l.label)),buttonText:e.computed((()=>null===d.value?u.value:i.value(d.value))),renderText:i,update:m};return e.provide("select",f),r(f),(t,r)=>(e.openBlock(),e.createBlock(e.unref(n.Listbox),{"model-value":d.value,"onUpdate:modelValue":r[0]||(r[0]=e=>m(e))},{default:e.withCtx((({value:r,open:o,disabled:s})=>[e.renderSlot(t.$slots,"default",{value:r,open:o,disabled:s})])),_:3},8,["model-value"]))}});hr.__file="src/components/headless/forms/AGHeadlessSelect.vue";var vr=e.defineComponent({__name:"AGHeadlessSelectButton",props:{textClass:R()},setup(t){const r=M("select","<AGHeadlessSelectButton> must be a child of a <AGHeadlessSelect>");return(o,s)=>(e.openBlock(),e.createBlock(e.unref(n.ListboxButton),null,{default:e.withCtx((({value:s,open:n,disabled:a})=>[e.renderSlot(o.$slots,"default",{value:s,open:n,disabled:a},(()=>[e.createElementVNode("span",{class:e.normalizeClass(t.textClass)},e.toDisplayString(e.unref(r)?.buttonText),3)])),e.renderSlot(o.$slots,"icon")])),_:3}))}});vr.__file="src/components/headless/forms/AGHeadlessSelectButton.vue";const xr=["id"];var gr=e.defineComponent({__name:"AGHeadlessSelectError",setup(t){const r=M("select","<AGHeadlessSelectError> must be a child of a <AGHeadlessSelect>"),o=e.computed((()=>r.errors?te(`errors.${r.errors[0]}`,`Error: ${r.errors[0]}`):null));return(t,s)=>o.value?(e.openBlock(),e.createElementBlock("p",{key:0,id:`${e.unref(r).id}-error`},e.toDisplayString(o.value),9,xr)):e.createCommentVNode("v-if",!0)}});gr.__file="src/components/headless/forms/AGHeadlessSelectError.vue";var br=e.defineComponent({__name:"AGHeadlessSelectLabel",setup(t){const r=M("select","<AGHeadlessSelectLabel> must be a child of a <AGHeadlessSelect>"),o=e.useSlots(),s=e.computed((()=>!(!r.label&&!o.default)));return(t,o)=>s.value?(e.openBlock(),e.createBlock(e.unref(n.ListboxLabel),{key:0},{default:e.withCtx((({open:o,disabled:s})=>[e.renderSlot(t.$slots,"default",{open:o,disabled:s},(()=>[e.createTextVNode(e.toDisplayString(e.unref(r).label),1)]))])),_:3})):e.createCommentVNode("v-if",!0)}});br.__file="src/components/headless/forms/AGHeadlessSelectLabel.vue";var _r=e.defineComponent({__name:"AGHeadlessSelectOption",props:{value:T(),selectedClass:R(),unselectedClass:R(),activeClass:R(),inactiveClass:R()},setup(t){const r=M("select","<AGHeadlessSelectOption> must be a child of a <AGHeadlessSelect>");return(o,s)=>(e.openBlock(),e.createBlock(e.unref(n.ListboxOption),{value:t.value,as:"template"},{default:e.withCtx((({active:s,selected:n,disabled:a})=>[e.renderSlot(o.$slots,"default",{active:s,selected:n,disabled:a},(()=>[e.createElementVNode("li",{class:e.normalizeClass({[t.activeClass??"active"]:s,[t.inactiveClass??"inactive"]:!s,[t.selectedClass??"selected"]:n,[t.unselectedClass??"unselected"]:!n})},e.toDisplayString(e.unref(r).renderText(t.value)),3)]))])),_:3},8,["value"]))}});_r.__file="src/components/headless/forms/AGHeadlessSelectOption.vue";const yr={class:"pointer-events-none absolute inset-y-0 right-0 flex items-center pr-2"};var kr=e.defineComponent({__name:"AGSelect",props:mr(),emits:fr(),setup(t){const r=t,o=B();return(t,s)=>(e.openBlock(),e.createBlock(hr,e.mergeProps(r,{ref_key:"$select",ref:o,as:"div","onUpdate:modelValue":s[0]||(s[0]=e=>t.$emit("update:modelValue",e))}),{default:e.withCtx((()=>[e.createVNode(br,{class:"block text-sm font-medium leading-6 text-gray-900"}),e.createElementVNode("div",{class:e.normalizeClass(["relative",{"mt-2":e.unref(o)?.label}])},[e.createVNode(vr,{class:e.normalizeClass(["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":e.unref(o)?.errors}]),"text-class":"block truncate"},{icon:e.withCtx((()=>[e.createElementVNode("span",yr,[e.createVNode(e.unref(ur),{class:"h-5 w-5 text-gray-400"})])])),_:1},8,["class"]),e.createVNode(e.unref(n.ListboxOptions),{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:e.withCtx((()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(o)?.options??[],((t,r)=>(e.openBlock(),e.createBlock(_r,{key:r,value:t,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),e.createVNode(gr,{class:"mt-2 text-sm text-red-600"})])),_:1},16))}});kr.__file="src/components/forms/AGSelect.vue";const Cr=["id","name","value","aria-invalid","aria-describedby"];var wr=e.defineComponent({__name:"AGHeadlessInputTextArea",setup(t){const r=e.ref(),o=M("input","<AGHeadlessInputTextArea> must be a child of a <AGHeadlessInput>"),s=e.computed((()=>o.name??void 0)),n=e.computed((()=>o.value));function a(){r.value&&o.update(r.value.value)}return e.watchEffect((()=>o.__setElement(r.value))),kt(o,(()=>r.value?.focus())),(t,l)=>(e.openBlock(),e.createElementBlock("textarea",{id:e.unref(o).id,ref_key:"$textArea",ref:r,name:s.value,value:n.value,"aria-invalid":e.unref(o).errors?"true":"false","aria-describedby":e.unref(o).errors?`${e.unref(o).id}-error`:e.unref(o).description?`${e.unref(o).id}-description`:void 0,onInput:a},null,40,Cr))}});wr.__file="src/components/headless/forms/AGHeadlessInputTextArea.vue";var Sr=e.defineComponent({__name:"AGErrorMessage",props:{error:I()},setup(t){const r=t,o=e.computed((()=>ne(r.error)));return(t,r)=>(e.openBlock(),e.createBlock(we,{text:o.value,inline:""},null,8,["text"]))}});Sr.__file="src/components/lib/AGErrorMessage.vue";var Ar=e.defineComponent({__name:"AGLink",setup:t=>(t,r)=>(e.openBlock(),e.createBlock($e,{class:"font-medium hover:underline"},{default:e.withCtx((()=>[e.renderSlot(t.$slots,"default")])),_:3}))});Ar.__file="src/components/lib/AGLink.vue";var Er=e.defineComponent({__name:"AGMeasured",props:{as:R("span")},setup(t){const r=e.ref(!1);return(o,s)=>{const n=e.resolveDirective("measure");return e.withDirectives((e.openBlock(),e.createBlock(e.resolveDynamicComponent(t.as),{class:e.normalizeClass({"!invisible !absolute !w-auto":!r.value})},{default:e.withCtx((()=>[e.renderSlot(o.$slots,"default")])),_:3},8,["class"])),[[n,()=>r.value=!0]])}}});Er.__file="src/components/lib/AGMeasured.vue";var Br=e.defineComponent({__name:"AGModalTitle",setup:t=>(t,r)=>(e.openBlock(),e.createBlock(ke,{class:"mb-2 font-semibold"},{default:e.withCtx((()=>[e.renderSlot(t.$slots,"default")])),_:3}))});Br.__file="src/components/modals/AGModalTitle.vue";Object.defineProperty(exports,"AGHeadlessSelectOptions",{enumerable:!0,get:function(){return n.ListboxOptions}}),exports.AGAlertModal=Ge,exports.AGAppLayout=nr,exports.AGAppOverlays=or,exports.AGButton=Pe,exports.AGCheckbox=lr,exports.AGConfirmModal=He,exports.AGErrorMessage=Sr,exports.AGErrorReportModalButtons=rt,exports.AGErrorReportModalTitle=ot,exports.AGForm=ht,exports.AGHeadlessButton=$e,exports.AGHeadlessInput=gt,exports.AGHeadlessInputDescription=bt,exports.AGHeadlessInputError=yt,exports.AGHeadlessInputInput=wt,exports.AGHeadlessInputLabel=At,exports.AGHeadlessInputTextArea=wr,exports.AGHeadlessModal=ge,exports.AGHeadlessModalPanel=ye,exports.AGHeadlessModalTitle=ke,exports.AGHeadlessSelect=hr,exports.AGHeadlessSelectButton=vr,exports.AGHeadlessSelectError=gr,exports.AGHeadlessSelectLabel=br,exports.AGHeadlessSelectOption=_r,exports.AGHeadlessSnackbar=Tt,exports.AGInput=Bt,exports.AGLink=Ar,exports.AGLoadingModal=dt,exports.AGMarkdown=we,exports.AGMeasured=Er,exports.AGModal=Ae,exports.AGModalContext=be,exports.AGModalTitle=Br,exports.AGPromptModal=Nt,exports.AGSelect=kr,exports.AGSnackbar=Lt,exports.AGStartupCrash=Wt,exports.App=C,exports.AppService=k,exports.Cache=F,exports.CacheService=z,exports.Colors=oe,exports.Errors=se,exports.EventListenerPriorities={Low:-256,Default:0,High:256},exports.Events=_,exports.EventsService=b,exports.Form=Vt,exports.FormFieldTypes=Gt,exports.Job=class{},exports.Lang=X,exports.Service=g,exports.SnackbarColors=qt,exports.UI=Y,exports.UIComponents=Q,exports.UIService=Z,exports.alertModalProps=Ee,exports.arrayProp=A,exports.booleanInput=function(e){return{default:e,type:Gt.Boolean}},exports.booleanProp=E,exports.bootServices=W,exports.bootstrap=async function(t){let r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const o=e.createApp(t);await Qt(o,r),o.mount("#app"),o._container?.classList.remove("loading"),await _.emit("application-mounted")},exports.bootstrapApplication=Qt,exports.componentRef=B,exports.computedAsync=function(t){const r=e.ref(),o=e.computed(t);return e.watch(o,(async()=>r.value=await o.value),{immediate:!0}),r},exports.confirmModalProps=je,exports.dateInput=function(e){return{default:e,type:Gt.Date}},exports.defineDirective=G,exports.definePlugin=w,exports.defineServiceState=x,exports.defineServiceStore=v,exports.dispatch=async function(e){await e.run()},exports.enumProp=j,exports.errorReportModalProps=Oe,exports.extractInputProps=function(e){return fe(e,vt)},exports.extractModalProps=function(e){return fe(e,he)},exports.extractSelectProps=function(e){return fe(e,dr)},exports.getErrorMessage=ne,exports.getPiniaStore=h,exports.injectOrFail=function(t,r){return e.inject(t)??o.fail(r??`Could not resolve '${t}' injection key`)},exports.injectReactive=V,exports.injectReactiveOrFail=M,exports.inputProps=vt,exports.installPlugins=S,exports.loadingModalProps=it,exports.mixedProp=$,exports.modalProps=he,exports.numberInput=function(e){return{default:e,type:Gt.Number}},exports.numberProp=P,exports.objectProp=N,exports.onCleanMounted=function(t){let r=o.noop;e.onMounted((()=>r=t())),e.onUnmounted((()=>r()))},exports.onFormFocus=kt,exports.promptModalProps=pt,exports.removeInteractiveClasses=function(e){return e.split(/\s+/).filter((e=>!/^(hover|focus|focus-visible):/.test(e))).join(" ").trim()},exports.requiredArrayProp=H,exports.requiredBooleanInput=function(e){return{default:e,type:Gt.Boolean,rules:"required"}},exports.requiredDateInput=function(e){return{default:e,type:Gt.Date,rules:"required"}},exports.requiredEnumProp=function(e){const t=Object.values(e);return{type:String,required:!0,validator:e=>t.includes(e)}},exports.requiredMixedProp=T,exports.requiredNumberInput=function(e){return{default:e,type:Gt.Number,rules:"required"}},exports.requiredNumberProp=q,exports.requiredObjectProp=I,exports.requiredStringInput=$t,exports.requiredStringProp=D,exports.resetPiniaStore=f,exports.selectEmits=pr,exports.selectProps=dr,exports.snackbarProps=It,exports.stringInput=function(e){return{default:e,type:Gt.String}},exports.stringProp=R,exports.translate=ee,exports.translateWithDefault=te,exports.useAlertModalProps=Be,exports.useConfirmModal=Me,exports.useConfirmModalProps=Ve,exports.useErrorReportModal=Fe,exports.useErrorReportModalProps=ze,exports.useEvent=pe,exports.useForm=Mt,exports.useInputAttrs=me,exports.useInputProps=xt,exports.useLoadingModal=ut,exports.useLoadingModalProps=ct,exports.useModalExpose=xe,exports.useModalProps=ve,exports.usePromptModal=ft,exports.usePromptModalProps=mt,exports.useSelectEmits=fr,exports.useSelectProps=mr,exports.useSnackbar=Rt,exports.useSnackbarProps=Dt;
2
- //# sourceMappingURL=aerogel-core.cjs.js.map