dishui 0.0.71 → 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,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,32 @@ 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, _]);
61
+ let D = /* @__PURE__ */ o("svg", {
96
62
  width: "12",
97
63
  height: "12",
98
64
  viewBox: "0 0 24 24",
@@ -101,8 +67,8 @@ var j = ({ node: t, updateAttributes: c }) => {
101
67
  strokeWidth: "2",
102
68
  strokeLinecap: "round",
103
69
  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", {
70
+ 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" })]
71
+ }), O = /* @__PURE__ */ o("svg", {
106
72
  width: "12",
107
73
  height: "12",
108
74
  viewBox: "0 0 24 24",
@@ -111,101 +77,102 @@ var j = ({ node: t, updateAttributes: c }) => {
111
77
  strokeWidth: "2",
112
78
  strokeLinecap: "round",
113
79
  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", {
80
+ 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
81
  cx: "12",
116
82
  cy: "12",
117
83
  r: "3"
118
84
  })]
119
- }), y = () => l === "r-mermaid" ? u.trim() ? /* @__PURE__ */ i(w, { code: u }) : /* @__PURE__ */ i("p", {
85
+ }), k = () => p === "r-mermaid" ? g.trim() ? /* @__PURE__ */ a(e, { code: g }) : /* @__PURE__ */ a("p", {
120
86
  className: "rte-codeblock__placeholder",
121
87
  children: "Enter mermaid diagram code..."
122
- }) : l === "r-math" ? u.trim() ? /* @__PURE__ */ i(T, { code: u }) : /* @__PURE__ */ i("p", {
88
+ }) : p === "r-math" ? g.trim() ? /* @__PURE__ */ a(x, { code: g }) : /* @__PURE__ */ a("p", {
123
89
  className: "rte-codeblock__placeholder",
124
90
  children: "Enter KaTeX math formula..."
125
- }) : l === "r-markdown" ? u.trim() ? /* @__PURE__ */ i(E, { code: u }) : /* @__PURE__ */ i("p", {
91
+ }) : p === "r-markdown" ? g.trim() ? /* @__PURE__ */ a(S, { code: g }) : /* @__PURE__ */ a("p", {
126
92
  className: "rte-codeblock__placeholder",
127
93
  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", {
94
+ }) : null, A = p.startsWith("r-") ? p.slice(2) + " (render)" : p || "plain text";
95
+ return /* @__PURE__ */ a(h, {
96
+ className: `rte-codeblock-wrapper ${!y && _ ? "rte-codeblock-wrapper--preview" : ""}`,
97
+ children: y ? /* @__PURE__ */ o(i, { children: [/* @__PURE__ */ o("div", {
132
98
  className: "rte-codeblock__header",
133
- children: [/* @__PURE__ */ a("select", {
99
+ children: [/* @__PURE__ */ o("select", {
134
100
  className: "rte-codeblock__lang-select",
135
- value: l,
101
+ value: p,
102
+ disabled: !f,
136
103
  onChange: (e) => {
137
- c({ language: e.target.value }), e.target.value || m(!0);
104
+ !u.isDestroyed && u.isEditable && (d({ language: e.target.value }), e.target.value || b(!0));
138
105
  },
139
106
  contentEditable: !1,
140
107
  children: [
141
- /* @__PURE__ */ i("option", {
108
+ /* @__PURE__ */ a("option", {
142
109
  value: "",
143
110
  children: "Plain text"
144
111
  }),
145
- /* @__PURE__ */ i("optgroup", {
112
+ /* @__PURE__ */ a("optgroup", {
146
113
  label: "Syntax Highlight",
147
- children: O.filter(Boolean).map((e) => /* @__PURE__ */ i("option", {
114
+ children: w.filter(Boolean).map((e) => /* @__PURE__ */ a("option", {
148
115
  value: e,
149
116
  children: e
150
117
  }, e))
151
118
  }),
152
- /* @__PURE__ */ i("optgroup", {
119
+ /* @__PURE__ */ a("optgroup", {
153
120
  label: "Live Render",
154
- children: D.map((e) => /* @__PURE__ */ i("option", {
121
+ children: C.map((e) => /* @__PURE__ */ a("option", {
155
122
  value: e,
156
123
  children: e
157
124
  }, e))
158
125
  })
159
126
  ]
160
- }), d && /* @__PURE__ */ a("button", {
127
+ }), _ && /* @__PURE__ */ o("button", {
161
128
  type: "button",
162
129
  className: "rte-codeblock__preview-btn",
163
- onClick: () => m(!1),
130
+ onClick: () => b(!1),
164
131
  contentEditable: !1,
165
- children: [v, " Preview"]
132
+ children: [O, " Preview"]
166
133
  })]
167
- }), /* @__PURE__ */ i("pre", {
134
+ }), /* @__PURE__ */ a("pre", {
168
135
  className: "rte-codeblock__editable-pre",
169
- children: /* @__PURE__ */ i(h, { as: "code" })
170
- })] }) : f ? /* @__PURE__ */ a("div", {
136
+ children: /* @__PURE__ */ a(m, { as: "code" })
137
+ })] }) : v ? /* @__PURE__ */ o("div", {
171
138
  className: "rte-codeblock__render-preview",
172
139
  contentEditable: !1,
173
- onDoubleClick: () => m(!0),
174
- children: [/* @__PURE__ */ a("div", {
140
+ onDoubleClick: () => b(!0),
141
+ children: [/* @__PURE__ */ o("div", {
175
142
  className: "rte-codeblock__preview-toolbar",
176
143
  contentEditable: !1,
177
- children: [/* @__PURE__ */ i("span", {
144
+ children: [/* @__PURE__ */ a("span", {
178
145
  className: "rte-codeblock__preview-label",
179
- children: b
180
- }), /* @__PURE__ */ a("button", {
146
+ children: A
147
+ }), /* @__PURE__ */ o("button", {
181
148
  type: "button",
182
149
  className: "rte-codeblock__preview-edit-btn",
183
- onClick: () => m(!0),
184
- children: [_, " Edit"]
150
+ onClick: () => b(!0),
151
+ children: [D, " Edit"]
185
152
  })]
186
- }), /* @__PURE__ */ i("div", {
153
+ }), /* @__PURE__ */ a("div", {
187
154
  className: "rte-codeblock__render-body",
188
- children: y()
155
+ children: k()
189
156
  })]
190
- }) : /* @__PURE__ */ a("div", {
157
+ }) : /* @__PURE__ */ o("div", {
191
158
  className: "rte-codeblock__syntax-preview",
192
159
  contentEditable: !1,
193
- onDoubleClick: () => m(!0),
194
- children: [/* @__PURE__ */ a("div", {
160
+ onDoubleClick: () => b(!0),
161
+ children: [/* @__PURE__ */ o("div", {
195
162
  className: "rte-codeblock__preview-toolbar",
196
163
  contentEditable: !1,
197
- children: [/* @__PURE__ */ i("span", {
164
+ children: [/* @__PURE__ */ a("span", {
198
165
  className: "rte-codeblock__preview-label",
199
- children: b
200
- }), /* @__PURE__ */ a("button", {
166
+ children: A
167
+ }), /* @__PURE__ */ o("button", {
201
168
  type: "button",
202
169
  className: "rte-codeblock__preview-edit-btn",
203
- onClick: () => m(!0),
204
- children: [_, " Edit"]
170
+ onClick: () => b(!0),
171
+ children: [D, " Edit"]
205
172
  })]
206
- }), /* @__PURE__ */ i(o, {
207
- style: s,
208
- language: A(l),
173
+ }), /* @__PURE__ */ a(s, {
174
+ style: c,
175
+ language: E(p),
209
176
  PreTag: "div",
210
177
  customStyle: {
211
178
  borderRadius: "0 0 0.5rem 0.5rem",
@@ -213,11 +180,11 @@ var j = ({ node: t, updateAttributes: c }) => {
213
180
  padding: "1em",
214
181
  margin: "0"
215
182
  },
216
- children: u || " "
183
+ children: g || " "
217
184
  })]
218
185
  })
219
186
  });
220
- }, M = /^```([a-z-]*)[\s\n]$/, N = /^~~~([a-z-]*)[\s\n]$/, P = /^(?:```|~~~)table(?:(\d+)[x×X*](\d+))?\s?$/, F = m.create({
187
+ }, O = /^```([a-z-]*)[\s\n]$/, k = /^~~~([a-z-]*)[\s\n]$/, A = /^(?:```|~~~)table(?:(\d+)[x×X*](\d+))?\s?$/, j = p.create({
221
188
  name: "codeBlock",
222
189
  group: "block",
223
190
  content: "text*",
@@ -243,7 +210,7 @@ var j = ({ node: t, updateAttributes: c }) => {
243
210
  renderHTML({ node: e, HTMLAttributes: t }) {
244
211
  return [
245
212
  "pre",
246
- v(t, { "data-language": e.attrs.language }),
213
+ _(t, { "data-language": e.attrs.language }),
247
214
  [
248
215
  "code",
249
216
  { class: e.attrs.language ? `language-${e.attrs.language}` : void 0 },
@@ -252,38 +219,39 @@ var j = ({ node: t, updateAttributes: c }) => {
252
219
  ];
253
220
  },
254
221
  addInputRules() {
255
- return [y({
256
- find: M,
222
+ return [v({
223
+ find: O,
257
224
  type: this.type,
258
225
  getAttributes: (e) => !e[1]?.startsWith("table") && { language: e[1] || null }
259
- }), y({
260
- find: N,
226
+ }), v({
227
+ find: k,
261
228
  type: this.type,
262
229
  getAttributes: (e) => !e[1]?.startsWith("table") && { language: e[1] || null }
263
230
  })];
264
231
  },
265
232
  addProseMirrorPlugins() {
266
- return this.editor, [new b({
267
- key: new x("tableShortcut"),
233
+ let e = this.editor;
234
+ return [new y({
235
+ key: new b("tableShortcut"),
268
236
  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;
237
+ handleTextInput(n, r, i, a) {
238
+ if (!e.isEditable || a !== " ") return !1;
239
+ let { state: o } = n, s = o.doc.resolve(r).start(), c = o.doc.textBetween(s, r, "\0") + " ", l = A.exec(c);
240
+ 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
241
  },
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;
242
+ handleKeyDown(n, r) {
243
+ if (!e.isEditable || r.key !== "Enter") return !1;
244
+ let { state: i } = n, { $from: a } = i.selection;
245
+ if (!a.parent.isTextblock) return !1;
246
+ let o = a.start(), s = i.doc.textBetween(o, a.pos, "\0"), c = A.exec(s);
247
+ if (!c) return !1;
248
+ r.preventDefault();
249
+ 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);
250
+ return t(n, o, a.pos, l, u), !0;
283
251
  }
284
252
  }
285
253
  })];
286
- function e(e, t, n, r, i) {
254
+ function t(e, t, n, r, i) {
287
255
  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
256
  if (!l || !u || !f) return;
289
257
  let p = a.schema.nodes.paragraph.create(), m = (e) => {
@@ -295,11 +263,11 @@ var j = ({ node: t, updateAttributes: c }) => {
295
263
  },
296
264
  addKeyboardShortcuts() {
297
265
  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,
266
+ "Mod-Alt-c": () => this.editor.isEditable && this.editor.commands.toggleNode("codeBlock", "paragraph"),
267
+ Tab: ({ editor: e }) => e.isEditable && e.isActive("codeBlock") ? (e.commands.insertContent(" "), !0) : !1,
268
+ Enter: ({ editor: e }) => !e.isEditable || !e.isActive("codeBlock") ? !1 : (e.commands.newlineInCode(), !0),
301
269
  ArrowDown: ({ editor: e }) => {
302
- if (!e.isActive("codeBlock")) return !1;
270
+ if (!e.isEditable || !e.isActive("codeBlock")) return !1;
303
271
  let { $from: t } = e.state.selection;
304
272
  if (t.parentOffset !== t.parent.content.size) return !1;
305
273
  let n = t.after();
@@ -308,10 +276,10 @@ var j = ({ node: t, updateAttributes: c }) => {
308
276
  };
309
277
  },
310
278
  addNodeView() {
311
- return _(j);
279
+ return g(D);
312
280
  }
313
281
  });
314
282
  //#endregion
315
- export { F as CodeBlockExtension, F as default };
283
+ export { j as CodeBlockExtension, j as default };
316
284
 
317
285
  //# 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":"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"}
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 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 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={() => 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 (!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"}