@abraca/nuxt 2.3.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.
Files changed (99) hide show
  1. package/README.md +25 -6
  2. package/dist/module.d.mts +4 -2
  3. package/dist/module.json +1 -1
  4. package/dist/runtime/components/ACodeEditor.d.vue.ts +1 -1
  5. package/dist/runtime/components/ACodeEditor.vue.d.ts +1 -1
  6. package/dist/runtime/components/AConnectServerModal.d.vue.ts +2 -2
  7. package/dist/runtime/components/AConnectServerModal.vue +1 -1
  8. package/dist/runtime/components/AConnectServerModal.vue.d.ts +2 -2
  9. package/dist/runtime/components/ADocumentTree.d.vue.ts +8 -1
  10. package/dist/runtime/components/ADocumentTree.vue +6 -3
  11. package/dist/runtime/components/ADocumentTree.vue.d.ts +8 -1
  12. package/dist/runtime/components/AEditor.d.vue.ts +7 -7
  13. package/dist/runtime/components/AEditor.vue.d.ts +7 -7
  14. package/dist/runtime/components/AEmailVerifyConfirmModal.d.vue.ts +2 -2
  15. package/dist/runtime/components/AEmailVerifyConfirmModal.vue.d.ts +2 -2
  16. package/dist/runtime/components/AIdentityModal.d.vue.ts +2 -2
  17. package/dist/runtime/components/AIdentityModal.vue.d.ts +2 -2
  18. package/dist/runtime/components/AInviteRedeemModal.vue +15 -11
  19. package/dist/runtime/components/AMnemonicLoginModal.d.vue.ts +2 -2
  20. package/dist/runtime/components/AMnemonicLoginModal.vue.d.ts +2 -2
  21. package/dist/runtime/components/APasswordChangeModal.d.vue.ts +3 -3
  22. package/dist/runtime/components/APasswordChangeModal.vue.d.ts +3 -3
  23. package/dist/runtime/components/APasswordLoginModal.d.vue.ts +4 -4
  24. package/dist/runtime/components/APasswordLoginModal.vue.d.ts +4 -4
  25. package/dist/runtime/components/APasswordRegisterModal.d.vue.ts +3 -3
  26. package/dist/runtime/components/APasswordRegisterModal.vue.d.ts +3 -3
  27. package/dist/runtime/components/APasswordResetConfirmModal.d.vue.ts +3 -3
  28. package/dist/runtime/components/APasswordResetConfirmModal.vue.d.ts +3 -3
  29. package/dist/runtime/components/APasswordResetRequestModal.d.vue.ts +2 -2
  30. package/dist/runtime/components/APasswordResetRequestModal.vue.d.ts +2 -2
  31. package/dist/runtime/components/ASetPasswordCard.d.vue.ts +1 -1
  32. package/dist/runtime/components/ASetPasswordCard.vue.d.ts +1 -1
  33. package/dist/runtime/components/aware/AArea.d.vue.ts +1 -1
  34. package/dist/runtime/components/aware/AArea.vue.d.ts +1 -1
  35. package/dist/runtime/components/aware/ACalendar.d.vue.ts +1 -1
  36. package/dist/runtime/components/aware/ACalendar.vue.d.ts +1 -1
  37. package/dist/runtime/components/aware/AFileUpload.d.vue.ts +1 -1
  38. package/dist/runtime/components/aware/AFileUpload.vue.d.ts +1 -1
  39. package/dist/runtime/components/aware/AInput.d.vue.ts +1 -1
  40. package/dist/runtime/components/aware/AInput.vue.d.ts +1 -1
  41. package/dist/runtime/components/aware/AMedia.d.vue.ts +1 -1
  42. package/dist/runtime/components/aware/AMedia.vue.d.ts +1 -1
  43. package/dist/runtime/components/aware/AScroll.d.vue.ts +1 -1
  44. package/dist/runtime/components/aware/AScroll.vue.d.ts +1 -1
  45. package/dist/runtime/components/aware/ASlider.d.vue.ts +1 -1
  46. package/dist/runtime/components/aware/ASlider.vue.d.ts +1 -1
  47. package/dist/runtime/components/aware/ATable.d.vue.ts +1 -1
  48. package/dist/runtime/components/aware/ATable.vue.d.ts +1 -1
  49. package/dist/runtime/components/aware/ATabs.d.vue.ts +1 -1
  50. package/dist/runtime/components/aware/ATabs.vue.d.ts +1 -1
  51. package/dist/runtime/components/aware/ATextarea.d.vue.ts +1 -1
  52. package/dist/runtime/components/aware/ATextarea.vue.d.ts +1 -1
  53. package/dist/runtime/components/aware/ATree.d.vue.ts +1 -1
  54. package/dist/runtime/components/aware/ATree.vue.d.ts +1 -1
  55. package/dist/runtime/components/docs/ADocsNavigation.d.vue.ts +1 -1
  56. package/dist/runtime/components/docs/ADocsNavigation.vue.d.ts +1 -1
  57. package/dist/runtime/components/docs/ADocsSearch.d.vue.ts +4 -4
  58. package/dist/runtime/components/docs/ADocsSearch.vue.d.ts +4 -4
  59. package/dist/runtime/components/docs/ADocsSearchButton.d.vue.ts +2 -2
  60. package/dist/runtime/components/docs/ADocsSearchButton.vue.d.ts +2 -2
  61. package/dist/runtime/components/docs/ADocsToc.d.vue.ts +1 -1
  62. package/dist/runtime/components/docs/ADocsToc.vue.d.ts +1 -1
  63. package/dist/runtime/components/editor/AColorPalettePopover.d.vue.ts +2 -2
  64. package/dist/runtime/components/editor/AColorPalettePopover.vue.d.ts +2 -2
  65. package/dist/runtime/components/editor/AFileGlbViewer.vue +27 -10
  66. package/dist/runtime/components/editor/AIconPickerPopover.d.vue.ts +2 -2
  67. package/dist/runtime/components/editor/AIconPickerPopover.vue.d.ts +2 -2
  68. package/dist/runtime/components/editor/ALocationPickerPopover.d.vue.ts +2 -2
  69. package/dist/runtime/components/editor/ALocationPickerPopover.vue.d.ts +2 -2
  70. package/dist/runtime/components/registry/APluginCapabilityDialog.d.vue.ts +4 -4
  71. package/dist/runtime/components/registry/APluginCapabilityDialog.vue +1 -1
  72. package/dist/runtime/components/registry/APluginCapabilityDialog.vue.d.ts +4 -4
  73. package/dist/runtime/components/renderers/AProseRenderer.d.vue.ts +4 -4
  74. package/dist/runtime/components/renderers/AProseRenderer.vue.d.ts +4 -4
  75. package/dist/runtime/components/renderers/sheets/ASheetsCell.d.vue.ts +4 -4
  76. package/dist/runtime/components/renderers/sheets/ASheetsCell.vue.d.ts +4 -4
  77. package/dist/runtime/components/renderers/sheets/ASheetsGrid.d.vue.ts +2 -2
  78. package/dist/runtime/components/renderers/sheets/ASheetsGrid.vue.d.ts +2 -2
  79. package/dist/runtime/components/renderers/sheets/ASheetsMobileActionBar.d.vue.ts +4 -4
  80. package/dist/runtime/components/renderers/sheets/ASheetsMobileActionBar.vue.d.ts +4 -4
  81. package/dist/runtime/components/renderers/sheets/ASheetsToolbar.d.vue.ts +4 -4
  82. package/dist/runtime/components/renderers/sheets/ASheetsToolbar.vue.d.ts +4 -4
  83. package/dist/runtime/components/shell/ADocPanelSettings.d.vue.ts +1 -1
  84. package/dist/runtime/components/shell/ADocPanelSettings.vue.d.ts +1 -1
  85. package/dist/runtime/components/shell/AUserProfilePopover.d.vue.ts +1 -1
  86. package/dist/runtime/components/shell/AUserProfilePopover.vue.d.ts +1 -1
  87. package/dist/runtime/components/shell/AWelcomeScreen.d.vue.ts +4 -4
  88. package/dist/runtime/components/shell/AWelcomeScreen.vue +77 -58
  89. package/dist/runtime/components/shell/AWelcomeScreen.vue.d.ts +4 -4
  90. package/dist/runtime/composables/useAbraAdmin.d.ts +131 -4
  91. package/dist/runtime/composables/useAbraAdmin.js +136 -36
  92. package/dist/runtime/composables/useInvites.d.ts +7 -0
  93. package/dist/runtime/plugin-abracadabra.client.js +44 -3
  94. package/dist/runtime/server/api/_abracadabra/spaces.get.d.ts +1 -1
  95. package/dist/runtime/types.d.ts +2 -0
  96. package/dist/runtime/utils/loadThree.d.ts +18 -0
  97. package/dist/runtime/utils/loadThree.js +46 -0
  98. package/dist/types.d.mts +6 -2
  99. package/package.json +26 -22
