@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.
- package/dist/lib/index.mjs +31 -26
- package/dist/lib/index.mjs.map +1 -1
- package/dist/types/src/components/Editor/Editor.d.ts +45 -40
- package/dist/types/src/components/Editor/Editor.d.ts.map +1 -1
- package/dist/types/src/components/Editor/EditorContext.d.ts +1 -1
- package/dist/types/src/components/Editor/EditorContext.d.ts.map +1 -1
- package/dist/types/src/components/EditorMenuProvider/menu-presets.d.ts.map +1 -1
- package/dist/types/src/components/EditorMenuProvider/popover.d.ts +6 -0
- package/dist/types/src/components/EditorMenuProvider/popover.d.ts.map +1 -1
- package/dist/types/src/components/EditorMenuProvider/useEditorMenu.d.ts +2 -2
- package/dist/types/src/components/EditorMenuProvider/useEditorMenu.d.ts.map +1 -1
- package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts +3 -3
- package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts.map +1 -1
- package/dist/types/src/components/EditorToolbar/blocks.d.ts.map +1 -1
- package/dist/types/src/hooks/useTextEditor.d.ts.map +1 -1
- package/dist/types/src/stories/Assistant.stories.d.ts.map +1 -1
- package/dist/types/src/stories/Comments.stories.d.ts.map +1 -1
- package/dist/types/src/stories/EditorToolbar.stories.d.ts +2 -1
- package/dist/types/src/stories/EditorToolbar.stories.d.ts.map +1 -1
- package/dist/types/src/stories/Outliner.stories.d.ts +4 -3
- package/dist/types/src/stories/Outliner.stories.d.ts.map +1 -1
- package/dist/types/src/stories/Popover.stories.d.ts +2 -1
- package/dist/types/src/stories/Popover.stories.d.ts.map +1 -1
- package/dist/types/src/stories/Suggest.stories.d.ts +2 -1
- package/dist/types/src/stories/Suggest.stories.d.ts.map +1 -1
- package/dist/types/src/stories/TrackChanges.stories.d.ts +2 -1
- package/dist/types/src/stories/TrackChanges.stories.d.ts.map +1 -1
- package/dist/types/src/stories/components/EditorStory.d.ts +1 -1
- package/dist/types/src/stories/components/EditorStory.d.ts.map +1 -1
- package/dist/types/src/stories/components/util.d.ts +1 -1
- package/dist/types/src/stories/components/util.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +36 -48
- package/src/components/Editor/Editor.tsx +1 -1
- package/src/components/Editor/EditorContext.ts +1 -1
- package/src/components/EditorMenuProvider/EditorMenuProvider.tsx +1 -1
- package/src/components/EditorMenuProvider/menu-presets.ts +4 -2
- package/src/components/EditorMenuProvider/popover.ts +14 -2
- package/src/components/EditorMenuProvider/useEditorMenu.ts +8 -1
- package/src/components/EditorToolbar/EditorToolbar.tsx +6 -4
- package/src/components/EditorToolbar/blocks.ts +3 -1
- package/src/hooks/useTextEditor.ts +6 -9
- package/src/stories/Assistant.stories.tsx +1 -1
- package/src/stories/Comments.stories.tsx +3 -1
- package/src/stories/Folding.stories.tsx +2 -2
- package/src/stories/Outliner.stories.tsx +2 -2
- package/src/stories/Popover.stories.tsx +13 -15
- package/src/stories/components/EditorStory.tsx +3 -3
- package/src/stories/components/util.tsx +3 -2
package/dist/lib/index.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createContext } from "@radix-ui/react-context";
|
|
2
|
-
import
|
|
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
|
-
|
|
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 }) =>
|
|
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
|
|
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:
|
|
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:
|
|
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
|
-
|
|
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, {
|
|
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
|
-
|
|
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 &&
|
|
1121
|
-
if (selection.anchor <=
|
|
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:
|
|
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
|
-
|
|
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:
|
|
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:
|
|
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
|
|
1292
|
+
getView,
|
|
1288
1293
|
groups: groupsRef.current,
|
|
1289
1294
|
numItems,
|
|
1290
1295
|
searchPlaceholder,
|