@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.
Files changed (30) hide show
  1. package/dist/lib/browser/index.mjs +66 -62
  2. package/dist/lib/browser/index.mjs.map +3 -3
  3. package/dist/lib/browser/meta.json +1 -1
  4. package/dist/types/src/InputMode.stories.d.ts +1 -1
  5. package/dist/types/src/InputMode.stories.d.ts.map +1 -1
  6. package/dist/types/src/TextEditor.stories.d.ts +1 -1
  7. package/dist/types/src/TextEditor.stories.d.ts.map +1 -1
  8. package/dist/types/src/defaults.d.ts +5 -1
  9. package/dist/types/src/defaults.d.ts.map +1 -1
  10. package/dist/types/src/extensions/autocomplete.d.ts +3 -2
  11. package/dist/types/src/extensions/autocomplete.d.ts.map +1 -1
  12. package/dist/types/src/extensions/automerge/automerge.stories.d.ts +1 -1
  13. package/dist/types/src/extensions/automerge/automerge.stories.d.ts.map +1 -1
  14. package/dist/types/src/extensions/markdown/bundle.d.ts.map +1 -1
  15. package/dist/types/src/extensions/markdown/decorate.d.ts.map +1 -1
  16. package/dist/types/src/styles/theme.d.ts.map +1 -1
  17. package/dist/types/src/styles/tokens.d.ts +1 -2
  18. package/dist/types/src/styles/tokens.d.ts.map +1 -1
  19. package/package.json +24 -27
  20. package/src/InputMode.stories.tsx +1 -1
  21. package/src/TextEditor.stories.tsx +3 -3
  22. package/src/defaults.ts +13 -5
  23. package/src/extensions/autocomplete.ts +4 -1
  24. package/src/extensions/automerge/automerge.stories.tsx +1 -1
  25. package/src/extensions/factories.ts +4 -4
  26. package/src/extensions/markdown/bundle.ts +3 -0
  27. package/src/extensions/markdown/decorate.ts +31 -25
  28. package/src/extensions/markdown/parser.test.ts +29 -0
  29. package/src/styles/theme.ts +26 -32
  30. 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 { tailwindConfig } from "@dxos/react-ui-theme";
64
- var tokens = tailwindConfig({}).theme;
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: "transparent"
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: "transparent"
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
- // Selection
127
+ // Cursor
142
128
  //
143
- "&light .cm-selectionBackground": {
144
- background: getToken("extend.colors.primary.100")
129
+ "&light .cm-cursor, &light .cm-dropCursor": {
130
+ borderLeft: "2px solid black"
145
131
  },
146
- "&light.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground": {
147
- background: getToken("extend.colors.primary.200")
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
- "&dark .cm-selectionBackground": {
150
- background: getToken("extend.colors.primary.700")
141
+ //
142
+ // Selection
143
+ //
144
+ ".cm-selectionBackground": {
145
+ background: "var(--dx-selectionSurface) !important"
151
146
  },
152
- "&dark.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground": {
153
- background: getToken("extend.colors.primary.600")
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: Tab configured by markdown extension.
2355
+ // NOTE: Tabs are also configured by markdown extension.
2359
2356
  // https://codemirror.net/docs/ref/#commands.indentWithTab
2360
- // ...(props.indentWithTab ? [indentWithTab] : []),
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 indentWithTab2 } from "@codemirror/commands";
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
- indentWithTab2,
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 = 32;
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 start = state2.doc.lineAt(node.from);
4340
- deco.add(start.from, start.from, Decoration7.line({
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
- // Subtract 0.25em to account for the space CM adds to Paragraph nodes following the ListItem.
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 line = state2.doc.sliceString(start.from, node.to);
4349
- const whitespace = line.match(/^ */)?.[0].length ?? 0;
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(start.from, start.from + whitespace, hide);
4353
+ atomicDeco.add(line.from, line.from + whitespace, hide);
4352
4354
  }
4353
4355
  break;
4354
4356
  }
4355
4357
  case "ListMark": {
4356
- const task = tree.resolve(node.to + 1, 1).name === "TaskMarker";
4357
- if (task) {
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 label = list.type === "OrderedList" ? `${++list.number}.` : "-";
4363
- atomicDeco.add(node.from, node.to, Decoration7.replace({
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 - 2, node.from - 1, Decoration7.mark({
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: `calc(${bulletListIndentationWidth}px - 0.25em)`,
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
- var editorContent = "!mt-[16px] !mb-[32px] !mli-auto w-full max-w-[min(50rem,100%-4rem)]";
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,