@aerogel/core 0.0.0-next.88c59e62f64db70aedfbc4c31b5bbc287be44483 → 0.0.0-next.8ae083000611b11799d37033e9a5250d0d07c324
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.
- package/dist/aerogel-core.css +1 -0
- package/dist/aerogel-core.d.ts +2185 -992
- package/dist/aerogel-core.js +3273 -0
- package/dist/aerogel-core.js.map +1 -0
- package/package.json +37 -34
- package/src/bootstrap/bootstrap.test.ts +7 -10
- package/src/bootstrap/index.ts +41 -15
- package/src/bootstrap/options.ts +4 -1
- package/src/components/AppLayout.vue +14 -0
- package/src/components/{AGAppModals.vue → AppModals.vue} +3 -4
- package/src/components/AppOverlays.vue +9 -0
- package/src/components/AppToasts.vue +16 -0
- package/src/components/contracts/AlertModal.ts +8 -0
- package/src/components/contracts/Button.ts +16 -0
- package/src/components/contracts/ConfirmModal.ts +46 -0
- package/src/components/contracts/DropdownMenu.ts +20 -0
- package/src/components/contracts/ErrorReportModal.ts +32 -0
- package/src/components/contracts/Input.ts +26 -0
- package/src/components/contracts/LoadingModal.ts +26 -0
- package/src/components/contracts/Modal.ts +21 -0
- package/src/components/contracts/PromptModal.ts +34 -0
- package/src/components/contracts/Select.ts +45 -0
- package/src/components/contracts/Toast.ts +15 -0
- package/src/components/contracts/index.ts +11 -0
- package/src/components/headless/HeadlessButton.vue +51 -0
- package/src/components/headless/HeadlessInput.vue +59 -0
- package/src/components/headless/HeadlessInputDescription.vue +27 -0
- package/src/components/headless/{forms/AGHeadlessInputError.vue → HeadlessInputError.vue} +4 -8
- package/src/components/headless/HeadlessInputInput.vue +75 -0
- package/src/components/headless/HeadlessInputLabel.vue +18 -0
- package/src/components/headless/HeadlessInputTextArea.vue +40 -0
- package/src/components/headless/HeadlessModal.vue +57 -0
- package/src/components/headless/HeadlessModalContent.vue +30 -0
- package/src/components/headless/HeadlessModalDescription.vue +12 -0
- package/src/components/headless/HeadlessModalOverlay.vue +12 -0
- package/src/components/headless/HeadlessModalTitle.vue +12 -0
- package/src/components/headless/HeadlessSelect.vue +120 -0
- package/src/components/headless/HeadlessSelectError.vue +25 -0
- package/src/components/headless/HeadlessSelectLabel.vue +25 -0
- package/src/components/headless/HeadlessSelectOption.vue +34 -0
- package/src/components/headless/HeadlessSelectOptions.vue +42 -0
- package/src/components/headless/HeadlessSelectTrigger.vue +22 -0
- package/src/components/headless/HeadlessSelectValue.vue +18 -0
- package/src/components/headless/HeadlessToast.vue +18 -0
- package/src/components/headless/HeadlessToastAction.vue +13 -0
- package/src/components/headless/index.ts +19 -3
- package/src/components/index.ts +6 -9
- package/src/components/ui/AdvancedOptions.vue +18 -0
- package/src/components/ui/AlertModal.vue +14 -0
- package/src/components/ui/Button.vue +98 -0
- package/src/components/ui/Checkbox.vue +56 -0
- package/src/components/ui/ConfirmModal.vue +45 -0
- package/src/components/ui/DropdownMenu.vue +32 -0
- package/src/components/ui/DropdownMenuOption.vue +14 -0
- package/src/components/ui/DropdownMenuOptions.vue +27 -0
- package/src/components/ui/EditableContent.vue +82 -0
- package/src/components/ui/ErrorMessage.vue +15 -0
- package/src/components/ui/ErrorReportModal.vue +67 -0
- package/src/components/{modals/AGErrorReportModalButtons.vue → ui/ErrorReportModalButtons.vue} +38 -29
- package/src/components/ui/ErrorReportModalTitle.vue +24 -0
- package/src/components/ui/Form.vue +24 -0
- package/src/components/ui/Input.vue +56 -0
- package/src/components/ui/Link.vue +12 -0
- package/src/components/ui/LoadingModal.vue +34 -0
- package/src/components/ui/Markdown.vue +85 -0
- package/src/components/ui/Modal.vue +122 -0
- package/src/components/ui/ModalContext.vue +31 -0
- package/src/components/ui/ProgressBar.vue +51 -0
- package/src/components/ui/PromptModal.vue +38 -0
- package/src/components/ui/Select.vue +27 -0
- package/src/components/ui/SelectLabel.vue +17 -0
- package/src/components/ui/SelectOption.vue +29 -0
- package/src/components/ui/SelectOptions.vue +35 -0
- package/src/components/ui/SelectTrigger.vue +29 -0
- package/src/components/ui/SettingsModal.vue +15 -0
- package/src/components/ui/StartupCrash.vue +31 -0
- package/src/components/ui/Toast.vue +44 -0
- package/src/components/ui/index.ts +30 -0
- package/src/directives/index.ts +13 -5
- package/src/directives/measure.ts +40 -0
- package/src/errors/Errors.state.ts +1 -1
- package/src/errors/Errors.ts +27 -34
- package/src/errors/JobCancelledError.ts +3 -0
- package/src/errors/index.ts +19 -29
- package/src/errors/utils.ts +35 -0
- package/src/forms/FormController.test.ts +110 -0
- package/src/forms/FormController.ts +246 -0
- package/src/forms/index.ts +3 -2
- package/src/forms/utils.ts +51 -20
- package/src/forms/validation.ts +19 -0
- package/src/index.css +73 -0
- package/src/{main.ts → index.ts} +3 -0
- package/src/jobs/Job.ts +147 -0
- package/src/jobs/index.ts +10 -0
- package/src/jobs/listeners.ts +3 -0
- package/src/jobs/status.ts +4 -0
- package/src/lang/DefaultLangProvider.ts +46 -0
- package/src/lang/Lang.state.ts +11 -0
- package/src/lang/Lang.ts +44 -29
- package/src/lang/index.ts +12 -6
- package/src/lang/settings/Language.vue +48 -0
- package/src/lang/settings/index.ts +10 -0
- package/src/plugins/Plugin.ts +1 -1
- package/src/plugins/index.ts +10 -7
- package/src/services/App.state.ts +39 -7
- package/src/services/App.ts +49 -6
- package/src/services/Cache.ts +43 -0
- package/src/services/Events.test.ts +39 -0
- package/src/services/Events.ts +110 -36
- package/src/services/Service.ts +154 -49
- package/src/services/Storage.ts +20 -0
- package/src/services/index.ts +18 -6
- package/src/services/store.ts +8 -5
- package/src/services/utils.ts +18 -0
- package/src/testing/index.ts +26 -0
- package/src/testing/setup.ts +11 -0
- package/src/ui/UI.state.ts +14 -12
- package/src/ui/UI.ts +314 -95
- package/src/ui/index.ts +32 -27
- package/src/ui/utils.ts +16 -0
- package/src/utils/classes.ts +49 -0
- package/src/utils/composition/events.ts +4 -5
- package/src/utils/composition/forms.ts +20 -4
- package/src/utils/composition/persistent.test.ts +33 -0
- package/src/utils/composition/persistent.ts +11 -0
- package/src/utils/composition/state.test.ts +47 -0
- package/src/utils/composition/state.ts +33 -0
- package/src/utils/index.ts +5 -0
- package/src/utils/markdown.test.ts +50 -0
- package/src/utils/markdown.ts +19 -6
- package/src/utils/types.ts +3 -0
- package/src/utils/vue.ts +28 -118
- package/.eslintrc.js +0 -3
- package/dist/aerogel-core.cjs.js +0 -2
- package/dist/aerogel-core.cjs.js.map +0 -1
- package/dist/aerogel-core.esm.js +0 -2
- package/dist/aerogel-core.esm.js.map +0 -1
- package/dist/virtual.d.ts +0 -11
- package/noeldemartin.config.js +0 -5
- package/src/components/AGAppLayout.vue +0 -11
- package/src/components/AGAppOverlays.vue +0 -37
- package/src/components/AGAppSnackbars.vue +0 -13
- package/src/components/basic/AGErrorMessage.vue +0 -16
- package/src/components/basic/AGLink.vue +0 -9
- package/src/components/basic/AGMarkdown.vue +0 -36
- package/src/components/basic/index.ts +0 -5
- package/src/components/constants.ts +0 -8
- package/src/components/forms/AGButton.vue +0 -44
- package/src/components/forms/AGCheckbox.vue +0 -35
- package/src/components/forms/AGForm.vue +0 -26
- package/src/components/forms/AGInput.vue +0 -36
- package/src/components/forms/index.ts +0 -4
- package/src/components/headless/forms/AGHeadlessButton.vue +0 -51
- package/src/components/headless/forms/AGHeadlessInput.ts +0 -8
- package/src/components/headless/forms/AGHeadlessInput.vue +0 -54
- package/src/components/headless/forms/AGHeadlessInputInput.vue +0 -45
- package/src/components/headless/forms/AGHeadlessInputLabel.vue +0 -16
- package/src/components/headless/forms/AGHeadlessSelect.ts +0 -31
- package/src/components/headless/forms/AGHeadlessSelect.vue +0 -45
- package/src/components/headless/forms/AGHeadlessSelectButton.ts +0 -3
- package/src/components/headless/forms/AGHeadlessSelectLabel.ts +0 -3
- package/src/components/headless/forms/AGHeadlessSelectOption.ts +0 -8
- package/src/components/headless/forms/AGHeadlessSelectOptions.ts +0 -3
- package/src/components/headless/forms/index.ts +0 -12
- package/src/components/headless/modals/AGHeadlessModal.ts +0 -7
- package/src/components/headless/modals/AGHeadlessModal.vue +0 -88
- package/src/components/headless/modals/AGHeadlessModalPanel.vue +0 -28
- package/src/components/headless/modals/AGHeadlessModalTitle.vue +0 -13
- package/src/components/headless/modals/index.ts +0 -6
- package/src/components/headless/snackbars/AGHeadlessSnackbar.vue +0 -10
- package/src/components/headless/snackbars/index.ts +0 -25
- package/src/components/modals/AGAlertModal.vue +0 -25
- package/src/components/modals/AGConfirmModal.vue +0 -30
- package/src/components/modals/AGErrorReportModal.ts +0 -20
- package/src/components/modals/AGErrorReportModal.vue +0 -62
- package/src/components/modals/AGErrorReportModalTitle.vue +0 -25
- package/src/components/modals/AGLoadingModal.vue +0 -19
- package/src/components/modals/AGModal.ts +0 -10
- package/src/components/modals/AGModal.vue +0 -37
- package/src/components/modals/AGModalContext.ts +0 -8
- package/src/components/modals/AGModalContext.vue +0 -22
- package/src/components/modals/AGModalTitle.vue +0 -9
- package/src/components/modals/index.ts +0 -23
- package/src/components/snackbars/AGSnackbar.vue +0 -42
- package/src/components/snackbars/index.ts +0 -3
- package/src/directives/initial-focus.ts +0 -11
- package/src/forms/Form.test.ts +0 -58
- package/src/forms/Form.ts +0 -179
- package/src/forms/composition.ts +0 -6
- package/src/types/virtual.d.ts +0 -11
- package/tsconfig.json +0 -11
- package/vite.config.ts +0 -14
|
@@ -1,23 +1,22 @@
|
|
|
1
1
|
import { onUnmounted } from 'vue';
|
|
2
2
|
|
|
3
|
-
import Events from '
|
|
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
|
-
|
|
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<Event extends string>(event: UnknownEvent<Event>, listener: EventListener): void;
|
|
18
16
|
|
|
19
17
|
export function useEvent(event: string, listener: EventListener): void {
|
|
20
|
-
|
|
18
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
19
|
+
const unsubscribe = Events.on(event as any, listener);
|
|
21
20
|
|
|
22
21
|
onUnmounted(() => unsubscribe());
|
|
23
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
|
-
|
|
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
|
|
23
|
+
const classes = computed(() => attrs.class);
|
|
8
24
|
const inputAttrs = computed(() => objectWithout(attrs, 'class'));
|
|
9
25
|
|
|
10
|
-
return [inputAttrs,
|
|
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
|
+
}
|
package/src/utils/index.ts
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
|
+
export * from './classes';
|
|
1
2
|
export * from './composition/events';
|
|
2
3
|
export * from './composition/forms';
|
|
3
4
|
export * from './composition/hooks';
|
|
5
|
+
export * from './composition/persistent';
|
|
6
|
+
export * from './composition/state';
|
|
7
|
+
export * from './markdown';
|
|
8
|
+
export * from './types';
|
|
4
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
|
+
}
|
package/src/utils/markdown.ts
CHANGED
|
@@ -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(
|
|
8
|
-
return Renderer.prototype.link.apply(this, [
|
|
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
|
-
|
|
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
|
}
|
package/src/utils/vue.ts
CHANGED
|
@@ -1,52 +1,21 @@
|
|
|
1
|
-
import { fail } from '@noeldemartin/utils';
|
|
2
|
-
import { inject, reactive
|
|
3
|
-
import type { Directive, InjectionKey,
|
|
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
4
|
|
|
5
|
-
type
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
};
|
|
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] };
|
|
9
8
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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>>();
|
|
9
|
+
function renderVNodeAttrs(node: VNode): string {
|
|
10
|
+
return Object.entries(node.props ?? {}).reduce((attrs, [name, value]) => {
|
|
11
|
+
return attrs + `${name}="${toString(value)}"`;
|
|
12
|
+
}, '');
|
|
31
13
|
}
|
|
32
14
|
|
|
33
15
|
export function defineDirective(directive: Directive): Directive {
|
|
34
16
|
return directive;
|
|
35
17
|
}
|
|
36
18
|
|
|
37
|
-
export function enumProp<Enum extends Record<string, unknown>>(
|
|
38
|
-
enumeration: Enum,
|
|
39
|
-
defaultValue?: Enum[keyof Enum],
|
|
40
|
-
): OptionalProp<Enum[keyof Enum]> {
|
|
41
|
-
const values = Object.values(enumeration) as Enum[keyof Enum][];
|
|
42
|
-
|
|
43
|
-
return {
|
|
44
|
-
type: String as unknown as PropType<Enum[keyof Enum]>,
|
|
45
|
-
default: defaultValue ?? values[0] ?? null,
|
|
46
|
-
validator: (value) => values.includes(value as Enum[keyof Enum]),
|
|
47
|
-
};
|
|
48
|
-
}
|
|
49
|
-
|
|
50
19
|
export function injectReactive<T extends object>(key: InjectionKey<T> | string): UnwrapNestedRefs<T> | undefined {
|
|
51
20
|
const value = inject(key);
|
|
52
21
|
|
|
@@ -57,90 +26,31 @@ export function injectReactiveOrFail<T extends object>(
|
|
|
57
26
|
key: InjectionKey<T> | string,
|
|
58
27
|
errorMessage?: string,
|
|
59
28
|
): UnwrapNestedRefs<T> {
|
|
60
|
-
return injectReactive(key) ?? fail(errorMessage ?? `Could not resolve '${key}' injection key`);
|
|
29
|
+
return injectReactive(key) ?? fail(errorMessage ?? `Could not resolve '${toString(key)}' injection key`);
|
|
61
30
|
}
|
|
62
31
|
|
|
63
32
|
export function injectOrFail<T>(key: InjectionKey<T> | string, errorMessage?: string): T {
|
|
64
|
-
return inject(key) ?? fail(errorMessage ?? `Could not resolve '${key}' injection key`);
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
export function mixedProp<T>(type?: PropType<T>): OptionalProp<T | null> {
|
|
68
|
-
return {
|
|
69
|
-
type,
|
|
70
|
-
default: null,
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
export function numberProp(): OptionalProp<number | null>;
|
|
75
|
-
export function numberProp(defaultValue: number): OptionalProp<number>;
|
|
76
|
-
export function numberProp(defaultValue: number | null = null): OptionalProp<number | null> {
|
|
77
|
-
return {
|
|
78
|
-
type: Number,
|
|
79
|
-
default: defaultValue,
|
|
80
|
-
};
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
export function objectProp<T = Object>(): OptionalProp<T | null>;
|
|
84
|
-
export function objectProp<T>(defaultValue: () => T): OptionalProp<T>;
|
|
85
|
-
export function objectProp<T = Object>(defaultValue: (() => T) | null = null): OptionalProp<T | null> {
|
|
86
|
-
return {
|
|
87
|
-
type: Object,
|
|
88
|
-
default: defaultValue,
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
export function requiredArrayProp<T>(): RequiredProp<T[]> {
|
|
93
|
-
return {
|
|
94
|
-
type: Array as PropType<T[]>,
|
|
95
|
-
required: true,
|
|
96
|
-
};
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
export function requiredEnumProp<Enum extends Record<string, unknown>>(
|
|
100
|
-
enumeration: Enum,
|
|
101
|
-
): RequiredProp<Enum[keyof Enum]> {
|
|
102
|
-
const values = Object.values(enumeration);
|
|
103
|
-
|
|
104
|
-
return {
|
|
105
|
-
type: String as unknown as PropType<Enum[keyof Enum]>,
|
|
106
|
-
required: true,
|
|
107
|
-
validator: (value) => values.includes(value),
|
|
108
|
-
};
|
|
33
|
+
return inject(key) ?? fail(errorMessage ?? `Could not resolve '${toString(key)}' injection key`);
|
|
109
34
|
}
|
|
110
35
|
|
|
111
|
-
export function
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
};
|
|
116
|
-
}
|
|
36
|
+
export function renderVNode(node: VNode | string): string {
|
|
37
|
+
if (typeof node === 'string') {
|
|
38
|
+
return node;
|
|
39
|
+
}
|
|
117
40
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
required: true,
|
|
122
|
-
};
|
|
123
|
-
}
|
|
41
|
+
if (node.type === Comment) {
|
|
42
|
+
return '';
|
|
43
|
+
}
|
|
124
44
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
required: true,
|
|
129
|
-
};
|
|
130
|
-
}
|
|
45
|
+
if (node.type === Text || node.type === Static) {
|
|
46
|
+
return node.children as string;
|
|
47
|
+
}
|
|
131
48
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
required: true,
|
|
136
|
-
};
|
|
137
|
-
}
|
|
49
|
+
if (node.type === 'br') {
|
|
50
|
+
return '\n\n';
|
|
51
|
+
}
|
|
138
52
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
return {
|
|
143
|
-
type: String,
|
|
144
|
-
default: defaultValue,
|
|
145
|
-
};
|
|
53
|
+
return `<${node.type} ${renderVNodeAttrs(node)}>${Array.from(node.children as Array<VNode | string>)
|
|
54
|
+
.map(renderVNode)
|
|
55
|
+
.join('')}</${node.type}>`;
|
|
146
56
|
}
|
package/.eslintrc.js
DELETED
package/dist/aerogel-core.cjs.js
DELETED
|
@@ -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"),n=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 s=require("@headlessui/vue"),a=require("dompurify"),l=require("marked");function i(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var c=i(r),u=i(n),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,n;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,n={state:()=>this.getInitialState(),getters:e},m(),o.defineStore(r,n)())}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 n=t.Storage.require(this._name);t.Storage.set(this._name,{...n,...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)),(n=>{(this.listeners[e]??=t.arr([])).push(o=function(){return n(),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{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 w(e){return{type:Array,default:e??(()=>[])}}function C(){return{type:Boolean,default:arguments.length>0&&void 0!==arguments[0]&&arguments[0]}}function S(){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 j(t){const r=e.inject(t);return r?e.reactive(r):void 0}function E(e,r){return j(e)??t.fail(r??`Could not resolve '${e}' injection key`)}function G(e){return{type:e,default:null}}function M(){return{type:Number,default:arguments.length>0&&void 0!==arguments[0]?arguments[0]:null}}function V(){return{type:Object,default:arguments.length>0&&void 0!==arguments[0]?arguments[0]:null}}function $(){return{type:Array,required:!0}}function P(){return{type:Number,required:!0}}function q(){return{type:Object,required:!0}}function N(){return{type:String,required:!0}}function H(){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 L(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 D={async install(e,t){const r={...O,...t.services};e.use(p??m()),await L(e,r)}},T=f({name:"ui",initialState:{modals:[],snackbars:[]}});const F={AlertModal:"alert-modal",ConfirmModal:"confirm-modal",ErrorReportModal:"error-report-modal",LoadingModal:"loading-modal",Snackbar:"snackbar"};var z=t.facade(new class extends T{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,t){t="string"==typeof e?t:e;const r="string"==typeof e?e:void 0,o=await this.openModal(this.requireComponent(F.LoadingModal),{message:r}),n=await t;return await this.closeModal(o.id),n}showSnackbar(r){let o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const n={id:t.uuid(),properties:{message:r,...o},component:o.component??e.markRaw(this.requireComponent(F.Snackbar))};this.setState("snackbars",this.snackbars.concat(n)),setTimeout((()=>this.hideSnackbar(n.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 n=t.uuid(),s={},a={id:n,properties:o??{},component:e.markRaw(r),beforeClose:new Promise((e=>s.willClose=e)),afterClose:new Promise((e=>s.closed=e))},l=this.modals.at(-1),i=this.modals.concat(a);return this.modalCallbacks[a.id]=s,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()}watchModalEvents(){g.on("modal-will-close",(e=>{let{modal:t,result:r}=e;this.modalCallbacks[t.id]?.willClose?.(r),1===this.modals.length&&g.emit("hide-overlays-backdrop")})),g.on("modal-closed",(async e=>{let{modal:t,result:r}=e;this.setState("modals",this.modals.filter((e=>e.id!==t.id))),this.modalCallbacks[t.id]?.closed?.(r),delete this.modalCallbacks[t.id];const o=this.modals.at(-1);await(o&&g.emit("show-modal",{id:o.id}))}))}});var U=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 n="string"==typeof r?{}:r??{},s=this.provider.translate(e,n)??e;return s===e?Object.entries(n).reduce(((e,r)=>{let[o,n]=r;return e.replace(new RegExp(`\\{\\s*${o}\\s*\\}`,"g"),t.toString(n))}),o):s}});const K=U.translate.bind(U),W=U.translateWithDefault.bind(U);var J=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 Q={Primary:"primary",Secondary:"secondary",Danger:"danger",Clear:"clear"};var Z=t.facade(new class extends J{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?z.openModal(z.requireComponent(F.ErrorReportModal),{reports:t}):z.alert(W("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};z.showSnackbar(t??W("errors.notice","Something went wrong, but it's not your fault. Try again!"),{color:Q.Danger,actions:[{text:W("errors.viewDetails","View details"),dismiss:!0,handler:()=>z.openModal(z.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"):W("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??W("errors.unknown","Unknown Error")),description:t.toString(e.message??e.description??W("errors.unknownDescription","Unknown error object")),error:e}):{title:W("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 Y={$errors:Z};function X(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:()=>!1;return t.tap((t=>e(t)||(e=>Z.instance?(Z.report(e),!0):(console.warn("Errors service hasn't been initialized properly!"),console.error(e),!0))(t)),(e=>{globalThis.onerror=(t,r,o,n,s)=>e(s??t),globalThis.onunhandledrejection=t=>e(t.reason)}))}var ee={async install(e,t){const r=X(t.handleError);e.config.errorHandler=r,await L(e,Y)}};const te={$lang:U};var re={async install(e){e.config.globalProperties.$t??=K,e.config.globalProperties.$td=W,await L(e,te)}};function oe(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 se=e.defineComponent({__name:"AGHeadlessModal",props:{cancellable:C(!0)},setup(t,{expose:r}){const o=t,n=e.ref(null),a=e.ref(!0),l=e.ref(!1),{modal:i}=E("modal","could not obtain modal reference from <AGHeadlessModal>, did you render this component manually? Show it using $ui.openModal() instead");async function c(){n.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 oe("close-modal",(async({id:e,result:t})=>{e===i.id&&await u(t)})),oe("hide-modal",(async({id:e})=>{e===i.id&&await c()})),oe("show-modal",(async({id:e})=>{e===i.id&&await async function(){n.value?.$el&&(a.value=!1)}()})),r({close:u,cancellable:e.toRef(o,"cancellable")}),(r,o)=>(e.openBlock(),e.createBlock(e.unref(s.Dialog),{ref_key:"$root",ref:n,open:!0,onClose:o[0]||(o[0]=e=>t.cancellable&&u())},{default:e.withCtx((()=>[e.renderSlot(r.$slots,"default",{close:u})])),_:3},512))}});se.__file="src/components/headless/modals/AGHeadlessModal.vue";var ae=e.defineComponent({__name:"AGModalContext",props:{modal:q(),childIndex:P()},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))}});ae.__file="src/components/modals/AGModalContext.vue";const le=e.createElementVNode("div",{class:"pointer-events-none fixed inset-0 z-50 bg-black/30"},null,-1);var ie=e.defineComponent({__name:"AGHeadlessModalPanel",setup(t){const r=E("modal","could not obtain modal reference from <AGHeadlessModalPanel>, did you render this component manually? Show it using $ui.openModal() instead"),o=e.computed((()=>z.modals[r.childIndex]??null));return(t,n)=>(e.openBlock(),e.createBlock(e.unref(s.DialogPanel),null,{default:e.withCtx((()=>[e.renderSlot(t.$slots,"default"),o.value?(e.openBlock(),e.createElementBlock(e.Fragment,{key:0},[le,e.createVNode(ae,{"child-index":e.unref(r).childIndex+1,modal:o.value},null,8,["child-index","modal"])],64)):e.createCommentVNode("v-if",!0)])),_:3}))}});ie.__file="src/components/headless/modals/AGHeadlessModalPanel.vue";const ce={class:"fixed inset-0 flex items-center justify-center p-8"};var ue=e.defineComponent({inheritAttrs:!1,__name:"AGModal",props:{cancellable:C(!0)},setup(t,{expose:r}){const o=e.ref();return r({close:async()=>o.value?.close(),cancellable:e.computed((()=>!!o.value?.cancellable))}),(r,n)=>(e.openBlock(),e.createBlock(se,{ref_key:"$headlessModal",ref:o,cancellable:t.cancellable,class:"relative z-50"},{default:e.withCtx((({close:t})=>[e.createElementVNode("div",ce,[e.createVNode(ie,{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 de(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}ue.__file="src/components/modals/AGModal.vue";var pe=e.defineComponent({__name:"AGMarkdown",props:{as:H(),inline:C(),langKey:H(),langParams:V(),text:H()},setup(t){const r=t,o=e.computed((()=>r.text??(r.langKey&&K(r.langKey,r.langParams??{})))),n=e.computed((()=>{if(!o.value)return null;let e=de(o.value);return r.inline&&(e=e.replace("<p>","<span>").replace("</p>","</span>")),e})),s=()=>e.h(r.as??(r.inline?"span":"div"),{class:r.inline?"":"prose",innerHTML:n.value});return(t,r)=>(e.openBlock(),e.createBlock(s))}});pe.__file="src/components/basic/AGMarkdown.vue";var me=e.defineComponent({__name:"AGAlertModal",props:{title:H(),message:N()},setup:t=>(r,o)=>(e.openBlock(),e.createBlock(ue,null,{default:e.withCtx((()=>[t.title?(e.openBlock(),e.createBlock(pe,{key:0,text:t.title,as:"h2",class:"font-semibold",inline:""},null,8,["text"])):e.createCommentVNode("v-if",!0),e.createVNode(pe,{text:t.message},null,8,["text"])])),_:1}))});me.__file="src/components/modals/AGAlertModal.vue";var fe=e.defineComponent({__name:"AGHeadlessButton",props:{href:H(),url:H(),route:H(),routeParams:V((()=>({}))),routeQuery:V((()=>({}))),submit:C()},setup(r){const{href:o,url:n,route:s,routeParams:a,routeQuery:l,submit:i}=r,c=e.computed((()=>s?{tag:"router-link",props:{to:t.objectWithoutEmpty({name:s,params:a,query:l})}}:o||n?{tag:"a",props:{target:"_blank",href:o||n}}:{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))}});fe.__file="src/components/headless/forms/AGHeadlessButton.vue";var he=e.defineComponent({__name:"AGButton",props:{color:B(Q,Q.Primary)},setup(t){const r=t,o=e.computed((()=>{switch(r.color){case Q.Secondary:return["text-white bg-gray-600","hover:bg-gray-500","focus-visible:outline-offset-2 focus-visible:outline-gray-600"].join(" ");case Q.Clear:return"hover:bg-gray-500/20 focus-visible:outline-gray-500/60";case Q.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(fe,{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"]))}});he.__file="src/components/forms/AGButton.vue";const ve={class:"mt-2 flex flex-row-reverse gap-2"};var ge=e.defineComponent({__name:"AGConfirmModal",props:{title:H(),message:N()},setup:t=>(r,o)=>(e.openBlock(),e.createBlock(ue,{cancellable:!1},{default:e.withCtx((({close:o})=>[t.title?(e.openBlock(),e.createBlock(pe,{key:0,text:t.title,as:"h1"},null,8,["text"])):e.createCommentVNode("v-if",!0),e.createVNode(pe,{text:t.message},null,8,["text"]),e.createElementVNode("div",ve,[e.createVNode(he,{onClick:e=>o(!0)},{default:e.withCtx((()=>[e.createTextVNode(e.toDisplayString(r.$td("ui.ok","OK")),1)])),_:2},1032,["onClick"]),e.createVNode(he,{color:"secondary",onClick:e=>o()},{default:e.withCtx((()=>[e.createTextVNode(e.toDisplayString(r.$td("ui.cancel","Cancel")),1)])),_:2},1032,["onClick"])])])),_:1}))});ge.__file="src/components/modals/AGConfirmModal.vue";const xe={viewBox:"0 0 20 20",width:"1.2em",height:"1.2em"},be=[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 _e={name:"zondicons-cheveron-right",render:function(t,r){return e.openBlock(),e.createElementBlock("svg",xe,be)}};const ke={viewBox:"0 0 20 20",width:"1.2em",height:"1.2em"},ye=[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 we={name:"zondicons-cheveron-left",render:function(t,r){return e.openBlock(),e.createElementBlock("svg",ke,ye)}};const Ce={reports:$()};function Se(){return Ce}const Ae={viewBox:"0 0 24 24",width:"1.2em",height:"1.2em"},Be=[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",Ae,Be)}};const Ee={viewBox:"0 0 20 20",width:"1.2em",height:"1.2em"},Ge=[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",Ee,Ge)}};const Ve={viewBox:"0 0 24 24",width:"1.2em",height:"1.2em"},$e=[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 Pe={name:"mdi-github",render:function(t,r){return e.openBlock(),e.createElementBlock("svg",Ve,$e)}};const qe={class:"flex"};var Ne=e.defineComponent({__name:"AGErrorReportModalButtons",props:{report:q()},setup(r){const o=r,n=e.computed((()=>o.report.description?`${o.report.title}: ${o.report.description}`:o.report.title)),s=e.computed((()=>{if(!_.sourceUrl)return!1;const e=encodeURIComponent(n.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(`${n.value}\n\n${o.report.details}`),z.showSnackbar(W("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),z.showSnackbar(W("errors.addedToConsole","You can now use the **error** variable in the console"))}}],(e=>{s.value&&e.push({id:"github",description:"Report in GitHub",iconComponent:Pe,url:s.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(he,{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))]))}});Ne.__file="src/components/modals/AGErrorReportModalButtons.vue";var He=e.defineComponent({__name:"AGErrorReportModalTitle",props:{report:q(),currentReport:M(),totalReports:M()},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(pe,{text:o.value,inline:""},null,8,["text"]))}});He.__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 Le=e.defineComponent({__name:"AGErrorReportModal",props:Se(),setup(t){const r=t,o=e.ref(0),n=e.computed((()=>r.reports[o.value]));return(t,r)=>(e.openBlock(),e.createBlock(ue,null,{default:e.withCtx((()=>[e.createElementVNode("div",null,[e.createElementVNode("h2",Ie,[e.createElementVNode("div",Re,[e.createVNode(He,{report:n.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(he,{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(we),{"aria-hidden":"true",class:"h-4 w-4"})])),_:1},8,["disabled","title","aria-label"]),e.createVNode(he,{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(_e),{"aria-hidden":"true",class:"h-4 w-4"})])),_:1},8,["disabled","title","aria-label"])],64)):e.createCommentVNode("v-if",!0)]),e.createVNode(Ne,{report:n.value},null,8,["report"])]),n.value.description?(e.openBlock(),e.createBlock(pe,{key:0,text:n.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(n.value.details??t.$td("errors.detailsEmpty","This error is missing a stacktrace."))},null,8,Oe)])),_:1}))}});Le.__file="src/components/modals/AGErrorReportModal.vue";var De=e.defineComponent({__name:"AGLoadingModal",props:{message:H()},setup(t){const r=t,o=e.computed((()=>r.message??W("ui.loading","Loading...")));return(t,r)=>(e.openBlock(),e.createBlock(ue,{cancellable:!1},{default:e.withCtx((()=>[e.createVNode(pe,{text:o.value},null,8,["text"])])),_:1}))}});De.__file="src/components/modals/AGLoadingModal.vue";const Te={options:$()};function Fe(){return Te}var ze=e.defineComponent({__name:"AGHeadlessInput",props:{as:H("div"),name:H(),modelValue:G([String,Number,Boolean])},emits:["update:modelValue"],setup(r,{expose:o,emit:n}){const s=r,a=e.computed((()=>l&&s.name?l.errors[s.name]??null:null)),l=e.inject("form",null),i={id:`input-${t.uuid()}`,value:e.computed((()=>l&&s.name?l.getFieldValue(s.name):s.modelValue)),errors:e.readonly(a),update(e){l&&s.name?l.setFieldValue(s.name,e):n("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})}});ze.__file="src/components/headless/forms/AGHeadlessInput.vue";const Ue=["id"];var Ke=e.defineComponent({__name:"AGHeadlessInputError",setup(t){const r=E("input","<AGHeadlessInputError> must be a child of a <AGHeadlessInput>"),o=e.computed((()=>r.errors?W(`errors.${r.errors[0]}`,`Error: ${r.errors[0]}`):null));return(t,n)=>o.value?(e.openBlock(),e.createElementBlock("p",{key:0,id:`${e.unref(r).id}-error`},e.toDisplayString(o.value),9,Ue)):e.createCommentVNode("v-if",!0)}});Ke.__file="src/components/headless/forms/AGHeadlessInputError.vue";const We=["id","type","value","aria-invalid","aria-describedby","checked"];var Je=e.defineComponent({__name:"AGHeadlessInputInput",props:{type:H("text")},setup(t){const r=t,o=e.ref(),n=E("input","<AGHeadlessInputInput> must be a child of a <AGHeadlessInput>"),s=e.computed((()=>n.value)),a=e.computed((()=>{if("checkbox"===r.type)return!!s.value}));function l(){o.value&&n.update("checkbox"===r.type?o.value.checked:o.value.value)}return(r,i)=>(e.openBlock(),e.createElementBlock("input",{id:e.unref(n).id,ref_key:"$input",ref:o,type:t.type,value:s.value,"aria-invalid":e.unref(n).errors?"true":"false","aria-describedby":e.unref(n).errors?`${e.unref(n).id}-error`:void 0,checked:a.value,onInput:l},null,40,We))}});Je.__file="src/components/headless/forms/AGHeadlessInputInput.vue";const Qe=["for"];var Ze=e.defineComponent({__name:"AGHeadlessInputLabel",setup(t){const r=E("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,Qe))}});Ze.__file="src/components/headless/forms/AGHeadlessInputLabel.vue";var Ye=e.defineComponent({__name:"AGHeadlessSelect",props:{name:H(),modelValue:G(),...Fe()},emits:["update:modelValue"],setup(t,{expose:r,emit:o}){const n=t,a=e.inject("form",null),l={value:e.computed((()=>a&&n.name?a.getFieldValue(n.name):n.modelValue)),options:n.options,update(e){a&&n.name?a.setFieldValue(n.name,e):o("update:modelValue",e)}};return r(l),(t,r)=>(e.openBlock(),e.createBlock(e.unref(s.Listbox),{"model-value":l.value.value,"onUpdate:modelValue":r[0]||(r[0]=e=>l.update(e))},{default:e.withCtx((()=>[e.renderSlot(t.$slots,"default")])),_:3},8,["model-value"]))}});Ye.__file="src/components/headless/forms/AGHeadlessSelect.vue";var Xe=e.defineComponent({__name:"AGHeadlessModalTitle",props:{as:H("h2")},setup:t=>(r,o)=>(e.openBlock(),e.createBlock(e.unref(s.DialogTitle),{as:t.as},{default:e.withCtx((()=>[e.renderSlot(r.$slots,"default")])),_:3},8,["as"]))});Xe.__file="src/components/headless/modals/AGHeadlessModalTitle.vue";const et={class:"pointer-events-auto"};var tt=e.defineComponent({__name:"AGHeadlessSnackbar",setup:t=>(t,r)=>(e.openBlock(),e.createElementBlock("div",et,[e.renderSlot(t.$slots,"default")]))});tt.__file="src/components/headless/snackbars/AGHeadlessSnackbar.vue";const rt=t.objectWithout(Q,["Primary","Clear"]),ot={id:N(),message:N(),actions:w((()=>[])),color:B(rt,Q.Secondary)};function nt(){return ot}var st=e.defineComponent({__name:"AGSnackbar",props:nt(),setup(t){const r=t,o=e.computed((()=>r.color===Q.Danger?"bg-red-200 text-red-900":"bg-gray-900 text-white"));return(t,n)=>(e.openBlock(),e.createBlock(tt,{class:e.normalizeClass(["flex flex-row items-center justify-center gap-3 p-4",o.value])},{default:e.withCtx((()=>[e.createVNode(pe,{text:t.message,inline:""},null,8,["text"]),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.actions,((o,n)=>(e.openBlock(),e.createBlock(he,{key:n,color:t.color,onClick:e=>function(e){e.handler?.(),e.dismiss&&z.hideSnackbar(r.id)}(o)},{default:e.withCtx((()=>[e.createTextVNode(e.toDisplayString(o.text),1)])),_:2},1032,["color","onClick"])))),128))])),_:1},8,["class"]))}});st.__file="src/components/snackbars/AGSnackbar.vue";const at={$ui:z};var lt={async install(e,t){const r={[F.AlertModal]:me,[F.ConfirmModal]:ge,[F.ErrorReportModal]:Le,[F.LoadingModal]:De,[F.Snackbar]:st};Object.entries({...r,...t.components}).forEach((e=>{let[t,r]=e;return z.registerComponent(t,r)})),await L(e,at)}};const it={key:0};var ct=e.defineComponent({__name:"AGAppModals",setup(t){const r=e.computed((()=>z.modals[0]??null));return(t,o)=>r.value?(e.openBlock(),e.createElementBlock("aside",it,[e.createVNode(ae,{"child-index":1,modal:r.value},null,8,["modal"])])):e.createCommentVNode("v-if",!0)}});ct.__file="src/components/AGAppModals.vue";const ut={"aria-live":"assertive",class:"z-60 pointer-events-none fixed inset-0 flex items-end px-4 py-6 sm:p-6"},dt={class:"flex w-full flex-col items-center space-y-4 sm:items-end"};const pt={render:function(t,r){return e.openBlock(),e.createElementBlock("div",ut,[e.createElementVNode("div",dt,[(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 mt=pt,ft=e.defineComponent({__name:"AGAppOverlays",setup(t){const r=e.ref(null),o=e.ref(!0);return oe("show-overlays-backdrop",(async()=>{r.value&&o.value&&(o.value=!1,r.value.classList.remove("opacity-0"))})),oe("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(ct),e.createVNode(mt)],64))}});ft.__file="src/components/AGAppOverlays.vue";const ht={class:"flex h-full flex-col text-base font-normal leading-tight text-gray-900 antialiased"};var vt=e.defineComponent({__name:"AGAppLayout",setup:t=>(t,r)=>(e.openBlock(),e.createElementBlock("div",ht,[e.renderSlot(t.$slots,"default"),e.createVNode(ft)]))});vt.__file="src/components/AGAppLayout.vue";var gt=e.defineComponent({__name:"AGErrorMessage",props:{error:q()},setup(t){const r=t,o=e.computed((()=>Z.getErrorMessage(r.error)));return(t,r)=>(e.openBlock(),e.createBlock(pe,{text:o.value,inline:""},null,8,["text"]))}});gt.__file="src/components/basic/AGErrorMessage.vue";var xt=e.defineComponent({__name:"AGLink",setup:t=>(t,r)=>(e.openBlock(),e.createBlock(fe,{class:"font-medium hover:underline"},{default:e.withCtx((()=>[e.renderSlot(t.$slots,"default")])),_:3}))});xt.__file="src/components/basic/AGLink.vue";const bt={class:"ml-2"};var _t=e.defineComponent({inheritAttrs:!1,__name:"AGCheckbox",props:{name:H()},setup(t){const r=S();return(o,n)=>(e.openBlock(),e.createBlock(ze,{ref_key:"$input",ref:r,name:t.name,class:"flex"},{default:e.withCtx((()=>[e.createVNode(Je,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",bt,[o.$slots.default?(e.openBlock(),e.createBlock(Ze,{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"]))}});_t.__file="src/components/forms/AGCheckbox.vue";const kt=["onSubmit"];var yt=e.defineComponent({__name:"AGForm",props:{form:V()},emits:["submit"],setup(t,{emit:r}){const o=t;function n(){o.form&&!o.form.submit()||r("submit")}return e.provide("form",o.form),(t,r)=>(e.openBlock(),e.createElementBlock("form",{onSubmit:e.withModifiers(n,["prevent"])},[e.renderSlot(t.$slots,"default")],40,kt))}});yt.__file="src/components/forms/AGForm.vue";const wt={class:"absolute bottom-0 left-0 translate-y-full"};var Ct=e.defineComponent({inheritAttrs:!1,__name:"AGInput",props:{name:H()},setup(t){const r=S(),[o,n]=ne();return(s,a)=>(e.openBlock(),e.createBlock(ze,{ref_key:"$input",ref:r,class:e.normalizeClass(["relative flex flex-col items-center",e.unref(n)]),name:t.name},{default:e.withCtx((()=>[e.createVNode(Je,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",wt,[e.createVNode(Ke,{class:"mt-1 text-sm text-red-500"})])])),_:1},8,["class","name"]))}});Ct.__file="src/components/forms/AGInput.vue";var St=e.defineComponent({__name:"AGModalTitle",setup:t=>(t,r)=>(e.openBlock(),e.createBlock(Xe,{class:"mb-2 font-semibold"},{default:e.withCtx((()=>[e.renderSlot(t.$slots,"default")])),_:3}))});St.__file="src/components/modals/AGModalTitle.vue";const At={String:"string",Number:"number",Boolean:"boolean",Object:"object"};class Bt 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,"_valid",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),this._valid=e.computed((()=>!Object.values(this._errors).some((e=>null!==e)))),this.errors=e.readonly(this._errors)}get valid(){return this._valid.value}get submitted(){return this._submitted.value}setFieldValue(e,t){this._data[e]=t,this._submitted.value&&this.validate()}getFieldValue(e){return this._data[e]}validate(){const e=Object.entries(this._fields).reduce(((e,t)=>{let[r,o]=t;return e[r]=this.getFieldErrors(r,o),e}),{});return this.resetErrors(e),this.valid}reset(){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,"AGHeadlessSelectButton",{enumerable:!0,get:function(){return s.ListboxButton}}),Object.defineProperty(exports,"AGHeadlessSelectLabel",{enumerable:!0,get:function(){return s.ListboxLabel}}),Object.defineProperty(exports,"AGHeadlessSelectOption",{enumerable:!0,get:function(){return s.ListboxOption}}),Object.defineProperty(exports,"AGHeadlessSelectOptions",{enumerable:!0,get:function(){return s.ListboxOptions}}),exports.AGAlertModal=me,exports.AGAppLayout=vt,exports.AGAppOverlays=ft,exports.AGButton=he,exports.AGCheckbox=_t,exports.AGConfirmModal=ge,exports.AGErrorMessage=gt,exports.AGErrorReportModalButtons=Ne,exports.AGErrorReportModalTitle=He,exports.AGForm=yt,exports.AGHeadlessButton=fe,exports.AGHeadlessInput=ze,exports.AGHeadlessInputError=Ke,exports.AGHeadlessInputInput=Je,exports.AGHeadlessInputLabel=Ze,exports.AGHeadlessModal=se,exports.AGHeadlessModalPanel=ie,exports.AGHeadlessModalTitle=Xe,exports.AGHeadlessSelect=Ye,exports.AGHeadlessSnackbar=tt,exports.AGInput=Ct,exports.AGLink=xt,exports.AGLoadingModal=De,exports.AGMarkdown=pe,exports.AGModal=ue,exports.AGModalContext=ae,exports.AGModalTitle=St,exports.AGSnackbar=st,exports.App=_,exports.AppService=b,exports.Colors=Q,exports.Errors=Z,exports.Events=g,exports.EventsService=v,exports.FormFieldTypes=At,exports.Lang=U,exports.Service=h,exports.SnackbarColors=rt,exports.UI=z,exports.UIComponents=F,exports.arrayProp=w,exports.booleanInput=function(e){return{default:e,type:At.Boolean}},exports.booleanProp=C,exports.bootServices=L,exports.bootstrapApplication=async function(t){let r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const o=[R,ee,re,D,lt,...r.plugins??[]],n=e.createApp(t);await y(o,n,r),n.mount("#app"),n._container?.classList.remove("loading"),g.emit("application-mounted")},exports.componentRef=S,exports.defineDirective=A,exports.definePlugin=k,exports.defineServiceState=f,exports.enumProp=B,exports.errorReportModalProps=Ce,exports.extractSelectProps=function(e){return Object.keys(Te).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=j,exports.injectReactiveOrFail=E,exports.installPlugins=y,exports.mixedProp=G,exports.numberInput=function(e){return{default:e,type:At.Number}},exports.numberProp=M,exports.objectProp=V,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:At.Boolean,rules:"required"}},exports.requiredEnumProp=function(e){const t=Object.values(e);return{type:String,required:!0,validator:e=>t.includes(e)}},exports.requiredMixedProp=function(e){return{type:e,required:!0}},exports.requiredNumberInput=function(e){return{default:e,type:At.Number,rules:"required"}},exports.requiredNumberProp=P,exports.requiredObjectProp=q,exports.requiredStringInput=function(e){return{default:e,type:At.String,rules:"required"}},exports.requiredStringProp=N,exports.selectProps=Te,exports.snackbarProps=ot,exports.stringInput=function(e){return{default:e,type:At.String}},exports.stringProp=H,exports.translate=K,exports.translateWithDefault=W,exports.useErrorReportModalProps=Se,exports.useEvent=oe,exports.useForm=function(e){return new Bt(e)},exports.useInputAttrs=ne,exports.useSelectProps=Fe,exports.useSnackbarProps=nt;
|
|
2
|
-
//# sourceMappingURL=aerogel-core.cjs.js.map
|