@aerogel/core 0.0.0-next.a56c0f4966eb71571173f8502f3f36d357ceebc7 → 0.0.0-next.aa6e27a9c197d1ee10c9fe018ee8c0fc6ff77767

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 (190) hide show
  1. package/dist/aerogel-core.d.ts +2004 -1034
  2. package/dist/aerogel-core.js +3223 -0
  3. package/dist/aerogel-core.js.map +1 -0
  4. package/package.json +27 -37
  5. package/src/bootstrap/bootstrap.test.ts +7 -11
  6. package/src/bootstrap/index.ts +36 -16
  7. package/src/bootstrap/options.ts +4 -1
  8. package/src/components/AppLayout.vue +16 -0
  9. package/src/components/{AGAppModals.vue → AppModals.vue} +3 -4
  10. package/src/components/{AGAppOverlays.vue → AppOverlays.vue} +5 -6
  11. package/src/components/AppToasts.vue +16 -0
  12. package/src/components/composition.ts +23 -0
  13. package/src/components/contracts/AlertModal.ts +4 -0
  14. package/src/components/contracts/Button.ts +16 -0
  15. package/src/components/contracts/ConfirmModal.ts +41 -0
  16. package/src/components/contracts/DropdownMenu.ts +11 -0
  17. package/src/components/contracts/ErrorReportModal.ts +29 -0
  18. package/src/components/contracts/Input.ts +26 -0
  19. package/src/components/contracts/LoadingModal.ts +18 -0
  20. package/src/components/contracts/Modal.ts +13 -0
  21. package/src/components/contracts/PromptModal.ts +28 -0
  22. package/src/components/contracts/Select.ts +36 -0
  23. package/src/components/contracts/Toast.ts +13 -0
  24. package/src/components/contracts/index.ts +9 -0
  25. package/src/components/contracts/shared.ts +9 -0
  26. package/src/components/headless/HeadlessButton.vue +50 -0
  27. package/src/components/headless/HeadlessInput.vue +59 -0
  28. package/src/components/headless/HeadlessInputDescription.vue +27 -0
  29. package/src/components/headless/{forms/AGHeadlessInputError.vue → HeadlessInputError.vue} +4 -8
  30. package/src/components/headless/HeadlessInputInput.vue +75 -0
  31. package/src/components/headless/HeadlessInputLabel.vue +18 -0
  32. package/src/components/headless/HeadlessInputTextArea.vue +40 -0
  33. package/src/components/headless/{modals/AGHeadlessModal.vue → HeadlessModal.vue} +17 -19
  34. package/src/components/headless/HeadlessModalContent.vue +24 -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 +105 -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 +30 -0
  42. package/src/components/headless/HeadlessSelectTrigger.vue +22 -0
  43. package/src/components/headless/HeadlessSelectValue.vue +15 -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 +18 -3
  47. package/src/components/index.ts +5 -9
  48. package/src/components/ui/AdvancedOptions.vue +18 -0
  49. package/src/components/ui/AlertModal.vue +13 -0
  50. package/src/components/ui/Button.vue +98 -0
  51. package/src/components/ui/Checkbox.vue +56 -0
  52. package/src/components/ui/ConfirmModal.vue +42 -0
  53. package/src/components/ui/DropdownMenu.vue +33 -0
  54. package/src/components/ui/EditableContent.vue +82 -0
  55. package/src/components/ui/ErrorMessage.vue +15 -0
  56. package/src/components/ui/ErrorReportModal.vue +62 -0
  57. package/src/components/{modals/AGErrorReportModalButtons.vue → ui/ErrorReportModalButtons.vue} +38 -29
  58. package/src/components/ui/ErrorReportModalTitle.vue +24 -0
  59. package/src/components/ui/Form.vue +24 -0
  60. package/src/components/ui/Input.vue +56 -0
  61. package/src/components/ui/Link.vue +12 -0
  62. package/src/components/ui/LoadingModal.vue +32 -0
  63. package/src/components/ui/Markdown.vue +69 -0
  64. package/src/components/ui/Modal.vue +70 -0
  65. package/src/components/ui/ModalContext.vue +30 -0
  66. package/src/components/ui/ProgressBar.vue +50 -0
  67. package/src/components/ui/PromptModal.vue +35 -0
  68. package/src/components/ui/Select.vue +21 -0
  69. package/src/components/ui/SelectLabel.vue +10 -0
  70. package/src/components/ui/SelectOptions.vue +31 -0
  71. package/src/components/ui/SelectTrigger.vue +29 -0
  72. package/src/components/ui/SettingsModal.vue +51 -0
  73. package/src/components/{lib/AGStartupCrash.vue → ui/StartupCrash.vue} +8 -8
  74. package/src/components/ui/Toast.vue +42 -0
  75. package/src/components/ui/index.ts +27 -0
  76. package/src/components/utils.ts +107 -0
  77. package/src/directives/index.ts +13 -5
  78. package/src/directives/measure.ts +40 -0
  79. package/src/errors/Errors.state.ts +1 -1
  80. package/src/errors/Errors.ts +35 -34
  81. package/src/errors/JobCancelledError.ts +3 -0
  82. package/src/errors/index.ts +11 -17
  83. package/src/errors/utils.ts +35 -0
  84. package/src/forms/{Form.test.ts → FormController.test.ts} +33 -4
  85. package/src/forms/{Form.ts → FormController.ts} +86 -25
  86. package/src/forms/composition.ts +4 -4
  87. package/src/forms/index.ts +3 -1
  88. package/src/forms/utils.ts +36 -5
  89. package/src/forms/validation.ts +19 -0
  90. package/src/index.css +41 -0
  91. package/src/{main.ts → index.ts} +3 -0
  92. package/src/jobs/Job.ts +147 -0
  93. package/src/jobs/index.ts +10 -0
  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 +44 -29
  99. package/src/lang/index.ts +8 -6
  100. package/src/plugins/Plugin.ts +1 -1
  101. package/src/plugins/index.ts +10 -7
  102. package/src/services/App.state.ts +27 -5
  103. package/src/services/App.ts +32 -6
  104. package/src/services/Cache.ts +43 -0
  105. package/src/services/Events.test.ts +39 -0
  106. package/src/services/Events.ts +112 -32
  107. package/src/services/Service.ts +154 -49
  108. package/src/services/Storage.ts +20 -0
  109. package/src/services/index.ts +15 -6
  110. package/src/services/store.ts +8 -5
  111. package/src/services/utils.ts +18 -0
  112. package/src/testing/index.ts +26 -0
  113. package/src/testing/setup.ts +11 -0
  114. package/src/ui/UI.state.ts +19 -7
  115. package/src/ui/UI.ts +252 -63
  116. package/src/ui/index.ts +23 -17
  117. package/src/ui/utils.ts +16 -0
  118. package/src/utils/composition/events.ts +3 -2
  119. package/src/utils/composition/forms.ts +4 -3
  120. package/src/utils/composition/persistent.test.ts +33 -0
  121. package/src/utils/composition/persistent.ts +11 -0
  122. package/src/utils/composition/state.test.ts +47 -0
  123. package/src/utils/composition/state.ts +24 -0
  124. package/src/utils/index.ts +3 -0
  125. package/src/utils/markdown.test.ts +50 -0
  126. package/src/utils/markdown.ts +19 -6
  127. package/src/utils/tailwindcss.test.ts +26 -0
  128. package/src/utils/tailwindcss.ts +7 -0
  129. package/src/utils/vdom.ts +31 -0
  130. package/src/utils/vue.ts +31 -19
  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 -15
  140. package/src/components/AGAppSnackbars.vue +0 -13
  141. package/src/components/constants.ts +0 -8
  142. package/src/components/forms/AGButton.vue +0 -44
  143. package/src/components/forms/AGCheckbox.vue +0 -35
  144. package/src/components/forms/AGForm.vue +0 -26
  145. package/src/components/forms/AGInput.vue +0 -36
  146. package/src/components/forms/AGSelect.story.vue +0 -28
  147. package/src/components/forms/AGSelect.vue +0 -53
  148. package/src/components/forms/index.ts +0 -5
  149. package/src/components/headless/forms/AGHeadlessButton.vue +0 -51
  150. package/src/components/headless/forms/AGHeadlessInput.ts +0 -8
  151. package/src/components/headless/forms/AGHeadlessInput.vue +0 -54
  152. package/src/components/headless/forms/AGHeadlessInputInput.vue +0 -45
  153. package/src/components/headless/forms/AGHeadlessInputLabel.vue +0 -16
  154. package/src/components/headless/forms/AGHeadlessSelect.ts +0 -43
  155. package/src/components/headless/forms/AGHeadlessSelect.vue +0 -77
  156. package/src/components/headless/forms/AGHeadlessSelectButton.vue +0 -24
  157. package/src/components/headless/forms/AGHeadlessSelectLabel.vue +0 -21
  158. package/src/components/headless/forms/AGHeadlessSelectOption.ts +0 -4
  159. package/src/components/headless/forms/AGHeadlessSelectOption.vue +0 -39
  160. package/src/components/headless/forms/AGHeadlessSelectOptions.ts +0 -3
  161. package/src/components/headless/forms/index.ts +0 -14
  162. package/src/components/headless/modals/AGHeadlessModal.ts +0 -7
  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 -6
  166. package/src/components/headless/snackbars/AGHeadlessSnackbar.vue +0 -10
  167. package/src/components/headless/snackbars/index.ts +0 -25
  168. package/src/components/lib/AGErrorMessage.vue +0 -16
  169. package/src/components/lib/AGLink.vue +0 -9
  170. package/src/components/lib/AGMarkdown.vue +0 -36
  171. package/src/components/lib/index.ts +0 -4
  172. package/src/components/modals/AGAlertModal.vue +0 -25
  173. package/src/components/modals/AGConfirmModal.vue +0 -30
  174. package/src/components/modals/AGErrorReportModal.ts +0 -20
  175. package/src/components/modals/AGErrorReportModal.vue +0 -62
  176. package/src/components/modals/AGErrorReportModalTitle.vue +0 -25
  177. package/src/components/modals/AGLoadingModal.vue +0 -19
  178. package/src/components/modals/AGModal.ts +0 -10
  179. package/src/components/modals/AGModal.vue +0 -37
  180. package/src/components/modals/AGModalContext.ts +0 -8
  181. package/src/components/modals/AGModalContext.vue +0 -22
  182. package/src/components/modals/AGModalTitle.vue +0 -9
  183. package/src/components/modals/index.ts +0 -23
  184. package/src/components/snackbars/AGSnackbar.vue +0 -42
  185. package/src/components/snackbars/index.ts +0 -3
  186. package/src/directives/initial-focus.ts +0 -11
  187. package/src/main.histoire.ts +0 -1
  188. package/tailwind.config.js +0 -4
  189. package/tsconfig.json +0 -11
  190. package/vite.config.ts +0 -14
