@abraca/nuxt 2.11.0 → 2.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/dist/module.json +1 -1
  2. package/dist/module.mjs +7 -0
  3. package/dist/runtime/components/ADocPickerModal.d.vue.ts +31 -0
  4. package/dist/runtime/components/ADocPickerModal.vue +191 -0
  5. package/dist/runtime/components/ADocPickerModal.vue.d.ts +31 -0
  6. package/dist/runtime/components/ADocumentTree.vue +65 -0
  7. package/dist/runtime/components/AEditor.d.vue.ts +17 -10
  8. package/dist/runtime/components/AEditor.vue +232 -164
  9. package/dist/runtime/components/AEditor.vue.d.ts +17 -10
  10. package/dist/runtime/components/ANodePanel.d.vue.ts +9 -1
  11. package/dist/runtime/components/ANodePanel.vue +547 -473
  12. package/dist/runtime/components/ANodePanel.vue.d.ts +9 -1
  13. package/dist/runtime/components/ATagsEditor.d.vue.ts +19 -0
  14. package/dist/runtime/components/ATagsEditor.vue +60 -0
  15. package/dist/runtime/components/ATagsEditor.vue.d.ts +19 -0
  16. package/dist/runtime/components/aware/AMedia.d.vue.ts +1 -1
  17. package/dist/runtime/components/aware/AMedia.vue.d.ts +1 -1
  18. package/dist/runtime/components/chat/AChatInput.d.vue.ts +11 -6
  19. package/dist/runtime/components/chat/AChatInput.vue +33 -2
  20. package/dist/runtime/components/chat/AChatInput.vue.d.ts +11 -6
  21. package/dist/runtime/components/chat/AChatList.d.vue.ts +12 -0
  22. package/dist/runtime/components/chat/AChatList.vue +76 -32
  23. package/dist/runtime/components/chat/AChatList.vue.d.ts +12 -0
  24. package/dist/runtime/components/chat/AChatMessages.d.vue.ts +4 -0
  25. package/dist/runtime/components/chat/AChatMessages.vue +57 -4
  26. package/dist/runtime/components/chat/AChatMessages.vue.d.ts +4 -0
  27. package/dist/runtime/components/chat/AChatPanel.d.vue.ts +6 -2
  28. package/dist/runtime/components/chat/AChatPanel.vue +17 -1
  29. package/dist/runtime/components/chat/AChatPanel.vue.d.ts +6 -2
  30. package/dist/runtime/components/chat/ANodeChatPanel.vue +1 -1
  31. package/dist/runtime/components/docs/ADocsSearch.d.vue.ts +1 -1
  32. package/dist/runtime/components/docs/ADocsSearch.vue.d.ts +1 -1
  33. package/dist/runtime/components/renderers/AChartRenderer.client.d.vue.ts +17 -0
  34. package/dist/runtime/components/renderers/AChartRenderer.client.vue +622 -0
  35. package/dist/runtime/components/renderers/AChartRenderer.client.vue.d.ts +17 -0
  36. package/dist/runtime/components/renderers/AGraphRenderer.vue +64 -15
  37. package/dist/runtime/components/renderers/calendar/ACalendarToolbar.d.vue.ts +2 -2
  38. package/dist/runtime/components/renderers/calendar/ACalendarToolbar.vue.d.ts +2 -2
  39. package/dist/runtime/components/renderers/media/MediaTransportBar.d.vue.ts +2 -2
  40. package/dist/runtime/components/renderers/media/MediaTransportBar.vue.d.ts +2 -2
  41. package/dist/runtime/components/renderers/sheets/ASheetsGrid.d.vue.ts +2 -2
  42. package/dist/runtime/components/renderers/sheets/ASheetsGrid.vue.d.ts +2 -2
  43. package/dist/runtime/components/settings/ASettingsAppearancePanel.d.vue.ts +3 -0
  44. package/dist/runtime/components/settings/ASettingsAppearancePanel.vue +67 -0
  45. package/dist/runtime/components/settings/ASettingsAppearancePanel.vue.d.ts +3 -0
  46. package/dist/runtime/components/settings/ASettingsGroup.d.vue.ts +24 -0
  47. package/dist/runtime/components/settings/ASettingsGroup.vue +31 -0
  48. package/dist/runtime/components/settings/ASettingsGroup.vue.d.ts +24 -0
  49. package/dist/runtime/components/settings/ASettingsModal.vue +84 -53
  50. package/dist/runtime/components/settings/ASettingsPlaceholder.d.vue.ts +20 -0
  51. package/dist/runtime/components/settings/ASettingsPlaceholder.vue +32 -0
  52. package/dist/runtime/components/settings/ASettingsPlaceholder.vue.d.ts +20 -0
  53. package/dist/runtime/components/settings/ASettingsRow.d.vue.ts +34 -0
  54. package/dist/runtime/components/settings/ASettingsRow.vue +34 -0
  55. package/dist/runtime/components/settings/ASettingsRow.vue.d.ts +34 -0
  56. package/dist/runtime/components/settings/sections.d.ts +37 -0
  57. package/dist/runtime/components/settings/sections.js +45 -0
  58. package/dist/runtime/components/shell/AUserMenu.d.vue.ts +2 -2
  59. package/dist/runtime/components/shell/AUserMenu.vue.d.ts +2 -2
  60. package/dist/runtime/components/shell/AUserProfilePopover.d.vue.ts +1 -1
  61. package/dist/runtime/components/shell/AUserProfilePopover.vue.d.ts +1 -1
  62. package/dist/runtime/composables/useChat.d.ts +22 -1
  63. package/dist/runtime/composables/useChat.js +79 -8
  64. package/dist/runtime/composables/useNodeContextMenu.d.ts +4 -0
  65. package/dist/runtime/composables/useNodeContextMenu.js +18 -0
  66. package/dist/runtime/composables/useSettingsModal.d.ts +1 -1
  67. package/dist/runtime/locale.d.ts +8 -0
  68. package/dist/runtime/locale.js +9 -1
  69. package/dist/runtime/utils/chatContent.d.ts +20 -2
  70. package/dist/runtime/utils/chatContent.js +20 -1
  71. package/dist/runtime/utils/docTypes.js +43 -0
  72. package/dist/runtime/utils/titleSync.d.ts +130 -0
  73. package/dist/runtime/utils/titleSync.js +53 -0
  74. package/package.json +11 -1
