@lobehub/editor 4.1.0 → 4.2.0

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 (41) hide show
  1. package/es/plugins/code/plugin/index.js +6 -0
  2. package/es/plugins/markdown/service/shortcut.d.ts +1 -1
  3. package/es/plugins/markdown/service/transformers.d.ts +1 -1
  4. package/es/plugins/markdown/service/transformers.js +14 -2
  5. package/es/renderer/LexicalRenderer.d.ts +3 -0
  6. package/es/renderer/LexicalRenderer.js +61 -0
  7. package/es/renderer/engine/render-builtin-node.d.ts +2 -0
  8. package/es/renderer/engine/render-builtin-node.js +180 -0
  9. package/es/renderer/engine/render-text-node.d.ts +2 -0
  10. package/es/renderer/engine/render-text-node.js +39 -0
  11. package/es/renderer/engine/render-tree.d.ts +6 -0
  12. package/es/renderer/engine/render-tree.js +47 -0
  13. package/es/renderer/engine/shiki.d.ts +3 -0
  14. package/es/renderer/engine/shiki.js +183 -0
  15. package/es/renderer/engine/utils.d.ts +2 -0
  16. package/es/renderer/engine/utils.js +27 -0
  17. package/es/renderer/index.d.ts +5 -0
  18. package/es/renderer/index.js +4 -0
  19. package/es/renderer/nodes/index.d.ts +2 -0
  20. package/es/renderer/nodes/index.js +17 -0
  21. package/es/renderer/renderers/codeblock.d.ts +2 -0
  22. package/es/renderer/renderers/codeblock.js +157 -0
  23. package/es/renderer/renderers/file.d.ts +2 -0
  24. package/es/renderer/renderers/file.js +30 -0
  25. package/es/renderer/renderers/horizontalrule.d.ts +2 -0
  26. package/es/renderer/renderers/horizontalrule.js +15 -0
  27. package/es/renderer/renderers/image.d.ts +3 -0
  28. package/es/renderer/renderers/image.js +40 -0
  29. package/es/renderer/renderers/index.d.ts +2 -0
  30. package/es/renderer/renderers/index.js +9 -0
  31. package/es/renderer/renderers/math.d.ts +2 -0
  32. package/es/renderer/renderers/math.js +18 -0
  33. package/es/renderer/renderers/mention.d.ts +2 -0
  34. package/es/renderer/renderers/mention.js +13 -0
  35. package/es/renderer/style.d.ts +14 -0
  36. package/es/renderer/style.js +48 -0
  37. package/es/renderer/types.d.ts +25 -0
  38. package/es/renderer/types.js +1 -0
  39. package/package.json +5 -2
  40. package/renderer.d.ts +1 -0
  41. package/renderer.js +1 -0
@@ -82,6 +82,12 @@ export var CodePlugin = (_class = /*#__PURE__*/function (_KernelPlugin) {
82
82
  });
