@dxos/react-ui-editor 0.7.5-main.9d26e3a → 0.7.5-main.b19bfc8
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/index.mjs +1125 -1137
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/node/index.cjs +1145 -1171
- package/dist/lib/node/index.cjs.map +4 -4
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node-esm/index.mjs +1125 -1137
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/types/src/InputMode.stories.d.ts +3 -4
- package/dist/types/src/InputMode.stories.d.ts.map +1 -1
- package/dist/types/src/TextEditor.stories.d.ts +34 -35
- package/dist/types/src/TextEditor.stories.d.ts.map +1 -1
- package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts +3 -0
- package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts.map +1 -0
- package/dist/types/src/components/EditorToolbar/blocks.d.ts +18 -0
- package/dist/types/src/components/EditorToolbar/blocks.d.ts.map +1 -0
- package/dist/types/src/components/EditorToolbar/comment.d.ts +17 -0
- package/dist/types/src/components/EditorToolbar/comment.d.ts.map +1 -0
- package/dist/types/src/components/EditorToolbar/formatting.d.ts +18 -0
- package/dist/types/src/components/EditorToolbar/formatting.d.ts.map +1 -0
- package/dist/types/src/components/EditorToolbar/headings.d.ts +18 -0
- package/dist/types/src/components/EditorToolbar/headings.d.ts.map +1 -0
- package/dist/types/src/components/EditorToolbar/index.d.ts +3 -0
- package/dist/types/src/components/EditorToolbar/index.d.ts.map +1 -0
- package/dist/types/src/components/EditorToolbar/lists.d.ts +18 -0
- package/dist/types/src/components/EditorToolbar/lists.d.ts.map +1 -0
- package/dist/types/src/components/EditorToolbar/util.d.ts +58 -0
- package/dist/types/src/components/EditorToolbar/util.d.ts.map +1 -0
- package/dist/types/src/components/EditorToolbar/viewMode.d.ts +18 -0
- package/dist/types/src/components/EditorToolbar/viewMode.d.ts.map +1 -0
- package/dist/types/src/components/index.d.ts +1 -1
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/extensions/automerge/automerge.stories.d.ts +5 -6
- package/dist/types/src/extensions/automerge/automerge.stories.d.ts.map +1 -1
- package/dist/types/src/extensions/comments.d.ts +3 -4
- package/dist/types/src/extensions/comments.d.ts.map +1 -1
- package/dist/types/src/extensions/factories.d.ts.map +1 -1
- package/dist/types/src/extensions/markdown/editorAction.d.ts +12 -0
- package/dist/types/src/extensions/markdown/editorAction.d.ts.map +1 -0
- package/dist/types/src/extensions/markdown/formatting.d.ts +14 -12
- package/dist/types/src/extensions/markdown/formatting.d.ts.map +1 -1
- package/dist/types/src/extensions/markdown/index.d.ts +1 -1
- package/dist/types/src/extensions/markdown/index.d.ts.map +1 -1
- package/dist/types/src/extensions/markdown/styles.d.ts.map +1 -1
- package/dist/types/src/hooks/useActionHandler.d.ts +2 -2
- package/dist/types/src/hooks/useActionHandler.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +1 -0
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/styles/stack-item-content-class-names.d.ts +3 -0
- package/dist/types/src/styles/stack-item-content-class-names.d.ts.map +1 -0
- package/dist/types/src/styles/theme.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +31 -29
- package/src/InputMode.stories.tsx +7 -10
- package/src/components/EditorToolbar/EditorToolbar.tsx +106 -0
- package/src/components/EditorToolbar/blocks.ts +41 -0
- package/src/components/EditorToolbar/comment.ts +23 -0
- package/src/components/EditorToolbar/formatting.ts +41 -0
- package/src/components/EditorToolbar/headings.ts +59 -0
- package/src/components/EditorToolbar/index.ts +6 -0
- package/src/components/EditorToolbar/lists.ts +40 -0
- package/src/components/EditorToolbar/util.ts +65 -0
- package/src/components/EditorToolbar/viewMode.ts +48 -0
- package/src/components/index.ts +1 -1
- package/src/extensions/automerge/automerge.stories.tsx +2 -2
- package/src/extensions/comments.ts +12 -19
- package/src/extensions/factories.ts +11 -5
- package/src/extensions/markdown/decorate.ts +1 -1
- package/src/extensions/markdown/{action.ts → editorAction.ts} +22 -20
- package/src/extensions/markdown/formatting.test.ts +7 -6
- package/src/extensions/markdown/formatting.ts +20 -24
- package/src/extensions/markdown/index.ts +1 -1
- package/src/extensions/markdown/styles.ts +21 -0
- package/src/hooks/useActionHandler.ts +4 -4
- package/src/index.ts +4 -0
- package/src/styles/markdown.ts +1 -1
- package/src/styles/stack-item-content-class-names.ts +17 -0
- package/src/styles/theme.ts +2 -3
- package/dist/types/src/components/Toolbar/Toolbar.d.ts +0 -34
- package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +0 -1
- package/dist/types/src/components/Toolbar/index.d.ts +0 -2
- package/dist/types/src/components/Toolbar/index.d.ts.map +0 -1
- package/dist/types/src/extensions/markdown/action.d.ts +0 -9
- package/dist/types/src/extensions/markdown/action.d.ts.map +0 -1
- package/src/components/Toolbar/Toolbar.tsx +0 -522
- package/src/components/Toolbar/index.ts +0 -5
package/dist/lib/node/index.cjs
CHANGED
@@ -32,6 +32,7 @@ __export(node_exports, {
|
|
32
32
|
EditorInputMode: () => EditorInputMode,
|
33
33
|
EditorInputModes: () => EditorInputModes,
|
34
34
|
EditorState: () => import_state.EditorState,
|
35
|
+
EditorToolbar: () => EditorToolbar,
|
35
36
|
EditorView: () => import_view.EditorView,
|
36
37
|
EditorViewMode: () => EditorViewMode,
|
37
38
|
EditorViewModes: () => EditorViewModes,
|
@@ -41,7 +42,6 @@ __export(node_exports, {
|
|
41
42
|
RemoteSelectionsDecorator: () => RemoteSelectionsDecorator,
|
42
43
|
SpaceAwarenessProvider: () => SpaceAwarenessProvider,
|
43
44
|
TextKind: () => import_text.TextKind,
|
44
|
-
Toolbar: () => Toolbar,
|
45
45
|
addBlockquote: () => addBlockquote,
|
46
46
|
addCodeblock: () => addCodeblock,
|
47
47
|
addLink: () => addLink,
|
@@ -60,8 +60,10 @@ __export(node_exports, {
|
|
60
60
|
commentsState: () => commentsState,
|
61
61
|
convertTreeToJson: () => convertTreeToJson,
|
62
62
|
createBasicExtensions: () => createBasicExtensions,
|
63
|
-
createComment: () =>
|
63
|
+
createComment: () => createComment2,
|
64
64
|
createDataExtensions: () => createDataExtensions,
|
65
|
+
createEditorAction: () => createEditorAction,
|
66
|
+
createEditorActionGroup: () => createEditorActionGroup,
|
65
67
|
createEditorStateStore: () => createEditorStateStore,
|
66
68
|
createEditorStateTransaction: () => createEditorStateTransaction,
|
67
69
|
createElement: () => createElement,
|
@@ -100,7 +102,7 @@ __export(node_exports, {
|
|
100
102
|
mention: () => mention,
|
101
103
|
overlap: () => overlap,
|
102
104
|
preventNewline: () => preventNewline,
|
103
|
-
|
105
|
+
processEditorPayload: () => processEditorPayload,
|
104
106
|
removeBlockquote: () => removeBlockquote,
|
105
107
|
removeCodeblock: () => removeCodeblock,
|
106
108
|
removeLink: () => removeLink,
|
@@ -116,6 +118,8 @@ __export(node_exports, {
|
|
116
118
|
setSelection: () => setSelection,
|
117
119
|
setStyle: () => setStyle,
|
118
120
|
singleValueFacet: () => singleValueFacet,
|
121
|
+
stackItemContentEditorClassNames: () => stackItemContentEditorClassNames,
|
122
|
+
stackItemContentToolbarClassNames: () => stackItemContentToolbarClassNames,
|
119
123
|
table: () => table,
|
120
124
|
tags: () => import_highlight.tags,
|
121
125
|
textRange: () => textRange,
|
@@ -133,9 +137,9 @@ __export(node_exports, {
|
|
133
137
|
useCommentClickListener: () => useCommentClickListener,
|
134
138
|
useCommentState: () => useCommentState,
|
135
139
|
useComments: () => useComments,
|
140
|
+
useEditorToolbarState: () => useEditorToolbarState,
|
136
141
|
useFormattingState: () => useFormattingState,
|
137
142
|
useTextEditor: () => useTextEditor,
|
138
|
-
useToolbarContext: () => useToolbarContext,
|
139
143
|
wrapWithCatch: () => wrapWithCatch
|
140
144
|
});
|
141
145
|
module.exports = __toCommonJS(node_exports);
|
@@ -143,26 +147,33 @@ var import_state = require("@codemirror/state");
|
|
143
147
|
var import_view = require("@codemirror/view");
|
144
148
|
var import_highlight = require("@lezer/highlight");
|
145
149
|
var import_text = require("@dxos/protocols/proto/dxos/echo/model/text");
|
146
|
-
var import_react = require("
|
147
|
-
var import_react_context = require("@radix-ui/react-context");
|
148
|
-
var import_react2 = __toESM(require("react"));
|
149
|
-
var import_react_dropzone = require("react-dropzone");
|
150
|
+
var import_react = __toESM(require("react"));
|
150
151
|
var import_react_ui = require("@dxos/react-ui");
|
152
|
+
var import_react_ui_menu = require("@dxos/react-ui-menu");
|
151
153
|
var import_react_ui_theme = require("@dxos/react-ui-theme");
|
152
|
-
var
|
154
|
+
var import_react2 = require("react");
|
155
|
+
var import_live_object = require("@dxos/live-object");
|
156
|
+
var import_react_ui_menu2 = require("@dxos/react-ui-menu");
|
157
|
+
var import_react_ui_theme2 = require("@dxos/react-ui-theme");
|
153
158
|
var import_view2 = require("@codemirror/view");
|
159
|
+
var import_react_ui_theme3 = require("@dxos/react-ui-theme");
|
160
|
+
var import_react_ui_theme4 = require("@dxos/react-ui-theme");
|
161
|
+
var import_lodash = __toESM(require("lodash.get"));
|
162
|
+
var import_react_ui_theme5 = require("@dxos/react-ui-theme");
|
163
|
+
var import_state2 = require("@codemirror/state");
|
164
|
+
var import_view3 = require("@codemirror/view");
|
154
165
|
var import_util = require("@dxos/util");
|
155
166
|
var import_state3 = require("@codemirror/state");
|
156
167
|
var import_log = require("@dxos/log");
|
157
168
|
var import_react3 = __toESM(require("react"));
|
158
169
|
var import_client = require("react-dom/client");
|
159
170
|
var import_react_ui2 = require("@dxos/react-ui");
|
160
|
-
var
|
171
|
+
var import_react_ui_theme6 = require("@dxos/react-ui-theme");
|
161
172
|
var import_autocomplete = require("@codemirror/autocomplete");
|
162
173
|
var import_lang_markdown = require("@codemirror/lang-markdown");
|
163
|
-
var import_view3 = require("@codemirror/view");
|
164
|
-
var import_state4 = require("@codemirror/state");
|
165
174
|
var import_view4 = require("@codemirror/view");
|
175
|
+
var import_state4 = require("@codemirror/state");
|
176
|
+
var import_view5 = require("@codemirror/view");
|
166
177
|
var import_automerge = require("@dxos/automerge/automerge");
|
167
178
|
var import_log2 = require("@dxos/log");
|
168
179
|
var import_echo = require("@dxos/react-client/echo");
|
@@ -171,64 +182,60 @@ var import_automerge2 = require("@dxos/automerge/automerge");
|
|
171
182
|
var import_automerge3 = require("@dxos/automerge/automerge");
|
172
183
|
var import_state6 = require("@codemirror/state");
|
173
184
|
var import_state7 = require("@codemirror/state");
|
174
|
-
var
|
185
|
+
var import_view6 = require("@codemirror/view");
|
175
186
|
var import_async = require("@dxos/async");
|
176
187
|
var import_context = require("@dxos/context");
|
177
188
|
var import_async2 = require("@dxos/async");
|
178
189
|
var import_context2 = require("@dxos/context");
|
179
190
|
var import_invariant = require("@dxos/invariant");
|
180
191
|
var import_log3 = require("@dxos/log");
|
181
|
-
var import_view6 = require("@codemirror/view");
|
182
|
-
var import_lodash = __toESM(require("lodash.defaultsdeep"));
|
183
|
-
var import_invariant2 = require("@dxos/invariant");
|
184
192
|
var import_view7 = require("@codemirror/view");
|
185
|
-
var
|
193
|
+
var import_lodash2 = __toESM(require("lodash.defaultsdeep"));
|
194
|
+
var import_invariant2 = require("@dxos/invariant");
|
186
195
|
var import_view8 = require("@codemirror/view");
|
187
|
-
var
|
196
|
+
var import_state8 = require("@codemirror/state");
|
188
197
|
var import_view9 = require("@codemirror/view");
|
198
|
+
var import_state9 = require("@codemirror/state");
|
199
|
+
var import_view10 = require("@codemirror/view");
|
189
200
|
var import_commands = require("@codemirror/commands");
|
190
201
|
var import_state10 = require("@codemirror/state");
|
191
|
-
var
|
192
|
-
var
|
202
|
+
var import_view11 = require("@codemirror/view");
|
203
|
+
var import_lodash3 = __toESM(require("lodash.sortby"));
|
193
204
|
var import_react4 = require("react");
|
194
205
|
var import_async3 = require("@dxos/async");
|
195
206
|
var import_log4 = require("@dxos/log");
|
196
207
|
var import_util2 = require("@dxos/util");
|
197
208
|
var import_state11 = require("@codemirror/state");
|
198
|
-
var
|
209
|
+
var import_view12 = require("@codemirror/view");
|
199
210
|
var import_async4 = require("@dxos/async");
|
200
211
|
var import_invariant3 = require("@dxos/invariant");
|
201
212
|
var import_util3 = require("@dxos/util");
|
202
213
|
var import_language = require("@codemirror/language");
|
203
214
|
var import_state12 = require("@codemirror/state");
|
204
|
-
var
|
215
|
+
var import_view13 = require("@codemirror/view");
|
205
216
|
var import_autocomplete2 = require("@codemirror/autocomplete");
|
206
217
|
var import_commands2 = require("@codemirror/commands");
|
207
218
|
var import_language2 = require("@codemirror/language");
|
208
219
|
var import_search = require("@codemirror/search");
|
209
220
|
var import_state13 = require("@codemirror/state");
|
210
221
|
var import_theme_one_dark = require("@codemirror/theme-one-dark");
|
211
|
-
var
|
212
|
-
var
|
213
|
-
var
|
222
|
+
var import_view14 = require("@codemirror/view");
|
223
|
+
var import_lodash4 = __toESM(require("lodash.defaultsdeep"));
|
224
|
+
var import_lodash5 = __toESM(require("lodash.merge"));
|
214
225
|
var import_display_name = require("@dxos/display-name");
|
215
226
|
var import_log5 = require("@dxos/log");
|
216
|
-
var import_react_ui_theme3 = require("@dxos/react-ui-theme");
|
217
227
|
var import_util4 = require("@dxos/util");
|
218
228
|
var import_state14 = require("@codemirror/state");
|
219
|
-
var import_view14 = require("@codemirror/view");
|
220
|
-
var import_react_ui_theme4 = require("@dxos/react-ui-theme");
|
221
|
-
var import_lodash5 = __toESM(require("lodash.get"));
|
222
|
-
var import_react_ui_theme5 = require("@dxos/react-ui-theme");
|
223
|
-
var import_language3 = require("@codemirror/language");
|
224
229
|
var import_view15 = require("@codemirror/view");
|
230
|
+
var import_language3 = require("@codemirror/language");
|
231
|
+
var import_view16 = require("@codemirror/view");
|
225
232
|
var import_react5 = __toESM(require("react"));
|
226
233
|
var import_react_ui3 = require("@dxos/react-ui");
|
227
|
-
var
|
234
|
+
var import_view17 = require("@codemirror/view");
|
228
235
|
var import_autocomplete3 = require("@codemirror/autocomplete");
|
229
236
|
var import_language4 = require("@codemirror/language");
|
230
237
|
var import_state15 = require("@codemirror/state");
|
231
|
-
var
|
238
|
+
var import_view18 = require("@codemirror/view");
|
232
239
|
var import_react6 = require("react");
|
233
240
|
var import_autocomplete4 = require("@codemirror/autocomplete");
|
234
241
|
var import_commands3 = require("@codemirror/commands");
|
@@ -236,7 +243,7 @@ var import_lang_markdown2 = require("@codemirror/lang-markdown");
|
|
236
243
|
var import_language5 = require("@codemirror/language");
|
237
244
|
var import_language_data = require("@codemirror/language-data");
|
238
245
|
var import_lint = require("@codemirror/lint");
|
239
|
-
var
|
246
|
+
var import_view19 = require("@codemirror/view");
|
240
247
|
var import_lang_markdown3 = require("@codemirror/lang-markdown");
|
241
248
|
var import_language6 = require("@codemirror/language");
|
242
249
|
var import_highlight2 = require("@lezer/highlight");
|
@@ -245,35 +252,34 @@ var import_language7 = require("@codemirror/language");
|
|
245
252
|
var import_state16 = require("@codemirror/state");
|
246
253
|
var import_language8 = require("@codemirror/language");
|
247
254
|
var import_state17 = require("@codemirror/state");
|
248
|
-
var
|
255
|
+
var import_view20 = require("@codemirror/view");
|
249
256
|
var import_invariant4 = require("@dxos/invariant");
|
250
|
-
var
|
257
|
+
var import_react_ui_theme7 = require("@dxos/react-ui-theme");
|
251
258
|
var import_language9 = require("@codemirror/language");
|
252
259
|
var import_state18 = require("@codemirror/state");
|
253
|
-
var
|
260
|
+
var import_view21 = require("@codemirror/view");
|
254
261
|
var import_language10 = require("@codemirror/language");
|
255
262
|
var import_state19 = require("@codemirror/state");
|
256
|
-
var import_view21 = require("@codemirror/view");
|
257
263
|
var import_view22 = require("@codemirror/view");
|
264
|
+
var import_view23 = require("@codemirror/view");
|
258
265
|
var import_language11 = require("@codemirror/language");
|
259
266
|
var import_state20 = require("@codemirror/state");
|
260
|
-
var import_view23 = require("@codemirror/view");
|
261
|
-
var import_language12 = require("@codemirror/language");
|
262
267
|
var import_view24 = require("@codemirror/view");
|
263
|
-
var
|
268
|
+
var import_language12 = require("@codemirror/language");
|
269
|
+
var import_view25 = require("@codemirror/view");
|
270
|
+
var import_react_ui_theme8 = require("@dxos/react-ui-theme");
|
264
271
|
var import_autocomplete5 = require("@codemirror/autocomplete");
|
265
272
|
var import_log6 = require("@dxos/log");
|
266
|
-
var
|
273
|
+
var import_view26 = require("@codemirror/view");
|
267
274
|
var import_codemirror_vim = require("@replit/codemirror-vim");
|
268
275
|
var import_codemirror_vscode_keymap = require("@replit/codemirror-vscode-keymap");
|
269
276
|
var import_echo_schema = require("@dxos/echo-schema");
|
270
|
-
var import_view26 = require("@codemirror/view");
|
271
277
|
var import_view27 = require("@codemirror/view");
|
272
|
-
var
|
278
|
+
var import_react7 = require("react");
|
273
279
|
var import_state21 = require("@codemirror/state");
|
274
280
|
var import_view28 = require("@codemirror/view");
|
275
281
|
var import_react_tabster = require("@fluentui/react-tabster");
|
276
|
-
var
|
282
|
+
var import_react8 = require("react");
|
277
283
|
var import_log7 = require("@dxos/log");
|
278
284
|
var import_util5 = require("@dxos/util");
|
279
285
|
var translationKey = "react-ui-editor";
|
@@ -309,214 +315,780 @@ var translations_default = [
|
|
309
315
|
}
|
310
316
|
}
|
311
317
|
];
|
312
|
-
var
|
313
|
-
|
314
|
-
|
315
|
-
|
318
|
+
var useEditorToolbarState = (initialState = {}) => {
|
319
|
+
return (0, import_react2.useMemo)(() => (0, import_live_object.create)(initialState), []);
|
320
|
+
};
|
321
|
+
var createEditorAction = (payload, icon, label = [
|
322
|
+
`${payload.type} label`,
|
323
|
+
{
|
324
|
+
ns: translationKey
|
316
325
|
}
|
326
|
+
], id = payload.type) => (0, import_react_ui_menu2.createMenuAction)(id, {
|
327
|
+
icon,
|
328
|
+
label,
|
329
|
+
...payload
|
317
330
|
});
|
318
|
-
var
|
319
|
-
|
320
|
-
|
321
|
-
|
331
|
+
var createEditorActionGroup = (id, props, icon) => (0, import_react_ui_menu2.createMenuItemGroup)(id, {
|
332
|
+
icon,
|
333
|
+
iconOnly: true,
|
334
|
+
...props
|
335
|
+
});
|
336
|
+
var editorToolbarSearch = createEditorAction({
|
337
|
+
type: "search"
|
338
|
+
}, "ph--magnifying-glass--regular");
|
339
|
+
var createBlockGroupAction = (value) => createEditorActionGroup("block", {
|
340
|
+
variant: "toggleGroup",
|
341
|
+
selectCardinality: "single",
|
342
|
+
value
|
343
|
+
});
|
344
|
+
var createBlockActions = (value, blankLine) => Object.entries({
|
345
|
+
blockquote: "ph--quotes--regular",
|
346
|
+
codeblock: "ph--code-block--regular",
|
347
|
+
table: "ph--table--regular"
|
348
|
+
}).map(([type, icon]) => {
|
349
|
+
return createEditorAction({
|
350
|
+
type,
|
351
|
+
checked: type === value,
|
352
|
+
...type === "table" && {
|
353
|
+
disabled: !!blankLine
|
354
|
+
}
|
355
|
+
}, icon);
|
356
|
+
});
|
357
|
+
var createBlocks = (state) => {
|
358
|
+
const value = state?.blockQuote ? "blockquote" : state.blockType ?? "";
|
359
|
+
const blockGroupAction = createBlockGroupAction(value);
|
360
|
+
const blockActions = createBlockActions(value, state.blankLine);
|
361
|
+
return {
|
362
|
+
nodes: [
|
363
|
+
blockGroupAction,
|
364
|
+
...blockActions
|
365
|
+
],
|
366
|
+
edges: [
|
367
|
+
{
|
368
|
+
source: "root",
|
369
|
+
target: "block"
|
370
|
+
},
|
371
|
+
...blockActions.map(({ id }) => ({
|
372
|
+
source: blockGroupAction.id,
|
373
|
+
target: id
|
374
|
+
}))
|
375
|
+
]
|
376
|
+
};
|
322
377
|
};
|
323
|
-
var
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
378
|
+
var commentLabel = (comment, selection) => comment ? "selection overlaps existing comment label" : selection === false ? "select text to comment label" : "comment label";
|
379
|
+
var createCommentAction = (label) => createEditorAction({
|
380
|
+
type: "comment",
|
381
|
+
testId: "editor.toolbar.comment"
|
382
|
+
}, "ph--chat-text--regular", label);
|
383
|
+
var createComment = (state) => ({
|
384
|
+
nodes: [
|
385
|
+
createCommentAction([
|
386
|
+
commentLabel(state.comment, state.selection),
|
387
|
+
{
|
388
|
+
ns: translationKey
|
389
|
+
}
|
390
|
+
])
|
391
|
+
],
|
392
|
+
edges: [
|
393
|
+
{
|
394
|
+
source: "root",
|
395
|
+
target: "comment"
|
396
|
+
}
|
397
|
+
]
|
398
|
+
});
|
399
|
+
var formats = {
|
400
|
+
strong: "ph--text-b--regular",
|
401
|
+
emphasis: "ph--text-italic--regular",
|
402
|
+
strikethrough: "ph--text-strikethrough--regular",
|
403
|
+
code: "ph--code--regular",
|
404
|
+
link: "ph--link--regular"
|
405
|
+
};
|
406
|
+
var createFormattingGroup = (formatting) => createEditorActionGroup("formatting", {
|
407
|
+
variant: "toggleGroup",
|
408
|
+
selectCardinality: "multiple",
|
409
|
+
value: Object.keys(formats).filter((key) => !!formatting[key])
|
410
|
+
});
|
411
|
+
var createFormattingActions = (formatting) => Object.entries(formats).map(([type, icon]) => createEditorAction({
|
412
|
+
type,
|
413
|
+
checked: !!formatting[type]
|
414
|
+
}, icon));
|
415
|
+
var createFormatting = (state) => {
|
416
|
+
const formattingGroupAction = createFormattingGroup(state);
|
417
|
+
const formattingActions = createFormattingActions(state);
|
418
|
+
return {
|
419
|
+
nodes: [
|
420
|
+
formattingGroupAction,
|
421
|
+
...formattingActions
|
422
|
+
],
|
423
|
+
edges: [
|
424
|
+
{
|
425
|
+
source: "root",
|
426
|
+
target: "formatting"
|
427
|
+
},
|
428
|
+
...formattingActions.map(({ id }) => ({
|
429
|
+
source: formattingGroupAction.id,
|
430
|
+
target: id
|
431
|
+
}))
|
432
|
+
]
|
433
|
+
};
|
350
434
|
};
|
351
|
-
var
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
435
|
+
var createHeadingGroupAction = (value) => createEditorActionGroup("heading", {
|
436
|
+
variant: "dropdownMenu",
|
437
|
+
applyActive: true,
|
438
|
+
selectCardinality: "single",
|
439
|
+
value
|
440
|
+
}, "ph--text-h--regular");
|
441
|
+
var createHeadingActions = (value) => Object.entries({
|
442
|
+
"0": "ph--paragraph--regular",
|
443
|
+
"1": "ph--text-h-one--regular",
|
444
|
+
"2": "ph--text-h-two--regular",
|
445
|
+
"3": "ph--text-h-three--regular",
|
446
|
+
"4": "ph--text-h-four--regular",
|
447
|
+
"5": "ph--text-h-five--regular",
|
448
|
+
"6": "ph--text-h-six--regular"
|
449
|
+
}).map(([levelStr, icon]) => {
|
450
|
+
const level = parseInt(levelStr);
|
451
|
+
return createEditorAction({
|
452
|
+
type: "heading",
|
453
|
+
data: level,
|
454
|
+
checked: value === levelStr
|
455
|
+
}, icon, [
|
456
|
+
"heading level label",
|
457
|
+
{
|
458
|
+
count: level,
|
459
|
+
ns: translationKey
|
363
460
|
}
|
461
|
+
], `heading--${levelStr}`);
|
462
|
+
});
|
463
|
+
var computeHeadingValue = (state) => {
|
464
|
+
const blockType = state ? state.blockType : "paragraph";
|
465
|
+
const header = blockType && /heading(\d)/.exec(blockType);
|
466
|
+
return header ? header[1] : blockType === "paragraph" || !blockType ? "0" : "";
|
467
|
+
};
|
468
|
+
var createHeadings = (state) => {
|
469
|
+
const headingValue = computeHeadingValue(state);
|
470
|
+
const headingGroupAction = createHeadingGroupAction(headingValue);
|
471
|
+
const headingActions = createHeadingActions(headingValue);
|
472
|
+
return {
|
473
|
+
nodes: [
|
474
|
+
headingGroupAction,
|
475
|
+
...headingActions
|
476
|
+
],
|
477
|
+
edges: [
|
478
|
+
{
|
479
|
+
source: "root",
|
480
|
+
target: "heading"
|
481
|
+
},
|
482
|
+
...headingActions.map(({ id }) => ({
|
483
|
+
source: headingGroupAction.id,
|
484
|
+
target: id
|
485
|
+
}))
|
486
|
+
]
|
364
487
|
};
|
365
488
|
};
|
366
|
-
var
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
import_log.log.catch(err, void 0, {
|
371
|
-
F: __dxlog_file,
|
372
|
-
L: 29,
|
373
|
-
S: void 0,
|
374
|
-
C: (f, a) => f(...a)
|
375
|
-
});
|
376
|
-
}
|
489
|
+
var listStyles = {
|
490
|
+
bullet: "ph--list-bullets--regular",
|
491
|
+
ordered: "ph--list-numbers--regular",
|
492
|
+
task: "ph--list-checks--regular"
|
377
493
|
};
|
378
|
-
var
|
379
|
-
|
380
|
-
|
494
|
+
var createListGroupAction = (value) => createEditorActionGroup("list", {
|
495
|
+
variant: "toggleGroup",
|
496
|
+
selectCardinality: "single",
|
497
|
+
value
|
498
|
+
});
|
499
|
+
var createListActions = (value) => Object.entries(listStyles).map(([listStyle, icon]) => createEditorAction({
|
500
|
+
type: `list-${listStyle}`,
|
501
|
+
checked: value === listStyle
|
502
|
+
}, icon));
|
503
|
+
var createLists = (state) => {
|
504
|
+
const value = state.listStyle ?? "";
|
505
|
+
const listGroupAction = createListGroupAction(value);
|
506
|
+
const listActionsMap = createListActions(value);
|
507
|
+
return {
|
508
|
+
nodes: [
|
509
|
+
listGroupAction,
|
510
|
+
...listActionsMap
|
511
|
+
],
|
512
|
+
edges: [
|
513
|
+
{
|
514
|
+
source: "root",
|
515
|
+
target: "list"
|
516
|
+
},
|
517
|
+
...listActionsMap.map(({ id }) => ({
|
518
|
+
source: listGroupAction.id,
|
519
|
+
target: id
|
520
|
+
}))
|
521
|
+
]
|
522
|
+
};
|
381
523
|
};
|
382
|
-
var
|
383
|
-
|
384
|
-
|
385
|
-
|
524
|
+
var createViewModeGroupAction = (value) => createEditorActionGroup("viewMode", {
|
525
|
+
variant: "dropdownMenu",
|
526
|
+
applyActive: true,
|
527
|
+
selectCardinality: "single",
|
528
|
+
value
|
529
|
+
}, "ph--eye--regular");
|
530
|
+
var createViewModeActions = (value) => Object.entries({
|
531
|
+
preview: "ph--eye--regular",
|
532
|
+
source: "ph--pencil-simple--regular",
|
533
|
+
readonly: "ph--pencil-slash--regular"
|
534
|
+
}).map(([viewMode, icon]) => {
|
535
|
+
return createEditorAction({
|
536
|
+
type: "view-mode",
|
537
|
+
data: viewMode,
|
538
|
+
checked: viewMode === value
|
539
|
+
}, icon, [
|
540
|
+
`${viewMode} mode label`,
|
541
|
+
{
|
542
|
+
ns: translationKey
|
386
543
|
}
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
|
544
|
+
], `view-mode--${viewMode}`);
|
545
|
+
});
|
546
|
+
var createViewMode = (state) => {
|
547
|
+
const value = state.viewMode ?? "source";
|
548
|
+
const viewModeGroupAction = createViewModeGroupAction(value);
|
549
|
+
const viewModeActions = createViewModeActions(value);
|
550
|
+
return {
|
551
|
+
nodes: [
|
552
|
+
viewModeGroupAction,
|
553
|
+
...viewModeActions
|
554
|
+
],
|
555
|
+
edges: [
|
556
|
+
{
|
557
|
+
source: "root",
|
558
|
+
target: "viewMode"
|
559
|
+
},
|
560
|
+
...viewModeActions.map(({ id }) => ({
|
561
|
+
source: viewModeGroupAction.id,
|
562
|
+
target: id
|
563
|
+
}))
|
564
|
+
]
|
565
|
+
};
|
566
|
+
};
|
567
|
+
var stackItemContentEditorClassNames = (role) => (0, import_react_ui_theme2.mx)("dx-focus-ring-inset data-[toolbar=disabled]:pbs-2 attention-surface", role === "article" ? "min-bs-0" : "[&_.cm-scroller]:overflow-hidden [&_.cm-scroller]:min-bs-24");
|
568
|
+
var stackItemContentToolbarClassNames = (role) => (0, import_react_ui_theme2.mx)("attention-surface is-full border-be !border-separator", role === "section" && "sticky block-start-0 z-[1] -mbe-px min-is-0");
|
569
|
+
var createToolbar = ({ state, customActions, ...features }) => {
|
570
|
+
const nodes = [];
|
571
|
+
const edges = [];
|
572
|
+
if (features.headings ?? true) {
|
573
|
+
const headings2 = createHeadings(state);
|
574
|
+
nodes.push(...headings2.nodes);
|
575
|
+
edges.push(...headings2.edges);
|
576
|
+
}
|
577
|
+
if (features.formatting ?? true) {
|
578
|
+
const formatting = createFormatting(state);
|
579
|
+
nodes.push(...formatting.nodes);
|
580
|
+
edges.push(...formatting.edges);
|
581
|
+
}
|
582
|
+
if (features.lists ?? true) {
|
583
|
+
const lists = createLists(state);
|
584
|
+
nodes.push(...lists.nodes);
|
585
|
+
edges.push(...lists.edges);
|
586
|
+
}
|
587
|
+
if (features.blocks ?? true) {
|
588
|
+
const blocks = createBlocks(state);
|
589
|
+
nodes.push(...blocks.nodes);
|
590
|
+
edges.push(...blocks.edges);
|
591
|
+
}
|
592
|
+
if (customActions) {
|
593
|
+
const custom = customActions();
|
594
|
+
nodes.push(...custom.nodes);
|
595
|
+
edges.push(...custom.edges);
|
596
|
+
}
|
597
|
+
const editorToolbarGap = (0, import_react_ui_menu.createGapSeparator)();
|
598
|
+
nodes.push(...editorToolbarGap.nodes);
|
599
|
+
edges.push(...editorToolbarGap.edges);
|
600
|
+
if (features.comment ?? true) {
|
601
|
+
const comment = createComment(state);
|
602
|
+
nodes.push(...comment.nodes);
|
603
|
+
edges.push(...comment.edges);
|
604
|
+
}
|
605
|
+
if (features.search ?? true) {
|
606
|
+
nodes.push(editorToolbarSearch);
|
607
|
+
edges.push({
|
608
|
+
source: "root",
|
609
|
+
target: editorToolbarSearch.id
|
405
610
|
});
|
406
611
|
}
|
612
|
+
if (features.viewMode ?? true) {
|
613
|
+
const viewMode = createViewMode(state);
|
614
|
+
nodes.push(...viewMode.nodes);
|
615
|
+
edges.push(...viewMode.edges);
|
616
|
+
}
|
617
|
+
return {
|
618
|
+
nodes,
|
619
|
+
edges
|
620
|
+
};
|
407
621
|
};
|
408
|
-
var
|
409
|
-
const
|
622
|
+
var useEditorToolbarActionGraph = ({ onAction, ...props }) => {
|
623
|
+
const menuCreator = (0, import_react.useCallback)(() => createToolbar(props), [
|
624
|
+
props
|
625
|
+
]);
|
626
|
+
const { resolveGroupItems } = (0, import_react_ui_menu.useMenuActions)(menuCreator);
|
410
627
|
return {
|
411
|
-
|
412
|
-
|
413
|
-
top: rect.top,
|
414
|
-
bottom: rect.bottom
|
628
|
+
resolveGroupItems,
|
629
|
+
onAction
|
415
630
|
};
|
416
631
|
};
|
417
|
-
var
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
632
|
+
var EditorToolbar = ({ classNames, attendableId, role, ...props }) => {
|
633
|
+
const menuProps = useEditorToolbarActionGraph(props);
|
634
|
+
return /* @__PURE__ */ import_react.default.createElement("div", {
|
635
|
+
role: "none",
|
636
|
+
className: stackItemContentToolbarClassNames(role)
|
637
|
+
}, /* @__PURE__ */ import_react.default.createElement(import_react_ui.ElevationProvider, {
|
638
|
+
elevation: role === "section" ? "positioned" : "base"
|
639
|
+
}, /* @__PURE__ */ import_react.default.createElement(import_react_ui_menu.MenuProvider, {
|
640
|
+
...menuProps,
|
641
|
+
attendableId
|
642
|
+
}, /* @__PURE__ */ import_react.default.createElement(import_react_ui_menu.ToolbarMenu, {
|
643
|
+
classNames: [
|
644
|
+
import_react_ui_theme.textBlockWidth,
|
645
|
+
"!bg-transparent",
|
646
|
+
classNames
|
647
|
+
]
|
648
|
+
}))));
|
423
649
|
};
|
424
|
-
var
|
425
|
-
|
426
|
-
|
427
|
-
|
428
|
-
|
429
|
-
|
430
|
-
|
431
|
-
}
|
650
|
+
var headings = {
|
651
|
+
1: "text-4xl",
|
652
|
+
2: "text-3xl",
|
653
|
+
3: "text-2xl",
|
654
|
+
4: "text-xl",
|
655
|
+
5: "text-lg",
|
656
|
+
6: ""
|
432
657
|
};
|
433
|
-
var
|
434
|
-
|
435
|
-
|
436
|
-
|
437
|
-
|
438
|
-
|
439
|
-
el.append(...Array.isArray(children) ? children : [
|
440
|
-
children
|
441
|
-
]);
|
658
|
+
var theme = {
|
659
|
+
code: "font-mono !no-underline text-neutral-700 dark:text-neutral-300",
|
660
|
+
codeMark: "font-mono text-primary-500",
|
661
|
+
mark: "opacity-50",
|
662
|
+
heading: (level) => {
|
663
|
+
return (0, import_react_ui_theme4.mx)(headings[level], "dark:text-primary-400");
|
442
664
|
}
|
443
|
-
return el;
|
444
665
|
};
|
445
|
-
var
|
446
|
-
(0,
|
447
|
-
|
448
|
-
}, node));
|
449
|
-
return root;
|
666
|
+
var getToken = (path, defaultValue) => {
|
667
|
+
const value = (0, import_lodash.default)(import_react_ui_theme5.tokens, path, defaultValue);
|
668
|
+
return value?.toString() ?? "";
|
450
669
|
};
|
451
|
-
var
|
452
|
-
|
453
|
-
|
454
|
-
|
455
|
-
|
456
|
-
|
457
|
-
|
458
|
-
|
459
|
-
|
460
|
-
|
461
|
-
|
462
|
-
|
463
|
-
|
464
|
-
|
465
|
-
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
|
471
|
-
|
472
|
-
|
473
|
-
|
474
|
-
|
475
|
-
|
476
|
-
|
670
|
+
var fontBody = getToken("fontFamily.body");
|
671
|
+
var fontMono = getToken("fontFamily.mono");
|
672
|
+
var defaultTheme = {
|
673
|
+
"&": {},
|
674
|
+
"&.cm-focused": {
|
675
|
+
outline: "none"
|
676
|
+
},
|
677
|
+
/**
|
678
|
+
* Scroller
|
679
|
+
*/
|
680
|
+
".cm-scroller": {
|
681
|
+
overflowY: "auto"
|
682
|
+
},
|
683
|
+
/**
|
684
|
+
* Content
|
685
|
+
* NOTE: Apply margins to content so that scrollbar is at the edge of the container.
|
686
|
+
*/
|
687
|
+
".cm-content": {
|
688
|
+
padding: "unset",
|
689
|
+
fontFamily: fontBody,
|
690
|
+
// NOTE: Base font size (otherwise defined by HTML tag, which might be different for storybook).
|
691
|
+
fontSize: "16px",
|
692
|
+
lineHeight: 1.5,
|
693
|
+
color: "unset"
|
694
|
+
},
|
695
|
+
/**
|
696
|
+
* Gutters
|
697
|
+
* NOTE: Gutters should have the same top margin as the content.
|
698
|
+
*/
|
699
|
+
".cm-gutters": {
|
700
|
+
borderRight: "none",
|
701
|
+
background: "transparent"
|
702
|
+
},
|
703
|
+
".cm-gutter": {},
|
704
|
+
".cm-gutter.cm-lineNumbers .cm-gutterElement": {
|
705
|
+
minWidth: "40px",
|
706
|
+
alignContent: "center"
|
707
|
+
},
|
708
|
+
/**
|
709
|
+
* Height is set to match the corresponding line.
|
710
|
+
*/
|
711
|
+
".cm-gutterElement": {
|
712
|
+
alignItems: "center",
|
713
|
+
fontSize: "16px"
|
714
|
+
},
|
715
|
+
/**
|
716
|
+
* Line.
|
717
|
+
*/
|
718
|
+
".cm-line": {
|
719
|
+
paddingInline: 0
|
720
|
+
},
|
721
|
+
".cm-activeLine": {
|
722
|
+
background: "var(--dx-cmActiveLine)"
|
723
|
+
},
|
724
|
+
/**
|
725
|
+
* Cursor (layer).
|
726
|
+
*/
|
727
|
+
".cm-cursor, .cm-dropCursor": {
|
728
|
+
borderLeft: "2px solid var(--dx-cmCursor)"
|
729
|
+
},
|
730
|
+
".cm-placeholder": {
|
731
|
+
color: "var(--dx-subdued)"
|
732
|
+
},
|
733
|
+
/**
|
734
|
+
* Selection (layer).
|
735
|
+
*/
|
736
|
+
".cm-selectionBackground": {
|
737
|
+
background: "var(--dx-cmSelection)"
|
738
|
+
},
|
739
|
+
/**
|
740
|
+
* Search.
|
741
|
+
* NOTE: Matches comment.
|
742
|
+
*/
|
743
|
+
".cm-searchMatch": {
|
744
|
+
margin: "0 -3px",
|
745
|
+
padding: "3px",
|
746
|
+
borderRadius: "3px",
|
747
|
+
background: "var(--dx-cmHighlightSurface)",
|
748
|
+
color: "var(--dx-cmHighlight)"
|
749
|
+
},
|
750
|
+
".cm-searchMatch-selected": {
|
751
|
+
textDecoration: "underline"
|
752
|
+
},
|
753
|
+
/**
|
754
|
+
* Link.
|
755
|
+
*/
|
756
|
+
".cm-link": {
|
757
|
+
textDecorationLine: "underline",
|
758
|
+
textDecorationThickness: "1px",
|
759
|
+
textUnderlineOffset: "2px",
|
760
|
+
borderRadius: ".125rem"
|
761
|
+
},
|
762
|
+
".cm-link > span": {
|
763
|
+
color: "var(--dx-accentText)"
|
764
|
+
},
|
765
|
+
/**
|
766
|
+
* Tooltip.
|
767
|
+
*/
|
768
|
+
".cm-tooltip": {
|
769
|
+
background: "var(--dx-baseSurface)"
|
770
|
+
},
|
771
|
+
".cm-tooltip-below": {},
|
772
|
+
/**
|
773
|
+
* Autocomplete.
|
774
|
+
* https://github.com/codemirror/autocomplete/blob/main/src/completion.ts
|
775
|
+
*/
|
776
|
+
".cm-tooltip.cm-tooltip-autocomplete": {
|
777
|
+
marginTop: "4px",
|
778
|
+
marginLeft: "-3px"
|
779
|
+
},
|
780
|
+
".cm-tooltip.cm-tooltip-autocomplete > ul": {
|
781
|
+
maxHeight: "20em"
|
782
|
+
},
|
783
|
+
".cm-tooltip.cm-tooltip-autocomplete > ul > li": {},
|
784
|
+
".cm-tooltip.cm-tooltip-autocomplete > ul > li[aria-selected]": {},
|
785
|
+
".cm-tooltip.cm-tooltip-autocomplete > ul > completion-section": {
|
786
|
+
paddingLeft: "4px !important",
|
787
|
+
borderBottom: "none !important",
|
788
|
+
color: "var(--dx-accentText)"
|
789
|
+
},
|
790
|
+
".cm-tooltip.cm-completionInfo": {
|
791
|
+
width: "360px !important",
|
792
|
+
margin: "-10px 1px 0 1px",
|
793
|
+
padding: "8px !important",
|
794
|
+
borderColor: "var(--dx-separator)"
|
795
|
+
},
|
796
|
+
".cm-completionIcon": {
|
797
|
+
display: "none"
|
798
|
+
},
|
799
|
+
".cm-completionLabel": {
|
800
|
+
fontFamily: fontBody
|
801
|
+
},
|
802
|
+
".cm-completionMatchedText": {
|
803
|
+
textDecoration: "none !important",
|
804
|
+
opacity: 0.5
|
805
|
+
},
|
806
|
+
/**
|
807
|
+
* Panels
|
808
|
+
* https://github.com/codemirror/search/blob/main/src/search.ts#L745
|
809
|
+
*
|
810
|
+
* Find/replace panel.
|
811
|
+
* <div class="cm-announced">...</div>
|
812
|
+
* <div class="cm-scroller">...</div>
|
813
|
+
* <div class="cm-panels cm-panels-bottom">
|
814
|
+
* <div class="cm-search cm-panel">
|
815
|
+
* <input class="cm-textfield" />
|
816
|
+
* <button class="cm-button">...</button>
|
817
|
+
* <label><input type="checkbox" />...</label>
|
818
|
+
* </div>
|
819
|
+
* </div
|
820
|
+
*/
|
821
|
+
// TODO(burdon): Implement custom panel (with icon buttons).
|
822
|
+
".cm-panels": {},
|
823
|
+
".cm-panel": {
|
824
|
+
fontFamily: fontBody,
|
825
|
+
backgroundColor: "var(--surface-bg)"
|
826
|
+
},
|
827
|
+
".cm-panel input, .cm-panel button, .cm-panel label": {
|
828
|
+
color: "var(--dx-subdued)",
|
829
|
+
fontFamily: fontBody,
|
830
|
+
fontSize: "14px",
|
831
|
+
all: "unset",
|
832
|
+
margin: "3px !important",
|
833
|
+
padding: "2px 6px !important",
|
834
|
+
outline: "1px solid transparent"
|
835
|
+
},
|
836
|
+
".cm-panel input, .cm-panel button": {
|
837
|
+
backgroundColor: "var(--dx-input)"
|
838
|
+
},
|
839
|
+
".cm-panel input:focus, .cm-panel button:focus": {
|
840
|
+
outline: "1px solid var(--dx-accentFocusIndicator)"
|
841
|
+
},
|
842
|
+
".cm-panel label": {
|
843
|
+
display: "inline-flex",
|
844
|
+
alignItems: "center",
|
845
|
+
cursor: "pointer"
|
846
|
+
},
|
847
|
+
".cm-panel input.cm-textfield": {},
|
848
|
+
".cm-panel input[type=checkbox]": {
|
849
|
+
width: "8px",
|
850
|
+
height: "8px",
|
851
|
+
marginRight: "6px !important",
|
852
|
+
padding: "2px !important",
|
853
|
+
color: "var(--dx-accentFocusIndicator)"
|
854
|
+
},
|
855
|
+
".cm-panel button": {
|
856
|
+
"&:hover": {
|
857
|
+
backgroundColor: "var(--dx-accentSurfaceHover) !important"
|
477
858
|
},
|
478
|
-
|
479
|
-
|
480
|
-
return match(tr.state);
|
481
|
-
}
|
482
|
-
return value;
|
859
|
+
"&:active": {
|
860
|
+
backgroundColor: "var(--dx-accentSurfaceHover)"
|
483
861
|
}
|
484
|
-
}
|
485
|
-
|
486
|
-
|
487
|
-
|
488
|
-
|
489
|
-
], (state) => {
|
490
|
-
const annotations2 = state.field(annotationsState);
|
491
|
-
const decorations = annotations2.map((annotation) => {
|
492
|
-
const range = Cursor.getRangeFromCursor(state, annotation.cursor);
|
493
|
-
return range && annotationMark.range(range.from, range.to);
|
494
|
-
}).filter(import_util.isNotFalsy);
|
495
|
-
return import_view2.Decoration.set(decorations);
|
496
|
-
}),
|
497
|
-
styles
|
498
|
-
];
|
862
|
+
},
|
863
|
+
".cm-panel.cm-search": {
|
864
|
+
padding: "4px",
|
865
|
+
borderTop: "1px solid var(--dx-separator)"
|
866
|
+
}
|
499
867
|
};
|
500
|
-
var
|
501
|
-
|
502
|
-
|
503
|
-
|
504
|
-
|
868
|
+
var margin = "!mt-[1rem]";
|
869
|
+
var editorContent = (0, import_react_ui_theme3.mx)(margin, "!mli-auto w-full max-w-[min(50rem,100%-2rem)]");
|
870
|
+
var editorFullWidth = (0, import_react_ui_theme3.mx)(margin);
|
871
|
+
var editorWithToolbarLayout = "grid grid-cols-1 grid-rows-[min-content_1fr] data-[toolbar=disabled]:grid-rows-[1fr] justify-center content-start overflow-hidden";
|
872
|
+
var editorGutter = import_view2.EditorView.theme({
|
873
|
+
// Match margin from content.
|
874
|
+
".cm-gutters": {
|
875
|
+
marginTop: "16px",
|
876
|
+
paddingRight: "1rem"
|
505
877
|
}
|
506
878
|
});
|
507
|
-
var
|
508
|
-
|
509
|
-
|
510
|
-
|
511
|
-
|
512
|
-
|
513
|
-
|
514
|
-
|
515
|
-
|
516
|
-
|
517
|
-
|
518
|
-
|
519
|
-
|
879
|
+
var editorMonospace = import_view2.EditorView.theme({
|
880
|
+
".cm-content": {
|
881
|
+
fontFamily: fontMono
|
882
|
+
}
|
883
|
+
});
|
884
|
+
var singleValueFacet = (defaultValue) => import_state3.Facet.define({
|
885
|
+
// Called immediately.
|
886
|
+
combine: (providers) => {
|
887
|
+
return providers[0] ?? defaultValue;
|
888
|
+
}
|
889
|
+
});
|
890
|
+
var overlap = (a, b) => a.from <= b.to && a.to >= b.from;
|
891
|
+
var defaultCursorConverter = {
|
892
|
+
toCursor: (position) => position.toString(),
|
893
|
+
fromCursor: (cursor) => parseInt(cursor)
|
894
|
+
};
|
895
|
+
var Cursor = class _Cursor {
|
896
|
+
static {
|
897
|
+
this.converter = singleValueFacet(defaultCursorConverter);
|
898
|
+
}
|
899
|
+
static {
|
900
|
+
this.getCursorFromRange = (state, range) => {
|
901
|
+
const cursorConverter2 = state.facet(_Cursor.converter);
|
902
|
+
const from = cursorConverter2.toCursor(range.from);
|
903
|
+
const to = cursorConverter2.toCursor(range.to, -1);
|
904
|
+
return [
|
905
|
+
from,
|
906
|
+
to
|
907
|
+
].join(":");
|
908
|
+
};
|
909
|
+
}
|
910
|
+
static {
|
911
|
+
this.getRangeFromCursor = (state, cursor) => {
|
912
|
+
const cursorConverter2 = state.facet(_Cursor.converter);
|
913
|
+
const parts = cursor.split(":");
|
914
|
+
const from = cursorConverter2.fromCursor(parts[0]);
|
915
|
+
const to = cursorConverter2.fromCursor(parts[1]);
|
916
|
+
return from !== void 0 && to !== void 0 ? {
|
917
|
+
from,
|
918
|
+
to
|
919
|
+
} : void 0;
|
920
|
+
};
|
921
|
+
}
|
922
|
+
};
|
923
|
+
var __dxlog_file = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/util/debug.ts";
|
924
|
+
var wrapWithCatch = (fn) => {
|
925
|
+
return (...args) => {
|
926
|
+
try {
|
927
|
+
return fn(...args);
|
928
|
+
} catch (err) {
|
929
|
+
import_log.log.catch(err, void 0, {
|
930
|
+
F: __dxlog_file,
|
931
|
+
L: 15,
|
932
|
+
S: void 0,
|
933
|
+
C: (f, a) => f(...a)
|
934
|
+
});
|
935
|
+
}
|
936
|
+
};
|
937
|
+
};
|
938
|
+
var callbackWrapper = (fn) => (...args) => {
|
939
|
+
try {
|
940
|
+
return fn(...args);
|
941
|
+
} catch (err) {
|
942
|
+
import_log.log.catch(err, void 0, {
|
943
|
+
F: __dxlog_file,
|
944
|
+
L: 29,
|
945
|
+
S: void 0,
|
946
|
+
C: (f, a) => f(...a)
|
947
|
+
});
|
948
|
+
}
|
949
|
+
};
|
950
|
+
var debugDispatcher = (trs, view) => {
|
951
|
+
logChanges(trs);
|
952
|
+
view.update(trs);
|
953
|
+
};
|
954
|
+
var logChanges = (trs) => {
|
955
|
+
const changes = trs.flatMap((tr) => {
|
956
|
+
if (tr.changes.empty) {
|
957
|
+
return void 0;
|
958
|
+
}
|
959
|
+
const changes2 = [];
|
960
|
+
tr.changes.iterChanges((fromA, toA, fromB, toB, inserted) => changes2.push(JSON.stringify({
|
961
|
+
fromA,
|
962
|
+
toA,
|
963
|
+
fromB,
|
964
|
+
toB,
|
965
|
+
inserted: inserted.toString()
|
966
|
+
})));
|
967
|
+
return changes2;
|
968
|
+
}).filter(Boolean);
|
969
|
+
if (changes.length) {
|
970
|
+
import_log.log.info("changes", {
|
971
|
+
changes
|
972
|
+
}, {
|
973
|
+
F: __dxlog_file,
|
974
|
+
L: 62,
|
975
|
+
S: void 0,
|
976
|
+
C: (f, a) => f(...a)
|
977
|
+
});
|
978
|
+
}
|
979
|
+
};
|
980
|
+
var flattenRect = (rect, left) => {
|
981
|
+
const x = left ? rect.left : rect.right;
|
982
|
+
return {
|
983
|
+
left: x,
|
984
|
+
right: x,
|
985
|
+
top: rect.top,
|
986
|
+
bottom: rect.bottom
|
987
|
+
};
|
988
|
+
};
|
989
|
+
var scratchRange;
|
990
|
+
var textRange = (node, from, to = from) => {
|
991
|
+
const range = scratchRange || (scratchRange = document.createRange());
|
992
|
+
range.setEnd(node, to);
|
993
|
+
range.setStart(node, from);
|
994
|
+
return range;
|
995
|
+
};
|
996
|
+
var clientRectsFor = (dom) => {
|
997
|
+
if (dom.nodeType === 3) {
|
998
|
+
return textRange(dom, 0, dom.nodeValue.length).getClientRects();
|
999
|
+
} else if (dom.nodeType === 1) {
|
1000
|
+
return dom.getClientRects();
|
1001
|
+
} else {
|
1002
|
+
return [];
|
1003
|
+
}
|
1004
|
+
};
|
1005
|
+
var createElement = (tag, options, children) => {
|
1006
|
+
const el = document.createElement(tag);
|
1007
|
+
if (options?.className) {
|
1008
|
+
el.className = options.className;
|
1009
|
+
}
|
1010
|
+
if (children) {
|
1011
|
+
el.append(...Array.isArray(children) ? children : [
|
1012
|
+
children
|
1013
|
+
]);
|
1014
|
+
}
|
1015
|
+
return el;
|
1016
|
+
};
|
1017
|
+
var renderRoot = (root, node) => {
|
1018
|
+
(0, import_client.createRoot)(root).render(/* @__PURE__ */ import_react3.default.createElement(import_react_ui2.ThemeProvider, {
|
1019
|
+
tx: import_react_ui_theme6.defaultTx
|
1020
|
+
}, node));
|
1021
|
+
return root;
|
1022
|
+
};
|
1023
|
+
var annotationMark = import_view3.Decoration.mark({
|
1024
|
+
class: "cm-annotation"
|
1025
|
+
});
|
1026
|
+
var annotations = (options = {}) => {
|
1027
|
+
const match = (state) => {
|
1028
|
+
const annotations2 = [];
|
1029
|
+
const text = state.doc.toString();
|
1030
|
+
if (options.match) {
|
1031
|
+
const matches = text.matchAll(options.match);
|
1032
|
+
for (const match2 of matches) {
|
1033
|
+
const from = match2.index;
|
1034
|
+
const to = from + match2[0].length;
|
1035
|
+
const cursor = Cursor.getCursorFromRange(state, {
|
1036
|
+
from,
|
1037
|
+
to
|
1038
|
+
});
|
1039
|
+
annotations2.push({
|
1040
|
+
cursor
|
1041
|
+
});
|
1042
|
+
}
|
1043
|
+
}
|
1044
|
+
return annotations2;
|
1045
|
+
};
|
1046
|
+
const annotationsState = import_state2.StateField.define({
|
1047
|
+
create: (state) => {
|
1048
|
+
return match(state);
|
1049
|
+
},
|
1050
|
+
update: (value, tr) => {
|
1051
|
+
if (!tr.changes.empty) {
|
1052
|
+
return match(tr.state);
|
1053
|
+
}
|
1054
|
+
return value;
|
1055
|
+
}
|
1056
|
+
});
|
1057
|
+
return [
|
1058
|
+
annotationsState,
|
1059
|
+
import_view3.EditorView.decorations.compute([
|
1060
|
+
annotationsState
|
1061
|
+
], (state) => {
|
1062
|
+
const annotations2 = state.field(annotationsState);
|
1063
|
+
const decorations = annotations2.map((annotation) => {
|
1064
|
+
const range = Cursor.getRangeFromCursor(state, annotation.cursor);
|
1065
|
+
return range && annotationMark.range(range.from, range.to);
|
1066
|
+
}).filter(import_util.isNotFalsy);
|
1067
|
+
return import_view3.Decoration.set(decorations);
|
1068
|
+
}),
|
1069
|
+
styles
|
1070
|
+
];
|
1071
|
+
};
|
1072
|
+
var styles = import_view3.EditorView.theme({
|
1073
|
+
".cm-annotation": {
|
1074
|
+
textDecoration: "underline",
|
1075
|
+
textDecorationStyle: "wavy",
|
1076
|
+
textDecorationColor: "var(--dx-error)"
|
1077
|
+
}
|
1078
|
+
});
|
1079
|
+
var autocomplete = ({ debug, activateOnTyping, override, onSearch } = {}) => {
|
1080
|
+
const extensions = [
|
1081
|
+
// https://codemirror.net/docs/ref/#view.keymap
|
1082
|
+
// https://discuss.codemirror.net/t/how-can-i-replace-the-default-autocompletion-keymap-v6/3322
|
1083
|
+
// TODO(burdon): Set custom keymap.
|
1084
|
+
import_view4.keymap.of(import_autocomplete.completionKeymap),
|
1085
|
+
// https://codemirror.net/examples/autocompletion
|
1086
|
+
// https://codemirror.net/docs/ref/#autocomplete.autocompletion
|
1087
|
+
(0, import_autocomplete.autocompletion)({
|
1088
|
+
activateOnTyping,
|
1089
|
+
override,
|
1090
|
+
closeOnBlur: !debug,
|
1091
|
+
tooltipClass: () => "shadow rounded"
|
520
1092
|
})
|
521
1093
|
];
|
522
1094
|
if (onSearch) {
|
@@ -787,7 +1359,7 @@ var automerge = (accessor) => {
|
|
787
1359
|
// Track heads.
|
788
1360
|
syncState,
|
789
1361
|
// Reconcile external updates.
|
790
|
-
|
1362
|
+
import_view5.ViewPlugin.fromClass(class {
|
791
1363
|
constructor(_view) {
|
792
1364
|
this._view = _view;
|
793
1365
|
this._handleChange = () => {
|
@@ -800,7 +1372,7 @@ var automerge = (accessor) => {
|
|
800
1372
|
}
|
801
1373
|
}),
|
802
1374
|
// Reconcile local updates.
|
803
|
-
|
1375
|
+
import_view5.EditorView.updateListener.of(({ view, changes }) => {
|
804
1376
|
if (!changes.empty) {
|
805
1377
|
syncer.reconcile(view, true);
|
806
1378
|
}
|
@@ -823,7 +1395,7 @@ var RemoteSelectionChangedAnnotation = import_state7.Annotation.define();
|
|
823
1395
|
var awareness = (provider = dummyProvider) => {
|
824
1396
|
return [
|
825
1397
|
awarenessProvider.of(provider),
|
826
|
-
|
1398
|
+
import_view6.ViewPlugin.fromClass(RemoteSelectionsDecorator, {
|
827
1399
|
decorations: (value) => value.decorations
|
828
1400
|
}),
|
829
1401
|
styles2
|
@@ -887,7 +1459,7 @@ var RemoteSelectionsDecorator = class {
|
|
887
1459
|
decorations.push({
|
888
1460
|
from: start,
|
889
1461
|
to: end,
|
890
|
-
value:
|
1462
|
+
value: import_view6.Decoration.mark({
|
891
1463
|
attributes: {
|
892
1464
|
style: `background-color: ${lightColor}`
|
893
1465
|
},
|
@@ -898,7 +1470,7 @@ var RemoteSelectionsDecorator = class {
|
|
898
1470
|
decorations.push({
|
899
1471
|
from: start,
|
900
1472
|
to: startLine.from + startLine.length,
|
901
|
-
value:
|
1473
|
+
value: import_view6.Decoration.mark({
|
902
1474
|
attributes: {
|
903
1475
|
style: `background-color: ${lightColor}`
|
904
1476
|
},
|
@@ -908,7 +1480,7 @@ var RemoteSelectionsDecorator = class {
|
|
908
1480
|
decorations.push({
|
909
1481
|
from: endLine.from,
|
910
1482
|
to: end,
|
911
|
-
value:
|
1483
|
+
value: import_view6.Decoration.mark({
|
912
1484
|
attributes: {
|
913
1485
|
style: `background-color: ${lightColor}`
|
914
1486
|
},
|
@@ -920,7 +1492,7 @@ var RemoteSelectionsDecorator = class {
|
|
920
1492
|
decorations.push({
|
921
1493
|
from: linePos,
|
922
1494
|
to: linePos,
|
923
|
-
value:
|
1495
|
+
value: import_view6.Decoration.line({
|
924
1496
|
attributes: {
|
925
1497
|
style: `background-color: ${lightColor}`,
|
926
1498
|
class: "cm-collab-selectionLine"
|
@@ -932,17 +1504,17 @@ var RemoteSelectionsDecorator = class {
|
|
932
1504
|
decorations.push({
|
933
1505
|
from: head,
|
934
1506
|
to: head,
|
935
|
-
value:
|
1507
|
+
value: import_view6.Decoration.widget({
|
936
1508
|
side: head - anchor > 0 ? -1 : 1,
|
937
1509
|
block: false,
|
938
1510
|
widget: new RemoteCaretWidget(state.info.displayName ?? "Anonymous", darkColor)
|
939
1511
|
})
|
940
1512
|
});
|
941
1513
|
}
|
942
|
-
this.decorations =
|
1514
|
+
this.decorations = import_view6.Decoration.set(decorations, true);
|
943
1515
|
}
|
944
1516
|
};
|
945
|
-
var RemoteCaretWidget = class extends
|
1517
|
+
var RemoteCaretWidget = class extends import_view6.WidgetType {
|
946
1518
|
constructor(_name, _color) {
|
947
1519
|
super();
|
948
1520
|
this._name = _name;
|
@@ -978,7 +1550,7 @@ var RemoteCaretWidget = class extends import_view5.WidgetType {
|
|
978
1550
|
return true;
|
979
1551
|
}
|
980
1552
|
};
|
981
|
-
var styles2 =
|
1553
|
+
var styles2 = import_view6.EditorView.theme({
|
982
1554
|
".cm-collab-selection": {},
|
983
1555
|
".cm-collab-selectionLine": {
|
984
1556
|
padding: 0,
|
@@ -1181,12 +1753,12 @@ var blast = (options = defaultOptions) => {
|
|
1181
1753
|
};
|
1182
1754
|
return [
|
1183
1755
|
// Cursor moved.
|
1184
|
-
|
1756
|
+
import_view7.EditorView.updateListener.of((update2) => {
|
1185
1757
|
if (blaster?.node !== update2.view.scrollDOM) {
|
1186
1758
|
if (blaster) {
|
1187
1759
|
blaster.destroy();
|
1188
1760
|
}
|
1189
|
-
blaster = new Blaster(update2.view.scrollDOM, (0,
|
1761
|
+
blaster = new Blaster(update2.view.scrollDOM, (0, import_lodash2.default)({
|
1190
1762
|
particleGravity: 0.2,
|
1191
1763
|
particleShrinkRate: 0.995,
|
1192
1764
|
color: () => [
|
@@ -1212,7 +1784,7 @@ var blast = (options = defaultOptions) => {
|
|
1212
1784
|
}
|
1213
1785
|
}
|
1214
1786
|
}),
|
1215
|
-
|
1787
|
+
import_view7.keymap.of([
|
1216
1788
|
{
|
1217
1789
|
any: (_, event) => {
|
1218
1790
|
if (blaster) {
|
@@ -1498,7 +2070,7 @@ var commandState = import_state9.StateField.define({
|
|
1498
2070
|
return state;
|
1499
2071
|
},
|
1500
2072
|
provide: (field) => [
|
1501
|
-
|
2073
|
+
import_view10.showTooltip.from(field, (value) => value.tooltip ?? null)
|
1502
2074
|
]
|
1503
2075
|
});
|
1504
2076
|
var openEffect = import_state9.StateEffect.define();
|
@@ -1538,7 +2110,7 @@ var commandKeyBindings = [
|
|
1538
2110
|
run: closeCommand
|
1539
2111
|
}
|
1540
2112
|
];
|
1541
|
-
var CommandHint = class extends
|
2113
|
+
var CommandHint = class extends import_view9.WidgetType {
|
1542
2114
|
constructor(content) {
|
1543
2115
|
super();
|
1544
2116
|
this.content = content;
|
@@ -1577,9 +2149,9 @@ var CommandHint = class extends import_view8.WidgetType {
|
|
1577
2149
|
return false;
|
1578
2150
|
}
|
1579
2151
|
};
|
1580
|
-
var hintViewPlugin = ({ onHint }) =>
|
2152
|
+
var hintViewPlugin = ({ onHint }) => import_view9.ViewPlugin.fromClass(class {
|
1581
2153
|
constructor() {
|
1582
|
-
this.deco =
|
2154
|
+
this.deco = import_view9.Decoration.none;
|
1583
2155
|
}
|
1584
2156
|
update(update2) {
|
1585
2157
|
const builder = new import_state8.RangeSetBuilder();
|
@@ -1590,7 +2162,7 @@ var hintViewPlugin = ({ onHint }) => import_view8.ViewPlugin.fromClass(class {
|
|
1590
2162
|
if (selection.from === selection.to && line.from === line.to) {
|
1591
2163
|
const hint = onHint();
|
1592
2164
|
if (hint) {
|
1593
|
-
builder.add(selection.from, selection.to,
|
2165
|
+
builder.add(selection.from, selection.to, import_view9.Decoration.widget({
|
1594
2166
|
widget: new CommandHint(hint)
|
1595
2167
|
}));
|
1596
2168
|
}
|
@@ -1600,16 +2172,16 @@ var hintViewPlugin = ({ onHint }) => import_view8.ViewPlugin.fromClass(class {
|
|
1600
2172
|
}
|
1601
2173
|
}, {
|
1602
2174
|
provide: (plugin) => [
|
1603
|
-
|
2175
|
+
import_view9.EditorView.decorations.of((view) => view.plugin(plugin)?.deco ?? import_view9.Decoration.none)
|
1604
2176
|
]
|
1605
2177
|
});
|
1606
2178
|
var command = (options) => {
|
1607
2179
|
return [
|
1608
2180
|
commandConfig.of(options),
|
1609
2181
|
commandState,
|
1610
|
-
|
2182
|
+
import_view8.keymap.of(commandKeyBindings),
|
1611
2183
|
hintViewPlugin(options),
|
1612
|
-
|
2184
|
+
import_view8.EditorView.focusChangeEffect.of((_, focusing) => {
|
1613
2185
|
return focusing ? closeEffect.of(null) : null;
|
1614
2186
|
})
|
1615
2187
|
];
|
@@ -1621,7 +2193,7 @@ var createEditorStateTransaction = ({ scrollTo, selection }) => {
|
|
1621
2193
|
return {
|
1622
2194
|
selection,
|
1623
2195
|
scrollIntoView: !scrollTo,
|
1624
|
-
effects: scrollTo ?
|
2196
|
+
effects: scrollTo ? import_view12.EditorView.scrollIntoView(scrollTo, {
|
1625
2197
|
yMargin: 96
|
1626
2198
|
}) : void 0,
|
1627
2199
|
annotations: import_state11.Transaction.userEvent.of(stateRestoreAnnotation)
|
@@ -1663,7 +2235,7 @@ var selectionState = ({ getState, setState } = {}) => {
|
|
1663
2235
|
// setStateDebounced(id, {});
|
1664
2236
|
// },
|
1665
2237
|
// }),
|
1666
|
-
|
2238
|
+
import_view12.EditorView.updateListener.of(({ view, transactions }) => {
|
1667
2239
|
const id = view.state.facet(documentId);
|
1668
2240
|
if (!id || transactions.some((tr) => tr.isUserEvent(stateRestoreAnnotation))) {
|
1669
2241
|
return;
|
@@ -1686,7 +2258,7 @@ var selectionState = ({ getState, setState } = {}) => {
|
|
1686
2258
|
}
|
1687
2259
|
}
|
1688
2260
|
}),
|
1689
|
-
getState &&
|
2261
|
+
getState && import_view12.keymap.of([
|
1690
2262
|
{
|
1691
2263
|
key: "ctrl-r",
|
1692
2264
|
run: (view) => {
|
@@ -1729,7 +2301,7 @@ var commentsState = import_state10.StateField.define({
|
|
1729
2301
|
comment,
|
1730
2302
|
range
|
1731
2303
|
};
|
1732
|
-
}).filter(import_util2.
|
2304
|
+
}).filter(import_util2.isNonNullable);
|
1733
2305
|
return {
|
1734
2306
|
...value,
|
1735
2307
|
comments: commentStates
|
@@ -1742,7 +2314,7 @@ var commentsState = import_state10.StateField.define({
|
|
1742
2314
|
return value;
|
1743
2315
|
}
|
1744
2316
|
});
|
1745
|
-
var styles3 =
|
2317
|
+
var styles3 = import_view11.EditorView.theme({
|
1746
2318
|
".cm-comment, .cm-comment-current": {
|
1747
2319
|
margin: "0 -3px",
|
1748
2320
|
padding: "3px",
|
@@ -1755,23 +2327,23 @@ var styles3 = import_view10.EditorView.theme({
|
|
1755
2327
|
textDecoration: "underline"
|
1756
2328
|
}
|
1757
2329
|
});
|
1758
|
-
var createCommentMark = (id, isCurrent) =>
|
2330
|
+
var createCommentMark = (id, isCurrent) => import_view11.Decoration.mark({
|
1759
2331
|
class: isCurrent ? "cm-comment-current" : "cm-comment",
|
1760
2332
|
attributes: {
|
1761
2333
|
"data-testid": "cm-comment",
|
1762
2334
|
"data-comment-id": id
|
1763
2335
|
}
|
1764
2336
|
});
|
1765
|
-
var commentsDecorations =
|
2337
|
+
var commentsDecorations = import_view11.EditorView.decorations.compute([
|
1766
2338
|
commentsState
|
1767
2339
|
], (state) => {
|
1768
2340
|
const { selection: { current }, comments: comments2 } = state.field(commentsState);
|
1769
|
-
const decorations = (0,
|
2341
|
+
const decorations = (0, import_lodash3.default)(comments2 ?? [], (range) => range.range.from)?.flatMap((comment) => {
|
1770
2342
|
const range = comment.range;
|
1771
2343
|
if (!range) {
|
1772
2344
|
import_log4.log.warn("Invalid range:", range, {
|
1773
2345
|
F: __dxlog_file7,
|
1774
|
-
L:
|
2346
|
+
L: 144,
|
1775
2347
|
S: void 0,
|
1776
2348
|
C: (f, a) => f(...a)
|
1777
2349
|
});
|
@@ -1781,11 +2353,11 @@ var commentsDecorations = import_view10.EditorView.decorations.compute([
|
|
1781
2353
|
}
|
1782
2354
|
const mark = createCommentMark(comment.comment.id, comment.comment.id === current);
|
1783
2355
|
return mark.range(range.from, range.to);
|
1784
|
-
}).filter(import_util2.
|
1785
|
-
return
|
2356
|
+
}).filter(import_util2.isNonNullable);
|
2357
|
+
return import_view11.Decoration.set(decorations);
|
1786
2358
|
});
|
1787
2359
|
var commentClickedEffect = import_state10.StateEffect.define();
|
1788
|
-
var handleCommentClick =
|
2360
|
+
var handleCommentClick = import_view11.EditorView.domEventHandlers({
|
1789
2361
|
click: (event, view) => {
|
1790
2362
|
let target = event.target;
|
1791
2363
|
const editorRoot = view.dom;
|
@@ -1824,7 +2396,7 @@ var trackPastedComments = (onUpdate) => {
|
|
1824
2396
|
}
|
1825
2397
|
};
|
1826
2398
|
return [
|
1827
|
-
|
2399
|
+
import_view11.EditorView.domEventHandlers({
|
1828
2400
|
cut: handleTrack,
|
1829
2401
|
copy: handleTrack
|
1830
2402
|
}),
|
@@ -1846,7 +2418,7 @@ var trackPastedComments = (onUpdate) => {
|
|
1846
2418
|
return effects;
|
1847
2419
|
}),
|
1848
2420
|
// Handle paste or the undo of comment deletion.
|
1849
|
-
|
2421
|
+
import_view11.EditorView.updateListener.of((update2) => {
|
1850
2422
|
const restore = [];
|
1851
2423
|
for (let i = 0; i < update2.transactions.length; i++) {
|
1852
2424
|
const tr = update2.transactions[i];
|
@@ -1905,7 +2477,7 @@ var mapTrackedComment = (comment, changes) => ({
|
|
1905
2477
|
var restoreCommentEffect = import_state10.StateEffect.define({
|
1906
2478
|
map: mapTrackedComment
|
1907
2479
|
});
|
1908
|
-
var
|
2480
|
+
var createComment2 = (view) => {
|
1909
2481
|
const options = view.state.facet(optionsFacet);
|
1910
2482
|
const { from, to } = view.state.selection.main;
|
1911
2483
|
if (from === to) {
|
@@ -1947,17 +2519,17 @@ var comments = (options = {}) => {
|
|
1947
2519
|
//
|
1948
2520
|
// Keymap.
|
1949
2521
|
//
|
1950
|
-
options.onCreate &&
|
2522
|
+
options.onCreate && import_view11.keymap.of([
|
1951
2523
|
{
|
1952
2524
|
key: shortcut,
|
1953
|
-
run: callbackWrapper(
|
2525
|
+
run: callbackWrapper(createComment2)
|
1954
2526
|
}
|
1955
2527
|
]),
|
1956
2528
|
//
|
1957
2529
|
// Hover tooltip (for key shortcut hints, etc.)
|
1958
2530
|
// TODO(burdon): Factor out to generic hints extension for current selection/line.
|
1959
2531
|
//
|
1960
|
-
options.onHover && (0,
|
2532
|
+
options.onHover && (0, import_view11.hoverTooltip)((view, pos) => {
|
1961
2533
|
const selection = view.state.selection.main;
|
1962
2534
|
if (selection && pos >= selection.from && pos <= selection.to) {
|
1963
2535
|
return {
|
@@ -1986,7 +2558,7 @@ var comments = (options = {}) => {
|
|
1986
2558
|
//
|
1987
2559
|
// Track deleted ranges and update ranges for decorations.
|
1988
2560
|
//
|
1989
|
-
|
2561
|
+
import_view11.EditorView.updateListener.of(({ view, state, changes }) => {
|
1990
2562
|
let mod = false;
|
1991
2563
|
const { comments: comments2, ...value } = state.field(commentsState);
|
1992
2564
|
changes.iterChanges((from, to, from2, to2) => {
|
@@ -2018,7 +2590,7 @@ var comments = (options = {}) => {
|
|
2018
2590
|
//
|
2019
2591
|
// Track selection/proximity.
|
2020
2592
|
//
|
2021
|
-
|
2593
|
+
import_view11.EditorView.updateListener.of(({ view, state }) => {
|
2022
2594
|
let min = Infinity;
|
2023
2595
|
const { selection: { current, closest }, comments: comments2 } = state.field(commentsState);
|
2024
2596
|
const { head } = state.selection.main;
|
@@ -2049,413 +2621,186 @@ var comments = (options = {}) => {
|
|
2049
2621
|
location: view.coordsAtPos(range.from)
|
2050
2622
|
}))
|
2051
2623
|
});
|
2052
|
-
}
|
2053
|
-
}),
|
2054
|
-
options.onUpdate && trackPastedComments(options.onUpdate)
|
2055
|
-
].filter(import_util2.
|
2056
|
-
};
|
2057
|
-
var scrollThreadIntoView = (view, id, center = true) => {
|
2058
|
-
const comment = view.state.field(commentsState).comments.find((range2) => range2.comment.id === id);
|
2059
|
-
if (!comment?.comment.cursor) {
|
2060
|
-
return;
|
2061
|
-
}
|
2062
|
-
const range = Cursor.getRangeFromCursor(view.state, comment.comment.cursor);
|
2063
|
-
if (range) {
|
2064
|
-
const currentSelection = view.state.selection.main;
|
2065
|
-
const currentScrollPosition = view.scrollDOM.scrollTop;
|
2066
|
-
const targetScrollPosition = view.coordsAtPos(range.from)?.top;
|
2067
|
-
const needsScroll = targetScrollPosition !== void 0 && (targetScrollPosition < currentScrollPosition || targetScrollPosition > currentScrollPosition + view.scrollDOM.clientHeight);
|
2068
|
-
const needsSelectionUpdate = currentSelection.from !== range.from || currentSelection.to !== range.from;
|
2069
|
-
if (needsScroll || needsSelectionUpdate) {
|
2070
|
-
view.dispatch({
|
2071
|
-
selection: needsSelectionUpdate ? {
|
2072
|
-
anchor: range.from
|
2073
|
-
} : void 0,
|
2074
|
-
effects: [
|
2075
|
-
needsScroll ?
|
2076
|
-
y: "center"
|
2077
|
-
} : void 0) : [],
|
2078
|
-
needsSelectionUpdate ? setSelection.of({
|
2079
|
-
current: id
|
2080
|
-
}) : []
|
2081
|
-
].flat()
|
2082
|
-
});
|
2083
|
-
}
|
2084
|
-
}
|
2085
|
-
};
|
2086
|
-
var selectionOverlapsComment = (state) => {
|
2087
|
-
const commentState = state.field(commentsState, false);
|
2088
|
-
if (commentState === void 0) {
|
2089
|
-
return false;
|
2090
|
-
}
|
2091
|
-
const { selection } = state;
|
2092
|
-
for (const range of selection.ranges) {
|
2093
|
-
if (commentState.comments.some(({ range: commentRange }) => overlap(commentRange, range))) {
|
2094
|
-
return true;
|
2095
|
-
}
|
2096
|
-
}
|
2097
|
-
return false;
|
2098
|
-
};
|
2099
|
-
var hasActiveSelection = (state) => {
|
2100
|
-
return state.selection.ranges.some((range) => !range.empty);
|
2101
|
-
};
|
2102
|
-
var ExternalCommentSync = class {
|
2103
|
-
constructor(view, id, subscribe, getComments) {
|
2104
|
-
this.destroy = () => {
|
2105
|
-
this.unsubscribe();
|
2106
|
-
};
|
2107
|
-
const updateComments = () => {
|
2108
|
-
const comments2 = getComments();
|
2109
|
-
if (id === view.state.facet(documentId)) {
|
2110
|
-
queueMicrotask(() => view.dispatch({
|
2111
|
-
effects: setComments.of({
|
2112
|
-
id,
|
2113
|
-
comments: comments2
|
2114
|
-
})
|
2115
|
-
}));
|
2116
|
-
}
|
2117
|
-
};
|
2118
|
-
this.unsubscribe = subscribe(updateComments);
|
2119
|
-
}
|
2120
|
-
};
|
2121
|
-
var createExternalCommentSync = (id, subscribe, getComments) =>
|
2122
|
-
constructor(view) {
|
2123
|
-
return new ExternalCommentSync(view, id, subscribe, getComments);
|
2124
|
-
}
|
2125
|
-
});
|
2126
|
-
var useCommentState = () => {
|
2127
|
-
|
2128
|
-
|
2129
|
-
|
2130
|
-
|
2131
|
-
|
2132
|
-
|
2133
|
-
|
2134
|
-
|
2135
|
-
|
2136
|
-
|
2137
|
-
|
2138
|
-
|
2139
|
-
|
2140
|
-
|
2141
|
-
|
2142
|
-
|
2143
|
-
|
2144
|
-
|
2145
|
-
|
2146
|
-
|
2147
|
-
if (id === view.state.facet(documentId)) {
|
2148
|
-
view.dispatch({
|
2149
|
-
effects: setComments.of({
|
2150
|
-
id,
|
2151
|
-
comments: comments2 ?? []
|
2152
|
-
})
|
2153
|
-
});
|
2154
|
-
}
|
2155
|
-
}
|
2156
|
-
});
|
2157
|
-
};
|
2158
|
-
var useCommentClickListener = (onCommentClick) => {
|
2159
|
-
return (0, import_react4.useMemo)(() => import_view10.EditorView.updateListener.of((update2) => {
|
2160
|
-
update2.transactions.forEach((transaction) => {
|
2161
|
-
transaction.effects.forEach((effect) => {
|
2162
|
-
if (effect.is(commentClickedEffect)) {
|
2163
|
-
onCommentClick(effect.value);
|
2164
|
-
}
|
2165
|
-
});
|
2166
|
-
});
|
2167
|
-
}), [
|
2168
|
-
onCommentClick
|
2169
|
-
]);
|
2170
|
-
};
|
2171
|
-
var debugNodeLogger = (log8 = console.log) => {
|
2172
|
-
const logTokens = (state) => (0, import_language.syntaxTree)(state).iterate({
|
2173
|
-
enter: (node) => log8(node.type)
|
2174
|
-
});
|
2175
|
-
return import_state12.StateField.define({
|
2176
|
-
create: (state) => logTokens(state),
|
2177
|
-
update: (_, tr) => logTokens(tr.state)
|
2178
|
-
});
|
2179
|
-
};
|
2180
|
-
var styles4 = import_view12.EditorView.theme({
|
2181
|
-
".cm-dropCursor": {
|
2182
|
-
borderLeft: "2px solid var(--dx-accentText)",
|
2183
|
-
color: "var(--dx-accentText)",
|
2184
|
-
padding: "0 4px"
|
2185
|
-
},
|
2186
|
-
".cm-dropCursor:after": {
|
2187
|
-
content: '"\u2190"'
|
2188
|
-
}
|
2189
|
-
});
|
2190
|
-
var dropFile = (options = {}) => {
|
2191
|
-
return [
|
2192
|
-
styles4,
|
2193
|
-
(0, import_view12.dropCursor)(),
|
2194
|
-
import_view12.EditorView.domEventHandlers({
|
2195
|
-
drop: (event, view) => {
|
2196
|
-
event.preventDefault();
|
2197
|
-
const files = event.dataTransfer?.files;
|
2198
|
-
const pos = view.posAtCoords(event);
|
2199
|
-
if (files?.length && pos !== null) {
|
2200
|
-
view.dispatch({
|
2201
|
-
selection: {
|
2202
|
-
anchor: pos
|
2203
|
-
}
|
2204
|
-
});
|
2205
|
-
options.onDrop?.(view, {
|
2206
|
-
files
|
2207
|
-
});
|
2208
|
-
}
|
2209
|
-
}
|
2210
|
-
})
|
2211
|
-
];
|
2212
|
-
};
|
2213
|
-
var focusEffect = import_state14.StateEffect.define();
|
2214
|
-
var focusField = import_state14.StateField.define({
|
2215
|
-
create: () => false,
|
2216
|
-
update: (value, tr) => {
|
2217
|
-
for (const effect of tr.effects) {
|
2218
|
-
if (effect.is(focusEffect)) {
|
2219
|
-
return effect.value;
|
2220
|
-
}
|
2221
|
-
}
|
2222
|
-
return value;
|
2223
|
-
}
|
2224
|
-
});
|
2225
|
-
var focus = [
|
2226
|
-
focusField,
|
2227
|
-
import_view14.EditorView.domEventHandlers({
|
2228
|
-
focus: (event, view) => {
|
2229
|
-
setTimeout(() => view.dispatch({
|
2230
|
-
effects: focusEffect.of(true)
|
2231
|
-
}));
|
2232
|
-
},
|
2233
|
-
blur: (event, view) => {
|
2234
|
-
setTimeout(() => view.dispatch({
|
2235
|
-
effects: focusEffect.of(false)
|
2236
|
-
}));
|
2237
|
-
}
|
2238
|
-
})
|
2239
|
-
];
|
2240
|
-
var headings = {
|
2241
|
-
1: "text-4xl",
|
2242
|
-
2: "text-3xl",
|
2243
|
-
3: "text-2xl",
|
2244
|
-
4: "text-xl",
|
2245
|
-
5: "text-lg",
|
2246
|
-
6: "text-md"
|
2247
|
-
};
|
2248
|
-
var theme = {
|
2249
|
-
code: "font-mono !no-underline text-neutral-700 dark:text-neutral-300",
|
2250
|
-
codeMark: "font-mono text-primary-500",
|
2251
|
-
mark: "opacity-50",
|
2252
|
-
heading: (level) => {
|
2253
|
-
return (0, import_react_ui_theme4.mx)(headings[level], "dark:text-primary-400");
|
2254
|
-
}
|
2255
|
-
};
|
2256
|
-
var getToken = (path, defaultValue) => {
|
2257
|
-
const value = (0, import_lodash5.default)(import_react_ui_theme5.tokens, path, defaultValue);
|
2258
|
-
return value?.toString() ?? "";
|
2259
|
-
};
|
2260
|
-
var fontBody = getToken("fontFamily.body");
|
2261
|
-
var fontMono = getToken("fontFamily.mono");
|
2262
|
-
var defaultTheme = {
|
2263
|
-
"&": {},
|
2264
|
-
"&.cm-focused": {
|
2265
|
-
outline: "none"
|
2266
|
-
},
|
2267
|
-
/**
|
2268
|
-
* Scroller
|
2269
|
-
*/
|
2270
|
-
".cm-scroller": {
|
2271
|
-
overflowY: "auto"
|
2272
|
-
},
|
2273
|
-
/**
|
2274
|
-
* Content
|
2275
|
-
* NOTE: Apply margins to content so that scrollbar is at the edge of the container.
|
2276
|
-
*/
|
2277
|
-
".cm-content": {
|
2278
|
-
padding: "unset",
|
2279
|
-
fontFamily: fontBody,
|
2280
|
-
// NOTE: Base font size (otherwise defined by HTML tag, which might be different for storybook).
|
2281
|
-
fontSize: "16px",
|
2282
|
-
lineHeight: 1.5,
|
2283
|
-
color: "unset"
|
2284
|
-
},
|
2285
|
-
/**
|
2286
|
-
* Gutters
|
2287
|
-
* NOTE: Gutters should have the same top margin as the content.
|
2288
|
-
* NOTE: They can't be transparent since the content needs to scroll below.
|
2289
|
-
*/
|
2290
|
-
".cm-gutters": {
|
2291
|
-
background: "var(--surface-bg)",
|
2292
|
-
borderRight: "none"
|
2293
|
-
},
|
2294
|
-
".cm-gutter": {},
|
2295
|
-
".cm-gutter.cm-lineNumbers .cm-gutterElement": {
|
2296
|
-
minWidth: "40px",
|
2297
|
-
alignContent: "center"
|
2298
|
-
},
|
2299
|
-
/**
|
2300
|
-
* Height is set to match the corresponding line.
|
2301
|
-
*/
|
2302
|
-
".cm-gutterElement": {
|
2303
|
-
alignItems: "center",
|
2304
|
-
fontSize: "16px"
|
2305
|
-
},
|
2306
|
-
/**
|
2307
|
-
* Line.
|
2308
|
-
*/
|
2309
|
-
".cm-line": {
|
2310
|
-
paddingInline: 0
|
2311
|
-
},
|
2312
|
-
".cm-activeLine": {
|
2313
|
-
background: "var(--dx-cmActiveLine)"
|
2314
|
-
},
|
2315
|
-
/**
|
2316
|
-
* Cursor (layer).
|
2317
|
-
*/
|
2318
|
-
".cm-cursor, .cm-dropCursor": {
|
2319
|
-
borderLeft: "2px solid var(--dx-cmCursor)"
|
2320
|
-
},
|
2321
|
-
".cm-placeholder": {
|
2322
|
-
color: "var(--dx-subdued)"
|
2323
|
-
},
|
2324
|
-
/**
|
2325
|
-
* Selection (layer).
|
2326
|
-
*/
|
2327
|
-
".cm-selectionBackground": {
|
2328
|
-
background: "var(--dx-cmSelection)"
|
2329
|
-
},
|
2330
|
-
/**
|
2331
|
-
* Search.
|
2332
|
-
* NOTE: Matches comment.
|
2333
|
-
*/
|
2334
|
-
".cm-searchMatch": {
|
2335
|
-
margin: "0 -3px",
|
2336
|
-
padding: "3px",
|
2337
|
-
borderRadius: "3px",
|
2338
|
-
background: "var(--dx-cmHighlightSurface)",
|
2339
|
-
color: "var(--dx-cmHighlight)"
|
2340
|
-
},
|
2341
|
-
".cm-searchMatch-selected": {
|
2342
|
-
textDecoration: "underline"
|
2343
|
-
},
|
2344
|
-
/**
|
2345
|
-
* Link.
|
2346
|
-
*/
|
2347
|
-
".cm-link": {
|
2348
|
-
textDecorationLine: "underline",
|
2349
|
-
textDecorationThickness: "1px",
|
2350
|
-
textUnderlineOffset: "2px",
|
2351
|
-
borderRadius: ".125rem"
|
2352
|
-
},
|
2353
|
-
".cm-link > span": {
|
2354
|
-
color: "var(--dx-accentText)"
|
2355
|
-
},
|
2356
|
-
/**
|
2357
|
-
* Tooltip.
|
2358
|
-
*/
|
2359
|
-
".cm-tooltip": {
|
2360
|
-
background: "var(--dx-base)"
|
2361
|
-
},
|
2362
|
-
".cm-tooltip-below": {},
|
2363
|
-
/**
|
2364
|
-
* Autocomplete.
|
2365
|
-
* https://github.com/codemirror/autocomplete/blob/main/src/completion.ts
|
2366
|
-
*/
|
2367
|
-
".cm-tooltip.cm-tooltip-autocomplete": {
|
2368
|
-
marginTop: "4px",
|
2369
|
-
marginLeft: "-3px"
|
2370
|
-
},
|
2371
|
-
".cm-tooltip.cm-tooltip-autocomplete > ul": {
|
2372
|
-
maxHeight: "20em"
|
2373
|
-
},
|
2374
|
-
".cm-tooltip.cm-tooltip-autocomplete > ul > li": {},
|
2375
|
-
".cm-tooltip.cm-tooltip-autocomplete > ul > li[aria-selected]": {},
|
2376
|
-
".cm-tooltip.cm-tooltip-autocomplete > ul > completion-section": {
|
2377
|
-
paddingLeft: "4px !important",
|
2378
|
-
borderBottom: "none !important",
|
2379
|
-
color: "var(--dx-accentText)"
|
2380
|
-
},
|
2381
|
-
".cm-tooltip.cm-completionInfo": {
|
2382
|
-
width: "360px !important",
|
2383
|
-
margin: "-10px 1px 0 1px",
|
2384
|
-
padding: "8px !important",
|
2385
|
-
borderColor: "var(--dx-separator)"
|
2386
|
-
},
|
2387
|
-
".cm-completionIcon": {
|
2388
|
-
display: "none"
|
2389
|
-
},
|
2390
|
-
".cm-completionLabel": {
|
2391
|
-
fontFamily: fontBody
|
2392
|
-
},
|
2393
|
-
".cm-completionMatchedText": {
|
2394
|
-
textDecoration: "none !important",
|
2395
|
-
opacity: 0.5
|
2396
|
-
},
|
2397
|
-
/**
|
2398
|
-
* Panels
|
2399
|
-
* https://github.com/codemirror/search/blob/main/src/search.ts#L745
|
2400
|
-
*
|
2401
|
-
* Find/replace panel.
|
2402
|
-
* <div class="cm-announced">...</div>
|
2403
|
-
* <div class="cm-scroller">...</div>
|
2404
|
-
* <div class="cm-panels cm-panels-bottom">
|
2405
|
-
* <div class="cm-search cm-panel">
|
2406
|
-
* <input class="cm-textfield" />
|
2407
|
-
* <button class="cm-button">...</button>
|
2408
|
-
* <label><input type="checkbox" />...</label>
|
2409
|
-
* </div>
|
2410
|
-
* </div
|
2411
|
-
*/
|
2412
|
-
// TODO(burdon): Implement custom panel (with icon buttons).
|
2413
|
-
".cm-panels": {},
|
2414
|
-
".cm-panel": {
|
2415
|
-
fontFamily: fontBody,
|
2416
|
-
backgroundColor: "var(--surface-bg)"
|
2417
|
-
},
|
2418
|
-
".cm-panel input, .cm-panel button, .cm-panel label": {
|
2419
|
-
color: "var(--dx-subdued)",
|
2420
|
-
fontFamily: fontBody,
|
2421
|
-
fontSize: "14px",
|
2422
|
-
all: "unset",
|
2423
|
-
margin: "3px !important",
|
2424
|
-
padding: "2px 6px !important",
|
2425
|
-
outline: "1px solid transparent"
|
2426
|
-
},
|
2427
|
-
".cm-panel input, .cm-panel button": {
|
2428
|
-
backgroundColor: "var(--dx-input)"
|
2429
|
-
},
|
2430
|
-
".cm-panel input:focus, .cm-panel button:focus": {
|
2431
|
-
outline: "1px solid var(--dx-accentFocusIndicator)"
|
2432
|
-
},
|
2433
|
-
".cm-panel label": {
|
2434
|
-
display: "inline-flex",
|
2435
|
-
alignItems: "center",
|
2436
|
-
cursor: "pointer"
|
2437
|
-
},
|
2438
|
-
".cm-panel input.cm-textfield": {},
|
2439
|
-
".cm-panel input[type=checkbox]": {
|
2440
|
-
width: "8px",
|
2441
|
-
height: "8px",
|
2442
|
-
marginRight: "6px !important",
|
2443
|
-
padding: "2px !important",
|
2444
|
-
color: "var(--dx-accentFocusIndicator)"
|
2445
|
-
},
|
2446
|
-
".cm-panel button": {
|
2447
|
-
"&:hover": {
|
2448
|
-
backgroundColor: "var(--dx-accentSurfaceHover) !important"
|
2449
|
-
},
|
2450
|
-
"&:active": {
|
2451
|
-
backgroundColor: "var(--dx-accentSurfaceHover)"
|
2624
|
+
}
|
2625
|
+
}),
|
2626
|
+
options.onUpdate && trackPastedComments(options.onUpdate)
|
2627
|
+
].filter(import_util2.isNonNullable);
|
2628
|
+
};
|
2629
|
+
var scrollThreadIntoView = (view, id, center = true) => {
|
2630
|
+
const comment = view.state.field(commentsState).comments.find((range2) => range2.comment.id === id);
|
2631
|
+
if (!comment?.comment.cursor) {
|
2632
|
+
return;
|
2633
|
+
}
|
2634
|
+
const range = Cursor.getRangeFromCursor(view.state, comment.comment.cursor);
|
2635
|
+
if (range) {
|
2636
|
+
const currentSelection = view.state.selection.main;
|
2637
|
+
const currentScrollPosition = view.scrollDOM.scrollTop;
|
2638
|
+
const targetScrollPosition = view.coordsAtPos(range.from)?.top;
|
2639
|
+
const needsScroll = targetScrollPosition !== void 0 && (targetScrollPosition < currentScrollPosition || targetScrollPosition > currentScrollPosition + view.scrollDOM.clientHeight);
|
2640
|
+
const needsSelectionUpdate = currentSelection.from !== range.from || currentSelection.to !== range.from;
|
2641
|
+
if (needsScroll || needsSelectionUpdate) {
|
2642
|
+
view.dispatch({
|
2643
|
+
selection: needsSelectionUpdate ? {
|
2644
|
+
anchor: range.from
|
2645
|
+
} : void 0,
|
2646
|
+
effects: [
|
2647
|
+
needsScroll ? import_view11.EditorView.scrollIntoView(range.from, center ? {
|
2648
|
+
y: "center"
|
2649
|
+
} : void 0) : [],
|
2650
|
+
needsSelectionUpdate ? setSelection.of({
|
2651
|
+
current: id
|
2652
|
+
}) : []
|
2653
|
+
].flat()
|
2654
|
+
});
|
2655
|
+
}
|
2656
|
+
}
|
2657
|
+
};
|
2658
|
+
var selectionOverlapsComment = (state) => {
|
2659
|
+
const commentState = state.field(commentsState, false);
|
2660
|
+
if (commentState === void 0) {
|
2661
|
+
return false;
|
2662
|
+
}
|
2663
|
+
const { selection } = state;
|
2664
|
+
for (const range of selection.ranges) {
|
2665
|
+
if (commentState.comments.some(({ range: commentRange }) => overlap(commentRange, range))) {
|
2666
|
+
return true;
|
2667
|
+
}
|
2668
|
+
}
|
2669
|
+
return false;
|
2670
|
+
};
|
2671
|
+
var hasActiveSelection = (state) => {
|
2672
|
+
return state.selection.ranges.some((range) => !range.empty);
|
2673
|
+
};
|
2674
|
+
var ExternalCommentSync = class {
|
2675
|
+
constructor(view, id, subscribe, getComments) {
|
2676
|
+
this.destroy = () => {
|
2677
|
+
this.unsubscribe();
|
2678
|
+
};
|
2679
|
+
const updateComments = () => {
|
2680
|
+
const comments2 = getComments();
|
2681
|
+
if (id === view.state.facet(documentId)) {
|
2682
|
+
queueMicrotask(() => view.dispatch({
|
2683
|
+
effects: setComments.of({
|
2684
|
+
id,
|
2685
|
+
comments: comments2
|
2686
|
+
})
|
2687
|
+
}));
|
2688
|
+
}
|
2689
|
+
};
|
2690
|
+
this.unsubscribe = subscribe(updateComments);
|
2691
|
+
}
|
2692
|
+
};
|
2693
|
+
var createExternalCommentSync = (id, subscribe, getComments) => import_view11.ViewPlugin.fromClass(class {
|
2694
|
+
constructor(view) {
|
2695
|
+
return new ExternalCommentSync(view, id, subscribe, getComments);
|
2696
|
+
}
|
2697
|
+
});
|
2698
|
+
var useCommentState = (state) => {
|
2699
|
+
return (0, import_react4.useMemo)(() => import_view11.EditorView.updateListener.of((update2) => {
|
2700
|
+
if (update2.docChanged || update2.selectionSet) {
|
2701
|
+
state.comment = selectionOverlapsComment(update2.state);
|
2702
|
+
state.selection = hasActiveSelection(update2.state);
|
2703
|
+
}
|
2704
|
+
}), [
|
2705
|
+
state
|
2706
|
+
]);
|
2707
|
+
};
|
2708
|
+
var useComments = (view, id, comments2) => {
|
2709
|
+
(0, import_react4.useEffect)(() => {
|
2710
|
+
if (view) {
|
2711
|
+
if (id === view.state.facet(documentId)) {
|
2712
|
+
view.dispatch({
|
2713
|
+
effects: setComments.of({
|
2714
|
+
id,
|
2715
|
+
comments: comments2 ?? []
|
2716
|
+
})
|
2717
|
+
});
|
2718
|
+
}
|
2452
2719
|
}
|
2720
|
+
});
|
2721
|
+
};
|
2722
|
+
var useCommentClickListener = (onCommentClick) => {
|
2723
|
+
return (0, import_react4.useMemo)(() => import_view11.EditorView.updateListener.of((update2) => {
|
2724
|
+
update2.transactions.forEach((transaction) => {
|
2725
|
+
transaction.effects.forEach((effect) => {
|
2726
|
+
if (effect.is(commentClickedEffect)) {
|
2727
|
+
onCommentClick(effect.value);
|
2728
|
+
}
|
2729
|
+
});
|
2730
|
+
});
|
2731
|
+
}), [
|
2732
|
+
onCommentClick
|
2733
|
+
]);
|
2734
|
+
};
|
2735
|
+
var debugNodeLogger = (log8 = console.log) => {
|
2736
|
+
const logTokens = (state) => (0, import_language.syntaxTree)(state).iterate({
|
2737
|
+
enter: (node) => log8(node.type)
|
2738
|
+
});
|
2739
|
+
return import_state12.StateField.define({
|
2740
|
+
create: (state) => logTokens(state),
|
2741
|
+
update: (_, tr) => logTokens(tr.state)
|
2742
|
+
});
|
2743
|
+
};
|
2744
|
+
var styles4 = import_view13.EditorView.theme({
|
2745
|
+
".cm-dropCursor": {
|
2746
|
+
borderLeft: "2px solid var(--dx-accentText)",
|
2747
|
+
color: "var(--dx-accentText)",
|
2748
|
+
padding: "0 4px"
|
2453
2749
|
},
|
2454
|
-
".cm-
|
2455
|
-
|
2456
|
-
borderTop: "1px solid var(--dx-separator)"
|
2750
|
+
".cm-dropCursor:after": {
|
2751
|
+
content: '"\u2190"'
|
2457
2752
|
}
|
2753
|
+
});
|
2754
|
+
var dropFile = (options = {}) => {
|
2755
|
+
return [
|
2756
|
+
styles4,
|
2757
|
+
(0, import_view13.dropCursor)(),
|
2758
|
+
import_view13.EditorView.domEventHandlers({
|
2759
|
+
drop: (event, view) => {
|
2760
|
+
event.preventDefault();
|
2761
|
+
const files = event.dataTransfer?.files;
|
2762
|
+
const pos = view.posAtCoords(event);
|
2763
|
+
if (files?.length && pos !== null) {
|
2764
|
+
view.dispatch({
|
2765
|
+
selection: {
|
2766
|
+
anchor: pos
|
2767
|
+
}
|
2768
|
+
});
|
2769
|
+
options.onDrop?.(view, {
|
2770
|
+
files
|
2771
|
+
});
|
2772
|
+
}
|
2773
|
+
}
|
2774
|
+
})
|
2775
|
+
];
|
2458
2776
|
};
|
2777
|
+
var focusEffect = import_state14.StateEffect.define();
|
2778
|
+
var focusField = import_state14.StateField.define({
|
2779
|
+
create: () => false,
|
2780
|
+
update: (value, tr) => {
|
2781
|
+
for (const effect of tr.effects) {
|
2782
|
+
if (effect.is(focusEffect)) {
|
2783
|
+
return effect.value;
|
2784
|
+
}
|
2785
|
+
}
|
2786
|
+
return value;
|
2787
|
+
}
|
2788
|
+
});
|
2789
|
+
var focus = [
|
2790
|
+
focusField,
|
2791
|
+
import_view15.EditorView.domEventHandlers({
|
2792
|
+
focus: (event, view) => {
|
2793
|
+
setTimeout(() => view.dispatch({
|
2794
|
+
effects: focusEffect.of(true)
|
2795
|
+
}));
|
2796
|
+
},
|
2797
|
+
blur: (event, view) => {
|
2798
|
+
setTimeout(() => view.dispatch({
|
2799
|
+
effects: focusEffect.of(false)
|
2800
|
+
}));
|
2801
|
+
}
|
2802
|
+
})
|
2803
|
+
];
|
2459
2804
|
var __dxlog_file8 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/factories.ts";
|
2460
2805
|
var preventNewline = import_state13.EditorState.transactionFilter.of((tr) => tr.newDoc.lines > 1 ? [] : tr);
|
2461
2806
|
var defaultBasicOptions = {
|
@@ -2477,10 +2822,10 @@ var keymaps = {
|
|
2477
2822
|
default: import_commands2.defaultKeymap
|
2478
2823
|
};
|
2479
2824
|
var createBasicExtensions = (_props) => {
|
2480
|
-
const props = (0,
|
2825
|
+
const props = (0, import_lodash4.default)({}, _props, defaultBasicOptions);
|
2481
2826
|
return [
|
2482
2827
|
// NOTE: Doesn't catch errors in keymap functions.
|
2483
|
-
|
2828
|
+
import_view14.EditorView.exceptionSink.of((err) => {
|
2484
2829
|
import_log5.log.catch(err, void 0, {
|
2485
2830
|
F: __dxlog_file8,
|
2486
2831
|
L: 96,
|
@@ -2491,24 +2836,24 @@ var createBasicExtensions = (_props) => {
|
|
2491
2836
|
props.allowMultipleSelections && import_state13.EditorState.allowMultipleSelections.of(true),
|
2492
2837
|
props.bracketMatching && (0, import_language2.bracketMatching)(),
|
2493
2838
|
props.closeBrackets && (0, import_autocomplete2.closeBrackets)(),
|
2494
|
-
props.dropCursor && (0,
|
2495
|
-
props.drawSelection && (0,
|
2839
|
+
props.dropCursor && (0, import_view14.dropCursor)(),
|
2840
|
+
props.drawSelection && (0, import_view14.drawSelection)({
|
2496
2841
|
cursorBlinkRate: 1200
|
2497
2842
|
}),
|
2498
2843
|
props.focus && focus,
|
2499
|
-
props.highlightActiveLine && (0,
|
2844
|
+
props.highlightActiveLine && (0, import_view14.highlightActiveLine)(),
|
2500
2845
|
props.history && (0, import_commands2.history)(),
|
2501
|
-
props.lineNumbers && (0,
|
2502
|
-
props.lineWrapping &&
|
2503
|
-
props.placeholder && (0,
|
2846
|
+
props.lineNumbers && (0, import_view14.lineNumbers)(),
|
2847
|
+
props.lineWrapping && import_view14.EditorView.lineWrapping,
|
2848
|
+
props.placeholder && (0, import_view14.placeholder)(props.placeholder),
|
2504
2849
|
props.readonly && [
|
2505
2850
|
import_state13.EditorState.readOnly.of(true),
|
2506
|
-
|
2851
|
+
import_view14.EditorView.editable.of(false)
|
2507
2852
|
],
|
2508
|
-
props.scrollPastEnd && (0,
|
2853
|
+
props.scrollPastEnd && (0, import_view14.scrollPastEnd)(),
|
2509
2854
|
props.tabSize && import_state13.EditorState.tabSize.of(props.tabSize),
|
2510
2855
|
// https://codemirror.net/docs/ref/#view.KeyBinding
|
2511
|
-
|
2856
|
+
import_view14.keymap.of([
|
2512
2857
|
...(props.keymap && keymaps[props.keymap]) ?? [],
|
2513
2858
|
// NOTE: Tabs are also configured by markdown extension.
|
2514
2859
|
// https://codemirror.net/docs/ref/#commands.indentWithTab
|
@@ -2520,7 +2865,14 @@ var createBasicExtensions = (_props) => {
|
|
2520
2865
|
// https://codemirror.net/docs/ref/#commands.historyKeymap
|
2521
2866
|
...props.history ? import_commands2.historyKeymap : [],
|
2522
2867
|
// https://codemirror.net/docs/ref/#search.searchKeymap
|
2523
|
-
...props.search ? import_search.searchKeymap : []
|
2868
|
+
...props.search ? import_search.searchKeymap : [],
|
2869
|
+
// Disable bindings that conflict with system shortcuts.
|
2870
|
+
// TODO(burdon): Catalog global shortcuts.
|
2871
|
+
{
|
2872
|
+
key: "Mod-Shift-k",
|
2873
|
+
preventDefault: true,
|
2874
|
+
run: () => true
|
2875
|
+
}
|
2524
2876
|
].filter(import_util4.isNotFalsy))
|
2525
2877
|
].filter(import_util4.isNotFalsy);
|
2526
2878
|
};
|
@@ -2530,16 +2882,16 @@ var defaultThemeSlots = {
|
|
2530
2882
|
}
|
2531
2883
|
};
|
2532
2884
|
var createThemeExtensions = ({ themeMode, styles: styles5, syntaxHighlighting: _syntaxHighlighting, slots: _slots } = {}) => {
|
2533
|
-
const slots = (0,
|
2885
|
+
const slots = (0, import_lodash4.default)({}, _slots, defaultThemeSlots);
|
2534
2886
|
return [
|
2535
|
-
|
2536
|
-
|
2887
|
+
import_view14.EditorView.darkTheme.of(themeMode === "dark"),
|
2888
|
+
import_view14.EditorView.baseTheme(styles5 ? (0, import_lodash5.default)({}, defaultTheme, styles5) : defaultTheme),
|
2537
2889
|
// https://github.com/codemirror/theme-one-dark
|
2538
2890
|
_syntaxHighlighting && (themeMode === "dark" ? (0, import_language2.syntaxHighlighting)(import_theme_one_dark.oneDarkHighlightStyle) : (0, import_language2.syntaxHighlighting)(import_language2.defaultHighlightStyle)),
|
2539
|
-
slots.editor?.className &&
|
2891
|
+
slots.editor?.className && import_view14.EditorView.editorAttributes.of({
|
2540
2892
|
class: slots.editor.className
|
2541
2893
|
}),
|
2542
|
-
slots.content?.className &&
|
2894
|
+
slots.content?.className && import_view14.EditorView.contentAttributes.of({
|
2543
2895
|
class: slots.content.className
|
2544
2896
|
})
|
2545
2897
|
].filter(import_util4.isNotFalsy);
|
@@ -2551,15 +2903,15 @@ var createDataExtensions = ({ id, text, space, identity }) => {
|
|
2551
2903
|
}
|
2552
2904
|
if (space && identity) {
|
2553
2905
|
const peerId = identity?.identityKey.toHex();
|
2554
|
-
const
|
2906
|
+
const hue = identity?.profile?.data?.hue ?? (0, import_util4.hexToHue)(peerId ?? "0");
|
2555
2907
|
extensions.push(awareness(new SpaceAwarenessProvider({
|
2556
2908
|
space,
|
2557
2909
|
channel: `awareness.${id}`,
|
2558
2910
|
peerId: identity.identityKey.toHex(),
|
2559
2911
|
info: {
|
2560
2912
|
displayName: identity.profile?.displayName ?? (0, import_display_name.generateName)(identity.identityKey.toHex()),
|
2561
|
-
darkColor:
|
2562
|
-
lightColor:
|
2913
|
+
darkColor: `var(--dx-${hue}Cursor)`,
|
2914
|
+
lightColor: `var(--dx-${hue}Cursor)`
|
2563
2915
|
}
|
2564
2916
|
})));
|
2565
2917
|
}
|
@@ -2586,7 +2938,7 @@ var folding = (_props = {}) => [
|
|
2586
2938
|
}));
|
2587
2939
|
}
|
2588
2940
|
}),
|
2589
|
-
|
2941
|
+
import_view16.EditorView.theme({
|
2590
2942
|
".cm-foldGutter": {
|
2591
2943
|
opacity: 0.3,
|
2592
2944
|
transition: "opacity 0.3s",
|
@@ -2599,11 +2951,11 @@ var folding = (_props = {}) => [
|
|
2599
2951
|
];
|
2600
2952
|
var listener = ({ onFocus, onChange }) => {
|
2601
2953
|
const extensions = [];
|
2602
|
-
onFocus && extensions.push(
|
2954
|
+
onFocus && extensions.push(import_view17.EditorView.focusChangeEffect.of((_, focusing) => {
|
2603
2955
|
onFocus(focusing);
|
2604
2956
|
return null;
|
2605
2957
|
}));
|
2606
|
-
onChange && extensions.push(
|
2958
|
+
onChange && extensions.push(import_view17.EditorView.updateListener.of((update2) => {
|
2607
2959
|
onChange(update2.state.doc.toString(), update2.state.facet(documentId));
|
2608
2960
|
}));
|
2609
2961
|
return extensions;
|
@@ -3494,7 +3846,7 @@ var toggleCodeblock = (target) => {
|
|
3494
3846
|
};
|
3495
3847
|
var formattingKeymap = (_options = {}) => {
|
3496
3848
|
return [
|
3497
|
-
|
3849
|
+
import_view18.keymap.of([
|
3498
3850
|
{
|
3499
3851
|
key: "meta-b",
|
3500
3852
|
run: toggleStrong
|
@@ -3694,63 +4046,54 @@ var getFormatting = (state) => {
|
|
3694
4046
|
listStyle: listStyle || null
|
3695
4047
|
};
|
3696
4048
|
};
|
3697
|
-
var useFormattingState = () => {
|
3698
|
-
|
3699
|
-
const observer = (0, import_react6.useMemo)(() => import_view17.EditorView.updateListener.of((update2) => {
|
4049
|
+
var useFormattingState = (state) => {
|
4050
|
+
return (0, import_react6.useMemo)(() => import_view18.EditorView.updateListener.of((update2) => {
|
3700
4051
|
if (update2.docChanged || update2.selectionSet) {
|
3701
|
-
|
3702
|
-
|
3703
|
-
if (!prevState || !formattingEquals(prevState, newState)) {
|
3704
|
-
return newState;
|
3705
|
-
}
|
3706
|
-
return prevState;
|
4052
|
+
Object.entries(getFormatting(update2.state)).forEach(([key, active]) => {
|
4053
|
+
state[key] = active;
|
3707
4054
|
});
|
3708
4055
|
}
|
3709
4056
|
}), []);
|
3710
|
-
return [
|
3711
|
-
state,
|
3712
|
-
observer
|
3713
|
-
];
|
3714
4057
|
};
|
3715
|
-
var
|
4058
|
+
var processEditorPayload = (view, { type, data }) => {
|
3716
4059
|
let inlineType, listType;
|
3717
|
-
switch (
|
4060
|
+
switch (type) {
|
3718
4061
|
case "heading":
|
3719
|
-
setHeading(parseInt(
|
4062
|
+
setHeading(parseInt(data))(view);
|
3720
4063
|
break;
|
3721
4064
|
case "strong":
|
3722
4065
|
case "emphasis":
|
3723
4066
|
case "strikethrough":
|
3724
4067
|
case "code":
|
3725
|
-
inlineType =
|
3726
|
-
(typeof
|
4068
|
+
inlineType = type === "strong" ? Inline.Strong : type === "emphasis" ? Inline.Emphasis : type === "strikethrough" ? Inline.Strikethrough : Inline.Code;
|
4069
|
+
(typeof data === "boolean" ? setStyle(inlineType, data) : toggleStyle(inlineType))(view);
|
3727
4070
|
break;
|
3728
4071
|
case "list-ordered":
|
3729
4072
|
case "list-bullet":
|
3730
4073
|
case "list-task":
|
3731
|
-
listType =
|
3732
|
-
(
|
4074
|
+
listType = type === "list-ordered" ? List.Ordered : type === "list-bullet" ? List.Bullet : List.Task;
|
4075
|
+
(data === false ? removeList(listType) : data === true ? addList(listType) : toggleList(listType))(view);
|
3733
4076
|
break;
|
3734
4077
|
case "blockquote":
|
3735
|
-
(
|
4078
|
+
(data === false ? removeBlockquote : data === true ? addBlockquote : toggleBlockquote)(view);
|
3736
4079
|
break;
|
3737
4080
|
case "codeblock":
|
3738
|
-
(
|
4081
|
+
(data === false ? removeCodeblock : addCodeblock)(view);
|
3739
4082
|
break;
|
3740
4083
|
case "table":
|
3741
4084
|
insertTable(view);
|
3742
4085
|
break;
|
3743
4086
|
case "link":
|
3744
|
-
(
|
4087
|
+
(data === false ? removeLink : addLink())(view);
|
3745
4088
|
break;
|
3746
4089
|
case "image":
|
3747
4090
|
addLink({
|
3748
|
-
url:
|
4091
|
+
url: data,
|
3749
4092
|
image: true
|
3750
4093
|
})(view);
|
3751
4094
|
break;
|
3752
4095
|
case "comment":
|
3753
|
-
|
4096
|
+
createComment2(view);
|
3754
4097
|
break;
|
3755
4098
|
}
|
3756
4099
|
requestAnimationFrame(() => {
|
@@ -3956,7 +4299,7 @@ var createMarkdownExtensions = ({ themeMode } = {}) => {
|
|
3956
4299
|
}),
|
3957
4300
|
// Custom styles.
|
3958
4301
|
(0, import_language5.syntaxHighlighting)(markdownHighlightStyle()),
|
3959
|
-
|
4302
|
+
import_view19.keymap.of([
|
3960
4303
|
// https://codemirror.net/docs/ref/#commands.indentWithTab
|
3961
4304
|
import_commands3.indentWithTab,
|
3962
4305
|
// https://codemirror.net/docs/ref/#commands.defaultKeymap
|
@@ -3990,7 +4333,7 @@ var convertTreeToJson = (state) => {
|
|
3990
4333
|
return treeToJson((0, import_language7.syntaxTree)(state).cursor());
|
3991
4334
|
};
|
3992
4335
|
var adjustChanges = () => {
|
3993
|
-
return
|
4336
|
+
return import_view21.ViewPlugin.fromClass(class {
|
3994
4337
|
update(update2) {
|
3995
4338
|
const tree = (0, import_language9.syntaxTree)(update2.state);
|
3996
4339
|
const adjustments = [];
|
@@ -4132,7 +4475,7 @@ var image = (_options = {}) => {
|
|
4132
4475
|
return [
|
4133
4476
|
import_state19.StateField.define({
|
4134
4477
|
create: (state) => {
|
4135
|
-
return
|
4478
|
+
return import_view22.Decoration.set(buildDecorations(0, state.doc.length, state));
|
4136
4479
|
},
|
4137
4480
|
update: (value, tr) => {
|
4138
4481
|
if (!tr.docChanged && !tr.selection) {
|
@@ -4155,7 +4498,7 @@ var image = (_options = {}) => {
|
|
4155
4498
|
add: buildDecorations(from, to, tr.state)
|
4156
4499
|
});
|
4157
4500
|
},
|
4158
|
-
provide: (field) =>
|
4501
|
+
provide: (field) => import_view22.EditorView.decorations.from(field)
|
4159
4502
|
})
|
4160
4503
|
];
|
4161
4504
|
};
|
@@ -4181,7 +4524,7 @@ var buildDecorations = (from, to, state) => {
|
|
4181
4524
|
return;
|
4182
4525
|
}
|
4183
4526
|
preloadImage(url);
|
4184
|
-
decorations.push(
|
4527
|
+
decorations.push(import_view22.Decoration.replace({
|
4185
4528
|
block: true,
|
4186
4529
|
widget: new ImageWidget(url)
|
4187
4530
|
}).range(hide2 ? node.from : node.to, node.to));
|
@@ -4193,7 +4536,7 @@ var buildDecorations = (from, to, state) => {
|
|
4193
4536
|
});
|
4194
4537
|
return decorations;
|
4195
4538
|
};
|
4196
|
-
var ImageWidget = class extends
|
4539
|
+
var ImageWidget = class extends import_view22.WidgetType {
|
4197
4540
|
constructor(_url) {
|
4198
4541
|
super();
|
4199
4542
|
this._url = _url;
|
@@ -4215,7 +4558,7 @@ var ImageWidget = class extends import_view21.WidgetType {
|
|
4215
4558
|
};
|
4216
4559
|
var bulletListIndentationWidth = 24;
|
4217
4560
|
var orderedListIndentationWidth = 36;
|
4218
|
-
var formattingStyles =
|
4561
|
+
var formattingStyles = import_view23.EditorView.theme({
|
4219
4562
|
/**
|
4220
4563
|
* Horizontal rule.
|
4221
4564
|
*/
|
@@ -4309,13 +4652,34 @@ var formattingStyles = import_view22.EditorView.theme({
|
|
4309
4652
|
height: "auto",
|
4310
4653
|
borderTop: "0.5rem solid transparent",
|
4311
4654
|
borderBottom: "0.5rem solid transparent"
|
4655
|
+
},
|
4656
|
+
".cm-image-with-loader": {
|
4657
|
+
display: "block",
|
4658
|
+
opacity: "0",
|
4659
|
+
transitionDuration: "350ms",
|
4660
|
+
transitionProperty: "opacity"
|
4661
|
+
},
|
4662
|
+
".cm-image-with-loader.cm-loaded-image": {
|
4663
|
+
opacity: "1"
|
4664
|
+
},
|
4665
|
+
".cm-image-wrapper": {
|
4666
|
+
"grid-template-columns": "1fr",
|
4667
|
+
display: "grid",
|
4668
|
+
margin: "0.5rem 0",
|
4669
|
+
overflow: "hidden",
|
4670
|
+
transitionDuration: "350ms",
|
4671
|
+
transitionProperty: "height",
|
4672
|
+
"& > *": {
|
4673
|
+
"grid-row-start": 1,
|
4674
|
+
"grid-column-start": 1
|
4675
|
+
}
|
4312
4676
|
}
|
4313
4677
|
});
|
4314
4678
|
var table = (options = {}) => {
|
4315
4679
|
return import_state20.StateField.define({
|
4316
4680
|
create: (state) => update(state, options),
|
4317
4681
|
update: (_, tr) => update(tr.state, options),
|
4318
|
-
provide: (field) =>
|
4682
|
+
provide: (field) => import_view24.EditorView.decorations.from(field)
|
4319
4683
|
});
|
4320
4684
|
};
|
4321
4685
|
var update = (state, _options) => {
|
@@ -4360,19 +4724,19 @@ var update = (state, _options) => {
|
|
4360
4724
|
tables.forEach((table2) => {
|
4361
4725
|
const replace = state.readOnly || cursor < table2.from || cursor > table2.to;
|
4362
4726
|
if (replace) {
|
4363
|
-
builder.add(table2.from, table2.to,
|
4727
|
+
builder.add(table2.from, table2.to, import_view24.Decoration.replace({
|
4364
4728
|
block: true,
|
4365
4729
|
widget: new TableWidget(table2)
|
4366
4730
|
}));
|
4367
4731
|
} else {
|
4368
|
-
builder.add(table2.from, table2.to,
|
4732
|
+
builder.add(table2.from, table2.to, import_view24.Decoration.mark({
|
4369
4733
|
class: "cm-table"
|
4370
4734
|
}));
|
4371
4735
|
}
|
4372
4736
|
});
|
4373
4737
|
return builder.finish();
|
4374
4738
|
};
|
4375
|
-
var TableWidget = class extends
|
4739
|
+
var TableWidget = class extends import_view24.WidgetType {
|
4376
4740
|
constructor(_table) {
|
4377
4741
|
super();
|
4378
4742
|
this._table = _table;
|
@@ -4412,14 +4776,14 @@ var Unicode = {
|
|
4412
4776
|
bulletSmall: "\u2219",
|
4413
4777
|
bulletSquare: "\u2B1D"
|
4414
4778
|
};
|
4415
|
-
var HorizontalRuleWidget = class extends
|
4779
|
+
var HorizontalRuleWidget = class extends import_view20.WidgetType {
|
4416
4780
|
toDOM() {
|
4417
4781
|
const el = document.createElement("span");
|
4418
4782
|
el.className = "cm-hr";
|
4419
4783
|
return el;
|
4420
4784
|
}
|
4421
4785
|
};
|
4422
|
-
var LinkButton = class extends
|
4786
|
+
var LinkButton = class extends import_view20.WidgetType {
|
4423
4787
|
constructor(url, render) {
|
4424
4788
|
super();
|
4425
4789
|
this.url = url;
|
@@ -4435,7 +4799,7 @@ var LinkButton = class extends import_view19.WidgetType {
|
|
4435
4799
|
return el;
|
4436
4800
|
}
|
4437
4801
|
};
|
4438
|
-
var CheckboxWidget = class extends
|
4802
|
+
var CheckboxWidget = class extends import_view20.WidgetType {
|
4439
4803
|
constructor(_checked) {
|
4440
4804
|
super();
|
4441
4805
|
this._checked = _checked;
|
@@ -4445,7 +4809,7 @@ var CheckboxWidget = class extends import_view19.WidgetType {
|
|
4445
4809
|
}
|
4446
4810
|
toDOM(view) {
|
4447
4811
|
const input = document.createElement("input");
|
4448
|
-
input.className = "cm-task-checkbox
|
4812
|
+
input.className = "cm-task-checkbox dx-checkbox";
|
4449
4813
|
input.type = "checkbox";
|
4450
4814
|
input.tabIndex = -1;
|
4451
4815
|
input.checked = this._checked;
|
@@ -4480,7 +4844,7 @@ var CheckboxWidget = class extends import_view19.WidgetType {
|
|
4480
4844
|
return false;
|
4481
4845
|
}
|
4482
4846
|
};
|
4483
|
-
var TextWidget = class extends
|
4847
|
+
var TextWidget = class extends import_view20.WidgetType {
|
4484
4848
|
constructor(text, className) {
|
4485
4849
|
super();
|
4486
4850
|
this.text = text;
|
@@ -4495,29 +4859,29 @@ var TextWidget = class extends import_view19.WidgetType {
|
|
4495
4859
|
return el;
|
4496
4860
|
}
|
4497
4861
|
};
|
4498
|
-
var hide =
|
4499
|
-
var blockQuote =
|
4500
|
-
class: (0,
|
4862
|
+
var hide = import_view20.Decoration.replace({});
|
4863
|
+
var blockQuote = import_view20.Decoration.line({
|
4864
|
+
class: (0, import_react_ui_theme7.mx)("cm-blockquote")
|
4501
4865
|
});
|
4502
|
-
var fencedCodeLine =
|
4503
|
-
class: (0,
|
4866
|
+
var fencedCodeLine = import_view20.Decoration.line({
|
4867
|
+
class: (0, import_react_ui_theme7.mx)("cm-code cm-codeblock-line")
|
4504
4868
|
});
|
4505
|
-
var fencedCodeLineFirst =
|
4506
|
-
class: (0,
|
4869
|
+
var fencedCodeLineFirst = import_view20.Decoration.line({
|
4870
|
+
class: (0, import_react_ui_theme7.mx)("cm-code cm-codeblock-line", "cm-codeblock-first")
|
4507
4871
|
});
|
4508
|
-
var fencedCodeLineLast =
|
4509
|
-
class: (0,
|
4872
|
+
var fencedCodeLineLast = import_view20.Decoration.line({
|
4873
|
+
class: (0, import_react_ui_theme7.mx)("cm-code cm-codeblock-line", "cm-codeblock-last")
|
4510
4874
|
});
|
4511
4875
|
var commentBlockLine = fencedCodeLine;
|
4512
4876
|
var commentBlockLineFirst = fencedCodeLineFirst;
|
4513
4877
|
var commentBlockLineLast = fencedCodeLineLast;
|
4514
|
-
var horizontalRule =
|
4878
|
+
var horizontalRule = import_view20.Decoration.replace({
|
4515
4879
|
widget: new HorizontalRuleWidget()
|
4516
4880
|
});
|
4517
|
-
var checkedTask =
|
4881
|
+
var checkedTask = import_view20.Decoration.replace({
|
4518
4882
|
widget: new CheckboxWidget(true)
|
4519
4883
|
});
|
4520
|
-
var uncheckedTask =
|
4884
|
+
var uncheckedTask = import_view20.Decoration.replace({
|
4521
4885
|
widget: new CheckboxWidget(false)
|
4522
4886
|
});
|
4523
4887
|
var editingRange = (state, range, focus2) => {
|
@@ -4618,7 +4982,7 @@ var buildDecorations2 = (view, options, focus2) => {
|
|
4618
4982
|
} else {
|
4619
4983
|
const num = headers.slice(from - 1).map((level2) => level2?.number ?? 0).join(".") + " ";
|
4620
4984
|
if (num.length) {
|
4621
|
-
atomicDeco.add(mark.from, mark.from + len,
|
4985
|
+
atomicDeco.add(mark.from, mark.from + len, import_view20.Decoration.replace({
|
4622
4986
|
widget: new TextWidget(num, theme.heading(level))
|
4623
4987
|
}));
|
4624
4988
|
}
|
@@ -4643,7 +5007,7 @@ var buildDecorations2 = (view, options, focus2) => {
|
|
4643
5007
|
if (node.from === line.to - 1) {
|
4644
5008
|
return false;
|
4645
5009
|
}
|
4646
|
-
deco.add(line.from, line.from,
|
5010
|
+
deco.add(line.from, line.from, import_view20.Decoration.line({
|
4647
5011
|
class: "cm-list-item",
|
4648
5012
|
attributes: {
|
4649
5013
|
style: `padding-left: ${offset}px; text-indent: -${width}px;`
|
@@ -4660,7 +5024,7 @@ var buildDecorations2 = (view, options, focus2) => {
|
|
4660
5024
|
const label = list.type === "OrderedList" ? `${++list.number}.` : Unicode.bulletSmall;
|
4661
5025
|
const line = state.doc.lineAt(node.from);
|
4662
5026
|
const to = state.doc.sliceString(node.to, node.to + 1) === " " ? node.to + 1 : node.to;
|
4663
|
-
atomicDeco.add(line.from, to,
|
5027
|
+
atomicDeco.add(line.from, to, import_view20.Decoration.replace({
|
4664
5028
|
widget: new TextWidget(label, list.type === "OrderedList" ? "cm-list-mark cm-list-mark-ordered" : "cm-list-mark cm-list-mark-bullet")
|
4665
5029
|
}));
|
4666
5030
|
break;
|
@@ -4747,7 +5111,7 @@ var buildDecorations2 = (view, options, focus2) => {
|
|
4747
5111
|
if (!editing) {
|
4748
5112
|
atomicDeco.add(node.from, marks[0].to, hide);
|
4749
5113
|
}
|
4750
|
-
deco.add(marks[0].to, marks[1].from,
|
5114
|
+
deco.add(marks[0].to, marks[1].from, import_view20.Decoration.mark({
|
4751
5115
|
tagName: "a",
|
4752
5116
|
attributes: {
|
4753
5117
|
class: "cm-link",
|
@@ -4757,7 +5121,7 @@ var buildDecorations2 = (view, options, focus2) => {
|
|
4757
5121
|
}
|
4758
5122
|
}));
|
4759
5123
|
if (!editing) {
|
4760
|
-
atomicDeco.add(marks[1].from, node.to, options.renderLinkButton ?
|
5124
|
+
atomicDeco.add(marks[1].from, node.to, options.renderLinkButton ? import_view20.Decoration.replace({
|
4761
5125
|
widget: new LinkButton(url, options.renderLinkButton)
|
4762
5126
|
}) : hide);
|
4763
5127
|
}
|
@@ -4815,7 +5179,7 @@ var buildDecorations2 = (view, options, focus2) => {
|
|
4815
5179
|
var forceUpdate = import_state17.StateEffect.define();
|
4816
5180
|
var decorateMarkdown = (options = {}) => {
|
4817
5181
|
return [
|
4818
|
-
|
5182
|
+
import_view20.ViewPlugin.fromClass(class {
|
4819
5183
|
constructor(view) {
|
4820
5184
|
({ deco: this.deco, atomicDeco: this.atomicDeco } = buildDecorations2(view, options, view.hasFocus));
|
4821
5185
|
}
|
@@ -4847,9 +5211,9 @@ var decorateMarkdown = (options = {}) => {
|
|
4847
5211
|
}
|
4848
5212
|
}, {
|
4849
5213
|
provide: (plugin) => [
|
4850
|
-
|
4851
|
-
|
4852
|
-
|
5214
|
+
import_view20.EditorView.atomicRanges.of((view) => view.plugin(plugin)?.atomicDeco ?? import_view20.Decoration.none),
|
5215
|
+
import_view20.EditorView.decorations.of((view) => view.plugin(plugin)?.atomicDeco ?? import_view20.Decoration.none),
|
5216
|
+
import_view20.EditorView.decorations.of((view) => view.plugin(plugin)?.deco ?? import_view20.Decoration.none)
|
4853
5217
|
]
|
4854
5218
|
}),
|
4855
5219
|
image(),
|
@@ -4859,7 +5223,7 @@ var decorateMarkdown = (options = {}) => {
|
|
4859
5223
|
];
|
4860
5224
|
};
|
4861
5225
|
var linkTooltip = (render) => {
|
4862
|
-
return (0,
|
5226
|
+
return (0, import_view25.hoverTooltip)((view, pos, side) => {
|
4863
5227
|
const syntax = (0, import_language12.syntaxTree)(view.state).resolveInner(pos, side);
|
4864
5228
|
let link = null;
|
4865
5229
|
for (let i = 0, node = syntax; !link && node && i < 5; node = node.parent, i++) {
|
@@ -4876,7 +5240,7 @@ var linkTooltip = (render) => {
|
|
4876
5240
|
above: true,
|
4877
5241
|
create: () => {
|
4878
5242
|
const el = document.createElement("div");
|
4879
|
-
el.className = (0,
|
5243
|
+
el.className = (0, import_react_ui_theme8.tooltipContent)({}, "pli-2 plb-1");
|
4880
5244
|
render(el, urlText);
|
4881
5245
|
return {
|
4882
5246
|
dom: el,
|
@@ -4943,7 +5307,7 @@ var InputModeExtensions = {
|
|
4943
5307
|
editorInputMode.of({
|
4944
5308
|
type: "vscode"
|
4945
5309
|
}),
|
4946
|
-
|
5310
|
+
import_view26.keymap.of(import_codemirror_vscode_keymap.vscodeKeymap)
|
4947
5311
|
],
|
4948
5312
|
vim: [
|
4949
5313
|
// https://github.com/replit/codemirror-vim
|
@@ -4952,7 +5316,7 @@ var InputModeExtensions = {
|
|
4952
5316
|
type: "vim",
|
4953
5317
|
noTabster: true
|
4954
5318
|
}),
|
4955
|
-
|
5319
|
+
import_view26.keymap.of([
|
4956
5320
|
{
|
4957
5321
|
key: "Alt-Escape",
|
4958
5322
|
run: (view) => {
|
@@ -4972,7 +5336,7 @@ var typewriter = ({ delay = 75, items = defaultItems } = {}) => {
|
|
4972
5336
|
let t;
|
4973
5337
|
let idx = 0;
|
4974
5338
|
return [
|
4975
|
-
|
5339
|
+
import_view27.keymap.of([
|
4976
5340
|
{
|
4977
5341
|
// Reset.
|
4978
5342
|
key: "alt-meta-'",
|
@@ -5017,413 +5381,19 @@ var typewriter = ({ delay = 75, items = defaultItems } = {}) => {
|
|
5017
5381
|
])
|
5018
5382
|
];
|
5019
5383
|
};
|
5020
|
-
var iconStyles = (0, import_react_ui_theme.getSize)(5);
|
5021
|
-
var buttonStyles = "min-bs-0 p-1";
|
5022
|
-
var tooltipProps = {
|
5023
|
-
side: "top",
|
5024
|
-
classNames: "z-10"
|
5025
|
-
};
|
5026
|
-
var ToolbarSeparator = () => /* @__PURE__ */ import_react2.default.createElement("div", {
|
5027
|
-
role: "separator",
|
5028
|
-
className: "grow"
|
5029
|
-
});
|
5030
|
-
var [ToolbarContextProvider, useToolbarContext] = (0, import_react_context.createContext)("Toolbar");
|
5031
|
-
var ToolbarRoot = ({ children, onAction, classNames, state }) => {
|
5032
|
-
return /* @__PURE__ */ import_react2.default.createElement(ToolbarContextProvider, {
|
5033
|
-
onAction,
|
5034
|
-
state
|
5035
|
-
}, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.ElevationProvider, {
|
5036
|
-
elevation: "positioned"
|
5037
|
-
}, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Toolbar.Root, {
|
5038
|
-
classNames: [
|
5039
|
-
"p-1 is-full shrink-0 overflow-x-auto overflow-y-hidden",
|
5040
|
-
classNames
|
5041
|
-
],
|
5042
|
-
style: {
|
5043
|
-
contain: "layout"
|
5044
|
-
}
|
5045
|
-
}, children)));
|
5046
|
-
};
|
5047
|
-
var ToolbarToggleButton = ({ Icon: Icon2, children, ...props }) => {
|
5048
|
-
return /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Tooltip.Root, null, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Tooltip.Trigger, {
|
5049
|
-
asChild: true
|
5050
|
-
}, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Toolbar.ToggleGroupItem, {
|
5051
|
-
variant: "ghost",
|
5052
|
-
...props,
|
5053
|
-
classNames: buttonStyles
|
5054
|
-
}, /* @__PURE__ */ import_react2.default.createElement(Icon2, {
|
5055
|
-
className: iconStyles
|
5056
|
-
}), /* @__PURE__ */ import_react2.default.createElement("span", {
|
5057
|
-
className: "sr-only"
|
5058
|
-
}, children))), /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Tooltip.Portal, null, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Tooltip.Content, tooltipProps, children, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Tooltip.Arrow, null))));
|
5059
|
-
};
|
5060
|
-
var ToolbarButton = ({ Icon: Icon2, children, ...props }) => {
|
5061
|
-
return /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Tooltip.Root, null, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Tooltip.Trigger, {
|
5062
|
-
asChild: true
|
5063
|
-
}, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Toolbar.Button, {
|
5064
|
-
variant: "ghost",
|
5065
|
-
...props,
|
5066
|
-
classNames: buttonStyles
|
5067
|
-
}, /* @__PURE__ */ import_react2.default.createElement(Icon2, {
|
5068
|
-
className: iconStyles
|
5069
|
-
}), /* @__PURE__ */ import_react2.default.createElement("span", {
|
5070
|
-
className: "sr-only"
|
5071
|
-
}, children))), /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Tooltip.Portal, null, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Tooltip.Content, tooltipProps, children, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Tooltip.Arrow, null))));
|
5072
|
-
};
|
5073
|
-
var HeadingIcons = {
|
5074
|
-
"0": import_react.Paragraph,
|
5075
|
-
"1": import_react.TextHOne,
|
5076
|
-
"2": import_react.TextHTwo,
|
5077
|
-
"3": import_react.TextHThree,
|
5078
|
-
"4": import_react.TextHFour,
|
5079
|
-
"5": import_react.TextHFive,
|
5080
|
-
"6": import_react.TextHSix
|
5081
|
-
};
|
5082
|
-
var MarkdownHeading = () => {
|
5083
|
-
const { t } = (0, import_react_ui.useTranslation)(translationKey);
|
5084
|
-
const { onAction, state } = useToolbarContext("MarkdownFormatting");
|
5085
|
-
const blockType = state ? state.blockType : "paragraph";
|
5086
|
-
const header = blockType && /heading(\d)/.exec(blockType);
|
5087
|
-
const value = header ? header[1] : blockType === "paragraph" || !blockType ? "0" : void 0;
|
5088
|
-
const HeadingIcon = HeadingIcons[value ?? "0"];
|
5089
|
-
const suppressNextTooltip = (0, import_react2.useRef)(false);
|
5090
|
-
const [tooltipOpen, setTooltipOpen] = (0, import_react2.useState)(false);
|
5091
|
-
const [selectOpen, setSelectOpen] = (0, import_react2.useState)(false);
|
5092
|
-
return /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Tooltip.Root, {
|
5093
|
-
open: tooltipOpen,
|
5094
|
-
onOpenChange: (nextOpen) => {
|
5095
|
-
if (nextOpen && suppressNextTooltip.current) {
|
5096
|
-
suppressNextTooltip.current = false;
|
5097
|
-
return setTooltipOpen(false);
|
5098
|
-
} else {
|
5099
|
-
return setTooltipOpen(nextOpen);
|
5100
|
-
}
|
5101
|
-
}
|
5102
|
-
}, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.DropdownMenu.Root, {
|
5103
|
-
open: selectOpen,
|
5104
|
-
onOpenChange: (nextOpen) => {
|
5105
|
-
if (!nextOpen) {
|
5106
|
-
suppressNextTooltip.current = true;
|
5107
|
-
}
|
5108
|
-
return setSelectOpen(nextOpen);
|
5109
|
-
}
|
5110
|
-
}, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Tooltip.Trigger, {
|
5111
|
-
asChild: true
|
5112
|
-
}, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Toolbar.Button, {
|
5113
|
-
asChild: true
|
5114
|
-
}, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.DropdownMenu.Trigger, {
|
5115
|
-
asChild: true
|
5116
|
-
}, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Button, {
|
5117
|
-
variant: "ghost",
|
5118
|
-
classNames: buttonStyles,
|
5119
|
-
disabled: value === null
|
5120
|
-
}, /* @__PURE__ */ import_react2.default.createElement("span", {
|
5121
|
-
className: "sr-only"
|
5122
|
-
}, t("heading label")), /* @__PURE__ */ import_react2.default.createElement(HeadingIcon, {
|
5123
|
-
className: iconStyles
|
5124
|
-
}), /* @__PURE__ */ import_react2.default.createElement(import_react.CaretDown, null))))), /* @__PURE__ */ import_react2.default.createElement(import_react_ui.DropdownMenu.Portal, null, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.DropdownMenu.Content, {
|
5125
|
-
classNames: "is-min md:is-min",
|
5126
|
-
onCloseAutoFocus: (e) => e.preventDefault()
|
5127
|
-
}, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.DropdownMenu.Viewport, null, Object.keys(HeadingIcons).map((level) => {
|
5128
|
-
const Icon2 = HeadingIcons[level];
|
5129
|
-
return /* @__PURE__ */ import_react2.default.createElement(import_react_ui.DropdownMenu.CheckboxItem, {
|
5130
|
-
key: level,
|
5131
|
-
checked: value === level,
|
5132
|
-
onClick: () => onAction?.({
|
5133
|
-
type: "heading",
|
5134
|
-
data: level
|
5135
|
-
})
|
5136
|
-
}, /* @__PURE__ */ import_react2.default.createElement("span", {
|
5137
|
-
className: "sr-only"
|
5138
|
-
}, t("heading level label", {
|
5139
|
-
count: parseInt(level)
|
5140
|
-
})), /* @__PURE__ */ import_react2.default.createElement(Icon2, {
|
5141
|
-
className: iconStyles
|
5142
|
-
}), /* @__PURE__ */ import_react2.default.createElement(import_react_ui.DropdownMenu.ItemIndicator, null, /* @__PURE__ */ import_react2.default.createElement(import_react.Check, null)));
|
5143
|
-
})), /* @__PURE__ */ import_react2.default.createElement(import_react_ui.DropdownMenu.Arrow, null)))), /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Tooltip.Portal, null, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Tooltip.Content, tooltipProps, t("heading label"), /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Tooltip.Arrow, null))));
|
5144
|
-
};
|
5145
|
-
var markdownStyles = [
|
5146
|
-
{
|
5147
|
-
type: "strong",
|
5148
|
-
Icon: import_react.TextB,
|
5149
|
-
getState: (state) => !!state?.strong
|
5150
|
-
},
|
5151
|
-
{
|
5152
|
-
type: "emphasis",
|
5153
|
-
Icon: import_react.TextItalic,
|
5154
|
-
getState: (state) => !!state?.emphasis
|
5155
|
-
},
|
5156
|
-
{
|
5157
|
-
type: "strikethrough",
|
5158
|
-
Icon: import_react.TextStrikethrough,
|
5159
|
-
getState: (state) => !!state?.strikethrough
|
5160
|
-
},
|
5161
|
-
{
|
5162
|
-
type: "code",
|
5163
|
-
Icon: import_react.Code,
|
5164
|
-
getState: (state) => !!state?.code
|
5165
|
-
},
|
5166
|
-
{
|
5167
|
-
type: "link",
|
5168
|
-
Icon: import_react.Link,
|
5169
|
-
getState: (state) => !!state?.link
|
5170
|
-
}
|
5171
|
-
];
|
5172
|
-
var MarkdownStyles = () => {
|
5173
|
-
const { onAction, state } = useToolbarContext("MarkdownStyles");
|
5174
|
-
const { t } = (0, import_react_ui.useTranslation)(translationKey);
|
5175
|
-
return /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Toolbar.ToggleGroup, {
|
5176
|
-
type: "multiple",
|
5177
|
-
value: markdownStyles.filter(({ getState }) => state && getState(state)).map(({ type }) => type)
|
5178
|
-
}, markdownStyles.map(({ type, getState, Icon: Icon2 }) => /* @__PURE__ */ import_react2.default.createElement(ToolbarToggleButton, {
|
5179
|
-
key: type,
|
5180
|
-
value: type,
|
5181
|
-
Icon: Icon2,
|
5182
|
-
disabled: state?.blockType === "codeblock",
|
5183
|
-
onClick: state ? () => onAction?.({
|
5184
|
-
type,
|
5185
|
-
data: !getState(state)
|
5186
|
-
}) : void 0
|
5187
|
-
}, t(`${type} label`))));
|
5188
|
-
};
|
5189
|
-
var markdownLists = [
|
5190
|
-
{
|
5191
|
-
type: "list-bullet",
|
5192
|
-
Icon: import_react.ListBullets,
|
5193
|
-
getState: (state) => state.listStyle === "bullet"
|
5194
|
-
},
|
5195
|
-
{
|
5196
|
-
type: "list-ordered",
|
5197
|
-
Icon: import_react.ListNumbers,
|
5198
|
-
getState: (state) => state.listStyle === "ordered"
|
5199
|
-
},
|
5200
|
-
{
|
5201
|
-
type: "list-task",
|
5202
|
-
Icon: import_react.ListChecks,
|
5203
|
-
getState: (state) => state.listStyle === "task"
|
5204
|
-
}
|
5205
|
-
];
|
5206
|
-
var MarkdownLists = () => {
|
5207
|
-
const { onAction, state } = useToolbarContext("MarkdownStyles");
|
5208
|
-
const { t } = (0, import_react_ui.useTranslation)(translationKey);
|
5209
|
-
return /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Toolbar.ToggleGroup, {
|
5210
|
-
type: "single",
|
5211
|
-
value: state?.listStyle ? `list-${state.listStyle}` : ""
|
5212
|
-
}, markdownLists.map(({ type, getState, Icon: Icon2 }) => /* @__PURE__ */ import_react2.default.createElement(ToolbarToggleButton, {
|
5213
|
-
key: type,
|
5214
|
-
value: type,
|
5215
|
-
Icon: Icon2,
|
5216
|
-
onClick: state ? () => onAction?.({
|
5217
|
-
type,
|
5218
|
-
data: !getState(state)
|
5219
|
-
}) : void 0
|
5220
|
-
}, t(`${type} label`))));
|
5221
|
-
};
|
5222
|
-
var markdownBlocks = [
|
5223
|
-
{
|
5224
|
-
type: "blockquote",
|
5225
|
-
Icon: import_react.Quotes,
|
5226
|
-
getState: (state) => !!state?.blockQuote
|
5227
|
-
},
|
5228
|
-
{
|
5229
|
-
type: "codeblock",
|
5230
|
-
Icon: import_react.CodeBlock,
|
5231
|
-
getState: (state) => state.blockType === "codeblock"
|
5232
|
-
},
|
5233
|
-
{
|
5234
|
-
type: "table",
|
5235
|
-
Icon: import_react.Table,
|
5236
|
-
getState: (state) => state.blockType === "tablecell",
|
5237
|
-
disabled: (state) => !state.blankLine
|
5238
|
-
}
|
5239
|
-
];
|
5240
|
-
var MarkdownBlocks = () => {
|
5241
|
-
const { onAction, state } = useToolbarContext("MarkdownStyles");
|
5242
|
-
const { t } = (0, import_react_ui.useTranslation)(translationKey);
|
5243
|
-
const value = markdownBlocks.find(({ getState }) => state && getState(state));
|
5244
|
-
return /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Toolbar.ToggleGroup, {
|
5245
|
-
type: "single",
|
5246
|
-
value: value?.type ?? ""
|
5247
|
-
}, markdownBlocks.map(({ type, disabled, getState, Icon: Icon2 }) => /* @__PURE__ */ import_react2.default.createElement(ToolbarToggleButton, {
|
5248
|
-
key: type,
|
5249
|
-
value: type,
|
5250
|
-
Icon: Icon2,
|
5251
|
-
disabled: !state || disabled?.(state),
|
5252
|
-
onClick: state ? () => onAction?.({
|
5253
|
-
type,
|
5254
|
-
data: !getState(state)
|
5255
|
-
}) : void 0
|
5256
|
-
}, t(`${type} label`))));
|
5257
|
-
};
|
5258
|
-
var MarkdownStandard = () => /* @__PURE__ */ import_react2.default.createElement(import_react2.default.Fragment, null, /* @__PURE__ */ import_react2.default.createElement(MarkdownHeading, null), /* @__PURE__ */ import_react2.default.createElement(MarkdownStyles, null), /* @__PURE__ */ import_react2.default.createElement(MarkdownLists, null), /* @__PURE__ */ import_react2.default.createElement(MarkdownBlocks, null));
|
5259
|
-
var MarkdownCustom = ({ onUpload } = {}) => {
|
5260
|
-
const { onAction } = useToolbarContext("MarkdownStyles");
|
5261
|
-
const { t } = (0, import_react_ui.useTranslation)(translationKey);
|
5262
|
-
const { acceptedFiles, getInputProps, open } = (0, import_react_dropzone.useDropzone)({
|
5263
|
-
multiple: false,
|
5264
|
-
noDrag: true,
|
5265
|
-
accept: {
|
5266
|
-
"image/*": [
|
5267
|
-
".jpg",
|
5268
|
-
".jpeg",
|
5269
|
-
".png",
|
5270
|
-
".gif"
|
5271
|
-
]
|
5272
|
-
}
|
5273
|
-
});
|
5274
|
-
(0, import_react2.useEffect)(() => {
|
5275
|
-
if (onUpload && acceptedFiles.length) {
|
5276
|
-
requestAnimationFrame(async () => {
|
5277
|
-
const f = acceptedFiles[0];
|
5278
|
-
const file = new File([
|
5279
|
-
f
|
5280
|
-
], f.name, {
|
5281
|
-
type: f.type,
|
5282
|
-
lastModified: f.lastModified
|
5283
|
-
});
|
5284
|
-
const info = await onUpload(file);
|
5285
|
-
if (info) {
|
5286
|
-
onAction?.({
|
5287
|
-
type: "image",
|
5288
|
-
data: info.url
|
5289
|
-
});
|
5290
|
-
}
|
5291
|
-
});
|
5292
|
-
}
|
5293
|
-
}, [
|
5294
|
-
acceptedFiles
|
5295
|
-
]);
|
5296
|
-
return /* @__PURE__ */ import_react2.default.createElement(import_react2.default.Fragment, null, /* @__PURE__ */ import_react2.default.createElement("input", getInputProps()), /* @__PURE__ */ import_react2.default.createElement(ToolbarButton, {
|
5297
|
-
value: "image",
|
5298
|
-
Icon: import_react.Image,
|
5299
|
-
onClick: () => open()
|
5300
|
-
}, t("image label")));
|
5301
|
-
};
|
5302
|
-
var ViewModeIcons = {
|
5303
|
-
preview: import_react.PencilSimple,
|
5304
|
-
readonly: import_react.PencilSimpleSlash,
|
5305
|
-
source: import_react.MarkdownLogo
|
5306
|
-
};
|
5307
|
-
var MarkdownView = ({ mode }) => {
|
5308
|
-
const { t } = (0, import_react_ui.useTranslation)(translationKey);
|
5309
|
-
const { onAction } = useToolbarContext("ViewMode");
|
5310
|
-
const ModeIcon = ViewModeIcons[mode ?? "preview"];
|
5311
|
-
const suppressNextTooltip = (0, import_react2.useRef)(false);
|
5312
|
-
const [tooltipOpen, setTooltipOpen] = (0, import_react2.useState)(false);
|
5313
|
-
const [selectOpen, setSelectOpen] = (0, import_react2.useState)(false);
|
5314
|
-
return /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Tooltip.Root, {
|
5315
|
-
open: tooltipOpen,
|
5316
|
-
onOpenChange: (nextOpen) => {
|
5317
|
-
if (nextOpen && suppressNextTooltip.current) {
|
5318
|
-
suppressNextTooltip.current = false;
|
5319
|
-
return setTooltipOpen(false);
|
5320
|
-
} else {
|
5321
|
-
return setTooltipOpen(nextOpen);
|
5322
|
-
}
|
5323
|
-
}
|
5324
|
-
}, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.DropdownMenu.Root, {
|
5325
|
-
open: selectOpen,
|
5326
|
-
onOpenChange: (nextOpen) => {
|
5327
|
-
if (!nextOpen) {
|
5328
|
-
suppressNextTooltip.current = true;
|
5329
|
-
}
|
5330
|
-
return setSelectOpen(nextOpen);
|
5331
|
-
}
|
5332
|
-
}, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Tooltip.Trigger, {
|
5333
|
-
asChild: true
|
5334
|
-
}, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Toolbar.Button, {
|
5335
|
-
asChild: true
|
5336
|
-
}, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.DropdownMenu.Trigger, {
|
5337
|
-
asChild: true
|
5338
|
-
}, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Button, {
|
5339
|
-
variant: "ghost",
|
5340
|
-
classNames: buttonStyles
|
5341
|
-
}, /* @__PURE__ */ import_react2.default.createElement("span", {
|
5342
|
-
className: "sr-only"
|
5343
|
-
}, t("mode label")), /* @__PURE__ */ import_react2.default.createElement(ModeIcon, {
|
5344
|
-
className: iconStyles
|
5345
|
-
}), /* @__PURE__ */ import_react2.default.createElement(import_react.CaretDown, null))))), /* @__PURE__ */ import_react2.default.createElement(import_react_ui.DropdownMenu.Portal, null, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.DropdownMenu.Content, {
|
5346
|
-
classNames: "is-min md:is-min",
|
5347
|
-
onCloseAutoFocus: (e) => e.preventDefault()
|
5348
|
-
}, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.DropdownMenu.Viewport, null, EditorViewModes.map((value) => {
|
5349
|
-
const Icon2 = ViewModeIcons[value];
|
5350
|
-
return /* @__PURE__ */ import_react2.default.createElement(import_react_ui.DropdownMenu.CheckboxItem, {
|
5351
|
-
key: value,
|
5352
|
-
checked: value === mode,
|
5353
|
-
onClick: () => onAction?.({
|
5354
|
-
type: "view-mode",
|
5355
|
-
data: value
|
5356
|
-
})
|
5357
|
-
}, /* @__PURE__ */ import_react2.default.createElement(Icon2, {
|
5358
|
-
className: iconStyles
|
5359
|
-
}), /* @__PURE__ */ import_react2.default.createElement("span", {
|
5360
|
-
className: "whitespace-nowrap grow"
|
5361
|
-
}, t(`${value} mode label`)), /* @__PURE__ */ import_react2.default.createElement(import_react.Check, {
|
5362
|
-
className: value === mode ? "visible" : "invisible"
|
5363
|
-
}));
|
5364
|
-
})), /* @__PURE__ */ import_react2.default.createElement(import_react_ui.DropdownMenu.Arrow, null)))), /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Tooltip.Portal, null, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Tooltip.Content, tooltipProps, t("view mode label"), /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Tooltip.Arrow, null))));
|
5365
|
-
};
|
5366
|
-
var MarkdownActions = () => {
|
5367
|
-
const { onAction, state } = useToolbarContext("MarkdownActions");
|
5368
|
-
const { t } = (0, import_react_ui.useTranslation)(translationKey);
|
5369
|
-
let commentToolTipKey = "comment label";
|
5370
|
-
if (state?.comment) {
|
5371
|
-
commentToolTipKey = "selection overlaps existing comment label";
|
5372
|
-
} else if (state?.selection === false) {
|
5373
|
-
commentToolTipKey = "select text to comment label";
|
5374
|
-
}
|
5375
|
-
return /* @__PURE__ */ import_react2.default.createElement(import_react2.default.Fragment, null, /* @__PURE__ */ import_react2.default.createElement(ToolbarButton, {
|
5376
|
-
value: "search",
|
5377
|
-
Icon: import_react.MagnifyingGlass,
|
5378
|
-
onClick: () => onAction?.({
|
5379
|
-
type: "search"
|
5380
|
-
})
|
5381
|
-
}, t("search label")), /* @__PURE__ */ import_react2.default.createElement(ToolbarButton, {
|
5382
|
-
value: "comment",
|
5383
|
-
Icon: import_react.ChatText,
|
5384
|
-
"data-testid": "editor.toolbar.comment",
|
5385
|
-
onClick: () => onAction?.({
|
5386
|
-
type: "comment"
|
5387
|
-
}),
|
5388
|
-
disabled: !state || state.comment || !state.selection
|
5389
|
-
}, t(commentToolTipKey)));
|
5390
|
-
};
|
5391
|
-
var Toolbar = {
|
5392
|
-
Root: ToolbarRoot,
|
5393
|
-
Button: ToolbarToggleButton,
|
5394
|
-
Separator: ToolbarSeparator,
|
5395
|
-
View: MarkdownView,
|
5396
|
-
Markdown: MarkdownStandard,
|
5397
|
-
Custom: MarkdownCustom,
|
5398
|
-
Actions: MarkdownActions
|
5399
|
-
};
|
5400
|
-
var margin = "!mt-[1rem]";
|
5401
|
-
var editorContent = (0, import_react_ui_theme8.mx)(margin, "!mli-auto w-full max-w-[min(50rem,100%-2rem)]");
|
5402
|
-
var editorFullWidth = (0, import_react_ui_theme8.mx)(margin);
|
5403
|
-
var editorWithToolbarLayout = "grid grid-cols-1 grid-rows-[min-content_1fr] data-[toolbar=disabled]:grid-rows-[1fr] justify-center content-start overflow-hidden";
|
5404
|
-
var editorGutter = import_view27.EditorView.theme({
|
5405
|
-
// Match margin from content.
|
5406
|
-
".cm-gutters": {
|
5407
|
-
marginTop: "16px",
|
5408
|
-
paddingRight: "1rem"
|
5409
|
-
}
|
5410
|
-
});
|
5411
|
-
var editorMonospace = import_view27.EditorView.theme({
|
5412
|
-
".cm-content": {
|
5413
|
-
fontFamily: fontMono
|
5414
|
-
}
|
5415
|
-
});
|
5416
5384
|
var useActionHandler = (view) => {
|
5417
|
-
return (action) => view &&
|
5385
|
+
return (0, import_react7.useCallback)((action) => view && processEditorPayload(view, action.properties), [
|
5386
|
+
view
|
5387
|
+
]);
|
5418
5388
|
};
|
5419
5389
|
var __dxlog_file11 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/hooks/useTextEditor.ts";
|
5420
5390
|
var instanceCount = 0;
|
5421
5391
|
var useTextEditor = (props = {}, deps = []) => {
|
5422
|
-
const { id, initialValue, extensions, autoFocus, scrollTo, selection, moveToEndOfLine, debug } = (0,
|
5423
|
-
const [instanceId] = (0,
|
5424
|
-
const [view, setView] = (0,
|
5425
|
-
const parentRef = (0,
|
5426
|
-
(0,
|
5392
|
+
const { id, initialValue, extensions, autoFocus, scrollTo, selection, moveToEndOfLine, debug } = (0, import_react8.useMemo)(() => (0, import_util5.getProviderValue)(props), deps ?? []);
|
5393
|
+
const [instanceId] = (0, import_react8.useState)(() => `text-editor-${++instanceCount}`);
|
5394
|
+
const [view, setView] = (0, import_react8.useState)();
|
5395
|
+
const parentRef = (0, import_react8.useRef)(null);
|
5396
|
+
(0, import_react8.useEffect)(() => {
|
5427
5397
|
let view2;
|
5428
5398
|
if (parentRef.current) {
|
5429
5399
|
(0, import_log7.log)("create", {
|
@@ -5497,7 +5467,7 @@ var useTextEditor = (props = {}, deps = []) => {
|
|
5497
5467
|
view2?.destroy();
|
5498
5468
|
};
|
5499
5469
|
}, deps);
|
5500
|
-
(0,
|
5470
|
+
(0, import_react8.useEffect)(() => {
|
5501
5471
|
if (view) {
|
5502
5472
|
if (scrollTo || selection) {
|
5503
5473
|
if (selection && selection.anchor > view.state.doc.length) {
|
@@ -5524,7 +5494,7 @@ var useTextEditor = (props = {}, deps = []) => {
|
|
5524
5494
|
scrollTo,
|
5525
5495
|
selection
|
5526
5496
|
]);
|
5527
|
-
(0,
|
5497
|
+
(0, import_react8.useEffect)(() => {
|
5528
5498
|
if (view && autoFocus) {
|
5529
5499
|
view.focus();
|
5530
5500
|
}
|
@@ -5538,7 +5508,7 @@ var useTextEditor = (props = {}, deps = []) => {
|
|
5538
5508
|
Escape: view?.state.facet(editorInputMode).noTabster
|
5539
5509
|
}
|
5540
5510
|
});
|
5541
|
-
const handleKeyUp = (0,
|
5511
|
+
const handleKeyUp = (0, import_react8.useCallback)((event) => {
|
5542
5512
|
const { key, target, currentTarget } = event;
|
5543
5513
|
if (target === currentTarget) {
|
5544
5514
|
switch (key) {
|
@@ -5568,6 +5538,7 @@ var useTextEditor = (props = {}, deps = []) => {
|
|
5568
5538
|
EditorInputMode,
|
5569
5539
|
EditorInputModes,
|
5570
5540
|
EditorState,
|
5541
|
+
EditorToolbar,
|
5571
5542
|
EditorView,
|
5572
5543
|
EditorViewMode,
|
5573
5544
|
EditorViewModes,
|
@@ -5577,7 +5548,6 @@ var useTextEditor = (props = {}, deps = []) => {
|
|
5577
5548
|
RemoteSelectionsDecorator,
|
5578
5549
|
SpaceAwarenessProvider,
|
5579
5550
|
TextKind,
|
5580
|
-
Toolbar,
|
5581
5551
|
addBlockquote,
|
5582
5552
|
addCodeblock,
|
5583
5553
|
addLink,
|
@@ -5598,6 +5568,8 @@ var useTextEditor = (props = {}, deps = []) => {
|
|
5598
5568
|
createBasicExtensions,
|
5599
5569
|
createComment,
|
5600
5570
|
createDataExtensions,
|
5571
|
+
createEditorAction,
|
5572
|
+
createEditorActionGroup,
|
5601
5573
|
createEditorStateStore,
|
5602
5574
|
createEditorStateTransaction,
|
5603
5575
|
createElement,
|
@@ -5636,7 +5608,7 @@ var useTextEditor = (props = {}, deps = []) => {
|
|
5636
5608
|
mention,
|
5637
5609
|
overlap,
|
5638
5610
|
preventNewline,
|
5639
|
-
|
5611
|
+
processEditorPayload,
|
5640
5612
|
removeBlockquote,
|
5641
5613
|
removeCodeblock,
|
5642
5614
|
removeLink,
|
@@ -5652,6 +5624,8 @@ var useTextEditor = (props = {}, deps = []) => {
|
|
5652
5624
|
setSelection,
|
5653
5625
|
setStyle,
|
5654
5626
|
singleValueFacet,
|
5627
|
+
stackItemContentEditorClassNames,
|
5628
|
+
stackItemContentToolbarClassNames,
|
5655
5629
|
table,
|
5656
5630
|
tags,
|
5657
5631
|
textRange,
|
@@ -5669,9 +5643,9 @@ var useTextEditor = (props = {}, deps = []) => {
|
|
5669
5643
|
useCommentClickListener,
|
5670
5644
|
useCommentState,
|
5671
5645
|
useComments,
|
5646
|
+
useEditorToolbarState,
|
5672
5647
|
useFormattingState,
|
5673
5648
|
useTextEditor,
|
5674
|
-
useToolbarContext,
|
5675
5649
|
wrapWithCatch
|
5676
5650
|
});
|
5677
5651
|
//# sourceMappingURL=index.cjs.map
|