@dxos/react-ui-editor 0.6.9 → 0.6.10-main.48c066e
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 +66 -62
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/meta.json +1 -1
- package/dist/types/src/InputMode.stories.d.ts +1 -1
- package/dist/types/src/InputMode.stories.d.ts.map +1 -1
- package/dist/types/src/TextEditor.stories.d.ts +1 -1
- package/dist/types/src/TextEditor.stories.d.ts.map +1 -1
- package/dist/types/src/defaults.d.ts +5 -1
- package/dist/types/src/defaults.d.ts.map +1 -1
- package/dist/types/src/extensions/autocomplete.d.ts +3 -2
- package/dist/types/src/extensions/autocomplete.d.ts.map +1 -1
- package/dist/types/src/extensions/automerge/automerge.stories.d.ts +1 -1
- package/dist/types/src/extensions/automerge/automerge.stories.d.ts.map +1 -1
- package/dist/types/src/extensions/markdown/bundle.d.ts.map +1 -1
- package/dist/types/src/extensions/markdown/decorate.d.ts.map +1 -1
- package/dist/types/src/styles/theme.d.ts.map +1 -1
- package/dist/types/src/styles/tokens.d.ts +1 -2
- package/dist/types/src/styles/tokens.d.ts.map +1 -1
- package/package.json +24 -27
- package/src/InputMode.stories.tsx +1 -1
- package/src/TextEditor.stories.tsx +3 -3
- package/src/defaults.ts +13 -5
- package/src/extensions/autocomplete.ts +4 -1
- package/src/extensions/automerge/automerge.stories.tsx +1 -1
- package/src/extensions/factories.ts +4 -4
- package/src/extensions/markdown/bundle.ts +3 -0
- package/src/extensions/markdown/decorate.ts +31 -25
- package/src/extensions/markdown/parser.test.ts +29 -0
- package/src/styles/theme.ts +26 -32
- package/src/styles/tokens.ts +4 -4
|
@@ -60,8 +60,8 @@ var theme = {
|
|
|
60
60
|
|
|
61
61
|
// packages/ui/react-ui-editor/src/styles/tokens.ts
|
|
62
62
|
import get from "lodash.get";
|
|
63
|
-
import {
|
|
64
|
-
|
|
63
|
+
import { tokens } from "@dxos/react-ui-theme";
|
|
64
|
+
window.__tokens = tokens;
|
|
65
65
|
var getToken = (path, defaultValue) => {
|
|
66
66
|
const value = get(tokens, path, defaultValue);
|
|
67
67
|
return value?.toString() ?? "";
|
|
@@ -101,35 +101,21 @@ var defaultTheme = {
|
|
|
101
101
|
* NOTE: Gutters should have the same top margin as the content.
|
|
102
102
|
*/
|
|
103
103
|
".cm-gutters": {
|
|
104
|
-
background: "
|
|
104
|
+
background: "var(--dx-base)"
|
|
105
105
|
},
|
|
106
106
|
".cm-gutter": {},
|
|
107
107
|
".cm-gutterElement": {
|
|
108
|
+
fontSize: "16px",
|
|
108
109
|
lineHeight: 1.5
|
|
109
110
|
},
|
|
110
111
|
//
|
|
111
|
-
// Cursor
|
|
112
|
-
//
|
|
113
|
-
"&light .cm-cursor, &light .cm-dropCursor": {
|
|
114
|
-
borderLeft: "2px solid black"
|
|
115
|
-
},
|
|
116
|
-
"&dark .cm-cursor, &dark .cm-dropCursor": {
|
|
117
|
-
borderLeft: "2px solid white"
|
|
118
|
-
},
|
|
119
|
-
"&light .cm-placeholder": {
|
|
120
|
-
color: getToken("extend.semanticColors.description.light", "rgba(0,0,0,.2)")
|
|
121
|
-
},
|
|
122
|
-
"&dark .cm-placeholder": {
|
|
123
|
-
color: getToken("extend.semanticColors.description.dark", "rgba(255,255,255,.2)")
|
|
124
|
-
},
|
|
125
|
-
//
|
|
126
112
|
// line
|
|
127
113
|
//
|
|
128
114
|
".cm-line": {
|
|
129
115
|
paddingInline: 0
|
|
130
116
|
},
|
|
131
117
|
".cm-activeLine": {
|
|
132
|
-
background: "
|
|
118
|
+
background: "var(--dx-hoverSurface)"
|
|
133
119
|
},
|
|
134
120
|
//
|
|
135
121
|
// gutter
|
|
@@ -138,19 +124,28 @@ var defaultTheme = {
|
|
|
138
124
|
minWidth: "36px"
|
|
139
125
|
},
|
|
140
126
|
//
|
|
141
|
-
//
|
|
127
|
+
// Cursor
|
|
142
128
|
//
|
|
143
|
-
"&light .cm-
|
|
144
|
-
|
|
129
|
+
"&light .cm-cursor, &light .cm-dropCursor": {
|
|
130
|
+
borderLeft: "2px solid black"
|
|
145
131
|
},
|
|
146
|
-
"&
|
|
147
|
-
|
|
132
|
+
"&dark .cm-cursor, &dark .cm-dropCursor": {
|
|
133
|
+
borderLeft: "2px solid white"
|
|
134
|
+
},
|
|
135
|
+
"&light .cm-placeholder": {
|
|
136
|
+
color: getToken("extend.semanticColors.description.light", "rgba(0,0,0,.2)")
|
|
137
|
+
},
|
|
138
|
+
"&dark .cm-placeholder": {
|
|
139
|
+
color: getToken("extend.semanticColors.description.dark", "rgba(255,255,255,.2)")
|
|
148
140
|
},
|
|
149
|
-
|
|
150
|
-
|
|
141
|
+
//
|
|
142
|
+
// Selection
|
|
143
|
+
//
|
|
144
|
+
".cm-selectionBackground": {
|
|
145
|
+
background: "var(--dx-selectionSurface) !important"
|
|
151
146
|
},
|
|
152
|
-
"
|
|
153
|
-
background:
|
|
147
|
+
".cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground": {
|
|
148
|
+
background: "var(--dx-selectionSurface) !important"
|
|
154
149
|
},
|
|
155
150
|
//
|
|
156
151
|
// Search
|
|
@@ -280,7 +275,6 @@ var defaultTheme = {
|
|
|
280
275
|
background: getToken("extend.colors.neutral.600")
|
|
281
276
|
}
|
|
282
277
|
},
|
|
283
|
-
// TODO(burdon): Factor out element specific logic.
|
|
284
278
|
//
|
|
285
279
|
// table
|
|
286
280
|
//
|
|
@@ -425,7 +419,7 @@ var styles = EditorView.baseTheme({
|
|
|
425
419
|
import { autocompletion, completionKeymap } from "@codemirror/autocomplete";
|
|
426
420
|
import { markdownLanguage } from "@codemirror/lang-markdown";
|
|
427
421
|
import { keymap } from "@codemirror/view";
|
|
428
|
-
var autocomplete = ({ activateOnTyping, onSearch } = {}) => {
|
|
422
|
+
var autocomplete = ({ activateOnTyping, override, onSearch } = {}) => {
|
|
429
423
|
const extentions = [
|
|
430
424
|
// https://codemirror.net/docs/ref/#view.keymap
|
|
431
425
|
// https://discuss.codemirror.net/t/how-can-i-replace-the-default-autocompletion-keymap-v6/3322
|
|
@@ -435,6 +429,7 @@ var autocomplete = ({ activateOnTyping, onSearch } = {}) => {
|
|
|
435
429
|
// https://codemirror.net/docs/ref/#autocomplete.autocompletion
|
|
436
430
|
autocompletion({
|
|
437
431
|
activateOnTyping,
|
|
432
|
+
override,
|
|
438
433
|
// closeOnBlur: false,
|
|
439
434
|
// defaultKeymap: false,
|
|
440
435
|
// TODO(burdon): Styles/fragments.
|
|
@@ -2295,7 +2290,7 @@ var dropFile = (options = {}) => {
|
|
|
2295
2290
|
|
|
2296
2291
|
// packages/ui/react-ui-editor/src/extensions/factories.ts
|
|
2297
2292
|
import { closeBrackets, closeBracketsKeymap } from "@codemirror/autocomplete";
|
|
2298
|
-
import { defaultKeymap, history, historyKeymap, standardKeymap } from "@codemirror/commands";
|
|
2293
|
+
import { defaultKeymap, history, historyKeymap, indentWithTab, standardKeymap } from "@codemirror/commands";
|
|
2299
2294
|
import { bracketMatching } from "@codemirror/language";
|
|
2300
2295
|
import { searchKeymap } from "@codemirror/search";
|
|
2301
2296
|
import { EditorState } from "@codemirror/state";
|
|
@@ -2340,7 +2335,9 @@ var createBasicExtensions = (_props) => {
|
|
|
2340
2335
|
props.bracketMatching && bracketMatching(),
|
|
2341
2336
|
props.closeBrackets && closeBrackets(),
|
|
2342
2337
|
props.dropCursor && dropCursor2(),
|
|
2343
|
-
props.drawSelection && drawSelection(
|
|
2338
|
+
props.drawSelection && drawSelection({
|
|
2339
|
+
cursorBlinkRate: 1200
|
|
2340
|
+
}),
|
|
2344
2341
|
props.highlightActiveLine && highlightActiveLine(),
|
|
2345
2342
|
props.history && history(),
|
|
2346
2343
|
props.lineNumbers && lineNumbers(),
|
|
@@ -2355,9 +2352,11 @@ var createBasicExtensions = (_props) => {
|
|
|
2355
2352
|
// https://codemirror.net/docs/ref/#view.KeyBinding
|
|
2356
2353
|
keymap5.of([
|
|
2357
2354
|
...(props.keymap && keymaps[props.keymap]) ?? [],
|
|
2358
|
-
// NOTE:
|
|
2355
|
+
// NOTE: Tabs are also configured by markdown extension.
|
|
2359
2356
|
// https://codemirror.net/docs/ref/#commands.indentWithTab
|
|
2360
|
-
|
|
2357
|
+
...props.indentWithTab ? [
|
|
2358
|
+
indentWithTab
|
|
2359
|
+
] : [],
|
|
2361
2360
|
// https://codemirror.net/docs/ref/#autocomplete.closeBracketsKeymap
|
|
2362
2361
|
...props.closeBrackets ? closeBracketsKeymap : [],
|
|
2363
2362
|
// https://codemirror.net/docs/ref/#commands.historyKeymap
|
|
@@ -2443,7 +2442,7 @@ var listener = ({ onFocus, onChange }) => {
|
|
|
2443
2442
|
|
|
2444
2443
|
// packages/ui/react-ui-editor/src/extensions/markdown/formatting.ts
|
|
2445
2444
|
import { snippet } from "@codemirror/autocomplete";
|
|
2446
|
-
import { indentWithTab } from "@codemirror/commands";
|
|
2445
|
+
import { indentWithTab as indentWithTab2 } from "@codemirror/commands";
|
|
2447
2446
|
import { syntaxTree as syntaxTree2 } from "@codemirror/language";
|
|
2448
2447
|
import { EditorSelection } from "@codemirror/state";
|
|
2449
2448
|
import { EditorView as EditorView11, keymap as keymap6 } from "@codemirror/view";
|
|
@@ -3604,7 +3603,7 @@ var processAction = (view, action) => {
|
|
|
3604
3603
|
|
|
3605
3604
|
// packages/ui/react-ui-editor/src/extensions/markdown/bundle.ts
|
|
3606
3605
|
import { completionKeymap as completionKeymap2 } from "@codemirror/autocomplete";
|
|
3607
|
-
import { defaultKeymap as defaultKeymap2, indentWithTab as
|
|
3606
|
+
import { defaultKeymap as defaultKeymap2, indentWithTab as indentWithTab3 } from "@codemirror/commands";
|
|
3608
3607
|
import { markdownLanguage as markdownLanguage3, markdown } from "@codemirror/lang-markdown";
|
|
3609
3608
|
import { defaultHighlightStyle, syntaxHighlighting } from "@codemirror/language";
|
|
3610
3609
|
import { languages } from "@codemirror/language-data";
|
|
@@ -3812,6 +3811,8 @@ var createMarkdownExtensions = ({ themeMode } = {}) => {
|
|
|
3812
3811
|
base: markdownLanguage3,
|
|
3813
3812
|
// Languages for syntax highlighting fenced code blocks.
|
|
3814
3813
|
codeLanguages: languages,
|
|
3814
|
+
// Don't complete HTML tags.
|
|
3815
|
+
completeHTMLTags: false,
|
|
3815
3816
|
// Parser extensions.
|
|
3816
3817
|
extensions: [
|
|
3817
3818
|
// GFM provided by default.
|
|
@@ -3825,7 +3826,7 @@ var createMarkdownExtensions = ({ themeMode } = {}) => {
|
|
|
3825
3826
|
keymap7.of([
|
|
3826
3827
|
// TODO(burdon): Indent by 4 if in task list.
|
|
3827
3828
|
// https://codemirror.net/docs/ref/#commands.indentWithTab
|
|
3828
|
-
|
|
3829
|
+
indentWithTab3,
|
|
3829
3830
|
// https://codemirror.net/docs/ref/#commands.defaultKeymap
|
|
3830
3831
|
...defaultKeymap2,
|
|
3831
3832
|
...completionKeymap2,
|
|
@@ -4235,7 +4236,7 @@ var autoHideTags = /* @__PURE__ */ new Set([
|
|
|
4235
4236
|
"SuperscriptMark"
|
|
4236
4237
|
]);
|
|
4237
4238
|
var bulletListIndentationWidth = 24;
|
|
4238
|
-
var orderedListIndentationWidth =
|
|
4239
|
+
var orderedListIndentationWidth = 36;
|
|
4239
4240
|
var buildDecorations2 = (view, options, focus) => {
|
|
4240
4241
|
const deco = new RangeSetBuilder3();
|
|
4241
4242
|
const atomicDeco = new RangeSetBuilder3();
|
|
@@ -4336,31 +4337,36 @@ var buildDecorations2 = (view, options, focus) => {
|
|
|
4336
4337
|
const list = getCurrentList();
|
|
4337
4338
|
const width = list.type === "OrderedList" ? orderedListIndentationWidth : bulletListIndentationWidth;
|
|
4338
4339
|
const offset = ((list.level ?? 0) + 1) * width;
|
|
4339
|
-
const
|
|
4340
|
-
|
|
4340
|
+
const line = state2.doc.lineAt(node.from);
|
|
4341
|
+
if (node.from === line.to - 1) {
|
|
4342
|
+
return false;
|
|
4343
|
+
}
|
|
4344
|
+
deco.add(line.from, line.from, Decoration7.line({
|
|
4341
4345
|
class: "cm-list-item",
|
|
4342
4346
|
attributes: {
|
|
4343
|
-
|
|
4344
|
-
// Note: This makes the cursor appear to be left of the margin.
|
|
4345
|
-
style: `padding-left: ${offset}px; text-indent: calc(-${width}px - 0.25em);`
|
|
4347
|
+
style: `padding-left: ${offset}px; text-indent: -${width}px;`
|
|
4346
4348
|
}
|
|
4347
4349
|
}));
|
|
4348
|
-
const
|
|
4349
|
-
const whitespace =
|
|
4350
|
+
const text = state2.doc.sliceString(line.from, node.to);
|
|
4351
|
+
const whitespace = text.match(/^ */)?.[0].length ?? 0;
|
|
4350
4352
|
if (whitespace) {
|
|
4351
|
-
atomicDeco.add(
|
|
4353
|
+
atomicDeco.add(line.from, line.from + whitespace, hide);
|
|
4352
4354
|
}
|
|
4353
4355
|
break;
|
|
4354
4356
|
}
|
|
4355
4357
|
case "ListMark": {
|
|
4356
|
-
const
|
|
4357
|
-
if (
|
|
4358
|
-
atomicDeco.add(node.from, node.to, hide);
|
|
4358
|
+
const next = tree.resolve(node.to + 1, 1);
|
|
4359
|
+
if (next?.name === "TaskMarker") {
|
|
4360
|
+
atomicDeco.add(node.from, node.to + 1, hide);
|
|
4359
4361
|
break;
|
|
4360
4362
|
}
|
|
4361
4363
|
const list = getCurrentList();
|
|
4362
|
-
const
|
|
4363
|
-
|
|
4364
|
+
const text = state2.doc.sliceString(node.from, node.to + 1);
|
|
4365
|
+
if (list.type === "BulletList" && text[1] !== " ") {
|
|
4366
|
+
return false;
|
|
4367
|
+
}
|
|
4368
|
+
const label = list.type === "OrderedList" ? `${++list.number}.` : "\u2022";
|
|
4369
|
+
atomicDeco.add(node.from, node.to + 1, Decoration7.replace({
|
|
4364
4370
|
widget: new TextWidget(label, list.type === "OrderedList" ? "cm-list-mark cm-list-mark-ordered" : "cm-list-mark cm-list-mark-bullet")
|
|
4365
4371
|
}));
|
|
4366
4372
|
break;
|
|
@@ -4368,10 +4374,7 @@ var buildDecorations2 = (view, options, focus) => {
|
|
|
4368
4374
|
case "TaskMarker": {
|
|
4369
4375
|
if (!editingRange(state2, node, focus)) {
|
|
4370
4376
|
const checked = state2.doc.sliceString(node.from + 1, node.to - 1) === "x";
|
|
4371
|
-
atomicDeco.add(node.from
|
|
4372
|
-
class: "cm-task-checkbox"
|
|
4373
|
-
}));
|
|
4374
|
-
atomicDeco.add(node.from, node.to, checked ? checkedTask : uncheckedTask);
|
|
4377
|
+
atomicDeco.add(node.from, node.to + 1, checked ? checkedTask : uncheckedTask);
|
|
4375
4378
|
}
|
|
4376
4379
|
break;
|
|
4377
4380
|
}
|
|
@@ -4570,7 +4573,7 @@ var formattingStyles = EditorView14.baseTheme({
|
|
|
4570
4573
|
},
|
|
4571
4574
|
"& .cm-task": {
|
|
4572
4575
|
display: "inline-block",
|
|
4573
|
-
width:
|
|
4576
|
+
width: `${bulletListIndentationWidth}px`,
|
|
4574
4577
|
color: getToken("extend.colors.blue.500")
|
|
4575
4578
|
},
|
|
4576
4579
|
"& .cm-task-checkbox": {
|
|
@@ -4582,6 +4585,7 @@ var formattingStyles = EditorView14.baseTheme({
|
|
|
4582
4585
|
"& .cm-list-mark": {
|
|
4583
4586
|
display: "inline-block",
|
|
4584
4587
|
textAlign: "right",
|
|
4588
|
+
paddingRight: "0.5em",
|
|
4585
4589
|
fontVariant: "tabular-nums"
|
|
4586
4590
|
},
|
|
4587
4591
|
"& .cm-list-mark-bullet": {
|
|
@@ -5243,17 +5247,16 @@ var Toolbar = {
|
|
|
5243
5247
|
|
|
5244
5248
|
// packages/ui/react-ui-editor/src/defaults.ts
|
|
5245
5249
|
import { EditorView as EditorView16 } from "@codemirror/view";
|
|
5246
|
-
|
|
5250
|
+
import { mx as mx4 } from "@dxos/react-ui-theme";
|
|
5251
|
+
var marginY = "!mt-[16px] !mb-[32px]";
|
|
5252
|
+
var editorContent = mx4(marginY, "!mli-auto w-full max-w-[min(50rem,100%-2rem)]");
|
|
5253
|
+
var editorFullWidth = mx4(marginY, "!ml-[3rem]");
|
|
5247
5254
|
var editorWithToolbarLayout = "grid grid-cols-1 grid-rows-[min-content_1fr] data-[toolbar=disabled]:grid-rows-[1fr] justify-center content-start overflow-hidden";
|
|
5248
5255
|
var editorGutter = EditorView16.baseTheme({
|
|
5249
5256
|
".cm-gutters": {
|
|
5250
5257
|
// Match margin from content.
|
|
5251
5258
|
marginTop: "16px",
|
|
5252
|
-
marginBottom: "16px"
|
|
5253
|
-
// Inside within content margin.
|
|
5254
|
-
marginRight: "-32px",
|
|
5255
|
-
width: "32px",
|
|
5256
|
-
backgroundColor: "transparent !important"
|
|
5259
|
+
marginBottom: "16px"
|
|
5257
5260
|
}
|
|
5258
5261
|
});
|
|
5259
5262
|
var editorMonospace = EditorView16.baseTheme({
|
|
@@ -5458,6 +5461,7 @@ export {
|
|
|
5458
5461
|
documentId2 as documentId,
|
|
5459
5462
|
dropFile,
|
|
5460
5463
|
editorContent,
|
|
5464
|
+
editorFullWidth,
|
|
5461
5465
|
editorGutter,
|
|
5462
5466
|
editorInputMode,
|
|
5463
5467
|
editorMonospace,
|