@mp-lb/mdkit 0.0.1-main.2.1

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 (125) hide show
  1. package/README.md +132 -0
  2. package/dist/collaboration/useMdKitCollaboration.d.ts +10 -0
  3. package/dist/collaboration/useMdKitCollaboration.js +90 -0
  4. package/dist/core/documentEngine.d.ts +38 -0
  5. package/dist/core/documentEngine.js +95 -0
  6. package/dist/core/documentEngine.test.d.ts +1 -0
  7. package/dist/core/documentEngine.test.js +119 -0
  8. package/dist/core/index.d.ts +3 -0
  9. package/dist/core/index.js +1 -0
  10. package/dist/document/MdKitConflictPanel.d.ts +7 -0
  11. package/dist/document/MdKitConflictPanel.js +41 -0
  12. package/dist/document/MdKitDocumentToolbar.d.ts +13 -0
  13. package/dist/document/MdKitDocumentToolbar.js +48 -0
  14. package/dist/document/documentTypes.d.ts +57 -0
  15. package/dist/document/documentTypes.js +1 -0
  16. package/dist/document/useMdKitDocument.d.ts +33 -0
  17. package/dist/document/useMdKitDocument.js +396 -0
  18. package/dist/document/useMdKitDocument.test.d.ts +1 -0
  19. package/dist/document/useMdKitDocument.test.js +151 -0
  20. package/dist/fastify.d.ts +3 -0
  21. package/dist/fastify.js +1 -0
  22. package/dist/index.d.ts +23 -0
  23. package/dist/index.js +11 -0
  24. package/dist/markdown/MarkdownBubbleMenu.d.ts +6 -0
  25. package/dist/markdown/MarkdownBubbleMenu.js +29 -0
  26. package/dist/markdown/MdKitEditor.d.ts +25 -0
  27. package/dist/markdown/MdKitEditor.js +7 -0
  28. package/dist/markdown/MdKitEditor.test.d.ts +1 -0
  29. package/dist/markdown/MdKitEditor.test.js +126 -0
  30. package/dist/markdown/TiptapMarkdownSurface.d.ts +23 -0
  31. package/dist/markdown/TiptapMarkdownSurface.js +430 -0
  32. package/dist/markdown/editorDebug.d.ts +5 -0
  33. package/dist/markdown/editorDebug.js +1 -0
  34. package/dist/markdown/markdownFenceRanges.d.ts +6 -0
  35. package/dist/markdown/markdownFenceRanges.js +41 -0
  36. package/dist/markdown/normalizeMarkdownSerialization.d.ts +1 -0
  37. package/dist/markdown/normalizeMarkdownSerialization.js +34 -0
  38. package/dist/markdown/normalizeMarkdownSerialization.test.d.ts +1 -0
  39. package/dist/markdown/normalizeMarkdownSerialization.test.js +16 -0
  40. package/dist/markdown/prepareMarkdownForEditorHydration.d.ts +1 -0
  41. package/dist/markdown/prepareMarkdownForEditorHydration.js +12 -0
  42. package/dist/markdown/prepareMarkdownForEditorHydration.test.d.ts +1 -0
  43. package/dist/markdown/prepareMarkdownForEditorHydration.test.js +13 -0
  44. package/dist/markdown/preserveMarkdownWhitespace.d.ts +1 -0
  45. package/dist/markdown/preserveMarkdownWhitespace.js +86 -0
  46. package/dist/markdown/preserveMarkdownWhitespace.test.d.ts +1 -0
  47. package/dist/markdown/preserveMarkdownWhitespace.test.js +25 -0
  48. package/dist/test/setup.d.ts +1 -0
  49. package/dist/test/setup.js +13 -0
  50. package/dist/theme/MdKitThemeEditor.d.ts +8 -0
  51. package/dist/theme/MdKitThemeEditor.js +13 -0
  52. package/dist/theme/editorTheme.d.ts +20 -0
  53. package/dist/theme/editorTheme.js +47 -0
  54. package/dist/transport/fastify.d.ts +7 -0
  55. package/dist/transport/fastify.js +19 -0
  56. package/dist/transport/http.d.ts +43 -0
  57. package/dist/transport/http.js +80 -0
  58. package/dist/transport/index.d.ts +5 -0
  59. package/dist/transport/index.js +2 -0
  60. package/dist/transport/rest.d.ts +6 -0
  61. package/dist/transport/rest.js +34 -0
  62. package/dist/transport/store.d.ts +21 -0
  63. package/dist/transport/store.js +1 -0
  64. package/dist/transport/trpcClient.d.ts +81 -0
  65. package/dist/transport/trpcClient.js +21 -0
  66. package/dist/transport/trpcServer.d.ts +72 -0
  67. package/dist/transport/trpcServer.js +45 -0
  68. package/dist/trpc/client.d.ts +3 -0
  69. package/dist/trpc/client.js +1 -0
  70. package/dist/trpc/server.d.ts +3 -0
  71. package/dist/trpc/server.js +1 -0
  72. package/dist/trpc.d.ts +3 -0
  73. package/dist/trpc.js +1 -0
  74. package/dist/ui/joinClassNames.d.ts +1 -0
  75. package/dist/ui/joinClassNames.js +1 -0
  76. package/dist/versioning/VersionHistoryPanel.d.ts +9 -0
  77. package/dist/versioning/VersionHistoryPanel.js +29 -0
  78. package/dist/versioning/useMdKitDocumentVersions.d.ts +16 -0
  79. package/dist/versioning/useMdKitDocumentVersions.js +88 -0
  80. package/dist/versioning/useMdKitDocumentVersions.test.d.ts +1 -0
  81. package/dist/versioning/useMdKitDocumentVersions.test.js +41 -0
  82. package/docs/.vitepress/config.ts +34 -0
  83. package/docs/.vitepress/dist/404.html +22 -0
  84. package/docs/.vitepress/dist/api.html +120 -0
  85. package/docs/.vitepress/dist/architecture.html +25 -0
  86. package/docs/.vitepress/dist/assets/api.md.asncK3PQ.js +96 -0
  87. package/docs/.vitepress/dist/assets/api.md.asncK3PQ.lean.js +1 -0
  88. package/docs/.vitepress/dist/assets/app.BQvrHyG0.js +1 -0
  89. package/docs/.vitepress/dist/assets/architecture.md.BHQLarmZ.js +1 -0
  90. package/docs/.vitepress/dist/assets/architecture.md.BHQLarmZ.lean.js +1 -0
  91. package/docs/.vitepress/dist/assets/chunks/framework.RRduUuAx.js +19 -0
  92. package/docs/.vitepress/dist/assets/chunks/theme.CkCo6Nk1.js +1 -0
  93. package/docs/.vitepress/dist/assets/index.md.CITl-897.js +137 -0
  94. package/docs/.vitepress/dist/assets/index.md.CITl-897.lean.js +1 -0
  95. package/docs/.vitepress/dist/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 +0 -0
  96. package/docs/.vitepress/dist/assets/inter-italic-cyrillic.By2_1cv3.woff2 +0 -0
  97. package/docs/.vitepress/dist/assets/inter-italic-greek-ext.1u6EdAuj.woff2 +0 -0
  98. package/docs/.vitepress/dist/assets/inter-italic-greek.DJ8dCoTZ.woff2 +0 -0
  99. package/docs/.vitepress/dist/assets/inter-italic-latin-ext.CN1xVJS-.woff2 +0 -0
  100. package/docs/.vitepress/dist/assets/inter-italic-latin.C2AdPX0b.woff2 +0 -0
  101. package/docs/.vitepress/dist/assets/inter-italic-vietnamese.BSbpV94h.woff2 +0 -0
  102. package/docs/.vitepress/dist/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 +0 -0
  103. package/docs/.vitepress/dist/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 +0 -0
  104. package/docs/.vitepress/dist/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 +0 -0
  105. package/docs/.vitepress/dist/assets/inter-roman-greek.BBVDIX6e.woff2 +0 -0
  106. package/docs/.vitepress/dist/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 +0 -0
  107. package/docs/.vitepress/dist/assets/inter-roman-latin.Di8DUHzh.woff2 +0 -0
  108. package/docs/.vitepress/dist/assets/inter-roman-vietnamese.BjW4sHH5.woff2 +0 -0
  109. package/docs/.vitepress/dist/assets/shadcn.md.C3idOo2N.js +57 -0
  110. package/docs/.vitepress/dist/assets/shadcn.md.C3idOo2N.lean.js +1 -0
  111. package/docs/.vitepress/dist/assets/style.BtrGaL3i.css +1 -0
  112. package/docs/.vitepress/dist/assets/styling.md.B2C6kVFa.js +91 -0
  113. package/docs/.vitepress/dist/assets/styling.md.B2C6kVFa.lean.js +1 -0
  114. package/docs/.vitepress/dist/hashmap.json +1 -0
  115. package/docs/.vitepress/dist/index.html +161 -0
  116. package/docs/.vitepress/dist/shadcn.html +81 -0
  117. package/docs/.vitepress/dist/styling.html +115 -0
  118. package/docs/.vitepress/dist/vp-icons.css +1 -0
  119. package/docs/api.md +343 -0
  120. package/docs/architecture.md +67 -0
  121. package/docs/index.md +244 -0
  122. package/docs/shadcn.md +118 -0
  123. package/docs/styling.md +247 -0
  124. package/package.json +105 -0
  125. package/src/styles.css +676 -0