83
83
  markdownService.registerMarkdownShortCuts([{
84
84
  process: function process(selection) {
85
+ // If selection already contains a code node, do not process the shortcut to avoid nesting code nodes
86
+ if (selection.getNodes().some(function (node) {
87
+ return node.getType() === CodeNode.getType();
88
+ })) {
89
+ return false;
90
+ }
85
91
  var text = selection.getTextContent();
86
92
  selection.removeText();
87
93
  selection.insertNodes([$createCodeNode(text), $createCursorNode()]);
@@ -75,7 +75,7 @@ export declare class MarkdownShortCutService implements IMarkdownShortCutService
75
75
  get textFormatTransformersByTrigger(): Readonly<Record<string, readonly Readonly<{
76
76
  format?: readonly import("lexical").TextFormatType[] | undefined;
77
77
  intraword?: boolean | undefined;
78
- process?: ((selection: import("lexical").RangeSelection) => void) | undefined;
78
+ process?: ((selection: import("lexical").RangeSelection) => boolean | void) | undefined;
79
79
  tag: string;
80
80
  type: "text-format";
81
81
  }>[]>>;
@@ -2,7 +2,7 @@ import type { ElementNode, LexicalNode, RangeSelection, TextFormatType, TextNode
2
2
  export type TextFormatTransformer = Readonly<{
3
3
  format?: ReadonlyArray<TextFormatType>;
4
4
  intraword?: boolean;
5
- process?: (selection: RangeSelection) => void;
5
+ process?: (selection: RangeSelection) => boolean | void;
6
6
  tag: string;
7
7
  type: 'text-format';
8
8
  }>;
@@ -9,7 +9,7 @@ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
9
9
  function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
10
10
  function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
11
11
  function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
12
- import { $createRangeSelection, $getSelection, $isLineBreakNode, $isRangeSelection, $isRootOrShadowRoot, $isTextNode, $setSelection } from 'lexical';
12
+ import { $createRangeSelection, $getNodeByKey, $getSelection, $isLineBreakNode, $isRangeSelection, $isRootOrShadowRoot, $isTextNode, $setSelection } from 'lexical';
13
13
  import { PUNCTUATION_OR_SPACE, getOpenTagStartIndex, isEqualSubString } from "../utils";
14
14
  export function testElementTransformers(parentNode, anchorNode, anchorOffset, elementTransformers, fromTrigger) {
15
15
  var grandParentNode = parentNode.getParent();
@@ -230,7 +230,19 @@ export function $runTextFormatTransformers(anchorNode, anchorOffset, textFormatT
230
230
  nextSelection.anchor.set(openNode.__key, openTagStartIndex, 'text');
231
231
  nextSelection.focus.set(closeNode.__key, newOffset, 'text');
232
232
  if (matcher.process) {
233
- matcher.process(nextSelection);
233
+ if (matcher.process(nextSelection) === false) {
234
+ var currentOpenNode = $getNodeByKey(openNode.__key);
235
+ var currentCloseNode = $getNodeByKey(closeNode.__key);
236
+ if ($isTextNode(currentOpenNode)) {
237
+ currentOpenNode.setTextContent(prevOpenNodeText);
238
+ }
239
+ if (currentCloseNode !== currentOpenNode && $isTextNode(currentCloseNode)) {
240
+ currentCloseNode.setTextContent(prevCloseNodeText);
241
+ }
242
+ // If process function returns false, cancel the transform and set selection to original position
243
+ $setSelection(anchorNode.selectEnd());
244
+ continue;
245
+ }
234
246
  return true;
235
247
  } else if (matcher.format) {
236
248
  // Apply formatting to selected text
@@ -0,0 +1,3 @@
1
+ import { type ReactElement } from 'react';
2
+ import type { LexicalRendererProps } from './types';
3
+ export declare function LexicalRenderer({ value, overrides, extraNodes, renderContext, as: Tag, className, style, variant, }: LexicalRendererProps): ReactElement;
@@ -0,0 +1,61 @@
1
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
3
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
4
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
5
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
6
+ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
7
+ function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
8
+ function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
9
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
10
+ function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
11
+ function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
12
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
13
+ import { createHeadlessEditor } from '@lexical/headless';
14
+ import { $getRoot } from 'lexical';
15
+ import { createElement, useMemo } from 'react';
16
+ import { renderNode } from "./engine/render-tree";
17
+ import { rendererNodes } from "./nodes";
18
+ import { createDefaultRenderers } from "./renderers";
19
+ import { getCSSVariables, getRendererClassName } from "./style";
20
+ export function LexicalRenderer(_ref) {
21
+ var value = _ref.value,
22
+ overrides = _ref.overrides,
23
+ extraNodes = _ref.extraNodes,
24
+ renderContext = _ref.renderContext,
25
+ _ref$as = _ref.as,
26
+ Tag = _ref$as === void 0 ? 'div' : _ref$as,
27
+ className = _ref.className,
28
+ style = _ref.style,
29
+ variant = _ref.variant;
30
+ var content = useMemo(function () {
31
+ var nodes = extraNodes ? [].concat(_toConsumableArray(rendererNodes), _toConsumableArray(extraNodes)) : rendererNodes;
32
+ var registry = createDefaultRenderers();
33
+ var editor = createHeadlessEditor({
34
+ editable: false,
35
+ nodes: nodes,
36
+ onError: function onError(error) {
37
+ console.error('[LexicalRenderer]', error);
38
+ }
39
+ });
40
+ var state = editor.parseEditorState(value);
41
+ editor.setEditorState(state);
42
+ var result = null;
43
+ var headingSlugs = new Map();
44
+ state.read(function () {
45
+ result = $getRoot().getChildren().map(function (child, i) {
46
+ return renderNode(child, registry, headingSlugs, overrides, "r-".concat(i), _objectSpread(_objectSpread({}, renderContext), {}, {
47
+ variant: variant
48
+ }));
49
+ });
50
+ });
51
+ return result;
52
+ }, [value, overrides, extraNodes, renderContext, variant]);
53
+ var cssVars = getCSSVariables(variant);
54
+
55
+ // Mirrors Editor's structure: outer div (flex column + CSS vars + theme rules)
56
+ // → inner div (block, allows normal margin collapse like contentEditable)
57
+ return /*#__PURE__*/createElement(Tag, {
58
+ className: getRendererClassName(className),
59
+ style: _objectSpread(_objectSpread({}, cssVars), style)
60
+ }, /*#__PURE__*/createElement('div', null, content));
61
+ }
@@ -0,0 +1,2 @@
1
+ import { type ReactNode } from 'react';
2
+ export declare function renderBuiltinNode(node: Record<string, any>, key: string, children: ReactNode[] | null, headingSlugs: Map<string, number>, textContent?: string): ReactNode;
@@ -0,0 +1,180 @@
1
+ import { createElement } from 'react';
2
+ import { getListClassName, getTableWrapperClassName } from "../style";
3
+ import { parseCSSText } from "./utils";
4
+ import { jsx as _jsx } from "react/jsx-runtime";
5
+ var SAFE_URL_PROTOCOLS = new Set(['http:', 'https:', 'mailto:', 'sms:', 'tel:']);
6
+ function sanitizeUrl(url) {
7
+ try {
8
+ var parsed = new URL(url);
9
+ if (!SAFE_URL_PROTOCOLS.has(parsed.protocol)) {
10
+ return 'about:blank';
11
+ }
12
+ } catch (_unused) {
13
+ return url;
14
+ }
15
+ return url;
16
+ }
17
+ function textToSlug(text) {
18
+ return text.toLowerCase().trim().replaceAll(/[^\s\w\u3000-\u9FFF\uAC00-\uD7AF\uFF00-\uFFEF-]/g, '').replaceAll(/[\s_]+/g, '-').replaceAll(/^-+|-+$/g, '');
19
+ }
20
+ export function renderBuiltinNode(node, key, children, headingSlugs, textContent) {
21
+ switch (node.type) {
22
+ case 'root':
23
+ {
24
+ return children;
25
+ }
26
+ case 'paragraph':
27
+ {
28
+ var style = node.format ? {
29
+ textAlign: node.format
30
+ } : undefined;
31
+ return /*#__PURE__*/_jsx("p", {
32
+ style: style,
33
+ children: children
34
+ }, key);
35
+ }
36
+ case 'heading':
37
+ {
38
+ var tag = node.tag;
39
+ var text = textContent || '';
40
+ var baseSlug = textToSlug(text);
41
+ var slug = baseSlug;
42
+ if (baseSlug) {
43
+ var count = headingSlugs.get(baseSlug);
44
+ if (count !== undefined) {
45
+ slug = "".concat(baseSlug, "-").concat(count);
46
+ headingSlugs.set(baseSlug, count + 1);
47
+ } else {
48
+ headingSlugs.set(baseSlug, 1);
49
+ }
50
+ }
51
+ return /*#__PURE__*/createElement(tag, {
52
+ id: slug || undefined,
53
+ key: key
54
+ }, children);
55
+ }
56
+ case 'quote':
57
+ {
58
+ return /*#__PURE__*/_jsx("blockquote", {
59
+ className: "editor_quote",
60
+ children: children
61
+ }, key);
62
+ }
63
+ case 'list':
64
+ {
65
+ var Tag = node.listType === 'number' ? 'ol' : 'ul';
66
+ var listClass = getListClassName(node.listType);
67
+ return /*#__PURE__*/_jsx(Tag, {
68
+ className: listClass,
69
+ start: node.start !== 1 ? node.start : undefined,
70
+ children: children
71
+ }, key);
72
+ }
73
+ case 'listitem':
74
+ {
75
+ var _node$children;
76
+ var isChecklist = node.checked !== undefined;
77
+ var hasNestedList = (_node$children = node.children) === null || _node$children === void 0 ? void 0 : _node$children.some(function (c) {
78
+ return c.type === 'list';
79
+ });
80
+ var value = typeof node.value === 'number' && node.value > 1 ? node.value : undefined;
81
+ var cls = 'editor_listItem';
82
+ if (hasNestedList) {
83
+ cls = 'editor_listItemNested';
84
+ } else if (isChecklist) {
85
+ cls = node.checked ? 'editor_listItem editor_listItemChecked' : 'editor_listItem editor_listItemUnchecked';
86
+ }
87
+ return /*#__PURE__*/_jsx("li", {
88
+ className: cls,
89
+ role: isChecklist ? 'checkbox' : undefined,
90
+ value: value,
91
+ children: children
92
+ }, key);
93
+ }
94
+ case 'link':
95
+ case 'autolink':
96
+ {
97
+ return /*#__PURE__*/_jsx("a", {
98
+ href: sanitizeUrl(node.url),
99
+ rel: node.rel || 'noopener noreferrer',
100
+ target: node.target || undefined,
101
+ children: children
102
+ }, key);
103
+ }
104
+ case 'table':
105
+ {
106
+ return /*#__PURE__*/_jsx("div", {
107
+ className: getTableWrapperClassName(),
108
+ children: /*#__PURE__*/_jsx("table", {
109
+ className: "editor_table",
110
+ children: /*#__PURE__*/_jsx("tbody", {
111
+ children: children
112
+ })
113
+ })
114
+ }, key);
115
+ }
116
+ case 'tablerow':
117
+ {
118
+ return /*#__PURE__*/_jsx("tr", {
119
+ children: children
120
+ }, key);
121
+ }
122
+ case 'tablecell':
123
+ {
124
+ var isHeader = !!node.headerState;
125
+ var CellTag = isHeader ? 'th' : 'td';
126
+ var _cls = isHeader ? 'editor_table_cell editor_table_cell_header' : 'editor_table_cell';
127
+ var cellStyle = {};
128
+ if (node.width) cellStyle.width = "".concat(node.width, "px");
129
+ if (node.backgroundColor) cellStyle.backgroundColor = node.backgroundColor;
130
+ if (node.verticalAlign) cellStyle.verticalAlign = node.verticalAlign;
131
+ return /*#__PURE__*/_jsx(CellTag, {
132
+ className: _cls,
133
+ colSpan: node.colSpan > 1 ? node.colSpan : undefined,
134
+ rowSpan: node.rowSpan > 1 ? node.rowSpan : undefined,
135
+ style: Object.keys(cellStyle).length > 0 ? cellStyle : undefined,
136
+ children: children
137
+ }, key);
138
+ }
139
+ case 'linebreak':
140
+ {
141
+ return /*#__PURE__*/_jsx("br", {}, key);
142
+ }
143
+ case 'tab':
144
+ {
145
+ return /*#__PURE__*/_jsx("span", {
146
+ children: '\t'
147
+ }, key);
148
+ }
149
+ case 'codeInline':
150
+ {
151
+ return /*#__PURE__*/_jsx("code", {
152
+ className: "editor_code",
153
+ children: children
154
+ }, key);
155
+ }
156
+ case 'code-highlight':
157
+ {
158
+ if (node.style) {
159
+ return /*#__PURE__*/_jsx("span", {
160
+ style: parseCSSText(node.style),
161
+ children: node.text
162
+ }, key);
163
+ }
164
+ return /*#__PURE__*/_jsx("span", {
165
+ children: node.text
166
+ }, key);
167
+ }
168
+ case 'cursor':
169
+ {
170
+ return null;
171
+ }
172
+ default:
173
+ {
174
+ if (process.env.NODE_ENV !== 'production') {
175
+ console.warn("[LexicalRenderer] Unknown node type: \"".concat(node.type, "\""));
176
+ }
177
+ return children !== null && children !== void 0 ? children : null;
178
+ }
179
+ }
180
+ }
@@ -0,0 +1,2 @@
1
+ import { type ReactNode } from 'react';
2
+ export declare function renderTextNode(node: Record<string, any>, key: string): ReactNode;
@@ -0,0 +1,39 @@
1
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
2
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
3
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
4
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
5
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
6
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
7
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
8
+ import { createElement } from 'react';
9
+ import { parseCSSText } from "./utils";
10
+ var FORMAT_TAGS = [[1, 'strong'], [2, 'em'], [4, 's'], [8, 'u'], [16, 'code'], [32, 'sub'], [64, 'sup'], [128, 'mark']];
11
+ export function renderTextNode(node, key) {
12
+ var element = node.text;
13
+ var format = node.format || 0;
14
+ var _iterator = _createForOfIteratorHelper(FORMAT_TAGS),
15
+ _step;
16
+ try {
17
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
18
+ var _step$value = _slicedToArray(_step.value, 2),
19
+ flag = _step$value[0],
20
+ tag = _step$value[1];
21
+ if (format & flag) {
22
+ element = /*#__PURE__*/createElement(tag, {
23
+ key: "".concat(key, "-").concat(flag)
24
+ }, element);
25
+ }
26
+ }
27
+ } catch (err) {
28
+ _iterator.e(err);
29
+ } finally {
30
+ _iterator.f();
31
+ }
32
+ if (node.style) {
33
+ element = /*#__PURE__*/createElement('span', {
34
+ key: key,
35
+ style: parseCSSText(node.style)
36
+ }, element);
37
+ }
38
+ return element;
39
+ }
@@ -0,0 +1,6 @@
1
+ import type { LexicalNode } from 'lexical';
2
+ import type { ReactNode } from 'react';
3
+ import type { LexicalRendererContext, NodeRenderer, RendererRegistry } from '../types';
4
+ export declare function renderNode(node: LexicalNode, registry: RendererRegistry, headingSlugs: Map<string, number>, overrides: Record<string, NodeRenderer> | undefined, key: string, renderContext?: LexicalRendererContext & {
5
+ variant?: 'default' | 'chat';
6
+ }): ReactNode;
@@ -0,0 +1,47 @@
1
+ import { $isElementNode, $isTextNode } from 'lexical';
2
+ import { renderBuiltinNode } from "./render-builtin-node";
3
+ import { renderTextNode } from "./render-text-node";
4
+ function isHeadlessRenderableNode(node) {
5
+ return typeof node.renderHeadless === 'function';
6
+ }
7
+ export function renderNode(node, registry, headingSlugs, overrides, key, renderContext) {
8
+ var type = node.getType();
9
+
10
+ // CursorNode extends TextNode but should be suppressed in renderer output
11
+ if (type === 'cursor') {
12
+ return null;
13
+ }
14
+ if ($isTextNode(node)) {
15
+ var _serialized = node.exportJSON();
16
+ return renderTextNode(_serialized, key);
17
+ }
18
+ var serialized = node.exportJSON();
19
+ var children = null;
20
+ if ($isElementNode(node)) {
21
+ var childNodes = node.getChildren();
22
+ if (childNodes.length > 0) {
23
+ children = childNodes.map(function (child, i) {
24
+ return renderNode(child, registry, headingSlugs, overrides, "".concat(key, "-").concat(i), renderContext);
25
+ });
26
+ }
27
+ }
28
+ var textContent = node.getTextContent ? node.getTextContent() : undefined;
29
+ var override = overrides === null || overrides === void 0 ? void 0 : overrides[type];
30
+ if (override) {
31
+ return override(serialized, key, children);
32
+ }
33
+ if (isHeadlessRenderableNode(node)) {
34
+ var context = {
35
+ children: children,
36
+ extra: renderContext === null || renderContext === void 0 ? void 0 : renderContext.extra,
37
+ key: key,
38
+ variant: renderContext === null || renderContext === void 0 ? void 0 : renderContext.variant
39
+ };
40
+ return node.renderHeadless(context);
41
+ }
42
+ var renderer = registry.get(type);
43
+ if (renderer) {
44
+ return renderer(serialized, key, children);
45
+ }
46
+ return renderBuiltinNode(serialized, key, children, headingSlugs, textContent);
47
+ }
@@ -0,0 +1,3 @@
1
+ import { type ReactNode } from 'react';
2
+ export declare function loadLanguage(language: string): Promise<void>;
3
+ export declare function highlightCode(code: string, language: string, key: string): ReactNode[] | null;
@@ -0,0 +1,183 @@
1
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2
+ function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw new Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator.return && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw new Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, catch: function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; }
3
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
4
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
5
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
6
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
7
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
8
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
9
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
10
+ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
11
+ function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
12
+ import { createHighlighterCoreSync, isSpecialLang, stringifyTokenStyle } from '@shikijs/core';
13
+ import { createJavaScriptRegexEngine } from '@shikijs/engine-javascript';
14
+ import { createElement } from 'react';
15
+ import { bundledLanguagesInfo } from 'shiki';
16
+ var _highlighter = null;
17
+ var _themeLoaded = false;
18
+ function getHighlighter() {
19
+ if (!_highlighter) {
20
+ _highlighter = createHighlighterCoreSync({
21
+ engine: createJavaScriptRegexEngine(),
22
+ langs: [],
23
+ themes: []
24
+ });
25
+ }
26
+ return _highlighter;
27
+ }
28
+ function ensureTheme(_x) {
29
+ return _ensureTheme.apply(this, arguments);
30
+ }
31
+ function _ensureTheme() {
32
+ _ensureTheme = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(highlighter) {
33
+ var _yield$import, ShikiLobeTheme;
34
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
35
+ while (1) switch (_context.prev = _context.next) {
36
+ case 0:
37
+ if (!_themeLoaded) {
38
+ _context.next = 2;
39
+ break;
40
+ }
41
+ return _context.abrupt("return");
42
+ case 2:
43
+ _context.prev = 2;
44
+ _context.next = 5;
45
+ return import('@lobehub/ui');
46
+ case 5:
47
+ _yield$import = _context.sent;
48
+ ShikiLobeTheme = _yield$import.ShikiLobeTheme;
49
+ highlighter.loadThemeSync(ShikiLobeTheme);
50
+ _themeLoaded = true;
51
+ _context.next = 13;
52
+ break;
53
+ case 11:
54
+ _context.prev = 11;
55
+ _context.t0 = _context["catch"](2);
56
+ case 13:
57
+ case "end":
58
+ return _context.stop();
59
+ }
60
+ }, _callee, null, [[2, 11]]);
61
+ }));
62
+ return _ensureTheme.apply(this, arguments);
63
+ }
64
+ function isLanguageLoaded(language) {
65
+ if (isSpecialLang(language)) return true;
66
+ var highlighter = getHighlighter();
67
+ return highlighter.getLoadedLanguages().includes(language);
68
+ }
69
+ function parseInlineStyle(style) {
70
+ var result = {};
71
+ var _iterator = _createForOfIteratorHelper(style.split(';')),
72
+ _step;
73
+ try {
74
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
75
+ var part = _step.value;
76
+ var colonIdx = part.indexOf(':');
77
+ if (colonIdx === -1) continue;
78
+ var prop = part.slice(0, colonIdx).trim();
79
+ var val = part.slice(colonIdx + 1).trim();
80
+ if (!prop || !val) continue;
81
+ var camelProp = prop.replaceAll(/-([a-z])/g, function (_, c) {
82
+ return c.toUpperCase();
83
+ });
84
+ result[camelProp] = val;
85
+ }
86
+ } catch (err) {
87
+ _iterator.e(err);
88
+ } finally {
89
+ _iterator.f();
90
+ }
91
+ return result;
92
+ }
93
+ export function loadLanguage(_x2) {
94
+ return _loadLanguage.apply(this, arguments);
95
+ }
96
+ function _loadLanguage() {
97
+ _loadLanguage = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(language) {
98
+ var info, highlighter;
99
+ return _regeneratorRuntime().wrap(function _callee2$(_context2) {
100
+ while (1) switch (_context2.prev = _context2.next) {
101
+ case 0:
102
+ if (!isLanguageLoaded(language)) {
103
+ _context2.next = 2;
104
+ break;
105
+ }
106
+ return _context2.abrupt("return");
107
+ case 2:
108
+ info = bundledLanguagesInfo.find(function (desc) {
109
+ var _desc$aliases;
110
+ return desc.id === language || ((_desc$aliases = desc.aliases) === null || _desc$aliases === void 0 ? void 0 : _desc$aliases.includes(language));
111
+ });
112
+ if (!info) {
113
+ _context2.next = 7;
114
+ break;
115
+ }
116
+ highlighter = getHighlighter();
117
+ _context2.next = 7;
118
+ return highlighter.loadLanguage(info.import());
119
+ case 7:
120
+ case "end":
121
+ return _context2.stop();
122
+ }
123
+ }, _callee2);
124
+ }));
125
+ return _loadLanguage.apply(this, arguments);
126
+ }
127
+ export function highlightCode(code, language, key) {
128
+ if (!language || !isLanguageLoaded(language)) return null;
129
+ var highlighter = getHighlighter();
130
+ void ensureTheme(highlighter);
131
+ var theme = _themeLoaded ? 'lobe-theme' : highlighter.getLoadedThemes()[0] || 'none';
132
+ try {
133
+ var _highlighter$codeToTo = highlighter.codeToTokens(code, {
134
+ lang: language,
135
+ theme: theme
136
+ }),
137
+ tokens = _highlighter$codeToTo.tokens;
138
+ var nodes = [];
139
+ var _iterator2 = _createForOfIteratorHelper(tokens.entries()),
140
+ _step2;
141
+ try {
142
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
143
+ var _step2$value = _slicedToArray(_step2.value, 2),
144
+ lineIdx = _step2$value[0],
145
+ line = _step2$value[1];
146
+ if (lineIdx > 0) {
147
+ nodes.push( /*#__PURE__*/createElement('br', {
148
+ key: "".concat(key, "-br-").concat(lineIdx)
149
+ }));
150
+ }
151
+ var _iterator3 = _createForOfIteratorHelper(line.entries()),
152
+ _step3;
153
+ try {
154
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
155
+ var _step3$value = _slicedToArray(_step3.value, 2),
156
+ tokenIdx = _step3$value[0],
157
+ token = _step3$value[1];
158
+ var tokenStyle = stringifyTokenStyle(token.htmlStyle || (token.color ? "color: ".concat(token.color) : ''));
159
+ if (tokenStyle) {
160
+ nodes.push( /*#__PURE__*/createElement('span', {
161
+ key: "".concat(key, "-").concat(lineIdx, "-").concat(tokenIdx),
162
+ style: parseInlineStyle(tokenStyle)
163
+ }, token.content));
164
+ } else {
165
+ nodes.push(token.content);
166
+ }
167
+ }
168
+ } catch (err) {
169
+ _iterator3.e(err);
170
+ } finally {
171
+ _iterator3.f();
172
+ }
173
+ }
174
+ } catch (err) {
175
+ _iterator2.e(err);
176
+ } finally {
177
+ _iterator2.f();
178
+ }
179
+ return nodes;
180
+ } catch (_unused) {
181
+ return null;
182
+ }
183
+ }
@@ -0,0 +1,2 @@
1
+ import type { CSSProperties } from 'react';
2
+ export declare function parseCSSText(cssText: string): CSSProperties;
@@ -0,0 +1,27 @@
1
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
2
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
3
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
4
+ export function parseCSSText(cssText) {
5
+ var style = {};
6
+ var _iterator = _createForOfIteratorHelper(cssText.split(';')),
7
+ _step;
8
+ try {
9
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
10
+ var part = _step.value;
11
+ var colonIndex = part.indexOf(':');
12
+ if (colonIndex === -1) continue;
13
+ var prop = part.slice(0, colonIndex).trim();
14
+ var value = part.slice(colonIndex + 1).trim();
15
+ if (!prop || !value) continue;
16
+ var camelProp = prop.replaceAll(/-([a-z])/g, function (_, c) {
17
+ return c.toUpperCase();
18
+ });
19
+ style[camelProp] = value;
20
+ }
21
+ } catch (err) {
22
+ _iterator.e(err);
23
+ } finally {
24
+ _iterator.f();
25
+ }
26
+ return style;
27
+ }
@@ -0,0 +1,5 @@
1
+ export { loadLanguage } from './engine/shiki';
2
+ export { LexicalRenderer } from './LexicalRenderer';
3
+ export { rendererNodes } from './nodes';
4
+ export { createDefaultRenderers } from './renderers';
5
+ export type { HeadlessRenderableNode, HeadlessRenderContext, LexicalRendererContext, LexicalRendererProps, NodeRenderer, RendererRegistry, } from './types';
@@ -0,0 +1,4 @@
1
+ export { loadLanguage } from "./engine/shiki";
2
+ export { LexicalRenderer } from "./LexicalRenderer";
3
+ export { rendererNodes } from "./nodes";
4
+ export { createDefaultRenderers } from "./renderers";
@@ -0,0 +1,2 @@
1
+ import type { Klass, LexicalNode } from 'lexical';
2
+ export declare const rendererNodes: Array<Klass<LexicalNode>>;
@@ -0,0 +1,17 @@
1
+ import { ListItemNode, ListNode } from '@lexical/list';
2
+ import { HeadingNode, QuoteNode } from '@lexical/rich-text';
3
+ import { TableCellNode, TableNode, TableRowNode } from '@lexical/table';
4
+ import { PlaceholderBlockNode, PlaceholderNode } from "../../plugins/auto-complete/node/placeholderNode";
5
+ import { CodeNode } from "../../plugins/code/node/code";
6
+ import { CodeMirrorNode } from "../../plugins/codemirror-block/node/CodeMirrorNode";
7
+ import { CursorNode } from "../../plugins/common/node/cursor";
8
+ import { FileNode } from "../../plugins/file/node/FileNode";
9
+ import { HorizontalRuleNode } from "../../plugins/hr/node/HorizontalRuleNode";
10
+ import { BlockImageNode } from "../../plugins/image/node/block-image-node";
11
+ import { ImageNode } from "../../plugins/image/node/image-node";
12
+ import { LinkHighlightNode } from "../../plugins/link-highlight/node/link-highlight";
13
+ import { AutoLinkNode, LinkNode } from "../../plugins/link/node/LinkNode";
14
+ import { DiffNode } from "../../plugins/litexml/node/DiffNode";
15
+ import { MathBlockNode, MathInlineNode } from "../../plugins/math/node";
16
+ import { MentionNode } from "../../plugins/mention/node/MentionNode";
17
+ export var rendererNodes = [HeadingNode, QuoteNode, ListNode, ListItemNode, TableNode, TableRowNode, TableCellNode, ImageNode, BlockImageNode, MathInlineNode, MathBlockNode, CodeMirrorNode, HorizontalRuleNode, MentionNode, FileNode, CodeNode, LinkNode, AutoLinkNode, CursorNode, DiffNode, LinkHighlightNode, PlaceholderNode, PlaceholderBlockNode];
@@ -0,0 +1,2 @@
1
+ import { type ReactNode } from 'react';
2
+ export declare function renderCodeBlock(node: Record<string, any>, key: string, children: ReactNode[] | null): ReactNode;
@@ -0,0 +1,157 @@
1
+ 'use client';
2
+
3
+ var _templateObject;
4
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
5
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
6
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
7
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
8
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
9
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
10
+ function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
11
+ import { ActionIcon, Block, Flexbox, MaterialFileTypeIcon, Text } from '@lobehub/ui';
12
+ import { createStaticStyles } from 'antd-style';
13
+ import { Check, ChevronDown, ChevronRight, CopyIcon } from 'lucide-react';
14
+ import { useCallback, useState } from 'react';
15
+ import { highlightCode } from "../engine/shiki";
16
+ import { jsx as _jsx } from "react/jsx-runtime";
17
+ import { jsxs as _jsxs } from "react/jsx-runtime";
18
+ var useStyles = createStaticStyles(function (_ref) {
19
+ var css = _ref.css,
20
+ cssVar = _ref.cssVar;
21
+ return css(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n cursor: default;\n\n overflow: hidden;\n display: flex;\n flex-direction: column;\n align-items: center;\n\n width: 100%;\n margin-block: calc(var(--lobe-markdown-margin-multiple) * 0.5em);\n border-radius: var(--lobe-markdown-border-radius);\n\n background: ", ";\n\n .renderer-cm-header {\n width: 100%;\n }\n\n .renderer-cm-code {\n width: 100%;\n border-block-start: 1px solid ", ";\n }\n\n .renderer-cm-pre {\n overflow-x: auto;\n\n margin: 0;\n padding: 16px;\n\n font-family: ", ";\n font-size: calc(var(--lobe-markdown-font-size) * 0.85);\n line-height: 1.6;\n white-space: pre;\n\n background: transparent;\n\n code {\n font-family: inherit;\n font-size: inherit;\n }\n }\n\n .renderer-cm-collapsed {\n overflow: hidden;\n height: 0;\n border-block-start: none;\n }\n "])), cssVar.colorFillQuaternary, cssVar.colorFillQuaternary, cssVar.fontFamilyCode);
22
+ });
23
+ function CodeBlockCopyButton(_ref2) {
24
+ var code = _ref2.code;
25
+ var _useState = useState(false),
26
+ _useState2 = _slicedToArray(_useState, 2),
27
+ copied = _useState2[0],
28
+ setCopied = _useState2[1];
29
+ var handleCopy = useCallback(function () {
30
+ navigator.clipboard.writeText(code).catch(function () {});
31
+ setCopied(true);
32
+ setTimeout(function () {
33
+ return setCopied(false);
34
+ }, 1000);
35
+ }, [code]);
36
+ return /*#__PURE__*/_jsx(ActionIcon, {
37
+ active: copied,
38
+ icon: copied ? Check : CopyIcon,
39
+ onClick: handleCopy,
40
+ size: "small",
41
+ title: "Copy"
42
+ });
43
+ }
44
+ function getLanguageName(lang) {
45
+ var names = {
46
+ bash: 'Bash',
47
+ c: 'C',
48
+ cpp: 'C++',
49
+ csharp: 'C#',
50
+ css: 'CSS',
51
+ dart: 'Dart',
52
+ go: 'Go',
53
+ graphql: 'GraphQL',
54
+ html: 'HTML',
55
+ java: 'Java',
56
+ javascript: 'JavaScript',
57
+ json: 'JSON',
58
+ jsx: 'JSX',
59
+ kotlin: 'Kotlin',
60
+ lua: 'Lua',
61
+ markdown: 'Markdown',
62
+ php: 'PHP',
63
+ python: 'Python',
64
+ ruby: 'Ruby',
65
+ rust: 'Rust',
66
+ scss: 'SCSS',
67
+ shell: 'Shell',
68
+ sql: 'SQL',
69
+ swift: 'Swift',
70
+ tsx: 'TSX',
71
+ typescript: 'TypeScript',
72
+ xml: 'XML',
73
+ yaml: 'YAML'
74
+ };
75
+ return names[lang] || lang.charAt(0).toUpperCase() + lang.slice(1);
76
+ }
77
+ function getFileExt(lang) {
78
+ var exts = {
79
+ bash: 'sh',
80
+ csharp: 'cs',
81
+ javascript: 'js',
82
+ kotlin: 'kt',
83
+ markdown: 'md',
84
+ python: 'py',
85
+ ruby: 'rb',
86
+ rust: 'rs',
87
+ shell: 'sh',
88
+ swift: 'swift',
89
+ typescript: 'ts',
90
+ yaml: 'yml'
91
+ };
92
+ return exts[lang] || lang;
93
+ }
94
+ function CodeBlockRenderer(_ref3) {
95
+ var node = _ref3.node,
96
+ codeChildren = _ref3.codeChildren;
97
+ var language = node.language || '';
98
+ var code = node.code || '';
99
+ var _useState3 = useState(true),
100
+ _useState4 = _slicedToArray(_useState3, 2),
101
+ expand = _useState4[0],
102
+ setExpand = _useState4[1];
103
+ var codeContent = codeChildren || highlightCode(code, language, 'cb') || code;
104
+ return /*#__PURE__*/_jsxs(Block, {
105
+ className: useStyles,
106
+ variant: "filled",
107
+ children: [/*#__PURE__*/_jsxs(Flexbox, {
108
+ align: "center",
109
+ className: "renderer-cm-header",
110
+ horizontal: true,
111
+ justify: "space-between",
112
+ padding: 4,
113
+ children: [/*#__PURE__*/_jsxs(Flexbox, {
114
+ align: "center",
115
+ gap: 4,
116
+ horizontal: true,
117
+ children: [language && /*#__PURE__*/_jsx(MaterialFileTypeIcon, {
118
+ fallbackUnknownType: false,
119
+ filename: "*.".concat(getFileExt(language)),
120
+ size: 18,
121
+ type: "file",
122
+ variant: "raw"
123
+ }), /*#__PURE__*/_jsx(Text, {
124
+ ellipsis: true,
125
+ fontSize: 13,
126
+ children: language ? getLanguageName(language) : 'Plain Text'
127
+ })]
128
+ }), /*#__PURE__*/_jsxs(Flexbox, {
129
+ gap: 4,
130
+ horizontal: true,
131
+ children: [/*#__PURE__*/_jsx(CodeBlockCopyButton, {
132
+ code: code
133
+ }), /*#__PURE__*/_jsx(ActionIcon, {
134
+ icon: expand ? ChevronDown : ChevronRight,
135
+ onClick: function onClick() {
136
+ return setExpand(!expand);
137
+ },
138
+ size: "small"
139
+ })]
140
+ })]
141
+ }), /*#__PURE__*/_jsx("div", {
142
+ className: expand ? 'renderer-cm-code' : 'renderer-cm-code renderer-cm-collapsed',
143
+ children: /*#__PURE__*/_jsx("pre", {
144
+ className: "renderer-cm-pre",
145
+ children: /*#__PURE__*/_jsx("code", {
146
+ children: codeContent
147
+ })
148
+ })
149
+ })]
150
+ });
151
+ }
152
+ export function renderCodeBlock(node, key, children) {
153
+ return /*#__PURE__*/_jsx(CodeBlockRenderer, {
154
+ codeChildren: children,
155
+ node: node
156
+ }, key);
157
+ }
@@ -0,0 +1,2 @@
1
+ import type { ReactNode } from 'react';
2
+ export declare function renderFile(node: Record<string, any>, key: string): ReactNode;
@@ -0,0 +1,30 @@
1
+ import { styles as fileStyles } from "../../plugins/file/react/style";
2
+ import { jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { jsx as _jsx } from "react/jsx-runtime";
4
+ export function renderFile(node, key) {
5
+ var name = node.name,
6
+ fileUrl = node.fileUrl,
7
+ status = node.status,
8
+ message = node.message;
9
+ var cls = fileStyles.file;
10
+ if (status === 'error') {
11
+ return /*#__PURE__*/_jsxs("span", {
12
+ className: cls,
13
+ "data-file-status": "error",
14
+ children: [name, ": ", message || 'Upload failed']
15
+ }, key);
16
+ }
17
+ if (status === 'pending' || !fileUrl) {
18
+ return /*#__PURE__*/_jsx("span", {
19
+ className: cls,
20
+ "data-file-status": "pending",
21
+ children: name
22
+ }, key);
23
+ }
24
+ return /*#__PURE__*/_jsx("a", {
25
+ className: cls,
26
+ download: name,
27
+ href: fileUrl,
28
+ children: name
29
+ }, key);
30
+ }
@@ -0,0 +1,2 @@
1
+ import { type ReactNode } from 'react';
2
+ export declare function renderHR(_node: Record<string, any>, key: string): ReactNode;
@@ -0,0 +1,15 @@
1
+ var _templateObject;
2
+ function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
3
+ import { createStaticStyles } from 'antd-style';
4
+ import { createElement } from 'react';
5
+ var useStyles = createStaticStyles(function (_ref) {
6
+ var css = _ref.css,
7
+ cssVar = _ref.cssVar;
8
+ return css(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n display: flex;\n align-items: center;\n\n width: 100%;\n height: calc(var(--lobe-markdown-margin-multiple) * 1em);\n margin-block: calc(var(--lobe-markdown-margin-multiple) * 1em);\n\n hr {\n width: 100%;\n border-color: ", ";\n border-style: dashed;\n border-width: 1px;\n border-block-start: none;\n border-inline-start: none;\n border-inline-end: none;\n }\n "])), cssVar.colorBorder);
9
+ });
10
+ export function renderHR(_node, key) {
11
+ return /*#__PURE__*/createElement('div', {
12
+ className: useStyles,
13
+ key: key
14
+ }, /*#__PURE__*/createElement('hr'));
15
+ }
@@ -0,0 +1,3 @@
1
+ import type { ReactNode } from 'react';
2
+ export declare function renderImage(node: Record<string, any>, key: string): ReactNode;
3
+ export declare function renderBlockImage(node: Record<string, any>, key: string): ReactNode;
@@ -0,0 +1,40 @@
1
+ import { getBlockImageClassName, getImageClassName } from "../style";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ export function renderImage(node, key) {
4
+ var src = node.src,
5
+ altText = node.altText,
6
+ width = node.width,
7
+ height = node.height,
8
+ maxWidth = node.maxWidth;
9
+ var style = {};
10
+ if (maxWidth) style.maxWidth = maxWidth;
11
+ if (width && width !== 'inherit') style.width = width;
12
+ if (height && height !== 'inherit') style.height = height;
13
+ return /*#__PURE__*/_jsx("span", {
14
+ className: getImageClassName(),
15
+ children: /*#__PURE__*/_jsx("img", {
16
+ alt: altText || '',
17
+ src: src,
18
+ style: style
19
+ })
20
+ }, key);
21
+ }
22
+ export function renderBlockImage(node, key) {
23
+ var src = node.src,
24
+ altText = node.altText,
25
+ width = node.width,
26
+ height = node.height,
27
+ maxWidth = node.maxWidth;
28
+ var style = {};
29
+ if (maxWidth) style.maxWidth = maxWidth;
30
+ if (width && width !== 'inherit') style.width = width;
31
+ if (height && height !== 'inherit') style.height = height;
32
+ return /*#__PURE__*/_jsx("figure", {
33
+ className: getBlockImageClassName(),
34
+ children: /*#__PURE__*/_jsx("img", {
35
+ alt: altText || '',
36
+ src: src,
37
+ style: style
38
+ })
39
+ }, key);
40
+ }
@@ -0,0 +1,2 @@
1
+ import type { RendererRegistry } from '../types';
2
+ export declare function createDefaultRenderers(): RendererRegistry;
@@ -0,0 +1,9 @@
1
+ import { renderCodeBlock } from "./codeblock";
2
+ import { renderFile } from "./file";
3
+ import { renderHR } from "./horizontalrule";
4
+ import { renderBlockImage, renderImage } from "./image";
5
+ import { renderMath } from "./math";
6
+ import { renderMention } from "./mention";
7
+ export function createDefaultRenderers() {
8
+ return new Map([['image', renderImage], ['block-image', renderBlockImage], ['math', renderMath], ['mathBlock', renderMath], ['code', renderCodeBlock], ['horizontalrule', renderHR], ['mention', renderMention], ['file', renderFile]]);
9
+ }
@@ -0,0 +1,2 @@
1
+ import { type ReactNode } from 'react';
2
+ export declare function renderMath(node: Record<string, any>, key: string): ReactNode;
@@ -0,0 +1,18 @@
1
+ import katex from 'katex';
2
+ import { createElement } from 'react';
3
+ import { getMathBlockClassName, getMathInlineClassName } from "../style";
4
+ export function renderMath(node, key) {
5
+ var code = node.code || '';
6
+ var displayMode = node.type === 'mathBlock';
7
+ var html = katex.renderToString(code, {
8
+ displayMode: displayMode,
9
+ throwOnError: false
10
+ });
11
+ return /*#__PURE__*/createElement(displayMode ? 'div' : 'span', {
12
+ className: displayMode ? getMathBlockClassName() : getMathInlineClassName(),
13
+ dangerouslySetInnerHTML: {
14
+ __html: html
15
+ },
16
+ key: key
17
+ });
18
+ }
@@ -0,0 +1,2 @@
1
+ import type { ReactNode } from 'react';
2
+ export declare function renderMention(node: Record<string, any>, key: string): ReactNode;
@@ -0,0 +1,13 @@
1
+ import { getMentionClassName } from "../style";
2
+ import { jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { jsx as _jsx } from "react/jsx-runtime";
4
+ export function renderMention(node, key) {
5
+ var label = node.label || '';
6
+ return /*#__PURE__*/_jsx("span", {
7
+ className: getMentionClassName(),
8
+ children: /*#__PURE__*/_jsxs("span", {
9
+ className: "editor_mention",
10
+ children: ["@", label]
11
+ })
12
+ }, key);
13
+ }
@@ -0,0 +1,14 @@
1
+ export declare function getRendererClassName(className?: string): string;
2
+ export declare function getListClassName(listType: string): string;
3
+ export declare function getTableWrapperClassName(): string;
4
+ export declare function getMathInlineClassName(): string;
5
+ export declare function getMathBlockClassName(): string;
6
+ export declare function getImageClassName(): string;
7
+ export declare function getBlockImageClassName(): string;
8
+ export declare function getMentionClassName(): string;
9
+ export declare function getCSSVariables(variant?: 'default' | 'chat'): {
10
+ '--common-font-size': string;
11
+ '--common-header-multiple': string;
12
+ '--common-line-height': string;
13
+ '--common-margin-multiple': string;
14
+ };
@@ -0,0 +1,48 @@
1
+ var _templateObject;
2
+ function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
3
+ import { createStaticStyles, cx } from 'antd-style';
4
+ import { styles as commonStyles } from "../plugins/common/react/style";
5
+ import { styles as imageStyles } from "../plugins/image/react/style";
6
+ import { styles as listStyles } from "../plugins/list/react/style";
7
+ import { styles as mathStyles } from "../plugins/math/react/style";
8
+ import { styles as mentionStyles } from "../plugins/mention/react/style";
9
+ import { styles as tableStyles } from "../plugins/table/react/style";
10
+ var tableHeaderFix = createStaticStyles(function (_ref) {
11
+ var css = _ref.css,
12
+ cssVar = _ref.cssVar;
13
+ return css(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n .editor_table > tbody > tr:first-of-type {\n background: ", ";\n\n .editor_table_cell_header {\n font-weight: bold;\n }\n }\n "])), cssVar.colorFillQuaternary);
14
+ });
15
+ export function getRendererClassName(className) {
16
+ return cx(commonStyles.root, commonStyles.variant, className);
17
+ }
18
+ export function getListClassName(listType) {
19
+ var semantic = listType === 'number' ? 'editor_listOrdered' : 'editor_listUnordered';
20
+ return cx(semantic, listStyles);
21
+ }
22
+ export function getTableWrapperClassName() {
23
+ return cx('editor_table_scrollable_wrapper', tableStyles, tableHeaderFix);
24
+ }
25
+ export function getMathInlineClassName() {
26
+ return mathStyles.mathInline;
27
+ }
28
+ export function getMathBlockClassName() {
29
+ return mathStyles.mathBlock;
30
+ }
31
+ export function getImageClassName() {
32
+ return imageStyles.image;
33
+ }
34
+ export function getBlockImageClassName() {
35
+ return imageStyles.blockImage;
36
+ }
37
+ export function getMentionClassName() {
38
+ return cx('editor_mention', mentionStyles.mention);
39
+ }
40
+ export function getCSSVariables(variant) {
41
+ var isChat = variant === 'chat';
42
+ return {
43
+ '--common-font-size': "".concat(isChat ? 14 : 16, "px"),
44
+ '--common-header-multiple': String(isChat ? 0.25 : 0.6),
45
+ '--common-line-height': String(isChat ? 1.4 : 1.6),
46
+ '--common-margin-multiple': String(isChat ? 1 : 2)
47
+ };
48
+ }
@@ -0,0 +1,25 @@
1
+ import type { Klass, LexicalNode, SerializedEditorState } from 'lexical';
2
+ import type { CSSProperties, JSX, ReactNode } from 'react';
3
+ export type NodeRenderer = (node: Record<string, any>, key: string, children: ReactNode[] | null) => ReactNode;
4
+ export type RendererRegistry = Map<string, NodeRenderer>;
5
+ export interface LexicalRendererContext {
6
+ extra?: Record<string, unknown>;
7
+ }
8
+ export interface HeadlessRenderContext extends LexicalRendererContext {
9
+ children: ReactNode[] | null;
10
+ key: string;
11
+ variant?: 'default' | 'chat';
12
+ }
13
+ export interface HeadlessRenderableNode {
14
+ renderHeadless(context: HeadlessRenderContext): ReactNode;
15
+ }
16
+ export interface LexicalRendererProps {
17
+ as?: keyof JSX.IntrinsicElements;
18
+ className?: string;
19
+ extraNodes?: Array<Klass<LexicalNode>>;
20
+ overrides?: Record<string, NodeRenderer>;
21
+ renderContext?: LexicalRendererContext;
22
+ style?: CSSProperties;
23
+ value: SerializedEditorState;
24
+ variant?: 'default' | 'chat';
25
+ }
@@ -0,0 +1 @@
1
+ export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lobehub/editor",
3
- "version": "4.1.0",
3
+ "version": "4.2.0",
4
4
  "description": "A powerful and extensible rich text editor built on Meta's Lexical framework, providing a modern editing experience with React integration.",
5
5
  "keywords": [
6
6
  "lobehub",
@@ -27,7 +27,9 @@
27
27
  "es",
28
28
  "scripts/patch-lexical.js",
29
29
  "react.d.ts",
30
- "react.js"
30
+ "react.js",
31
+ "renderer.d.ts",
32
+ "renderer.js"
31
33
  ],
32
34
  "scripts": {
33
35
  "build": "npm run build:clean && father build && npm run build:packages",
@@ -64,6 +66,7 @@
64
66
  "@lexical/code": "^0.39.0",
65
67
  "@lexical/code-shiki": "^0.39.0",
66
68
  "@lexical/dragon": "^0.39.0",
69
+ "@lexical/headless": "^0.39.0",
67
70
  "@lexical/history": "^0.39.0",
68
71
  "@lexical/link": "^0.39.0",
69
72
  "@lexical/list": "^0.39.0",
package/renderer.d.ts ADDED
@@ -0,0 +1 @@
1
+ export * from './es/renderer';
package/renderer.js ADDED
@@ -0,0 +1 @@
1
+ export * from './es/renderer';