@edifice.io/react 2.6.8-develop.20261008153753 → 2.6.9-chore-tiptap-v3.20261013172459

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 (27) hide show
  1. package/dist/editor.js +2 -0
  2. package/dist/modules/editor/components/BubbleMenuEditImage/BubbleMenuEditImage.js +97 -90
  3. package/dist/modules/editor/components/BubbleMenuEditInformationPane/BubbleMenuEditInformationPane.js +111 -95
  4. package/dist/modules/editor/components/EditorToolbar/EditorToolbar.js +6 -4
  5. package/dist/modules/editor/components/Toolbar/LinkToolbar.FloatingOptions.js +12 -0
  6. package/dist/modules/editor/components/Toolbar/LinkToolbar.js +5 -4
  7. package/dist/modules/editor/components/Toolbar/TableToolbar.js +10 -5
  8. package/dist/modules/editor/hooks/index.d.ts +1 -0
  9. package/dist/modules/editor/hooks/useCommentEditor.d.ts +1 -1
  10. package/dist/modules/editor/hooks/useCommentEditor.js +12 -4
  11. package/dist/modules/editor/hooks/useEditorState.d.ts +20 -0
  12. package/dist/modules/editor/hooks/useEditorState.js +16 -0
  13. package/dist/modules/editor/hooks/useTipTapEditor.d.ts +1 -1
  14. package/dist/modules/editor/hooks/useTipTapEditor.js +61 -23
  15. package/dist/modules/multimedia/MediaLibrary/MediaLibrary.d.ts +2 -0
  16. package/dist/modules/multimedia/MediaLibrary/MediaLibrary.js +2 -0
  17. package/dist/modules/multimedia/MediaLibrary/MediaLibraryContext.d.ts +4 -0
  18. package/dist/modules/multimedia/MediaLibrary/innertabs/Upload.js +2 -1
  19. package/dist/modules/multimedia/MediaLibrary/innertabs/Workspace.js +3 -0
  20. package/dist/node_modules/.pnpm/@tiptap_extension-floating-menu@3.32.0_@floating-ui_dom@1.6.0_@tiptap_core@3.32.0_@tiptap_pm@3.32.0__@tiptap_pm@3.32.0/node_modules/@tiptap/extension-floating-menu/dist/index.js +159 -0
  21. package/dist/node_modules/.pnpm/@tiptap_react@3.32.0_@floating-ui_dom@1.6.0_@tiptap_core@3.32.0_@tiptap_pm@3.32.0__@tiptap_pm_6inmb43gajy4fnlwtngbwkv7um/node_modules/@tiptap/react/dist/menus/index.js +341 -0
  22. package/dist/node_modules/.pnpm/prosemirror-model@1.25.12/node_modules/prosemirror-model/dist/index.js +419 -0
  23. package/dist/node_modules/.pnpm/prosemirror-state@1.4.4/node_modules/prosemirror-state/dist/index.js +489 -0
  24. package/dist/node_modules/.pnpm/prosemirror-transform@1.12.2/node_modules/prosemirror-transform/dist/index.js +607 -0
  25. package/package.json +35 -43
  26. package/dist/modules/editor/components/Toolbar/LinkToolbar.TippyOptions.d.ts +0 -2
  27. package/dist/modules/editor/components/Toolbar/LinkToolbar.TippyOptions.js +0 -8
package/dist/editor.js CHANGED
@@ -26,6 +26,7 @@ import { EditorToolbar } from "./modules/editor/components/EditorToolbar/EditorT
26
26
  import { useActionOptions } from "./modules/editor/hooks/useActionOptions.js";
27
27
  import { useCantooEditor } from "./modules/editor/hooks/useCantooEditor.js";
28
28
  import { useCommentEditor } from "./modules/editor/hooks/useCommentEditor.js";
29
+ import { useEditorState } from "./modules/editor/hooks/useEditorState.js";
29
30
  import { useImageModal } from "./modules/editor/hooks/useImageModal.js";
30
31
  import { useImageSelection } from "./modules/editor/hooks/useImageSelection.js";
31
32
  import { useLinkToolbar } from "./modules/editor/hooks/useLinkToolbar.js";
