@dxos/plugin-markdown 0.6.13-main.548ca8d → 0.6.13-staging.1e988a3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/browser/DocumentCard-2P4EICBA.mjs +11 -0
- package/dist/lib/browser/DocumentEditor-GPWV3VN3.mjs +11 -0
- package/dist/lib/browser/MarkdownEditor-EKJJQEFL.mjs +10 -0
- package/dist/lib/browser/MarkdownEditor-EKJJQEFL.mjs.map +7 -0
- package/dist/lib/browser/chunk-354DCID5.mjs +117 -0
- package/dist/lib/browser/chunk-354DCID5.mjs.map +7 -0
- package/dist/lib/browser/chunk-4GGD6YJO.mjs +19 -0
- package/dist/lib/browser/chunk-4GGD6YJO.mjs.map +7 -0
- package/dist/lib/browser/chunk-7AF2JLK4.mjs +164 -0
- package/dist/lib/browser/chunk-7AF2JLK4.mjs.map +7 -0
- package/dist/lib/browser/{chunk-US5O2P3R.mjs → chunk-CQJL4G4X.mjs} +2 -4
- package/dist/lib/browser/chunk-CQJL4G4X.mjs.map +7 -0
- package/dist/lib/browser/chunk-RL7QY322.mjs +86 -0
- package/dist/lib/browser/chunk-RL7QY322.mjs.map +7 -0
- package/dist/lib/browser/chunk-VUN4QKTT.mjs +208 -0
- package/dist/lib/browser/chunk-VUN4QKTT.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +117 -77
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/meta.mjs +1 -1
- package/dist/lib/browser/types/index.mjs +4 -6
- package/dist/lib/node/{chunk-P7YU53RP.cjs → DocumentCard-EHJDDSRY.cjs} +10 -16
- package/dist/lib/node/DocumentCard-EHJDDSRY.cjs.map +7 -0
- package/dist/lib/node/DocumentEditor-I5GCRBKU.cjs +29 -0
- package/dist/lib/node/DocumentEditor-I5GCRBKU.cjs.map +7 -0
- package/dist/lib/node/MarkdownEditor-UE23H75V.cjs +31 -0
- package/dist/lib/node/MarkdownEditor-UE23H75V.cjs.map +7 -0
- package/dist/lib/node/chunk-7XIBNEI7.cjs +238 -0
- package/dist/lib/node/chunk-7XIBNEI7.cjs.map +7 -0
- package/dist/lib/node/chunk-KTYIOXL5.cjs +149 -0
- package/dist/lib/node/chunk-KTYIOXL5.cjs.map +7 -0
- package/dist/lib/node/chunk-Q4ZSCBQE.cjs +114 -0
- package/dist/lib/node/chunk-Q4ZSCBQE.cjs.map +7 -0
- package/dist/lib/node/chunk-RVGN72IX.cjs +189 -0
- package/dist/lib/node/chunk-RVGN72IX.cjs.map +7 -0
- package/dist/lib/node/chunk-TGMR2CKU.cjs +52 -0
- package/dist/lib/node/chunk-TGMR2CKU.cjs.map +7 -0
- package/dist/lib/node/{chunk-UJMOZCIA.cjs → chunk-VWQH4WC2.cjs} +8 -11
- package/dist/lib/node/chunk-VWQH4WC2.cjs.map +7 -0
- package/dist/lib/node/index.cjs +147 -111
- package/dist/lib/node/index.cjs.map +4 -4
- package/dist/lib/node/meta.cjs +3 -3
- package/dist/lib/node/meta.cjs.map +1 -1
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/types/index.cjs +6 -8
- package/dist/lib/node/types/index.cjs.map +2 -2
- package/dist/types/src/MarkdownPlugin.d.ts.map +1 -1
- package/dist/types/src/components/DocumentCard.d.ts +16 -0
- package/dist/types/src/components/DocumentCard.d.ts.map +1 -0
- package/dist/types/src/components/DocumentEditor.d.ts +14 -0
- package/dist/types/src/components/DocumentEditor.d.ts.map +1 -0
- package/dist/types/src/components/HeadingMenu.d.ts +13 -0
- package/dist/types/src/components/HeadingMenu.d.ts.map +1 -0
- package/dist/types/src/components/Layout.d.ts +6 -0
- package/dist/types/src/components/Layout.d.ts.map +1 -0
- package/dist/types/src/components/MarkdownEditor.d.ts +3 -8
- package/dist/types/src/components/MarkdownEditor.d.ts.map +1 -1
- package/dist/types/src/components/MarkdownEditor.stories.d.ts +3 -3
- package/dist/types/src/components/MarkdownEditor.stories.d.ts.map +1 -1
- package/dist/types/src/components/index.d.ts +11 -2
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/extensions.d.ts +15 -11
- package/dist/types/src/extensions.d.ts.map +1 -1
- package/dist/types/src/meta.d.ts +9 -4
- package/dist/types/src/meta.d.ts.map +1 -1
- package/dist/types/src/types/document.d.ts +1 -10
- package/dist/types/src/types/document.d.ts.map +1 -1
- package/dist/types/src/types/types.d.ts +9 -8
- package/dist/types/src/types/types.d.ts.map +1 -1
- package/package.json +36 -41
- package/src/MarkdownPlugin.tsx +97 -49
- package/src/components/DocumentCard.tsx +107 -0
- package/src/components/DocumentEditor.tsx +137 -0
- package/src/components/HeadingMenu.tsx +46 -0
- package/src/components/Layout.tsx +27 -0
- package/src/components/MarkdownEditor.stories.tsx +5 -11
- package/src/components/MarkdownEditor.tsx +75 -40
- package/src/components/index.ts +14 -2
- package/src/extensions.tsx +67 -124
- package/src/meta.tsx +19 -0
- package/src/types/document.ts +0 -12
- package/src/types/types.ts +7 -10
- package/dist/lib/browser/MarkdownContainer-52FJDCTV.mjs +0 -467
- package/dist/lib/browser/MarkdownContainer-52FJDCTV.mjs.map +0 -7
- package/dist/lib/browser/chunk-4MPY6KRJ.mjs +0 -50
- package/dist/lib/browser/chunk-4MPY6KRJ.mjs.map +0 -7
- package/dist/lib/browser/chunk-DRJ3FPYF.mjs +0 -15
- package/dist/lib/browser/chunk-DRJ3FPYF.mjs.map +0 -7
- package/dist/lib/browser/chunk-US5O2P3R.mjs.map +0 -7
- package/dist/lib/node/MarkdownContainer-5XPB5VP5.cjs +0 -482
- package/dist/lib/node/MarkdownContainer-5XPB5VP5.cjs.map +0 -7
- package/dist/lib/node/chunk-MOF6UCLA.cjs +0 -72
- package/dist/lib/node/chunk-MOF6UCLA.cjs.map +0 -7
- package/dist/lib/node/chunk-P7YU53RP.cjs.map +0 -7
- package/dist/lib/node/chunk-UJMOZCIA.cjs.map +0 -7
- package/dist/lib/node-esm/MarkdownContainer-ILCO3PDV.mjs +0 -468
- package/dist/lib/node-esm/MarkdownContainer-ILCO3PDV.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-CD634NG3.mjs +0 -51
- package/dist/lib/node-esm/chunk-CD634NG3.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-MIDCCMIX.mjs +0 -42
- package/dist/lib/node-esm/chunk-MIDCCMIX.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-NEVN5WR6.mjs +0 -17
- package/dist/lib/node-esm/chunk-NEVN5WR6.mjs.map +0 -7
- package/dist/lib/node-esm/index.mjs +0 -493
- package/dist/lib/node-esm/index.mjs.map +0 -7
- package/dist/lib/node-esm/meta.json +0 -1
- package/dist/lib/node-esm/meta.mjs +0 -10
- package/dist/lib/node-esm/types/index.mjs +0 -15
- package/dist/types/src/components/MarkdownContainer.d.ts +0 -15
- package/dist/types/src/components/MarkdownContainer.d.ts.map +0 -1
- package/dist/types/src/hooks/index.d.ts +0 -2
- package/dist/types/src/hooks/index.d.ts.map +0 -1
- package/dist/types/src/hooks/useSelectCurrentThread.d.ts +0 -6
- package/dist/types/src/hooks/useSelectCurrentThread.d.ts.map +0 -1
- package/src/components/MarkdownContainer.tsx +0 -108
- package/src/hooks/index.ts +0 -5
- package/src/hooks/useSelectCurrentThread.tsx +0 -46
- package/src/meta.ts +0 -15
- /package/dist/lib/{node-esm/meta.mjs.map → browser/DocumentCard-2P4EICBA.mjs.map} +0 -0
- /package/dist/lib/{node-esm/types/index.mjs.map → browser/DocumentEditor-GPWV3VN3.mjs.map} +0 -0
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import {
|
|
2
|
+
MARKDOWN_PLUGIN
|
|
3
|
+
} from "./chunk-4GGD6YJO.mjs";
|
|
4
|
+
|
|
5
|
+
// packages/plugins/plugin-markdown/src/components/MarkdownEditor.tsx
|
|
6
|
+
import { openSearchPanel } from "@codemirror/search";
|
|
7
|
+
import { EditorView } from "@codemirror/view";
|
|
8
|
+
import React, { useMemo, useEffect, useCallback } from "react";
|
|
9
|
+
import { LayoutAction, useResolvePlugin, useIntentResolver, parseLayoutPlugin, useIntentDispatcher } from "@dxos/app-framework";
|
|
10
|
+
import { parseAttentionPlugin } from "@dxos/plugin-attention";
|
|
11
|
+
import { useThemeContext, useTranslation } from "@dxos/react-ui";
|
|
12
|
+
import { Toolbar, createBasicExtensions, createMarkdownExtensions, createThemeExtensions, dropFile, processAction, useActionHandler, useCommentState, useCommentClickListener, useFormattingState, useTextEditor, editorContent, editorGutter, Cursor, setSelection } from "@dxos/react-ui-editor";
|
|
13
|
+
import { sectionToolbarLayout } from "@dxos/react-ui-stack";
|
|
14
|
+
import { textBlockWidth, focusRing, mx } from "@dxos/react-ui-theme";
|
|
15
|
+
import { nonNullable } from "@dxos/util";
|
|
16
|
+
var attentionFragment = mx("group-focus-within/editor:attention-surface group-[[aria-current]]/editor:attention-surface", "group-focus-within/editor:border-separator");
|
|
17
|
+
var DEFAULT_VIEW_MODE = "preview";
|
|
18
|
+
var MarkdownEditor = ({ id, role = "article", initialValue, extensions, extensionProviders, scrollPastEnd, scrollTo, selection, toolbar, viewMode, onFileUpload, onViewModeChange }) => {
|
|
19
|
+
const { t } = useTranslation(MARKDOWN_PLUGIN);
|
|
20
|
+
const { themeMode } = useThemeContext();
|
|
21
|
+
const dispatch = useIntentDispatcher();
|
|
22
|
+
const attentionPlugin = useResolvePlugin(parseAttentionPlugin);
|
|
23
|
+
const layoutPlugin = useResolvePlugin(parseLayoutPlugin);
|
|
24
|
+
const attended = Array.from(attentionPlugin?.provides.attention?.attended ?? []);
|
|
25
|
+
const isDirectlyAttended = attended.length === 1 && attended[0] === id;
|
|
26
|
+
const [formattingState, formattingObserver] = useFormattingState();
|
|
27
|
+
const providerExtensions = useMemo(() => extensionProviders?.map((provider) => provider({})), [
|
|
28
|
+
extensionProviders
|
|
29
|
+
]);
|
|
30
|
+
const [commentsState, commentObserver] = useCommentState();
|
|
31
|
+
const onCommentClick = useCallback(() => {
|
|
32
|
+
void dispatch({
|
|
33
|
+
action: LayoutAction.SET_LAYOUT,
|
|
34
|
+
data: {
|
|
35
|
+
element: "complementary",
|
|
36
|
+
state: true
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
}, [
|
|
40
|
+
dispatch
|
|
41
|
+
]);
|
|
42
|
+
const commentClickObserver = useCommentClickListener(onCommentClick);
|
|
43
|
+
useIntentResolver(MARKDOWN_PLUGIN, ({ action, data }) => {
|
|
44
|
+
switch (action) {
|
|
45
|
+
// TODO(burdon): Use fully qualified ids everywhere.
|
|
46
|
+
case LayoutAction.SCROLL_INTO_VIEW: {
|
|
47
|
+
if (editorView && data?.id === id && data?.cursor) {
|
|
48
|
+
const range = Cursor.getRangeFromCursor(editorView.state, data.cursor);
|
|
49
|
+
if (range) {
|
|
50
|
+
const selection2 = editorView.state.selection.main.from !== range.from ? {
|
|
51
|
+
anchor: range.from
|
|
52
|
+
} : void 0;
|
|
53
|
+
const effects = [
|
|
54
|
+
// NOTE: This does not use the DOM scrollIntoView function.
|
|
55
|
+
EditorView.scrollIntoView(range.from, {
|
|
56
|
+
y: "start",
|
|
57
|
+
yMargin: 96
|
|
58
|
+
})
|
|
59
|
+
];
|
|
60
|
+
if (selection2) {
|
|
61
|
+
effects.push(setSelection.of({
|
|
62
|
+
current: id
|
|
63
|
+
}));
|
|
64
|
+
}
|
|
65
|
+
editorView.dispatch({
|
|
66
|
+
effects,
|
|
67
|
+
selection: selection2 ? {
|
|
68
|
+
anchor: range.from
|
|
69
|
+
} : void 0
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
const handleDrop = async (view, { files }) => {
|
|
78
|
+
const file = files[0];
|
|
79
|
+
const info = file && onFileUpload ? await onFileUpload(file) : void 0;
|
|
80
|
+
if (info) {
|
|
81
|
+
processAction(view, {
|
|
82
|
+
type: "image",
|
|
83
|
+
data: info.url
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
const { parentRef, view: editorView, focusAttributes } = useTextEditor(() => ({
|
|
88
|
+
initialValue,
|
|
89
|
+
extensions: [
|
|
90
|
+
formattingObserver,
|
|
91
|
+
commentObserver,
|
|
92
|
+
commentClickObserver,
|
|
93
|
+
createBasicExtensions({
|
|
94
|
+
readonly: viewMode === "readonly",
|
|
95
|
+
placeholder: t("editor placeholder"),
|
|
96
|
+
scrollPastEnd: role === "section" ? false : scrollPastEnd
|
|
97
|
+
}),
|
|
98
|
+
createMarkdownExtensions({
|
|
99
|
+
themeMode
|
|
100
|
+
}),
|
|
101
|
+
createThemeExtensions({
|
|
102
|
+
themeMode,
|
|
103
|
+
syntaxHighlighting: true,
|
|
104
|
+
slots: {
|
|
105
|
+
content: {
|
|
106
|
+
className: editorContent
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}),
|
|
110
|
+
editorGutter,
|
|
111
|
+
role !== "section" && onFileUpload ? dropFile({
|
|
112
|
+
onDrop: handleDrop
|
|
113
|
+
}) : [],
|
|
114
|
+
providerExtensions,
|
|
115
|
+
extensions
|
|
116
|
+
].filter(nonNullable),
|
|
117
|
+
...role !== "section" && {
|
|
118
|
+
id,
|
|
119
|
+
scrollTo,
|
|
120
|
+
selection,
|
|
121
|
+
// TODO(wittjosiah): Autofocus based on layout is racy.
|
|
122
|
+
autoFocus: layoutPlugin?.provides.layout ? layoutPlugin?.provides.layout.scrollIntoView === id : true,
|
|
123
|
+
moveToEndOfLine: true
|
|
124
|
+
}
|
|
125
|
+
}), [
|
|
126
|
+
id,
|
|
127
|
+
initialValue,
|
|
128
|
+
formattingObserver,
|
|
129
|
+
viewMode,
|
|
130
|
+
themeMode,
|
|
131
|
+
extensions,
|
|
132
|
+
providerExtensions
|
|
133
|
+
]);
|
|
134
|
+
useTest(editorView);
|
|
135
|
+
const handleToolbarAction = useActionHandler(editorView);
|
|
136
|
+
const handleAction = (action) => {
|
|
137
|
+
switch (action.type) {
|
|
138
|
+
case "search": {
|
|
139
|
+
if (editorView) {
|
|
140
|
+
openSearchPanel(editorView);
|
|
141
|
+
}
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
case "view-mode": {
|
|
145
|
+
onViewModeChange?.(id, action.data);
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
handleToolbarAction?.(action);
|
|
150
|
+
};
|
|
151
|
+
return /* @__PURE__ */ React.createElement("div", {
|
|
152
|
+
role: "none",
|
|
153
|
+
...role === "section" ? {
|
|
154
|
+
className: "flex flex-col"
|
|
155
|
+
} : {
|
|
156
|
+
className: "contents group/editor",
|
|
157
|
+
...isDirectlyAttended && {
|
|
158
|
+
"aria-current": "location"
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}, toolbar && /* @__PURE__ */ React.createElement("div", {
|
|
162
|
+
role: "none",
|
|
163
|
+
className: mx("flex shrink-0 justify-center overflow-x-auto", attentionFragment)
|
|
164
|
+
}, /* @__PURE__ */ React.createElement(Toolbar.Root, {
|
|
165
|
+
classNames: role === "section" ? [
|
|
166
|
+
textBlockWidth,
|
|
167
|
+
"z-[2] group-focus-within/section:visible",
|
|
168
|
+
!isDirectlyAttended && "invisible",
|
|
169
|
+
sectionToolbarLayout
|
|
170
|
+
] : [
|
|
171
|
+
textBlockWidth,
|
|
172
|
+
"group-focus-within/editor:border-separator group-[[aria-current]]/editor:border-separator"
|
|
173
|
+
],
|
|
174
|
+
state: formattingState && {
|
|
175
|
+
...formattingState,
|
|
176
|
+
...commentsState
|
|
177
|
+
},
|
|
178
|
+
onAction: handleAction
|
|
179
|
+
}, /* @__PURE__ */ React.createElement(Toolbar.Markdown, null), onFileUpload && /* @__PURE__ */ React.createElement(Toolbar.Custom, {
|
|
180
|
+
onUpload: onFileUpload
|
|
181
|
+
}), /* @__PURE__ */ React.createElement(Toolbar.Separator, null), /* @__PURE__ */ React.createElement(Toolbar.View, {
|
|
182
|
+
mode: viewMode ?? DEFAULT_VIEW_MODE
|
|
183
|
+
}), /* @__PURE__ */ React.createElement(Toolbar.Actions, null))), /* @__PURE__ */ React.createElement("div", {
|
|
184
|
+
role: "none",
|
|
185
|
+
ref: parentRef,
|
|
186
|
+
"data-testid": "composer.markdownRoot",
|
|
187
|
+
"data-toolbar": toolbar ? "enabled" : "disabled",
|
|
188
|
+
className: role === "section" ? mx("flex flex-col flex-1 min-bs-[12rem]", focusRing) : mx("flex is-full bs-full overflow-hidden", focusRing, attentionFragment, "focus-visible:ring-inset", "data-[toolbar=disabled]:pbs-2 data-[toolbar=disabled]:row-span-2"),
|
|
189
|
+
...focusAttributes
|
|
190
|
+
}));
|
|
191
|
+
};
|
|
192
|
+
var useTest = (view) => {
|
|
193
|
+
useEffect(() => {
|
|
194
|
+
const composer = window.composer;
|
|
195
|
+
if (composer) {
|
|
196
|
+
composer.editorView = view;
|
|
197
|
+
}
|
|
198
|
+
}, [
|
|
199
|
+
view
|
|
200
|
+
]);
|
|
201
|
+
};
|
|
202
|
+
var MarkdownEditor_default = MarkdownEditor;
|
|
203
|
+
|
|
204
|
+
export {
|
|
205
|
+
MarkdownEditor,
|
|
206
|
+
MarkdownEditor_default
|
|
207
|
+
};
|
|
208
|
+
//# sourceMappingURL=chunk-VUN4QKTT.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/components/MarkdownEditor.tsx"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { openSearchPanel } from '@codemirror/search';\nimport { EditorView } from '@codemirror/view';\nimport React, { useMemo, useEffect, useCallback } from 'react';\n\nimport {\n type FileInfo,\n LayoutAction,\n type LayoutCoordinate,\n useResolvePlugin,\n useIntentResolver,\n parseLayoutPlugin,\n useIntentDispatcher,\n} from '@dxos/app-framework';\nimport { parseAttentionPlugin } from '@dxos/plugin-attention';\nimport { useThemeContext, useTranslation } from '@dxos/react-ui';\nimport {\n type Action,\n type DNDOptions,\n type EditorViewMode,\n type EditorInputMode,\n type UseTextEditorProps,\n Toolbar,\n createBasicExtensions,\n createMarkdownExtensions,\n createThemeExtensions,\n dropFile,\n processAction,\n useActionHandler,\n useCommentState,\n useCommentClickListener,\n useFormattingState,\n useTextEditor,\n editorContent,\n editorGutter,\n Cursor,\n setSelection,\n} from '@dxos/react-ui-editor';\nimport { sectionToolbarLayout } from '@dxos/react-ui-stack';\nimport { textBlockWidth, focusRing, mx } from '@dxos/react-ui-theme';\nimport { nonNullable } from '@dxos/util';\n\nimport { MARKDOWN_PLUGIN } from '../meta';\nimport type { MarkdownPluginState } from '../types';\n\nconst attentionFragment = mx(\n 'group-focus-within/editor:attention-surface group-[[aria-current]]/editor:attention-surface',\n 'group-focus-within/editor:border-separator',\n);\n\nconst DEFAULT_VIEW_MODE: EditorViewMode = 'preview';\n\nexport type MarkdownEditorProps = {\n id: string;\n coordinate?: LayoutCoordinate;\n inputMode?: EditorInputMode;\n role?: string;\n scrollPastEnd?: boolean;\n toolbar?: boolean;\n viewMode?: EditorViewMode;\n onViewModeChange?: (id: string, mode: EditorViewMode) => void;\n onFileUpload?: (file: File) => Promise<FileInfo | undefined>;\n} & Pick<UseTextEditorProps, 'initialValue' | 'scrollTo' | 'selection' | 'extensions'> &\n Partial<Pick<MarkdownPluginState, 'extensionProviders'>>;\n\nexport const MarkdownEditor = ({\n id,\n role = 'article',\n initialValue,\n extensions,\n extensionProviders,\n scrollPastEnd,\n scrollTo,\n selection,\n toolbar,\n viewMode,\n onFileUpload,\n onViewModeChange,\n}: MarkdownEditorProps) => {\n const { t } = useTranslation(MARKDOWN_PLUGIN);\n const { themeMode } = useThemeContext();\n const dispatch = useIntentDispatcher();\n const attentionPlugin = useResolvePlugin(parseAttentionPlugin);\n const layoutPlugin = useResolvePlugin(parseLayoutPlugin);\n const attended = Array.from(attentionPlugin?.provides.attention?.attended ?? []);\n const isDirectlyAttended = attended.length === 1 && attended[0] === id;\n const [formattingState, formattingObserver] = useFormattingState();\n\n // Extensions from other plugins.\n const providerExtensions = useMemo(() => extensionProviders?.map((provider) => provider({})), [extensionProviders]);\n\n // TODO(Zan): Move these into thread plugin as well?\n const [commentsState, commentObserver] = useCommentState();\n const onCommentClick = useCallback(() => {\n void dispatch({ action: LayoutAction.SET_LAYOUT, data: { element: 'complementary', state: true } });\n }, [dispatch]);\n const commentClickObserver = useCommentClickListener(onCommentClick);\n\n // Focus the space that references the comment.\n useIntentResolver(MARKDOWN_PLUGIN, ({ action, data }) => {\n switch (action) {\n // TODO(burdon): Use fully qualified ids everywhere.\n case LayoutAction.SCROLL_INTO_VIEW: {\n if (editorView && data?.id === id && data?.cursor) {\n // TODO(burdon): We need typed intents.\n const range = Cursor.getRangeFromCursor(editorView.state, data.cursor);\n if (range) {\n const selection = editorView.state.selection.main.from !== range.from ? { anchor: range.from } : undefined;\n const effects = [\n // NOTE: This does not use the DOM scrollIntoView function.\n EditorView.scrollIntoView(range.from, { y: 'start', yMargin: 96 }),\n ];\n if (selection) {\n // Update the editor selection to get bi-directional highlighting.\n effects.push(setSelection.of({ current: id }));\n }\n\n editorView.dispatch({\n effects,\n selection: selection ? { anchor: range.from } : undefined,\n });\n }\n }\n break;\n }\n }\n });\n\n // Drag files.\n const handleDrop: DNDOptions['onDrop'] = async (view, { files }) => {\n const file = files[0];\n const info = file && onFileUpload ? await onFileUpload(file) : undefined;\n if (info) {\n processAction(view, { type: 'image', data: info.url });\n }\n };\n\n const {\n parentRef,\n view: editorView,\n focusAttributes,\n } = useTextEditor(\n () => ({\n initialValue,\n extensions: [\n formattingObserver,\n commentObserver,\n commentClickObserver,\n createBasicExtensions({\n readonly: viewMode === 'readonly',\n placeholder: t('editor placeholder'),\n scrollPastEnd: role === 'section' ? false : scrollPastEnd,\n }),\n createMarkdownExtensions({ themeMode }),\n createThemeExtensions({\n themeMode,\n syntaxHighlighting: true,\n slots: { content: { className: editorContent } },\n }),\n editorGutter,\n role !== 'section' && onFileUpload ? dropFile({ onDrop: handleDrop }) : [],\n providerExtensions,\n extensions,\n ].filter(nonNullable),\n ...(role !== 'section' && {\n id,\n scrollTo,\n selection,\n // TODO(wittjosiah): Autofocus based on layout is racy.\n autoFocus: layoutPlugin?.provides.layout ? layoutPlugin?.provides.layout.scrollIntoView === id : true,\n moveToEndOfLine: true,\n }),\n }),\n [id, initialValue, formattingObserver, viewMode, themeMode, extensions, providerExtensions],\n );\n\n useTest(editorView);\n\n // Toolbar handler.\n const handleToolbarAction = useActionHandler(editorView);\n const handleAction = (action: Action) => {\n switch (action.type) {\n case 'search': {\n if (editorView) {\n openSearchPanel(editorView);\n }\n return;\n }\n case 'view-mode': {\n onViewModeChange?.(id, action.data);\n return;\n }\n }\n\n handleToolbarAction?.(action);\n };\n\n return (\n <div\n role='none'\n // TODO(burdon): Move role logic out of here (see sheet, table, sketch, etc.)\n {...(role === 'section'\n ? { className: 'flex flex-col' }\n : {\n className: 'contents group/editor',\n ...(isDirectlyAttended && { 'aria-current': 'location' }),\n })}\n >\n {toolbar && (\n <div role='none' className={mx('flex shrink-0 justify-center overflow-x-auto', attentionFragment)}>\n <Toolbar.Root\n classNames={\n role === 'section'\n ? [\n textBlockWidth,\n 'z-[2] group-focus-within/section:visible',\n !isDirectlyAttended && 'invisible',\n sectionToolbarLayout,\n ]\n : [\n textBlockWidth,\n 'group-focus-within/editor:border-separator group-[[aria-current]]/editor:border-separator',\n ]\n }\n state={formattingState && { ...formattingState, ...commentsState }}\n onAction={handleAction}\n >\n <Toolbar.Markdown />\n {onFileUpload && <Toolbar.Custom onUpload={onFileUpload} />}\n <Toolbar.Separator />\n <Toolbar.View mode={viewMode ?? DEFAULT_VIEW_MODE} />\n <Toolbar.Actions />\n </Toolbar.Root>\n </div>\n )}\n <div\n role='none'\n ref={parentRef}\n data-testid='composer.markdownRoot'\n data-toolbar={toolbar ? 'enabled' : 'disabled'}\n className={\n role === 'section'\n ? mx('flex flex-col flex-1 min-bs-[12rem]', focusRing)\n : mx(\n 'flex is-full bs-full overflow-hidden',\n focusRing,\n attentionFragment,\n 'focus-visible:ring-inset',\n 'data-[toolbar=disabled]:pbs-2 data-[toolbar=disabled]:row-span-2',\n )\n }\n {...focusAttributes}\n />\n </div>\n );\n};\n\n// Expose editor view for playwright tests.\n// TODO(wittjosiah): Find a better way to expose this or find a way to limit it to test runs.\nconst useTest = (view?: EditorView) => {\n useEffect(() => {\n const composer = (window as any).composer;\n if (composer) {\n composer.editorView = view;\n }\n }, [view]);\n};\n\nexport default MarkdownEditor;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["openSearchPanel", "EditorView", "React", "useMemo", "useEffect", "useCallback", "LayoutAction", "useResolvePlugin", "useIntentResolver", "parseLayoutPlugin", "useIntentDispatcher", "parseAttentionPlugin", "useThemeContext", "useTranslation", "Toolbar", "createBasicExtensions", "createMarkdownExtensions", "createThemeExtensions", "dropFile", "processAction", "useActionHandler", "useCommentState", "useCommentClickListener", "useFormattingState", "useTextEditor", "editorContent", "editorGutter", "Cursor", "setSelection", "sectionToolbarLayout", "textBlockWidth", "focusRing", "mx", "nonNullable", "attentionFragment", "mx", "DEFAULT_VIEW_MODE", "MarkdownEditor", "id", "role", "initialValue", "extensions", "extensionProviders", "scrollPastEnd", "scrollTo", "selection", "toolbar", "viewMode", "onFileUpload", "onViewModeChange", "t", "useTranslation", "MARKDOWN_PLUGIN", "themeMode", "useThemeContext", "dispatch", "useIntentDispatcher", "attentionPlugin", "useResolvePlugin", "parseAttentionPlugin", "layoutPlugin", "parseLayoutPlugin", "attended", "Array", "from", "provides", "attention", "isDirectlyAttended", "length", "formattingState", "formattingObserver", "useFormattingState", "providerExtensions", "useMemo", "map", "provider", "commentsState", "commentObserver", "useCommentState", "onCommentClick", "useCallback", "action", "LayoutAction", "SET_LAYOUT", "data", "element", "state", "commentClickObserver", "useCommentClickListener", "useIntentResolver", "SCROLL_INTO_VIEW", "editorView", "cursor", "range", "Cursor", "getRangeFromCursor", "main", "anchor", "undefined", "effects", "EditorView", "scrollIntoView", "y", "yMargin", "push", "setSelection", "of", "current", "handleDrop", "view", "files", "file", "info", "processAction", "type", "url", "parentRef", "focusAttributes", "useTextEditor", "createBasicExtensions", "readonly", "placeholder", "createMarkdownExtensions", "createThemeExtensions", "syntaxHighlighting", "slots", "content", "className", "editorContent", "editorGutter", "dropFile", "onDrop", "filter", "nonNullable", "autoFocus", "layout", "moveToEndOfLine", "useTest", "handleToolbarAction", "useActionHandler", "handleAction", "openSearchPanel", "div", "Toolbar", "Root", "classNames", "textBlockWidth", "sectionToolbarLayout", "onAction", "Markdown", "Custom", "onUpload", "Separator", "View", "mode", "Actions", "ref", "data-testid", "data-toolbar", "focusRing", "useEffect", "composer", "window"]
|
|
7
|
+
}
|
|
@@ -1,104 +1,123 @@
|
|
|
1
|
+
import "./chunk-RL7QY322.mjs";
|
|
1
2
|
import {
|
|
2
3
|
getFallbackName,
|
|
3
4
|
isMarkdownProperties,
|
|
4
5
|
markdownExtensionPlugins,
|
|
5
6
|
serializer,
|
|
6
7
|
setFallbackName
|
|
7
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-7AF2JLK4.mjs";
|
|
8
9
|
import {
|
|
9
10
|
DocumentType,
|
|
10
11
|
MarkdownAction,
|
|
11
|
-
TextType
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
TextType
|
|
13
|
+
} from "./chunk-CQJL4G4X.mjs";
|
|
14
|
+
import "./chunk-354DCID5.mjs";
|
|
15
|
+
import "./chunk-VUN4QKTT.mjs";
|
|
14
16
|
import {
|
|
15
17
|
MARKDOWN_PLUGIN,
|
|
16
18
|
meta_default
|
|
17
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-4GGD6YJO.mjs";
|
|
18
20
|
|
|
19
21
|
// packages/plugins/plugin-markdown/src/MarkdownPlugin.tsx
|
|
20
22
|
import { TextAa } from "@phosphor-icons/react";
|
|
21
|
-
import
|
|
22
|
-
import { parseIntentPlugin, resolvePlugin, LayoutAction, NavigationAction } from "@dxos/app-framework";
|
|
23
|
+
import React5 from "react";
|
|
24
|
+
import { isObject, parseIntentPlugin, resolvePlugin, LayoutAction, NavigationAction } from "@dxos/app-framework";
|
|
23
25
|
import { create } from "@dxos/echo-schema";
|
|
24
26
|
import { LocalStorageStore } from "@dxos/local-storage";
|
|
27
|
+
import { log } from "@dxos/log";
|
|
25
28
|
import { parseClientPlugin } from "@dxos/plugin-client";
|
|
26
29
|
import { createExtension, isActionGroup } from "@dxos/plugin-graph";
|
|
27
30
|
import { SpaceAction } from "@dxos/plugin-space";
|
|
28
31
|
import { CollectionType } from "@dxos/plugin-space/types";
|
|
29
32
|
import { createDocAccessor, fullyQualifiedId, getRangeFromCursor, isSpace, loadObjectReferences } from "@dxos/react-client/echo";
|
|
30
33
|
import { EditorViewModes as EditorViewModes2, translations as editorTranslations } from "@dxos/react-ui-editor";
|
|
34
|
+
import { isTileComponentProps } from "@dxos/react-ui-mosaic";
|
|
31
35
|
|
|
32
36
|
// packages/plugins/plugin-markdown/src/components/index.ts
|
|
37
|
+
import React4 from "react";
|
|
38
|
+
|
|
39
|
+
// packages/plugins/plugin-markdown/src/components/HeadingMenu.tsx
|
|
40
|
+
import { DotsThreeVertical } from "@phosphor-icons/react";
|
|
41
|
+
import React from "react";
|
|
42
|
+
import { Surface } from "@dxos/app-framework";
|
|
43
|
+
import { Button, DropdownMenu } from "@dxos/react-ui";
|
|
44
|
+
import { fineButtonDimensions, getSize } from "@dxos/react-ui-theme";
|
|
45
|
+
|
|
46
|
+
// packages/plugins/plugin-markdown/src/components/Layout.tsx
|
|
33
47
|
import React2 from "react";
|
|
48
|
+
import { Main } from "@dxos/react-ui";
|
|
49
|
+
import { editorWithToolbarLayout } from "@dxos/react-ui-editor";
|
|
50
|
+
import { topbarBlockPaddingStart } from "@dxos/react-ui-theme";
|
|
34
51
|
|
|
35
52
|
// packages/plugins/plugin-markdown/src/components/MarkdownSettings.tsx
|
|
36
|
-
import
|
|
53
|
+
import React3 from "react";
|
|
37
54
|
import { SettingsValue } from "@dxos/plugin-settings";
|
|
38
55
|
import { Input, Select, useTranslation } from "@dxos/react-ui";
|
|
39
56
|
import { EditorInputModes, EditorViewModes } from "@dxos/react-ui-editor";
|
|
40
57
|
var MarkdownSettings = ({ settings }) => {
|
|
41
58
|
const { t } = useTranslation(MARKDOWN_PLUGIN);
|
|
42
|
-
return /* @__PURE__ */
|
|
59
|
+
return /* @__PURE__ */ React3.createElement(React3.Fragment, null, /* @__PURE__ */ React3.createElement(SettingsValue, {
|
|
43
60
|
label: t("default view mode label")
|
|
44
|
-
}, /* @__PURE__ */
|
|
61
|
+
}, /* @__PURE__ */ React3.createElement(Select.Root, {
|
|
45
62
|
value: settings.defaultViewMode,
|
|
46
63
|
onValueChange: (value) => {
|
|
47
64
|
settings.defaultViewMode = value;
|
|
48
65
|
}
|
|
49
|
-
}, /* @__PURE__ */
|
|
66
|
+
}, /* @__PURE__ */ React3.createElement(Select.TriggerButton, null), /* @__PURE__ */ React3.createElement(Select.Portal, null, /* @__PURE__ */ React3.createElement(Select.Content, null, /* @__PURE__ */ React3.createElement(Select.Viewport, null, EditorViewModes.map((mode) => /* @__PURE__ */ React3.createElement(Select.Option, {
|
|
50
67
|
key: mode,
|
|
51
68
|
value: mode
|
|
52
69
|
}, t(`${mode} mode label`, {
|
|
53
70
|
ns: "react-ui-editor"
|
|
54
|
-
})))))))), /* @__PURE__ */
|
|
71
|
+
})))))))), /* @__PURE__ */ React3.createElement(SettingsValue, {
|
|
55
72
|
label: t("editor input mode label")
|
|
56
|
-
}, /* @__PURE__ */
|
|
73
|
+
}, /* @__PURE__ */ React3.createElement(Select.Root, {
|
|
57
74
|
value: settings.editorInputMode ?? "default",
|
|
58
75
|
onValueChange: (value) => {
|
|
59
76
|
settings.editorInputMode = value;
|
|
60
77
|
}
|
|
61
|
-
}, /* @__PURE__ */
|
|
78
|
+
}, /* @__PURE__ */ React3.createElement(Select.TriggerButton, {
|
|
62
79
|
placeholder: t("select editor input mode placeholder")
|
|
63
|
-
}), /* @__PURE__ */
|
|
80
|
+
}), /* @__PURE__ */ React3.createElement(Select.Portal, null, /* @__PURE__ */ React3.createElement(Select.Content, null, /* @__PURE__ */ React3.createElement(Select.Viewport, null, EditorInputModes.map((mode) => /* @__PURE__ */ React3.createElement(Select.Option, {
|
|
64
81
|
key: mode,
|
|
65
82
|
value: mode
|
|
66
|
-
}, t(`settings editor input mode ${mode} label`)))))))), /* @__PURE__ */
|
|
83
|
+
}, t(`settings editor input mode ${mode} label`)))))))), /* @__PURE__ */ React3.createElement(SettingsValue, {
|
|
67
84
|
label: t("settings toolbar label")
|
|
68
|
-
}, /* @__PURE__ */
|
|
85
|
+
}, /* @__PURE__ */ React3.createElement(Input.Switch, {
|
|
69
86
|
checked: settings.toolbar,
|
|
70
87
|
onCheckedChange: (checked) => settings.toolbar = !!checked
|
|
71
|
-
})), /* @__PURE__ */
|
|
88
|
+
})), /* @__PURE__ */ React3.createElement(SettingsValue, {
|
|
72
89
|
label: t("settings numbered headings label")
|
|
73
|
-
}, /* @__PURE__ */
|
|
90
|
+
}, /* @__PURE__ */ React3.createElement(Input.Switch, {
|
|
74
91
|
checked: settings.numberedHeadings,
|
|
75
92
|
onCheckedChange: (checked) => settings.numberedHeadings = !!checked
|
|
76
|
-
})), /* @__PURE__ */
|
|
93
|
+
})), /* @__PURE__ */ React3.createElement(SettingsValue, {
|
|
77
94
|
label: t("settings folding label")
|
|
78
|
-
}, /* @__PURE__ */
|
|
95
|
+
}, /* @__PURE__ */ React3.createElement(Input.Switch, {
|
|
79
96
|
checked: settings.folding,
|
|
80
97
|
onCheckedChange: (checked) => settings.folding = !!checked
|
|
81
|
-
})), /* @__PURE__ */
|
|
98
|
+
})), /* @__PURE__ */ React3.createElement(SettingsValue, {
|
|
82
99
|
label: t("settings experimental label")
|
|
83
|
-
}, /* @__PURE__ */
|
|
100
|
+
}, /* @__PURE__ */ React3.createElement(Input.Switch, {
|
|
84
101
|
checked: settings.experimental,
|
|
85
102
|
onCheckedChange: (checked) => settings.experimental = !!checked
|
|
86
|
-
})), /* @__PURE__ */
|
|
103
|
+
})), /* @__PURE__ */ React3.createElement(SettingsValue, {
|
|
87
104
|
label: t("settings debug label"),
|
|
88
|
-
secondary: settings.debug ? /* @__PURE__ */
|
|
105
|
+
secondary: settings.debug ? /* @__PURE__ */ React3.createElement(Input.Root, null, /* @__PURE__ */ React3.createElement(Input.TextArea, {
|
|
89
106
|
rows: 5,
|
|
90
107
|
value: settings.typewriter,
|
|
91
108
|
onChange: ({ target: { value } }) => settings.typewriter = value,
|
|
92
109
|
placeholder: t("settings debug placeholder")
|
|
93
110
|
})) : void 0
|
|
94
|
-
}, /* @__PURE__ */
|
|
111
|
+
}, /* @__PURE__ */ React3.createElement(Input.Switch, {
|
|
95
112
|
checked: settings.debug,
|
|
96
113
|
onCheckedChange: (checked) => settings.debug = !!checked
|
|
97
114
|
})));
|
|
98
115
|
};
|
|
99
116
|
|
|
100
117
|
// packages/plugins/plugin-markdown/src/components/index.ts
|
|
101
|
-
var
|
|
118
|
+
var DocumentCard = React4.lazy(() => import("./DocumentCard-2P4EICBA.mjs"));
|
|
119
|
+
var DocumentEditor = React4.lazy(() => import("./DocumentEditor-GPWV3VN3.mjs"));
|
|
120
|
+
var MarkdownEditor = React4.lazy(() => import("./MarkdownEditor-EKJJQEFL.mjs"));
|
|
102
121
|
|
|
103
122
|
// packages/plugins/plugin-markdown/src/translations.ts
|
|
104
123
|
var translations_default = [
|
|
@@ -133,7 +152,10 @@ var translations_default = [
|
|
|
133
152
|
];
|
|
134
153
|
|
|
135
154
|
// packages/plugins/plugin-markdown/src/MarkdownPlugin.tsx
|
|
136
|
-
var
|
|
155
|
+
var __dxlog_file = "/home/runner/work/dxos/dxos/packages/plugins/plugin-markdown/src/MarkdownPlugin.tsx";
|
|
156
|
+
var isEditorModel = (data) => {
|
|
157
|
+
return data && typeof data === "object" && "id" in data && typeof data.id === "string" && "text" in data && typeof data.text === "string";
|
|
158
|
+
};
|
|
137
159
|
var MarkdownPlugin = () => {
|
|
138
160
|
const settings = new LocalStorageStore(MARKDOWN_PLUGIN, {
|
|
139
161
|
defaultViewMode: "preview",
|
|
@@ -145,8 +167,12 @@ var MarkdownPlugin = () => {
|
|
|
145
167
|
extensionProviders: [],
|
|
146
168
|
viewMode: {}
|
|
147
169
|
});
|
|
148
|
-
const getViewMode = (id) =>
|
|
149
|
-
|
|
170
|
+
const getViewMode = (id) => {
|
|
171
|
+
return id && state.values.viewMode[id] || settings.values.defaultViewMode;
|
|
172
|
+
};
|
|
173
|
+
const setViewMode = (id, nextViewMode) => {
|
|
174
|
+
state.values.viewMode[id] = nextViewMode;
|
|
175
|
+
};
|
|
150
176
|
return {
|
|
151
177
|
meta: meta_default,
|
|
152
178
|
ready: async (plugins) => {
|
|
@@ -198,7 +224,7 @@ var MarkdownPlugin = () => {
|
|
|
198
224
|
});
|
|
199
225
|
markdownExtensionPlugins(plugins).forEach((plugin) => {
|
|
200
226
|
const { extensions } = plugin.provides.markdown;
|
|
201
|
-
state.values.extensionProviders
|
|
227
|
+
state.values.extensionProviders.push(extensions);
|
|
202
228
|
});
|
|
203
229
|
},
|
|
204
230
|
provides: {
|
|
@@ -206,14 +232,15 @@ var MarkdownPlugin = () => {
|
|
|
206
232
|
metadata: {
|
|
207
233
|
records: {
|
|
208
234
|
[DocumentType.typename]: {
|
|
209
|
-
label: (object) => object instanceof DocumentType ? object.name
|
|
235
|
+
label: (object) => object instanceof DocumentType ? object.name ?? object.fallbackName : void 0,
|
|
210
236
|
placeholder: [
|
|
211
237
|
"document title placeholder",
|
|
212
238
|
{
|
|
213
239
|
ns: MARKDOWN_PLUGIN
|
|
214
240
|
}
|
|
215
241
|
],
|
|
216
|
-
icon:
|
|
242
|
+
icon: (props) => /* @__PURE__ */ React5.createElement(TextAa, props),
|
|
243
|
+
iconSymbol: "ph--text-aa--regular",
|
|
217
244
|
graphProps: {
|
|
218
245
|
managesAutofocus: true
|
|
219
246
|
},
|
|
@@ -236,17 +263,6 @@ var MarkdownPlugin = () => {
|
|
|
236
263
|
TextType
|
|
237
264
|
]
|
|
238
265
|
},
|
|
239
|
-
space: {
|
|
240
|
-
onSpaceCreate: {
|
|
241
|
-
label: [
|
|
242
|
-
"create document label",
|
|
243
|
-
{
|
|
244
|
-
ns: MARKDOWN_PLUGIN
|
|
245
|
-
}
|
|
246
|
-
],
|
|
247
|
-
action: MarkdownAction.CREATE
|
|
248
|
-
}
|
|
249
|
-
},
|
|
250
266
|
graph: {
|
|
251
267
|
builder: (plugins) => {
|
|
252
268
|
const client = resolvePlugin(plugins, parseClientPlugin)?.provides.client;
|
|
@@ -293,7 +309,8 @@ var MarkdownPlugin = () => {
|
|
|
293
309
|
ns: MARKDOWN_PLUGIN
|
|
294
310
|
}
|
|
295
311
|
],
|
|
296
|
-
icon:
|
|
312
|
+
icon: (props) => /* @__PURE__ */ React5.createElement(TextAa, props),
|
|
313
|
+
iconSymbol: "ph--text-aa--regular",
|
|
297
314
|
testId: "markdownPlugin.createObject"
|
|
298
315
|
}
|
|
299
316
|
}
|
|
@@ -365,7 +382,7 @@ var MarkdownPlugin = () => {
|
|
|
365
382
|
ns: MARKDOWN_PLUGIN
|
|
366
383
|
}
|
|
367
384
|
],
|
|
368
|
-
icon: (props) => /* @__PURE__ */
|
|
385
|
+
icon: (props) => /* @__PURE__ */ React5.createElement(TextAa, props),
|
|
369
386
|
intent: {
|
|
370
387
|
plugin: MARKDOWN_PLUGIN,
|
|
371
388
|
action: MarkdownAction.CREATE
|
|
@@ -374,57 +391,81 @@ var MarkdownPlugin = () => {
|
|
|
374
391
|
]
|
|
375
392
|
},
|
|
376
393
|
thread: {
|
|
394
|
+
// TODO(Zan): How to better handle the type predicate?
|
|
377
395
|
predicate: (obj) => obj instanceof DocumentType,
|
|
378
396
|
createSort: (doc) => {
|
|
379
397
|
const accessor = doc.content ? createDocAccessor(doc.content, [
|
|
380
398
|
"content"
|
|
381
399
|
]) : void 0;
|
|
382
400
|
if (!accessor) {
|
|
401
|
+
log.warn("No accessor found for document content.", void 0, {
|
|
402
|
+
F: __dxlog_file,
|
|
403
|
+
L: 250,
|
|
404
|
+
S: void 0,
|
|
405
|
+
C: (f, a) => f(...a)
|
|
406
|
+
});
|
|
383
407
|
return (_) => 0;
|
|
384
408
|
}
|
|
385
409
|
const getStartPosition = (cursor) => {
|
|
386
410
|
const range = cursor ? getRangeFromCursor(accessor, cursor) : void 0;
|
|
387
411
|
return range?.start ?? Number.MAX_SAFE_INTEGER;
|
|
388
412
|
};
|
|
389
|
-
return (anchorA, anchorB) =>
|
|
390
|
-
if (anchorA === void 0 || anchorB === void 0) {
|
|
391
|
-
return 0;
|
|
392
|
-
}
|
|
393
|
-
const posA = getStartPosition(anchorA);
|
|
394
|
-
const posB = getStartPosition(anchorB);
|
|
395
|
-
return posA - posB;
|
|
396
|
-
};
|
|
413
|
+
return (anchorA, anchorB) => getStartPosition(anchorA) - getStartPosition(anchorB);
|
|
397
414
|
}
|
|
398
415
|
},
|
|
399
416
|
surface: {
|
|
400
|
-
component: ({ data, role }) => {
|
|
417
|
+
component: ({ data, role, ...props }, forwardedRef) => {
|
|
418
|
+
const doc = data.active instanceof DocumentType ? data.active : data.object instanceof DocumentType ? data.object : void 0;
|
|
401
419
|
switch (role) {
|
|
402
420
|
case "section":
|
|
403
421
|
case "article": {
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
422
|
+
if (doc && doc.content) {
|
|
423
|
+
return /* @__PURE__ */ React5.createElement(DocumentEditor, {
|
|
424
|
+
role,
|
|
425
|
+
coordinate: data.coordinate,
|
|
426
|
+
document: doc,
|
|
427
|
+
extensionProviders: state.values.extensionProviders,
|
|
428
|
+
settings: settings.values,
|
|
429
|
+
scrollPastEnd: true,
|
|
430
|
+
viewMode: getViewMode(fullyQualifiedId(doc)),
|
|
431
|
+
onViewModeChange: setViewMode
|
|
432
|
+
});
|
|
433
|
+
} else if (isEditorModel(data.object)) {
|
|
434
|
+
return /* @__PURE__ */ React5.createElement(MarkdownEditor, {
|
|
435
|
+
id: data.object.id,
|
|
436
|
+
role,
|
|
437
|
+
coordinate: data.coordinate,
|
|
438
|
+
initialValue: data.object.text,
|
|
439
|
+
extensionProviders: state.values.extensionProviders,
|
|
440
|
+
inputMode: settings.values.editorInputMode,
|
|
441
|
+
toolbar: settings.values.toolbar,
|
|
442
|
+
scrollPastEnd: true,
|
|
443
|
+
viewMode: getViewMode(data.object.id),
|
|
444
|
+
onViewModeChange: setViewMode
|
|
445
|
+
});
|
|
414
446
|
}
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
447
|
+
break;
|
|
448
|
+
}
|
|
449
|
+
case "card": {
|
|
450
|
+
if (isObject(data.content) && typeof data.content.id === "string" && data.content.object instanceof DocumentType) {
|
|
451
|
+
const cardProps = {
|
|
452
|
+
...props,
|
|
453
|
+
item: {
|
|
454
|
+
id: data.content.id,
|
|
455
|
+
object: data.content.object,
|
|
456
|
+
color: typeof data.content.color === "string" ? data.content.color : void 0
|
|
457
|
+
}
|
|
458
|
+
};
|
|
459
|
+
return isTileComponentProps(cardProps) ? /* @__PURE__ */ React5.createElement(DocumentCard, {
|
|
460
|
+
...cardProps,
|
|
461
|
+
settings: settings.values,
|
|
462
|
+
ref: forwardedRef
|
|
463
|
+
}) : null;
|
|
464
|
+
}
|
|
465
|
+
break;
|
|
425
466
|
}
|
|
426
467
|
case "settings": {
|
|
427
|
-
return data.plugin === meta_default.id ? /* @__PURE__ */
|
|
468
|
+
return data.plugin === meta_default.id ? /* @__PURE__ */ React5.createElement(MarkdownSettings, {
|
|
428
469
|
settings: settings.values
|
|
429
470
|
}) : null;
|
|
430
471
|
}
|
|
@@ -483,7 +524,6 @@ export {
|
|
|
483
524
|
TextType,
|
|
484
525
|
src_default as default,
|
|
485
526
|
getFallbackName,
|
|
486
|
-
isEditorModel,
|
|
487
527
|
isMarkdownProperties,
|
|
488
528
|
markdownExtensionPlugins,
|
|
489
529
|
serializer,
|