@hkyhy/marsun-components-core 0.1.129 → 0.1.131

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 (30) hide show
  1. package/README.md +2 -0
  2. package/dist/_virtual/index.js +5 -5
  3. package/dist/_virtual/index2.js +5 -5
  4. package/dist/components/Editor/RichTextEditor/RichTextEditor.d.ts +3 -1
  5. package/dist/components/Editor/RichTextEditor/RichTextEditor.js +140 -61
  6. package/dist/components/Editor/RichTextEditor/RichTextEditor.js.map +1 -1
  7. package/dist/components/Editor/RichTextEditor/style.module.scss.js +7 -7
  8. package/dist/components/Editor/index.d.ts +2 -2
  9. package/dist/components/Editor/index.js +20 -14
  10. package/dist/components/Editor/msgVarTokenPlugin.d.ts +22 -1
  11. package/dist/components/Editor/msgVarTokenPlugin.js +188 -45
  12. package/dist/components/Editor/msgVarTokenPlugin.js.map +1 -1
  13. package/dist/components/Editor/variableMention.d.ts +20 -1
  14. package/dist/components/Editor/variableMention.js +134 -46
  15. package/dist/components/Editor/variableMention.js.map +1 -1
  16. package/dist/components/FormInfo/RichTextField/index.d.ts +2 -0
  17. package/dist/components/FormInfo/RichTextField/index.js +46 -43
  18. package/dist/components/FormInfo/RichTextField/index.js.map +1 -1
  19. package/dist/components/Tools/Inbox/InboxBell/InboxBell.js +1 -0
  20. package/dist/components/Tools/Inbox/InboxBell/InboxBell.js.map +1 -1
  21. package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/Modal/TemplateFormModal.js +121 -112
  22. package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/Modal/TemplateFormModal.js.map +1 -1
  23. package/dist/editor.js +22 -16
  24. package/dist/index.js +361 -355
  25. package/dist/marsun-components-core.css +1 -1
  26. package/dist/node_modules/@antv/g-lite/dist/index.esm.js +1 -1
  27. package/dist/node_modules/@antv/g2/esm/data/kde.js +1 -1
  28. package/dist/node_modules/eventemitter3/index.js +1 -1
  29. package/dist/styles/global.css +1 -1
  30. package/package.json +1 -1
package/README.md CHANGED
@@ -136,6 +136,8 @@ node scripts/version-check.mjs --apply # → 0.1.99
136
136
 
137
137
  也可在 Actions 中手动运行 **Publish npm**,填写已有 tag 重新发布。
138
138
 
139
+ - 2026-10-11:`v0.1.131` — 消息模板富文本色/加粗回显(配置页;seed 另仓)
140
+ - 2026-10-11:`v0.1.130` — InboxBell 级别 Tag `selected` 反白(消息类型 Tag 仍默认浅底)
139
141
  - 2026-10-10:`v0.1.129` — InboxBell toast `createPortal` 自渲染(禁 ant notification 透明残留壳)
140
142
  - 2026-10-09:`v0.1.124` — CreateAction FormInfo DatePicker 与 scopeMode=none(token 刷新后重发)
141
143
  - 2026-09-23:`v0.1.122` — ActionListTable 默认 scrollX 对齐长状态列(0.1.121 已发后补发)
@@ -1,8 +1,8 @@
1
- import { getDefaultExportFromCjs as t } from "./_commonjsHelpers.js";
2
- import { __require as e } from "../node_modules/eventemitter3/index2.js";
3
- var r = e();
4
- const i = /* @__PURE__ */ t(r);
1
+ import { getDefaultExportFromCjs as r } from "./_commonjsHelpers.js";
2
+ import { __require as o } from "../node_modules/pdfast/src/index.js";
3
+ var t = o();
4
+ const s = /* @__PURE__ */ r(t);
5
5
  export {
6
- i as default
6
+ s as default
7
7
  };
8
8
  //# sourceMappingURL=index.js.map
@@ -1,8 +1,8 @@
1
- import { getDefaultExportFromCjs as r } from "./_commonjsHelpers.js";
2
- import { __require as o } from "../node_modules/pdfast/src/index.js";
3
- var t = o();
4
- const s = /* @__PURE__ */ r(t);
1
+ import { getDefaultExportFromCjs as t } from "./_commonjsHelpers.js";
2
+ import { __require as e } from "../node_modules/eventemitter3/index2.js";
3
+ var r = e();
4
+ const i = /* @__PURE__ */ t(r);
5
5
  export {
6
- s as default
6
+ i as default
7
7
  };
8
8
  //# sourceMappingURL=index2.js.map
@@ -18,7 +18,9 @@ export type RichTextEditorProps = {
18
18
  catalogError?: string;
19
19
  };
20
20
  /**
21
- * CKEditor 5 + Coze/Dify 风「插入变量」按钮;正文 msgVar 原子色块。
21
+ * CKEditor 5 + 变量色块。
22
+ * - 只在「编辑区空 + 有外部 value」时 setData,禁止用 Form 旧值回灌冲掉字色/加粗
23
+ * - GeneralHtmlSupport 保留 span[style]
22
24
  */