package/README.md CHANGED
@@ -7,6 +7,23 @@
7
7
 
8
8
  First-class Nuxt 4 module for the [Abracadabra](https://abra.cou.sh) CRDT collaboration platform. Drop real-time collaborative documents, multi-user awareness, offline-first sync, and a full rich-text editor into any Nuxt app.
9
9
 
10
+ ## Documentation
11
+
12
+ Full, code-derived documentation lives in [`docs/`](docs/) — a numbered Nuxt-Content
13
+ site, the single source of truth (prior `AUDIT.md`/`audit-*.md`/`gaps/` were untrusted
14
+ and moved to `../DEPRECATED/abracadabra-nuxt/`; where this README or `CLAUDE.md` drifted,
15
+ the docs win). Seven sections:
16
+
17
+ | Section | Covers |
18
+ |---|---|
19
+ | [Getting Started](docs/1.getting-started/) | install, peers, the exhaustive options schema, quick start |
20
+ | [Core](docs/2.core/) | `setup()` internals, client/server bootstrap, plugins & registry, state & types, Nitro RPC runners |
21
+ | [Composables](docs/3.composables/) | all ~107 auto-imported composables (incl. the `useYDoc.ts` Yjs primitives — there is **no** `useYDoc()`) |
22
+ | [Components](docs/4.components/) | the **210** components (44 top-level + 166 across eight subdirs), incl. the 52 Aware components |
23
+ | [Editor Extensions](docs/5.editor-extensions/) | the ~41 collaborative TipTap nodes/marks/behaviours |
24
+ | [Guides](docs/6.guides/) | doc page, plugin, RPC method, theming, auth, custom renderer, i18n |
25
+ | [Reference](docs/7.reference/) | utils, awareness sharing modes, server API routes, gotchas |
26
+
10
27
  - [Release Notes](/CHANGELOG.md)
11
28
 
12
29
  ## Features
@@ -14,8 +31,8 @@ First-class Nuxt 4 module for the [Abracadabra](https://abra.cou.sh) CRDT collab
14
31
  - Real-time collaborative editing via WebSocket + Yjs CRDT
15
32
  - Offline-first with IndexedDB persistence and background sync queue
16
33
  - Multi-user awareness — cursors, presence, typing indicators, voice/video
17
- - TipTap rich-text editor with 30+ built-in extensions
18
- - Built-in page renderers: Kanban, Table, Calendar, Gallery, Outline
34
+ - TipTap rich-text editor with ~41 built-in collaborative extensions
35
+ - 15+ built-in page renderers: doc/prose/code, Kanban, Table, Calendar, Gallery, Outline, Checklist, Timeline, Call, Graph, Dashboard, Map, Slides
19
36
  - Full-text search with trigram indexing
20
37
  - File uploads with offline blob caching
21
38
  - Passkey (WebAuthn) authentication
@@ -24,11 +41,13 @@ First-class Nuxt 4 module for the [Abracadabra](https://abra.cou.sh) CRDT collab
24
41
 
25
42
  ## Requirements
26
43
 
27
- - Nuxt >= 4
28
- - `@abraca/dabra` >= 1.0.0
29
- - `@tiptap/core`, `@tiptap/vue-3`, `@tiptap/extension-collaboration`, `@tiptap/extension-collaboration-caret`
44
+ - Nuxt >= 4, Vue >= 3.4, `@nuxt/ui` >= 3
45
+ - `@abraca/dabra`, `@abraca/convert`, `@abraca/plugin` (all `^2.3`)
46
+ - `@tiptap/* 3` collaboration set, `lowlight`, `@noble/ed25519`, `@noble/hashes`
30
47
  - `yjs` >= 13
31
48
 
49
+ See [Getting Started → Installation](docs/1.getting-started/2.installation.md) for the full required/optional peer matrix.
50
+
32
51
  ## Setup
33
52
 
34
53
  ```bash
@@ -105,7 +124,7 @@ abracadabra: {
105
124
  | `useAwareness()` | All connected users' raw awareness states |
106
125
  | `useAwarenessPeers()` | Typed peer list with idle detection |
107
126
  | `useAAField(key)` | Per-field interaction awareness (hover, press, focus) |
108
- | `useYDoc(ydoc)` | Reactive Yjs primitives `useSyncedMap`, `useSyncedArray`, `useAwarenessOf`, `useSmoothedCursors` |
127
+ | `useSyncedMap` / `useSyncedArray` / `useSyncedText` / `useSyncedXml` / `useAwarenessOf` / `useSmoothedCursors` | Reactive Yjs primitives (the `useYDoc.ts` helper module — there is **no** `useYDoc()` and no `useMultiplayerObject`) |
109
128
  | `useEditor(ydoc, opts)` | TipTap setup with collaboration + cursor extensions |
110
129
  | `useChildTree(docId)` | Document tree scoped to a parent |
111
130
  | `useDocumentPermissions(role)` | RBAC flags (canWrite, canDelete, etc.) |
package/dist/module.d.mts CHANGED
@@ -1,6 +1,6 @@
1
1
  import * as _nuxt_schema from '@nuxt/schema';
2
2
  import * as __runtime_types from '../dist/runtime/types.js';
3
- export { AbracadabraPlugin, AbracadabraState, CachedTreeNode, DocCacheAPI, DocPageMeta, RunnerCleanup, ServerRunnerContext, ServerRunnerDefinition, TreeEntry, UserMetaField } from '../dist/runtime/types.js';
3
+ export { AbracadabraPlugin, AbracadabraState, CachedTreeNode, DocCacheAPI, DocPageMeta, InviteInfo, RunnerCleanup, ServerRunnerContext, ServerRunnerDefinition, SpaceMeta, TreeEntry, UserMetaField } from '../dist/runtime/types.js';
4
4
  import { AbracadabraLocale } from '../dist/runtime/locale.js';
5
5
  export { AbracadabraLocale } from '../dist/runtime/locale.js';
6
6
  export { DocTreeReturn } from '../dist/runtime/composables/useDocTree.js';
@@ -8,8 +8,10 @@ export { DocSeoOptions } from '../dist/runtime/composables/useDocSeo.js';
8
8
  export { DocDragState } from '../dist/runtime/composables/useDocDragBus.js';
9
9
  export { ParsedMessage, TextSegment, parseMessageContent, previewMessageContent, renderMessageSegments } from '../dist/runtime/utils/chatContent.js';
10
10
  export { DupEntry, duplicateDocContent, duplicateDocTree } from '../dist/runtime/utils/duplicateDocContent.js';
11
- export { AuditLogEntry, AuditQueryOpts, AuditVerifyResult, DocSearchHit, ReadyzStatus } from '@abraca/dabra';
11
+ export { AdminConfigField, AuditLogEntry, AuditQueryOpts, AuditVerifyResult, DocSearchHit, EnvSnapshotResponse, ReadyzStatus } from '@abraca/dabra';
12
12
  export { ServerTrashEntry } from '../dist/runtime/composables/useServerTrash.js';
13
+ export { Invite } from '../dist/runtime/composables/useInvites.js';
14
+ export { AdminStorageStats, AdminUploadList, AdminUploadRow, AdminUserDocRow, AdminUserRow } from '../dist/runtime/composables/useAbraAdmin.js';
13
15
  export { SlugMap, SlugMapEntry, buildSlugMap, isUUID, slugify } from '../dist/runtime/utils/slugify.js';
14
16
  export { avatarBorderStyle, avatarGradient, avatarStyleFromName } from '../dist/runtime/utils/avatarStyle.js';
15
17
  export { COLOR_PALETTES, ColorPalette, ColorShade, findPaletteByHex } from '../dist/runtime/utils/colorPalettes.js';
package/dist/module.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "compatibility": {
5
5
  "nuxt": ">=4.0.0"
6
6
  },
7
- "version": "2.3.0",
7
+ "version": "2.5.0",
8
8
  "builder": {
9
9
  "@nuxt/module-builder": "1.0.2",
10
10
  "unbuild": "3.6.1"
@@ -17,9 +17,9 @@ type __VLS_Props = {
17
17
  declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {
18
18
  editorView: import("vue").ShallowRef<any, any>;
19
19
  }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
20
- readOnly: boolean;
21
20
  language: Lang;
22
21
  fieldName: string;
22
+ readOnly: boolean;
23
23
  asXmlFragment: boolean;
24
24
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
25
25
  declare const _default: typeof __VLS_export;
@@ -17,9 +17,9 @@ type __VLS_Props = {
17
17
  declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {
18
18
  editorView: import("vue").ShallowRef<any, any>;
19
19
  }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
20
- readOnly: boolean;
21
20
  language: Lang;
22
21
  fieldName: string;
22
+ readOnly: boolean;
23
23
  asXmlFragment: boolean;
24
24
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
25
25
  declare const _default: typeof __VLS_export;
@@ -2,11 +2,11 @@ type __VLS_ModelProps = {
2
2
  'open'?: boolean;
3
3
  };
4
4
  declare const __VLS_export: import("vue").DefineComponent<__VLS_ModelProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
5
- done: (url: string) => any;
6
5
  "update:open": (value: boolean) => any;
6
+ done: (url: string) => any;
7
7
  }, string, import("vue").PublicProps, Readonly<__VLS_ModelProps> & Readonly<{
8
- onDone?: ((url: string) => any) | undefined;
9
8
  "onUpdate:open"?: ((value: boolean) => any) | undefined;
9
+ onDone?: ((url: string) => any) | undefined;
10
10
  }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
11
11
  declare const _default: typeof __VLS_export;
12
12
  export default _default;
@@ -90,7 +90,7 @@ async function finishConnection(url) {
90
90
  <div class="flex flex-col items-center text-center gap-4 pt-4">
91
91
  <div class="w-14 h-14 rounded-2xl bg-(--ui-bg-elevated) flex items-center justify-center">
92
92
  <UIcon
93
- name="i-lucide-server"
93
+ name="i-lucide-hexagon"
94
94
  class="size-7 text-(--color-primary-500)"
95
95
  />
96
96
  </div>
@@ -2,11 +2,11 @@ type __VLS_ModelProps = {
2
2
  'open'?: boolean;
3
3
  };
4
4
  declare const __VLS_export: import("vue").DefineComponent<__VLS_ModelProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
5
- done: (url: string) => any;
6
5
  "update:open": (value: boolean) => any;
6
+ done: (url: string) => any;
7
7
  }, string, import("vue").PublicProps, Readonly<__VLS_ModelProps> & Readonly<{
8
- onDone?: ((url: string) => any) | undefined;
9
8
  "onUpdate:open"?: ((value: boolean) => any) | undefined;
9
+ onDone?: ((url: string) => any) | undefined;
10
10
  }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
11
11
  declare const _default: typeof __VLS_export;
12
12
  export default _default;
@@ -2,13 +2,19 @@ type __VLS_Props = {
2
2
  collapsed?: boolean;
3
3
  editable?: boolean;
4
4
  selectedId?: string | null;
5
+ /**
6
+ * Scope the visible tree to the subtree under this doc id (e.g. one
7
+ * space). When unset the tree roots at the active space / server
8
+ * root as before — so this is a purely additive opt-in filter.
9
+ */
10
+ rootId?: string | null;
5
11
  };
6
12
  declare var __VLS_39: {};
7
13
  type __VLS_Slots = {} & {
8
14
  'toolbar-start'?: (props: typeof __VLS_39) => any;
9
15
  };
10
16
  declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {
11
- handleExternalDrop: (e: DragEvent, parentId?: string | null) => Promise<void>;
17
+ handleExternalDrop: (e: DragEvent, parentId?: string | null) => any;
12
18
  }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
13
19
  create: (parentId: string | null) => any;
14
20
  navigate: (id: string) => any;
@@ -17,6 +23,7 @@ declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {
17
23
  onNavigate?: ((id: string) => any) | undefined;
18
24
  }>, {
19
25
  editable: boolean;
26
+ rootId: string | null;
20
27
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
21
28
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
22
29
  declare const _default: typeof __VLS_export;
@@ -9,7 +9,8 @@ const dragBus = useDocDragBus();
9
9
  const props = defineProps({
10
10
  collapsed: { type: Boolean, required: false },
11
11
  editable: { type: Boolean, required: false, default: true },
12
- selectedId: { type: [String, null], required: false }
12
+ selectedId: { type: [String, null], required: false },
13
+ rootId: { type: [String, null], required: false, default: null }
13
14
  });
14
15
  const emit = defineEmits(["navigate", "create"]);
15
16
  const { doc, spaceDocId, isReady, provider, client, userName } = useAbracadabra();
@@ -51,12 +52,14 @@ const treeItems = computed(() => {
51
52
  const sid = spaceDocId.value;
52
53
  const raw = toRaw(treeMap.data);
53
54
  const ROOT = "@root";
55
+ const scopeRoot = props.rootId ?? null;
56
+ const isTopLevel = (p) => scopeRoot != null ? p === scopeRoot : p == null || p === sid;
54
57
  const childrenByParent = /* @__PURE__ */ new Map();
55
58
  for (const id in raw) {
56
- if (id === sid) continue;
59
+ if (id === sid || id === scopeRoot) continue;
57
60
  const v = raw[id];
58
61
  const rawPid = v.parentId ?? null;
59
- const pid = rawPid == null || rawPid === sid ? ROOT : rawPid;
62
+ const pid = isTopLevel(rawPid) ? ROOT : rawPid;
60
63
  const bucket = childrenByParent.get(pid);
61
64
  if (bucket) bucket.push([id, v]);
62
65
  else childrenByParent.set(pid, [[id, v]]);
@@ -2,13 +2,19 @@ type __VLS_Props = {
2
2
  collapsed?: boolean;
3
3
  editable?: boolean;
4
4
  selectedId?: string | null;
5
+ /**
6
+ * Scope the visible tree to the subtree under this doc id (e.g. one
7
+ * space). When unset the tree roots at the active space / server
8
+ * root as before — so this is a purely additive opt-in filter.
9
+ */
10
+ rootId?: string | null;
5
11
  };
6
12
  declare var __VLS_39: {};
7
13
  type __VLS_Slots = {} & {
8
14
  'toolbar-start'?: (props: typeof __VLS_39) => any;
9
15
  };
10
16
  declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {
11
- handleExternalDrop: (e: DragEvent, parentId?: string | null) => Promise<void>;
17
+ handleExternalDrop: (e: DragEvent, parentId?: string | null) => any;
12
18
  }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
13
19
  create: (parentId: string | null) => any;
14
20
  navigate: (id: string) => any;
@@ -17,6 +23,7 @@ declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {
17
23
  onNavigate?: ((id: string) => any) | undefined;
18
24
  }>, {
19
25
  editable: boolean;
26
+ rootId: string | null;
20
27
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
21
28
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
22
29
  declare const _default: typeof __VLS_export;
@@ -72,24 +72,24 @@ type __VLS_Slots = {} & {
72
72
  declare const __VLS_base: import("vue").DefineComponent<__VLS_PublicProps, {
73
73
  editor: import("vue").ComputedRef<any>;
74
74
  }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
75
- rename: (label: string) => any;
76
- ready: () => any;
77
- update: (content: any) => any;
78
75
  "update:modelValue": (value: any) => any;
76
+ rename: (label: string) => any;
79
77
  updateMeta: (patch: Partial<DocPageMeta>) => any;
78
+ update: (content: any) => any;
79
+ ready: () => any;
80
80
  }, string, import("vue").PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
81
- onRename?: ((label: string) => any) | undefined;
82
- onReady?: (() => any) | undefined;
83
- onUpdate?: ((content: any) => any) | undefined;
84
81
  "onUpdate:modelValue"?: ((value: any) => any) | undefined;
82
+ onRename?: ((label: string) => any) | undefined;
85
83
  onUpdateMeta?: ((patch: Partial<DocPageMeta>) => any) | undefined;
84
+ onUpdate?: ((content: any) => any) | undefined;
85
+ onReady?: (() => any) | undefined;
86
86
  }>, {
87
+ variant: "doc" | "prose";
87
88
  contentType: "json" | "html" | "markdown";
88
89
  editable: boolean;
89
90
  showToolbar: boolean;
90
91
  showSuggestionMenu: boolean;
91
92
  showDragHandle: boolean;
92
- variant: "doc" | "prose";
93
93
  showSourceToggle: boolean;
94
94
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
95
95
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
@@ -72,24 +72,24 @@ type __VLS_Slots = {} & {
72
72
  declare const __VLS_base: import("vue").DefineComponent<__VLS_PublicProps, {
73
73
  editor: import("vue").ComputedRef<any>;
74
74
  }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
75
- rename: (label: string) => any;
76
- ready: () => any;
77
- update: (content: any) => any;
78
75
  "update:modelValue": (value: any) => any;
76
+ rename: (label: string) => any;
79
77
  updateMeta: (patch: Partial<DocPageMeta>) => any;
78
+ update: (content: any) => any;
79
+ ready: () => any;
80
80
  }, string, import("vue").PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
81
- onRename?: ((label: string) => any) | undefined;
82
- onReady?: (() => any) | undefined;
83
- onUpdate?: ((content: any) => any) | undefined;
84
81
  "onUpdate:modelValue"?: ((value: any) => any) | undefined;
82
+ onRename?: ((label: string) => any) | undefined;
85
83
  onUpdateMeta?: ((patch: Partial<DocPageMeta>) => any) | undefined;
84
+ onUpdate?: ((content: any) => any) | undefined;
85
+ onReady?: (() => any) | undefined;
86
86
  }>, {
87
+ variant: "doc" | "prose";
87
88
  contentType: "json" | "html" | "markdown";
88
89
  editable: boolean;
89
90
  showToolbar: boolean;
90
91
  showSuggestionMenu: boolean;
91
92
  showDragHandle: boolean;
92
- variant: "doc" | "prose";
93
93
  showSourceToggle: boolean;
94
94
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
95
95
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
@@ -10,15 +10,15 @@ type __VLS_Props = {
10
10
  subtitle?: string;
11
11
  };
12
12
  declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
13
+ "update:open": (v: boolean) => any;
13
14
  submit: (payload: {
14
15
  token: string;
15
16
  }) => any;
16
- "update:open": (v: boolean) => any;
17
17
  }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
18
+ "onUpdate:open"?: ((v: boolean) => any) | undefined;
18
19
  onSubmit?: ((payload: {
19
20
  token: string;
20
21
  }) => any) | undefined;
21
- "onUpdate:open"?: ((v: boolean) => any) | undefined;
22
22
  }>, {
23
23
  subtitle: string;
24
24
  title: string;
@@ -10,15 +10,15 @@ type __VLS_Props = {
10
10
  subtitle?: string;
11
11
  };
12
12
  declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
13
+ "update:open": (v: boolean) => any;
13
14
  submit: (payload: {
14
15
  token: string;
15
16
  }) => any;
16
- "update:open": (v: boolean) => any;
17
17
  }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
18
+ "onUpdate:open"?: ((v: boolean) => any) | undefined;
18
19
  onSubmit?: ((payload: {
19
20
  token: string;
20
21
  }) => any) | undefined;
21
- "onUpdate:open"?: ((v: boolean) => any) | undefined;
22
22
  }>, {
23
23
  subtitle: string;
24
24
  title: string;
@@ -26,13 +26,13 @@ type __VLS_Slots = {} & {
26
26
  'actions-right'?: (props: typeof __VLS_51) => any;
27
27
  };
28
28
  declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
29
- rename: (name: string) => any;
30
29
  "update:open": (open: boolean) => any;
30
+ rename: (name: string) => any;
31
31
  "sign-out": () => any;
32
32
  "show-recovery": () => any;
33
33
  }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
34
- onRename?: ((name: string) => any) | undefined;
35
34
  "onUpdate:open"?: ((open: boolean) => any) | undefined;
35
+ onRename?: ((name: string) => any) | undefined;
36
36
  "onSign-out"?: (() => any) | undefined;
37
37
  "onShow-recovery"?: (() => any) | undefined;
38
38
  }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
@@ -26,13 +26,13 @@ type __VLS_Slots = {} & {
26
26
  'actions-right'?: (props: typeof __VLS_51) => any;
27
27
  };
28
28
  declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
29
- rename: (name: string) => any;
30
29
  "update:open": (open: boolean) => any;
30
+ rename: (name: string) => any;
31
31
  "sign-out": () => any;
32
32
  "show-recovery": () => any;
33
33
  }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
34
- onRename?: ((name: string) => any) | undefined;
35
34
  "onUpdate:open"?: ((open: boolean) => any) | undefined;
35
+ onRename?: ((name: string) => any) | undefined;
36
36
  "onSign-out"?: (() => any) | undefined;
37
37
  "onShow-recovery"?: (() => any) | undefined;
38
38
  }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
@@ -11,11 +11,14 @@ const { currentServerUrl } = useAbracadabra();
11
11
  const code = ref("");
12
12
  const isLoading = ref(false);
13
13
  const error = ref(null);
14
- watch(() => props.open, (open) => {
15
- if (!open) return;
16
- code.value = "";
17
- error.value = null;
18
- });
14
+ watch(
15
+ () => props.open,
16
+ (open) => {
17
+ if (!open) return;
18
+ code.value = "";
19
+ error.value = null;
20
+ }
21
+ );
19
22
  function onInput(e) {
20
23
  const raw = e.target.value.toUpperCase().replace(/[^A-Z0-9]/g, "");
21
24
  const parts = raw.match(/.{1,4}/g) ?? [];
@@ -51,14 +54,18 @@ async function handleRedeem() {
51
54
  <div class="flex flex-col gap-5 p-6">
52
55
  <!-- Header -->
53
56
  <div class="flex flex-col items-center text-center gap-3 pt-4">
54
- <div class="w-12 h-12 rounded-2xl bg-(--ui-bg-elevated) flex items-center justify-center">
57
+ <div
58
+ class="w-12 h-12 rounded-2xl bg-(--ui-bg-elevated) flex items-center justify-center"
59
+ >
55
60
  <UIcon
56
61
  name="i-lucide-ticket"
57
62
  class="size-6 text-(--color-primary-500)"
58
63
  />
59
64
  </div>
60
65
  <div>
61
- <h2 class="text-xl font-bold text-(--ui-text-highlighted) tracking-tight">
66
+ <h2
67
+ class="text-xl font-bold text-(--ui-text-highlighted) tracking-tight"
68
+ >
62
69
  Redeem Invite
63
70
  </h2>
64
71
  <p class="text-sm text-(--ui-text-muted)">
@@ -68,10 +75,7 @@ async function handleRedeem() {
68
75
  v-if="currentServerUrl"
69
76
  class="text-xs text-(--ui-text-dimmed) flex items-center gap-1 justify-center mt-1"
70
77
  >
71
- <UIcon
72
- name="i-lucide-server"
73
- class="size-3"
74
- />
78
+ <UIcon name="i-lucide-hexagon" class="size-3" />
75
79
  {{ currentServerUrl }}
76
80
  </p>
77
81
  </div>
@@ -12,19 +12,19 @@ type __VLS_Props = {
12
12
  subtitle?: string;
13
13
  };
14
14
  declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
15
+ "update:open": (open: boolean) => any;
15
16
  submit: (payload: {
16
17
  mnemonic: string;
17
18
  passphrase?: string;
18
19
  ephemeral: boolean;
19
20
  }) => any;
20
- "update:open": (open: boolean) => any;
21
21
  }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
22
+ "onUpdate:open"?: ((open: boolean) => any) | undefined;
22
23
  onSubmit?: ((payload: {
23
24
  mnemonic: string;
24
25
  passphrase?: string;
25
26
  ephemeral: boolean;
26
27
  }) => any) | undefined;
27
- "onUpdate:open"?: ((open: boolean) => any) | undefined;
28
28
  }>, {
29
29
  subtitle: string;
30
30
  title: string;
@@ -12,19 +12,19 @@ type __VLS_Props = {
12
12
  subtitle?: string;
13
13
  };
14
14
  declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
15
+ "update:open": (open: boolean) => any;
15
16
  submit: (payload: {
16
17
  mnemonic: string;
17
18
  passphrase?: string;
18
19
  ephemeral: boolean;
19
20
  }) => any;
20
- "update:open": (open: boolean) => any;
21
21
  }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
22
+ "onUpdate:open"?: ((open: boolean) => any) | undefined;
22
23
  onSubmit?: ((payload: {
23
24
  mnemonic: string;
24
25
  passphrase?: string;
25
26
  ephemeral: boolean;
26
27
  }) => any) | undefined;
27
- "onUpdate:open"?: ((open: boolean) => any) | undefined;
28
28
  }>, {
29
29
  subtitle: string;
30
30
  title: string;
@@ -7,22 +7,22 @@ type __VLS_Props = {
7
7
  minLength?: number;
8
8
  };
9
9
  declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
10
+ "update:open": (v: boolean) => any;
10
11
  submit: (payload: {
11
12
  currentPassword: string;
12
13
  newPassword: string;
13
14
  }) => any;
14
- "update:open": (v: boolean) => any;
15
15
  }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
16
+ "onUpdate:open"?: ((v: boolean) => any) | undefined;
16
17
  onSubmit?: ((payload: {
17
18
  currentPassword: string;
18
19
  newPassword: string;
19
20
  }) => any) | undefined;
20
- "onUpdate:open"?: ((v: boolean) => any) | undefined;
21
21
  }>, {
22
22
  subtitle: string;
23
23
  title: string;
24
- minLength: number;
25
24
  loading: boolean;
25
+ minLength: number;
26
26
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
27
27
  declare const _default: typeof __VLS_export;
28
28
  export default _default;
@@ -7,22 +7,22 @@ type __VLS_Props = {
7
7
  minLength?: number;
8
8
  };
9
9
  declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
10
+ "update:open": (v: boolean) => any;
10
11
  submit: (payload: {
11
12
  currentPassword: string;
12
13
  newPassword: string;
13
14
  }) => any;
14
- "update:open": (v: boolean) => any;
15
15
  }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
16
+ "onUpdate:open"?: ((v: boolean) => any) | undefined;
16
17
  onSubmit?: ((payload: {
17
18
  currentPassword: string;
18
19
  newPassword: string;
19
20
  }) => any) | undefined;
20
- "onUpdate:open"?: ((v: boolean) => any) | undefined;
21
21
  }>, {
22
22
  subtitle: string;
23
23
  title: string;
24
- minLength: number;
25
24
  loading: boolean;
25
+ minLength: number;
26
26
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
27
27
  declare const _default: typeof __VLS_export;
28
28
  export default _default;
@@ -13,22 +13,22 @@ type __VLS_Props = {
13
13
  showInviteCode?: boolean;
14
14
  };
15
15
  declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
16
+ "update:open": (v: boolean) => any;
17
+ register: () => any;
16
18
  submit: (payload: {
17
19
  username: string;
18
20
  password: string;
19
21
  inviteCode?: string;
20
22
  }) => any;
21
- "update:open": (v: boolean) => any;
22
- register: () => any;
23
23
  forgot: () => any;
24
24
  }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
25
+ "onUpdate:open"?: ((v: boolean) => any) | undefined;
26
+ onRegister?: (() => any) | undefined;
25
27
  onSubmit?: ((payload: {
26
28
  username: string;
27
29
  password: string;
28
30
  inviteCode?: string;
29
31
  }) => any) | undefined;
30
- "onUpdate:open"?: ((v: boolean) => any) | undefined;
31
- onRegister?: (() => any) | undefined;
32
32
  onForgot?: (() => any) | undefined;
33
33
  }>, {
34
34
  subtitle: string;
@@ -13,22 +13,22 @@ type __VLS_Props = {
13
13
  showInviteCode?: boolean;
14
14
  };
15
15
  declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
16
+ "update:open": (v: boolean) => any;
17
+ register: () => any;
16
18
  submit: (payload: {
17
19
  username: string;
18
20
  password: string;
19
21
  inviteCode?: string;
20
22
  }) => any;
21
- "update:open": (v: boolean) => any;
22
- register: () => any;
23
23
  forgot: () => any;
24
24
  }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
25
+ "onUpdate:open"?: ((v: boolean) => any) | undefined;
26
+ onRegister?: (() => any) | undefined;
25
27
  onSubmit?: ((payload: {
26
28
  username: string;
27
29
  password: string;
28
30
  inviteCode?: string;
29
31
  }) => any) | undefined;
30
- "onUpdate:open"?: ((v: boolean) => any) | undefined;
31
- onRegister?: (() => any) | undefined;
32
32
  onForgot?: (() => any) | undefined;
33
33
  }>, {
34
34
  subtitle: string;
@@ -16,6 +16,7 @@ type __VLS_Props = {
16
16
  showSignInLink?: boolean;
17
17
  };
18
18
  declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
19
+ "update:open": (v: boolean) => any;
19
20
  submit: (payload: {
20
21
  username: string;
21
22
  password: string;
@@ -23,9 +24,9 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {
23
24
  displayName?: string;
24
25
  inviteCode?: string;
25
26
  }) => any;
26
- "update:open": (v: boolean) => any;
27
27
  signin: () => any;
28
28
  }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
29
+ "onUpdate:open"?: ((v: boolean) => any) | undefined;
29
30
  onSubmit?: ((payload: {
30
31
  username: string;
31
32
  password: string;
@@ -33,13 +34,12 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {
33
34
  displayName?: string;
34
35
  inviteCode?: string;
35
36
  }) => any) | undefined;
36
- "onUpdate:open"?: ((v: boolean) => any) | undefined;
37
37
  onSignin?: (() => any) | undefined;
38
38
  }>, {
39
39
  subtitle: string;
40
40
  title: string;
41
- minLength: number;
42
41
  loading: boolean;
42
+ minLength: number;
43
43
  showInviteCode: boolean;
44
44
  showEmail: boolean;
45
45
  showDisplayName: boolean;