@dxos/plugin-markdown 0.6.13-main.ed424a1 → 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 -78
- 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 -112
- 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 -50
- 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 +7 -13
- package/src/components/MarkdownEditor.tsx +75 -40
- package/src/components/Toolbar.stories.tsx +2 -2
- 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/src/util.tsx +2 -2
- package/dist/lib/browser/MarkdownContainer-AYBJNSXD.mjs +0 -467
- package/dist/lib/browser/MarkdownContainer-AYBJNSXD.mjs.map +0 -7
- package/dist/lib/browser/chunk-45N5MEOV.mjs +0 -50
- package/dist/lib/browser/chunk-45N5MEOV.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-IM3V72FY.cjs +0 -482
- package/dist/lib/node/MarkdownContainer-IM3V72FY.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/chunk-W2YJVZ3N.cjs +0 -72
- package/dist/lib/node/chunk-W2YJVZ3N.cjs.map +0 -7
- package/dist/lib/node-esm/MarkdownContainer-56YBSFBE.mjs +0 -468
- package/dist/lib/node-esm/MarkdownContainer-56YBSFBE.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/chunk-UCNOGIBC.mjs +0 -51
- package/dist/lib/node-esm/chunk-UCNOGIBC.mjs.map +0 -7
- package/dist/lib/node-esm/index.mjs +0 -494
- 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,12 +152,14 @@ 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",
|
|
140
162
|
toolbar: true,
|
|
141
|
-
numberedHeadings: true,
|
|
142
163
|
folding: false,
|
|
143
164
|
experimental: false
|
|
144
165
|
});
|
|
@@ -146,8 +167,12 @@ var MarkdownPlugin = () => {
|
|
|
146
167
|
extensionProviders: [],
|
|
147
168
|
viewMode: {}
|
|
148
169
|
});
|
|
149
|
-
const getViewMode = (id) =>
|
|
150
|
-
|
|
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
|
+
};
|
|
151
176
|
return {
|
|
152
177
|
meta: meta_default,
|
|
153
178
|
ready: async (plugins) => {
|
|
@@ -199,7 +224,7 @@ var MarkdownPlugin = () => {
|
|
|
199
224
|
});
|
|
200
225
|
markdownExtensionPlugins(plugins).forEach((plugin) => {
|
|
201
226
|
const { extensions } = plugin.provides.markdown;
|
|
202
|
-
state.values.extensionProviders
|
|
227
|
+
state.values.extensionProviders.push(extensions);
|
|
203
228
|
});
|
|
204
229
|
},
|
|
205
230
|
provides: {
|
|
@@ -207,14 +232,15 @@ var MarkdownPlugin = () => {
|
|
|
207
232
|
metadata: {
|
|
208
233
|
records: {
|
|
209
234
|
[DocumentType.typename]: {
|
|
210
|
-
label: (object) => object instanceof DocumentType ? object.name
|
|
235
|
+
label: (object) => object instanceof DocumentType ? object.name ?? object.fallbackName : void 0,
|
|
211
236
|
placeholder: [
|
|
212
237
|
"document title placeholder",
|
|
213
238
|
{
|
|
214
239
|
ns: MARKDOWN_PLUGIN
|
|
215
240
|
}
|
|
216
241
|
],
|
|
217
|
-
icon:
|
|
242
|
+
icon: (props) => /* @__PURE__ */ React5.createElement(TextAa, props),
|
|
243
|
+
iconSymbol: "ph--text-aa--regular",
|
|
218
244
|
graphProps: {
|
|
219
245
|
managesAutofocus: true
|
|
220
246
|
},
|
|
@@ -237,17 +263,6 @@ var MarkdownPlugin = () => {
|
|
|
237
263
|
TextType
|
|
238
264
|
]
|
|
239
265
|
},
|
|
240
|
-
space: {
|
|
241
|
-
onSpaceCreate: {
|
|
242
|
-
label: [
|
|
243
|
-
"create document label",
|
|
244
|
-
{
|
|
245
|
-
ns: MARKDOWN_PLUGIN
|
|
246
|
-
}
|
|
247
|
-
],
|
|
248
|
-
action: MarkdownAction.CREATE
|
|
249
|
-
}
|
|
250
|
-
},
|
|
251
266
|
graph: {
|
|
252
267
|
builder: (plugins) => {
|
|
253
268
|
const client = resolvePlugin(plugins, parseClientPlugin)?.provides.client;
|
|
@@ -294,7 +309,8 @@ var MarkdownPlugin = () => {
|
|
|
294
309
|
ns: MARKDOWN_PLUGIN
|
|
295
310
|
}
|
|
296
311
|
],
|
|
297
|
-
icon:
|
|
312
|
+
icon: (props) => /* @__PURE__ */ React5.createElement(TextAa, props),
|
|
313
|
+
iconSymbol: "ph--text-aa--regular",
|
|
298
314
|
testId: "markdownPlugin.createObject"
|
|
299
315
|
}
|
|
300
316
|
}
|
|
@@ -366,7 +382,7 @@ var MarkdownPlugin = () => {
|
|
|
366
382
|
ns: MARKDOWN_PLUGIN
|
|
367
383
|
}
|
|
368
384
|
],
|
|
369
|
-
icon: (props) => /* @__PURE__ */
|
|
385
|
+
icon: (props) => /* @__PURE__ */ React5.createElement(TextAa, props),
|
|
370
386
|
intent: {
|
|
371
387
|
plugin: MARKDOWN_PLUGIN,
|
|
372
388
|
action: MarkdownAction.CREATE
|
|
@@ -375,57 +391,81 @@ var MarkdownPlugin = () => {
|
|
|
375
391
|
]
|
|
376
392
|
},
|
|
377
393
|
thread: {
|
|
394
|
+
// TODO(Zan): How to better handle the type predicate?
|
|
378
395
|
predicate: (obj) => obj instanceof DocumentType,
|
|
379
396
|
createSort: (doc) => {
|
|
380
397
|
const accessor = doc.content ? createDocAccessor(doc.content, [
|
|
381
398
|
"content"
|
|
382
399
|
]) : void 0;
|
|
383
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
|
+
});
|
|
384
407
|
return (_) => 0;
|
|
385
408
|
}
|
|
386
409
|
const getStartPosition = (cursor) => {
|
|
387
410
|
const range = cursor ? getRangeFromCursor(accessor, cursor) : void 0;
|
|
388
411
|
return range?.start ?? Number.MAX_SAFE_INTEGER;
|
|
389
412
|
};
|
|
390
|
-
return (anchorA, anchorB) =>
|
|
391
|
-
if (anchorA === void 0 || anchorB === void 0) {
|
|
392
|
-
return 0;
|
|
393
|
-
}
|
|
394
|
-
const posA = getStartPosition(anchorA);
|
|
395
|
-
const posB = getStartPosition(anchorB);
|
|
396
|
-
return posA - posB;
|
|
397
|
-
};
|
|
413
|
+
return (anchorA, anchorB) => getStartPosition(anchorA) - getStartPosition(anchorB);
|
|
398
414
|
}
|
|
399
415
|
},
|
|
400
416
|
surface: {
|
|
401
|
-
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;
|
|
402
419
|
switch (role) {
|
|
403
420
|
case "section":
|
|
404
421
|
case "article": {
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
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
|
+
});
|
|
415
446
|
}
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
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;
|
|
426
466
|
}
|
|
427
467
|
case "settings": {
|
|
428
|
-
return data.plugin === meta_default.id ? /* @__PURE__ */
|
|
468
|
+
return data.plugin === meta_default.id ? /* @__PURE__ */ React5.createElement(MarkdownSettings, {
|
|
429
469
|
settings: settings.values
|
|
430
470
|
}) : null;
|
|
431
471
|
}
|
|
@@ -484,7 +524,6 @@ export {
|
|
|
484
524
|
TextType,
|
|
485
525
|
src_default as default,
|
|
486
526
|
getFallbackName,
|
|
487
|
-
isEditorModel,
|
|
488
527
|
isMarkdownProperties,
|
|
489
528
|
markdownExtensionPlugins,
|
|
490
529
|
serializer,
|