@@ -67,6 +68,7 @@ export {
67
68
  useCommentEditor,
68
69
  useEditor,
69
70
  useEditorContext,
71
+ useEditorState,
70
72
  useImageModal,
71
73
  useImageSelection,
72
74
  useLinkToolbar,
@@ -1,8 +1,10 @@
1
1
  import { jsx } from "react/jsx-runtime";
2
- import { useMemo } from "react";
3
- import { BubbleMenu } from "@tiptap/react";
2
+ import { useState, useEffect, useCallback, useMemo } from "react";
3
+ import { BubbleMenu } from "../../../../node_modules/.pnpm/@tiptap_react@3.32.0_@floating-ui_dom@1.6.0_@tiptap_core@3.32.0_@tiptap_pm@3.32.0__@tiptap_pm_6inmb43gajy4fnlwtngbwkv7um/node_modules/@tiptap/react/dist/menus/index.js";
4
4
  import { useTranslation } from "react-i18next";
5
+ import { useEditorState } from "../../hooks/useEditorState.js";
5
6
  import { Toolbar } from "../../../../components/Toolbar/Toolbar.js";
7
+ import { offset } from "@floating-ui/dom";
6
8
  import SvgIconImageSizeLarge from "../../../icons/components/IconImageSizeLarge.js";
7
9
  import SvgIconImageSizeMedium from "../../../icons/components/IconImageSizeMedium.js";
8
10
  import SvgIconImageSizeSmall from "../../../icons/components/IconImageSizeSmall.js";
@@ -15,90 +17,93 @@ const BubbleMenuEditImage = ({
15
17
  }) => {
16
18
  const {
17
19
  t
18
- } = useTranslation(), {
19
- selection
20
- } = editor.view.state, selectedNode = editor.view.state.doc.nodeAt(selection.anchor), handleButtonClick = (buttonSize) => {
21
- editor.chain().focus().setAttributes({
20
+ } = useTranslation(), editorState = useEditorState(editor), [currentSize, setCurrentSize] = useState(null), [currentWidth, setCurrentWidth] = useState(null);
21
+ useEffect(() => {
22
+ var _a, _b;
23
+ const {
24
+ selection
25
+ } = editor.view.state, selectedNode = editor.view.state.doc.nodeAt(selection.anchor);
26
+ setCurrentSize(((_a = selectedNode == null ? void 0 : selectedNode.attrs) == null ? void 0 : _a.size) || null), setCurrentWidth(((_b = selectedNode == null ? void 0 : selectedNode.attrs) == null ? void 0 : _b.width) || null);
27
+ }, [editor, editorState]);
28
+ const handleButtonClick = useCallback((buttonSize) => {
29
+ editor.chain().focus().updateAttributes("custom-image", {
22
30
  width: buttonSize.width,
23
31
  height: buttonSize.height,
24
32
  size: buttonSize.size
25
33
  }).run();
26
- }, ImageSizeItems = useMemo(() => {
27
- var _a, _b, _c, _d, _e, _f;
28
- return [{
29
- type: "button",
30
- name: "edit",
31
- props: {
32
- size: "lg",
33
- color: "secondary",
34
- leftIcon: /* @__PURE__ */ jsx(SvgIconWand, {}),
35
- "aria-label": t("tiptap.tooltip.bubblemenu.image.edit"),
36
- children: t("tiptap.bubblemenu.edit"),
37
- onClick: onEditImage
38
- },
39
- tooltip: {
40
- message: t("tiptap.tooltip.bubblemenu.image.edit"),
41
- position: "top"
42
- }
43
- }, {
44
- type: "divider",
45
- name: "div-4"
46
- }, {
47
- type: "icon",
48
- name: "small",
49
- props: {
50
- icon: /* @__PURE__ */ jsx(SvgIconImageSizeSmall, {}),
51
- "aria-label": t("tiptap.tooltip.bubblemenu.image.small"),
52
- color: "tertiary",
53
- className: ((_a = selectedNode == null ? void 0 : selectedNode.attrs) == null ? void 0 : _a.size) === "small" && ((_b = selectedNode == null ? void 0 : selectedNode.attrs) == null ? void 0 : _b.width) === 250 ? "is-selected" : "",
54
- onClick: () => handleButtonClick({
55
- size: "small",
56
- width: 250,
57
- height: "auto"
58
- })
59
- },
60
- tooltip: {
61
- message: t("tiptap.tooltip.bubblemenu.image.small"),
62
- position: "top"
63
- }
64
- }, {
65
- type: "icon",
66
- name: "medium",
67
- props: {
68
- icon: /* @__PURE__ */ jsx(SvgIconImageSizeMedium, {}),
69
- "aria-label": t("tiptap.tooltip.bubblemenu.image.medium"),
70
- color: "tertiary",
71
- className: ((_c = selectedNode == null ? void 0 : selectedNode.attrs) == null ? void 0 : _c.size) === "medium" && ((_d = selectedNode == null ? void 0 : selectedNode.attrs) == null ? void 0 : _d.width) === 350 ? "is-selected" : "",
72
- onClick: () => handleButtonClick({
73
- size: "medium",
74
- width: 350,
75
- height: "auto"
76
- })
77
- },
78
- tooltip: {
79
- message: t("tiptap.tooltip.bubblemenu.image.medium"),
80
- position: "top"
81
- }
82
- }, {
83
- type: "icon",
84
- name: "large",
85
- props: {
86
- icon: /* @__PURE__ */ jsx(SvgIconImageSizeLarge, {}),
87
- "aria-label": t("tiptap.tooltip.bubblemenu.image.big"),
88
- color: "tertiary",
89
- className: ((_e = selectedNode == null ? void 0 : selectedNode.attrs) == null ? void 0 : _e.size) === "large" && ((_f = selectedNode == null ? void 0 : selectedNode.attrs) == null ? void 0 : _f.width) === 500 ? "is-selected" : "",
90
- onClick: () => handleButtonClick({
91
- size: "large",
92
- width: 500,
93
- height: "auto"
94
- })
95
- },
96
- tooltip: {
97
- message: t("tiptap.tooltip.bubblemenu.image.big"),
98
- position: "top"
99
- }
100
- }];
101
- }, [t, selectedNode]), tippyOptions = useMemo(() => {
34
+ }, [editor]), ImageSizeItems = useMemo(() => [{
35
+ type: "button",
36
+ name: "edit",
37
+ props: {
38
+ size: "lg",
39
+ color: "secondary",
40
+ leftIcon: /* @__PURE__ */ jsx(SvgIconWand, {}),
41
+ "aria-label": t("tiptap.tooltip.bubblemenu.image.edit"),
42
+ children: t("tiptap.bubblemenu.edit"),
43
+ onClick: onEditImage
44
+ },
45
+ tooltip: {
46
+ message: t("tiptap.tooltip.bubblemenu.image.edit"),
47
+ position: "top"
48
+ }
49
+ }, {
50
+ type: "divider",
51
+ name: "div-4"
52
+ }, {
53
+ type: "icon",
54
+ name: "small",
55
+ props: {
56
+ icon: /* @__PURE__ */ jsx(SvgIconImageSizeSmall, {}),
57
+ "aria-label": t("tiptap.tooltip.bubblemenu.image.small"),
58
+ color: "tertiary",
59
+ className: currentSize === "small" && currentWidth === 250 ? "is-selected" : "",
60
+ onClick: () => handleButtonClick({
61
+ size: "small",
62
+ width: 250,
63
+ height: "auto"
64
+ })
65
+ },
66
+ tooltip: {
67
+ message: t("tiptap.tooltip.bubblemenu.image.small"),
68
+ position: "top"
69
+ }
70
+ }, {
71
+ type: "icon",
72
+ name: "medium",
73
+ props: {
74
+ icon: /* @__PURE__ */ jsx(SvgIconImageSizeMedium, {}),
75
+ "aria-label": t("tiptap.tooltip.bubblemenu.image.medium"),
76
+ color: "tertiary",
77
+ className: currentSize === "medium" && currentWidth === 350 ? "is-selected" : "",
78
+ onClick: () => handleButtonClick({
79
+ size: "medium",
80
+ width: 350,
81
+ height: "auto"
82
+ })
83
+ },
84
+ tooltip: {
85
+ message: t("tiptap.tooltip.bubblemenu.image.medium"),
86
+ position: "top"
87
+ }
88
+ }, {
89
+ type: "icon",
90
+ name: "large",
91
+ props: {
92
+ icon: /* @__PURE__ */ jsx(SvgIconImageSizeLarge, {}),
93
+ "aria-label": t("tiptap.tooltip.bubblemenu.image.big"),
94
+ color: "tertiary",
95
+ className: currentSize === "large" && currentWidth === 500 ? "is-selected" : "",
96
+ onClick: () => handleButtonClick({
97
+ size: "large",
98
+ width: 500,
99
+ height: "auto"
100
+ })
101
+ },
102
+ tooltip: {
103
+ message: t("tiptap.tooltip.bubblemenu.image.big"),
104
+ position: "top"
105
+ }
106
+ }], [t, currentSize, currentWidth, onEditImage, handleButtonClick]), reference = useMemo(() => {
102
107
  function adjustRect(rect) {
103
108
  let yOffset = 0;
104
109
  if (window.visualViewport) {
@@ -108,12 +113,7 @@ const BubbleMenuEditImage = ({
108
113
  return new DOMRect(rect.x, rect.y - yOffset, rect.width, rect.height);
109
114
  }
110
115
  return {
111
- placement: "bottom-start",
112
- offset: [0, 0],
113
- zIndex: 999,
114
- duration: 100,
115
- // Try to get the bounding rect of the table.
116
- getReferenceClientRect: () => {
116
+ getBoundingClientRect: () => {
117
117
  const parentDiv = editor != null && editor.isActive("custom-image") ? editor.state.selection.$anchor : null;
118
118
  if (parentDiv) {
119
119
  const parentDomNode = editor == null ? void 0 : editor.view.nodeDOM(parentDiv.pos);
@@ -125,10 +125,17 @@ const BubbleMenuEditImage = ({
125
125
  return new DOMRect(0, 0, 100, 100);
126
126
  }
127
127
  };
128
- }, [editor]);
128
+ }, [editor]), floatingOptions = useMemo(() => ({
129
+ placement: "bottom-start",
130
+ middleware: [offset({
131
+ mainAxis: 0,
132
+ crossAxis: 0
133
+ })],
134
+ strategy: "absolute"
135
+ }), []);
129
136
  return /* @__PURE__ */ jsx(BubbleMenu, { className: openEditImage ? "d-none" : "", shouldShow: ({
130
137
  editor: editor2
131
- }) => editor2.isActive("custom-image") && !openEditImage, editor, tippyOptions, children: editable && /* @__PURE__ */ jsx(Toolbar, { className: "p-8", items: ImageSizeItems }) });
138
+ }) => editor2.isActive("custom-image") && !openEditImage, editor, options: floatingOptions, getReferencedVirtualElement: () => reference, children: editable && /* @__PURE__ */ jsx(Toolbar, { className: "p-8", items: ImageSizeItems }, `toolbar-${currentSize}-${currentWidth}`) });
132
139
  };
133
140
  export {
134
141
  BubbleMenuEditImage as default
@@ -1,7 +1,9 @@
1
1
  import { jsx } from "react/jsx-runtime";
2
- import { useMemo } from "react";
3
- import { BubbleMenu } from "@tiptap/react";
2
+ import { useState, useEffect, useMemo } from "react";
3
+ import { BubbleMenu } from "../../../../node_modules/.pnpm/@tiptap_react@3.32.0_@floating-ui_dom@1.6.0_@tiptap_core@3.32.0_@tiptap_pm@3.32.0__@tiptap_pm_6inmb43gajy4fnlwtngbwkv7um/node_modules/@tiptap/react/dist/menus/index.js";
4
+ import { offset } from "@floating-ui/dom";
4
5
  import { useTranslation } from "react-i18next";
6
+ import { useEditorState } from "../../hooks/useEditorState.js";
5
7
  import { Toolbar } from "../../../../components/Toolbar/Toolbar.js";
6
8
  import SvgIconAlertTriangle from "../../../icons/components/IconAlertTriangle.js";
7
9
  import SvgIconDelete from "../../../icons/components/IconDelete.js";
@@ -14,98 +16,105 @@ const BubbleMenuEditInformationPane = ({
14
16
  }) => {
15
17
  const {
16
18
  t
17
- } = useTranslation(), {
18
- selection
19
- } = editor.view.state, selectedNode = selection.$from.node(1), InformationPaneTypeItems = useMemo(() => {
20
- var _a, _b, _c, _d;
21
- return [{
22
- type: "icon",
23
- name: "info",
24
- props: {
25
- size: "lg",
26
- icon: /* @__PURE__ */ jsx(SvgIconInfoCircle, {}),
27
- "aria-label": t("tiptap.tooltip.bubblemenu.information.pane.info"),
28
- className: ((_a = selectedNode == null ? void 0 : selectedNode.attrs) == null ? void 0 : _a.type) === "info" ? "is-selected" : "",
29
- onClick: () => editor.chain().focus().updateAttributes("information-pane", {
30
- type: "info"
31
- }).run()
32
- },
33
- tooltip: {
34
- message: t("tiptap.tooltip.bubblemenu.information.pane.info"),
35
- position: "top"
19
+ } = useTranslation(), editorState = useEditorState(editor), [currentType, setCurrentType] = useState(null);
20
+ useEffect(() => {
21
+ var _a;
22
+ const {
23
+ $anchor
24
+ } = editor.view.state.selection;
25
+ let selectedNode = null;
26
+ for (let depth = $anchor.depth; depth >= 0; depth--) {
27
+ const node = $anchor.node(depth);
28
+ if (node.type.name === "information-pane") {
29
+ selectedNode = node;
30
+ break;
36
31
  }
37
- }, {
38
- type: "icon",
39
- name: "success",
40
- props: {
41
- size: "lg",
42
- icon: /* @__PURE__ */ jsx(SvgIconSuccessOutline, {}),
43
- "aria-label": t("tiptap.tooltip.bubblemenu.information.pane.success"),
44
- className: ((_b = selectedNode == null ? void 0 : selectedNode.attrs) == null ? void 0 : _b.type) === "success" ? "is-selected" : "",
45
- onClick: () => editor.chain().focus().updateAttributes("information-pane", {
46
- type: "success"
47
- }).run()
48
- },
49
- tooltip: {
50
- message: t("tiptap.tooltip.bubblemenu.information.pane.success"),
51
- position: "top"
52
- }
53
- }, {
54
- type: "icon",
55
- name: "warning",
56
- props: {
57
- size: "lg",
58
- icon: /* @__PURE__ */ jsx(SvgIconAlertTriangle, {}),
59
- "aria-label": t("tiptap.tooltip.bubblemenu.information.pane.warning"),
60
- className: ((_c = selectedNode == null ? void 0 : selectedNode.attrs) == null ? void 0 : _c.type) === "warning" ? "is-selected" : "",
61
- onClick: () => editor.chain().focus().updateAttributes("information-pane", {
62
- type: "warning"
63
- }).run()
64
- },
65
- tooltip: {
66
- message: t("tiptap.tooltip.bubblemenu.information.pane.warning"),
67
- position: "top"
68
- }
69
- }, {
70
- type: "icon",
71
- name: "question",
72
- props: {
73
- size: "lg",
74
- icon: /* @__PURE__ */ jsx(SvgIconQuestion, {}),
75
- "aria-label": t("tiptap.tooltip.bubblemenu.information.pane.question"),
76
- className: ((_d = selectedNode == null ? void 0 : selectedNode.attrs) == null ? void 0 : _d.type) === "question" ? "is-selected" : "",
77
- onClick: () => editor.chain().focus().updateAttributes("information-pane", {
78
- type: "question"
79
- }).run()
80
- },
81
- tooltip: {
82
- message: t("tiptap.tooltip.bubblemenu.information.pane.question"),
83
- position: "top"
84
- }
85
- }, {
86
- type: "divider",
87
- name: "div-4"
88
- }, {
89
- type: "button",
90
- name: "delete",
91
- props: {
92
- size: "lg",
93
- leftIcon: /* @__PURE__ */ jsx(SvgIconDelete, {}),
94
- "aria-label": t("tiptap.bubblemenu.delete"),
95
- children: t("tiptap.bubblemenu.delete"),
96
- onClick: () => editor.chain().focus().deleteNode("information-pane").run()
97
- },
98
- tooltip: {
99
- message: t("tiptap.bubblemenu.delete"),
100
- position: "top"
101
- }
102
- }];
103
- }, [t, selectedNode]), tippyOptions = useMemo(() => ({
104
- placement: "bottom",
105
- offset: [0, 0],
106
- zIndex: 999,
107
- duration: 100,
108
- getReferenceClientRect: () => {
32
+ }
33
+ setCurrentType(((_a = selectedNode == null ? void 0 : selectedNode.attrs) == null ? void 0 : _a.type) || null);
34
+ }, [editor, editorState]);
35
+ const InformationPaneTypeItems = useMemo(() => [{
36
+ type: "icon",
37
+ name: "info",
38
+ props: {
39
+ size: "lg",
40
+ icon: /* @__PURE__ */ jsx(SvgIconInfoCircle, {}),
41
+ "aria-label": t("tiptap.tooltip.bubblemenu.information.pane.info"),
42
+ className: currentType === "info" ? "is-selected" : "",
43
+ onClick: () => editor.chain().focus().updateAttributes("information-pane", {
44
+ type: "info"
45
+ }).run()
46
+ },
47
+ tooltip: {
48
+ message: t("tiptap.tooltip.bubblemenu.information.pane.info"),
49
+ position: "top"
50
+ }
51
+ }, {
52
+ type: "icon",
53
+ name: "success",
54
+ props: {
55
+ size: "lg",
56
+ icon: /* @__PURE__ */ jsx(SvgIconSuccessOutline, {}),
57
+ "aria-label": t("tiptap.tooltip.bubblemenu.information.pane.success"),
58
+ className: currentType === "success" ? "is-selected" : "",
59
+ onClick: () => editor.chain().focus().updateAttributes("information-pane", {
60
+ type: "success"
61
+ }).run()
62
+ },
63
+ tooltip: {
64
+ message: t("tiptap.tooltip.bubblemenu.information.pane.success"),
65
+ position: "top"
66
+ }
67
+ }, {
68
+ type: "icon",
69
+ name: "warning",
70
+ props: {
71
+ size: "lg",
72
+ icon: /* @__PURE__ */ jsx(SvgIconAlertTriangle, {}),
73
+ "aria-label": t("tiptap.tooltip.bubblemenu.information.pane.warning"),
74
+ className: currentType === "warning" ? "is-selected" : "",
75
+ onClick: () => editor.chain().focus().updateAttributes("information-pane", {
76
+ type: "warning"
77
+ }).run()
78
+ },
79
+ tooltip: {
80
+ message: t("tiptap.tooltip.bubblemenu.information.pane.warning"),
81
+ position: "top"
82
+ }
83
+ }, {
84
+ type: "icon",
85
+ name: "question",
86
+ props: {
87
+ size: "lg",
88
+ icon: /* @__PURE__ */ jsx(SvgIconQuestion, {}),
89
+ "aria-label": t("tiptap.tooltip.bubblemenu.information.pane.question"),
90
+ className: currentType === "question" ? "is-selected" : "",
91
+ onClick: () => editor.chain().focus().updateAttributes("information-pane", {
92
+ type: "question"
93
+ }).run()
94
+ },
95
+ tooltip: {
96
+ message: t("tiptap.tooltip.bubblemenu.information.pane.question"),
97
+ position: "top"
98
+ }
99
+ }, {
100
+ type: "divider",
101
+ name: "div-4"
102
+ }, {
103
+ type: "button",
104
+ name: "delete",
105
+ props: {
106
+ size: "lg",
107
+ leftIcon: /* @__PURE__ */ jsx(SvgIconDelete, {}),
108
+ "aria-label": t("tiptap.bubblemenu.delete"),
109
+ children: t("tiptap.bubblemenu.delete"),
110
+ onClick: () => editor.chain().focus().deleteNode("information-pane").run()
111
+ },
112
+ tooltip: {
113
+ message: t("tiptap.bubblemenu.delete"),
114
+ position: "top"
115
+ }
116
+ }], [t, editor, currentType]), reference = useMemo(() => ({
117
+ getBoundingClientRect: () => {
109
118
  const {
110
119
  state
111
120
  } = editor, {
@@ -126,10 +135,17 @@ const BubbleMenuEditInformationPane = ({
126
135
  }
127
136
  return new DOMRect(0, 0, 0, 0);
128
137
  }
129
- }), [editor]);
138
+ }), [editor]), floatingOptions = useMemo(() => ({
139
+ placement: "bottom",
140
+ middleware: [offset({
141
+ mainAxis: 0,
142
+ crossAxis: 0
143
+ })],
144
+ strategy: "absolute"
145
+ }), []);
130
146
  return /* @__PURE__ */ jsx(BubbleMenu, { shouldShow: ({
131
147
  editor: editor2
132
- }) => editor2.isActive("information-pane"), editor, tippyOptions, children: editable && /* @__PURE__ */ jsx(Toolbar, { className: "p-8", items: InformationPaneTypeItems }) });
148
+ }) => editor2.isActive("information-pane"), editor, options: floatingOptions, getReferencedVirtualElement: () => reference, children: editable && /* @__PURE__ */ jsx(Toolbar, { className: "p-8", items: InformationPaneTypeItems }) });
133
149
  };
134
150
  export {
135
151
  BubbleMenuEditInformationPane as default
@@ -29,6 +29,7 @@ import { EditorToolbarTextSize } from "./EditorToolbar.TextSize.js";
29
29
  import { EditorToolbarTypography } from "./EditorToolbar.Typography.js";
30
30
  import { EditorToolbarCantoo } from "./EditorToolbar.Cantoo.js";
31
31
  import { useEditorContext } from "../../hooks/useEditorContext.js";
32
+ import { useEditorState } from "../../hooks/useEditorState.js";
32
33
  import { useActionOptions } from "../../hooks/useActionOptions.js";
33
34
  import { useSpeechRecognition } from "../../hooks/useSpeechRecognition.js";
34
35
  import { Toolbar } from "../../../../components/Toolbar/Toolbar.js";
@@ -42,7 +43,7 @@ const EditorToolbar = ({
42
43
  } = useTranslation(), {
43
44
  id,
44
45
  editor
45
- } = useEditorContext(), [plusOptions, listOptions, alignmentOptions] = useActionOptions(editor, toggleMathsModal, mediaLibraryRef), {
46
+ } = useEditorContext(), editorState = useEditorState(editor), [plusOptions, listOptions, alignmentOptions] = useActionOptions(editor, toggleMathsModal, mediaLibraryRef), {
46
47
  isAvailable: canRecognizeSpeech,
47
48
  isActive: speechRecognition,
48
49
  toggle: toggleSpeechRecognition
@@ -72,7 +73,8 @@ const EditorToolbar = ({
72
73
  },
73
74
  name: "undo",
74
75
  tooltip: t("editor.option.undo"),
75
- visibility: showIf(hasExtension("history", editor))
76
+ // v3's StarterKit renamed the undo/redo extension from 'history' to 'undoRedo'.
77
+ visibility: showIf(hasExtension("undoRedo", editor))
76
78
  },
77
79
  //--------------- REDO ---------------//
78
80
  {
@@ -85,7 +87,7 @@ const EditorToolbar = ({
85
87
  },
86
88
  name: "redo",
87
89
  tooltip: t("editor.option.redo"),
88
- visibility: showIf(hasExtension("history", editor))
90
+ visibility: showIf(hasExtension("undoRedo", editor))
89
91
  },
90
92
  //-------------------------------------//
91
93
  {
@@ -348,7 +350,7 @@ const EditorToolbar = ({
348
350
  visibility: showIf(hasExtension("textAlign", editor))
349
351
  }
350
352
  ];
351
- }, [alignmentOptions, canRecognizeSpeech, editor, listOptions, mediaLibraryRef, plusOptions, speechRecognition, t, toggleSpeechRecognition]);
353
+ }, [alignmentOptions, canRecognizeSpeech, editor, editorState, listOptions, mediaLibraryRef, plusOptions, speechRecognition, t, toggleSpeechRecognition]);
352
354
  return /* @__PURE__ */ jsx("div", { className: "sticky-top z-1 editor-toolbar rounded-3", children: /* @__PURE__ */ jsx(Toolbar, { items: toolbarItems, variant: "no-shadow", className: "rounded-top-3", isBlock: !0, align: "left", ariaControls: id }) });
353
355
  };
354
356
  export {
@@ -0,0 +1,12 @@
1
+ import { offset } from "@floating-ui/dom";
2
+ const floatingOptions = {
3
+ placement: "bottom",
4
+ middleware: [offset({
5
+ mainAxis: 10,
6
+ crossAxis: 0
7
+ })],
8
+ strategy: "absolute"
9
+ };
10
+ export {
11
+ floatingOptions
12
+ };
@@ -1,11 +1,12 @@
1
1
  import { jsx, Fragment } from "react/jsx-runtime";
2
2
  import { useState, useMemo, useEffect } from "react";
3
- import { FloatingMenu } from "@tiptap/react";
3
+ import { BubbleMenu } from "../../../../node_modules/.pnpm/@tiptap_react@3.32.0_@floating-ui_dom@1.6.0_@tiptap_core@3.32.0_@tiptap_pm@3.32.0__@tiptap_pm_6inmb43gajy4fnlwtngbwkv7um/node_modules/@tiptap/react/dist/menus/index.js";
4
4
  import { useTranslation } from "react-i18next";
5
+ import { useEditorState } from "../../hooks/useEditorState.js";
5
6
  import SvgIconEdit from "../../../icons/components/IconEdit.js";
6
7
  import SvgIconExternalLink from "../../../icons/components/IconExternalLink.js";
7
8
  import SvgIconUnlink from "../../../icons/components/IconUnlink.js";
8
- import { tippyOptions } from "./LinkToolbar.TippyOptions.js";
9
+ import { floatingOptions } from "./LinkToolbar.FloatingOptions.js";
9
10
  import { Toolbar } from "../../../../components/Toolbar/Toolbar.js";
10
11
  const LinkToolbar = ({
11
12
  editor,
@@ -15,7 +16,7 @@ const LinkToolbar = ({
15
16
  }) => {
16
17
  const {
17
18
  t
18
- } = useTranslation(), [linkAttrs, setLinkAttrs] = useState(), LinkToolbarItems = useMemo(() => [{
19
+ } = useTranslation(), editorState = useEditorState(editor), [linkAttrs, setLinkAttrs] = useState(), LinkToolbarItems = useMemo(() => [{
19
20
  type: "icon",
20
21
  name: "edit",
21
22
  props: {
@@ -54,7 +55,7 @@ const LinkToolbar = ({
54
55
  }], [onEdit, onOpen, onUnlink, t, linkAttrs]);
55
56
  return useEffect(() => {
56
57
  editor != null && editor.isActive("linker") ? setLinkAttrs(editor.getAttributes("linker")) : editor != null && editor.isActive("hyperlink") ? setLinkAttrs(editor.getAttributes("hyperlink")) : setLinkAttrs(void 0);
57
- }, [editor == null ? void 0 : editor.state]), /* @__PURE__ */ jsx(Fragment, { children: editor && /* @__PURE__ */ jsx(FloatingMenu, { editor, tippyOptions, shouldShow: () => (editor == null ? void 0 : editor.isEditable) && ((editor == null ? void 0 : editor.isActive("linker")) || (editor == null ? void 0 : editor.isActive("hyperlink"))) || !1, children: /* @__PURE__ */ jsx(Toolbar, { className: "p-4", items: LinkToolbarItems }) }) });
58
+ }, [editor, editorState]), /* @__PURE__ */ jsx(Fragment, { children: editor && /* @__PURE__ */ jsx(BubbleMenu, { editor, options: floatingOptions, shouldShow: () => (editor == null ? void 0 : editor.isEditable) && ((editor == null ? void 0 : editor.isActive("linker")) || (editor == null ? void 0 : editor.isActive("hyperlink"))) || !1, children: /* @__PURE__ */ jsx(Toolbar, { className: "p-4", items: LinkToolbarItems }) }) });
58
59
  };
59
60
  export {
60
61
  LinkToolbar as default
@@ -1,6 +1,8 @@
1
1
  import { jsx, Fragment } from "react/jsx-runtime";
2
2
  import { useState, useMemo, useEffect } from "react";
3
- import { findParentNodeClosestToPos, FloatingMenu } from "@tiptap/react";
3
+ import { findParentNodeClosestToPos } from "@tiptap/react";
4
+ import { FloatingMenu } from "../../../../node_modules/.pnpm/@tiptap_react@3.32.0_@floating-ui_dom@1.6.0_@tiptap_core@3.32.0_@tiptap_pm@3.32.0__@tiptap_pm_6inmb43gajy4fnlwtngbwkv7um/node_modules/@tiptap/react/dist/menus/index.js";
5
+ import { offset } from "@floating-ui/dom";
4
6
  import { useTranslation } from "react-i18next";
5
7
  import SvgIconMergeCells from "../../../icons/components/IconMergeCells.js";
6
8
  import SvgIconSplitCells from "../../../icons/components/IconSplitCells.js";
@@ -13,7 +15,7 @@ const TableToolbar = ({
13
15
  }) => {
14
16
  const {
15
17
  t
16
- } = useTranslation(), [isSpan, setSpan] = useState(void 0), tippyOptions = useMemo(() => {
18
+ } = useTranslation(), [isSpan, setSpan] = useState(void 0), floatingOptions = useMemo(() => {
17
19
  function adjustRect(rect) {
18
20
  let yOffset = 0;
19
21
  if (window.visualViewport) {
@@ -24,8 +26,11 @@ const TableToolbar = ({
24
26
  }
25
27
  return {
26
28
  placement: "bottom",
27
- offset: [0, 0],
28
- zIndex: 999,
29
+ middleware: [offset({
30
+ mainAxis: 0,
31
+ crossAxis: 0
32
+ })],
33
+ strategy: "absolute",
29
34
  // popperOptions: {modifiers: [ /*see popper v2 modifiers*/ ]},
30
35
  // Try to get the bounding rect of the table.
31
36
  getReferenceClientRect: () => {
@@ -46,7 +51,7 @@ const TableToolbar = ({
46
51
  newSpan !== isSpan && setSpan(newSpan);
47
52
  } else
48
53
  isSpan && setSpan(void 0);
49
- }, [editor, editor == null ? void 0 : editor.state, isSpan]), /* @__PURE__ */ jsx(Fragment, { children: editor && /* @__PURE__ */ jsx(FloatingMenu, { editor, tippyOptions, shouldShow: () => (editor == null ? void 0 : editor.isEditable) && editor.isActive("table") || !1, children: /* @__PURE__ */ jsx(Toolbar, { className: "p-4", items: [{
54
+ }, [editor, editor == null ? void 0 : editor.state, isSpan]), /* @__PURE__ */ jsx(Fragment, { children: editor && /* @__PURE__ */ jsx(FloatingMenu, { editor, options: floatingOptions, shouldShow: () => (editor == null ? void 0 : editor.isEditable) && editor.isActive("table") || !1, children: /* @__PURE__ */ jsx(Toolbar, { className: "p-4", items: [{
50
55
  type: "dropdown",
51
56
  name: "bkg-col",
52
57
  // isEnable:
@@ -1,6 +1,7 @@
1
1
  export * from './useActionOptions';
2
2
  export * from './useCommentEditor';
3
3
  export * from './useEditorContext';
4
+ export * from './useEditorState';
4
5
  export * from './useImageModal';
5
6
  export * from './useImageSelection';
6
7
  export * from './useLinkToolbar';
@@ -6,7 +6,7 @@ import { Content, HTMLContent } from '@tiptap/react';
6
6
  * @param content default rich content
7
7
  */
8
8
  export declare const useCommentEditor: (editable: boolean, content: Content, maxLength?: number) => {
9
- editor: import('@tiptap/core').Editor | null;
9
+ editor: import('@tiptap/core').Editor;
10
10
  commentLength: number;
11
11
  getComment: () => HTMLContent;
12
12
  resetComment: () => void;