@dxos/react-ui-editor 0.11.1 → 0.12.0-next-73daef452f1464b62efdbca75fb0067c1066f264

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 (49) hide show
  1. package/dist/lib/index.mjs +31 -26
  2. package/dist/lib/index.mjs.map +1 -1
  3. package/dist/types/src/components/Editor/Editor.d.ts +45 -40
  4. package/dist/types/src/components/Editor/Editor.d.ts.map +1 -1
  5. package/dist/types/src/components/Editor/EditorContext.d.ts +1 -1
  6. package/dist/types/src/components/Editor/EditorContext.d.ts.map +1 -1
  7. package/dist/types/src/components/EditorMenuProvider/menu-presets.d.ts.map +1 -1
  8. package/dist/types/src/components/EditorMenuProvider/popover.d.ts +6 -0
  9. package/dist/types/src/components/EditorMenuProvider/popover.d.ts.map +1 -1
  10. package/dist/types/src/components/EditorMenuProvider/useEditorMenu.d.ts +2 -2
  11. package/dist/types/src/components/EditorMenuProvider/useEditorMenu.d.ts.map +1 -1
  12. package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts +3 -3
  13. package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts.map +1 -1
  14. package/dist/types/src/components/EditorToolbar/blocks.d.ts.map +1 -1
  15. package/dist/types/src/hooks/useTextEditor.d.ts.map +1 -1
  16. package/dist/types/src/stories/Assistant.stories.d.ts.map +1 -1
  17. package/dist/types/src/stories/Comments.stories.d.ts.map +1 -1
  18. package/dist/types/src/stories/EditorToolbar.stories.d.ts +2 -1
  19. package/dist/types/src/stories/EditorToolbar.stories.d.ts.map +1 -1
  20. package/dist/types/src/stories/Outliner.stories.d.ts +4 -3
  21. package/dist/types/src/stories/Outliner.stories.d.ts.map +1 -1
  22. package/dist/types/src/stories/Popover.stories.d.ts +2 -1
  23. package/dist/types/src/stories/Popover.stories.d.ts.map +1 -1
  24. package/dist/types/src/stories/Suggest.stories.d.ts +2 -1
  25. package/dist/types/src/stories/Suggest.stories.d.ts.map +1 -1
  26. package/dist/types/src/stories/TrackChanges.stories.d.ts +2 -1
  27. package/dist/types/src/stories/TrackChanges.stories.d.ts.map +1 -1
  28. package/dist/types/src/stories/components/EditorStory.d.ts +1 -1
  29. package/dist/types/src/stories/components/EditorStory.d.ts.map +1 -1
  30. package/dist/types/src/stories/components/util.d.ts +1 -1
  31. package/dist/types/src/stories/components/util.d.ts.map +1 -1
  32. package/dist/types/tsconfig.tsbuildinfo +1 -1
  33. package/package.json +36 -48
  34. package/src/components/Editor/Editor.tsx +1 -1
  35. package/src/components/Editor/EditorContext.ts +1 -1
  36. package/src/components/EditorMenuProvider/EditorMenuProvider.tsx +1 -1
  37. package/src/components/EditorMenuProvider/menu-presets.ts +4 -2
  38. package/src/components/EditorMenuProvider/popover.ts +14 -2
  39. package/src/components/EditorMenuProvider/useEditorMenu.ts +8 -1
  40. package/src/components/EditorToolbar/EditorToolbar.tsx +6 -4
  41. package/src/components/EditorToolbar/blocks.ts +3 -1
  42. package/src/hooks/useTextEditor.ts +6 -9
  43. package/src/stories/Assistant.stories.tsx +1 -1
  44. package/src/stories/Comments.stories.tsx +3 -1
  45. package/src/stories/Folding.stories.tsx +2 -2
  46. package/src/stories/Outliner.stories.tsx +2 -2
  47. package/src/stories/Popover.stories.tsx +13 -15
  48. package/src/stories/components/EditorStory.tsx +3 -3
  49. package/src/stories/components/util.tsx +3 -2