package/dist/module.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "compatibility": {
5
5
  "nuxt": ">=4.0.0"
6
6
  },
7
- "version": "2.11.0",
7
+ "version": "2.13.0",
8
8
  "builder": {
9
9
  "@nuxt/module-builder": "1.0.2",
10
10
  "unbuild": "3.6.1"
package/dist/module.mjs CHANGED
@@ -292,6 +292,13 @@ const module$1 = defineNuxtModule({
292
292
  prebundleDeps.push("mapbox-gl");
293
293
  } catch {
294
294
  }
295
+ for (const pkg of ["@unovis/vue", "@unovis/ts"]) {
296
+ try {
297
+ createRequire(`${nuxt.options.rootDir}/`).resolve(pkg);
298
+ prebundleDeps.push(pkg);
299
+ } catch {
300
+ }
301
+ }
295
302
  if (options.features?.code !== false) {
296
303
  const cmPeers = [
297
304
  "@codemirror/view",
@@ -0,0 +1,31 @@
1
+ type __VLS_Props = {
2
+ open: boolean;
3
+ /** Modal heading. */
4
+ title?: string;
5
+ /** Confirm button label. */
6
+ confirmLabel?: string;
7
+ /** Doc to exclude as a target along with its whole subtree (e.g. the doc being moved). */
8
+ excludeId?: string | null;
9
+ /** Extra ids to exclude as targets. */
10
+ excludeIds?: string[];
11
+ /** Offer a "Top level" (root) option. */
12
+ allowRoot?: boolean;
13
+ /** Label for the root option. */
14
+ rootLabel?: string;
15
+ };
16
+ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
17
+ select: (targetId: string | null) => any;
18
+ "update:open": (v: boolean) => any;
19
+ }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
20
+ onSelect?: ((targetId: string | null) => any) | undefined;
21
+ "onUpdate:open"?: ((v: boolean) => any) | undefined;
22
+ }>, {
23
+ title: string;
24
+ confirmLabel: string;
25
+ excludeId: string | null;
26
+ excludeIds: string[];
27
+ allowRoot: boolean;
28
+ rootLabel: string;
29
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
30
+ declare const _default: typeof __VLS_export;
31
+ export default _default;
@@ -0,0 +1,191 @@
1
+ <script setup>
2
+ import { computed, ref, watch } from "vue";
3
+ import { useDocTree } from "../composables/useDocTree";
4
+ import { resolveDocType } from "../utils/docTypes";
5
+ import AModalShell from "./AModalShell.vue";
6
+ const props = defineProps({
7
+ open: { type: Boolean, required: true },
8
+ title: { type: String, required: false, default: "Move to\u2026" },
9
+ confirmLabel: { type: String, required: false, default: "Move here" },
10
+ excludeId: { type: [String, null], required: false, default: null },
11
+ excludeIds: { type: Array, required: false, default: () => [] },
12
+ allowRoot: { type: Boolean, required: false, default: true },
13
+ rootLabel: { type: String, required: false, default: "Top level" }
14
+ });
15
+ const emit = defineEmits(["update:open", "select"]);
16
+ const { entries } = useDocTree();
17
+ const open = computed({
18
+ get: () => props.open,
19
+ set: (v) => emit("update:open", v)
20
+ });
21
+ const idSet = computed(() => new Set(entries.value.map((e) => e.id)));
22
+ const childrenOf = computed(() => {
23
+ const map = /* @__PURE__ */ new Map();
24
+ for (const e of entries.value) {
25
+ if (e.trashed) continue;
26
+ const pid = e.parentId && idSet.value.has(e.parentId) ? e.parentId : null;
27
+ const arr = map.get(pid) ?? [];
28
+ arr.push(e);
29
+ map.set(pid, arr);
30
+ }
31
+ for (const arr of map.values()) arr.sort((a, b) => (a.order ?? 0) - (b.order ?? 0));
32
+ return map;
33
+ });
34
+ const excluded = computed(() => {
35
+ const set = new Set(props.excludeIds);
36
+ if (props.excludeId) {
37
+ const queue = [props.excludeId];
38
+ while (queue.length) {
39
+ const id = queue.shift();
40
+ set.add(id);
41
+ for (const child of childrenOf.value.get(id) ?? []) queue.push(child.id);
42
+ }
43
+ }
44
+ return set;
45
+ });
46
+ const expanded = ref(/* @__PURE__ */ new Set());
47
+ const selectedId = ref(null);
48
+ const search = ref("");
49
+ watch(() => props.open, (isOpen) => {
50
+ if (isOpen) {
51
+ selectedId.value = null;
52
+ search.value = "";
53
+ expanded.value = /* @__PURE__ */ new Set();
54
+ }
55
+ });
56
+ function iconFor(entry) {
57
+ return entry?.meta?.icon ? entry.meta.icon.startsWith("i-") ? entry.meta.icon : `i-lucide-${entry.meta.icon}` : resolveDocType(entry?.type ?? "doc").icon;
58
+ }
59
+ const rows = computed(() => {
60
+ const q = search.value.trim().toLowerCase();
61
+ if (q) {
62
+ return entries.value.filter((e) => !e.trashed && !excluded.value.has(e.id) && (e.label || "").toLowerCase().includes(q)).sort((a, b) => (a.label || "").localeCompare(b.label || "")).slice(0, 100).map((e) => ({ id: e.id, label: e.label || "Untitled", icon: iconFor(e), depth: 0, hasChildren: false, expanded: false }));
63
+ }
64
+ const out = [];
65
+ const walk = (pid, depth) => {
66
+ for (const e of childrenOf.value.get(pid) ?? []) {
67
+ if (excluded.value.has(e.id)) continue;
68
+ const kids = (childrenOf.value.get(e.id) ?? []).filter((c) => !excluded.value.has(c.id));
69
+ const isExp = expanded.value.has(e.id);
70
+ out.push({ id: e.id, label: e.label || "Untitled", icon: iconFor(e), depth, hasChildren: kids.length > 0, expanded: isExp });
71
+ if (isExp) walk(e.id, depth + 1);
72
+ }
73
+ };
74
+ walk(null, 0);
75
+ return out;
76
+ });
77
+ function toggle(id) {
78
+ const next = new Set(expanded.value);
79
+ if (next.has(id)) next.delete(id);
80
+ else next.add(id);
81
+ expanded.value = next;
82
+ }
83
+ function confirm() {
84
+ emit("select", selectedId.value);
85
+ emit("update:open", false);
86
+ }
87
+ </script>
88
+
89
+ <template>
90
+ <AModalShell
91
+ :open="open"
92
+ :title="title"
93
+ max-width="sm:max-w-lg"
94
+ @update:open="open = $event"
95
+ >
96
+ <div class="flex flex-col gap-3">
97
+ <UInput
98
+ v-model="search"
99
+ icon="i-lucide-search"
100
+ placeholder="Search documents…"
101
+ size="sm"
102
+ class="w-full"
103
+ autofocus
104
+ />
105
+
106
+ <div class="max-h-[50vh] overflow-y-auto rounded-md border border-(--ui-border) divide-y divide-(--ui-border)/60">
107
+ <!-- Root / top-level option -->
108
+ <button
109
+ v-if="allowRoot && !search"
110
+ type="button"
111
+ class="w-full flex items-center gap-2 px-3 py-2 text-left text-sm hover:bg-(--ui-bg-elevated) transition-colors"
112
+ :class="selectedId === null ? 'bg-(--ui-primary)/10 text-(--ui-primary)' : ''"
113
+ @click="selectedId = null"
114
+ >
115
+ <UIcon
116
+ name="i-lucide-home"
117
+ class="size-4 shrink-0 text-(--ui-text-muted)"
118
+ />
119
+ <span class="flex-1 truncate">{{ rootLabel }}</span>
120
+ <UIcon
121
+ v-if="selectedId === null"
122
+ name="i-lucide-check"
123
+ class="size-4 shrink-0"
124
+ />
125
+ </button>
126
+
127
+ <div
128
+ v-for="row in rows"
129
+ :key="row.id"
130
+ class="flex items-center hover:bg-(--ui-bg-elevated) transition-colors"
131
+ :class="selectedId === row.id ? 'bg-(--ui-primary)/10' : ''"
132
+ :style="{ paddingLeft: `${row.depth * 16}px` }"
133
+ >
134
+ <button
135
+ type="button"
136
+ class="size-6 shrink-0 flex items-center justify-center text-(--ui-text-dimmed) hover:text-(--ui-text)"
137
+ :class="row.hasChildren ? '' : 'invisible'"
138
+ @click="toggle(row.id)"
139
+ >
140
+ <UIcon
141
+ :name="row.expanded ? 'i-lucide-chevron-down' : 'i-lucide-chevron-right'"
142
+ class="size-4"
143
+ />
144
+ </button>
145
+ <button
146
+ type="button"
147
+ class="flex-1 min-w-0 flex items-center gap-2 px-1 py-2 text-left text-sm"
148
+ :class="selectedId === row.id ? 'text-(--ui-primary)' : ''"
149
+ @click="selectedId = row.id"
150
+ >
151
+ <UIcon
152
+ :name="row.icon"
153
+ class="size-4 shrink-0 text-(--ui-text-muted)"
154
+ />
155
+ <span class="flex-1 truncate">{{ row.label }}</span>
156
+ <UIcon
157
+ v-if="selectedId === row.id"
158
+ name="i-lucide-check"
159
+ class="size-4 shrink-0 mr-2"
160
+ />
161
+ </button>
162
+ </div>
163
+
164
+ <p
165
+ v-if="rows.length === 0"
166
+ class="px-3 py-6 text-center text-sm text-(--ui-text-dimmed)"
167
+ >
168
+ {{ search ? "No matching documents." : "No documents." }}
169
+ </p>
170
+ </div>
171
+ </div>
172
+
173
+ <template #footer>
174
+ <div class="flex items-center justify-end gap-2 w-full">
175
+ <UButton
176
+ label="Cancel"
177
+ color="neutral"
178
+ variant="ghost"
179
+ @click="emit('update:open', false)"
180
+ />
181
+ <UButton
182
+ :label="confirmLabel"
183
+ color="primary"
184
+ icon="i-lucide-corner-down-right"
185
+ :disabled="selectedId === null && !allowRoot"
186
+ @click="confirm"
187
+ />
188
+ </div>
189
+ </template>
190
+ </AModalShell>
191
+ </template>
@@ -0,0 +1,31 @@
1
+ type __VLS_Props = {
2
+ open: boolean;
3
+ /** Modal heading. */
4
+ title?: string;
5
+ /** Confirm button label. */
6
+ confirmLabel?: string;
7
+ /** Doc to exclude as a target along with its whole subtree (e.g. the doc being moved). */
8
+ excludeId?: string | null;
9
+ /** Extra ids to exclude as targets. */
10
+ excludeIds?: string[];
11
+ /** Offer a "Top level" (root) option. */
12
+ allowRoot?: boolean;
13
+ /** Label for the root option. */
14
+ rootLabel?: string;
15
+ };
16
+ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
17
+ select: (targetId: string | null) => any;
18
+ "update:open": (v: boolean) => any;
19
+ }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
20
+ onSelect?: ((targetId: string | null) => any) | undefined;
21
+ "onUpdate:open"?: ((v: boolean) => any) | undefined;
22
+ }>, {
23
+ title: string;
24
+ confirmLabel: string;
25
+ excludeId: string | null;
26
+ excludeIds: string[];
27
+ allowRoot: boolean;
28
+ rootLabel: string;
29
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
30
+ declare const _default: typeof __VLS_export;
31
+ export default _default;
@@ -298,6 +298,45 @@ function deleteDoc(docId) {
298
298
  if (!docId || !isReady.value) return;
299
299
  moveToTrash(docId, userName.value);
300
300
  }
301
+ const moveTargetId = ref(null);
302
+ const movePickerOpen = ref(false);
303
+ function openMovePicker(docId) {
304
+ moveTargetId.value = docId;
305
+ movePickerOpen.value = true;
306
+ }
307
+ function performMove(newParentId) {
308
+ const id = moveTargetId.value;
309
+ if (!id || !isReady.value) return;
310
+ const entry = treeMap.data[id];
311
+ if (!entry) return;
312
+ if ((entry.parentId ?? null) === newParentId) return;
313
+ treeMap.set(id, { ...entry, parentId: newParentId, order: Date.now() });
314
+ if (newParentId) {
315
+ client.value?.createChild(newParentId, { child_id: id, kind: "page" }).catch(() => {
316
+ });
317
+ expandedIds.value.add(newParentId);
318
+ expandedIds.value = new Set(expandedIds.value);
319
+ }
320
+ emit("navigate", id);
321
+ }
322
+ const tagsTargetId = ref(null);
323
+ const tagsEditorOpen = ref(false);
324
+ function openTagsEditor(docId) {
325
+ tagsTargetId.value = docId;
326
+ tagsEditorOpen.value = true;
327
+ }
328
+ const tagsTargetTags = computed(() => {
329
+ const id = tagsTargetId.value;
330
+ if (!id) return [];
331
+ return treeMap.data[id]?.meta?.tags ?? [];
332
+ });
333
+ function saveTags(tags) {
334
+ const id = tagsTargetId.value;
335
+ if (!id || !isReady.value) return;
336
+ const entry = treeMap.data[id];
337
+ if (!entry) return;
338
+ treeMap.set(id, { ...entry, meta: { ...entry.meta ?? {}, tags } });
339
+ }
301
340
  const renameId = ref(null);
302
341
  const renameValue = ref("");
303
342
  const renameInputRef = ref(null);
@@ -770,6 +809,16 @@ function treeNodeMenuItems(item) {
770
809
  label: "Add child page",
771
810
  icon: "i-lucide-file-plus",
772
811
  onSelect: () => createDirectly(item.id)
812
+ },
813
+ {
814
+ label: "Move to\u2026",
815
+ icon: "i-lucide-corner-down-right",
816
+ onSelect: () => openMovePicker(item.id)
817
+ },
818
+ {
819
+ label: "Edit tags\u2026",
820
+ icon: "i-lucide-tags",
821
+ onSelect: () => openTagsEditor(item.id)
773
822
  }
774
823
  ],
775
824
  [
@@ -1517,6 +1566,22 @@ defineExpose({
1517
1566
  @close="closeOverlay"
1518
1567
  />
1519
1568
  </div>
1569
+
1570
+ <!-- Move-to reparent picker -->
1571
+ <ADocPickerModal
1572
+ v-model:open="movePickerOpen"
1573
+ :exclude-id="moveTargetId"
1574
+ title="Move to…"
1575
+ confirm-label="Move here"
1576
+ @select="performMove"
1577
+ />
1578
+
1579
+ <!-- Edit-tags editor -->
1580
+ <ATagsEditor
1581
+ v-model:open="tagsEditorOpen"
1582
+ :tags="tagsTargetTags"
1583
+ @save="saveTags"
1584
+ />
1520
1585
  </template>
1521
1586
 
1522
1587
  <style scoped>
@@ -35,12 +35,18 @@ type __VLS_Props = {
35
35
  * Useful for inspecting CRDT state during development. Default: false.
36
36
  */
37
37
  showSourceToggle?: boolean;
38
+ /**
39
+ * Show the in-canvas ancestor breadcrumb above the document (matching
40
+ * cou-sh's DocRenderer). Only renders when the doc actually has ancestors,
41
+ * so root/space docs show nothing. Set false for embeds/previews.
42
+ */
43
+ showBreadcrumb?: boolean;
38
44
  };
39
45
  type __VLS_ModelProps = {
40
46
  modelValue?: any;
41
47
  };
42
48
  type __VLS_PublicProps = __VLS_Props & __VLS_ModelProps;
43
- declare var __VLS_42: {
49
+ declare var __VLS_58: {
44
50
  editor: any;
45
51
  connectedUsers: {
46
52
  name: string;
@@ -49,25 +55,25 @@ declare var __VLS_42: {
49
55
  docId?: string | undefined;
50
56
  }[];
51
57
  ready: boolean;
52
- }, __VLS_51: {
58
+ }, __VLS_67: {
53
59
  editor: any;
54
- }, __VLS_59: {
60
+ }, __VLS_75: {
55
61
  editor: any;
56
- }, __VLS_67: {
62
+ }, __VLS_83: {
57
63
  editor: any;
58
- }, __VLS_70: {
64
+ }, __VLS_86: {
59
65
  editor: any;
60
66
  };
61
67
  type __VLS_Slots = {} & {
62
- default?: (props: typeof __VLS_42) => any;
68
+ default?: (props: typeof __VLS_58) => any;
63
69
  } & {
64
- link?: (props: typeof __VLS_51) => any;
70
+ link?: (props: typeof __VLS_67) => any;
65
71
  } & {
66
- 'doc-link'?: (props: typeof __VLS_59) => any;
72
+ 'doc-link'?: (props: typeof __VLS_75) => any;
67
73
  } & {
68
- 'create-child-doc'?: (props: typeof __VLS_67) => any;
74
+ 'create-child-doc'?: (props: typeof __VLS_83) => any;
69
75
  } & {
70
- 'send-to-chat'?: (props: typeof __VLS_70) => any;
76
+ 'send-to-chat'?: (props: typeof __VLS_86) => any;
71
77
  };
72
78
  declare const __VLS_base: import("vue").DefineComponent<__VLS_PublicProps, {
73
79
  editor: import("vue").ComputedRef<any>;
@@ -91,6 +97,7 @@ declare const __VLS_base: import("vue").DefineComponent<__VLS_PublicProps, {
91
97
  showDragHandle: boolean;
92
98
  variant: "doc" | "prose";
93
99
  showSourceToggle: boolean;
100
+ showBreadcrumb: boolean;
94
101
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
95
102
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
96
103
  declare const _default: typeof __VLS_export;