@@ -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,24 @@
1
+ import { debounce } from '@noeldemartin/utils';
2
+ import { ref, watchEffect } from 'vue';
3
+ import type { ComputedGetter, ComputedRef } from '@vue/runtime-core';
4
+
5
+ export interface ComputedDebounceOptions<T> {
6
+ initial?: T;
7
+ delay?: number;
8
+ }
9
+
10
+ export function computedDebounce<T>(options: ComputedDebounceOptions<T>, getter: ComputedGetter<T>): ComputedRef<T>;
11
+ export function computedDebounce<T>(getter: ComputedGetter<T>): ComputedRef<T | null>;
12
+ export function computedDebounce<T>(
13
+ optionsOrGetter: ComputedGetter<T> | ComputedDebounceOptions<T>,
14
+ inputGetter?: ComputedGetter<T>,
15
+ ): ComputedRef<T> {
16
+ const inputOptions = inputGetter ? (optionsOrGetter as ComputedDebounceOptions<T>) : {};
17
+ const getter = inputGetter ?? (optionsOrGetter as ComputedGetter<T>);
18
+ const state = ref(inputOptions.initial ?? null);
19
+ const update = debounce((value) => (state.value = value), inputOptions.delay ?? 300);
20
+
21
+ watchEffect(() => update(getter()));
22
+
23
+ return state as unknown as ComputedRef<T>;
24
+ }
@@ -1,4 +1,7 @@
1
1
  export * from './composition/events';
2
2
  export * from './composition/forms';
3
3
  export * from './composition/hooks';
4
+ export * from './composition/persistent';
5
+ export * from './markdown';
6
+ export * from './tailwindcss';
4
7
  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,26 @@
1
+ import { describe, expect, it } from 'vitest';
2
+
3
+ import { removeInteractiveClasses } from './tailwindcss';
4
+
5
+ describe('TailwindCSS utils', () => {
6
+
7
+ it('Removes interactive classes', () => {
8
+ const cases: [string, string][] = [
9
+ ['text-red hover:text-green', 'text-red'],
10
+ ['text-red hover:text-green text-lg', 'text-red text-lg'],
11
+ [
12
+ `
13
+ text-red text-lg
14
+ focus:text-yellow
15
+ hover:focus:text-black
16
+ `,
17
+ 'text-red text-lg',
18
+ ],
19
+ ];
20
+
21
+ cases.forEach(([original, expected]) => {
22
+ expect(removeInteractiveClasses(original)).toEqual(expected);
23
+ });
24
+ });
25
+
26
+ });
@@ -0,0 +1,7 @@
1
+ export function removeInteractiveClasses(classes: string): string {
2
+ return classes
3
+ .split(/\s+/)
4
+ .filter((className) => !/^(hover|focus|focus-visible):/.test(className))
5
+ .join(' ')
6
+ .trim();
7
+ }
@@ -0,0 +1,31 @@
1
+ import { Comment, Static, Text } from 'vue';
2
+ import { toString } from '@noeldemartin/utils';
3
+ import type { VNode } from 'vue';
4
+
5
+ function renderAttrs(node: VNode): string {
6
+ return Object.entries(node.props ?? {}).reduce((attrs, [name, value]) => {
7
+ return attrs + `${name}="${toString(value)}"`;
8
+ }, '');
9
+ }
10
+
11
+ export function renderNode(node: VNode | string): string {
12
+ if (typeof node === 'string') {
13
+ return node;
14
+ }
15
+
16
+ if (node.type === Comment) {
17
+ return '';
18
+ }
19
+
20
+ if (node.type === Text || node.type === Static) {
21
+ return node.children as string;
22
+ }
23
+
24
+ if (node.type === 'br') {
25
+ return '\n\n';
26
+ }
27
+
28
+ return `<${node.type} ${renderAttrs(node)}>${Array.from(node.children as Array<VNode | string>)
29
+ .map(renderNode)
30
+ .join('')}</${node.type}>`;
31
+ }
package/src/utils/vue.ts CHANGED
@@ -1,16 +1,14 @@
1
- import { fail } from '@noeldemartin/utils';
2
- import { inject, reactive, ref } 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>;
1
+ import { fail, toString } from '@noeldemartin/utils';
2
+ import { computed, inject, reactive, ref, watch } from 'vue';
3
+ import type { Directive, InjectionKey, MaybeRef, PropType, Ref, UnwrapNestedRefs } from 'vue';
4
+
5
+ export type AcceptRefs<T> = { [K in keyof T]: T[K] | RefUnion<T[K]> };
6
+ export type BaseProp<T> = { type?: PropType<T>; validator?(value: unknown): boolean };
7
+ export type ComponentProps<T = {}> = T & Record<string, unknown>;
8
+ export type OptionalProp<T> = BaseProp<T> & { default: T | (() => T) | null };
9
+ export type RefUnion<T> = T extends infer R ? Ref<R> : never;
10
+ export type RequiredProp<T> = BaseProp<T> & { required: true };
11
+ export type Unref<T> = { [K in keyof T]: T[K] extends MaybeRef<infer Value> ? Value : T[K] };
14
12
 