@@ -1,5 +1,5 @@
1
1
  import { createContext } from "@radix-ui/react-context";
2
- import { Atom } from "@effect-atom/atom";
2
+ import * as Atom from "effect/unstable/reactivity/Atom";
3
3
  import { Fragment, forwardRef, memo, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from "react";
4
4
  import { createPortal } from "react-dom";
5
5
  import { invariant } from "@dxos/invariant";
@@ -104,7 +104,7 @@ var popover = (options = {}) => {
104
104
  Prec.highest(popoverKeymap(options)),
105
105
  popoverStateField,
106
106
  popoverTriggerListener(options),
107
- options.activateOnTyping && popoverAutoActivate(options),
107
+ (options.activateOnTyping || options.activateOnDelimiters?.length) && popoverAutoActivate(options),
108
108
  popoverAnchorDecoration(options),
109
109
  modalStateField,
110
110
  options.trigger && placeholder({
@@ -144,7 +144,8 @@ var popoverAutoActivate = (options) => EditorView.updateListener.of(({ view, doc
144
144
  const line = view.state.doc.lineAt(selection.head);
145
145
  const before = line.text.slice(0, selection.head - line.from);
146
146
  const idx = getLastIndexOf(before, options.delimiters ?? DELIMITERS);
147
- if (before.slice(idx + 1).length === 0) return;
147
+ const token = before.slice(idx + 1);
148
+ if (!(token.length === 0 && (options.activateOnDelimiters ?? []).includes(before[idx])) && (!options.activateOnTyping || token.length === 0)) return;
148
149
  view.dispatch({ effects: popoverRangeEffect.of({ range: {
149
150
  from: line.from + idx + 1,
150
151
  to: selection.head
@@ -393,7 +394,7 @@ var formattingCommands = {
393
394
  id: "table",
394
395
  label: "Table",
395
396
  icon: "ph--table--regular",
396
- onSelect: ({ view, head }) => insertAtLineStart(view, head, "| | | |\n|---|---|---|\n| | | |")
397
+ onSelect: ({ view, head }) => insertTable(view, head)
397
398
  }
398
399
  ]
399
400
  };
@@ -537,7 +538,7 @@ var EditorMenuProvider = ({ children, getView, groups, currentItem, open: openPr
537
538
  ref: searchInputRef,
538
539
  density: "sm",
539
540
  variant: "subdued",
540
- classNames: "shrink-0 mbe-1",
541
+ classNames: "shrink-0 mb-1",
541
542
  value: query,
542
543
  placeholder: searchPlaceholder,
543
544
  "aria-label": searchPlaceholder ?? t("search.label"),
@@ -622,7 +623,7 @@ var __dxlog_file$2 = "/__w/dxos/dxos/packages/ui/react-ui-editor/src/components/
622
623
  * );
623
624
  * ```
624
625
  */
625
- var useEditorMenu = ({ trigger, triggerKey, placeholder, activateOnTyping, filter = true, searchTriggers, getMenu }) => {
626
+ var useEditorMenu = ({ trigger, triggerKey, placeholder, activateOnTyping, activateOnDelimiters, filter = true, searchTriggers, getMenu }) => {
626
627
  const groupsRef = useRef([]);
627
628
  const currentRef = useRef(null);
628
629
  const [currentItem, setCurrentItem] = useState();
@@ -670,7 +671,7 @@ var useEditorMenu = ({ trigger, triggerKey, placeholder, activateOnTyping, filte
670
671
  invariant(view, void 0, {
671
672
  "~LogMeta": "~LogMeta",
672
673
  F: __dxlog_file$2,
673
- L: 136,
674
+ L: 137,
674
675
  S: void 0,
675
676
  A: ["view", ""]
676
677
  });
@@ -736,6 +737,7 @@ var useEditorMenu = ({ trigger, triggerKey, placeholder, activateOnTyping, filte
736
737
  }, []);
737
738
  const serializedTrigger = Array.isArray(trigger) ? trigger.join(",") : trigger;
738
739
  const serializedSearchTriggers = searchTriggers?.join(",");
740
+ const serializedDelimiters = activateOnDelimiters?.join(",");
739
741
  return {
740
742
  groupsRef,
741
743
  extension: useMemo(() => {
@@ -744,6 +746,7 @@ var useEditorMenu = ({ trigger, triggerKey, placeholder, activateOnTyping, filte
744
746
  triggerKey,
745
747
  placeholder,
746
748
  activateOnTyping,
749
+ activateOnDelimiters,
747
750
  onClose: ({ view }) => handleOpenChange({
748
751
  view,
749
752
  open: false
@@ -783,6 +786,7 @@ var useEditorMenu = ({ trigger, triggerKey, placeholder, activateOnTyping, filte
783
786
  updateGroups,
784
787
  serializedTrigger,
785
788
  serializedSearchTriggers,
789
+ serializedDelimiters,
786
790
  placeholder,
787
791
  activateOnTyping
788
792
  ]),
@@ -820,7 +824,7 @@ var addBlocks = (state, getView) => (builder) => {
820
824
  group.action(type, {
821
825
  label: [`block.${type}.label`, { ns: translationKey }],
822
826
  checked,
823
- ...type === "table" && { disabled: !!state.blankLine },
827
+ ...type === "table" && { disabled: !state.blankLine },
824
828
  icon
825
829
  }, () => {
826
830
  const view = getView();
@@ -832,9 +836,7 @@ var addBlocks = (state, getView) => (builder) => {
832
836
  case "codeblock":
833
837
  checked ? removeCodeblock(view) : addCodeblock(view);
834
838
  break;
835
- case "table":
836
- insertTable(view);
837
- break;
839
+ case "table": insertTable(view);
838
840
  }
839
841
  });
840
842
  }
@@ -954,7 +956,8 @@ var addLists = (state, getView) => (builder) => {
954
956
  }, () => {
955
957
  const view = getView();
956
958
  if (!view) return;
957
- toggleList(listStyle === "ordered" ? List.Ordered : listStyle === "bullet" ? List.Bullet : List.Task)(view);
959
+ const listType = listStyle === "ordered" ? List.Ordered : listStyle === "bullet" ? List.Bullet : List.Task;
960
+ toggleList(listType)(view);
958
961
  });
959
962
  }
960
963
  });
@@ -1026,12 +1029,15 @@ var EditorToolbar$1 = memo(({ classNames, role, attendableId, onAction, ...props
1026
1029
  ...menuActions,
1027
1030
  attendableId,
1028
1031
  onAction,
1029
- children: /* @__PURE__ */ jsx(Menu.Toolbar, { classNames })
1032
+ children: /* @__PURE__ */ jsx(Menu.Toolbar, {
1033
+ classNames,
1034
+ children: /* @__PURE__ */ jsx(Menu.Items, {})
1035
+ })
1030
1036
  })
1031
1037
  });
1032
1038
  });
1033
1039
  var useMarkdownMenuActions = ({ state, getView, customActions, ...features }) => {
1034
- return useMenuActions(useMemo(() => createMarkdownActions({
1040
+ const menuCreator = useMemo(() => createMarkdownActions({
1035
1041
  state,
1036
1042
  getView,
1037
1043
  customActions,
@@ -1048,7 +1054,8 @@ var useMarkdownMenuActions = ({ state, getView, customActions, ...features }) =>
1048
1054
  features?.onImageUpload,
1049
1055
  features?.onViewModeChange,
1050
1056
  features?.viewModes
1051
- ]));
1057
+ ]);
1058
+ return useMenuActions(menuCreator);
1052
1059
  };
1053
1060
  var createMarkdownActions = ({ state, getView, customActions, ...features }) => {
1054
1061
  return Atom.make((get) => {
@@ -1116,12 +1123,10 @@ var useTextEditor = (props = {}, deps = []) => {
1116
1123
  L: 75,
1117
1124
  S: void 0
1118
1125
  });
1126
+ const length = (doc ?? initialValue)?.length ?? 0;
1119
1127
  let initialSelection;
1120
- if (selection?.anchor && initialValue?.length) {
1121
- if (selection.anchor <= initialValue.length && (selection?.head ?? 0) <= initialValue.length) initialSelection = selection;
1122
- } else if (selectionEnd && selection === void 0) {
1123
- const index = initialValue?.indexOf("\n");
1124
- initialSelection = { anchor: !index || index === -1 ? 0 : index };
1128
+ if (selection?.anchor !== void 0 && length) {
1129
+ if (selection.anchor <= length && (selection?.head ?? 0) <= length) initialSelection = selection;
1125
1130
  }
1126
1131
  const state = EditorState.create({
1127
1132
  doc: doc ?? initialValue,
@@ -1132,7 +1137,7 @@ var useTextEditor = (props = {}, deps = []) => {
1132
1137
  log.catch(err, void 0, {
1133
1138
  "~LogMeta": "~LogMeta",
1134
1139
  F: __dxlog_file$1,
1135
- L: 97,
1140
+ L: 96,
1136
1141
  S: void 0
1137
1142
  });
1138
1143
  })
@@ -1146,7 +1151,7 @@ var useTextEditor = (props = {}, deps = []) => {
1146
1151
  });
1147
1152
  if (selectionEnd && !initialSelection) {
1148
1153
  const { to } = view.state.doc.lineAt(0);
1149
- if (to) view.dispatch({ selection: { anchor: to } });
1154
+ view.dispatch({ selection: { anchor: to } });
1150
1155
  }
1151
1156
  setView(view);
1152
1157
  }
@@ -1154,7 +1159,7 @@ var useTextEditor = (props = {}, deps = []) => {
1154
1159
  log("destroy", { id }, {
1155
1160
  "~LogMeta": "~LogMeta",
1156
1161
  F: __dxlog_file$1,
1157
- L: 122,
1162
+ L: 119,
1158
1163
  S: void 0
1159
1164
  });
1160
1165
  view?.destroy();
@@ -1171,7 +1176,7 @@ var useTextEditor = (props = {}, deps = []) => {
1171
1176
  }, {
1172
1177
  "~LogMeta": "~LogMeta",
1173
1178
  F: __dxlog_file$1,
1174
- L: 131,
1179
+ L: 128,
1175
1180
  S: void 0
1176
1181
  });
1177
1182
  return;
@@ -1205,7 +1210,6 @@ var useTextEditor = (props = {}, deps = []) => {
1205
1210
  case "Enter":
1206
1211
  event.preventDefault();
1207
1212
  if (target === currentTarget) view?.focus();
1208
- break;
1209
1213
  }
1210
1214
  }, [view])
1211
1215
  }
@@ -1277,6 +1281,7 @@ var EditorRoot = forwardRef(({ children, extensions: extensionsProp, widgets, vi
1277
1281
  const extensions = useMemo(() => [extension, extensionsProp].filter(isNonNullable).flat(), [extension, extensionsProp]);
1278
1282
  const [controller, setController] = useState(noopController);
1279
1283
  useImperativeHandle(forwardedRef, () => controller, [controller]);
1284
+ const getView = useCallback(() => controller?.view ?? null, [controller]);
1280
1285
  return /* @__PURE__ */ jsx(EditorContextProvider, {
1281
1286
  controller,
1282
1287
  setController,
@@ -1284,7 +1289,7 @@ var EditorRoot = forwardRef(({ children, extensions: extensionsProp, widgets, vi
1284
1289
  widgets,
1285
1290
  state,
1286
1291
  children: /* @__PURE__ */ jsx(EditorMenuProvider, {
1287
- getView: useCallback(() => controller?.view ?? null, [controller]),
1292
+ getView,
1288
1293
  groups: groupsRef.current,
1289
1294
  numItems,
1290
1295
  searchPlaceholder,