dishui 0.0.72 → 0.0.74

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 (100) 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 +156 -39
  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 +132 -73
  54. package/dist/components/pro/RichTextEditor/SlashMenu.js.map +1 -1
  55. package/dist/components/pro/RichTextEditor/Toolbar/ColorPicker.d.ts +2 -0
  56. package/dist/components/pro/RichTextEditor/Toolbar/ColorPicker.js +9 -9
  57. package/dist/components/pro/RichTextEditor/Toolbar/ColorPicker.js.map +1 -1
  58. package/dist/components/pro/RichTextEditor/Toolbar/FloatingDialogMenu.js +8 -13
  59. package/dist/components/pro/RichTextEditor/Toolbar/FloatingDialogMenu.js.map +1 -1
  60. package/dist/components/pro/RichTextEditor/Toolbar/MarkdownTemplates.js +22 -3
  61. package/dist/components/pro/RichTextEditor/Toolbar/MarkdownTemplates.js.map +1 -1
  62. package/dist/components/pro/RichTextEditor/Toolbar/Toolbar.d.ts +1 -1
  63. package/dist/components/pro/RichTextEditor/Toolbar/Toolbar.js +346 -313
  64. package/dist/components/pro/RichTextEditor/Toolbar/Toolbar.js.map +1 -1
  65. package/dist/components/pro/RichTextEditor/extensions/CodeBlockView.js +120 -146
  66. package/dist/components/pro/RichTextEditor/extensions/CodeBlockView.js.map +1 -1
  67. package/dist/components/pro/RichTextEditor/extensions/CommentMark.js +2 -2
  68. package/dist/components/pro/RichTextEditor/extensions/CommentMark.js.map +1 -1
  69. package/dist/components/pro/RichTextEditor/extensions/FloatingDialog.js +178 -163
  70. package/dist/components/pro/RichTextEditor/extensions/FloatingDialog.js.map +1 -1
  71. package/dist/components/pro/RichTextEditor/extensions/FontSize.js +8 -5
  72. package/dist/components/pro/RichTextEditor/extensions/FontSize.js.map +1 -1
  73. package/dist/components/pro/RichTextEditor/extensions/MarkdownBlock.d.ts +6 -0
  74. package/dist/components/pro/RichTextEditor/extensions/MarkdownBlock.js +85 -74
  75. package/dist/components/pro/RichTextEditor/extensions/MarkdownBlock.js.map +1 -1
  76. package/dist/components/pro/RichTextEditor/searchUtils.d.ts +23 -0
  77. package/dist/contexts/AppContext.js +47 -45
  78. package/dist/contexts/AppContext.js.map +1 -1
  79. package/dist/dishui.css +1 -1
  80. package/dist/index-nostyled.d.ts +11 -1
  81. package/dist/index.d.ts +11 -1
  82. package/dist/index.js +119 -114
  83. package/dist/layouts/MainLayout.js +9 -10
  84. package/dist/layouts/MainLayout.js.map +1 -1
  85. package/dist/layouts/Sidebar.d.ts +9 -0
  86. package/dist/layouts/Sidebar.js +99 -80
  87. package/dist/layouts/Sidebar.js.map +1 -1
  88. package/dist/layouts/headbar/Headbar.d.ts +1 -1
  89. package/dist/layouts/headbar/Headbar.js +2 -2
  90. package/dist/layouts/headbar/Headbar.js.map +1 -1
  91. package/dist/lite.d.ts +19 -1
  92. package/dist/lite.js +17 -8
  93. package/dist/styles/themeStyles.js +6 -6
  94. package/dist/styles/themeStyles.js.map +1 -1
  95. package/dist/utils/i18n.d.ts +3 -0
  96. package/dist/utils/i18n.js +78 -0
  97. package/dist/utils/i18n.js.map +1 -1
  98. package/dist/utils/menu.js +23 -6
  99. package/dist/utils/menu.js.map +1 -1
  100. package/package.json +8 -2
@@ -1,65 +1,31 @@
1
- import { useEffect as e, useRef as t, useState as n } from "react";
2
- import { Fragment as r, jsx as i, jsxs as a } from "react/jsx-runtime";
3
- import { Prism as o } from "react-syntax-highlighter";
4
- import { oneLight as s } from "react-syntax-highlighter/dist/esm/styles/prism";
5
- import c from "react-markdown";
6
- import l from "remark-gfm";
7
- import u from "rehype-katex";
8
- import d from "rehype-raw";
1
+ import { MermaidRenderer as e, useNodeEditable as t } from "./MarkdownBlock.js";
2
+ import { useEffect as n, useState as r } from "react";
3
+ import { Fragment as i, jsx as a, jsxs as o } from "react/jsx-runtime";
4
+ import { Prism as s } from "react-syntax-highlighter";
5
+ import { oneLight as c } from "react-syntax-highlighter/dist/esm/styles/prism";
6
+ import l from "react-markdown";
7
+ import u from "remark-gfm";
8
+ import d from "rehype-katex";
9
9
  import f from "remark-math";
10
- import p from "mermaid";
11
10
  import "katex/dist/katex.min.css";
12
- import { Node as m, NodeViewContent as h, NodeViewWrapper as g, ReactNodeViewRenderer as _, mergeAttributes as v, textblockTypeInputRule as y } from "@tiptap/react";
13
- import { Plugin as b, PluginKey as x } from "@tiptap/pm/state";
11
+ import { Node as p, NodeViewContent as m, NodeViewWrapper as h, ReactNodeViewRenderer as g, mergeAttributes as _, textblockTypeInputRule as v } from "@tiptap/react";
12
+ import { Plugin as y, PluginKey as b } from "@tiptap/pm/state";
14
13
  //#region src/components/pro/RichTextEditor/extensions/CodeBlockView.tsx