15
13
  export function arrayProp<T>(defaultValue?: () => T[]): OptionalProp<T[]> {
16
14
  return {
@@ -26,8 +24,13 @@ export function booleanProp(defaultValue: boolean = false): OptionalProp<boolean
26
24
  };
27
25
  }
28
26
 
29
- export function componentRef<T>(): Ref<UnwrapNestedRefs<T> | undefined> {
30
- return ref<UnwrapNestedRefs<T>>();
27
+ export function computedAsync<T>(getter: () => Promise<T>): Ref<T | undefined> {
28
+ const result = ref<T>();
29
+ const asyncValue = computed(getter);
30
+
31
+ watch(asyncValue, async () => (result.value = await asyncValue.value), { immediate: true });
32
+
33
+ return result;
31
34
  }
32
35
 
33
36
  export function defineDirective(directive: Directive): Directive {
@@ -57,20 +60,29 @@ export function injectReactiveOrFail<T extends object>(
57
60
  key: InjectionKey<T> | string,
58
61
  errorMessage?: string,
59
62
  ): UnwrapNestedRefs<T> {
60
- return injectReactive(key) ?? fail(errorMessage ?? `Could not resolve '${key}' injection key`);
63
+ return injectReactive(key) ?? fail(errorMessage ?? `Could not resolve '${toString(key)}' injection key`);
61
64
  }
62
65
 
63
66
  export function injectOrFail<T>(key: InjectionKey<T> | string, errorMessage?: string): T {
64
- return inject(key) ?? fail(errorMessage ?? `Could not resolve '${key}' injection key`);
67
+ return inject(key) ?? fail(errorMessage ?? `Could not resolve '${toString(key)}' injection key`);
65
68
  }
66
69
 
67
- export function mixedProp<T>(type?: PropType<T>): OptionalProp<T | null> {
70
+ export function listenerProp<T extends Function = Function>(): OptionalProp<T | null> {
68
71
  return {
69
- type,
72
+ type: Function as PropType<T>,
70
73
  default: null,
71
74
  };
72
75
  }
73
76
 
77
+ export function mixedProp<T>(type?: PropType<T>): OptionalProp<T | null>;
78
+ export function mixedProp<T>(type: PropType<T>, defaultValue: T): OptionalProp<T>;
79
+ export function mixedProp<T>(type?: PropType<T>, defaultValue?: T): OptionalProp<T | null> {
80
+ return {
81
+ type,
82
+ default: defaultValue ?? null,
83
+ };
84
+ }
85
+
74
86
  export function numberProp(): OptionalProp<number | null>;
75
87
  export function numberProp(defaultValue: number): OptionalProp<number>;
76
88
  export function numberProp(defaultValue: number | null = null): OptionalProp<number | null> {
@@ -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("@noeldemartin/utils"),r=require("@babel/runtime/helpers/defineProperty");require("core-js/modules/esnext.set.add-all.js"),require("core-js/modules/esnext.set.delete-all.js"),require("core-js/modules/esnext.set.difference.js"),require("core-js/modules/esnext.set.every.js"),require("core-js/modules/esnext.set.filter.js"),require("core-js/modules/esnext.set.find.js"),require("core-js/modules/esnext.set.intersection.js"),require("core-js/modules/esnext.set.is-disjoint-from.js"),require("core-js/modules/esnext.set.is-subset-of.js"),require("core-js/modules/esnext.set.is-superset-of.js"),require("core-js/modules/esnext.set.join.js"),require("core-js/modules/esnext.set.map.js"),require("core-js/modules/esnext.set.reduce.js"),require("core-js/modules/esnext.set.some.js"),require("core-js/modules/esnext.set.symmetric-difference.js"),require("core-js/modules/esnext.set.union.js");var o=require("pinia"),s=require("virtual:aerogel");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"),require("core-js/modules/esnext.async-iterator.for-each.js"),require("core-js/modules/esnext.iterator.for-each.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(r),u=i(s),d=i(a);class ServiceBootError extends t.JSError{constructor(e,t){super(`Service '${e}' failed booting`,{cause:t})}}let p=null;function m(){return p||(p=o.createPinia(),o.setActivePinia(p)),p}function f(e){var t;return t=class extends h{usesStore(){return!0}getName(){return e.name??null}getInitialState(){return e.initialState}getComputedStateDefinition(){return e.computed??{}}serializePersistedState(t){return e.serialize?.(t)??t}},c.default(t,"persist",e.persist??[]),t}class h extends t.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();var r,s;this._name=this.getName()??new.target.name,this._booted=new t.PromisedValue,this._computedStateKeys=new Set(Object.keys(e)),this._store=this.usesStore()&&(r=this._name,s={state:()=>this.getInitialState(),getters:e},m(),o.defineStore(r,s)())}get booted(){return this._booted}launch(){const handleError=e=>this._booted.reject(new ServiceBootError(this._name,e));try{this.frameworkBoot().then((()=>this.boot())).then((()=>this._booted.resolve())).catch(handleError)}catch(e){handleError(e)}return this._booted}hasState(e){return!!this._store&&(e in this._store.$state||this._computedStateKeys.has(e))}getState(e){const t=this._store;return e?t?t[e]:void 0:t||{}}setState(e,t){if(!this._store)return;const r="string"==typeof e?{[e]:t}:e;Object.assign(this._store.$state,r),this.onStateUpdated(r)}__get(e){return this.hasState(e)?this.getState(e):super.__get(e)}__set(e,t){this.setState({[e]:t})}onStateUpdated(e){const r=this.constructor.persist,o=t.objectOnly(e,r);if(t.isEmpty(o))return;const s=t.Storage.require(this._name);t.Storage.set(this._name,{...s,...this.serializePersistedState(t.objectDeepClone(o))})}usesStore(){return!1}getName(){return null}getInitialState(){return{}}getComputedStateDefinition(){return{}}serializePersistedState(e){return e}async frameworkBoot(){this.restorePersistedState()}async boot(){}restorePersistedState(){const e=this.constructor.persist;if(this.usesStore()&&!t.isEmpty(e))if(t.Storage.has(this._name)){const e=t.Storage.require(this._name);this.setState(e)}else t.Storage.set(this._name,t.objectOnly(this.getState(),e))}}c.default(h,"persist",[]);class v extends h{constructor(){super(...arguments),c.default(this,"listeners",{})}async emit(e,t){const r=[...this.listeners[e]??[]];await Promise.all(r.map((e=>e(t)))??[])}on(e,r){return(this.listeners[e]??=t.arr([])).push(r),()=>this.off(e,r)}once(e,r){let o=null;return t.tap((()=>o&&this.off(e,o)),(s=>{(this.listeners[e]??=t.arr([])).push(o=function(){return s(),r(...arguments)})}))}off(e,t){const r=this.listeners[e];r&&(r.remove(t),r.isEmpty()&&delete this.listeners[e])}}var g=t.facade(new v),x=f({name:"app",initialState:{plugins:{},environment:u.default.environment,sourceUrl:u.default.sourceUrl,isMounted:!1},computed:{development:e=>"development"===e.environment,testing:e=>"testing"===e.environment}});class b extends x{async reload(e){e&&t.updateLocationQueryParameters(e),location.reload(),await t.forever()}plugin(e){return this.plugins[e]??null}async boot(){g.once("application-mounted",(()=>this.setState({isMounted:!0})))}}var _=t.facade(new b);function k(e){return e}async function y(e){for(var t=arguments.length,r=new Array(t>1?t-1:0),o=1;o<t;o++)r[o-1]=arguments[o];_.setState("plugins",e.reduce(((e,t)=>(t.name&&(e[t.name]=t),e)),{})),await Promise.all(e.map((e=>e.install(...r)))??[])}function C(e){return{type:Array,default:e??(()=>[])}}function S(){return{type:Boolean,default:arguments.length>0&&void 0!==arguments[0]&&arguments[0]}}function w(){return e.ref()}function A(e){return e}function B(e,t){const r=Object.values(e);return{type:String,default:t??r[0]??null,validator:e=>r.includes(e)}}function E(t){const r=e.inject(t);return r?e.reactive(r):void 0}function j(e,r){return E(e)??t.fail(r??`Could not resolve '${e}' injection key`)}function G(e){return{type:e,default:null}}function V(){return{type:Number,default:arguments.length>0&&void 0!==arguments[0]?arguments[0]:null}}function M(){return{type:Object,default:arguments.length>0&&void 0!==arguments[0]?arguments[0]:null}}function $(){return{type:Array,required:!0}}function N(e){return{type:e,required:!0}}function H(){return{type:Number,required:!0}}function q(){return{type:Object,required:!0}}function P(){return{type:String,required:!0}}function L(){return{type:String,default:arguments.length>0&&void 0!==arguments[0]?arguments[0]:null}}const I={"initial-focus":{mounted(e,t){let{value:r}=t;!1!==r&&e.focus()}}};var R={install(e,t){const r={...I,...t.directives};for(const[t,o]of Object.entries(r))e.directive(t,o)}};const O={$app:_,$events:g};async function D(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),_.development&&Object.assign(window,t)}var T={async install(e,t){const r={...O,...t.services};e.use(p??m()),await D(e,r)}},z=f({name:"ui",initialState:{modals:[],snackbars:[]}});const F={AlertModal:"alert-modal",ConfirmModal:"confirm-modal",ErrorReportModal:"error-report-modal",LoadingModal:"loading-modal",Snackbar:"snackbar"};var U=t.facade(new class extends z{constructor(){super(...arguments),c.default(this,"modalCallbacks",{}),c.default(this,"components",{})}requireComponent(e){return this.components[e]??t.fail(`UI Component '${e}' is not defined!`)}alert(e,t){const r="string"==typeof t?{title:e,message:t}:{message:e};this.openModal(this.requireComponent(F.AlertModal),r)}async confirm(e,t){const r="string"==typeof t?{title:e,message:t}:{message:e},o=await this.openModal(this.requireComponent(F.ConfirmModal),r);return await o.beforeClose??!1}async loading(e,r){r="string"==typeof e?r:e;const o="string"==typeof e?e:void 0,s=await this.openModal(this.requireComponent(F.LoadingModal),{message:o});try{const[e]=await Promise.all([r,t.after({seconds:1})]);return e}finally{await this.closeModal(s.id)}}showSnackbar(r){let o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const s={id:t.uuid(),properties:{message:r,...o},component:o.component??e.markRaw(this.requireComponent(F.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(r,o){const s=t.uuid(),n={},a={id:s,properties:o??{},component:e.markRaw(r),beforeClose:new Promise((e=>n.willClose=e)),afterClose:new Promise((e=>n.closed=e))},l=this.modals.at(-1),i=this.modals.concat(a);return this.modalCallbacks[a.id]=n,this.setState({modals:i}),await e.nextTick(),await(l&&g.emit("hide-modal",{id:l.id})),await Promise.all([l||g.emit("show-overlays-backdrop"),g.emit("show-modal",{id:a.id})]),a}async closeModal(e,t){await g.emit("close-modal",{id:e,result:t})}async boot(){this.watchModalEvents(),this.watchMountedEvent()}watchModalEvents(){g.on("modal-will-close",(e=>{let{modal:t,result:r}=e;this.modalCallbacks[t.id]?.willClose?.(r),1===this.modals.length&&g.emit("hide-overlays-backdrop")})),g.on("modal-closed",(async e=>{let{modal:t,result:r}=e;this.setState("modals",this.modals.filter((e=>e.id!==t.id))),this.modalCallbacks[t.id]?.closed?.(r),delete this.modalCallbacks[t.id];const o=this.modals.at(-1);await(o&&g.emit("show-modal",{id:o.id}))}))}watchMountedEvent(){g.once("application-mounted",(async()=>{const e=document.getElementById("splash");e&&("0"!==window.getComputedStyle(e).opacity&&(e.style.opacity="0",await t.after({ms:600})),e.remove())}))}});var W=t.facade(new class extends h{constructor(){super(),c.default(this,"provider",void 0),this.provider={translate:e=>(_.development&&console.warn("Lang provider is missing"),e)}}setProvider(e){this.provider=e}translate(e,t){return this.provider.translate(e,t)??e}translateWithDefault(e,r,o){o??=r;const s="string"==typeof r?{}:r??{},n=this.provider.translate(e,s)??e;return n===e?Object.entries(s).reduce(((e,r)=>{let[o,s]=r;return e.replace(new RegExp(`\\{\\s*${o}\\s*\\}`,"g"),t.toString(s))}),o):n}});const K=W.translate.bind(W),J=W.translateWithDefault.bind(W);var Q=f({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 Z={Primary:"primary",Secondary:"secondary",Danger:"danger",Clear:"clear"};var Y=t.facade(new class extends Q{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?U.openModal(U.requireComponent(F.ErrorReportModal),{reports:t}):U.alert(J("errors.inspectEmpty","Nothing to inspect!"))}async report(e,t){if((_.development||_.testing)&&this.logError(e),!this.enabled)throw e;if(!_.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};U.showSnackbar(t??J("errors.notice","Something went wrong, but it's not your fault. Try again!"),{color:Z.Danger,actions:[{text:J("errors.viewDetails","View details"),dismiss:!0,handler:()=>U.openModal(U.requireComponent(F.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})))})}getErrorMessage(e){return"string"==typeof e?e:e instanceof Error||e instanceof t.JSError?e.message:t.isObject(e)?t.toString(e.message??e.description??"Unknown error object"):J("errors.unknown","Unknown Error")}logError(e){console.error(e),t.isObject(e)&&e.cause&&this.logError(e.cause)}async createErrorReport(e){return"string"==typeof e?{title:e}:e instanceof Error||e instanceof t.JSError?this.createErrorReportFromError(e):t.isObject(e)?t.objectWithoutEmpty({title:t.toString(e.name??e.title??J("errors.unknown","Unknown Error")),description:t.toString(e.message??e.description??J("errors.unknownDescription","Unknown error object")),error:e}):{title:J("errors.unknown","Unknown Error"),error:e}}async createStartupErrorReport(e){return e instanceof ServiceBootError?e.cause instanceof ServiceBootError?null:this.createErrorReport(e.cause):this.createErrorReport(e)}createErrorReportFromError(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return{title:e.name,description:e.message,details:e.stack,error:e,...t}}});const X={$errors:Y};function ee(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:()=>!1;const r=e=>t(e)||(e=>Y.instance?(Y.report(e),!0):(console.warn("Errors service hasn't been initialized properly!"),console.error(e),!0))(e);e.config.errorHandler=r,globalThis.onerror=(e,t,o,s,n)=>r(n??e),globalThis.onunhandledrejection=e=>r(e.reason)}var te={async install(e,t){ee(e,t.handleError),await D(e,X)}};const re={$lang:W};var oe={async install(e){e.config.globalProperties.$t??=K,e.config.globalProperties.$td=J,await D(e,re)}};function se(t,r){const o=g.on(t,r);e.onUnmounted((()=>o()))}function ne(){const r=e.useAttrs(),o=e.computed((()=>r.class));return[e.computed((()=>t.objectWithout(r,"class"))),o]}var ae=e.defineComponent({__name:"AGHeadlessModal",props:{cancellable:S(!0)},setup(t,{expose:r}){const o=t,s=e.ref(null),a=e.ref(!0),l=e.ref(!1),{modal:i}=j("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||(g.emit("modal-will-close",{modal:i,result:e}),await c(),l.value=!0,g.emit("modal-closed",{modal:i,result:e}))}return se("close-modal",(async({id:e,result:t})=>{e===i.id&&await u(t)})),se("hide-modal",(async({id:e})=>{e===i.id&&await c()})),se("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")}),(r,o)=>(e.openBlock(),e.createBlock(e.unref(n.Dialog),{ref_key:"$root",ref:s,open:!0,onClose:o[0]||(o[0]=e=>t.cancellable&&u())},{default:e.withCtx((()=>[e.renderSlot(r.$slots,"default",{close:u})])),_:3},512))}});ae.__file="src/components/headless/modals/AGHeadlessModal.vue";var le=e.defineComponent({__name:"AGModalContext",props:{modal:q(),childIndex:H()},setup(t){const r=t;return e.provide("modal",{modal:e.toRef(r,"modal"),childIndex:e.toRef(r,"childIndex")}),(r,o)=>(e.openBlock(),e.createBlock(e.resolveDynamicComponent(t.modal.component),e.normalizeProps(e.guardReactiveProps(t.modal.properties)),null,16))}});le.__file="src/components/modals/AGModalContext.vue";const ie=e.createElementVNode("div",{class:"pointer-events-none fixed inset-0 z-50 bg-black/30"},null,-1);var ce=e.defineComponent({__name:"AGHeadlessModalPanel",setup(t){const r=j("modal","could not obtain modal reference from <AGHeadlessModalPanel>, did you render this component manually? Show it using $ui.openModal() instead"),o=e.computed((()=>U.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},[ie,e.createVNode(le,{"child-index":e.unref(r).childIndex+1,modal:o.value},null,8,["child-index","modal"])],64)):e.createCommentVNode("v-if",!0)])),_:3}))}});ce.__file="src/components/headless/modals/AGHeadlessModalPanel.vue";const ue={class:"fixed inset-0 flex items-center justify-center p-8"};var de=e.defineComponent({inheritAttrs:!1,__name:"AGModal",props:{cancellable:S(!0)},setup(t,{expose:r}){const o=e.ref();return r({close:async()=>o.value?.close(),cancellable:e.computed((()=>!!o.value?.cancellable))}),(r,s)=>(e.openBlock(),e.createBlock(ae,{ref_key:"$headlessModal",ref:o,cancellable:t.cancellable,class:"relative z-50"},{default:e.withCtx((({close:t})=>[e.createElementVNode("div",ue,[e.createVNode(ce,{class:"flex max-h-full max-w-full flex-col overflow-hidden bg-white"},{default:e.withCtx((()=>[e.createElementVNode("div",e.mergeProps({class:"flex max-h-full flex-col overflow-auto p-4"},r.$attrs),[e.renderSlot(r.$slots,"default",{close:t})],16)])),_:2},1024)])])),_:3},8,["cancellable"]))}});function pe(e){return r=l.marked(e,{mangle:!1,headerIds:!1,renderer:t.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(r,{ADD_ATTR:["target"]});var r}de.__file="src/components/modals/AGModal.vue";var me=e.defineComponent({__name:"AGMarkdown",props:{as:L(),inline:S(),langKey:L(),langParams:M(),text:L()},setup(t){const r=t,o=e.computed((()=>r.text??(r.langKey&&K(r.langKey,r.langParams??{})))),s=e.computed((()=>{if(!o.value)return null;let e=pe(o.value);return r.inline&&(e=e.replace("<p>","<span>").replace("</p>","</span>")),e})),n=()=>e.h(r.as??(r.inline?"span":"div"),{class:r.inline?"":"prose",innerHTML:s.value});return(t,r)=>(e.openBlock(),e.createBlock(n))}});me.__file="src/components/lib/AGMarkdown.vue";var fe=e.defineComponent({__name:"AGAlertModal",props:{title:L(),message:P()},setup:t=>(r,o)=>(e.openBlock(),e.createBlock(de,null,{default:e.withCtx((()=>[t.title?(e.openBlock(),e.createBlock(me,{key:0,text:t.title,as:"h2",class:"font-semibold",inline:""},null,8,["text"])):e.createCommentVNode("v-if",!0),e.createVNode(me,{text:t.message},null,8,["text"])])),_:1}))});fe.__file="src/components/modals/AGAlertModal.vue";var he=e.defineComponent({__name:"AGHeadlessButton",props:{href:L(),url:L(),route:L(),routeParams:M((()=>({}))),routeQuery:M((()=>({}))),submit:S()},setup(r){const{href:o,url:s,route:n,routeParams:a,routeQuery:l,submit:i}=r,c=e.computed((()=>n?{tag:"router-link",props:{to:t.objectWithoutEmpty({name:n,params:a,query:l})}}:o||s?{tag:"a",props:{target:"_blank",href:o||s}}:{tag:"button",props:{type:i?"submit":"button"}}));return(t,r)=>(e.openBlock(),e.createBlock(e.resolveDynamicComponent(c.value.tag),e.normalizeProps(e.guardReactiveProps(c.value.props)),{default:e.withCtx((()=>[e.renderSlot(t.$slots,"default")])),_:3},16))}});he.__file="src/components/headless/forms/AGHeadlessButton.vue";var ve=e.defineComponent({__name:"AGButton",props:{color:B(Z,Z.Primary)},setup(t){const r=t,o=e.computed((()=>{switch(r.color){case Z.Secondary:return["text-white bg-gray-600","hover:bg-gray-500","focus-visible:outline-offset-2 focus-visible:outline-gray-600"].join(" ");case Z.Clear:return"hover:bg-gray-500/20 focus-visible:outline-gray-500/60";case Z.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(he,{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"]))}});ve.__file="src/components/forms/AGButton.vue";const ge={class:"mt-2 flex flex-row-reverse gap-2"};var xe=e.defineComponent({__name:"AGConfirmModal",props:{title:L(),message:P()},setup:t=>(r,o)=>(e.openBlock(),e.createBlock(de,{cancellable:!1},{default:e.withCtx((({close:o})=>[t.title?(e.openBlock(),e.createBlock(me,{key:0,text:t.title,as:"h1"},null,8,["text"])):e.createCommentVNode("v-if",!0),e.createVNode(me,{text:t.message},null,8,["text"]),e.createElementVNode("div",ge,[e.createVNode(ve,{onClick:e=>o(!0)},{default:e.withCtx((()=>[e.createTextVNode(e.toDisplayString(r.$td("ui.ok","OK")),1)])),_:2},1032,["onClick"]),e.createVNode(ve,{color:"secondary",onClick:e=>o()},{default:e.withCtx((()=>[e.createTextVNode(e.toDisplayString(r.$td("ui.cancel","Cancel")),1)])),_:2},1032,["onClick"])])])),_:1}))});xe.__file="src/components/modals/AGConfirmModal.vue";const be={viewBox:"0 0 20 20",width:"1.2em",height:"1.2em"},_e=[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 ke={name:"zondicons-cheveron-right",render:function(t,r){return e.openBlock(),e.createElementBlock("svg",be,_e)}};const ye={viewBox:"0 0 20 20",width:"1.2em",height:"1.2em"},Ce=[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 Se={name:"zondicons-cheveron-left",render:function(t,r){return e.openBlock(),e.createElementBlock("svg",ye,Ce)}};const we={reports:$()};function Ae(){return we}const Be={viewBox:"0 0 24 24",width:"1.2em",height:"1.2em"},Ee=[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 je={name:"mdi-console",render:function(t,r){return e.openBlock(),e.createElementBlock("svg",Be,Ee)}};const Ge={viewBox:"0 0 20 20",width:"1.2em",height:"1.2em"},Ve=[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 Me={name:"zondicons-copy",render:function(t,r){return e.openBlock(),e.createElementBlock("svg",Ge,Ve)}};const $e={viewBox:"0 0 24 24",width:"1.2em",height:"1.2em"},Ne=[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 He={name:"mdi-github",render:function(t,r){return e.openBlock(),e.createElementBlock("svg",$e,Ne)}};const qe={class:"flex"};var Pe=e.defineComponent({__name:"AGErrorReportModalButtons",props:{report:q()},setup(r){const o=r,s=e.computed((()=>o.report.description?`${o.report.title}: ${o.report.description}`:o.report.title)),n=e.computed((()=>{if(!_.sourceUrl)return!1;const e=encodeURIComponent(s.value),r=encodeURIComponent(["[Please, explain here what you were trying to do when this error appeared]","","Error details:","```",t.stringExcerpt(o.report.details??"Details missing from report",1800-e.length-_.sourceUrl.length).trim(),"```"].join("\n"));return`${_.sourceUrl}/issues/new?title=${e}&body=${r}`})),a=e.computed((()=>t.tap([{id:"clipboard",description:"Copy to clipboard",iconComponent:Me,async handler(){await navigator.clipboard.writeText(`${s.value}\n\n${o.report.details}`),U.showSnackbar(J("errors.copiedToClipboard","Debug information copied to clipboard"))}},{id:"console",description:"Log to console",iconComponent:je,handler(){window.error=o.report.error,console.error(o.report.error),U.showSnackbar(J("errors.addedToConsole","You can now use the **error** variable in the console"))}}],(e=>{n.value&&e.push({id:"github",description:"Report in GitHub",iconComponent:He,url:n.value})}))));return(t,r)=>(e.openBlock(),e.createElementBlock("div",qe,[(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(ve,{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))]))}});Pe.__file="src/components/modals/AGErrorReportModalButtons.vue";var Le=e.defineComponent({__name:"AGErrorReportModalTitle",props:{report:q(),currentReport:V(),totalReports:V()},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(me,{text:o.value,inline:""},null,8,["text"]))}});Le.__file="src/components/modals/AGErrorReportModalTitle.vue";const Ie={class:"flex items-center justify-between text-lg font-medium"},Re={class:"flex items-center"},Oe=["textContent"];var De=e.defineComponent({__name:"AGErrorReportModal",props:Ae(),setup(t){const r=t,o=e.ref(0),s=e.computed((()=>r.reports[o.value]));return(t,r)=>(e.openBlock(),e.createBlock(de,null,{default:e.withCtx((()=>[e.createElementVNode("div",null,[e.createElementVNode("h2",Ie,[e.createElementVNode("div",Re,[e.createVNode(Le,{report:s.value,"current-report":o.value+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(ve,{color:"clear",disabled:0===o.value,title:t.$td("errors.previousReport","Show previous report"),"aria-label":t.$td("errors.previousReport","Show previous report"),onClick:r[0]||(r[0]=e=>o.value--)},{default:e.withCtx((()=>[e.createVNode(e.unref(Se),{"aria-hidden":"true",class:"h-4 w-4"})])),_:1},8,["disabled","title","aria-label"]),e.createVNode(ve,{color:"clear",disabled:o.value===t.reports.length-1,title:t.$td("errors.nextReport","Show next report"),"aria-label":t.$td("errors.nextReport","Show next report"),onClick:r[1]||(r[1]=e=>o.value++)},{default:e.withCtx((()=>[e.createVNode(e.unref(ke),{"aria-hidden":"true",class:"h-4 w-4"})])),_:1},8,["disabled","title","aria-label"])],64)):e.createCommentVNode("v-if",!0)]),e.createVNode(Pe,{report:s.value},null,8,["report"])]),s.value.description?(e.openBlock(),e.createBlock(me,{key:0,text:s.value.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(s.value.details??t.$td("errors.detailsEmpty","This error is missing a stacktrace."))},null,8,Oe)])),_:1}))}});De.__file="src/components/modals/AGErrorReportModal.vue";var Te=e.defineComponent({__name:"AGLoadingModal",props:{message:L()},setup(t){const r=t,o=e.computed((()=>r.message??J("ui.loading","Loading...")));return(t,r)=>(e.openBlock(),e.createBlock(de,{cancellable:!1},{default:e.withCtx((()=>[e.createVNode(me,{text:o.value},null,8,["text"])])),_:1}))}});Te.__file="src/components/modals/AGLoadingModal.vue";const ze={options:$(),label:L(),noSelectionText:L()};function Fe(){return ze}var Ue=e.defineComponent({__name:"AGHeadlessInput",props:{as:L("div"),name:L(),modelValue:G([String,Number,Boolean])},emits:["update:modelValue"],setup(r,{expose:o,emit:s}){const n=r,a=e.computed((()=>l&&n.name?l.errors[n.name]??null:null)),l=e.inject("form",null),i={id:`input-${t.uuid()}`,value:e.computed((()=>l&&n.name?l.getFieldValue(n.name):n.modelValue)),errors:e.readonly(a),update(e){l&&n.name?l.setFieldValue(n.name,e):s("update:modelValue",e)}};return e.provide("input",i),o(i),(t,o)=>r.as?(e.openBlock(),e.createBlock(e.resolveDynamicComponent(r.as),{key:0},{default:e.withCtx((()=>[e.renderSlot(t.$slots,"default")])),_:3})):e.renderSlot(t.$slots,"default",{key:1})}});Ue.__file="src/components/headless/forms/AGHeadlessInput.vue";const We=["id"];var Ke=e.defineComponent({__name:"AGHeadlessInputError",setup(t){const r=j("input","<AGHeadlessInputError> must be a child of a <AGHeadlessInput>"),o=e.computed((()=>r.errors?J(`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,We)):e.createCommentVNode("v-if",!0)}});Ke.__file="src/components/headless/forms/AGHeadlessInputError.vue";const Je=["id","type","value","aria-invalid","aria-describedby","checked"];var Qe=e.defineComponent({__name:"AGHeadlessInputInput",props:{type:L("text")},setup(t){const r=t,o=e.ref(),s=j("input","<AGHeadlessInputInput> must be a child of a <AGHeadlessInput>"),n=e.computed((()=>s.value)),a=e.computed((()=>{if("checkbox"===r.type)return!!n.value}));function l(){o.value&&s.update("checkbox"===r.type?o.value.checked:o.value.value)}return(r,i)=>(e.openBlock(),e.createElementBlock("input",{id:e.unref(s).id,ref_key:"$input",ref:o,type:t.type,value:n.value,"aria-invalid":e.unref(s).errors?"true":"false","aria-describedby":e.unref(s).errors?`${e.unref(s).id}-error`:void 0,checked:a.value,onInput:l},null,40,Je))}});Qe.__file="src/components/headless/forms/AGHeadlessInputInput.vue";const Ze=["for"];var Ye=e.defineComponent({__name:"AGHeadlessInputLabel",setup(t){const r=j("input","<AGHeadlessInputLabel> must be a child of a <AGHeadlessInput>");return(t,o)=>(e.openBlock(),e.createElementBlock("label",{for:e.unref(r).id},[e.renderSlot(t.$slots,"default")],8,Ze))}});Ye.__file="src/components/headless/forms/AGHeadlessInputLabel.vue";var Xe=e.defineComponent({__name:"AGHeadlessSelect",props:{name:L(),modelValue:G(),...Fe()},emits:["update:modelValue"],setup(r,{expose:o,emit:s}){const a=r,l=e.inject("form",null),i=e.computed((()=>a.noSelectionText??J("select.noSelection","-"))),c=e.computed((()=>a.options.map((e=>({value:e,text:t.toString(t.isObject(e)&&"text"in e?e.text:e)}))))),u=e.computed((()=>{const e=l&&a.name?l.getFieldValue(a.name):a.modelValue;return c.value.find((t=>t.value===e))})),d=e.computed((()=>l&&a.name?l.errors[a.name]??null:null));function p(e){l&&a.name?l.setFieldValue(a.name,e):s("update:modelValue",e)}const m={id:`select-${t.uuid()}`,options:c,noSelectionText:i,selectedOption:u,errors:d,label:e.computed((()=>a.label)),buttonText:e.computed((()=>u.value?.text??i.value)),update:p};return e.provide("select",m),o(m),(t,r)=>(e.openBlock(),e.createBlock(e.unref(n.Listbox),{"model-value":u.value?.value,"onUpdate:modelValue":r[0]||(r[0]=e=>p(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"]))}});Xe.__file="src/components/headless/forms/AGHeadlessSelect.vue";var et=e.defineComponent({__name:"AGHeadlessSelectButton",props:{textClass:L()},setup(t){const r=j("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}))}});et.__file="src/components/headless/forms/AGHeadlessSelectButton.vue";const tt=["id"];var rt=e.defineComponent({__name:"AGHeadlessSelectError",setup(t){const r=j("select","<AGHeadlessSelectError> must be a child of a <AGHeadlessSelect>"),o=e.computed((()=>r.errors?J(`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,tt)):e.createCommentVNode("v-if",!0)}});rt.__file="src/components/headless/forms/AGHeadlessSelectError.vue";var ot=e.defineComponent({__name:"AGHeadlessSelectLabel",setup(t){const r=j("select","<AGHeadlessSelectLabel> must be a child of a <AGHeadlessSelect>");return(t,o)=>e.unref(r).label?(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)}});ot.__file="src/components/headless/forms/AGHeadlessSelectLabel.vue";var st=e.defineComponent({__name:"AGHeadlessSelectOption",props:{value:N(),selectedClass:L(),unselectedClass:L(),activeClass:L(),inactiveClass:L()},setup(t){const r=t,o=j("select","<AGHeadlessSelectOption> must be a child of a <AGHeadlessSelect>"),s=e.computed((()=>o.options.find((e=>e.value===r.value))));return(r,o)=>(e.openBlock(),e.createBlock(e.unref(n.ListboxOption),{value:t.value,as:"template"},{default:e.withCtx((({active:o,selected:n,disabled:a})=>[e.renderSlot(r.$slots,"default",{active:o,selected:n,disabled:a},(()=>[e.createElementVNode("li",{class:e.normalizeClass({[t.activeClass??"active"]:o,[t.inactiveClass??"inactive"]:!o,[t.selectedClass??"selected"]:n,[t.unselectedClass??"unselected"]:!n})},e.toDisplayString(s.value?.text),3)]))])),_:3},8,["value"]))}});st.__file="src/components/headless/forms/AGHeadlessSelectOption.vue";var nt=e.defineComponent({__name:"AGHeadlessModalTitle",props:{as:L("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"]))});nt.__file="src/components/headless/modals/AGHeadlessModalTitle.vue";const at={class:"pointer-events-auto"};var lt=e.defineComponent({__name:"AGHeadlessSnackbar",setup:t=>(t,r)=>(e.openBlock(),e.createElementBlock("div",at,[e.renderSlot(t.$slots,"default")]))});lt.__file="src/components/headless/snackbars/AGHeadlessSnackbar.vue";const it=t.objectWithout(Z,["Primary","Clear"]),ct={id:P(),message:P(),actions:C((()=>[])),color:B(it,Z.Secondary)};function ut(){return ct}var dt=e.defineComponent({__name:"AGSnackbar",props:ut(),setup(t){const r=t,o=e.computed((()=>r.color===Z.Danger?"bg-red-200 text-red-900":"bg-gray-900 text-white"));return(t,s)=>(e.openBlock(),e.createBlock(lt,{class:e.normalizeClass(["flex flex-row items-center justify-center gap-3 p-4",o.value])},{default:e.withCtx((()=>[e.createVNode(me,{text:t.message,inline:""},null,8,["text"]),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.actions,((o,s)=>(e.openBlock(),e.createBlock(ve,{key:s,color:t.color,onClick:e=>function(e){e.handler?.(),e.dismiss&&U.hideSnackbar(r.id)}(o)},{default:e.withCtx((()=>[e.createTextVNode(e.toDisplayString(o.text),1)])),_:2},1032,["color","onClick"])))),128))])),_:1},8,["class"]))}});dt.__file="src/components/snackbars/AGSnackbar.vue";const pt={$ui:U};var mt={async install(e,t){const r={[F.AlertModal]:fe,[F.ConfirmModal]:xe,[F.ErrorReportModal]:De,[F.LoadingModal]:Te,[F.Snackbar]:dt};Object.entries({...r,...t.components}).forEach((e=>{let[t,r]=e;return U.registerComponent(t,r)})),await D(e,pt)}};const ft={key:0};var ht=e.defineComponent({__name:"AGAppModals",setup(t){const r=e.computed((()=>U.modals[0]??null));return(t,o)=>r.value?(e.openBlock(),e.createElementBlock("aside",ft,[e.createVNode(le,{"child-index":1,modal:r.value},null,8,["modal"])])):e.createCommentVNode("v-if",!0)}});ht.__file="src/components/AGAppModals.vue";const vt={"aria-live":"assertive",class:"z-60 pointer-events-none fixed inset-0 flex items-end px-4 py-6 sm:p-6"},gt={class:"flex w-full flex-col items-end space-y-4"};const xt={render:function(t,r){return e.openBlock(),e.createElementBlock("div",vt,[e.createElementVNode("div",gt,[(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 bt=xt,_t=e.defineComponent({__name:"AGAppOverlays",setup(t){const r=e.ref(null),o=e.ref(!0);return se("show-overlays-backdrop",(async()=>{r.value&&o.value&&(o.value=!1,r.value.classList.remove("opacity-0"))})),se("hide-overlays-backdrop",(async()=>{r.value&&!o.value&&(o.value=!0,r.value.classList.add("opacity-0"))})),(t,o)=>(e.openBlock(),e.createElementBlock(e.Fragment,null,[e.createElementVNode("div",{ref_key:"$backdrop",ref:r,class:"pointer-events-none fixed inset-0 z-50 bg-black/30 opacity-0"},null,512),e.createVNode(ht),e.createVNode(bt)],64))}});_t.__file="src/components/AGAppOverlays.vue";const kt={class:"grid flex-grow place-items-center"},yt={class:"flex flex-col items-center space-y-6 p-8"},Ct={class:"mt-2 text-center text-4xl font-medium text-red-600"},St={class:"mt-4 flex flex-col space-y-4"};var wt=e.defineComponent({__name:"AGStartupCrash",setup:t=>(t,r)=>(e.openBlock(),e.createElementBlock("div",kt,[e.createElementVNode("div",yt,[e.createElementVNode("h1",Ct,e.toDisplayString(t.$td("startupCrash.title","Something went wrong!")),1),e.createVNode(me,{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",St,[e.createVNode(ve,{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(ve,{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 At={class:"flex min-h-full flex-col text-base font-normal leading-tight text-gray-900 antialiased"};var Bt=e.defineComponent({__name:"AGAppLayout",setup:t=>(t,r)=>(e.openBlock(),e.createElementBlock("div",At,[t.$errors.hasStartupErrors?e.renderSlot(t.$slots,"startup-crash",{key:0},(()=>[e.createVNode(wt)])):e.renderSlot(t.$slots,"default",{key:1}),e.createVNode(_t)]))});Bt.__file="src/components/AGAppLayout.vue";const Et={class:"ml-2"};var jt=e.defineComponent({inheritAttrs:!1,__name:"AGCheckbox",props:{name:L()},setup(t){const r=w();return(o,s)=>(e.openBlock(),e.createBlock(Ue,{ref_key:"$input",ref:r,name:t.name,class:"flex"},{default:e.withCtx((()=>[e.createVNode(Qe,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",Et,[o.$slots.default?(e.openBlock(),e.createBlock(Ye,{key:0},{default:e.withCtx((()=>[e.renderSlot(o.$slots,"default")])),_:3})):e.createCommentVNode("v-if",!0),e.createVNode(Ke,{class:"text-sm text-red-600"})])])),_:3},8,["name"]))}});jt.__file="src/components/forms/AGCheckbox.vue";const Gt=["onSubmit"];var Vt=e.defineComponent({__name:"AGForm",props:{form:M()},emits:["submit"],setup(t,{emit:r}){const o=t;function s(){o.form&&!o.form.submit()||r("submit")}return e.provide("form",o.form),(t,r)=>(e.openBlock(),e.createElementBlock("form",{onSubmit:e.withModifiers(s,["prevent"])},[e.renderSlot(t.$slots,"default")],40,Gt))}});Vt.__file="src/components/forms/AGForm.vue";const Mt={class:"absolute bottom-0 left-0 translate-y-full"};var $t=e.defineComponent({inheritAttrs:!1,__name:"AGInput",props:{name:L()},setup(t){const r=w(),[o,s]=ne();return(n,a)=>(e.openBlock(),e.createBlock(Ue,{ref_key:"$input",ref:r,class:e.normalizeClass(["relative flex flex-col items-center",e.unref(s)]),name:t.name},{default:e.withCtx((()=>[e.createVNode(Qe,e.mergeProps(e.unref(o),{class:["block w-full border-0 py-1.5 text-gray-900 ring-1 ring-inset ring-gray-300 placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-indigo-600",{"ring-1 ring-red-500":e.unref(r)?.errors}]}),null,16,["class"]),e.createElementVNode("div",Mt,[e.createVNode(Ke,{class:"mt-1 text-sm text-red-500"})])])),_:1},8,["class","name"]))}});$t.__file="src/components/forms/AGInput.vue";const Nt={viewBox:"0 0 20 20",width:"1.2em",height:"1.2em"},Ht=[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 qt={name:"zondicons-cheveron-down",render:function(t,r){return e.openBlock(),e.createElementBlock("svg",Nt,Ht)}};const Pt={class:"pointer-events-none absolute inset-y-0 right-0 flex items-center pr-2"};var Lt=e.defineComponent({__name:"AGSelect",props:Fe(),setup(t){const r=t,o=w();return(t,s)=>(e.openBlock(),e.createBlock(Xe,e.mergeProps(r,{ref_key:"$select",ref:o,as:"div"}),{default:e.withCtx((()=>[e.createVNode(ot,{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(et,{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",Pt,[e.createVNode(e.unref(qt),{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(st,{key:r,value:t.value,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(rt,{class:"mt-2 text-sm text-red-600"})])),_:1},16))}});Lt.__file="src/components/forms/AGSelect.vue";var It=e.defineComponent({__name:"AGErrorMessage",props:{error:q()},setup(t){const r=t,o=e.computed((()=>Y.getErrorMessage(r.error)));return(t,r)=>(e.openBlock(),e.createBlock(me,{text:o.value,inline:""},null,8,["text"]))}});It.__file="src/components/lib/AGErrorMessage.vue";var Rt=e.defineComponent({__name:"AGLink",setup:t=>(t,r)=>(e.openBlock(),e.createBlock(he,{class:"font-medium hover:underline"},{default:e.withCtx((()=>[e.renderSlot(t.$slots,"default")])),_:3}))});Rt.__file="src/components/lib/AGLink.vue";var Ot=e.defineComponent({__name:"AGModalTitle",setup:t=>(t,r)=>(e.openBlock(),e.createBlock(nt,{class:"mb-2 font-semibold"},{default:e.withCtx((()=>[e.renderSlot(t.$slots,"default")])),_:3}))});Ot.__file="src/components/modals/AGModalTitle.vue";const Dt={String:"string",Number:"number",Boolean:"boolean",Object:"object"},Tt=new WeakMap;class zt extends t.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),this._fields=t,this._submitted=e.ref(!1),this._data=this.getInitialData(t),this._errors=this.getInitialErrors(t),Tt.set(this,e.computed((()=>!Object.values(this._errors).some((e=>null!==e))))),this.errors=e.readonly(this._errors)}get valid(){return!!Tt.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]}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(){return this._submitted.value=!0,this.validate()}__get(e){return e in this._fields?this._data[e]:super.__get(e)}__set(e,t){e in this._fields?Object.assign(this._data,{[e]:t}):super.__set(e,t)}getFieldErrors(e,t){const r=[];return t.rules?.includes("required")&&!this._data[e]&&r.push("required"),r.length>0?r:null}getInitialData(t){if(this.static().isConjuring())return{};const r=Object.entries(t).reduce(((e,t)=>{let[r,o]=t;return e[r]=o.default??null,e}),{});return e.reactive(r)}getInitialErrors(t){if(this.static().isConjuring())return{};const r=Object.keys(t).reduce(((e,t)=>(e[t]=null,e)),{});return e.reactive(r)}resetData(){for(const[e,t]of Object.entries(this._fields))this._data[e]=t.default??null}resetErrors(e){Object.keys(this._errors).forEach((e=>delete this._errors[e])),e&&Object.assign(this._errors,e)}}Object.defineProperty(exports,"AGHeadlessSelectOptions",{enumerable:!0,get:function(){return n.ListboxOptions}}),exports.AGAlertModal=fe,exports.AGAppLayout=Bt,exports.AGAppOverlays=_t,exports.AGButton=ve,exports.AGCheckbox=jt,exports.AGConfirmModal=xe,exports.AGErrorMessage=It,exports.AGErrorReportModalButtons=Pe,exports.AGErrorReportModalTitle=Le,exports.AGForm=Vt,exports.AGHeadlessButton=he,exports.AGHeadlessInput=Ue,exports.AGHeadlessInputError=Ke,exports.AGHeadlessInputInput=Qe,exports.AGHeadlessInputLabel=Ye,exports.AGHeadlessModal=ae,exports.AGHeadlessModalPanel=ce,exports.AGHeadlessModalTitle=nt,exports.AGHeadlessSelect=Xe,exports.AGHeadlessSelectButton=et,exports.AGHeadlessSelectError=rt,exports.AGHeadlessSelectLabel=ot,exports.AGHeadlessSelectOption=st,exports.AGHeadlessSnackbar=lt,exports.AGInput=$t,exports.AGLink=Rt,exports.AGLoadingModal=Te,exports.AGMarkdown=me,exports.AGModal=de,exports.AGModalContext=le,exports.AGModalTitle=Ot,exports.AGSelect=Lt,exports.AGSnackbar=dt,exports.AGStartupCrash=wt,exports.App=_,exports.AppService=b,exports.Colors=Z,exports.Errors=Y,exports.Events=g,exports.EventsService=v,exports.FormFieldTypes=Dt,exports.Lang=W,exports.Service=h,exports.SnackbarColors=it,exports.UI=U,exports.UIComponents=F,exports.arrayProp=C,exports.booleanInput=function(e){return{default:e,type:Dt.Boolean}},exports.booleanProp=S,exports.bootServices=D,exports.bootstrapApplication=async function(t){let r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const o=[R,te,oe,T,mt,...r.plugins??[]],s=e.createApp(t);await y(o,s,r),s.mount("#app"),s._container?.classList.remove("loading"),g.emit("application-mounted")},exports.componentRef=w,exports.defineDirective=A,exports.definePlugin=k,exports.defineServiceState=f,exports.enumProp=B,exports.errorReportModalProps=we,exports.extractSelectProps=function(e){return Object.keys(ze).reduce(((t,r)=>{const o=r;return t[o]=e[o],t}),{})},exports.injectOrFail=function(r,o){return e.inject(r)??t.fail(o??`Could not resolve '${r}' injection key`)},exports.injectReactive=E,exports.injectReactiveOrFail=j,exports.installPlugins=y,exports.mixedProp=G,exports.numberInput=function(e){return{default:e,type:Dt.Number}},exports.numberProp=V,exports.objectProp=M,exports.onCleanMounted=function(r){let o=t.noop;e.onMounted((()=>o=r())),e.onUnmounted((()=>o()))},exports.requiredArrayProp=$,exports.requiredBooleanInput=function(e){return{default:e,type:Dt.Boolean,rules:"required"}},exports.requiredEnumProp=function(e){const t=Object.values(e);return{type:String,required:!0,validator:e=>t.includes(e)}},exports.requiredMixedProp=N,exports.requiredNumberInput=function(e){return{default:e,type:Dt.Number,rules:"required"}},exports.requiredNumberProp=H,exports.requiredObjectProp=q,exports.requiredStringInput=function(e){return{default:e,type:Dt.String,rules:"required"}},exports.requiredStringProp=P,exports.selectProps=ze,exports.snackbarProps=ct,exports.stringInput=function(e){return{default:e,type:Dt.String}},exports.stringProp=L,exports.translate=K,exports.translateWithDefault=J,exports.useErrorReportModalProps=Ae,exports.useEvent=se,exports.useForm=function(e){return new zt(e)},exports.useInputAttrs=ne,exports.useSelectProps=Fe,exports.useSnackbarProps=ut;
2
- //# sourceMappingURL=aerogel-core.cjs.js.map