@@ -0,0 +1,21 @@
1
+ import { createTRPCProxyClient, httpBatchLink } from "@trpc/client";
2
+ export const createMdKitTrpcAdapter = ({ client, }) => ({
3
+ listDocumentVersions: async (documentId) => {
4
+ const body = await client.listDocumentVersions.query({ documentId });
5
+ return body.versions;
6
+ },
7
+ readDocument: (documentId) => client.readDocument.query({ documentId }),
8
+ readDocumentVersion: (input) => client.readDocumentVersion.query(input),
9
+ resyncDocument: (documentId) => client.resyncDocument.mutate({ documentId }),
10
+ writeDocument: (input) => client.writeDocument.mutate(input),
11
+ });
12
+ export const createMdKitTrpcClient = ({ url, }) => createTRPCProxyClient({
13
+ links: [
14
+ httpBatchLink({
15
+ url,
16
+ }),
17
+ ],
18
+ });
19
+ export const createMdKitTrpcClientAdapter = ({ url, }) => createMdKitTrpcAdapter({
20
+ client: createMdKitTrpcClient({ url }),
21
+ });
@@ -0,0 +1,72 @@
1
+ import type { MdKitTransportStore } from "./store";
2
+ export declare const createMdKitTrpcRouter: (store: MdKitTransportStore) => import("@trpc/server").TRPCBuiltRouter<{
3
+ ctx: object;
4
+ meta: object;
5
+ errorShape: import("@trpc/server").TRPCDefaultErrorShape;
6
+ transformer: false;
7
+ }, import("@trpc/server").TRPCDecorateCreateRouterOptions<{
8
+ listDocumentVersions: import("@trpc/server").TRPCQueryProcedure<{
9
+ input: {
10
+ documentId: string;
11
+ };
12
+ output: {
13
+ versions: import("..").MdKitDocumentVersionSummary[];
14
+ };
15
+ meta: object;
16
+ }>;
17
+ readDocument: import("@trpc/server").TRPCQueryProcedure<{
18
+ input: {
19
+ documentId: string;
20
+ };
21
+ output: import("..").MdKitDocumentSnapshot;
22
+ meta: object;
23
+ }>;
24
+ readDocumentVersion: import("@trpc/server").TRPCQueryProcedure<{
25
+ input: {
26
+ documentId: string;
27
+ versionId: string;
28
+ };
29
+ output: import("..").MdKitDocumentVersionDetail | null;
30
+ meta: object;
31
+ }>;
32
+ resyncDocument: import("@trpc/server").TRPCMutationProcedure<{
33
+ input: {
34
+ documentId: string;
35
+ };
36
+ output: import("..").MdKitDocumentSnapshot;
37
+ meta: object;
38
+ }>;
39
+ restoreDocumentVersion: import("@trpc/server").TRPCMutationProcedure<{
40
+ input: {
41
+ documentId: string;
42
+ versionId: string;
43
+ };
44
+ output: {
45
+ version: import("..").MdKitDocumentVersionToken;
46
+ updatedAt?: string | null;
47
+ } | {
48
+ conflict: true;
49
+ version?: import("..").MdKitDocumentVersionToken;
50
+ updatedAt?: string | null;
51
+ };
52
+ meta: object;
53
+ }>;
54
+ writeDocument: import("@trpc/server").TRPCMutationProcedure<{
55
+ input: {
56
+ baseVersion: string | number | null;
57
+ content: string;
58
+ documentId: string;
59
+ force?: boolean | undefined;
60
+ };
61
+ output: {
62
+ version: import("..").MdKitDocumentVersionToken;
63
+ updatedAt?: string | null;
64
+ } | {
65
+ conflict: true;
66
+ version?: import("..").MdKitDocumentVersionToken;
67
+ updatedAt?: string | null;
68
+ };
69
+ meta: object;
70
+ }>;
71
+ }>>;
72
+ export type MdKitTrpcRouter = ReturnType<typeof createMdKitTrpcRouter>;
@@ -0,0 +1,45 @@
1
+ import { initTRPC } from "@trpc/server";
2
+ import { z } from "zod";
3
+ const t = initTRPC.create();
4
+ const documentInput = z.object({
5
+ documentId: z.string(),
6
+ });
7
+ const versionInput = z.object({
8
+ documentId: z.string(),
9
+ versionId: z.string(),
10
+ });
11
+ const versionToken = z.union([z.string(), z.number()]).nullable();
12
+ const writeInput = z.object({
13
+ baseVersion: versionToken,
14
+ content: z.string(),
15
+ documentId: z.string(),
16
+ force: z.boolean().optional(),
17
+ });
18
+ export const createMdKitTrpcRouter = (store) => t.router({
19
+ listDocumentVersions: t.procedure
20
+ .input(documentInput)
21
+ .query(async ({ input }) => ({
22
+ versions: await (store.listDocumentVersions?.(input.documentId) ?? []),
23
+ })),
24
+ readDocument: t.procedure
25
+ .input(documentInput)
26
+ .query(({ input }) => store.readDocument(input.documentId)),
27
+ readDocumentVersion: t.procedure.input(versionInput).query(({ input }) => store.readDocumentVersion?.({
28
+ documentId: input.documentId,
29
+ versionId: input.versionId,
30
+ }) ?? null),
31
+ resyncDocument: t.procedure
32
+ .input(documentInput)
33
+ .mutation(({ input }) => (store.resyncDocument ?? store.readDocument)(input.documentId)),
34
+ restoreDocumentVersion: t.procedure
35
+ .input(versionInput)
36
+ .mutation(({ input }) => {
37
+ if (!store.restoreDocumentVersion) {
38
+ throw new Error("Version restore is not supported");
39
+ }
40
+ return store.restoreDocumentVersion(input);
41
+ }),
42
+ writeDocument: t.procedure
43
+ .input(writeInput)
44
+ .mutation(({ input }) => store.writeDocument(input)),
45
+ });
@@ -0,0 +1,3 @@
1
+ export { createMdKitTrpcAdapter, createMdKitTrpcClient, createMdKitTrpcClientAdapter, } from "../transport/trpcClient";
2
+ export type { CreateMdKitTrpcAdapterOptions, CreateMdKitTrpcClientAdapterOptions, } from "../transport/trpcClient";
3
+ export type { MdKitTrpcRouter } from "../transport/trpcServer";
@@ -0,0 +1 @@
1
+ export { createMdKitTrpcAdapter, createMdKitTrpcClient, createMdKitTrpcClientAdapter, } from "../transport/trpcClient";
@@ -0,0 +1,3 @@
1
+ export { createMdKitTrpcRouter } from "../transport/trpcServer";
2
+ export type { MdKitTrpcRouter } from "../transport/trpcServer";
3
+ export type { MdKitRestoreDocumentVersionInput, MdKitTransportStore, } from "../transport/store";
@@ -0,0 +1 @@
1
+ export { createMdKitTrpcRouter } from "../transport/trpcServer";
package/dist/trpc.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ export { createMdKitTrpcAdapter, createMdKitTrpcClient, createMdKitTrpcClientAdapter, } from "./transport/trpcClient";
2
+ export type { CreateMdKitTrpcAdapterOptions, CreateMdKitTrpcClientAdapterOptions, } from "./transport/trpcClient";
3
+ export type { MdKitTrpcRouter } from "./transport/trpcServer";
package/dist/trpc.js ADDED
@@ -0,0 +1 @@
1
+ export { createMdKitTrpcAdapter, createMdKitTrpcClient, createMdKitTrpcClientAdapter, } from "./transport/trpcClient";
@@ -0,0 +1 @@
1
+ export declare const joinClassNames: (...values: Array<string | false | null | undefined>) => string;
@@ -0,0 +1 @@
1
+ export const joinClassNames = (...values) => values.filter(Boolean).join(" ");
@@ -0,0 +1,9 @@
1
+ import type { MdKitDocumentVersionDetail } from "../document/documentTypes";
2
+ import type { MdKitDocumentVersionsController } from "./useMdKitDocumentVersions";
3
+ export type VersionHistoryPanelProps = {
4
+ className?: string;
5
+ controller: MdKitDocumentVersionsController;
6
+ onRestoreVersion?: (version: MdKitDocumentVersionDetail) => Promise<void> | void;
7
+ title?: string;
8
+ };
9
+ export declare const VersionHistoryPanel: ({ className, controller, onRestoreVersion, title, }: VersionHistoryPanelProps) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,29 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useState } from "react";
3
+ import { joinClassNames } from "../ui/joinClassNames";
4
+ const getVersionLabel = (version) => {
5
+ if (version.label) {
6
+ return version.label;
7
+ }
8
+ if (version.version != null) {
9
+ return `Version ${String(version.version)}`;
10
+ }
11
+ return version.id.slice(0, 8);
12
+ };
13
+ export const VersionHistoryPanel = ({ className, controller, onRestoreVersion, title = "Version history", }) => {
14
+ const [isRestoring, setIsRestoring] = useState(false);
15
+ const restoreSelectedVersion = async () => {
16
+ if (!controller.selectedVersion || !onRestoreVersion) {
17
+ return;
18
+ }
19
+ setIsRestoring(true);
20
+ try {
21
+ await onRestoreVersion(controller.selectedVersion);
22
+ }
23
+ finally {
24
+ setIsRestoring(false);
25
+ }
26
+ };
27
+ return (_jsxs("aside", { className: joinClassNames("mdkit-version-history-panel", className), children: [_jsx("div", { className: "mdkit-version-history-header", children: _jsxs("div", { children: [_jsx("h2", { className: "mdkit-version-history-title", children: title }), _jsx("p", { className: "mdkit-version-history-subtitle", children: "Browse saved revisions and restore one when you need it." })] }) }), !controller.hasVersioning ? (_jsx("div", { className: "mdkit-version-history-empty", children: "This adapter does not expose version history." })) : null, controller.error ? (_jsx("div", { className: "mdkit-version-history-error", children: controller.error })) : null, controller.hasVersioning ? (_jsxs("div", { className: "mdkit-version-history-layout", children: [_jsx("div", { className: "mdkit-version-history-list", role: "list", children: controller.versions.length === 0 ? (_jsx("div", { className: "mdkit-version-history-empty", children: "No revisions have been recorded for this document yet." })) : (controller.versions.map((version) => (_jsxs("button", { type: "button", className: joinClassNames("mdkit-version-history-item", controller.selectedVersionId === version.id &&
28
+ "mdkit-version-history-item-active"), onClick: () => void controller.openVersion(version.id), children: [_jsx("span", { className: "mdkit-version-history-item-title", children: getVersionLabel(version) }), _jsx("span", { className: "mdkit-version-history-item-meta", children: new Date(version.createdAt).toLocaleString() })] }, version.id)))) }), _jsx("div", { className: "mdkit-version-history-preview", children: controller.selectedVersion ? (_jsxs(_Fragment, { children: [_jsxs("div", { className: "mdkit-version-history-preview-header", children: [_jsxs("div", { children: [_jsx("h3", { className: "mdkit-version-history-preview-title", children: getVersionLabel(controller.selectedVersion) }), _jsx("p", { className: "mdkit-version-history-item-meta", children: new Date(controller.selectedVersion.createdAt).toLocaleString() })] }), onRestoreVersion ? (_jsx("button", { type: "button", className: "mdkit-panel-primary-action", disabled: isRestoring, onClick: () => void restoreSelectedVersion(), children: isRestoring ? "Restoring..." : "Restore" })) : null] }), _jsx("pre", { className: "mdkit-version-history-code", children: controller.selectedVersion.content })] })) : (_jsx("div", { className: "mdkit-version-history-empty", children: "Select a saved revision to preview it here." })) })] })) : null, controller.isLoading ? (_jsx("div", { className: "mdkit-version-history-meta", children: "Loading version data..." })) : null] }));
29
+ };
@@ -0,0 +1,16 @@
1
+ import type { MdKitDocumentAdapter, MdKitDocumentVersionDetail, MdKitDocumentVersionSummary } from "../document/documentTypes";
2
+ export type UseMdKitDocumentVersionsOptions = {
3
+ adapter: Pick<MdKitDocumentAdapter, "listDocumentVersions" | "readDocumentVersion">;
4
+ documentId: string | null;
5
+ };
6
+ export type MdKitDocumentVersionsController = {
7
+ error: string | null;
8
+ hasVersioning: boolean;
9
+ isLoading: boolean;
10
+ openVersion: (versionId: string) => Promise<void>;
11
+ refresh: () => Promise<void>;
12
+ selectedVersion: MdKitDocumentVersionDetail | null;
13
+ selectedVersionId: string | null;
14
+ versions: MdKitDocumentVersionSummary[];
15
+ };
16
+ export declare const useMdKitDocumentVersions: (options: UseMdKitDocumentVersionsOptions) => MdKitDocumentVersionsController;
@@ -0,0 +1,88 @@
1
+ import { useCallback, useEffect, useMemo, useState } from "react";
2
+ export const useMdKitDocumentVersions = (options) => {
3
+ const { adapter, documentId } = options;
4
+ const [versions, setVersions] = useState([]);
5
+ const [selectedVersionId, setSelectedVersionId] = useState(null);
6
+ const [selectedVersion, setSelectedVersion] = useState(null);
7
+ const [isLoading, setIsLoading] = useState(false);
8
+ const [error, setError] = useState(null);
9
+ const hasVersioning = !!adapter.listDocumentVersions && !!adapter.readDocumentVersion;
10
+ const refresh = useCallback(async () => {
11
+ if (!documentId || !adapter.listDocumentVersions) {
12
+ setVersions([]);
13
+ setSelectedVersionId(null);
14
+ setSelectedVersion(null);
15
+ setError(null);
16
+ return;
17
+ }
18
+ setIsLoading(true);
19
+ setError(null);
20
+ try {
21
+ const nextVersions = await adapter.listDocumentVersions(documentId);
22
+ setVersions(nextVersions);
23
+ setSelectedVersionId((currentSelectedVersionId) => {
24
+ if (!nextVersions.some((version) => version.id === currentSelectedVersionId)) {
25
+ setSelectedVersion(null);
26
+ return null;
27
+ }
28
+ return currentSelectedVersionId;
29
+ });
30
+ }
31
+ catch (err) {
32
+ setError(`Failed to load versions: ${String(err)}`);
33
+ }
34
+ finally {
35
+ setIsLoading(false);
36
+ }
37
+ }, [adapter, documentId]);
38
+ const openVersion = useCallback(async (versionId) => {
39
+ if (!documentId || !adapter.readDocumentVersion) {
40
+ return;
41
+ }
42
+ setSelectedVersionId(versionId);
43
+ setIsLoading(true);
44
+ setError(null);
45
+ try {
46
+ const nextVersion = await adapter.readDocumentVersion({
47
+ documentId,
48
+ versionId,
49
+ });
50
+ if (!nextVersion) {
51
+ setSelectedVersion(null);
52
+ setError("That version is no longer available.");
53
+ return;
54
+ }
55
+ setSelectedVersion(nextVersion);
56
+ }
57
+ catch (err) {
58
+ setError(`Failed to load version: ${String(err)}`);
59
+ }
60
+ finally {
61
+ setIsLoading(false);
62
+ }
63
+ }, [adapter, documentId]);
64
+ useEffect(() => {
65
+ setSelectedVersionId(null);
66
+ setSelectedVersion(null);
67
+ void refresh();
68
+ }, [documentId, refresh]);
69
+ return useMemo(() => ({
70
+ error,
71
+ hasVersioning,
72
+ isLoading,
73
+ openVersion,
74
+ refresh,
75
+ selectedVersion,
76
+ selectedVersionId,
77
+ versions,
78
+ }), [
79
+ error,
80
+ hasVersioning,
81
+ isLoading,
82
+ openVersion,
83
+ refresh,
84
+ selectedVersion,
85
+ selectedVersionId,
86
+ versions,
87
+ ]);
88
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,41 @@
1
+ import { act, renderHook, waitFor } from "@testing-library/react";
2
+ import { describe, expect, it, vi } from "vitest";
3
+ import { useMdKitDocumentVersions } from "./useMdKitDocumentVersions";
4
+ describe("useMdKitDocumentVersions", () => {
5
+ it("keeps the selected version preview open after loading it", async () => {
6
+ const adapter = {
7
+ listDocumentVersions: vi.fn(async () => [
8
+ {
9
+ createdAt: "2026-01-01T00:00:00.000Z",
10
+ id: "1",
11
+ label: "Version 1",
12
+ version: 1,
13
+ },
14
+ ]),
15
+ readDocumentVersion: vi.fn(async () => ({
16
+ content: "Version one content",
17
+ createdAt: "2026-01-01T00:00:00.000Z",
18
+ id: "1",
19
+ label: "Version 1",
20
+ updatedAt: "2026-01-01T00:00:00.000Z",
21
+ version: 1,
22
+ })),
23
+ };
24
+ const { result } = renderHook(() => useMdKitDocumentVersions({
25
+ adapter,
26
+ documentId: "docs/example.md",
27
+ }));
28
+ await waitFor(() => {
29
+ expect(result.current.versions).toHaveLength(1);
30
+ });
31
+ await act(async () => {
32
+ await result.current.openVersion("1");
33
+ });
34
+ await waitFor(() => {
35
+ expect(result.current.selectedVersionId).toBe("1");
36
+ expect(result.current.selectedVersion?.content).toBe("Version one content");
37
+ expect(result.current.isLoading).toBe(false);
38
+ });
39
+ expect(adapter.listDocumentVersions).toHaveBeenCalledTimes(1);
40
+ });
41
+ });
@@ -0,0 +1,34 @@
1
+ import { defineConfig } from "vitepress";
2
+
3
+ export default defineConfig({
4
+ title: "Markdown Editor Kit",
5
+ description: "Docs for the mdkit markdown editor package",
6
+ cleanUrls: true,
7
+ themeConfig: {
8
+ nav: [
9
+ { text: "Quick Start", link: "/" },
10
+ { text: "Styling", link: "/styling" },
11
+ { text: "Shadcn", link: "/shadcn" },
12
+ { text: "API", link: "/api" },
13
+ { text: "Architecture", link: "/architecture" },
14
+ ],
15
+ sidebar: [
16
+ {
17
+ text: "Guide",
18
+ items: [
19
+ { text: "Quick Start", link: "/" },
20
+ { text: "Styling", link: "/styling" },
21
+ { text: "Shadcn Plugin", link: "/shadcn" },
22
+ { text: "API Reference", link: "/api" },
23
+ { text: "Architecture", link: "/architecture" },
24
+ ],
25
+ },
26
+ ],
27
+ socialLinks: [
28
+ {
29
+ icon: "github",
30
+ link: "https://github.com/mp-lb/mdkit",
31
+ },
32
+ ],
33
+ },
34
+ });
@@ -0,0 +1,22 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en-US" dir="ltr">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width,initial-scale=1">
6
+ <title>404 | Markdown Editor Kit</title>
7
+ <meta name="description" content="Not Found">
8
+ <meta name="generator" content="VitePress v1.6.4">
9
+ <link rel="preload stylesheet" href="/assets/style.BtrGaL3i.css" as="style">
10
+ <link rel="preload stylesheet" href="/vp-icons.css" as="style">
11
+
12
+ <script type="module" src="/assets/app.BQvrHyG0.js"></script>
13
+ <link rel="preload" href="/assets/inter-roman-latin.Di8DUHzh.woff2" as="font" type="font/woff2" crossorigin="">
14
+ <script id="check-dark-mode">(()=>{const e=localStorage.getItem("vitepress-theme-appearance")||"auto",a=window.matchMedia("(prefers-color-scheme: dark)").matches;(!e||e==="auto"?a:e==="dark")&&document.documentElement.classList.add("dark")})();</script>
15
+ <script id="check-mac-os">document.documentElement.classList.toggle("mac",/Mac|iPhone|iPod|iPad/i.test(navigator.platform));</script>
16
+ </head>
17
+ <body>
18
+ <div id="app"></div>
19
+ <script>window.__VP_HASH_MAP__=JSON.parse("{\"api.md\":\"asncK3PQ\",\"architecture.md\":\"BHQLarmZ\",\"index.md\":\"CITl-897\",\"shadcn.md\":\"C3idOo2N\",\"styling.md\":\"B2C6kVFa\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"en-US\",\"dir\":\"ltr\",\"title\":\"Markdown Editor Kit\",\"description\":\"Docs for the mdkit markdown editor package\",\"base\":\"/\",\"head\":[],\"router\":{\"prefetchLinks\":true},\"appearance\":true,\"themeConfig\":{\"nav\":[{\"text\":\"Quick Start\",\"link\":\"/\"},{\"text\":\"Styling\",\"link\":\"/styling\"},{\"text\":\"Shadcn\",\"link\":\"/shadcn\"},{\"text\":\"API\",\"link\":\"/api\"},{\"text\":\"Architecture\",\"link\":\"/architecture\"}],\"sidebar\":[{\"text\":\"Guide\",\"items\":[{\"text\":\"Quick Start\",\"link\":\"/\"},{\"text\":\"Styling\",\"link\":\"/styling\"},{\"text\":\"Shadcn Plugin\",\"link\":\"/shadcn\"},{\"text\":\"API Reference\",\"link\":\"/api\"},{\"text\":\"Architecture\",\"link\":\"/architecture\"}]}],\"socialLinks\":[{\"icon\":\"github\",\"link\":\"https://github.com/mp-lb/mdkit\"}]},\"locales\":{},\"scrollOffset\":134,\"cleanUrls\":true}");</script>
20
+
21
+ </body>
22
+ </html>