dishui 0.0.72 → 0.0.73

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 (93) hide show
  1. package/dist/components/Button/index.d.ts +4 -4
  2. package/dist/components/Button/index.js +18 -17
  3. package/dist/components/Button/index.js.map +1 -1
  4. package/dist/components/Card/Metric.d.ts +17 -0
  5. package/dist/components/Card/Metric2.js +50 -0
  6. package/dist/components/Card/Metric2.js.map +1 -0
  7. package/dist/components/Card/index.d.ts +3 -0
  8. package/dist/components/Card/index.js +118 -117
  9. package/dist/components/Card/index.js.map +1 -1
  10. package/dist/components/Group/index.d.ts +2 -0
  11. package/dist/components/GroupButton/index.d.ts +16 -0
  12. package/dist/components/GroupButton/index.js +41 -0
  13. package/dist/components/GroupButton/index.js.map +1 -0
  14. package/dist/components/GroupedTable/index.d.ts +38 -0
  15. package/dist/components/GroupedTable/index.js +92 -0
  16. package/dist/components/GroupedTable/index.js.map +1 -0
  17. package/dist/components/Layout/index.d.ts +4 -2
  18. package/dist/components/Layout/index.js +1 -1
  19. package/dist/components/Layout/index.js.map +1 -1
  20. package/dist/components/NavigationList/index.d.ts +17 -0
  21. package/dist/components/NavigationList/index.js +48 -0
  22. package/dist/components/NavigationList/index.js.map +1 -0
  23. package/dist/components/Section/index.d.ts +28 -0
  24. package/dist/components/Section/index.js +58 -0
  25. package/dist/components/Section/index.js.map +1 -0
  26. package/dist/components/Select/index.d.ts +2 -0
  27. package/dist/components/Select/index.js +83 -82
  28. package/dist/components/Select/index.js.map +1 -1
  29. package/dist/components/SidebarToggleButton/index.d.ts +16 -1
  30. package/dist/components/SidebarToggleButton/index.js +90 -30
  31. package/dist/components/SidebarToggleButton/index.js.map +1 -1
  32. package/dist/components/Skeleton/index.d.ts +7 -0
  33. package/dist/components/Skeleton/index.js +21 -0
  34. package/dist/components/Skeleton/index.js.map +1 -0
  35. package/dist/components/Tree/Tree.js +5 -2
  36. package/dist/components/Tree/Tree.js.map +1 -1
  37. package/dist/components/pro/RichTextEditor/AIRewrite.js +114 -72
  38. package/dist/components/pro/RichTextEditor/AIRewrite.js.map +1 -1
  39. package/dist/components/pro/RichTextEditor/BlockHandle.js +315 -196
  40. package/dist/components/pro/RichTextEditor/BlockHandle.js.map +1 -1
  41. package/dist/components/pro/RichTextEditor/BubbleToolbar.d.ts +1 -1
  42. package/dist/components/pro/RichTextEditor/BubbleToolbar.js +69 -33
  43. package/dist/components/pro/RichTextEditor/BubbleToolbar.js.map +1 -1
  44. package/dist/components/pro/RichTextEditor/CommentPanel.d.ts +2 -1
  45. package/dist/components/pro/RichTextEditor/CommentPanel.js +100 -81
  46. package/dist/components/pro/RichTextEditor/CommentPanel.js.map +1 -1
  47. package/dist/components/pro/RichTextEditor/CommentPopover.d.ts +2 -1
  48. package/dist/components/pro/RichTextEditor/CommentPopover.js +92 -68
  49. package/dist/components/pro/RichTextEditor/CommentPopover.js.map +1 -1
  50. package/dist/components/pro/RichTextEditor/RichTextEditor.js +24 -22
  51. package/dist/components/pro/RichTextEditor/RichTextEditor.js.map +1 -1
  52. package/dist/components/pro/RichTextEditor/SearchReplace.d.ts +7 -0
  53. package/dist/components/pro/RichTextEditor/SlashMenu.js +136 -73
  54. package/dist/components/pro/RichTextEditor/SlashMenu.js.map +1 -1
  55. package/dist/components/pro/RichTextEditor/Toolbar/Toolbar.d.ts +1 -1
  56. package/dist/components/pro/RichTextEditor/Toolbar/Toolbar.js +346 -313
  57. package/dist/components/pro/RichTextEditor/Toolbar/Toolbar.js.map +1 -1
  58. package/dist/components/pro/RichTextEditor/extensions/CodeBlockView.js +114 -146
  59. package/dist/components/pro/RichTextEditor/extensions/CodeBlockView.js.map +1 -1
  60. package/dist/components/pro/RichTextEditor/extensions/CommentMark.js +2 -2
  61. package/dist/components/pro/RichTextEditor/extensions/CommentMark.js.map +1 -1
  62. package/dist/components/pro/RichTextEditor/extensions/FloatingDialog.js +178 -163
  63. package/dist/components/pro/RichTextEditor/extensions/FloatingDialog.js.map +1 -1
  64. package/dist/components/pro/RichTextEditor/extensions/FontSize.js +8 -5
  65. package/dist/components/pro/RichTextEditor/extensions/FontSize.js.map +1 -1
  66. package/dist/components/pro/RichTextEditor/extensions/MarkdownBlock.d.ts +6 -0
  67. package/dist/components/pro/RichTextEditor/extensions/MarkdownBlock.js +85 -74
  68. package/dist/components/pro/RichTextEditor/extensions/MarkdownBlock.js.map +1 -1
  69. package/dist/components/pro/RichTextEditor/searchUtils.d.ts +23 -0
  70. package/dist/contexts/AppContext.js +47 -45
  71. package/dist/contexts/AppContext.js.map +1 -1
  72. package/dist/dishui.css +1 -1
  73. package/dist/index-nostyled.d.ts +11 -1
  74. package/dist/index.d.ts +11 -1
  75. package/dist/index.js +119 -114
  76. package/dist/layouts/MainLayout.js +9 -10
  77. package/dist/layouts/MainLayout.js.map +1 -1
  78. package/dist/layouts/Sidebar.d.ts +9 -0
  79. package/dist/layouts/Sidebar.js +99 -80
  80. package/dist/layouts/Sidebar.js.map +1 -1
  81. package/dist/layouts/headbar/Headbar.d.ts +1 -1
  82. package/dist/layouts/headbar/Headbar.js +2 -2
  83. package/dist/layouts/headbar/Headbar.js.map +1 -1
  84. package/dist/lite.d.ts +19 -1
  85. package/dist/lite.js +17 -8
  86. package/dist/styles/themeStyles.js +6 -6
  87. package/dist/styles/themeStyles.js.map +1 -1
  88. package/dist/utils/i18n.d.ts +3 -0
  89. package/dist/utils/i18n.js +78 -0
  90. package/dist/utils/i18n.js.map +1 -1
  91. package/dist/utils/menu.js +23 -6
  92. package/dist/utils/menu.js.map +1 -1
  93. package/package.json +8 -2
