@abraca/nuxt 2.4.0 → 2.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +25 -6
- package/dist/module.d.mts +4 -2
- package/dist/module.json +1 -1
- package/dist/runtime/components/ACodeEditor.d.vue.ts +1 -1
- package/dist/runtime/components/ACodeEditor.vue.d.ts +1 -1
- package/dist/runtime/components/AConnectServerModal.d.vue.ts +2 -2
- package/dist/runtime/components/AConnectServerModal.vue +1 -1
- package/dist/runtime/components/AConnectServerModal.vue.d.ts +2 -2
- package/dist/runtime/components/ADocumentTree.d.vue.ts +8 -1
- package/dist/runtime/components/ADocumentTree.vue +6 -3
- package/dist/runtime/components/ADocumentTree.vue.d.ts +8 -1
- package/dist/runtime/components/AEditor.d.vue.ts +7 -7
- package/dist/runtime/components/AEditor.vue.d.ts +7 -7
- package/dist/runtime/components/AEmailVerifyConfirmModal.d.vue.ts +2 -2
- package/dist/runtime/components/AEmailVerifyConfirmModal.vue.d.ts +2 -2
- package/dist/runtime/components/AIdentityModal.d.vue.ts +2 -2
- package/dist/runtime/components/AIdentityModal.vue.d.ts +2 -2
- package/dist/runtime/components/AInviteRedeemModal.vue +15 -11
- package/dist/runtime/components/AMnemonicLoginModal.d.vue.ts +2 -2
- package/dist/runtime/components/AMnemonicLoginModal.vue.d.ts +2 -2
- package/dist/runtime/components/APasswordChangeModal.d.vue.ts +3 -3
- package/dist/runtime/components/APasswordChangeModal.vue.d.ts +3 -3
- package/dist/runtime/components/APasswordLoginModal.d.vue.ts +4 -4
- package/dist/runtime/components/APasswordLoginModal.vue.d.ts +4 -4
- package/dist/runtime/components/APasswordRegisterModal.d.vue.ts +3 -3
- package/dist/runtime/components/APasswordRegisterModal.vue.d.ts +3 -3
- package/dist/runtime/components/APasswordResetConfirmModal.d.vue.ts +3 -3
- package/dist/runtime/components/APasswordResetConfirmModal.vue.d.ts +3 -3
- package/dist/runtime/components/APasswordResetRequestModal.d.vue.ts +2 -2
- package/dist/runtime/components/APasswordResetRequestModal.vue.d.ts +2 -2
- package/dist/runtime/components/ASetPasswordCard.d.vue.ts +1 -1
- package/dist/runtime/components/ASetPasswordCard.vue.d.ts +1 -1
- package/dist/runtime/components/aware/AArea.d.vue.ts +1 -1
- package/dist/runtime/components/aware/AArea.vue.d.ts +1 -1
- package/dist/runtime/components/aware/ACalendar.d.vue.ts +1 -1
- package/dist/runtime/components/aware/ACalendar.vue.d.ts +1 -1
- package/dist/runtime/components/aware/AFileUpload.d.vue.ts +1 -1
- package/dist/runtime/components/aware/AFileUpload.vue.d.ts +1 -1
- package/dist/runtime/components/aware/AInput.d.vue.ts +1 -1
- package/dist/runtime/components/aware/AInput.vue.d.ts +1 -1
- package/dist/runtime/components/aware/AMedia.d.vue.ts +1 -1
- package/dist/runtime/components/aware/AMedia.vue.d.ts +1 -1
- package/dist/runtime/components/aware/AScroll.d.vue.ts +1 -1
- package/dist/runtime/components/aware/AScroll.vue.d.ts +1 -1
- package/dist/runtime/components/aware/ASlider.d.vue.ts +1 -1
- package/dist/runtime/components/aware/ASlider.vue.d.ts +1 -1
- package/dist/runtime/components/aware/ATable.d.vue.ts +1 -1
- package/dist/runtime/components/aware/ATable.vue.d.ts +1 -1
- package/dist/runtime/components/aware/ATabs.d.vue.ts +1 -1
- package/dist/runtime/components/aware/ATabs.vue.d.ts +1 -1
- package/dist/runtime/components/aware/ATextarea.d.vue.ts +1 -1
- package/dist/runtime/components/aware/ATextarea.vue.d.ts +1 -1
- package/dist/runtime/components/aware/ATree.d.vue.ts +1 -1
- package/dist/runtime/components/aware/ATree.vue.d.ts +1 -1
- package/dist/runtime/components/docs/ADocsNavigation.d.vue.ts +1 -1
- package/dist/runtime/components/docs/ADocsNavigation.vue.d.ts +1 -1
- package/dist/runtime/components/docs/ADocsSearch.d.vue.ts +4 -4
- package/dist/runtime/components/docs/ADocsSearch.vue.d.ts +4 -4
- package/dist/runtime/components/docs/ADocsSearchButton.d.vue.ts +2 -2
- package/dist/runtime/components/docs/ADocsSearchButton.vue.d.ts +2 -2
- package/dist/runtime/components/docs/ADocsToc.d.vue.ts +1 -1
- package/dist/runtime/components/docs/ADocsToc.vue.d.ts +1 -1
- package/dist/runtime/components/editor/AColorPalettePopover.d.vue.ts +2 -2
- package/dist/runtime/components/editor/AColorPalettePopover.vue.d.ts +2 -2
- package/dist/runtime/components/editor/AIconPickerPopover.d.vue.ts +2 -2
- package/dist/runtime/components/editor/AIconPickerPopover.vue.d.ts +2 -2
- package/dist/runtime/components/editor/ALocationPickerPopover.d.vue.ts +2 -2
- package/dist/runtime/components/editor/ALocationPickerPopover.vue.d.ts +2 -2
- package/dist/runtime/components/registry/APluginCapabilityDialog.d.vue.ts +4 -4
- package/dist/runtime/components/registry/APluginCapabilityDialog.vue +1 -1
- package/dist/runtime/components/registry/APluginCapabilityDialog.vue.d.ts +4 -4
- package/dist/runtime/components/renderers/AProseRenderer.d.vue.ts +4 -4
- package/dist/runtime/components/renderers/AProseRenderer.vue.d.ts +4 -4
- package/dist/runtime/components/renderers/sheets/ASheetsCell.d.vue.ts +4 -4
- package/dist/runtime/components/renderers/sheets/ASheetsCell.vue.d.ts +4 -4
- package/dist/runtime/components/renderers/sheets/ASheetsGrid.d.vue.ts +2 -2
- package/dist/runtime/components/renderers/sheets/ASheetsGrid.vue.d.ts +2 -2
- package/dist/runtime/components/renderers/sheets/ASheetsMobileActionBar.d.vue.ts +4 -4
- package/dist/runtime/components/renderers/sheets/ASheetsMobileActionBar.vue.d.ts +4 -4
- package/dist/runtime/components/shell/ADocPanelSettings.d.vue.ts +1 -1
- package/dist/runtime/components/shell/ADocPanelSettings.vue.d.ts +1 -1
- package/dist/runtime/components/shell/AUserMenu.d.vue.ts +2 -2
- package/dist/runtime/components/shell/AUserMenu.vue.d.ts +2 -2
- package/dist/runtime/components/shell/AUserProfilePopover.d.vue.ts +1 -1
- package/dist/runtime/components/shell/AUserProfilePopover.vue.d.ts +1 -1
- package/dist/runtime/components/shell/AWelcomeScreen.d.vue.ts +4 -4
- package/dist/runtime/components/shell/AWelcomeScreen.vue +77 -58
- package/dist/runtime/components/shell/AWelcomeScreen.vue.d.ts +4 -4
- package/dist/runtime/composables/useAbraAdmin.d.ts +131 -4
- package/dist/runtime/composables/useAbraAdmin.js +136 -36
- package/dist/runtime/composables/useInvites.d.ts +7 -0
- package/dist/runtime/plugin-abracadabra.client.js +44 -3
- package/dist/runtime/server/api/_abracadabra/spaces.get.d.ts +1 -1
- package/dist/runtime/types.d.ts +2 -0
- package/dist/types.d.mts +6 -2
- package/package.json +20 -20
|
@@ -8,13 +8,13 @@ type __VLS_Slots = {} & {
|
|
|
8
8
|
default?: (props: typeof __VLS_10) => any;
|
|
9
9
|
};
|
|
10
10
|
declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
11
|
-
clear: () => any;
|
|
12
11
|
"update:open": (args_0: boolean) => any;
|
|
12
|
+
clear: () => any;
|
|
13
13
|
"update:lat": (args_0: number) => any;
|
|
14
14
|
"update:lng": (args_0: number) => any;
|
|
15
15
|
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
16
|
-
onClear?: (() => any) | undefined;
|
|
17
16
|
"onUpdate:open"?: ((args_0: boolean) => any) | undefined;
|
|
17
|
+
onClear?: (() => any) | undefined;
|
|
18
18
|
"onUpdate:lat"?: ((args_0: number) => any) | undefined;
|
|
19
19
|
"onUpdate:lng"?: ((args_0: number) => any) | undefined;
|
|
20
20
|
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
@@ -8,13 +8,13 @@ type __VLS_Slots = {} & {
|
|
|
8
8
|
default?: (props: typeof __VLS_10) => any;
|
|
9
9
|
};
|
|
10
10
|
declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
11
|
-
clear: () => any;
|
|
12
11
|
"update:open": (args_0: boolean) => any;
|
|
12
|
+
clear: () => any;
|
|
13
13
|
"update:lat": (args_0: number) => any;
|
|
14
14
|
"update:lng": (args_0: number) => any;
|
|
15
15
|
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
16
|
-
onClear?: (() => any) | undefined;
|
|
17
16
|
"onUpdate:open"?: ((args_0: boolean) => any) | undefined;
|
|
17
|
+
onClear?: (() => any) | undefined;
|
|
18
18
|
"onUpdate:lat"?: ((args_0: number) => any) | undefined;
|
|
19
19
|
"onUpdate:lng"?: ((args_0: number) => any) | undefined;
|
|
20
20
|
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
@@ -5,13 +5,13 @@ type __VLS_Props = {
|
|
|
5
5
|
detail: CatalogVersionDetail | null;
|
|
6
6
|
};
|
|
7
7
|
declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
|
|
8
|
-
cancel: () => any;
|
|
9
|
-
"update:modelValue": (open: boolean) => any;
|
|
10
8
|
confirm: (detail: CatalogVersionDetail) => any;
|
|
9
|
+
"update:modelValue": (open: boolean) => any;
|
|
10
|
+
cancel: () => any;
|
|
11
11
|
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
12
|
-
onCancel?: (() => any) | undefined;
|
|
13
|
-
"onUpdate:modelValue"?: ((open: boolean) => any) | undefined;
|
|
14
12
|
onConfirm?: ((detail: CatalogVersionDetail) => any) | undefined;
|
|
13
|
+
"onUpdate:modelValue"?: ((open: boolean) => any) | undefined;
|
|
14
|
+
onCancel?: (() => any) | undefined;
|
|
15
15
|
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
16
16
|
declare const _default: typeof __VLS_export;
|
|
17
17
|
export default _default;
|
|
@@ -28,7 +28,7 @@ function describe(cap) {
|
|
|
28
28
|
if (cap === "doc-write") return { label: "Modify documents", icon: "i-lucide-pencil", severity: "medium" };
|
|
29
29
|
if (cap === "doc-read") return { label: "Read documents", icon: "i-lucide-eye", severity: "low" };
|
|
30
30
|
if (cap === "awareness") return { label: "Broadcast presence", icon: "i-lucide-users", severity: "low" };
|
|
31
|
-
if (cap === "server-runner") return { label: "Run server-side background tasks", icon: "i-lucide-
|
|
31
|
+
if (cap === "server-runner") return { label: "Run server-side background tasks", icon: "i-lucide-hexagon", severity: "high" };
|
|
32
32
|
if (cap === "chat:send") return { label: "Send chat messages", icon: "i-lucide-message-circle", severity: "medium" };
|
|
33
33
|
if (cap === "chat:read") return { label: "Read chat history", icon: "i-lucide-message-square", severity: "low" };
|
|
34
34
|
if (cap === "notifications:show") return { label: "Show notifications", icon: "i-lucide-bell", severity: "low" };
|
|
@@ -5,13 +5,13 @@ type __VLS_Props = {
|
|
|
5
5
|
detail: CatalogVersionDetail | null;
|
|
6
6
|
};
|
|
7
7
|
declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
|
|
8
|
-
cancel: () => any;
|
|
9
|
-
"update:modelValue": (open: boolean) => any;
|
|
10
8
|
confirm: (detail: CatalogVersionDetail) => any;
|
|
9
|
+
"update:modelValue": (open: boolean) => any;
|
|
10
|
+
cancel: () => any;
|
|
11
11
|
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
12
|
-
onCancel?: (() => any) | undefined;
|
|
13
|
-
"onUpdate:modelValue"?: ((open: boolean) => any) | undefined;
|
|
14
12
|
onConfirm?: ((detail: CatalogVersionDetail) => any) | undefined;
|
|
13
|
+
"onUpdate:modelValue"?: ((open: boolean) => any) | undefined;
|
|
14
|
+
onCancel?: (() => any) | undefined;
|
|
15
15
|
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
16
16
|
declare const _default: typeof __VLS_export;
|
|
17
17
|
export default _default;
|
|
@@ -10,14 +10,14 @@ type __VLS_Props = {
|
|
|
10
10
|
};
|
|
11
11
|
declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, Record<PropertyKey, unknown>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
12
12
|
rename: (label: string) => any;
|
|
13
|
-
ready: () => any;
|
|
14
|
-
update: (content: any) => any;
|
|
15
13
|
updateMeta: (patch: Partial<DocPageMeta>) => any;
|
|
14
|
+
update: (content: any) => any;
|
|
15
|
+
ready: () => any;
|
|
16
16
|
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
17
17
|
onRename?: ((label: string) => any) | undefined;
|
|
18
|
-
onReady?: (() => any) | undefined;
|
|
19
|
-
onUpdate?: ((content: any) => any) | undefined;
|
|
20
18
|
onUpdateMeta?: ((patch: Partial<DocPageMeta>) => any) | undefined;
|
|
19
|
+
onUpdate?: ((content: any) => any) | undefined;
|
|
20
|
+
onReady?: (() => any) | undefined;
|
|
21
21
|
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
22
22
|
declare const _default: typeof __VLS_export;
|
|
23
23
|
export default _default;
|
|
@@ -10,14 +10,14 @@ type __VLS_Props = {
|
|
|
10
10
|
};
|
|
11
11
|
declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, Record<PropertyKey, unknown>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
12
12
|
rename: (label: string) => any;
|
|
13
|
-
ready: () => any;
|
|
14
|
-
update: (content: any) => any;
|
|
15
13
|
updateMeta: (patch: Partial<DocPageMeta>) => any;
|
|
14
|
+
update: (content: any) => any;
|
|
15
|
+
ready: () => any;
|
|
16
16
|
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
17
17
|
onRename?: ((label: string) => any) | undefined;
|
|
18
|
-
onReady?: (() => any) | undefined;
|
|
19
|
-
onUpdate?: ((content: any) => any) | undefined;
|
|
20
18
|
onUpdateMeta?: ((patch: Partial<DocPageMeta>) => any) | undefined;
|
|
19
|
+
onUpdate?: ((content: any) => any) | undefined;
|
|
20
|
+
onReady?: (() => any) | undefined;
|
|
21
21
|
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
22
22
|
declare const _default: typeof __VLS_export;
|
|
23
23
|
export default _default;
|
|
@@ -25,20 +25,20 @@ type __VLS_Props = {
|
|
|
25
25
|
editable: boolean;
|
|
26
26
|
};
|
|
27
27
|
declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
28
|
-
contextmenu: (e: MouseEvent) => any;
|
|
29
28
|
dblclick: () => any;
|
|
29
|
+
contextmenu: (e: MouseEvent) => any;
|
|
30
|
+
pointermove: (e: PointerEvent) => any;
|
|
30
31
|
pointercancel: (e: PointerEvent) => any;
|
|
31
32
|
pointerdown: (e: PointerEvent) => any;
|
|
32
33
|
pointerenter: () => any;
|
|
33
|
-
pointermove: (e: PointerEvent) => any;
|
|
34
34
|
pointerup: (e: PointerEvent) => any;
|
|
35
35
|
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
36
|
-
onContextmenu?: ((e: MouseEvent) => any) | undefined;
|
|
37
36
|
onDblclick?: (() => any) | undefined;
|
|
37
|
+
onContextmenu?: ((e: MouseEvent) => any) | undefined;
|
|
38
|
+
onPointermove?: ((e: PointerEvent) => any) | undefined;
|
|
38
39
|
onPointercancel?: ((e: PointerEvent) => any) | undefined;
|
|
39
40
|
onPointerdown?: ((e: PointerEvent) => any) | undefined;
|
|
40
41
|
onPointerenter?: (() => any) | undefined;
|
|
41
|
-
onPointermove?: ((e: PointerEvent) => any) | undefined;
|
|
42
42
|
onPointerup?: ((e: PointerEvent) => any) | undefined;
|
|
43
43
|
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
44
44
|
declare const _default: typeof __VLS_export;
|
|
@@ -25,20 +25,20 @@ type __VLS_Props = {
|
|
|
25
25
|
editable: boolean;
|
|
26
26
|
};
|
|
27
27
|
declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
28
|
-
contextmenu: (e: MouseEvent) => any;
|
|
29
28
|
dblclick: () => any;
|
|
29
|
+
contextmenu: (e: MouseEvent) => any;
|
|
30
|
+
pointermove: (e: PointerEvent) => any;
|
|
30
31
|
pointercancel: (e: PointerEvent) => any;
|
|
31
32
|
pointerdown: (e: PointerEvent) => any;
|
|
32
33
|
pointerenter: () => any;
|
|
33
|
-
pointermove: (e: PointerEvent) => any;
|
|
34
34
|
pointerup: (e: PointerEvent) => any;
|
|
35
35
|
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
36
|
-
onContextmenu?: ((e: MouseEvent) => any) | undefined;
|
|
37
36
|
onDblclick?: (() => any) | undefined;
|
|
37
|
+
onContextmenu?: ((e: MouseEvent) => any) | undefined;
|
|
38
|
+
onPointermove?: ((e: PointerEvent) => any) | undefined;
|
|
38
39
|
onPointercancel?: ((e: PointerEvent) => any) | undefined;
|
|
39
40
|
onPointerdown?: ((e: PointerEvent) => any) | undefined;
|
|
40
41
|
onPointerenter?: (() => any) | undefined;
|
|
41
|
-
onPointermove?: ((e: PointerEvent) => any) | undefined;
|
|
42
42
|
onPointerup?: ((e: PointerEvent) => any) | undefined;
|
|
43
43
|
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
44
44
|
declare const _default: typeof __VLS_export;
|
|
@@ -55,9 +55,9 @@ declare function scrollToCell(colIdx: number, rowIdx: number): void;
|
|
|
55
55
|
declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {
|
|
56
56
|
scrollToCell: typeof scrollToCell;
|
|
57
57
|
}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
58
|
+
keydown: (e: KeyboardEvent) => any;
|
|
58
59
|
copy: (e: ClipboardEvent) => any;
|
|
59
60
|
cut: (e: ClipboardEvent) => any;
|
|
60
|
-
keydown: (e: KeyboardEvent) => any;
|
|
61
61
|
paste: (e: ClipboardEvent) => any;
|
|
62
62
|
renameColumn: (colId: string, label: string) => any;
|
|
63
63
|
commitEdit: () => any;
|
|
@@ -81,9 +81,9 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {
|
|
|
81
81
|
fillDragEnd: () => any;
|
|
82
82
|
autoFitColumn: (colId: string) => any;
|
|
83
83
|
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
84
|
+
onKeydown?: ((e: KeyboardEvent) => any) | undefined;
|
|
84
85
|
onCopy?: ((e: ClipboardEvent) => any) | undefined;
|
|
85
86
|
onCut?: ((e: ClipboardEvent) => any) | undefined;
|
|
86
|
-
onKeydown?: ((e: KeyboardEvent) => any) | undefined;
|
|
87
87
|
onPaste?: ((e: ClipboardEvent) => any) | undefined;
|
|
88
88
|
onRenameColumn?: ((colId: string, label: string) => any) | undefined;
|
|
89
89
|
onCommitEdit?: (() => any) | undefined;
|
|
@@ -55,9 +55,9 @@ declare function scrollToCell(colIdx: number, rowIdx: number): void;
|
|
|
55
55
|
declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {
|
|
56
56
|
scrollToCell: typeof scrollToCell;
|
|
57
57
|
}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
58
|
+
keydown: (e: KeyboardEvent) => any;
|
|
58
59
|
copy: (e: ClipboardEvent) => any;
|
|
59
60
|
cut: (e: ClipboardEvent) => any;
|
|
60
|
-
keydown: (e: KeyboardEvent) => any;
|
|
61
61
|
paste: (e: ClipboardEvent) => any;
|
|
62
62
|
renameColumn: (colId: string, label: string) => any;
|
|
63
63
|
commitEdit: () => any;
|
|
@@ -81,9 +81,9 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {
|
|
|
81
81
|
fillDragEnd: () => any;
|
|
82
82
|
autoFitColumn: (colId: string) => any;
|
|
83
83
|
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
84
|
+
onKeydown?: ((e: KeyboardEvent) => any) | undefined;
|
|
84
85
|
onCopy?: ((e: ClipboardEvent) => any) | undefined;
|
|
85
86
|
onCut?: ((e: ClipboardEvent) => any) | undefined;
|
|
86
|
-
onKeydown?: ((e: KeyboardEvent) => any) | undefined;
|
|
87
87
|
onPaste?: ((e: ClipboardEvent) => any) | undefined;
|
|
88
88
|
onRenameColumn?: ((colId: string, label: string) => any) | undefined;
|
|
89
89
|
onCommitEdit?: (() => any) | undefined;
|
|
@@ -6,19 +6,19 @@ type __VLS_Props = {
|
|
|
6
6
|
cellContextItems: any[][];
|
|
7
7
|
};
|
|
8
8
|
declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
9
|
+
clear: () => any;
|
|
9
10
|
copy: () => any;
|
|
11
|
+
edit: () => any;
|
|
10
12
|
cut: () => any;
|
|
11
13
|
paste: () => any;
|
|
12
|
-
clear: () => any;
|
|
13
|
-
edit: () => any;
|
|
14
14
|
toggleBold: () => any;
|
|
15
15
|
toggleItalic: () => any;
|
|
16
16
|
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
17
|
+
onClear?: (() => any) | undefined;
|
|
17
18
|
onCopy?: (() => any) | undefined;
|
|
19
|
+
onEdit?: (() => any) | undefined;
|
|
18
20
|
onCut?: (() => any) | undefined;
|
|
19
21
|
onPaste?: (() => any) | undefined;
|
|
20
|
-
onClear?: (() => any) | undefined;
|
|
21
|
-
onEdit?: (() => any) | undefined;
|
|
22
22
|
onToggleBold?: (() => any) | undefined;
|
|
23
23
|
onToggleItalic?: (() => any) | undefined;
|
|
24
24
|
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
@@ -6,19 +6,19 @@ type __VLS_Props = {
|
|
|
6
6
|
cellContextItems: any[][];
|
|
7
7
|
};
|
|
8
8
|
declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
9
|
+
clear: () => any;
|
|
9
10
|
copy: () => any;
|
|
11
|
+
edit: () => any;
|
|
10
12
|
cut: () => any;
|
|
11
13
|
paste: () => any;
|
|
12
|
-
clear: () => any;
|
|
13
|
-
edit: () => any;
|
|
14
14
|
toggleBold: () => any;
|
|
15
15
|
toggleItalic: () => any;
|
|
16
16
|
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
17
|
+
onClear?: (() => any) | undefined;
|
|
17
18
|
onCopy?: (() => any) | undefined;
|
|
19
|
+
onEdit?: (() => any) | undefined;
|
|
18
20
|
onCut?: (() => any) | undefined;
|
|
19
21
|
onPaste?: (() => any) | undefined;
|
|
20
|
-
onClear?: (() => any) | undefined;
|
|
21
|
-
onEdit?: (() => any) | undefined;
|
|
22
22
|
onToggleBold?: (() => any) | undefined;
|
|
23
23
|
onToggleItalic?: (() => any) | undefined;
|
|
24
24
|
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
@@ -107,8 +107,8 @@ declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {},
|
|
|
107
107
|
"onFork-snapshot"?: ((version: number) => any) | undefined;
|
|
108
108
|
"onLoad-more-snapshots"?: (() => any) | undefined;
|
|
109
109
|
}>, {
|
|
110
|
-
snapshots: SnapshotMeta[];
|
|
111
110
|
userName: string;
|
|
111
|
+
snapshots: SnapshotMeta[];
|
|
112
112
|
docMeta: DocPageMeta | null;
|
|
113
113
|
effectiveRole: string | null;
|
|
114
114
|
userAvatarStyle: string;
|
|
@@ -107,8 +107,8 @@ declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {},
|
|
|
107
107
|
"onFork-snapshot"?: ((version: number) => any) | undefined;
|
|
108
108
|
"onLoad-more-snapshots"?: (() => any) | undefined;
|
|
109
109
|
}>, {
|
|
110
|
-
snapshots: SnapshotMeta[];
|
|
111
110
|
userName: string;
|
|
111
|
+
snapshots: SnapshotMeta[];
|
|
112
112
|
docMeta: DocPageMeta | null;
|
|
113
113
|
effectiveRole: string | null;
|
|
114
114
|
userAvatarStyle: string;
|
|
@@ -14,13 +14,13 @@ type __VLS_Props = {
|
|
|
14
14
|
extraItems?: DropdownMenuItem[][];
|
|
15
15
|
};
|
|
16
16
|
declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
17
|
+
logout: () => any;
|
|
17
18
|
"open-settings": () => any;
|
|
18
19
|
"open-account": () => any;
|
|
19
|
-
logout: () => any;
|
|
20
20
|
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
21
|
+
onLogout?: (() => any) | undefined;
|
|
21
22
|
"onOpen-settings"?: (() => any) | undefined;
|
|
22
23
|
"onOpen-account"?: (() => any) | undefined;
|
|
23
|
-
onLogout?: (() => any) | undefined;
|
|
24
24
|
}>, {
|
|
25
25
|
color: string;
|
|
26
26
|
collapsed: boolean;
|
|
@@ -14,13 +14,13 @@ type __VLS_Props = {
|
|
|
14
14
|
extraItems?: DropdownMenuItem[][];
|
|
15
15
|
};
|
|
16
16
|
declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
17
|
+
logout: () => any;
|
|
17
18
|
"open-settings": () => any;
|
|
18
19
|
"open-account": () => any;
|
|
19
|
-
logout: () => any;
|
|
20
20
|
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
21
|
+
onLogout?: (() => any) | undefined;
|
|
21
22
|
"onOpen-settings"?: (() => any) | undefined;
|
|
22
23
|
"onOpen-account"?: (() => any) | undefined;
|
|
23
|
-
onLogout?: (() => any) | undefined;
|
|
24
24
|
}>, {
|
|
25
25
|
color: string;
|
|
26
26
|
collapsed: boolean;
|
|
@@ -36,10 +36,10 @@ declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {},
|
|
|
36
36
|
color: string;
|
|
37
37
|
name: string;
|
|
38
38
|
online: boolean | null;
|
|
39
|
-
currentDocId: string | null;
|
|
40
39
|
avatarStyle: string;
|
|
41
40
|
isSelf: boolean;
|
|
42
41
|
isFollowing: boolean;
|
|
42
|
+
currentDocId: string | null;
|
|
43
43
|
showFollow: boolean;
|
|
44
44
|
currentDocLabel: string | null;
|
|
45
45
|
currentDocIcon: string;
|
|
@@ -36,10 +36,10 @@ declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {},
|
|
|
36
36
|
color: string;
|
|
37
37
|
name: string;
|
|
38
38
|
online: boolean | null;
|
|
39
|
-
currentDocId: string | null;
|
|
40
39
|
avatarStyle: string;
|
|
41
40
|
isSelf: boolean;
|
|
42
41
|
isFollowing: boolean;
|
|
42
|
+
currentDocId: string | null;
|
|
43
43
|
showFollow: boolean;
|
|
44
44
|
currentDocLabel: string | null;
|
|
45
45
|
currentDocIcon: string;
|
|
@@ -35,7 +35,7 @@ type __VLS_ModelProps = {
|
|
|
35
35
|
* Ported from cou-sh/app/components/WelcomeScreen.vue — decoupled from
|
|
36
36
|
* useAbracadabra, useSpaceRegistry, and all app-specific modals.
|
|
37
37
|
*/
|
|
38
|
-
|
|
38
|
+
"open"?: boolean;
|
|
39
39
|
};
|
|
40
40
|
type __VLS_PublicProps = __VLS_Props & __VLS_ModelProps;
|
|
41
41
|
declare var __VLS_15: {}, __VLS_22: {}, __VLS_24: {}, __VLS_57: {}, __VLS_69: {}, __VLS_76: {}, __VLS_78: {};
|
|
@@ -55,8 +55,8 @@ type __VLS_Slots = {} & {
|
|
|
55
55
|
logo?: (props: typeof __VLS_78) => any;
|
|
56
56
|
};
|
|
57
57
|
declare const __VLS_base: import("vue").DefineComponent<__VLS_PublicProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
58
|
-
done: () => any;
|
|
59
58
|
"update:open": (value: boolean) => any;
|
|
59
|
+
done: () => any;
|
|
60
60
|
"set-name": (name: string) => any;
|
|
61
61
|
"set-color": (color: string) => any;
|
|
62
62
|
"set-neutral": (color: string) => any;
|
|
@@ -64,8 +64,8 @@ declare const __VLS_base: import("vue").DefineComponent<__VLS_PublicProps, {}, {
|
|
|
64
64
|
"connect-server": (url: string) => any;
|
|
65
65
|
"claim-passkey": () => any;
|
|
66
66
|
}, string, import("vue").PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
|
|
67
|
-
onDone?: (() => any) | undefined;
|
|
68
67
|
"onUpdate:open"?: ((value: boolean) => any) | undefined;
|
|
68
|
+
onDone?: (() => any) | undefined;
|
|
69
69
|
"onSet-name"?: ((name: string) => any) | undefined;
|
|
70
70
|
"onSet-color"?: ((color: string) => any) | undefined;
|
|
71
71
|
"onSet-neutral"?: ((color: string) => any) | undefined;
|
|
@@ -74,9 +74,9 @@ declare const __VLS_base: import("vue").DefineComponent<__VLS_PublicProps, {}, {
|
|
|
74
74
|
"onClaim-passkey"?: (() => any) | undefined;
|
|
75
75
|
}>, {
|
|
76
76
|
connecting: boolean;
|
|
77
|
+
isClaimed: boolean;
|
|
77
78
|
userName: string;
|
|
78
79
|
currentColor: string;
|
|
79
|
-
isClaimed: boolean;
|
|
80
80
|
avatarStyle: string;
|
|
81
81
|
connectionError: string;
|
|
82
82
|
colors: string[];
|
|
@@ -4,7 +4,25 @@ const open = defineModel("open", { type: Boolean, ...{ default: true } });
|
|
|
4
4
|
const props = defineProps({
|
|
5
5
|
userName: { type: String, required: false, default: "" },
|
|
6
6
|
avatarStyle: { type: String, required: false, default: "" },
|
|
7
|
-
colors: { type: Array, required: false, default: () => [
|
|
7
|
+
colors: { type: Array, required: false, default: () => [
|
|
8
|
+
"red",
|
|
9
|
+
"orange",
|
|
10
|
+
"amber",
|
|
11
|
+
"yellow",
|
|
12
|
+
"lime",
|
|
13
|
+
"green",
|
|
14
|
+
"emerald",
|
|
15
|
+
"teal",
|
|
16
|
+
"cyan",
|
|
17
|
+
"sky",
|
|
18
|
+
"blue",
|
|
19
|
+
"indigo",
|
|
20
|
+
"violet",
|
|
21
|
+
"purple",
|
|
22
|
+
"fuchsia",
|
|
23
|
+
"pink",
|
|
24
|
+
"rose"
|
|
25
|
+
] },
|
|
8
26
|
neutrals: { type: Array, required: false, default: () => ["slate", "gray", "zinc", "neutral", "stone"] },
|
|
9
27
|
currentColor: { type: String, required: false, default: "blue" },
|
|
10
28
|
currentNeutral: { type: String, required: false, default: "zinc" },
|
|
@@ -49,11 +67,14 @@ function connectToServer() {
|
|
|
49
67
|
if (!raw) return;
|
|
50
68
|
emit("connect-server", raw);
|
|
51
69
|
}
|
|
52
|
-
watch(
|
|
53
|
-
|
|
54
|
-
|
|
70
|
+
watch(
|
|
71
|
+
() => props.connecting,
|
|
72
|
+
(val, prev) => {
|
|
73
|
+
if (prev && !val && !props.connectionError && step.value === "server") {
|
|
74
|
+
step.value = "done";
|
|
75
|
+
}
|
|
55
76
|
}
|
|
56
|
-
|
|
77
|
+
);
|
|
57
78
|
</script>
|
|
58
79
|
|
|
59
80
|
<template>
|
|
@@ -74,10 +95,7 @@ watch(() => props.connecting, (val, prev) => {
|
|
|
74
95
|
>
|
|
75
96
|
<template #body>
|
|
76
97
|
<div class="flex flex-col gap-6">
|
|
77
|
-
<Transition
|
|
78
|
-
name="step-fade"
|
|
79
|
-
mode="out-in"
|
|
80
|
-
>
|
|
98
|
+
<Transition name="step-fade" mode="out-in">
|
|
81
99
|
<!-- ── Step 1: Identity ────────────────────────────── -->
|
|
82
100
|
<div
|
|
83
101
|
v-if="step === 'identity'"
|
|
@@ -93,10 +111,10 @@ watch(() => props.connecting, (val, prev) => {
|
|
|
93
111
|
/>
|
|
94
112
|
</slot>
|
|
95
113
|
<div class="flex flex-col items-center gap-1">
|
|
96
|
-
<h2
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
</slot>
|
|
114
|
+
<h2
|
|
115
|
+
class="text-xl font-bold text-(--ui-text-highlighted) tracking-tight"
|
|
116
|
+
>
|
|
117
|
+
<slot name="title"> Welcome </slot>
|
|
100
118
|
</h2>
|
|
101
119
|
<p class="text-sm text-(--ui-text-muted)">
|
|
102
120
|
<slot name="subtitle">
|
|
@@ -126,18 +144,18 @@ watch(() => props.connecting, (val, prev) => {
|
|
|
126
144
|
|
|
127
145
|
<!-- Color picker -->
|
|
128
146
|
<div class="flex flex-col items-center gap-2">
|
|
129
|
-
<p
|
|
147
|
+
<p
|
|
148
|
+
class="text-xs font-medium text-(--ui-text-muted) uppercase tracking-wide"
|
|
149
|
+
>
|
|
130
150
|
Choose your color
|
|
131
151
|
</p>
|
|
132
152
|
<div class="flex flex-wrap justify-center gap-1.5 max-w-78">
|
|
133
|
-
<UTooltip
|
|
134
|
-
v-for="color in colors"
|
|
135
|
-
:key="color"
|
|
136
|
-
:text="color"
|
|
137
|
-
>
|
|
153
|
+
<UTooltip v-for="color in colors" :key="color" :text="color">
|
|
138
154
|
<button
|
|
139
155
|
class="w-5 h-5 rounded-full ring-2 ring-offset-1 ring-offset-(--ui-bg) transition-all duration-150 hover:scale-110 focus:outline-none"
|
|
140
|
-
:class="
|
|
156
|
+
:class="
|
|
157
|
+
currentColor === color ? 'ring-current scale-110' : 'ring-transparent'
|
|
158
|
+
"
|
|
141
159
|
:style="{ background: `var(--color-${color}-400)` }"
|
|
142
160
|
@click="emit('set-color', color)"
|
|
143
161
|
/>
|
|
@@ -147,18 +165,18 @@ watch(() => props.connecting, (val, prev) => {
|
|
|
147
165
|
|
|
148
166
|
<!-- Neutral color picker -->
|
|
149
167
|
<div class="flex flex-col items-center gap-2">
|
|
150
|
-
<p
|
|
168
|
+
<p
|
|
169
|
+
class="text-xs font-medium text-(--ui-text-muted) uppercase tracking-wide"
|
|
170
|
+
>
|
|
151
171
|
Choose your neutral
|
|
152
172
|
</p>
|
|
153
173
|
<div class="flex flex-wrap justify-center gap-1.5 max-w-78">
|
|
154
|
-
<UTooltip
|
|
155
|
-
v-for="color in neutrals"
|
|
156
|
-
:key="color"
|
|
157
|
-
:text="color"
|
|
158
|
-
>
|
|
174
|
+
<UTooltip v-for="color in neutrals" :key="color" :text="color">
|
|
159
175
|
<button
|
|
160
176
|
class="w-5 h-5 rounded-full ring-2 ring-offset-1 ring-offset-(--ui-bg) transition-all duration-150 hover:scale-110 focus:outline-none"
|
|
161
|
-
:class="
|
|
177
|
+
:class="
|
|
178
|
+
currentNeutral === color ? 'ring-current scale-110' : 'ring-transparent'
|
|
179
|
+
"
|
|
162
180
|
:style="{ background: `var(--color-${color}-400)` }"
|
|
163
181
|
@click="emit('set-neutral', color)"
|
|
164
182
|
/>
|
|
@@ -188,13 +206,11 @@ watch(() => props.connecting, (val, prev) => {
|
|
|
188
206
|
class="flex flex-col gap-6"
|
|
189
207
|
>
|
|
190
208
|
<div class="flex flex-col items-center text-center gap-4 pt-4">
|
|
191
|
-
<UAvatar
|
|
192
|
-
:alt="displayName"
|
|
193
|
-
size="lg"
|
|
194
|
-
:style="avatarStyle"
|
|
195
|
-
/>
|
|
209
|
+
<UAvatar :alt="displayName" size="lg" :style="avatarStyle" />
|
|
196
210
|
<div class="flex flex-col items-center gap-1">
|
|
197
|
-
<h2
|
|
211
|
+
<h2
|
|
212
|
+
class="text-xl font-bold text-(--ui-text-highlighted) tracking-tight"
|
|
213
|
+
>
|
|
198
214
|
How would you like to get started?
|
|
199
215
|
</h2>
|
|
200
216
|
<p class="text-sm text-(--ui-text-muted)">
|
|
@@ -213,8 +229,13 @@ watch(() => props.connecting, (val, prev) => {
|
|
|
213
229
|
class="size-5 text-(--ui-text-muted) group-hover:text-(--color-primary-500) transition-colors"
|
|
214
230
|
/>
|
|
215
231
|
<div class="flex flex-col gap-0.5">
|
|
216
|
-
<span
|
|
217
|
-
|
|
232
|
+
<span
|
|
233
|
+
class="text-xs font-semibold text-(--ui-text-highlighted) leading-tight"
|
|
234
|
+
>Start locally</span
|
|
235
|
+
>
|
|
236
|
+
<span class="text-[11px] text-(--ui-text-muted) leading-snug"
|
|
237
|
+
>No server needed</span
|
|
238
|
+
>
|
|
218
239
|
</div>
|
|
219
240
|
</button>
|
|
220
241
|
|
|
@@ -227,12 +248,17 @@ watch(() => props.connecting, (val, prev) => {
|
|
|
227
248
|
@click="step = 'server'"
|
|
228
249
|
>
|
|
229
250
|
<UIcon
|
|
230
|
-
name="i-lucide-
|
|
251
|
+
name="i-lucide-hexagon"
|
|
231
252
|
class="size-5 text-(--ui-text-muted) group-hover:text-(--color-primary-500) transition-colors"
|
|
232
253
|
/>
|
|
233
254
|
<div class="flex flex-col gap-0.5">
|
|
234
|
-
<span
|
|
235
|
-
|
|
255
|
+
<span
|
|
256
|
+
class="text-xs font-semibold text-(--ui-text-highlighted) leading-tight"
|
|
257
|
+
>Self-hosted</span
|
|
258
|
+
>
|
|
259
|
+
<span class="text-[11px] text-(--ui-text-muted) leading-snug"
|
|
260
|
+
>Your infrastructure</span
|
|
261
|
+
>
|
|
236
262
|
</div>
|
|
237
263
|
</button>
|
|
238
264
|
</div>
|
|
@@ -254,7 +280,9 @@ watch(() => props.connecting, (val, prev) => {
|
|
|
254
280
|
/>
|
|
255
281
|
</slot>
|
|
256
282
|
<div class="flex flex-col items-center gap-1">
|
|
257
|
-
<h2
|
|
283
|
+
<h2
|
|
284
|
+
class="text-xl font-bold text-(--ui-text-highlighted) tracking-tight"
|
|
285
|
+
>
|
|
258
286
|
Connect to server
|
|
259
287
|
</h2>
|
|
260
288
|
<p class="text-sm text-(--ui-text-muted)">
|
|
@@ -307,12 +335,10 @@ watch(() => props.connecting, (val, prev) => {
|
|
|
307
335
|
<!-- Already claimed or just claimed -->
|
|
308
336
|
<template v-if="isClaimed || claimSuccess">
|
|
309
337
|
<div class="relative">
|
|
310
|
-
<UAvatar
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
/>
|
|
315
|
-
<div class="absolute -bottom-1 -right-1 rounded-full p-0.5 bg-(--ui-color-success-500)">
|
|
338
|
+
<UAvatar :alt="displayName" size="2xl" :style="avatarStyle" />
|
|
339
|
+
<div
|
|
340
|
+
class="absolute -bottom-1 -right-1 rounded-full p-0.5 bg-(--ui-color-success-500)"
|
|
341
|
+
>
|
|
316
342
|
<UIcon
|
|
317
343
|
name="i-lucide-shield-check"
|
|
318
344
|
class="text-white size-4"
|
|
@@ -328,9 +354,7 @@ watch(() => props.connecting, (val, prev) => {
|
|
|
328
354
|
<template v-if="claimSuccess">
|
|
329
355
|
Your identity is now hardware-bound, {{ displayName }}
|
|
330
356
|
</template>
|
|
331
|
-
<template v-else>
|
|
332
|
-
Welcome back, {{ displayName }}
|
|
333
|
-
</template>
|
|
357
|
+
<template v-else> Welcome back, {{ displayName }} </template>
|
|
334
358
|
</p>
|
|
335
359
|
</div>
|
|
336
360
|
|
|
@@ -347,16 +371,11 @@ watch(() => props.connecting, (val, prev) => {
|
|
|
347
371
|
<!-- Default: offer passkey -->
|
|
348
372
|
<template v-else>
|
|
349
373
|
<div class="relative">
|
|
350
|
-
<UAvatar
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
<div class="absolute -bottom-1 -right-1 rounded-full p-0.5 bg-(--ui-color-success-500)">
|
|
356
|
-
<UIcon
|
|
357
|
-
name="i-lucide-check"
|
|
358
|
-
class="text-white size-4"
|
|
359
|
-
/>
|
|
374
|
+
<UAvatar :alt="displayName" size="2xl" :style="avatarStyle" />
|
|
375
|
+
<div
|
|
376
|
+
class="absolute -bottom-1 -right-1 rounded-full p-0.5 bg-(--ui-color-success-500)"
|
|
377
|
+
>
|
|
378
|
+
<UIcon name="i-lucide-check" class="text-white size-4" />
|
|
360
379
|
</div>
|
|
361
380
|
</div>
|
|
362
381
|
|