15
- var S = !1;
16
- function C() {
17
- S ||= (p.initialize({
18
- startOnLoad: !1,
19
- theme: "default",
20
- securityLevel: "loose",
21
- fontFamily: "inherit",
22
- flowchart: {
23
- useMaxWidth: !0,
24
- htmlLabels: !0
25
- }
26
- }), !0);
27
- }
28
- var w = ({ code: n }) => {
29
- let r = t(null);
30
- return e(() => {
31
- if (!n.trim() || !r.current) return;
32
- C();
33
- let e = !1;
34
- return (async () => {
35
- try {
36
- let t = `mermaid-cb-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`, { svg: i } = await p.render(t, n);
37
- !e && r.current && (r.current.innerHTML = i);
38
- } catch (t) {
39
- !e && r.current && (r.current.innerHTML = `<pre style="color:#ef4444;font-size:12px;padding:8px;">${String(t)}</pre>`);
40
- }
41
- })(), () => {
42
- e = !0;
43
- };
44
- }, [n]), /* @__PURE__ */ i("div", {
45
- ref: r,
46
- className: "rte-mermaid-container"
47
- });
48
- }, T = ({ code: e }) => {
14
+ var x = ({ code: e }) => {
49
15
  let t = e.includes("$$") ? e : `$$\n${e}\n$$`;
50
- return /* @__PURE__ */ i(c, {
16
+ return /* @__PURE__ */ a(l, {
51
17
  remarkPlugins: [f],
52
- rehypePlugins: [u],
18
+ rehypePlugins: [d],
53
19
  children: t
54
20
  });
55
- }, E = ({ code: e }) => /* @__PURE__ */ i(c, {
56
- remarkPlugins: [l, f],
57
- rehypePlugins: [u, d],
58
- components: { code({ className: e, children: t, ...n }) {
59
- let r = /language-(\w+)/.exec(e || "")?.[1], a = String(t).replace(/\n$/, "");
60
- return r === "mermaid" ? /* @__PURE__ */ i(w, { code: a }) : r ? /* @__PURE__ */ i(o, {
61
- style: s,
62
- language: r,
21
+ }, S = ({ code: t }) => /* @__PURE__ */ a(l, {
22
+ remarkPlugins: [u, f],
23
+ rehypePlugins: [d],
24
+ components: { code({ className: t, children: n, ...r }) {
25
+ let i = /language-(\w+)/.exec(t || "")?.[1], o = String(n).replace(/\n$/, "");
26
+ return i === "mermaid" ? /* @__PURE__ */ a(e, { code: o }) : i ? /* @__PURE__ */ a(s, {
27
+ style: c,
28
+ language: i,
63
29
  PreTag: "div",
64
30
  customStyle: {
65
31
  borderRadius: "0.5rem",
@@ -67,32 +33,34 @@ var w = ({ code: n }) => {
67
33
  padding: "1em",
68
34
  margin: "0.5em 0"
69
35
  },
70
- children: a
71
- }) : /* @__PURE__ */ i("code", {
72
- className: e,
73
- ...n,
74
- children: t
36
+ children: o
37
+ }) : /* @__PURE__ */ a("code", {
38
+ className: t,
39
+ ...r,
40
+ children: n
75
41
  });
76
42
  } },
77
- children: e
78
- }), D = [
43
+ children: t
44
+ }), C = [
79
45
  "r-markdown",
80
46
  "r-mermaid",
81
47
  "r-math"
82
- ], O = /* @__PURE__ */ ".javascript.typescript.python.rust.go.java.c.cpp.csharp.ruby.php.swift.kotlin.sql.bash.shell.html.css.json.yaml.toml.xml.markdown.mermaid.math.docker.graphql.latex.tex".split(".");
83
- [...O, ...D];
84
- function k(e) {
85
- return D.includes(e);
48
+ ], w = /* @__PURE__ */ ".javascript.typescript.python.rust.go.java.c.cpp.csharp.ruby.php.swift.kotlin.sql.bash.shell.html.css.json.yaml.toml.xml.markdown.mermaid.math.docker.graphql.latex.tex".split(".");
49
+ [...w, ...C];
50
+ function T(e) {
51
+ return C.includes(e);
86
52
  }
87
- function A(e) {
53
+ function E(e) {
88
54
  return e === "math" || e === "latex" || e === "tex" ? "latex" : e;
89
55
  }
90
- var j = ({ node: t, updateAttributes: c }) => {
91
- let l = t.attrs.language || "", u = t.textContent, d = !!l, f = k(l), [p, m] = n(!0);
92
- e(() => {
93
- d || m(!0);
94
- }, [l, d]);
95
- let _ = /* @__PURE__ */ a("svg", {
56
+ var D = ({ node: l, editor: u, updateAttributes: d }) => {
57
+ let f = t(u), p = l.attrs.language || "", g = l.textContent, _ = !!p, v = T(p), [y, b] = r(!0);
58
+ n(() => {
59
+ _ || b(!0);
60
+ }, [p, _]), n(() => {
61
+ f || b(!1);
62
+ }, [f]);
63
+ let D = y && f, O = /* @__PURE__ */ o("svg", {
96
64
  width: "12",
97
65
  height: "12",
98
66
  viewBox: "0 0 24 24",
@@ -101,8 +69,8 @@ var j = ({ node: t, updateAttributes: c }) => {
101
69
  strokeWidth: "2",
102
70
  strokeLinecap: "round",
103
71
  strokeLinejoin: "round",
104
- children: [/* @__PURE__ */ i("path", { d: "M11 4H4a2 2 0 00-2 2v14a2 2 0 002 2h14a2 2 0 002-2v-7" }), /* @__PURE__ */ i("path", { d: "M18.5 2.5a2.121 2.121 0 013 3L12 15l-4 1 1-4 9.5-9.5z" })]
105
- }), v = /* @__PURE__ */ a("svg", {
72
+ children: [/* @__PURE__ */ a("path", { d: "M11 4H4a2 2 0 00-2 2v14a2 2 0 002 2h14a2 2 0 002-2v-7" }), /* @__PURE__ */ a("path", { d: "M18.5 2.5a2.121 2.121 0 013 3L12 15l-4 1 1-4 9.5-9.5z" })]
73
+ }), k = /* @__PURE__ */ o("svg", {
106
74
  width: "12",
107
75
  height: "12",
108
76
  viewBox: "0 0 24 24",
@@ -111,101 +79,106 @@ var j = ({ node: t, updateAttributes: c }) => {
111
79
  strokeWidth: "2",
112
80
  strokeLinecap: "round",
113
81
  strokeLinejoin: "round",
114
- children: [/* @__PURE__ */ i("path", { d: "M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z" }), /* @__PURE__ */ i("circle", {
82
+ children: [/* @__PURE__ */ a("path", { d: "M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z" }), /* @__PURE__ */ a("circle", {
115
83
  cx: "12",
116
84
  cy: "12",
117
85
  r: "3"
118
86
  })]
119
- }), y = () => l === "r-mermaid" ? u.trim() ? /* @__PURE__ */ i(w, { code: u }) : /* @__PURE__ */ i("p", {
87
+ }), A = () => p === "r-mermaid" ? g.trim() ? /* @__PURE__ */ a(e, { code: g }) : /* @__PURE__ */ a("p", {
120
88
  className: "rte-codeblock__placeholder",
121
89
  children: "Enter mermaid diagram code..."
122
- }) : l === "r-math" ? u.trim() ? /* @__PURE__ */ i(T, { code: u }) : /* @__PURE__ */ i("p", {
90
+ }) : p === "r-math" ? g.trim() ? /* @__PURE__ */ a(x, { code: g }) : /* @__PURE__ */ a("p", {
123
91
  className: "rte-codeblock__placeholder",
124
92
  children: "Enter KaTeX math formula..."
125
- }) : l === "r-markdown" ? u.trim() ? /* @__PURE__ */ i(E, { code: u }) : /* @__PURE__ */ i("p", {
93
+ }) : p === "r-markdown" ? g.trim() ? /* @__PURE__ */ a(S, { code: g }) : /* @__PURE__ */ a("p", {
126
94
  className: "rte-codeblock__placeholder",
127
95
  children: "Enter Markdown content..."
128
- }) : null, b = l.startsWith("r-") ? l.slice(2) + " (render)" : l || "plain text";
129
- return /* @__PURE__ */ i(g, {
130
- className: `rte-codeblock-wrapper ${!p && d ? "rte-codeblock-wrapper--preview" : ""}`,
131
- children: p ? /* @__PURE__ */ a(r, { children: [/* @__PURE__ */ a("div", {
96
+ }) : null, j = p.startsWith("r-") ? p.slice(2) + " (render)" : p || "plain text";
97
+ return /* @__PURE__ */ a(h, {
98
+ className: `rte-codeblock-wrapper ${!y && _ ? "rte-codeblock-wrapper--preview" : ""}`,
99
+ children: D ? /* @__PURE__ */ o(i, { children: [/* @__PURE__ */ o("div", {
132
100
  className: "rte-codeblock__header",
133
- children: [/* @__PURE__ */ a("select", {
101
+ children: [/* @__PURE__ */ o("select", {
134
102
  className: "rte-codeblock__lang-select",
135
- value: l,
103
+ value: p,
104
+ disabled: !f,
136
105
  onChange: (e) => {
137
- c({ language: e.target.value }), e.target.value || m(!0);
106
+ !u.isDestroyed && u.isEditable && (d({ language: e.target.value }), e.target.value || b(!0));
138
107
  },
139
108
  contentEditable: !1,
140
109
  children: [
141
- /* @__PURE__ */ i("option", {
110
+ /* @__PURE__ */ a("option", {
142
111
  value: "",
143
112
  children: "Plain text"
144
113
  }),
145
- /* @__PURE__ */ i("optgroup", {
114
+ /* @__PURE__ */ a("optgroup", {
146
115
  label: "Syntax Highlight",
147
- children: O.filter(Boolean).map((e) => /* @__PURE__ */ i("option", {
116
+ children: w.filter(Boolean).map((e) => /* @__PURE__ */ a("option", {
148
117
  value: e,
149
118
  children: e
150
119
  }, e))
151
120
  }),
152
- /* @__PURE__ */ i("optgroup", {
121
+ /* @__PURE__ */ a("optgroup", {
153
122
  label: "Live Render",
154
- children: D.map((e) => /* @__PURE__ */ i("option", {
123
+ children: C.map((e) => /* @__PURE__ */ a("option", {
155
124
  value: e,
156
125
  children: e
157
126
  }, e))
158
127
  })
159
128
  ]
160
- }), d && /* @__PURE__ */ a("button", {
129
+ }), _ && /* @__PURE__ */ o("button", {
161
130
  type: "button",
162
131
  className: "rte-codeblock__preview-btn",
163
- onClick: () => m(!1),
132
+ onClick: () => b(!1),
164
133
  contentEditable: !1,
165
- children: [v, " Preview"]
134
+ children: [k, " Preview"]
166
135
  })]
167
- }), /* @__PURE__ */ i("pre", {
136
+ }), /* @__PURE__ */ a("pre", {
168
137
  className: "rte-codeblock__editable-pre",
169
- children: /* @__PURE__ */ i(h, { as: "code" })
170
- })] }) : f ? /* @__PURE__ */ a("div", {
138
+ children: /* @__PURE__ */ a(m, { as: "code" })
139
+ })] }) : v ? /* @__PURE__ */ o("div", {
171
140
  className: "rte-codeblock__render-preview",
172
141
  contentEditable: !1,
173
- onDoubleClick: () => m(!0),
174
- children: [/* @__PURE__ */ a("div", {
142
+ onDoubleClick: () => {
143
+ f && b(!0);
144
+ },
145
+ children: [/* @__PURE__ */ o("div", {
175
146
  className: "rte-codeblock__preview-toolbar",
176
147
  contentEditable: !1,
177
- children: [/* @__PURE__ */ i("span", {
148
+ children: [/* @__PURE__ */ a("span", {
178
149
  className: "rte-codeblock__preview-label",
179
- children: b
180
- }), /* @__PURE__ */ a("button", {
150
+ children: j
151
+ }), f && /* @__PURE__ */ o("button", {
181
152
  type: "button",
182
153
  className: "rte-codeblock__preview-edit-btn",
183
- onClick: () => m(!0),
184
- children: [_, " Edit"]
154
+ onClick: () => b(!0),
155
+ children: [O, " Edit"]
185
156
  })]
186
- }), /* @__PURE__ */ i("div", {
157
+ }), /* @__PURE__ */ a("div", {
187
158
  className: "rte-codeblock__render-body",
188
- children: y()
159
+ children: A()
189
160
  })]
190
- }) : /* @__PURE__ */ a("div", {
161
+ }) : /* @__PURE__ */ o("div", {
191
162
  className: "rte-codeblock__syntax-preview",
192
163
  contentEditable: !1,
193
- onDoubleClick: () => m(!0),
194
- children: [/* @__PURE__ */ a("div", {
164
+ onDoubleClick: () => {
165
+ f && b(!0);
166
+ },
167
+ children: [/* @__PURE__ */ o("div", {
195
168
  className: "rte-codeblock__preview-toolbar",
196
169
  contentEditable: !1,
197
- children: [/* @__PURE__ */ i("span", {
170
+ children: [/* @__PURE__ */ a("span", {
198
171
  className: "rte-codeblock__preview-label",
199
- children: b
200
- }), /* @__PURE__ */ a("button", {
172
+ children: j
173
+ }), f && /* @__PURE__ */ o("button", {
201
174
  type: "button",
202
175
  className: "rte-codeblock__preview-edit-btn",
203
- onClick: () => m(!0),
204
- children: [_, " Edit"]
176
+ onClick: () => b(!0),
177
+ children: [O, " Edit"]
205
178
  })]
206
- }), /* @__PURE__ */ i(o, {
207
- style: s,
208
- language: A(l),
179
+ }), /* @__PURE__ */ a(s, {
180
+ style: c,
181
+ language: E(p),
209
182
  PreTag: "div",
210
183
  customStyle: {
211
184
  borderRadius: "0 0 0.5rem 0.5rem",
@@ -213,11 +186,11 @@ var j = ({ node: t, updateAttributes: c }) => {
213
186
  padding: "1em",
214
187
  margin: "0"
215
188
  },
216
- children: u || " "
189
+ children: g || " "
217
190
  })]
218
191
  })
219
192
  });
220
- }, M = /^```([a-z-]*)[\s\n]$/, N = /^~~~([a-z-]*)[\s\n]$/, P = /^(?:```|~~~)table(?:(\d+)[x×X*](\d+))?\s?$/, F = m.create({
193
+ }, O = /^```([a-z-]*)[\s\n]$/, k = /^~~~([a-z-]*)[\s\n]$/, A = /^(?:```|~~~)table(?:(\d+)[x×X*](\d+))?\s?$/, j = p.create({
221
194
  name: "codeBlock",
222
195
  group: "block",
223
196
  content: "text*",
@@ -243,7 +216,7 @@ var j = ({ node: t, updateAttributes: c }) => {
243
216
  renderHTML({ node: e, HTMLAttributes: t }) {
244
217
  return [
245
218
  "pre",
246
- v(t, { "data-language": e.attrs.language }),
219
+ _(t, { "data-language": e.attrs.language }),
247
220
  [
248
221
  "code",
249
222
  { class: e.attrs.language ? `language-${e.attrs.language}` : void 0 },
@@ -252,38 +225,39 @@ var j = ({ node: t, updateAttributes: c }) => {
252
225
  ];
253
226
  },
254
227
  addInputRules() {
255
- return [y({
256
- find: M,
228
+ return [v({
229
+ find: O,
257
230
  type: this.type,
258
231
  getAttributes: (e) => !e[1]?.startsWith("table") && { language: e[1] || null }
259
- }), y({
260
- find: N,
232
+ }), v({
233
+ find: k,
261
234
  type: this.type,
262
235
  getAttributes: (e) => !e[1]?.startsWith("table") && { language: e[1] || null }
263
236
  })];
264
237
  },
265
238
  addProseMirrorPlugins() {
266
- return this.editor, [new b({
267
- key: new x("tableShortcut"),
239
+ let e = this.editor;
240
+ return [new y({
241
+ key: new b("tableShortcut"),
268
242
  props: {
269
- handleTextInput(t, n, r, i) {
270
- if (i !== " ") return !1;
271
- let { state: a } = t, o = a.doc.resolve(n).start(), s = a.doc.textBetween(o, n, "\0") + " ", c = P.exec(s);
272
- return c ? (e(t, o, r, Math.min(Math.max(parseInt(c[1], 10) || 3, 1), 20), Math.min(Math.max(parseInt(c[2], 10) || 3, 1), 20)), !0) : !1;
243
+ handleTextInput(n, r, i, a) {
244
+ if (!e.isEditable || a !== " ") return !1;
245
+ let { state: o } = n, s = o.doc.resolve(r).start(), c = o.doc.textBetween(s, r, "\0") + " ", l = A.exec(c);
246
+ return l ? (t(n, s, i, Math.min(Math.max(parseInt(l[1], 10) || 3, 1), 20), Math.min(Math.max(parseInt(l[2], 10) || 3, 1), 20)), !0) : !1;
273
247
  },
274
- handleKeyDown(t, n) {
275
- if (n.key !== "Enter") return !1;
276
- let { state: r } = t, { $from: i } = r.selection;
277
- if (!i.parent.isTextblock) return !1;
278
- let a = i.start(), o = r.doc.textBetween(a, i.pos, "\0"), s = P.exec(o);
279
- if (!s) return !1;
280
- n.preventDefault();
281
- let c = Math.min(Math.max(parseInt(s[1], 10) || 3, 1), 20), l = Math.min(Math.max(parseInt(s[2], 10) || 3, 1), 20);
282
- return e(t, a, i.pos, c, l), !0;
248
+ handleKeyDown(n, r) {
249
+ if (!e.isEditable || r.key !== "Enter") return !1;
250
+ let { state: i } = n, { $from: a } = i.selection;
251
+ if (!a.parent.isTextblock) return !1;
252
+ let o = a.start(), s = i.doc.textBetween(o, a.pos, "\0"), c = A.exec(s);
253
+ if (!c) return !1;
254
+ r.preventDefault();
255
+ let l = Math.min(Math.max(parseInt(c[1], 10) || 3, 1), 20), u = Math.min(Math.max(parseInt(c[2], 10) || 3, 1), 20);
256
+ return t(n, o, a.pos, l, u), !0;
283
257
  }
284
258
  }
285
259
  })];
286
- function e(e, t, n, r, i) {
260
+ function t(e, t, n, r, i) {
287
261
  let { state: a } = e, o = a.doc.resolve(t), s = o.parent, c = o.before(), l = a.schema.nodes.table, u = a.schema.nodes.tableRow, d = a.schema.nodes.tableHeader, f = a.schema.nodes.tableCell;
288
262
  if (!l || !u || !f) return;
289
263
  let p = a.schema.nodes.paragraph.create(), m = (e) => {
@@ -295,11 +269,11 @@ var j = ({ node: t, updateAttributes: c }) => {
295
269
  },
296
270
  addKeyboardShortcuts() {
297
271
  return {
298
- "Mod-Alt-c": () => this.editor.commands.toggleNode("codeBlock", "paragraph"),
299
- Tab: ({ editor: e }) => e.isActive("codeBlock") ? (e.commands.insertContent(" "), !0) : !1,
300
- Enter: ({ editor: e }) => e.isActive("codeBlock") ? (e.commands.newlineInCode(), !0) : !1,
272
+ "Mod-Alt-c": () => this.editor.isEditable && this.editor.commands.toggleNode("codeBlock", "paragraph"),
273
+ Tab: ({ editor: e }) => e.isEditable && e.isActive("codeBlock") ? (e.commands.insertContent(" "), !0) : !1,
274
+ Enter: ({ editor: e }) => !e.isEditable || !e.isActive("codeBlock") ? !1 : (e.commands.newlineInCode(), !0),
301
275
  ArrowDown: ({ editor: e }) => {
302
- if (!e.isActive("codeBlock")) return !1;
276
+ if (!e.isEditable || !e.isActive("codeBlock")) return !1;
303
277
  let { $from: t } = e.state.selection;
304
278
  if (t.parentOffset !== t.parent.content.size) return !1;
305
279
  let n = t.after();
@@ -308,10 +282,10 @@ var j = ({ node: t, updateAttributes: c }) => {
308
282
  };
309
283
  },
310
284
  addNodeView() {
311
- return _(j);
285
+ return g(D);
312
286
  }
313
287
  });
314
288
  //#endregion
315
- export { F as CodeBlockExtension, F as default };
289
+ export { j as CodeBlockExtension, j as default };
316
290
 
317
291
  //# sourceMappingURL=CodeBlockView.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CodeBlockView.js","names":[],"sources":["../../../../../src/components/pro/RichTextEditor/extensions/CodeBlockView.tsx"],"sourcesContent":["import React, { useState, useEffect, useRef } from 'react';\nimport { Node, mergeAttributes, textblockTypeInputRule } from '@tiptap/react';\nimport { Plugin, PluginKey } from '@tiptap/pm/state';\nimport { NodeViewWrapper, NodeViewContent, ReactNodeViewRenderer } from '@tiptap/react';\nimport type { NodeViewProps } from '@tiptap/react';\nimport { Prism as SyntaxHighlighter } from 'react-syntax-highlighter';\nimport { oneLight } from 'react-syntax-highlighter/dist/esm/styles/prism';\nimport ReactMarkdown from 'react-markdown';\nimport remarkGfm from 'remark-gfm';\nimport remarkMath from 'remark-math';\nimport rehypeKatex from 'rehype-katex';\nimport rehypeRaw from 'rehype-raw';\nimport mermaid from 'mermaid';\nimport 'katex/dist/katex.min.css';\n\nlet mermaidInitialized = false;\n\nfunction initMermaid() {\n if (!mermaidInitialized) {\n mermaid.initialize({\n startOnLoad: false,\n theme: 'default',\n securityLevel: 'loose',\n fontFamily: 'inherit',\n flowchart: { useMaxWidth: true, htmlLabels: true },\n });\n mermaidInitialized = true;\n }\n}\n\nconst MermaidRenderer: React.FC<{ code: string }> = ({ code }) => {\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!code.trim() || !containerRef.current) return;\n initMermaid();\n\n let cancelled = false;\n const render = async () => {\n try {\n const id = `mermaid-cb-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`;\n const { svg } = await mermaid.render(id, code);\n if (!cancelled && containerRef.current) {\n containerRef.current.innerHTML = svg;\n }\n } catch (err) {\n if (!cancelled && containerRef.current) {\n containerRef.current.innerHTML = `<pre style=\"color:#ef4444;font-size:12px;padding:8px;\">${String(err)}</pre>`;\n }\n }\n };\n render();\n return () => { cancelled = true; };\n }, [code]);\n\n return <div ref={containerRef} className=\"rte-mermaid-container\" />;\n};\n\nconst KatexRenderer: React.FC<{ code: string }> = ({ code }) => {\n const wrapped = code.includes('$$') ? code : `$$\\n${code}\\n$$`;\n return (\n <ReactMarkdown\n remarkPlugins={[remarkMath]}\n rehypePlugins={[rehypeKatex]}\n >\n {wrapped}\n </ReactMarkdown>\n );\n};\n\nconst MarkdownRenderer: React.FC<{ code: string }> = ({ code }) => {\n return (\n <ReactMarkdown\n remarkPlugins={[remarkGfm, remarkMath]}\n rehypePlugins={[rehypeKatex, rehypeRaw]}\n components={{\n code({ className, children, ...props }) {\n const match = /language-(\\w+)/.exec(className || '');\n const lang = match?.[1];\n const text = String(children).replace(/\\n$/, '');\n\n if (lang === 'mermaid') return <MermaidRenderer code={text} />;\n\n if (lang) {\n return (\n <SyntaxHighlighter\n style={oneLight as Record<string, React.CSSProperties>}\n language={lang}\n PreTag=\"div\"\n customStyle={{ borderRadius: '0.5rem', fontSize: '0.875em', padding: '1em', margin: '0.5em 0' }}\n >\n {text}\n </SyntaxHighlighter>\n );\n }\n return <code className={className} {...props}>{children}</code>;\n },\n }}\n >\n {code}\n </ReactMarkdown>\n );\n};\n\nconst RENDER_LANGUAGES = ['r-markdown', 'r-mermaid', 'r-math'];\n\nconst HIGHLIGHT_LANGUAGES = [\n '', 'javascript', 'typescript', 'python', 'rust', 'go', 'java', 'c', 'cpp',\n 'csharp', 'ruby', 'php', 'swift', 'kotlin', 'sql', 'bash', 'shell',\n 'html', 'css', 'json', 'yaml', 'toml', 'xml', 'markdown', 'mermaid', 'math',\n 'docker', 'graphql', 'latex', 'tex',\n];\n\nconst ALL_LANGUAGES = [...HIGHLIGHT_LANGUAGES, ...RENDER_LANGUAGES];\n\nfunction isRenderLang(lang: string): boolean {\n return RENDER_LANGUAGES.includes(lang);\n}\n\nfunction highlightLang(lang: string): string {\n if (lang === 'math' || lang === 'latex' || lang === 'tex') return 'latex';\n return lang;\n}\n\nconst CodeBlockNodeView: React.FC<NodeViewProps> = ({\n node,\n updateAttributes,\n}) => {\n const language = node.attrs.language || '';\n const textContent = node.textContent;\n const hasLanguage = !!language;\n const isRenderable = isRenderLang(language);\n\n const [isEditing, setIsEditing] = useState(true);\n\n useEffect(() => {\n if (!hasLanguage) setIsEditing(true);\n }, [language, hasLanguage]);\n\n const editIcon = (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M11 4H4a2 2 0 00-2 2v14a2 2 0 002 2h14a2 2 0 002-2v-7\" />\n <path d=\"M18.5 2.5a2.121 2.121 0 013 3L12 15l-4 1 1-4 9.5-9.5z\" />\n </svg>\n );\n const previewIcon = (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n );\n\n const renderPreview = () => {\n if (language === 'r-mermaid') {\n return textContent.trim()\n ? <MermaidRenderer code={textContent} />\n : <p className=\"rte-codeblock__placeholder\">Enter mermaid diagram code...</p>;\n }\n if (language === 'r-math') {\n return textContent.trim()\n ? <KatexRenderer code={textContent} />\n : <p className=\"rte-codeblock__placeholder\">Enter KaTeX math formula...</p>;\n }\n if (language === 'r-markdown') {\n return textContent.trim()\n ? <MarkdownRenderer code={textContent} />\n : <p className=\"rte-codeblock__placeholder\">Enter Markdown content...</p>;\n }\n return null;\n };\n\n const displayLabel = language.startsWith('r-') ? language.slice(2) + ' (render)' : language || 'plain text';\n\n return (\n <NodeViewWrapper className={`rte-codeblock-wrapper ${!isEditing && hasLanguage ? 'rte-codeblock-wrapper--preview' : ''}`}>\n {isEditing ? (\n <>\n <div className=\"rte-codeblock__header\">\n <select\n className=\"rte-codeblock__lang-select\"\n value={language}\n onChange={(e) => {\n updateAttributes({ language: e.target.value });\n if (!e.target.value) setIsEditing(true);\n }}\n contentEditable={false}\n >\n <option value=\"\">Plain text</option>\n <optgroup label=\"Syntax Highlight\">\n {HIGHLIGHT_LANGUAGES.filter(Boolean).map((lang) => (\n <option key={lang} value={lang}>{lang}</option>\n ))}\n </optgroup>\n <optgroup label=\"Live Render\">\n {RENDER_LANGUAGES.map((lang) => (\n <option key={lang} value={lang}>{lang}</option>\n ))}\n </optgroup>\n </select>\n {hasLanguage && (\n <button\n type=\"button\"\n className=\"rte-codeblock__preview-btn\"\n onClick={() => setIsEditing(false)}\n contentEditable={false}\n >\n {previewIcon} Preview\n </button>\n )}\n </div>\n <pre className=\"rte-codeblock__editable-pre\">\n <NodeViewContent as={'code' as any} />\n </pre>\n </>\n ) : isRenderable ? (\n <div\n className=\"rte-codeblock__render-preview\"\n contentEditable={false}\n onDoubleClick={() => setIsEditing(true)}\n >\n <div className=\"rte-codeblock__preview-toolbar\" contentEditable={false}>\n <span className=\"rte-codeblock__preview-label\">{displayLabel}</span>\n <button\n type=\"button\"\n className=\"rte-codeblock__preview-edit-btn\"\n onClick={() => setIsEditing(true)}\n >\n {editIcon} Edit\n </button>\n </div>\n <div className=\"rte-codeblock__render-body\">\n {renderPreview()}\n </div>\n </div>\n ) : (\n <div\n className=\"rte-codeblock__syntax-preview\"\n contentEditable={false}\n onDoubleClick={() => setIsEditing(true)}\n >\n <div className=\"rte-codeblock__preview-toolbar\" contentEditable={false}>\n <span className=\"rte-codeblock__preview-label\">{displayLabel}</span>\n <button\n type=\"button\"\n className=\"rte-codeblock__preview-edit-btn\"\n onClick={() => setIsEditing(true)}\n >\n {editIcon} Edit\n </button>\n </div>\n <SyntaxHighlighter\n style={oneLight as Record<string, React.CSSProperties>}\n language={highlightLang(language)}\n PreTag=\"div\"\n customStyle={{\n borderRadius: '0 0 0.5rem 0.5rem',\n fontSize: '0.875em',\n padding: '1em',\n margin: '0',\n }}\n >\n {textContent || ' '}\n </SyntaxHighlighter>\n </div>\n )}\n </NodeViewWrapper>\n );\n};\n\nconst backtickInputRegex = /^```([a-z-]*)[\\s\\n]$/;\nconst tildeInputRegex = /^~~~([a-z-]*)[\\s\\n]$/;\nconst tableShortcutRegex = /^(?:```|~~~)table(?:(\\d+)[x×X*](\\d+))?\\s?$/;\n\nexport const CodeBlockExtension = Node.create({\n name: 'codeBlock',\n group: 'block',\n content: 'text*',\n marks: '',\n code: true,\n defining: true,\n\n addAttributes() {\n return {\n language: {\n default: null,\n parseHTML: (element) => {\n const classAttr = element.querySelector('code')?.className ||\n element.className || '';\n const match = /language-([\\w-]+)/.exec(classAttr);\n return match?.[1] || element.getAttribute('data-language') || null;\n },\n renderHTML: (attributes) => {\n if (!attributes.language) return {};\n return { 'data-language': attributes.language };\n },\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: 'pre',\n preserveWhitespace: 'full',\n },\n ];\n },\n\n renderHTML({ node, HTMLAttributes }) {\n return [\n 'pre',\n mergeAttributes(HTMLAttributes, { 'data-language': node.attrs.language }),\n ['code', { class: node.attrs.language ? `language-${node.attrs.language}` : undefined }, 0],\n ];\n },\n\n addInputRules() {\n return [\n textblockTypeInputRule({\n find: backtickInputRegex,\n type: this.type,\n getAttributes: (match) => {\n if (match[1]?.startsWith('table')) return false;\n return { language: match[1] || null };\n },\n }),\n textblockTypeInputRule({\n find: tildeInputRegex,\n type: this.type,\n getAttributes: (match) => {\n if (match[1]?.startsWith('table')) return false;\n return { language: match[1] || null };\n },\n }),\n ];\n },\n\n addProseMirrorPlugins() {\n const editorRef = this.editor;\n return [\n new Plugin({\n key: new PluginKey('tableShortcut'),\n props: {\n handleTextInput(view, from, to, text) {\n if (text !== ' ') return false;\n const { state } = view;\n const $from = state.doc.resolve(from);\n const blockStart = $from.start();\n const textBefore = state.doc.textBetween(blockStart, from, '\\0');\n const full = textBefore + ' ';\n const m = tableShortcutRegex.exec(full);\n if (!m) return false;\n\n const rows = Math.min(Math.max(parseInt(m[1], 10) || 3, 1), 20);\n const cols = Math.min(Math.max(parseInt(m[2], 10) || 3, 1), 20);\n dispatchTable(view, blockStart, to, rows, cols);\n return true;\n },\n handleKeyDown(view, event) {\n if (event.key !== 'Enter') return false;\n const { state } = view;\n const { $from } = state.selection;\n if (!$from.parent.isTextblock) return false;\n const blockStart = $from.start();\n const textBefore = state.doc.textBetween(blockStart, $from.pos, '\\0');\n const m = tableShortcutRegex.exec(textBefore);\n if (!m) return false;\n\n event.preventDefault();\n const rows = Math.min(Math.max(parseInt(m[1], 10) || 3, 1), 20);\n const cols = Math.min(Math.max(parseInt(m[2], 10) || 3, 1), 20);\n dispatchTable(view, blockStart, $from.pos, rows, cols);\n return true;\n },\n },\n }),\n ];\n\n function dispatchTable(view: typeof editorRef.view, from: number, to: number, rows: number, cols: number) {\n const { state } = view;\n const $from = state.doc.resolve(from);\n const blockNode = $from.parent;\n const blockPos = $from.before();\n\n const tableType = state.schema.nodes.table;\n const rowType = state.schema.nodes.tableRow;\n const headerType = state.schema.nodes.tableHeader;\n const cellType = state.schema.nodes.tableCell;\n if (!tableType || !rowType || !cellType) return;\n\n const emptyParagraph = state.schema.nodes.paragraph.create();\n const buildRow = (isHeader: boolean) => {\n const type = isHeader && headerType ? headerType : cellType;\n const cells = Array.from({ length: cols }, () => type.create(null, emptyParagraph));\n return rowType.create(null, cells);\n };\n\n const tableRows = [\n buildRow(true),\n ...Array.from({ length: rows - 1 }, () => buildRow(false)),\n ];\n const table = tableType.create(null, tableRows);\n const tr = state.tr.replaceWith(blockPos, blockPos + blockNode.nodeSize, table);\n view.dispatch(tr);\n }\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-Alt-c': () => this.editor.commands.toggleNode('codeBlock', 'paragraph'),\n Tab: ({ editor }) => {\n if (editor.isActive('codeBlock')) {\n editor.commands.insertContent('\\t');\n return true;\n }\n return false;\n },\n Enter: ({ editor }) => {\n if (!editor.isActive('codeBlock')) return false;\n editor.commands.newlineInCode();\n return true;\n },\n ArrowDown: ({ editor }) => {\n if (!editor.isActive('codeBlock')) return false;\n const { $from } = editor.state.selection;\n const isAtEnd = $from.parentOffset === $from.parent.content.size;\n if (!isAtEnd) return false;\n const after = $from.after();\n if (after === undefined) return false;\n const nodeAfter = editor.state.doc.nodeAt(after);\n if (nodeAfter) return false;\n editor.commands.exitCode();\n return true;\n },\n };\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(CodeBlockNodeView);\n },\n});\n\nexport default CodeBlockExtension;\n"],"mappings":";;;;;;;;;;;;;;AAeA,IAAI,IAAqB;AAEzB,SAAS,IAAc;CACrB,AAQE,OAPA,EAAQ,WAAW;EACjB,aAAa;EACb,OAAO;EACP,eAAe;EACf,YAAY;EACZ,WAAW;GAAE,aAAa;GAAM,YAAY;EAAK;CACnD,CAAC,GACoB;AAEzB;AAEA,IAAM,KAA+C,EAAE,cAAW;CAChE,IAAM,IAAe,EAAuB,IAAI;CAwBhD,OAtBA,QAAgB;EACd,IAAI,CAAC,EAAK,KAAK,KAAK,CAAC,EAAa,SAAS;EAC3C,EAAY;EAEZ,IAAI,IAAY;EAehB,QADA,YAb2B;GACzB,IAAI;IACF,IAAM,IAAK,cAAc,KAAK,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,KACtE,EAAE,WAAQ,MAAM,EAAQ,OAAO,GAAI,CAAI;IAC7C,AAAI,CAAC,KAAa,EAAa,YAC7B,EAAa,QAAQ,YAAY;GAErC,SAAS,GAAK;IACZ,AAAI,CAAC,KAAa,EAAa,YAC7B,EAAa,QAAQ,YAAY,0DAA0D,OAAO,CAAG,EAAE;GAE3G;EACF,EACA,CAAO,SACM;GAAE,IAAY;EAAM;CACnC,GAAG,CAAC,CAAI,CAAC,GAEF,kBAAC,OAAD;EAAK,KAAK;EAAc,WAAU;CAAyB,CAAA;AACpE,GAEM,KAA6C,EAAE,cAAW;CAC9D,IAAM,IAAU,EAAK,SAAS,IAAI,IAAI,IAAO,OAAO,EAAK;CACzD,OACE,kBAAC,GAAD;EACE,eAAe,CAAC,CAAU;EAC1B,eAAe,CAAC,CAAW;EAE1B,UAAA;CACY,CAAA;AAEnB,GAEM,KAAgD,EAAE,cAEpD,kBAAC,GAAD;CACE,eAAe,CAAC,GAAW,CAAU;CACrC,eAAe,CAAC,GAAa,CAAS;CACtC,YAAY,EACV,KAAK,EAAE,cAAW,aAAU,GAAG,KAAS;EAEtC,IAAM,IADQ,iBAAiB,KAAK,KAAa,EACpC,CAAA,GAAQ,IACf,IAAO,OAAO,CAAQ,CAAC,CAAC,QAAQ,OAAO,EAAE;EAgB/C,OAdI,MAAS,YAAkB,kBAAC,GAAD,EAAiB,MAAM,EAAO,CAAA,IAEzD,IAEA,kBAAC,GAAD;GACE,OAAO;GACP,UAAU;GACV,QAAO;GACP,aAAa;IAAE,cAAc;IAAU,UAAU;IAAW,SAAS;IAAO,QAAQ;GAAU;GAE7F,UAAA;EACgB,CAAA,IAGhB,kBAAC,QAAD;GAAiB;GAAW,GAAI;GAAQ;EAAe,CAAA;CAChE,EACF;CAEC,UAAA;AACY,CAAA,GAIb,IAAmB;CAAC;CAAc;CAAa;AAAQ,GAEvD,IAAsB,mMAK5B;AAEsB,CAAC,GAAG,GAAqB,GAAG,CAAgB;AAElE,SAAS,EAAa,GAAuB;CAC3C,OAAO,EAAiB,SAAS,CAAI;AACvC;AAEA,SAAS,EAAc,GAAsB;CAE3C,OADI,MAAS,UAAU,MAAS,WAAW,MAAS,QAAc,UAC3D;AACT;AAEA,IAAM,KAA8C,EAClD,SACA,0BACI;CACJ,IAAM,IAAW,EAAK,MAAM,YAAY,IAClC,IAAc,EAAK,aACnB,IAAc,CAAC,CAAC,GAChB,IAAe,EAAa,CAAQ,GAEpC,CAAC,GAAW,KAAgB,EAAS,EAAI;CAE/C,QAAgB;EACd,AAAK,KAAa,EAAa,EAAI;CACrC,GAAG,CAAC,GAAU,CAAW,CAAC;CAE1B,IAAM,IACJ,kBAAC,OAAD;EAAK,OAAM;EAAK,QAAO;EAAK,SAAQ;EAAY,MAAK;EAAO,QAAO;EAAe,aAAY;EAAI,eAAc;EAAQ,gBAAe;EAAvI,UAAA,CACE,kBAAC,QAAD,EAAM,GAAE,wDAAyD,CAAA,GACjE,kBAAC,QAAD,EAAM,GAAE,wDAAyD,CAAA,CAC9D;KAED,IACJ,kBAAC,OAAD;EAAK,OAAM;EAAK,QAAO;EAAK,SAAQ;EAAY,MAAK;EAAO,QAAO;EAAe,aAAY;EAAI,eAAc;EAAQ,gBAAe;EAAvI,UAAA,CACE,kBAAC,QAAD,EAAM,GAAE,+CAAgD,CAAA,GACxD,kBAAC,UAAD;GAAQ,IAAG;GAAK,IAAG;GAAK,GAAE;EAAK,CAAA,CAC5B;KAGD,UACA,MAAa,cACR,EAAY,KAAK,IACpB,kBAAC,GAAD,EAAiB,MAAM,EAAc,CAAA,IACrC,kBAAC,KAAD;EAAG,WAAU;EAA6B,UAAA;CAAgC,CAAA,IAE5E,MAAa,WACR,EAAY,KAAK,IACpB,kBAAC,GAAD,EAAe,MAAM,EAAc,CAAA,IACnC,kBAAC,KAAD;EAAG,WAAU;EAA6B,UAAA;CAA8B,CAAA,IAE1E,MAAa,eACR,EAAY,KAAK,IACpB,kBAAC,GAAD,EAAkB,MAAM,EAAc,CAAA,IACtC,kBAAC,KAAD;EAAG,WAAU;EAA6B,UAAA;CAA4B,CAAA,IAErE,MAGH,IAAe,EAAS,WAAW,IAAI,IAAI,EAAS,MAAM,CAAC,IAAI,cAAc,KAAY;CAE/F,OACE,kBAAC,GAAD;EAAiB,WAAW,yBAAyB,CAAC,KAAa,IAAc,mCAAmC;EACjH,UAAA,IACC,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,OAAD;GAAK,WAAU;GAAf,UAAA,CACE,kBAAC,UAAD;IACE,WAAU;IACV,OAAO;IACP,WAAW,MAAM;KAEf,AADA,EAAiB,EAAE,UAAU,EAAE,OAAO,MAAM,CAAC,GACxC,EAAE,OAAO,SAAO,EAAa,EAAI;IACxC;IACA,iBAAiB;IAPnB,UAAA;KASE,kBAAC,UAAD;MAAQ,OAAM;MAAG,UAAA;KAAkB,CAAA;KACnC,kBAAC,YAAD;MAAU,OAAM;MACb,UAAA,EAAoB,OAAO,OAAO,CAAC,CAAC,KAAK,MACxC,kBAAC,UAAD;OAAmB,OAAO;OAAO,UAAA;MAAa,GAAjC,CAAiC,CAC/C;KACO,CAAA;KACV,kBAAC,YAAD;MAAU,OAAM;MACb,UAAA,EAAiB,KAAK,MACrB,kBAAC,UAAD;OAAmB,OAAO;OAAO,UAAA;MAAa,GAAjC,CAAiC,CAC/C;KACO,CAAA;IACJ;GACP,CAAA,GAAA,KACC,kBAAC,UAAD;IACE,MAAK;IACL,WAAU;IACV,eAAe,EAAa,EAAK;IACjC,iBAAiB;IAJnB,UAAA,CAMG,GAAY,UACP;GAEP,CAAA,CAAA;EACL,CAAA,GAAA,kBAAC,OAAD;GAAK,WAAU;GACb,UAAA,kBAAC,GAAD,EAAiB,IAAI,OAAgB,CAAA;EAClC,CAAA,CACL,EAAA,CAAA,IACA,IACF,kBAAC,OAAD;GACE,WAAU;GACV,iBAAiB;GACjB,qBAAqB,EAAa,EAAI;GAHxC,UAAA,CAKE,kBAAC,OAAD;IAAK,WAAU;IAAiC,iBAAiB;IAAjE,UAAA,CACE,kBAAC,QAAD;KAAM,WAAU;KAAgC,UAAA;IAAmB,CAAA,GACnE,kBAAC,UAAD;KACE,MAAK;KACL,WAAU;KACV,eAAe,EAAa,EAAI;KAHlC,UAAA,CAKG,GAAS,OACJ;IACL,CAAA,CAAA;GACL,CAAA,GAAA,kBAAC,OAAD;IAAK,WAAU;IACZ,UAAA,EAAc;GACZ,CAAA,CACF;EAEL,CAAA,IAAA,kBAAC,OAAD;GACE,WAAU;GACV,iBAAiB;GACjB,qBAAqB,EAAa,EAAI;GAHxC,UAAA,CAKE,kBAAC,OAAD;IAAK,WAAU;IAAiC,iBAAiB;IAAjE,UAAA,CACE,kBAAC,QAAD;KAAM,WAAU;KAAgC,UAAA;IAAmB,CAAA,GACnE,kBAAC,UAAD;KACE,MAAK;KACL,WAAU;KACV,eAAe,EAAa,EAAI;KAHlC,UAAA,CAKG,GAAS,OACJ;IACL,CAAA,CAAA;GACL,CAAA,GAAA,kBAAC,GAAD;IACE,OAAO;IACP,UAAU,EAAc,CAAQ;IAChC,QAAO;IACP,aAAa;KACX,cAAc;KACd,UAAU;KACV,SAAS;KACT,QAAQ;IACV;IAEC,UAAA,KAAe;GACC,CAAA,CAChB;;CAEQ,CAAA;AAErB,GAEM,IAAqB,wBACrB,IAAkB,wBAClB,IAAqB,8CAEd,IAAqB,EAAK,OAAO;CAC5C,MAAM;CACN,OAAO;CACP,SAAS;CACT,OAAO;CACP,MAAM;CACN,UAAU;CAEV,gBAAgB;EACd,OAAO,EACL,UAAU;GACR,SAAS;GACT,YAAY,MAAY;IACtB,IAAM,IAAY,EAAQ,cAAc,MAAM,CAAC,EAAE,aAC/B,EAAQ,aAAa;IAEvC,OADc,oBAAoB,KAAK,CAChC,CAAA,GAAQ,MAAM,EAAQ,aAAa,eAAe,KAAK;GAChE;GACA,aAAa,MACN,EAAW,WACT,EAAE,iBAAiB,EAAW,SAAS,IADb,CAAC;EAGtC,EACF;CACF;CAEA,YAAY;EACV,OAAO,CACL;GACE,KAAK;GACL,oBAAoB;EACtB,CACF;CACF;CAEA,WAAW,EAAE,SAAM,qBAAkB;EACnC,OAAO;GACL;GACA,EAAgB,GAAgB,EAAE,iBAAiB,EAAK,MAAM,SAAS,CAAC;GACxE;IAAC;IAAQ,EAAE,OAAO,EAAK,MAAM,WAAW,YAAY,EAAK,MAAM,aAAa,KAAA,EAAU;IAAG;GAAC;EAC5F;CACF;CAEA,gBAAgB;EACd,OAAO,CACL,EAAuB;GACrB,MAAM;GACN,MAAM,KAAK;GACX,gBAAgB,MACd,CAAI,EAAM,EAAE,EAAE,WAAW,OAAO,KACzB,EAAE,UAAU,EAAM,MAAM,KAAK;EAExC,CAAC,GACD,EAAuB;GACrB,MAAM;GACN,MAAM,KAAK;GACX,gBAAgB,MACd,CAAI,EAAM,EAAE,EAAE,WAAW,OAAO,KACzB,EAAE,UAAU,EAAM,MAAM,KAAK;EAExC,CAAC,CACH;CACF;CAEA,wBAAwB;EAEtB,OADkB,KAAK,QAChB,CACL,IAAI,EAAO;GACT,KAAK,IAAI,EAAU,eAAe;GAClC,OAAO;IACL,gBAAgB,GAAM,GAAM,GAAI,GAAM;KACpC,IAAI,MAAS,KAAK,OAAO;KACzB,IAAM,EAAE,aAAU,GAEZ,IADQ,EAAM,IAAI,QAAQ,CACb,CAAA,CAAM,MAAM,GAEzB,IADa,EAAM,IAAI,YAAY,GAAY,GAAM,IAC9C,IAAa,KACpB,IAAI,EAAmB,KAAK,CAAI;KAMtC,OALK,KAIL,EAAc,GAAM,GAAY,GAFnB,KAAK,IAAI,KAAK,IAAI,SAAS,EAAE,IAAI,EAAE,KAAK,GAAG,CAAC,GAAG,EAExB,GADvB,KAAK,IAAI,KAAK,IAAI,SAAS,EAAE,IAAI,EAAE,KAAK,GAAG,CAAC,GAAG,EAClB,CAAI,GACvC,MALQ;IAMjB;IACA,cAAc,GAAM,GAAO;KACzB,IAAI,EAAM,QAAQ,SAAS,OAAO;KAClC,IAAM,EAAE,aAAU,GACZ,EAAE,aAAU,EAAM;KACxB,IAAI,CAAC,EAAM,OAAO,aAAa,OAAO;KACtC,IAAM,IAAa,EAAM,MAAM,GACzB,IAAa,EAAM,IAAI,YAAY,GAAY,EAAM,KAAK,IAAI,GAC9D,IAAI,EAAmB,KAAK,CAAU;KAC5C,IAAI,CAAC,GAAG,OAAO;KAEf,EAAM,eAAe;KACrB,IAAM,IAAO,KAAK,IAAI,KAAK,IAAI,SAAS,EAAE,IAAI,EAAE,KAAK,GAAG,CAAC,GAAG,EAAE,GACxD,IAAO,KAAK,IAAI,KAAK,IAAI,SAAS,EAAE,IAAI,EAAE,KAAK,GAAG,CAAC,GAAG,EAAE;KAE9D,OADA,EAAc,GAAM,GAAY,EAAM,KAAK,GAAM,CAAI,GAC9C;IACT;GACF;EACF,CAAC,CACH;EAEA,SAAS,EAAc,GAA6B,GAAc,GAAY,GAAc,GAAc;GACxG,IAAM,EAAE,aAAU,GACZ,IAAQ,EAAM,IAAI,QAAQ,CAAI,GAC9B,IAAY,EAAM,QAClB,IAAW,EAAM,OAAO,GAExB,IAAY,EAAM,OAAO,MAAM,OAC/B,IAAU,EAAM,OAAO,MAAM,UAC7B,IAAa,EAAM,OAAO,MAAM,aAChC,IAAW,EAAM,OAAO,MAAM;GACpC,IAAI,CAAC,KAAa,CAAC,KAAW,CAAC,GAAU;GAEzC,IAAM,IAAiB,EAAM,OAAO,MAAM,UAAU,OAAO,GACrD,KAAY,MAAsB;IACtC,IAAM,IAAO,KAAY,IAAa,IAAa,GAC7C,IAAQ,MAAM,KAAK,EAAE,QAAQ,EAAK,SAAS,EAAK,OAAO,MAAM,CAAc,CAAC;IAClF,OAAO,EAAQ,OAAO,MAAM,CAAK;GACnC,GAEM,IAAY,CAChB,EAAS,EAAI,GACb,GAAG,MAAM,KAAK,EAAE,QAAQ,IAAO,EAAE,SAAS,EAAS,EAAK,CAAC,CAC3D,GACM,IAAQ,EAAU,OAAO,MAAM,CAAS,GACxC,IAAK,EAAM,GAAG,YAAY,GAAU,IAAW,EAAU,UAAU,CAAK;GAC9E,EAAK,SAAS,CAAE;EAClB;CACF;CAEA,uBAAuB;EACrB,OAAO;GACL,mBAAmB,KAAK,OAAO,SAAS,WAAW,aAAa,WAAW;GAC3E,MAAM,EAAE,gBACF,EAAO,SAAS,WAAW,KAC7B,EAAO,SAAS,cAAc,GAAI,GAC3B,MAEF;GAET,QAAQ,EAAE,gBACH,EAAO,SAAS,WAAW,KAChC,EAAO,SAAS,cAAc,GACvB,MAFmC;GAI5C,YAAY,EAAE,gBAAa;IACzB,IAAI,CAAC,EAAO,SAAS,WAAW,GAAG,OAAO;IAC1C,IAAM,EAAE,aAAU,EAAO,MAAM;IAE/B,IADgB,EAAM,iBAAiB,EAAM,OAAO,QAAQ,MAC9C,OAAO;IACrB,IAAM,IAAQ,EAAM,MAAM;IAK1B,OAJI,MAAU,KAAA,KACI,EAAO,MAAM,IAAI,OAAO,CACtC,IAAkB,MACtB,EAAO,SAAS,SAAS,GAClB;GACT;EACF;CACF;CAEA,cAAc;EACZ,OAAO,EAAsB,CAAiB;CAChD;AACF,CAAC"}
1
+ {"version":3,"file":"CodeBlockView.js","names":[],"sources":["../../../../../src/components/pro/RichTextEditor/extensions/CodeBlockView.tsx"],"sourcesContent":["import React, { useState, useEffect } from 'react';\nimport { Node, mergeAttributes, textblockTypeInputRule } from '@tiptap/react';\nimport { Plugin, PluginKey } from '@tiptap/pm/state';\nimport { NodeViewWrapper, NodeViewContent, ReactNodeViewRenderer } from '@tiptap/react';\nimport type { NodeViewProps } from '@tiptap/react';\nimport { Prism as SyntaxHighlighter } from 'react-syntax-highlighter';\nimport { oneLight } from 'react-syntax-highlighter/dist/esm/styles/prism';\nimport ReactMarkdown from 'react-markdown';\nimport remarkGfm from 'remark-gfm';\nimport remarkMath from 'remark-math';\nimport rehypeKatex from 'rehype-katex';\nimport { MermaidRenderer, useNodeEditable } from './MarkdownBlock';\nimport 'katex/dist/katex.min.css';\n\n\nconst KatexRenderer: React.FC<{ code: string }> = ({ code }) => {\n const wrapped = code.includes('$$') ? code : `$$\\n${code}\\n$$`;\n return (\n <ReactMarkdown\n remarkPlugins={[remarkMath]}\n rehypePlugins={[rehypeKatex]}\n >\n {wrapped}\n </ReactMarkdown>\n );\n};\n\nconst MarkdownRenderer: React.FC<{ code: string }> = ({ code }) => {\n return (\n <ReactMarkdown\n remarkPlugins={[remarkGfm, remarkMath]}\n rehypePlugins={[rehypeKatex]}\n components={{\n code({ className, children, ...props }) {\n const match = /language-(\\w+)/.exec(className || '');\n const lang = match?.[1];\n const text = String(children).replace(/\\n$/, '');\n\n if (lang === 'mermaid') return <MermaidRenderer code={text} />;\n\n if (lang) {\n return (\n <SyntaxHighlighter\n style={oneLight as Record<string, React.CSSProperties>}\n language={lang}\n PreTag=\"div\"\n customStyle={{ borderRadius: '0.5rem', fontSize: '0.875em', padding: '1em', margin: '0.5em 0' }}\n >\n {text}\n </SyntaxHighlighter>\n );\n }\n return <code className={className} {...props}>{children}</code>;\n },\n }}\n >\n {code}\n </ReactMarkdown>\n );\n};\n\nconst RENDER_LANGUAGES = ['r-markdown', 'r-mermaid', 'r-math'];\n\nconst HIGHLIGHT_LANGUAGES = [\n '', 'javascript', 'typescript', 'python', 'rust', 'go', 'java', 'c', 'cpp',\n 'csharp', 'ruby', 'php', 'swift', 'kotlin', 'sql', 'bash', 'shell',\n 'html', 'css', 'json', 'yaml', 'toml', 'xml', 'markdown', 'mermaid', 'math',\n 'docker', 'graphql', 'latex', 'tex',\n];\n\nconst ALL_LANGUAGES = [...HIGHLIGHT_LANGUAGES, ...RENDER_LANGUAGES];\n\nfunction isRenderLang(lang: string): boolean {\n return RENDER_LANGUAGES.includes(lang);\n}\n\nfunction highlightLang(lang: string): string {\n if (lang === 'math' || lang === 'latex' || lang === 'tex') return 'latex';\n return lang;\n}\n\nconst CodeBlockNodeView: React.FC<NodeViewProps> = ({\n node,\n editor,\n updateAttributes,\n}) => {\n const editable = useNodeEditable(editor);\n const language = node.attrs.language || '';\n const textContent = node.textContent;\n const hasLanguage = !!language;\n const isRenderable = isRenderLang(language);\n\n const [isEditing, setIsEditing] = useState(true);\n\n useEffect(() => {\n if (!hasLanguage) setIsEditing(true);\n }, [language, hasLanguage]);\n\n // Read-only viewers always get the rendered/preview state, never the editor chrome.\n useEffect(() => {\n if (!editable) setIsEditing(false);\n }, [editable]);\n\n const showEditing = isEditing && editable;\n\n const editIcon = (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M11 4H4a2 2 0 00-2 2v14a2 2 0 002 2h14a2 2 0 002-2v-7\" />\n <path d=\"M18.5 2.5a2.121 2.121 0 013 3L12 15l-4 1 1-4 9.5-9.5z\" />\n </svg>\n );\n const previewIcon = (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n );\n\n const renderPreview = () => {\n if (language === 'r-mermaid') {\n return textContent.trim()\n ? <MermaidRenderer code={textContent} />\n : <p className=\"rte-codeblock__placeholder\">Enter mermaid diagram code...</p>;\n }\n if (language === 'r-math') {\n return textContent.trim()\n ? <KatexRenderer code={textContent} />\n : <p className=\"rte-codeblock__placeholder\">Enter KaTeX math formula...</p>;\n }\n if (language === 'r-markdown') {\n return textContent.trim()\n ? <MarkdownRenderer code={textContent} />\n : <p className=\"rte-codeblock__placeholder\">Enter Markdown content...</p>;\n }\n return null;\n };\n\n const displayLabel = language.startsWith('r-') ? language.slice(2) + ' (render)' : language || 'plain text';\n\n return (\n <NodeViewWrapper className={`rte-codeblock-wrapper ${!isEditing && hasLanguage ? 'rte-codeblock-wrapper--preview' : ''}`}>\n {showEditing ? (\n <>\n <div className=\"rte-codeblock__header\">\n <select\n className=\"rte-codeblock__lang-select\"\n value={language}\n disabled={!editable}\n onChange={(e) => {\n if (editor.isDestroyed || !editor.isEditable) return;\n updateAttributes({ language: e.target.value });\n if (!e.target.value) setIsEditing(true);\n }}\n contentEditable={false}\n >\n <option value=\"\">Plain text</option>\n <optgroup label=\"Syntax Highlight\">\n {HIGHLIGHT_LANGUAGES.filter(Boolean).map((lang) => (\n <option key={lang} value={lang}>{lang}</option>\n ))}\n </optgroup>\n <optgroup label=\"Live Render\">\n {RENDER_LANGUAGES.map((lang) => (\n <option key={lang} value={lang}>{lang}</option>\n ))}\n </optgroup>\n </select>\n {hasLanguage && (\n <button\n type=\"button\"\n className=\"rte-codeblock__preview-btn\"\n onClick={() => setIsEditing(false)}\n contentEditable={false}\n >\n {previewIcon} Preview\n </button>\n )}\n </div>\n <pre className=\"rte-codeblock__editable-pre\">\n <NodeViewContent as={'code' as any} />\n </pre>\n </>\n ) : isRenderable ? (\n <div\n className=\"rte-codeblock__render-preview\"\n contentEditable={false}\n onDoubleClick={() => { if (editable) setIsEditing(true); }}\n >\n <div className=\"rte-codeblock__preview-toolbar\" contentEditable={false}>\n <span className=\"rte-codeblock__preview-label\">{displayLabel}</span>\n {editable && (\n <button\n type=\"button\"\n className=\"rte-codeblock__preview-edit-btn\"\n onClick={() => setIsEditing(true)}\n >\n {editIcon} Edit\n </button>\n )}\n </div>\n <div className=\"rte-codeblock__render-body\">\n {renderPreview()}\n </div>\n </div>\n ) : (\n <div\n className=\"rte-codeblock__syntax-preview\"\n contentEditable={false}\n onDoubleClick={() => { if (editable) setIsEditing(true); }}\n >\n <div className=\"rte-codeblock__preview-toolbar\" contentEditable={false}>\n <span className=\"rte-codeblock__preview-label\">{displayLabel}</span>\n {editable && (\n <button\n type=\"button\"\n className=\"rte-codeblock__preview-edit-btn\"\n onClick={() => setIsEditing(true)}\n >\n {editIcon} Edit\n </button>\n )}\n </div>\n <SyntaxHighlighter\n style={oneLight as Record<string, React.CSSProperties>}\n language={highlightLang(language)}\n PreTag=\"div\"\n customStyle={{\n borderRadius: '0 0 0.5rem 0.5rem',\n fontSize: '0.875em',\n padding: '1em',\n margin: '0',\n }}\n >\n {textContent || ' '}\n </SyntaxHighlighter>\n </div>\n )}\n </NodeViewWrapper>\n );\n};\n\nconst backtickInputRegex = /^```([a-z-]*)[\\s\\n]$/;\nconst tildeInputRegex = /^~~~([a-z-]*)[\\s\\n]$/;\nconst tableShortcutRegex = /^(?:```|~~~)table(?:(\\d+)[x×X*](\\d+))?\\s?$/;\n\nexport const CodeBlockExtension = Node.create({\n name: 'codeBlock',\n group: 'block',\n content: 'text*',\n marks: '',\n code: true,\n defining: true,\n\n addAttributes() {\n return {\n language: {\n default: null,\n parseHTML: (element) => {\n const classAttr = element.querySelector('code')?.className ||\n element.className || '';\n const match = /language-([\\w-]+)/.exec(classAttr);\n return match?.[1] || element.getAttribute('data-language') || null;\n },\n renderHTML: (attributes) => {\n if (!attributes.language) return {};\n return { 'data-language': attributes.language };\n },\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: 'pre',\n preserveWhitespace: 'full',\n },\n ];\n },\n\n renderHTML({ node, HTMLAttributes }) {\n return [\n 'pre',\n mergeAttributes(HTMLAttributes, { 'data-language': node.attrs.language }),\n ['code', { class: node.attrs.language ? `language-${node.attrs.language}` : undefined }, 0],\n ];\n },\n\n addInputRules() {\n return [\n textblockTypeInputRule({\n find: backtickInputRegex,\n type: this.type,\n getAttributes: (match) => {\n if (match[1]?.startsWith('table')) return false;\n return { language: match[1] || null };\n },\n }),\n textblockTypeInputRule({\n find: tildeInputRegex,\n type: this.type,\n getAttributes: (match) => {\n if (match[1]?.startsWith('table')) return false;\n return { language: match[1] || null };\n },\n }),\n ];\n },\n\n addProseMirrorPlugins() {\n const editorRef = this.editor;\n return [\n new Plugin({\n key: new PluginKey('tableShortcut'),\n props: {\n handleTextInput(view, from, to, text) {\n if (!editorRef.isEditable || text !== ' ') return false;\n const { state } = view;\n const $from = state.doc.resolve(from);\n const blockStart = $from.start();\n const textBefore = state.doc.textBetween(blockStart, from, '\\0');\n const full = textBefore + ' ';\n const m = tableShortcutRegex.exec(full);\n if (!m) return false;\n\n const rows = Math.min(Math.max(parseInt(m[1], 10) || 3, 1), 20);\n const cols = Math.min(Math.max(parseInt(m[2], 10) || 3, 1), 20);\n dispatchTable(view, blockStart, to, rows, cols);\n return true;\n },\n handleKeyDown(view, event) {\n if (!editorRef.isEditable || event.key !== 'Enter') return false;\n const { state } = view;\n const { $from } = state.selection;\n if (!$from.parent.isTextblock) return false;\n const blockStart = $from.start();\n const textBefore = state.doc.textBetween(blockStart, $from.pos, '\\0');\n const m = tableShortcutRegex.exec(textBefore);\n if (!m) return false;\n\n event.preventDefault();\n const rows = Math.min(Math.max(parseInt(m[1], 10) || 3, 1), 20);\n const cols = Math.min(Math.max(parseInt(m[2], 10) || 3, 1), 20);\n dispatchTable(view, blockStart, $from.pos, rows, cols);\n return true;\n },\n },\n }),\n ];\n\n function dispatchTable(view: typeof editorRef.view, from: number, to: number, rows: number, cols: number) {\n const { state } = view;\n const $from = state.doc.resolve(from);\n const blockNode = $from.parent;\n const blockPos = $from.before();\n\n const tableType = state.schema.nodes.table;\n const rowType = state.schema.nodes.tableRow;\n const headerType = state.schema.nodes.tableHeader;\n const cellType = state.schema.nodes.tableCell;\n if (!tableType || !rowType || !cellType) return;\n\n const emptyParagraph = state.schema.nodes.paragraph.create();\n const buildRow = (isHeader: boolean) => {\n const type = isHeader && headerType ? headerType : cellType;\n const cells = Array.from({ length: cols }, () => type.create(null, emptyParagraph));\n return rowType.create(null, cells);\n };\n\n const tableRows = [\n buildRow(true),\n ...Array.from({ length: rows - 1 }, () => buildRow(false)),\n ];\n const table = tableType.create(null, tableRows);\n const tr = state.tr.replaceWith(blockPos, blockPos + blockNode.nodeSize, table);\n view.dispatch(tr);\n }\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-Alt-c': () => this.editor.isEditable && this.editor.commands.toggleNode('codeBlock', 'paragraph'),\n Tab: ({ editor }) => {\n if (!editor.isEditable) return false;\n if (editor.isActive('codeBlock')) {\n editor.commands.insertContent('\\t');\n return true;\n }\n return false;\n },\n Enter: ({ editor }) => {\n if (!editor.isEditable) return false;\n if (!editor.isActive('codeBlock')) return false;\n editor.commands.newlineInCode();\n return true;\n },\n ArrowDown: ({ editor }) => {\n if (!editor.isEditable) return false;\n if (!editor.isActive('codeBlock')) return false;\n const { $from } = editor.state.selection;\n const isAtEnd = $from.parentOffset === $from.parent.content.size;\n if (!isAtEnd) return false;\n const after = $from.after();\n if (after === undefined) return false;\n const nodeAfter = editor.state.doc.nodeAt(after);\n if (nodeAfter) return false;\n editor.commands.exitCode();\n return true;\n },\n };\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(CodeBlockNodeView);\n },\n});\n\nexport default CodeBlockExtension;\n"],"mappings":"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"}
@@ -30,8 +30,8 @@ var n = e.create({
30
30
  },
31
31
  addCommands() {
32
32
  return {
33
- setComment: (e) => ({ commands: t }) => t.setMark(this.name, { commentId: e }),
34
- unsetComment: () => ({ commands: e }) => e.unsetMark(this.name)
33
+ setComment: (e) => ({ commands: t, editor: n }) => n.isEditable ? t.setMark(this.name, { commentId: e }) : !1,
34
+ unsetComment: () => ({ commands: e, editor: t }) => t.isEditable ? e.unsetMark(this.name) : !1
35
35
  };
36
36
  }
37
37
  });
@@ -1 +1 @@
1
- {"version":3,"file":"CommentMark.js","names":[],"sources":["../../../../../src/components/pro/RichTextEditor/extensions/CommentMark.ts"],"sourcesContent":["import { Mark, mergeAttributes } from '@tiptap/react';\n\nexport interface CommentThread {\n id: string;\n resolved: boolean;\n comments: CommentItem[];\n createdAt: number;\n}\n\nexport interface CommentItem {\n id: string;\n author: string;\n text: string;\n createdAt: number;\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n commentMark: {\n setComment: (id: string) => ReturnType;\n unsetComment: () => ReturnType;\n };\n }\n}\n\nexport const CommentMark = Mark.create({\n name: 'comment',\n inclusive: false,\n excludes: '',\n\n addAttributes() {\n return {\n commentId: {\n default: null,\n parseHTML: (el) => el.getAttribute('data-comment-id'),\n renderHTML: (attrs) => {\n if (!attrs.commentId) return {};\n return { 'data-comment-id': attrs.commentId };\n },\n },\n resolved: {\n default: false,\n parseHTML: (el) => el.getAttribute('data-resolved') === 'true',\n renderHTML: (attrs) => {\n if (!attrs.resolved) return {};\n return { 'data-resolved': 'true' };\n },\n },\n };\n },\n\n parseHTML() {\n return [{ tag: 'span[data-comment-id]' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['span', mergeAttributes(HTMLAttributes, {\n class: `rte-comment-mark ${HTMLAttributes['data-resolved'] === 'true' ? 'rte-comment-mark--resolved' : ''}`,\n }), 0];\n },\n\n addCommands() {\n return {\n setComment: (id: string) => ({ commands }) => {\n return commands.setMark(this.name, { commentId: id });\n },\n unsetComment: () => ({ commands }) => {\n return commands.unsetMark(this.name);\n },\n };\n },\n});\n\nexport default CommentMark;\n"],"mappings":";;AAyBA,IAAa,IAAc,EAAK,OAAO;CACrC,MAAM;CACN,WAAW;CACX,UAAU;CAEV,gBAAgB;EACd,OAAO;GACL,WAAW;IACT,SAAS;IACT,YAAY,MAAO,EAAG,aAAa,iBAAiB;IACpD,aAAa,MACN,EAAM,YACJ,EAAE,mBAAmB,EAAM,UAAU,IADf,CAAC;GAGlC;GACA,UAAU;IACR,SAAS;IACT,YAAY,MAAO,EAAG,aAAa,eAAe,MAAM;IACxD,aAAa,MACN,EAAM,WACJ,EAAE,iBAAiB,OAAO,IADL,CAAC;GAGjC;EACF;CACF;CAEA,YAAY;EACV,OAAO,CAAC,EAAE,KAAK,wBAAwB,CAAC;CAC1C;CAEA,WAAW,EAAE,qBAAkB;EAC7B,OAAO;GAAC;GAAQ,EAAgB,GAAgB,EAC9C,OAAO,oBAAoB,EAAe,qBAAqB,SAAS,+BAA+B,KACzG,CAAC;GAAG;EAAC;CACP;CAEA,cAAc;EACZ,OAAO;GACL,aAAa,OAAgB,EAAE,kBACtB,EAAS,QAAQ,KAAK,MAAM,EAAE,WAAW,EAAG,CAAC;GAEtD,qBAAqB,EAAE,kBACd,EAAS,UAAU,KAAK,IAAI;EAEvC;CACF;AACF,CAAC"}
1
+ {"version":3,"file":"CommentMark.js","names":[],"sources":["../../../../../src/components/pro/RichTextEditor/extensions/CommentMark.ts"],"sourcesContent":["import { Mark, mergeAttributes } from '@tiptap/react';\n\nexport interface CommentThread {\n id: string;\n resolved: boolean;\n comments: CommentItem[];\n createdAt: number;\n}\n\nexport interface CommentItem {\n id: string;\n author: string;\n text: string;\n createdAt: number;\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n commentMark: {\n setComment: (id: string) => ReturnType;\n unsetComment: () => ReturnType;\n };\n }\n}\n\nexport const CommentMark = Mark.create({\n name: 'comment',\n inclusive: false,\n excludes: '',\n\n addAttributes() {\n return {\n commentId: {\n default: null,\n parseHTML: (el) => el.getAttribute('data-comment-id'),\n renderHTML: (attrs) => {\n if (!attrs.commentId) return {};\n return { 'data-comment-id': attrs.commentId };\n },\n },\n resolved: {\n default: false,\n parseHTML: (el) => el.getAttribute('data-resolved') === 'true',\n renderHTML: (attrs) => {\n if (!attrs.resolved) return {};\n return { 'data-resolved': 'true' };\n },\n },\n };\n },\n\n parseHTML() {\n return [{ tag: 'span[data-comment-id]' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['span', mergeAttributes(HTMLAttributes, {\n class: `rte-comment-mark ${HTMLAttributes['data-resolved'] === 'true' ? 'rte-comment-mark--resolved' : ''}`,\n }), 0];\n },\n\n addCommands() {\n return {\n setComment: (id: string) => ({ commands, editor }) => {\n if (!editor.isEditable) return false;\n return commands.setMark(this.name, { commentId: id });\n },\n unsetComment: () => ({ commands, editor }) => {\n if (!editor.isEditable) return false;\n return commands.unsetMark(this.name);\n },\n };\n },\n});\n\nexport default CommentMark;\n"],"mappings":";;AAyBA,IAAa,IAAc,EAAK,OAAO;CACrC,MAAM;CACN,WAAW;CACX,UAAU;CAEV,gBAAgB;EACd,OAAO;GACL,WAAW;IACT,SAAS;IACT,YAAY,MAAO,EAAG,aAAa,iBAAiB;IACpD,aAAa,MACN,EAAM,YACJ,EAAE,mBAAmB,EAAM,UAAU,IADf,CAAC;GAGlC;GACA,UAAU;IACR,SAAS;IACT,YAAY,MAAO,EAAG,aAAa,eAAe,MAAM;IACxD,aAAa,MACN,EAAM,WACJ,EAAE,iBAAiB,OAAO,IADL,CAAC;GAGjC;EACF;CACF;CAEA,YAAY;EACV,OAAO,CAAC,EAAE,KAAK,wBAAwB,CAAC;CAC1C;CAEA,WAAW,EAAE,qBAAkB;EAC7B,OAAO;GAAC;GAAQ,EAAgB,GAAgB,EAC9C,OAAO,oBAAoB,EAAe,qBAAqB,SAAS,+BAA+B,KACzG,CAAC;GAAG;EAAC;CACP;CAEA,cAAc;EACZ,OAAO;GACL,aAAa,OAAgB,EAAE,aAAU,gBAClC,EAAO,aACL,EAAS,QAAQ,KAAK,MAAM,EAAE,WAAW,EAAG,CAAC,IADrB;GAGjC,qBAAqB,EAAE,aAAU,gBAC1B,EAAO,aACL,EAAS,UAAU,KAAK,IAAI,IADJ;EAGnC;CACF;AACF,CAAC"}