23
25
  export declare const RichTextEditor: React.FC<RichTextEditorProps>;
24
26
  export default RichTextEditor;
@@ -1,76 +1,155 @@
1
- import { jsxs as K, jsx as c } from "react/jsx-runtime";
2
- import { useRef as e, useMemo as N } from "react";
3
- import { Essentials as x, Paragraph as R, Bold as $, Italic as k, List as v, Undo as P, Widget as T, ClassicEditor as W } from "ckeditor5";
4
- import { CKEditor as b } from "@ckeditor/ckeditor5-react";
1
+ import { jsxs as R, jsx as n } from "react/jsx-runtime";
2
+ import { useRef as l, useMemo as L, useEffect as P } from "react";
3
+ import { Essentials as S, Paragraph as G, Bold as H, Italic as N, Underline as T, FontColor as U, FontBackgroundColor as j, GeneralHtmlSupport as I, List as K, Undo as W, RemoveFormat as _, Widget as q, ClassicEditor as w } from "ckeditor5";
4
+ import { CKEditor as O } from "@ckeditor/ckeditor5-react";
5
5
  /* empty css */
6
- import { wrapVarTokensForDisplay as q } from "../variableMention.js";
7
- import { MsgVarWidget as w, insertMsgVar as B } from "../msgVarTokenPlugin.js";
8
- import { VariablePicker as F } from "../VariablePicker.js";
9
- import r from "./style.module.scss.js";
10
- const Q = ({
11
- value: d = "",
12
- onChange: a,
13
- disabled: l = !1,
14
- readOnly: u = !1,
15
- placeholder: m,
16
- minHeight: E = 140,
17
- className: f,
18
- enableVariableMention: o = !1,
19
- variables: L,
20
- catalogError: C
6
+ import { prepareEditorHtml as D } from "../variableMention.js";
7
+ import { MsgVarWidget as z, insertMsgVar as J } from "../msgVarTokenPlugin.js";
8
+ import { VariablePicker as Q } from "../VariablePicker.js";
9
+ import a from "./style.module.scss.js";
10
+ const $ = [
11
+ S,
12
+ G,
13
+ H,
14
+ N,
15
+ T,
16
+ U,
17
+ j,
18
+ I,
19
+ K,
20
+ W,
21
+ _
22
+ ], X = [
23
+ "undo",
24
+ "redo",
25
+ "|",
26
+ "bold",
27
+ "italic",
28
+ "underline",
29
+ "|",
30
+ "fontColor",
31
+ "fontBackgroundColor",
32
+ "|",
33
+ "bulletedList",
34
+ "numberedList",
35
+ "|",
36
+ "removeFormat"
37
+ ], lt = ({
38
+ value: i = "",
39
+ onChange: f,
40
+ disabled: b = !1,
41
+ readOnly: E = !1,
42
+ placeholder: F,
43
+ minHeight: k = 140,
44
+ className: g,
45
+ enableVariableMention: r = !1,
46
+ variables: v,
47
+ catalogError: x
21
48
  }) => {
22
- const p = e(null), g = e(null), s = e(a);
23
- s.current = a;
24
- const n = e(!1), D = e(
25
- o ? q(d || "") : d || ""
26
- ), j = N(() => ({
27
- licenseKey: "GPL",
28
- toolbar: ["undo", "redo", "|", "bold", "italic", "|", "bulletedList", "numberedList"],
29
- placeholder: m,
30
- plugins: o ? [x, R, $, k, v, P, T, w] : [x, R, $, k, v, P]
31
- }), [o, m]), h = l || u;
32
- return /* @__PURE__ */ K(
49
+ const B = l(null), m = l(null), e = l(f);
50
+ e.current = f;
51
+ const d = l(!1), C = l(r);
52
+ C.current = r;
53
+ const p = l(!1), A = L(() => {
54
+ const t = r ? [...$, q, z] : $;
55
+ return {
56
+ licenseKey: "GPL",
57
+ toolbar: X,
58
+ placeholder: F,
59
+ plugins: t,
60
+ fontColor: {
61
+ colors: [
62
+ { color: "#000000", label: "黑色" },
63
+ { color: "#EF4444", label: "红" },
64
+ { color: "#F97316", label: "橙" },
65
+ { color: "#EAB308", label: "黄" },
66
+ { color: "#22C55E", label: "绿" },
67
+ { color: "#2563EB", label: "蓝" },
68
+ { color: "#7C3AED", label: "紫" },
69
+ { color: "#6B7280", label: "灰" }
70
+ ]
71
+ },
72
+ fontBackgroundColor: {
73
+ colors: [
74
+ { color: "#FEF08A", label: "浅黄" },
75
+ { color: "#FECACA", label: "浅红" },
76
+ { color: "#BBF7D0", label: "浅绿" },
77
+ { color: "#BFDBFE", label: "浅蓝" },
78
+ { color: "#E9D5FF", label: "浅紫" },
79
+ { color: "#F3F4F6", label: "浅灰" }
80
+ ]
81
+ },
82
+ htmlSupport: {
83
+ allow: [
84
+ { name: "span", styles: !0, classes: !0, attributes: !0 },
85
+ { name: "strong", classes: !0, attributes: !0 },
86
+ { name: "b", classes: !0, attributes: !0 },
87
+ { name: "em", classes: !0, attributes: !0 },
88
+ { name: "i", classes: !0, attributes: !0 },
89
+ { name: "u", classes: !0, attributes: !0 },
90
+ { name: "p", classes: !0, attributes: !0, styles: !0 },
91
+ { name: "ul", classes: !0, attributes: !0 },
92
+ { name: "ol", classes: !0, attributes: !0 },
93
+ { name: "li", classes: !0, attributes: !0 }
94
+ ]
95
+ }
96
+ };
97
+ }, [r, F]), h = (t, o) => {
98
+ var c;
99
+ const s = D(o, C.current);
100
+ d.current = !0;
101
+ try {
102
+ t.setData(s);
103
+ let u = t.getData();
104
+ s && !u.trim() && (t.setData(`<p>${s.replace(/^<p>|<\/p>$/gi, "")}</p>`), u = t.getData()), p.current = !!(u.trim() || !s.trim()), u && ((c = e.current) == null || c.call(e, u));
105
+ } finally {
106
+ queueMicrotask(() => {
107
+ d.current = !1;
108
+ });
109
+ }
110
+ };
111
+ P(() => {
112
+ const t = m.current;
113
+ !t || !D(i || "", r).trim() || t.getData().trim() || h(t, i || "");
114
+ }, [i, r]);
115
+ const y = b || E;
116
+ return /* @__PURE__ */ R(
33
117
  "div",
34
118
  {
35
- ref: p,
36
- className: f ? `${r.root} ${r["rich-text-editor"]} ${f}` : `${r.root} ${r["rich-text-editor"]}`,
37
- style: { "--rte-min-height": `${E}px` },
38
- "data-disabled": l ? "1" : "0",
39
- "data-readonly": u ? "1" : "0",
40
- "data-var-mention": o ? "1" : "0",
119
+ ref: B,
120
+ className: g ? `${a.root} ${a["rich-text-editor"]} ${g}` : `${a.root} ${a["rich-text-editor"]}`,
121
+ style: { "--rte-min-height": `${k}px` },
122
+ "data-disabled": b ? "1" : "0",
123
+ "data-readonly": E ? "1" : "0",
124
+ "data-var-mention": r ? "1" : "0",
41
125
  children: [
42
- o ? /* @__PURE__ */ c("div", { className: r["var-toolbar"], children: /* @__PURE__ */ c(
43
- F,
126
+ r ? /* @__PURE__ */ n("div", { className: a["var-toolbar"], children: /* @__PURE__ */ n(
127
+ Q,
44
128
  {
45
- variables: L,
46
- catalogError: C,
47
- disabled: h,
48
- getPopupContainer: () => p.current || document.body,
129
+ variables: v,
130
+ catalogError: x,
131
+ disabled: y,
132
+ getPopupContainer: () => B.current || document.body,
49
133
  onPick: (t) => {
50
- const i = g.current;
51
- i && B(i, t);
134
+ const o = m.current;
135
+ o && J(o, t);
52
136
  }
53
137
  }
54
138
  ) }) : null,
55
- /* @__PURE__ */ c("div", { className: r["editor-host"], children: /* @__PURE__ */ c(
56
- b,
139
+ /* @__PURE__ */ n("div", { className: a["editor-host"], children: /* @__PURE__ */ n(
140
+ O,
57
141
  {
58
- editor: W,
59
- config: j,
60
- disabled: h,
142
+ editor: w,
143
+ config: A,
144
+ disabled: y,
61
145
  onReady: (t) => {
62
- g.current = t, n.current = !0;
63
- try {
64
- t.setData(D.current);
65
- } finally {
66
- queueMicrotask(() => {
67
- n.current = !1;
68
- });
69
- }
146
+ m.current = t, p.current = !1, h(t, i || "");
70
147
  },
71
- onChange: (t, i) => {
72
- var y;
73
- n.current || (y = s.current) == null || y.call(s, i.getData());
148
+ onChange: (t, o) => {
149
+ var c;
150
+ if (d.current) return;
151
+ const s = o.getData();
152
+ p.current = !0, (c = e.current) == null || c.call(e, s);
74
153
  }
75
154
  }
76
155
  ) })
@@ -79,6 +158,6 @@ const Q = ({
79
158
  );
80
159
  };
81
160
  export {
82
- Q as RichTextEditor
161
+ lt as RichTextEditor
83
162
  };
84
163
  //# sourceMappingURL=RichTextEditor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"RichTextEditor.js","sources":["../../../../src/components/Editor/RichTextEditor/RichTextEditor.tsx"],"sourcesContent":["import React, { useMemo, useRef } from 'react';\nimport {\n Bold,\n ClassicEditor,\n Essentials,\n Italic,\n List,\n Paragraph,\n Undo,\n Widget,\n type Editor,\n} from 'ckeditor5';\nimport { CKEditor } from '@ckeditor/ckeditor5-react';\nimport 'ckeditor5/ckeditor5.css';\nimport { wrapVarTokensForDisplay, type VariableMentionItem } from '../variableMention';\nimport { MsgVarWidget, insertMsgVar } from '../msgVarTokenPlugin';\nimport { VariablePicker } from '../VariablePicker';\nimport styles from './style.module.scss';\n\nexport type RichTextEditorProps = {\n value?: string;\n onChange?: (html: string) => void;\n disabled?: boolean;\n readOnly?: boolean;\n placeholder?: string;\n minHeight?: number;\n className?: string;\n /**\n * 开启变量色块 +「插入变量」按钮(catalog 注入;禁 FE DEFAULT_VARS)。\n * 无 `/` 触发;色块为原子 widget。\n */\n enableVariableMention?: boolean;\n variables?: VariableMentionItem[];\n /** catalog 失败短文案(按钮 disabled 提示) */\n catalogError?: string;\n};\n\n/**\n * CKEditor 5 + Coze/Dify 风「插入变量」按钮;正文 msgVar 原子色块。\n */\nexport const RichTextEditor: React.FC<RichTextEditorProps> = ({\n value = '',\n onChange,\n disabled = false,\n readOnly = false,\n placeholder,\n minHeight = 140,\n className,\n enableVariableMention = false,\n variables,\n catalogError,\n}) => {\n const rootRef = useRef<HTMLDivElement>(null);\n const editorRef = useRef<Editor | null>(null);\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n const suppressChangeRef = useRef(false);\n\n const initialHtmlRef = useRef(\n enableVariableMention ? wrapVarTokensForDisplay(value || '') : value || '',\n );\n\n const config = useMemo(() => {\n const plugins = enableVariableMention\n ? [Essentials, Paragraph, Bold, Italic, List, Undo, Widget, MsgVarWidget]\n : [Essentials, Paragraph, Bold, Italic, List, Undo];\n return {\n licenseKey: 'GPL' as const,\n toolbar: ['undo', 'redo', '|', 'bold', 'italic', '|', 'bulletedList', 'numberedList'],\n placeholder,\n plugins,\n };\n }, [enableVariableMention, placeholder]);\n\n const locked = disabled || readOnly;\n\n return (\n <div\n ref={rootRef}\n className={\n className\n ? `${styles.root} ${styles['rich-text-editor']} ${className}`\n : `${styles.root} ${styles['rich-text-editor']}`\n }\n style={{ ['--rte-min-height' as string]: `${minHeight}px` }}\n data-disabled={disabled ? '1' : '0'}\n data-readonly={readOnly ? '1' : '0'}\n data-var-mention={enableVariableMention ? '1' : '0'}\n >\n {enableVariableMention ? (\n <div className={styles['var-toolbar']}>\n <VariablePicker\n variables={variables}\n catalogError={catalogError}\n disabled={locked}\n getPopupContainer={() => rootRef.current || document.body}\n onPick={(key) => {\n const editor = editorRef.current;\n if (!editor) return;\n insertMsgVar(editor, key);\n }}\n />\n </div>\n ) : null}\n <div className={styles['editor-host']}>\n <CKEditor\n editor={ClassicEditor}\n config={config}\n disabled={locked}\n onReady={(editor) => {\n editorRef.current = editor;\n suppressChangeRef.current = true;\n try {\n editor.setData(initialHtmlRef.current);\n } finally {\n queueMicrotask(() => {\n suppressChangeRef.current = false;\n });\n }\n }}\n onChange={(_evt, editor) => {\n if (suppressChangeRef.current) return;\n onChangeRef.current?.(editor.getData());\n }}\n />\n </div>\n </div>\n );\n};\n\nexport default RichTextEditor;\n"],"names":["RichTextEditor","value","onChange","disabled","readOnly","placeholder","minHeight","className","enableVariableMention","variables","catalogError","rootRef","useRef","editorRef","onChangeRef","suppressChangeRef","initialHtmlRef","wrapVarTokensForDisplay","config","useMemo","Essentials","Paragraph","Bold","Italic","List","Undo","Widget","MsgVarWidget","locked","jsxs","styles","jsx","VariablePicker","key","editor","insertMsgVar","CKEditor","ClassicEditor","_evt","_a"],"mappings":";;;;;;;;;AAwCO,MAAMA,IAAgD,CAAC;AAAA,EAC5D,OAAAC,IAAQ;AAAA,EACR,UAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,UAAAC,IAAW;AAAA,EACX,aAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,WAAAC;AAAA,EACA,uBAAAC,IAAwB;AAAA,EACxB,WAAAC;AAAA,EACA,cAAAC;AACF,MAAM;AACJ,QAAMC,IAAUC,EAAuB,IAAI,GACrCC,IAAYD,EAAsB,IAAI,GACtCE,IAAcF,EAAOV,CAAQ;AACnC,EAAAY,EAAY,UAAUZ;AACtB,QAAMa,IAAoBH,EAAO,EAAK,GAEhCI,IAAiBJ;AAAA,IACrBJ,IAAwBS,EAAwBhB,KAAS,EAAE,IAAIA,KAAS;AAAA,EAAA,GAGpEiB,IAASC,EAAQ,OAId;AAAA,IACL,YAAY;AAAA,IACZ,SAAS,CAAC,QAAQ,QAAQ,KAAK,QAAQ,UAAU,KAAK,gBAAgB,cAAc;AAAA,IACpF,aAAAd;AAAA,IACA,SAPcG,IACZ,CAACY,GAAYC,GAAWC,GAAMC,GAAQC,GAAMC,GAAMC,GAAQC,CAAY,IACtE,CAACP,GAAYC,GAAWC,GAAMC,GAAQC,GAAMC,CAAI;AAAA,EAKlD,IAED,CAACjB,GAAuBH,CAAW,CAAC,GAEjCuB,IAASzB,KAAYC;AAE3B,SACE,gBAAAyB;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAKlB;AAAA,MACL,WACEJ,IACI,GAAGuB,EAAO,IAAI,IAAIA,EAAO,kBAAkB,CAAC,IAAIvB,CAAS,KACzD,GAAGuB,EAAO,IAAI,IAAIA,EAAO,kBAAkB,CAAC;AAAA,MAElD,OAAO,EAAG,oBAA+B,GAAGxB,CAAS,KAAA;AAAA,MACrD,iBAAeH,IAAW,MAAM;AAAA,MAChC,iBAAeC,IAAW,MAAM;AAAA,MAChC,oBAAkBI,IAAwB,MAAM;AAAA,MAE/C,UAAA;AAAA,QAAAA,IACC,gBAAAuB,EAAC,OAAA,EAAI,WAAWD,EAAO,aAAa,GAClC,UAAA,gBAAAC;AAAA,UAACC;AAAA,UAAA;AAAA,YACC,WAAAvB;AAAA,YACA,cAAAC;AAAA,YACA,UAAUkB;AAAA,YACV,mBAAmB,MAAMjB,EAAQ,WAAW,SAAS;AAAA,YACrD,QAAQ,CAACsB,MAAQ;AACf,oBAAMC,IAASrB,EAAU;AACzB,cAAKqB,KACLC,EAAaD,GAAQD,CAAG;AAAA,YAC1B;AAAA,UAAA;AAAA,QAAA,GAEJ,IACE;AAAA,QACJ,gBAAAF,EAAC,OAAA,EAAI,WAAWD,EAAO,aAAa,GAClC,UAAA,gBAAAC;AAAA,UAACK;AAAA,UAAA;AAAA,YACC,QAAQC;AAAA,YACR,QAAAnB;AAAA,YACA,UAAUU;AAAA,YACV,SAAS,CAACM,MAAW;AACnB,cAAArB,EAAU,UAAUqB,GACpBnB,EAAkB,UAAU;AAC5B,kBAAI;AACF,gBAAAmB,EAAO,QAAQlB,EAAe,OAAO;AAAA,cACvC,UAAA;AACE,+BAAe,MAAM;AACnB,kBAAAD,EAAkB,UAAU;AAAA,gBAC9B,CAAC;AAAA,cACH;AAAA,YACF;AAAA,YACA,UAAU,CAACuB,GAAMJ,MAAW;;AAC1B,cAAInB,EAAkB,YACtBwB,IAAAzB,EAAY,YAAZ,QAAAyB,EAAA,KAAAzB,GAAsBoB,EAAO;YAC/B;AAAA,UAAA;AAAA,QAAA,EACF,CACF;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGN;"}
1
+ {"version":3,"file":"RichTextEditor.js","sources":["../../../../src/components/Editor/RichTextEditor/RichTextEditor.tsx"],"sourcesContent":["import React, { useEffect, useMemo, useRef } from 'react';\nimport {\n Bold,\n ClassicEditor,\n Essentials,\n FontBackgroundColor,\n FontColor,\n GeneralHtmlSupport,\n Italic,\n List,\n Paragraph,\n RemoveFormat,\n Underline,\n Undo,\n Widget,\n type Editor,\n type EditorConfig,\n} from 'ckeditor5';\nimport { CKEditor } from '@ckeditor/ckeditor5-react';\nimport 'ckeditor5/ckeditor5.css';\nimport { prepareEditorHtml, type VariableMentionItem } from '../variableMention';\nimport { MsgVarWidget, insertMsgVar } from '../msgVarTokenPlugin';\nimport { VariablePicker } from '../VariablePicker';\nimport styles from './style.module.scss';\n\nexport type RichTextEditorProps = {\n value?: string;\n onChange?: (html: string) => void;\n disabled?: boolean;\n readOnly?: boolean;\n placeholder?: string;\n minHeight?: number;\n className?: string;\n /**\n * 开启变量色块 +「插入变量」按钮(catalog 注入;禁 FE DEFAULT_VARS)。\n * 无 `/` 触发;色块为原子 widget。\n */\n enableVariableMention?: boolean;\n variables?: VariableMentionItem[];\n /** catalog 失败短文案(按钮 disabled 提示) */\n catalogError?: string;\n};\n\nconst BASE_PLUGINS = [\n Essentials,\n Paragraph,\n Bold,\n Italic,\n Underline,\n FontColor,\n FontBackgroundColor,\n GeneralHtmlSupport,\n List,\n Undo,\n RemoveFormat,\n];\n\nconst TOOLBAR = [\n 'undo',\n 'redo',\n '|',\n 'bold',\n 'italic',\n 'underline',\n '|',\n 'fontColor',\n 'fontBackgroundColor',\n '|',\n 'bulletedList',\n 'numberedList',\n '|',\n 'removeFormat',\n];\n\n/**\n * CKEditor 5 + 变量色块。\n * - 只在「编辑区空 + 有外部 value」时 setData,禁止用 Form 旧值回灌冲掉字色/加粗\n * - GeneralHtmlSupport 保留 span[style]\n */\nexport const RichTextEditor: React.FC<RichTextEditorProps> = ({\n value = '',\n onChange,\n disabled = false,\n readOnly = false,\n placeholder,\n minHeight = 140,\n className,\n enableVariableMention = false,\n variables,\n catalogError,\n}) => {\n const rootRef = useRef<HTMLDivElement>(null);\n const editorRef = useRef<Editor | null>(null);\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n const suppressChangeRef = useRef(false);\n const enableVarRef = useRef(enableVariableMention);\n enableVarRef.current = enableVariableMention;\n /** 是否已完成首次灌入(之后禁止用 value 覆盖用户编辑) */\n const seededRef = useRef(false);\n\n const config = useMemo((): EditorConfig => {\n const plugins = enableVariableMention ? [...BASE_PLUGINS, Widget, MsgVarWidget] : BASE_PLUGINS;\n return {\n licenseKey: 'GPL',\n toolbar: TOOLBAR,\n placeholder,\n plugins,\n fontColor: {\n colors: [\n { color: '#000000', label: '黑色' },\n { color: '#EF4444', label: '红' },\n { color: '#F97316', label: '橙' },\n { color: '#EAB308', label: '黄' },\n { color: '#22C55E', label: '绿' },\n { color: '#2563EB', label: '蓝' },\n { color: '#7C3AED', label: '紫' },\n { color: '#6B7280', label: '灰' },\n ],\n },\n fontBackgroundColor: {\n colors: [\n { color: '#FEF08A', label: '浅黄' },\n { color: '#FECACA', label: '浅红' },\n { color: '#BBF7D0', label: '浅绿' },\n { color: '#BFDBFE', label: '浅蓝' },\n { color: '#E9D5FF', label: '浅紫' },\n { color: '#F3F4F6', label: '浅灰' },\n ],\n },\n htmlSupport: {\n allow: [\n { name: 'span', styles: true, classes: true, attributes: true },\n { name: 'strong', classes: true, attributes: true },\n { name: 'b', classes: true, attributes: true },\n { name: 'em', classes: true, attributes: true },\n { name: 'i', classes: true, attributes: true },\n { name: 'u', classes: true, attributes: true },\n { name: 'p', classes: true, attributes: true, styles: true },\n { name: 'ul', classes: true, attributes: true },\n { name: 'ol', classes: true, attributes: true },\n { name: 'li', classes: true, attributes: true },\n ],\n },\n } as EditorConfig;\n }, [enableVariableMention, placeholder]);\n\n const applyHtmlToEditor = (editor: Editor, raw: string) => {\n const html = prepareEditorHtml(raw, enableVarRef.current);\n suppressChangeRef.current = true;\n try {\n editor.setData(html);\n let applied = editor.getData();\n if (html && !applied.trim()) {\n editor.setData(`<p>${html.replace(/^<p>|<\\/p>$/gi, '')}</p>`);\n applied = editor.getData();\n }\n seededRef.current = Boolean(applied.trim() || !html.trim());\n // 灌入后同步 Form,避免「编辑器有样式、Form 仍是旧纯文本」导致保存丢样式\n if (applied) {\n onChangeRef.current?.(applied);\n }\n } finally {\n queueMicrotask(() => {\n suppressChangeRef.current = false;\n });\n }\n };\n\n // 仅:编辑区仍空且外部已有正文 → 回填一次。禁止在用户编辑后用 value 再 setData。\n useEffect(() => {\n const editor = editorRef.current;\n if (!editor) return;\n const prepared = prepareEditorHtml(value || '', enableVariableMention);\n if (!prepared.trim()) return;\n const live = editor.getData();\n if (live.trim()) return;\n applyHtmlToEditor(editor, value || '');\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [value, enableVariableMention]);\n\n const locked = disabled || readOnly;\n\n return (\n <div\n ref={rootRef}\n className={\n className\n ? `${styles.root} ${styles['rich-text-editor']} ${className}`\n : `${styles.root} ${styles['rich-text-editor']}`\n }\n style={{ ['--rte-min-height' as string]: `${minHeight}px` }}\n data-disabled={disabled ? '1' : '0'}\n data-readonly={readOnly ? '1' : '0'}\n data-var-mention={enableVariableMention ? '1' : '0'}\n >\n {enableVariableMention ? (\n <div className={styles['var-toolbar']}>\n <VariablePicker\n variables={variables}\n catalogError={catalogError}\n disabled={locked}\n getPopupContainer={() => rootRef.current || document.body}\n onPick={(key) => {\n const editor = editorRef.current;\n if (!editor) return;\n insertMsgVar(editor, key);\n }}\n />\n </div>\n ) : null}\n <div className={styles['editor-host']}>\n <CKEditor\n editor={ClassicEditor}\n config={config}\n disabled={locked}\n onReady={(editor) => {\n editorRef.current = editor;\n seededRef.current = false;\n applyHtmlToEditor(editor, value || '');\n }}\n onChange={(_evt, editor) => {\n if (suppressChangeRef.current) return;\n const html = editor.getData();\n seededRef.current = true;\n onChangeRef.current?.(html);\n }}\n />\n </div>\n </div>\n );\n};\n\nexport default RichTextEditor;\n"],"names":["BASE_PLUGINS","Essentials","Paragraph","Bold","Italic","Underline","FontColor","FontBackgroundColor","GeneralHtmlSupport","List","Undo","RemoveFormat","TOOLBAR","RichTextEditor","value","onChange","disabled","readOnly","placeholder","minHeight","className","enableVariableMention","variables","catalogError","rootRef","useRef","editorRef","onChangeRef","suppressChangeRef","enableVarRef","seededRef","config","useMemo","plugins","Widget","MsgVarWidget","applyHtmlToEditor","editor","raw","html","prepareEditorHtml","applied","_a","useEffect","locked","jsxs","styles","jsx","VariablePicker","key","insertMsgVar","CKEditor","ClassicEditor","_evt"],"mappings":"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"}
@@ -1,11 +1,11 @@
1
- const t = "_root_16i7d_1", o = {
2
- root: t,
3
- "rich-text-editor": "_rich-text-editor_16i7d_27",
4
- "var-toolbar": "_var-toolbar_16i7d_32",
5
- "editor-host": "_editor-host_16i7d_38"
1
+ const o = "_root_13ou2_1", t = {
2
+ root: o,
3
+ "rich-text-editor": "_rich-text-editor_13ou2_44",
4
+ "var-toolbar": "_var-toolbar_13ou2_49",
5
+ "editor-host": "_editor-host_13ou2_55"
6
6
  };
7
7
  export {
8
- o as default,
9
- t as root
8
+ t as default,
9
+ o as root
10
10
  };
11
11
  //# sourceMappingURL=style.module.scss.js.map
@@ -1,7 +1,7 @@
1
1
  export { RichTextEditor } from './RichTextEditor';
2
2
  export type { RichTextEditorProps } from './RichTextEditor';
3
- export { MSG_VAR_TOKEN_CLASS, VAR_PLACEHOLDER_RE, toVarToken, filterVariableFeed, formatVariableOptionLabel, toMentionFeedItem, normalizeMentionHtmlToVarTokens, wrapVarTokensForDisplay, upliftVarTokensToMentions, insertVarTokenAt, } from './variableMention';
3
+ export { MSG_VAR_TOKEN_CLASS, VAR_PLACEHOLDER_RE, toVarToken, filterVariableFeed, formatVariableOptionLabel, toMentionFeedItem, normalizeMentionHtmlToVarTokens, wrapVarTokensForDisplay, ensureRichTextBlockHtml, prepareEditorHtml, splitInlineFormatAroundMsgVars, upliftVarTokensToMentions, insertVarTokenAt, unwrapMsgVarSpansForStorage, } from './variableMention';
4
4
  export type { VariableMentionItem } from './variableMention';
5
- export { MsgVarWidget, insertMsgVar } from './msgVarTokenPlugin';
5
+ export { MsgVarWidget, insertMsgVar, collectMarksFromAncestors, MSG_VAR_MARK_ATTRS, } from './msgVarTokenPlugin';
6
6
  export { VariablePicker } from './VariablePicker';
7
7
  export type { VariablePickerProps } from './VariablePicker';
@@ -1,21 +1,27 @@
1
- import { MSG_VAR_TOKEN_CLASS as a, VAR_PLACEHOLDER_RE as i, filterVariableFeed as n, formatVariableOptionLabel as V, insertVarTokenAt as l, normalizeMentionHtmlToVarTokens as m, toMentionFeedItem as p, toVarToken as s, upliftVarTokensToMentions as T, wrapVarTokensForDisplay as f } from "./variableMention.js";
2
- import { MsgVarWidget as M, insertMsgVar as x } from "./msgVarTokenPlugin.js";
1
+ import { MSG_VAR_TOKEN_CLASS as a, VAR_PLACEHOLDER_RE as i, ensureRichTextBlockHtml as n, filterVariableFeed as s, formatVariableOptionLabel as l, insertVarTokenAt as V, normalizeMentionHtmlToVarTokens as p, prepareEditorHtml as m, splitInlineFormatAroundMsgVars as T, toMentionFeedItem as M, toVarToken as A, unwrapMsgVarSpansForStorage as R, upliftVarTokensToMentions as k, wrapVarTokensForDisplay as _ } from "./variableMention.js";
2
+ import { MSG_VAR_MARK_ATTRS as f, MsgVarWidget as S, collectMarksFromAncestors as d, insertMsgVar as g } from "./msgVarTokenPlugin.js";
3
3
  import { VariablePicker as E } from "./VariablePicker.js";
4
- import { RichTextEditor as r } from "./RichTextEditor/RichTextEditor.js";
4
+ import { RichTextEditor as e } from "./RichTextEditor/RichTextEditor.js";
5
5
  export {
6
+ f as MSG_VAR_MARK_ATTRS,
6
7
  a as MSG_VAR_TOKEN_CLASS,
7
- M as MsgVarWidget,
8
- r as RichTextEditor,
8
+ S as MsgVarWidget,
9
+ e as RichTextEditor,
9
10
  i as VAR_PLACEHOLDER_RE,
10
11
  E as VariablePicker,
11
- n as filterVariableFeed,
12
- V as formatVariableOptionLabel,
13
- x as insertMsgVar,
14
- l as insertVarTokenAt,
15
- m as normalizeMentionHtmlToVarTokens,
16
- p as toMentionFeedItem,
17
- s as toVarToken,
18
- T as upliftVarTokensToMentions,
19
- f as wrapVarTokensForDisplay
12
+ d as collectMarksFromAncestors,
13
+ n as ensureRichTextBlockHtml,
14
+ s as filterVariableFeed,
15
+ l as formatVariableOptionLabel,
16
+ g as insertMsgVar,
17
+ V as insertVarTokenAt,
18
+ p as normalizeMentionHtmlToVarTokens,
19
+ m as prepareEditorHtml,
20
+ T as splitInlineFormatAroundMsgVars,
21
+ M as toMentionFeedItem,
22
+ A as toVarToken,
23
+ R as unwrapMsgVarSpansForStorage,
24
+ k as upliftVarTokensToMentions,
25
+ _ as wrapVarTokensForDisplay
20
26
  };
21
27
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,18 @@
1
- import { Plugin, Widget, Editor } from 'ckeditor5';
1
+ import { Plugin, Widget, Editor, ViewDowncastWriter, ViewElement } from 'ckeditor5';
2
+ /** 色块可持久化的文本样式($inlineObject 本身不吃 bold 等 text attribute) */
3
+ export declare const MSG_VAR_MARK_ATTRS: readonly ["bold", "italic", "underline", "fontColor", "fontBackgroundColor"];
4
+ export type MsgVarMarkAttr = (typeof MSG_VAR_MARK_ATTRS)[number];
5
+ type MsgVarMarks = Partial<{
6
+ bold: true;
7
+ italic: true;
8
+ underline: true;
9
+ fontColor: string;
10
+ fontBackgroundColor: string;
11
+ }>;
2
12
  /**
3
13
  * 正文变量原子色块:isObject inline widget。
4
14
  * 不可改内部字符;Backspace/Delete 整颗删(对齐 Coze/Dify chip)。
15
+ * 加粗/斜体/下划线/字色落在色块上时写入 model 属性,存盘再包回 HTML,避免重开丢失。
5
16
  */
6
17
  export declare class MsgVarWidget extends Plugin {
7
18
  #private;
@@ -9,5 +20,15 @@ export declare class MsgVarWidget extends Plugin {
9
20
  static get requires(): readonly [typeof Widget];
10
21
  init(): void;
11
22
  }
23
+ /** 色块自身 data-* / style(编辑态 downcast) */
24
+ export declare function collectMarksFromDataAttrs(viewElement: ViewElement): MsgVarMarks;
25
+ /** 从色块祖先读取 strong/em/u/color,供 upcast 写入 model */
26
+ export declare function collectMarksFromAncestors(viewElement: ViewElement): MsgVarMarks;
27
+ /**
28
+ * dataDowncast:按 marks 包一层 HTML(strong/em/u/color),内层仍为 msg-var-token。
29
+ * 导出供单测校验包层顺序。
30
+ */
31
+ export declare function wrapMsgVarViewWithMarks(writer: ViewDowncastWriter, tokenView: ViewElement, marks: MsgVarMarks): ViewElement;
12
32
  /** 在选区插入原子变量色块,并焦点回编辑器 */
13
33
  export declare function insertMsgVar(editor: Editor, key: string): void;
34
+ export {};