@@ -1,43 +1,47 @@
1
- import { useCallback as e, useEffect as t, useRef as n, useState as r } from "react";
2
- import { Fragment as i, jsx as a, jsxs as o } from "react/jsx-runtime";
1
+ import { useCallback as e, useEffect as t, useLayoutEffect as n, useRef as r, useState as i } from "react";
2
+ import { Fragment as a, jsx as o, jsxs as s } from "react/jsx-runtime";
3
+ import { NodeSelection as c, Selection as l } from "@tiptap/pm/state";
3
4
  //#region src/components/pro/RichTextEditor/BlockHandle.tsx
4
- var s = ({ editor: s }) => {
5
- let [c, l] = r(!1), [u, d] = r(0), [f, p] = r(!1), [m, h] = r(-1), [g, _] = r(!1), [v, y] = r(null), b = n(null), x = n(null), S = n(null), C = n(!1), w = e(() => {
6
- S.current &&= (clearTimeout(S.current), null);
7
- }, []), T = e(() => {
8
- w(), S.current = setTimeout(() => {
9
- !C.current && !f && !g && l(!1);
5
+ var u = ({ editor: u }) => {
6
+ let [d, f] = i(!1), [p, m] = i(0), [h, g] = i(!1), [_, v] = i("add"), [y, b] = i({
7
+ left: 4,
8
+ top: 0
9
+ }), x = r(null), S = r(null), C = r(!1), [w, T] = i(-1), [E, D] = i(!1), [O, k] = i(null), A = r(null), j = r(null), M = r(null), N = r(!1), P = e(() => {
10
+ M.current &&= (clearTimeout(M.current), null);
11
+ }, []), F = e(() => {
12
+ P(), M.current = setTimeout(() => {
13
+ !N.current && !h && !E && !j.current?.contains(document.activeElement) && !A.current?.contains(document.activeElement) && f(!1);
10
14
  }, 200);
11
15
  }, [
12
- w,
13
- f,
14
- g
15
- ]), E = e(() => {
16
- let e = s.view.dom.closest(".rte-editor-wrapper");
16
+ P,
17
+ h,
18
+ E
19
+ ]), I = e(() => {
20
+ if (u.isDestroyed) return [];
21
+ let e = u.view.dom.closest(".rte-editor-wrapper");
17
22
  if (!e) return [];
18
23
  let t = e.getBoundingClientRect(), n = e.scrollTop, r = [];
19
- return s.state.doc.forEach((e, i) => {
20
- let a = s.view.nodeDOM(i);
21
- if (a) {
22
- let o = a.getBoundingClientRect();
24
+ return u.state.doc.forEach((i, a) => {
25
+ let o = u.view.nodeDOM(a);
26
+ if (o instanceof HTMLElement) {
27
+ let s = o.getBoundingClientRect();
23
28
  r.push({
24
- pos: i,
25
- size: e.nodeSize,
26
- domTop: o.top - t.top + n,
27
- domBottom: o.bottom - t.top + n
29
+ pos: a,
30
+ size: i.nodeSize,
31
+ domTop: s.top - t.top - e.clientTop + n,
32
+ domBottom: s.bottom - t.top - e.clientTop + n
28
33
  });
29
34
  }
30
35
  }), r;
31
- }, [s]), D = e((e) => {
32
- let t = s.view.dom.closest(".rte-editor-wrapper");
36
+ }, [u]), L = e((e) => {
37
+ let t = u.view.dom.closest(".rte-editor-wrapper");
33
38
  if (!t) return -1;
34
- let n = e - t.getBoundingClientRect().top + t.scrollTop, r = E();
35
- for (let e = 0; e < r.length; e++) if (n < (r[e].domTop + r[e].domBottom) / 2) return e;
36
- return r.length - 1;
37
- }, [s, E]), O = e((e) => {
38
- let t = s.view.dom.closest(".rte-editor-wrapper");
39
+ let n = e - t.getBoundingClientRect().top - t.clientTop + t.scrollTop;
40
+ return I().findIndex((e) => n >= e.domTop && n <= e.domBottom);
41
+ }, [u, I]), R = e((e) => {
42
+ let t = u.view.dom.closest(".rte-editor-wrapper");
39
43
  if (!t) return null;
40
- let n = e - t.getBoundingClientRect().top + t.scrollTop, r = E();
44
+ let n = e - t.getBoundingClientRect().top - t.clientTop + t.scrollTop, r = I();
41
45
  if (r.length === 0) return null;
42
46
  let i = 0, a = Infinity, o = r[0].domTop;
43
47
  for (let e = 0; e <= r.length; e++) {
@@ -48,136 +52,285 @@ var s = ({ editor: s }) => {
48
52
  slotIndex: i,
49
53
  indicatorTop: o
50
54
  };
51
- }, [E]);
55
+ }, [u, I]);
52
56
  t(() => {
53
- let e = s.view.dom.closest(".rte-editor-wrapper");
57
+ let e = u.view.dom.closest(".rte-editor-wrapper");
54
58
  if (!e) return;
55
- let t = (e) => {
56
- if (g) return;
57
- let t = D(e.clientY);
58
- if (t < 0) return;
59
- let n = E();
60
- t >= n.length || (d(n[t].domTop), h(t), w(), l(!0));
59
+ let t = (t) => {
60
+ if (E || S.current || h || N.current || !u.isEditable || u.view.composing || j.current?.contains(t.target) || A.current?.contains(t.target)) return;
61
+ let n = L(t.clientY);
62
+ if (n < 0) {
63
+ F();
64
+ return;
65
+ }
66
+ let r = I();
67
+ if (n >= r.length) return;
68
+ let i = Math.max(0, -e.getBoundingClientRect().top);
69
+ m(Math.max(r[n].domTop, e.scrollTop + i + 4)), T(n);
70
+ let a = u.state.doc.nodeAt(r[n].pos);
71
+ x.current = a ? {
72
+ pos: r[n].pos,
73
+ node: a
74
+ } : null, P(), f(!0);
61
75
  }, n = () => {
62
- g || T();
76
+ E || F();
63
77
  };
64
78
  return e.addEventListener("mousemove", t), e.addEventListener("mouseleave", n), () => {
65
- e.removeEventListener("mousemove", t), e.removeEventListener("mouseleave", n), w();
79
+ e.removeEventListener("mousemove", t), e.removeEventListener("mouseleave", n), P();
66
80
  };
67
81
  }, [
68
- s,
69
- w,
70
- T,
71
- g,
72
- D,
73
- E
82
+ u,
83
+ P,
84
+ F,
85
+ E,
86
+ h,
87
+ L,
88
+ I
74
89
  ]), t(() => {
75
- if (!f) return;
90
+ if (!h) return;
76
91
  let e = (e) => {
77
- b.current && !b.current.contains(e.target) && p(!1);
92
+ A.current && !A.current.contains(e.target) && !j.current?.contains(e.target) && (N.current = !1, g(!1));
78
93
  };
79
94
  return document.addEventListener("mousedown", e), () => document.removeEventListener("mousedown", e);
80
- }, [f]);
81
- let k = e(() => {
82
- let e = E();
83
- if (m < 0 || m >= e.length) return;
84
- let t = e[m], n = t.pos + t.size;
85
- try {
86
- s.chain().focus().insertContentAt(n, { type: "paragraph" }).run(), s.commands.focus(n + 1);
87
- } catch {}
88
- p(!1);
95
+ }, [h]);
96
+ let z = e(() => {
97
+ let e = x.current;
98
+ return u.isDestroyed || !u.isEditable || u.view.composing || !e || u.state.doc.nodeAt(e.pos) !== e.node ? null : e;
99
+ }, [u]), B = e((e) => {
100
+ let t = z();
101
+ if (!t) return;
102
+ let n = t.pos + t.node.nodeSize;
103
+ u.chain().focus().insertContentAt(n, e).command(({ tr: e }) => (e.setSelection(l.near(e.doc.resolve(n + 1))), !0)).run(), g(!1);
104
+ }, [u, z]), V = e((e) => {
105
+ let t = z(), n = I();
106
+ if (!t || e < 0 || e > n.length) return;
107
+ let r = n.findIndex((e) => e.pos === t.pos);
108
+ if (r < 0 || e === r || e === r + 1) return;
109
+ let i = n[e]?.pos ?? u.state.doc.content.size, a = u.state.tr.delete(t.pos, t.pos + t.node.nodeSize), o = a.mapping.map(i);
110
+ a.insert(o, t.node), a.setSelection(c.isSelectable(t.node) ? c.create(a.doc, o) : l.near(a.doc.resolve(o))), u.view.dispatch(a.scrollIntoView()), u.view.focus();
89
111
  }, [
90
- s,
91
- m,
92
- E
93
- ]), A = e((e) => {
94
- e.preventDefault(), e.stopPropagation();
95
- let t = m, n = E();
96
- if (t < 0 || t >= n.length) return;
97
- _(!0);
98
- let r = (e) => {
99
- let t = O(e.clientY);
100
- t && y({ top: t.indicatorTop });
101
- }, i = (e) => {
102
- document.removeEventListener("mousemove", r), document.removeEventListener("mouseup", i), _(!1), y(null);
103
- let n = E();
104
- if (t >= n.length) return;
105
- let a = O(e.clientY);
106
- if (!a) return;
107
- let o = a.slotIndex;
108
- if (o === t || o === t + 1) return;
109
- let c = n[t];
110
- if (!s.state.doc.nodeAt(c.pos)) return;
111
- let l;
112
- if (o < n.length) l = n[o].pos;
113
- else {
114
- let e = n[n.length - 1];
115
- l = e.pos + e.size;
116
- }
117
- let u = c.pos, d = c.pos + c.size, f = s.state.doc.slice(u, d).content, { tr: p } = s.state;
118
- if (o <= t) {
119
- p.delete(u, d);
120
- let e = p.mapping.map(l);
121
- p.insert(e, f);
122
- } else p.insert(l, f), p.delete(p.mapping.map(u), p.mapping.map(d));
123
- s.view.dispatch(p);
112
+ u,
113
+ z,
114
+ I
115
+ ]);
116
+ t(() => {
117
+ let e = () => {
118
+ S.current?.(), x.current = null, N.current = !1, f(!1), g(!1), P();
119
+ }, t = ({ transaction: t }) => {
120
+ (t.docChanged || !u.isEditable) && e();
121
+ }, n = (t) => {
122
+ (!(t.target instanceof Node) || !A.current?.contains(t.target)) && e();
123
+ };
124
+ u.on("transaction", t);
125
+ let r = u.view.dom;
126
+ return r.addEventListener("compositionstart", e), window.addEventListener("scroll", n, !0), window.addEventListener("resize", e), window.addEventListener("blur", e), () => {
127
+ u.off("transaction", t), r.removeEventListener("compositionstart", e), window.removeEventListener("scroll", n, !0), window.removeEventListener("resize", e), window.removeEventListener("blur", e), S.current?.(), P();
124
128
  };
125
- document.addEventListener("mousemove", r), document.addEventListener("mouseup", i);
129
+ }, [u, P]), n(() => {
130
+ if (!h) return;
131
+ let e = A.current, t = j.current, n = u.view.dom.closest(".rte-editor-wrapper");
132
+ if (!e || !t || !n) return;
133
+ let r = n.getBoundingClientRect(), i = t.getBoundingClientRect(), a = Math.max(8, r.left + n.clientLeft), o = Math.min(window.innerWidth - 8, r.right), s = Math.max(8, r.top + n.clientTop), c = Math.min(window.innerHeight - 8, r.bottom) - i.bottom - 4, l = i.top - s - 4, d = c < e.scrollHeight && l > c;
134
+ e.style.maxHeight = `${Math.max(0, Math.min(320, d ? l : c))}px`, e.style.minWidth = "0", e.style.width = `${Math.max(0, Math.min(220, o - a))}px`, b({
135
+ left: Math.max(a, Math.min(i.left, o - e.offsetWidth)) - r.left - n.clientLeft + n.scrollLeft,
136
+ top: (d ? i.top - e.offsetHeight - 4 : i.bottom + 4) - r.top - n.clientTop + n.scrollTop
137
+ });
138
+ let f = _ === "actions" ? "button:not(:disabled)" : "button";
139
+ e.querySelector(f)?.focus({ preventScroll: !0 });
126
140
  }, [
127
- s,
128
- m,
129
- E,
130
- O
141
+ u,
142
+ h,
143
+ _
131
144
  ]);
132
- return !c && !f && !g ? null : /* @__PURE__ */ o(i, { children: [
133
- /* @__PURE__ */ o("div", {
134
- ref: x,
145
+ let H = e((e) => {
146
+ if (e.preventDefault(), e.stopPropagation(), e.button !== 0 || !z()) return;
147
+ S.current?.(), C.current = !1;
148
+ let t = e.clientX, n = e.clientY, r = !1, i = (e) => {
149
+ if (!r && Math.hypot(e.clientX - t, e.clientY - n) < 5) return;
150
+ r = !0, C.current = !0, g(!1), D(!0);
151
+ let i = R(e.clientY);
152
+ i && k({ top: i.indicatorTop });
153
+ }, a = () => {
154
+ document.removeEventListener("mousemove", i), document.removeEventListener("mouseup", s), document.removeEventListener("keydown", o, !0), S.current = null, D(!1), k(null);
155
+ }, o = (e) => {
156
+ e.key === "Escape" && (e.preventDefault(), e.stopImmediatePropagation(), C.current = !0, a());
157
+ }, s = (e) => {
158
+ if (a(), !r) return;
159
+ let t = u.view.dom.closest(".rte-editor-wrapper")?.getBoundingClientRect();
160
+ if (!t || e.clientX < t.left || e.clientX > t.right || e.clientY < t.top || e.clientY > t.bottom) return;
161
+ let n = R(e.clientY);
162
+ n && V(n.slotIndex);
163
+ };
164
+ S.current = a, document.addEventListener("mousemove", i), document.addEventListener("mouseup", s), document.addEventListener("keydown", o, !0);
165
+ }, [
166
+ u,
167
+ z,
168
+ V,
169
+ R
170
+ ]), U = { type: "paragraph" }, W = [
171
+ {
172
+ label: "Text",
173
+ content: U
174
+ },
175
+ ...[
176
+ 1,
177
+ 2,
178
+ 3
179
+ ].map((e) => ({
180
+ label: `Heading ${e}`,
181
+ content: {
182
+ type: "heading",
183
+ attrs: { level: e }
184
+ }
185
+ })),
186
+ {
187
+ label: "Bullet List",
188
+ content: {
189
+ type: "bulletList",
190
+ content: [{
191
+ type: "listItem",
192
+ content: [U]
193
+ }]
194
+ }
195
+ },
196
+ {
197
+ label: "Numbered List",
198
+ content: {
199
+ type: "orderedList",
200
+ content: [{
201
+ type: "listItem",
202
+ content: [U]
203
+ }]
204
+ }
205
+ },
206
+ {
207
+ label: "Task List",
208
+ content: {
209
+ type: "taskList",
210
+ content: [{
211
+ type: "taskItem",
212
+ attrs: { checked: !1 },
213
+ content: [U]
214
+ }]
215
+ }
216
+ },
217
+ {
218
+ label: "Blockquote",
219
+ content: {
220
+ type: "blockquote",
221
+ content: [U]
222
+ }
223
+ },
224
+ {
225
+ label: "Code Block",
226
+ content: { type: "codeBlock" }
227
+ },
228
+ {
229
+ label: "Divider",
230
+ content: { type: "horizontalRule" }
231
+ },
232
+ {
233
+ label: "Table 3×3",
234
+ content: {
235
+ type: "table",
236
+ content: Array.from({ length: 3 }, (e, t) => ({
237
+ type: "tableRow",
238
+ content: Array.from({ length: 3 }, () => ({
239
+ type: t === 0 ? "tableHeader" : "tableCell",
240
+ content: [U]
241
+ }))
242
+ }))
243
+ }
244
+ }
245
+ ], G = _ === "add" ? W.filter((e) => u.schema.nodes[e.content.type]) : [
246
+ { label: "Duplicate" },
247
+ { label: "Delete" },
248
+ {
249
+ label: "Move up",
250
+ disabled: w <= 0
251
+ },
252
+ {
253
+ label: "Move down",
254
+ disabled: w >= u.state.doc.childCount - 1
255
+ }
256
+ ], K = (e) => {
257
+ if (e.disabled) return;
258
+ let t = z();
259
+ if (t) {
260
+ if (e.content) B(e.content);
261
+ else if (e.label === "Duplicate") {
262
+ let e = t.pos + t.node.nodeSize, n = u.state.tr.insert(e, t.node);
263
+ n.setSelection(l.near(n.doc.resolve(e + 1))), u.view.dispatch(n.scrollIntoView()), u.view.focus();
264
+ } else e.label === "Delete" ? u.chain().focus().deleteRange({
265
+ from: t.pos,
266
+ to: t.pos + t.node.nodeSize
267
+ }).run() : e.label === "Move up" ? V(w - 1) : e.label === "Move down" && V(w + 2);
268
+ }
269
+ };
270
+ return !d && !h && !E ? null : /* @__PURE__ */ s(a, { children: [
271
+ /* @__PURE__ */ s("div", {
272
+ ref: j,
135
273
  className: "rte-block-handle",
136
- style: { top: u },
274
+ style: { top: p },
275
+ onFocus: P,
276
+ onBlur: F,
137
277
  onMouseEnter: () => {
138
- C.current = !0, w();
278
+ N.current = !0, P();
139
279
  },
140
280
  onMouseLeave: () => {
141
- C.current = !1, g || T();
281
+ N.current = !1, E || F();
142
282
  },
143
283
  onMouseDown: (e) => {
144
284
  e.stopPropagation(), e.preventDefault();
145
285
  },
146
- children: [/* @__PURE__ */ a("button", {
286
+ children: [/* @__PURE__ */ o("button", {
147
287
  type: "button",
148
288
  className: "rte-block-handle__btn rte-block-handle__btn--add",
149
289
  onMouseDown: (e) => {
150
290
  e.stopPropagation(), e.preventDefault();
151
291
  },
152
292
  onClick: (e) => {
153
- e.stopPropagation(), p(!f);
293
+ e.stopPropagation(), z() && (v("add"), g(!h || _ !== "add"));
154
294
  },
295
+ "aria-label": "Add block",
296
+ "aria-haspopup": "menu",
297
+ "aria-expanded": h && _ === "add",
155
298
  title: "Add block",
156
- children: /* @__PURE__ */ o("svg", {
299
+ children: /* @__PURE__ */ s("svg", {
157
300
  width: "14",
158
301
  height: "14",
159
302
  viewBox: "0 0 24 24",
160
303
  fill: "none",
161
304
  stroke: "currentColor",
162
305
  strokeWidth: "2",
163
- children: [/* @__PURE__ */ a("line", {
306
+ children: [/* @__PURE__ */ o("line", {
164
307
  x1: "12",
165
308
  y1: "5",
166
309
  x2: "12",
167
310
  y2: "19"
168
- }), /* @__PURE__ */ a("line", {
311
+ }), /* @__PURE__ */ o("line", {
169
312
  x1: "5",
170
313
  y1: "12",
171
314
  x2: "19",
172
315
  y2: "12"
173
316
  })]
174
317
  })
175
- }), /* @__PURE__ */ a("button", {
318
+ }), /* @__PURE__ */ o("button", {
176
319
  type: "button",
177
- className: `rte-block-handle__btn rte-block-handle__btn--drag ${g ? "rte-block-handle__btn--dragging" : ""}`,
178
- title: "Drag to reorder",
179
- onMouseDown: A,
180
- children: /* @__PURE__ */ o("svg", {
320
+ className: `rte-block-handle__btn rte-block-handle__btn--drag ${E ? "rte-block-handle__btn--dragging" : ""}`,
321
+ title: "Drag to reorder or click for block actions",
322
+ "aria-label": "Block actions",
323
+ "aria-haspopup": "menu",
324
+ "aria-expanded": h && _ === "actions",
325
+ onMouseDown: H,
326
+ onClick: (e) => {
327
+ if (e.stopPropagation(), C.current) {
328
+ C.current = !1;
329
+ return;
330
+ }
331
+ z() && (v("actions"), g(!h || _ !== "actions"));
332
+ },
333
+ children: /* @__PURE__ */ s("svg", {
181
334
  width: "14",
182
335
  height: "14",
183
336
  viewBox: "0 0 24 24",
@@ -185,32 +338,32 @@ var s = ({ editor: s }) => {
185
338
  stroke: "currentColor",
186
339
  strokeWidth: "2",
187
340
  children: [
188
- /* @__PURE__ */ a("circle", {
341
+ /* @__PURE__ */ o("circle", {
189
342
  cx: "9",
190
343
  cy: "6",
191
344
  r: "1.5"
192
345
  }),
193
- /* @__PURE__ */ a("circle", {
346
+ /* @__PURE__ */ o("circle", {
194
347
  cx: "15",
195
348
  cy: "6",
196
349
  r: "1.5"
197
350
  }),
198
- /* @__PURE__ */ a("circle", {
351
+ /* @__PURE__ */ o("circle", {
199
352
  cx: "9",
200
353
  cy: "12",
201
354
  r: "1.5"
202
355
  }),
203
- /* @__PURE__ */ a("circle", {
356
+ /* @__PURE__ */ o("circle", {
204
357
  cx: "15",
205
358
  cy: "12",
206
359
  r: "1.5"
207
360
  }),
208
- /* @__PURE__ */ a("circle", {
361
+ /* @__PURE__ */ o("circle", {
209
362
  cx: "9",
210
363
  cy: "18",
211
364
  r: "1.5"
212
365
  }),
213
- /* @__PURE__ */ a("circle", {
366
+ /* @__PURE__ */ o("circle", {
214
367
  cx: "15",
215
368
  cy: "18",
216
369
  r: "1.5"
@@ -219,99 +372,65 @@ var s = ({ editor: s }) => {
219
372
  })
220
373
  })]
221
374
  }),
222
- f && /* @__PURE__ */ a("div", {
223
- ref: b,
375
+ h && /* @__PURE__ */ o("div", {
376
+ ref: A,
224
377
  className: "rte-block-handle__menu",
225
- style: { top: u + 28 },
226
- onMouseDown: (e) => e.stopPropagation(),
227
- children: [
228
- {
229
- label: "Text",
230
- action: () => {
231
- k();
232
- }
233
- },
234
- {
235
- label: "Heading 1",
236
- action: () => {
237
- k(), s.chain().focus().toggleHeading({ level: 1 }).run();
238
- }
239
- },
240
- {
241
- label: "Heading 2",
242
- action: () => {
243
- k(), s.chain().focus().toggleHeading({ level: 2 }).run();
244
- }
245
- },
246
- {
247
- label: "Heading 3",
248
- action: () => {
249
- k(), s.chain().focus().toggleHeading({ level: 3 }).run();
250
- }
251
- },
252
- {
253
- label: "Bullet List",
254
- action: () => {
255
- k(), s.chain().focus().toggleBulletList().run();
256
- }
257
- },
258
- {
259
- label: "Numbered List",
260
- action: () => {
261
- k(), s.chain().focus().toggleOrderedList().run();
262
- }
263
- },
264
- {
265
- label: "Task List",
266
- action: () => {
267
- k(), s.chain().focus().toggleTaskList().run();
268
- }
269
- },
270
- {
271
- label: "Blockquote",
272
- action: () => {
273
- k(), s.chain().focus().toggleBlockquote().run();
274
- }
275
- },
276
- {
277
- label: "Code Block",
278
- action: () => {
279
- k(), s.chain().focus().toggleNode("codeBlock", "paragraph").run();
280
- }
281
- },
282
- {
283
- label: "Divider",
284
- action: () => {
285
- k(), s.chain().focus().setHorizontalRule().run();
286
- }
287
- },
288
- {
289
- label: "Table 3×3",
290
- action: () => {
291
- k(), s.chain().focus().insertTable({
292
- rows: 3,
293
- cols: 3,
294
- withHeaderRow: !0
295
- }).run();
296
- }
378
+ role: "menu",
379
+ "aria-label": _ === "add" ? "Add block" : "Block actions",
380
+ style: {
381
+ ...y,
382
+ overflowY: "auto"
383
+ },
384
+ onMouseEnter: () => {
385
+ N.current = !0, P();
386
+ },
387
+ onMouseLeave: () => {
388
+ N.current = !1;
389
+ },
390
+ onMouseDown: (e) => {
391
+ e.stopPropagation(), e.preventDefault();
392
+ },
393
+ onKeyDown: (e) => {
394
+ if (e.nativeEvent.isComposing || e.keyCode === 229) return;
395
+ if (e.key === "Escape" || e.key === "Tab") {
396
+ e.key === "Escape" && e.preventDefault(), e.stopPropagation(), N.current = !1, g(!1), j.current?.querySelector(_ === "add" ? ".rte-block-handle__btn--add" : ".rte-block-handle__btn--drag")?.focus({ preventScroll: !0 });
397
+ return;
297
398
  }
298
- ].map((e) => /* @__PURE__ */ a("button", {
399
+ if (![
400
+ "ArrowDown",
401
+ "ArrowUp",
402
+ "Home",
403
+ "End"
404
+ ].includes(e.key)) return;
405
+ e.preventDefault(), e.stopPropagation();
406
+ let t = Array.from(e.currentTarget.querySelectorAll("button:not(:disabled)")), n = t.indexOf(document.activeElement), r = e.key === "Home" ? 0 : e.key === "End" ? t.length - 1 : (n + (e.key === "ArrowDown" ? 1 : -1) + t.length) % t.length;
407
+ t[r]?.focus({ preventScroll: !0 });
408
+ let i = t[r];
409
+ i && i.offsetTop < e.currentTarget.scrollTop ? e.currentTarget.scrollTop = i.offsetTop : i && i.offsetTop + i.offsetHeight > e.currentTarget.scrollTop + e.currentTarget.clientHeight && (e.currentTarget.scrollTop = i.offsetTop + i.offsetHeight - e.currentTarget.clientHeight);
410
+ },
411
+ children: G.map((e) => /* @__PURE__ */ o("button", {
299
412
  type: "button",
413
+ role: "menuitem",
414
+ disabled: e.disabled,
415
+ style: e.disabled ? {
416
+ opacity: .45,
417
+ cursor: "default"
418
+ } : void 0,
300
419
  className: "rte-block-handle__menu-item",
301
420
  onMouseDown: (e) => e.stopPropagation(),
302
421
  onClick: (t) => {
303
- t.stopPropagation(), e.action(), p(!1);
422
+ t.stopPropagation(), K(e), g(!1), N.current = !1;
304
423
  },
305
424
  children: e.label
306
425
  }, e.label))
307
426
  }),
308
- g && v && /* @__PURE__ */ a("div", {
427
+ E && O && /* @__PURE__ */ o("div", {
309
428
  className: "rte-block-handle__drop-indicator",
310
- style: { top: v.top }
429
+ style: { top: O.top }
311
430
  })
312
431
  ] });
313
432
  };
314
433
  //#endregion
315
- export { s as default };
434
+ export { u as default };
316
435
 
317
436
  //# sourceMappingURL=BlockHandle.js.map