@blocklet/editor 2.2.32 → 2.2.37

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.
@@ -0,0 +1,3 @@
1
+ /// <reference types="react" />
2
+ export declare function isMarkdownText(text: string): boolean;
3
+ export default function PasteMarkdownPlugin(): JSX.Element | null;
@@ -0,0 +1,90 @@
1
+ import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';
2
+ import { COMMAND_PRIORITY_CRITICAL, PASTE_COMMAND, $getSelection, $isRangeSelection, $createParagraphNode, } from 'lexical';
3
+ import { useEffect } from 'react';
4
+ import { $convertFromMarkdownString, TRANSFORMERS } from '@lexical/markdown';
5
+ import isEmpty from 'lodash/isEmpty';
6
+ import { lexer } from 'marked';
7
+ function isHtml(str) {
8
+ const doc = new DOMParser().parseFromString(str, 'text/html');
9
+ return Array.from(doc.body.childNodes).some((node) => node.nodeType === 1);
10
+ }
11
+ export function isMarkdownText(text) {
12
+ if (!text) {
13
+ return false;
14
+ }
15
+ if (isEmpty(text.trim())) {
16
+ return false;
17
+ }
18
+ if (isHtml(text)) {
19
+ return false;
20
+ }
21
+ function containsNonTextTokens(tokens) {
22
+ return tokens.some((token) => {
23
+ if (token.type !== 'text' && token.type !== 'paragraph') {
24
+ return true;
25
+ }
26
+ if (token.tokens && containsNonTextTokens(token.tokens)) {
27
+ return true;
28
+ }
29
+ return false;
30
+ });
31
+ }
32
+ const tokens = lexer(text);
33
+ return containsNonTextTokens(tokens);
34
+ }
35
+ export default function PasteMarkdownPlugin() {
36
+ const [editor] = useLexicalComposerContext();
37
+ useEffect(() => {
38
+ const unregister = editor.registerCommand(PASTE_COMMAND, (e) => {
39
+ if (e instanceof ClipboardEvent) {
40
+ const markdownText = e.clipboardData?.getData('text/html') || e.clipboardData?.getData('text/plain');
41
+ if (markdownText && isMarkdownText(markdownText)) {
42
+ editor.update(() => {
43
+ // 获取当前选区
44
+ const selection = $getSelection();
45
+ if (!$isRangeSelection(selection)) {
46
+ return;
47
+ }
48
+ // 如果有选择的文本,先删除
49
+ if (!selection.isCollapsed()) {
50
+ selection.removeText();
51
+ }
52
+ // 创建一个新的段落节点作为D区域(独立区域)
53
+ const containerNode = $createParagraphNode();
54
+ // 检查光标后是否有内容
55
+ const anchorNode = selection.anchor.getNode();
56
+ const anchorOffset = selection.anchor.offset;
57
+ const textContent = anchorNode.getTextContent();
58
+ // 判断光标在文本中的位置
59
+ const isCursorInMiddleOfText = textContent.length > 0 && anchorOffset > 0 && anchorOffset < textContent.length;
60
+ const isCursorAtLineStart = anchorOffset === 0 && textContent.length > 0;
61
+ if (isCursorInMiddleOfText) {
62
+ // 如果光标在文本中间,先添加一个空行后再插入内容
63
+ selection.insertNodes([containerNode, $createParagraphNode()]);
64
+ }
65
+ else if (isCursorAtLineStart) {
66
+ // 如果光标在行首(比如在"B"前面),插入内容后添加一个空行
67
+ const emptyParagraph = $createParagraphNode();
68
+ selection.insertNodes([containerNode, emptyParagraph]);
69
+ // 将光标放在新插入的内容之后的空行上
70
+ emptyParagraph.select();
71
+ }
72
+ else {
73
+ // 其他情况(光标在行尾或空行),直接插入
74
+ selection.insertNodes([containerNode]);
75
+ }
76
+ // 将Markdown内容转换并插入到D区域中
77
+ $convertFromMarkdownString(markdownText, TRANSFORMERS, containerNode);
78
+ });
79
+ return true;
80
+ }
81
+ return false;
82
+ }
83
+ return false;
84
+ }, COMMAND_PRIORITY_CRITICAL);
85
+ return () => {
86
+ unregister();
87
+ };
88
+ }, [editor]);
89
+ return null;
90
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,26 @@
1
+ /* eslint-disable no-irregular-whitespace */
2
+ import { describe, expect, it } from 'vitest';
3
+ import { isMarkdownText } from './index';
4
+ describe('isMarkdownText', () => {
5
+ it('should return false if text is empty', () => {
6
+ expect(isMarkdownText('')).toBe(false);
7
+ expect(isMarkdownText(' ')).toBe(false);
8
+ expect(isMarkdownText('\n')).toBe(false);
9
+ });
10
+ it('should return false if text is html', () => {
11
+ expect(isMarkdownText(`<div class="MuiContainer-root MuiContainer-maxWidthLg css-1oqqzyl-MuiContainer-root"><div class="MuiBox-root css-1yuhvjn"><div class="MuiBox-root css-k3gutg"><button class="MuiButtonBase-root MuiButton-root MuiButton-outlined MuiButton-outlinedPrimary MuiButton-sizeSmall MuiButton-outlinedSizeSmall MuiButton-colorPrimary MuiButton-disableElevation MuiButton-root MuiButton-outlined MuiButton-outlinedPrimary MuiButton-sizeSmall MuiButton-outlinedSizeSmall MuiButton-colorPrimary MuiButton-disableElevation css-17x8kct-MuiButtonBase-root-MuiButton-root" tabindex="0" type="button"><span class="MuiButton-icon MuiButton-startIcon MuiButton-iconSizeSmall css-cstir9-MuiButton-startIcon"><svg class="MuiSvgIcon-root MuiSvgIcon-fontSizeMedium css-i4bv87-MuiSvgIcon-root" focusable="false" aria-hidden="true" viewBox="0 0 24 24" data-testid="ArrowBackIosIcon" style="font-size: 13px;"><path d="M11.67 3.87 9.9 2.1 0 12l9.9 9.9 1.77-1.77L3.54 12z"></path></svg></span>Back<span class="MuiTouchRipple-root css-8je8zh-MuiTouchRipple-root"></span></button><div class="MuiBox-root css-zdpt2t"><div class="MuiBox-root css-axw7ok"><button class="MuiButtonBase-root MuiIconButton-root MuiIconButton-colorPrimary MuiIconButton-sizeSmall css-1dn1wl8-MuiButtonBase-root-MuiIconButton-root" tabindex="0" type="button"><svg viewBox="0 0 24 24" width="1.2em" height="1.2em"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m12 17.75l-6.172 3.245l1.179-6.873l-5-4.867l6.9-1l3.086-6.253l3.086 6.253l6.9 1l-5 4.867l1.179 6.873z"></path></svg><span class="MuiTouchRipple-root css-8je8zh-MuiTouchRipple-root"></span></button><div class="MuiBox-root css-0"><button class="MuiButtonBase-root MuiIconButton-root MuiIconButton-colorPrimary MuiIconButton-sizeSmall css-1dn1wl8-MuiButtonBase-root-MuiIconButton-root" tabindex="0" type="button"><svg viewBox="0 0 24 24" width="1.2em" height="1.2em" class="MuiBox-root css-0"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 9H7a2 2 0 0 0-2 2v8a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2v-8a2 2 0 0 0-2-2h-1m-4 5V3M9 6l3-3l3 3"></path></svg><span class="MuiTouchRipple-root css-8je8zh-MuiTouchRipple-root"></span></button></div><div class="MuiBox-root css-0"><button class="MuiButtonBase-root MuiIconButton-root MuiIconButton-colorPrimary MuiIconButton-sizeSmall css-1dn1wl8-MuiButtonBase-root-MuiIconButton-root" tabindex="0" type="button"><svg class="MuiSvgIcon-root MuiSvgIcon-fontSizeMedium css-i4bv87-MuiSvgIcon-root" focusable="false" aria-hidden="true" viewBox="0 0 24 24" data-testid="MoreHorizIcon"><path d="M6 10c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2m12 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2m-6 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2"></path></svg><span class="MuiTouchRipple-root css-8je8zh-MuiTouchRipple-root"></span></button></div></div></div></div><div class="MuiBox-root css-gg4vpm"><div class="MuiBox-root css-1g68m89"><h2 class="MuiTypography-root MuiTypography-h2 discussion-title css-1a64kw2-MuiTypography-root">post1-我们将在提供的示例中主要使用 TypeScript,但你始终可以将代码片段切换为普通 JavaScript 语法(只需单击每个片段右上角的语言按钮即可切换)。2333
12
+
13
+
14
+ </h2></div><div class="MuiBox-root css-f14rpr"></div></div><div class="MuiBox-root css-1dc00t0"><div class="MuiBox-root css-70qvj9"><div class="MuiBox-root css-1895mr1"><div class="MuiBox-root css-172hjuw"><a class="MuiBox-root css-yxwuei" href="/discussions/boards/discussion-default"><div class="MuiBox-root css-6su6fj"><span class="MuiBox-root css-1ed9rdg">D</span></div><div class="MuiBox-root css-j7qwjs"><span class="MuiBox-root css-1kuy7z7">Discussions</span></div></a><svg viewBox="0 0 24 24" width="1.2em" height="1.2em" class="MuiBox-root css-15yqc45"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="M19.875 6.27A2.23 2.23 0 0 1 21 8.218v7.284c0 .809-.443 1.555-1.158 1.948l-6.75 4.27a2.27 2.27 0 0 1-2.184 0l-6.75-4.27A2.23 2.23 0 0 1 3 15.502V8.217c0-.809.443-1.554 1.158-1.947l6.75-3.98a2.33 2.33 0 0 1 2.25 0l6.75 3.98z"></path><path d="M9 12a3 3 0 1 0 6 0a3 3 0 1 0-6 0"></path></g></svg></div><div class="MuiInputBase-root MuiOutlinedInput-root MuiInputBase-colorPrimary MuiInputBase-sizeSmall css-xh5s97-MuiInputBase-root-MuiOutlinedInput-root-MuiSelect-root"><div tabindex="0" role="combobox" aria-controls=":rt:" aria-expanded="false" aria-haspopup="listbox" class="MuiSelect-select MuiSelect-outlined MuiInputBase-input MuiOutlinedInput-input MuiInputBase-inputSizeSmall css-z4o9r-MuiSelect-select-MuiInputBase-input-MuiOutlinedInput-input"><div class="MuiBox-root css-yxwuei"><div class="MuiBox-root css-6su6fj"><span class="MuiBox-root css-1ed9rdg">D</span></div><div class="MuiBox-root css-j7qwjs"><span class="MuiBox-root css-1kuy7z7">Discussions</span></div></div></div><input aria-invalid="false" aria-hidden="true" tabindex="-1" class="MuiSelect-nativeInput css-yf8vq0-MuiSelect-nativeInput" value="discussion-default"><svg class="MuiSvgIcon-root MuiSvgIcon-fontSizeMedium MuiSelect-icon MuiSelect-iconOutlined css-hfutr2-MuiSvgIcon-root-MuiSelect-icon" focusable="false" aria-hidden="true" viewBox="0 0 24 24" data-testid="UnfoldMoreIcon"><path d="M12 5.83 15.17 9l1.41-1.41L12 3 7.41 7.59 8.83 9zm0 12.34L8.83 15l-1.41 1.41L12 21l4.59-4.59L15.17 15z"></path></svg><fieldset aria-hidden="true" class="MuiOutlinedInput-notchedOutline css-1d3z3hw-MuiOutlinedInput-notchedOutline"><legend class="css-ihdtdm"><span class="notranslate">​</span></legend></fieldset></div></div><div class="MuiBox-root css-1fpmozj"><svg viewBox="0 0 24 24" width="1.2em" height="1.2em" class="MuiBox-root css-0"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="M10 12a2 2 0 1 0 4 0a2 2 0 0 0-4 0"></path><path d="M21 12q-3.6 6-9 6t-9-6q3.6-6 9-6t9 6"></path></g></svg><span class="MuiBox-root css-0">27</span><span class="MuiBox-root css-0">views</span></div></div></div><div class="MuiBox-root css-oc1vt3"><div class="label-picker MuiBox-root css-b5gljb"><div class="MuiBox-root css-9fnqs1"><div class="MuiBox-root css-70qvj9"><svg viewBox="0 0 24 24" width="1.2em" height="1.2em" class="MuiBox-root css-1yxe5b2"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m12 17l-6 4V7a4 4 0 0 1 4-4h4a4 4 0 0 1 4 4v5m-2 7h6m-3-3v6"></path></svg></div><a class="MuiBox-root css-58h0pv" href="/discussions?labels=system:doc:guide"><div class="MuiChip-root MuiChip-outlined MuiChip-sizeSmall MuiChip-colorDefault MuiChip-outlinedDefault css-1step3r-MuiChip-root"><span class="MuiChip-label MuiChip-labelSmall css-rrn746-MuiChip-label">Guide</span></div></a><a class="MuiBox-root css-58h0pv" href="/discussions?labels=closed"><div class="MuiChip-root MuiChip-outlined MuiChip-sizeSmall MuiChip-colorDefault MuiChip-outlinedDefault css-1hdrlh5-MuiChip-root"><span class="MuiChip-label MuiChip-labelSmall css-rrn746-MuiChip-label">Closed</span></div></a><a class="MuiBox-root css-58h0pv" href="/discussions?labels=system:doc:get-started"><div class="MuiChip-root MuiChip-outlined MuiChip-sizeSmall MuiChip-colorDefault MuiChip-outlinedDefault css-1step3r-MuiChip-root"><span class="MuiChip-label MuiChip-labelSmall css-rrn746-MuiChip-label">Get Started</span></div></a><a class="MuiBox-root css-58h0pv" href="/discussions?labels=priority-medium"><div class="MuiChip-root MuiChip-outlined MuiChip-sizeSmall MuiChip-colorDefault MuiChip-outlinedDefault css-pjyljd-MuiChip-root"><span class="MuiChip-label MuiChip-labelSmall css-rrn746-MuiChip-label">Priority / Medium</span></div></a><a class="MuiBox-root css-58h0pv" href="/discussions?labels=open"><div class="MuiChip-root MuiChip-outlined MuiChip-sizeSmall MuiChip-colorDefault MuiChip-outlinedDefault css-n368by-MuiChip-root"><span class="MuiChip-label MuiChip-labelSmall css-rrn746-MuiChip-label">Open</span></div></a></div></div></div><div class="MuiBox-root css-w2q947" id="detail-content"><div class="MuiBox-root css-1abudc7"><div class="MuiBox-root css-xqwt5o"><div class="MuiBox-root css-v8279g" data-mui-internal-clone-element="true"><div class="MuiBox-root css-1xx7r4x" data-id="2" style="display: inline-block; width: 48px;"><div class="image avatar-img--circle Img-root" style="background-position: center top; background-size: cover; background-repeat: no-repeat; padding-top: 100%; background-image: url(&quot;https://bbqa6ip2nrhjek566zuwtwxx27v2da2qr2tbn35hjoi.did.abtnet.io/.well-known/service/user/avatar/52ce87886347ec98904b32e2c940dea3.png?imageFilter=resize&amp;w=72&amp;h=72&amp;f=webp&quot;);"><img class="image--img" src="https://bbqa6ip2nrhjek566zuwtwxx27v2da2qr2tbn35hjoi.did.abtnet.io/.well-known/service/user/avatar/52ce87886347ec98904b32e2c940dea3.png?imageFilter=resize&amp;w=72&amp;h=72&amp;f=webp" alt="z1i6UdXsCihRscHkB2X2o8mAZzuUtWKyhJL"></div></div></div><div class="MuiBox-root css-14884b4"><div class="author-info-title MuiBox-root css-1lqtqcs"><span class="MuiBox-root css-0">jianchao</span><span class="MuiBox-root css-mt4569">·</span><span class="MuiBox-root css-e40elj" aria-label="Apr 1, 2025 3:31 PM" data-mui-internal-clone-element="true">10 days ago</span><span class="MuiBox-root css-18fk3ag">·</span><span class="edit-box MuiBox-root css-itw0pk" title="jianchao edited this discussion 4 days ago">edited</span></div></div></div></div><div class="be-shell css-fot718"><div class="be-content MuiBox-root css-nj9o3m"><div aria-autocomplete="none" aria-readonly="true" class="be-editable notranslate css-dd3bub" contenteditable="false" role="textbox" spellcheck="true" data-lexical-editor="true" style="user-select: text; white-space: pre-wrap; word-break: break-word;"><p class="css-c86ruh"><span data-lexical-text="true">565666665656458744545.</span></p><p class="css-c86ruh"><span class="css-1io2pzh css-1j7b5mt" data-lexical-decorator="true" contenteditable="false"><div draggable="false" class="css-cssveg"><img src="/uploads/7f3db2fbcf84a4aea9e32615a1e2c773.jpeg" alt="icon4.jpeg" draggable="false" style="height: inherit; width: 560px;" class="medium-zoom-image"></div></span><br></p><p class="css-c86ruh"><br></p><p class="css-c86ruh"><span data-lexical-text="true"> =&gt; 2334848</span></p><p class="css-c86ruh"><br></p><p class="css-c86ruh"><span class="css-1io2pzh css-1j7b5mt" data-lexical-decorator="true" contenteditable="false"><div draggable="false" class="css-cssveg"><img src="/uploads/733e9faae8793c9f80ef30bccbc9aa93.png" alt="Screenshot 2025-01-11 at 14.22.34.png" draggable="false" style="height: inherit; width: 560px;" class="medium-zoom-image"></div></span><br></p><p class="css-c86ruh"><br></p></div></div><div></div></div><div class="MuiBox-root css-ou7w4z"><div class="MuiBox-root css-13wylk3"><button class="MuiButtonBase-root MuiButton-root MuiLoadingButton-root MuiButton-outlined MuiButton-outlinedPrimary MuiButton-sizeSmall MuiButton-outlinedSizeSmall MuiButton-colorPrimary MuiButton-disableElevation MuiButton-root MuiLoadingButton-root MuiButton-outlined MuiButton-outlinedPrimary MuiButton-sizeSmall MuiButton-outlinedSizeSmall MuiButton-colorPrimary MuiButton-disableElevation css-56o1ha-MuiButtonBase-root-MuiButton-root-MuiLoadingButton-root" tabindex="0" type="button" id=":r10:"><span class="MuiButton-icon MuiButton-startIcon MuiButton-iconSizeSmall css-cstir9-MuiButton-startIcon"><svg viewBox="0 0 24 24" width="1.2em" height="1.2em"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="M19.875 6.27A2.23 2.23 0 0 1 21 8.218v7.284c0 .809-.443 1.555-1.158 1.948l-6.75 4.27a2.27 2.27 0 0 1-2.184 0l-6.75-4.27A2.23 2.23 0 0 1 3 15.502V8.217c0-.809.443-1.554 1.158-1.947l6.75-3.98a2.33 2.33 0 0 1 2.25 0l6.75 3.98z"></path><path d="M10 16v-6a2 2 0 1 1 4 0v6m-4-3h4"></path></g></svg></span><span class="MuiBox-root css-11qytbg">Actions</span><span class="MuiTouchRipple-root css-8je8zh-MuiTouchRipple-root"></span></button></div></div></div><div class="MuiBox-root css-1yjvs5a"><div class="css-g30cu"><div class="MuiBox-root css-101bh7m"><div class="MuiBox-root css-0"><div class="MuiBox-root css-13wylk3"><div class="MuiBox-root css-xc4lj"><div class="MuiButtonBase-root MuiChip-root MuiChip-outlined MuiChip-sizeSmall MuiChip-colorDefault MuiChip-clickable MuiChip-clickableColorDefault MuiChip-outlinedDefault css-oytehr-MuiButtonBase-root-MuiChip-root" tabindex="0" role="button" data-mui-internal-clone-element="true"><span class="MuiChip-label MuiChip-labelSmall css-rrn746-MuiChip-label"><span class="MuiBox-root css-h300a0"><span class="MuiBox-root css-1r0nvw3">👍</span><span>1</span></span></span><span class="MuiTouchRipple-root css-8je8zh-MuiTouchRipple-root"></span></div></div><div class="MuiBox-root css-oxp7u2"><div class="MuiBox-root css-1l1ersm"><svg viewBox="0 0 24 24" width="1.2em" height="1.2em" class="github-reaction-icon MuiBox-root css-0"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="M20.985 12.528a9 9 0 1 0-8.45 8.456M16 19h6m-3-3v6M9 10h.01M15 10h.01"></path><path d="M9.5 15c.658.64 1.56 1 2.5 1s1.842-.36 2.5-1"></path></g></svg></div></div></div></div></div><div class="MuiBox-root css-1o2jhdo"><div class="MuiBox-root css-10rvbm3">6 Comments </div><div class="MuiBox-root css-byub4q"><div role="group" class="MuiToggleButtonGroup-root css-11pnphc-MuiToggleButtonGroup-root"><button class="MuiButtonBase-root MuiToggleButtonGroup-grouped MuiToggleButtonGroup-groupedHorizontal MuiToggleButton-root MuiToggleButton-sizeSmall MuiToggleButton-standard MuiToggleButtonGroup-grouped MuiToggleButtonGroup-groupedHorizontal MuiToggleButtonGroup-firstButton css-1mbdojh-MuiButtonBase-root-MuiToggleButton-root" tabindex="0" type="button" value="desc" aria-pressed="false">Newest<span class="MuiTouchRipple-root css-8je8zh-MuiTouchRipple-root"></span></button><button class="MuiButtonBase-root MuiToggleButtonGroup-grouped MuiToggleButtonGroup-groupedHorizontal MuiToggleButton-root Mui-selected MuiToggleButton-sizeSmall MuiToggleButton-standard MuiToggleButtonGroup-grouped MuiToggleButtonGroup-groupedHorizontal MuiToggleButtonGroup-lastButton css-1mbdojh-MuiButtonBase-root-MuiToggleButton-root" tabindex="0" type="button" value="asc" aria-pressed="true">Oldest<span class="MuiTouchRipple-root css-8je8zh-MuiTouchRipple-root"></span></button></div></div></div><div class="comment-list"><div class="MuiBox-root css-0"></div><div><div class="MuiBox-root css-1o6981y"><div class="MuiBox-root css-1rr4qq7" id="f204a156-2ee7-45e3-b792-8062a98107f7"><div class="MuiBox-root css-1yb9fns"><div class="MuiBox-root css-fb23bp"><div class="MuiBox-root css-1453y9r" data-mui-internal-clone-element="true"><div class="MuiBox-root css-1xx7r4x" data-id="2" style="display: inline-block; width: 32px;"><div class="image avatar-img--circle Img-root" style="background-position: center top; background-size: cover; background-repeat: no-repeat; padding-top: 100%; background-image: url(&quot;https://bbqa6ip2nrhjek566zuwtwxx27v2da2qr2tbn35hjoi.did.abtnet.io/.well-known/service/user/avatar/52ce87886347ec98904b32e2c940dea3.png?imageFilter=resize&amp;w=72&amp;h=72&amp;f=webp&quot;);"><img class="image--img" src="https://bbqa6ip2nrhjek566zuwtwxx27v2da2qr2tbn35hjoi.did.abtnet.io/.well-known/service/user/avatar/52ce87886347ec98904b32e2c940dea3.png?imageFilter=resize&amp;w=72&amp;h=72&amp;f=webp" alt="z1i6UdXsCihRscHkB2X2o8mAZzuUtWKyhJL"></div></div></div><div class="MuiBox-root css-14884b4"><div class="author-info-title MuiBox-root css-1lqtqcs"><span class="MuiBox-root css-0">jianchao</span><span class="MuiBox-root css-mt4569">·</span><a class="MuiBox-root css-rgr9ed" href="#f204a156-2ee7-45e3-b792-8062a98107f7"><span aria-label="Apr 1, 2025 8:10 PM" class="" data-mui-internal-clone-element="true">10 days ago</span></a></div></div></div><div class="MuiBox-root css-1baulvz" style="position: absolute; right: 0px; top: 0px;"><button class="MuiButtonBase-root MuiIconButton-root MuiIconButton-sizeMedium menu-icon css-17qxs5e-MuiButtonBase-root-MuiIconButton-root" tabindex="0" type="button"><svg class="MuiSvgIcon-root MuiSvgIcon-fontSizeMedium css-hwaqf3-MuiSvgIcon-root" focusable="false" aria-hidden="true" viewBox="0 0 24 24" data-testid="MoreVertIcon"><path d="M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2m0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2m0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2"></path></svg><span class="MuiTouchRipple-root css-8je8zh-MuiTouchRipple-root"></span></button></div></div><div class="MuiBox-root css-eznhef"><div class="MuiBox-root css-0"><div class="be-shell css-fot718"><div class="be-content MuiBox-root css-nj9o3m"><div aria-autocomplete="none" aria-readonly="true" class="be-editable notranslate css-dd3bub" contenteditable="false" role="textbox" spellcheck="true" data-lexical-editor="true" style="user-select: text; white-space: pre-wrap; word-break: break-word;"><p class="css-c86ruh"><span data-lexical-text="true">++6+6+ +58565 598989 9889 999</span></p><p class="css-c86ruh"><br></p><p class="css-c86ruh"><span data-lexical-text="true">2333</span></p></div></div><div></div></div></div><div class="MuiBox-root css-164r41r"><div class="MuiBox-root css-1480d6u"><div class="MuiBox-root css-13wylk3"><div class="MuiBox-root css-xc4lj"><div class="MuiButtonBase-root MuiChip-root MuiChip-outlined MuiChip-sizeSmall MuiChip-colorDefault MuiChip-clickable MuiChip-clickableColorDefault MuiChip-outlinedDefault css-oytehr-MuiButtonBase-root-MuiChip-root" tabindex="0" role="button" data-mui-internal-clone-element="true"><span class="MuiChip-label MuiChip-labelSmall css-rrn746-MuiChip-label"><span class="MuiBox-root css-h300a0"><span class="MuiBox-root css-1r0nvw3">👍</span><span>1</span></span></span><span class="MuiTouchRipple-root css-8je8zh-MuiTouchRipple-root"></span></div></div><div class="MuiBox-root css-oxp7u2"><div class="MuiBox-root css-1l1ersm"><svg viewBox="0 0 24 24" width="1.2em" height="1.2em" class="github-reaction-icon MuiBox-root css-0"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="M20.985 12.528a9 9 0 1 0-8.45 8.456M16 19h6m-3-3v6M9 10h.01M15 10h.01"></path><path d="M9.5 15c.658.64 1.56 1 2.5 1s1.842-.36 2.5-1"></path></g></svg></div><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="github-reaction-icon iconify iconify--feather" width="1em" height="1em" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M21 11.5a8.4 8.4 0 0 1-.9 3.8a8.5 8.5 0 0 1-7.6 4.7a8.4 8.4 0 0 1-3.8-.9L3 21l1.9-5.7a8.4 8.4 0 0 1-.9-3.8a8.5 8.5 0 0 1 4.7-7.6a8.4 8.4 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8z"></path></svg></div></div><div class="MuiBox-root css-brejh2"><div class="MuiBox-root css-10swhe1"><button class="MuiButtonBase-root MuiButton-root MuiLoadingButton-root MuiButton-outlined MuiButton-outlinedPrimary MuiButton-sizeSmall MuiButton-outlinedSizeSmall MuiButton-colorPrimary MuiButton-disableElevation MuiButton-root MuiLoadingButton-root MuiButton-outlined MuiButton-outlinedPrimary MuiButton-sizeSmall MuiButton-outlinedSizeSmall MuiButton-colorPrimary MuiButton-disableElevation css-56o1ha-MuiButtonBase-root-MuiButton-root-MuiLoadingButton-root" tabindex="0" type="button" id=":r1s:"><span class="MuiButton-icon MuiButton-startIcon MuiButton-iconSizeSmall css-cstir9-MuiButton-startIcon"><svg viewBox="0 0 24 24" width="1.2em" height="1.2em"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="M19.875 6.27A2.23 2.23 0 0 1 21 8.218v7.284c0 .809-.443 1.555-1.158 1.948l-6.75 4.27a2.27 2.27 0 0 1-2.184 0l-6.75-4.27A2.23 2.23 0 0 1 3 15.502V8.217c0-.809.443-1.554 1.158-1.947l6.75-3.98a2.33 2.33 0 0 1 2.25 0l6.75 3.98z"></path><path d="M10 16v-6a2 2 0 1 1 4 0v6m-4-3h4"></path></g></svg></span><span class="MuiBox-root css-11qytbg">Actions</span><span class="MuiTouchRipple-root css-8je8zh-MuiTouchRipple-root"></span></button></div></div></div><hr class="MuiDivider-root MuiDivider-fullWidth css-121irhy-MuiDivider-root"></div></div></div></div></div><div><div class="MuiBox-root css-1o6981y"><div class="MuiBox-root css-1rr4qq7" id="bad66c21-9e70-4649-8ebf-dd4144dd08c0"><div class="MuiBox-root css-1yb9fns"><div class="MuiBox-root css-fb23bp"><div class="MuiBox-root css-1453y9r" data-mui-internal-clone-element="true"><div class="MuiBox-root css-1xx7r4x" data-id="2" style="display: inline-block; width: 32px;"><div class="image avatar-img--circle Img-root" style="background-position: center top; background-size: cover; background-repeat: no-repeat; padding-top: 100%; background-image: url(&quot;https://bbqa6ip2nrhjek566zuwtwxx27v2da2qr2tbn35hjoi.did.abtnet.io/.well-known/service/user/avatar/52ce87886347ec98904b32e2c940dea3.png?imageFilter=resize&amp;w=72&amp;h=72&amp;f=webp&quot;);"><img class="image--img" src="https://bbqa6ip2nrhjek566zuwtwxx27v2da2qr2tbn35hjoi.did.abtnet.io/.well-known/service/user/avatar/52ce87886347ec98904b32e2c940dea3.png?imageFilter=resize&amp;w=72&amp;h=72&amp;f=webp" alt="z1i6UdXsCihRscHkB2X2o8mAZzuUtWKyhJL"></div></div></div><div class="MuiBox-root css-14884b4"><div class="author-info-title MuiBox-root css-1lqtqcs"><span class="MuiBox-root css-0">jianchao</span><span class="MuiBox-root css-mt4569">·</span><a class="MuiBox-root css-rgr9ed" href="#bad66c21-9e70-4649-8ebf-dd4144dd08c0"><span aria-label="Apr 7, 2025 10:40 AM" class="" data-mui-internal-clone-element="true">4 days ago</span></a></div></div></div><div class="MuiBox-root css-1baulvz" style="position: absolute; right: 0px; top: 0px;"><button class="MuiButtonBase-root MuiIconButton-root MuiIconButton-sizeMedium menu-icon css-17qxs5e-MuiButtonBase-root-MuiIconButton-root" tabindex="0" type="button"><svg class="MuiSvgIcon-root MuiSvgIcon-fontSizeMedium css-hwaqf3-MuiSvgIcon-root" focusable="false" aria-hidden="true" viewBox="0 0 24 24" data-testid="MoreVertIcon"><path d="M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2m0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2m0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2"></path></svg><span class="MuiTouchRipple-root css-8je8zh-MuiTouchRipple-root"></span></button></div></div><div class="MuiBox-root css-eznhef"><div class="MuiBox-root css-13ol41c">This comment has been deleted</div><div class="MuiBox-root css-164r41r"><div class="MuiBox-root css-1480d6u"><div class="MuiBox-root css-13wylk3"><div class="MuiBox-root css-oxp7u2"><div class="MuiBox-root css-1l1ersm"><svg viewBox="0 0 24 24" width="1.2em" height="1.2em" class="github-reaction-icon MuiBox-root css-0"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="M20.985 12.528a9 9 0 1 0-8.45 8.456M16 19h6m-3-3v6M9 10h.01M15 10h.01"></path><path d="M9.5 15c.658.64 1.56 1 2.5 1s1.842-.36 2.5-1"></path></g></svg></div><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="github-reaction-icon iconify iconify--feather" width="1em" height="1em" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M21 11.5a8.4 8.4 0 0 1-.9 3.8a8.5 8.5 0 0 1-7.6 4.7a8.4 8.4 0 0 1-3.8-.9L3 21l1.9-5.7a8.4 8.4 0 0 1-.9-3.8a8.5 8.5 0 0 1 4.7-7.6a8.4 8.4 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8z"></path></svg></div></div><div class="MuiBox-root css-brejh2"><div class="MuiBox-root css-10swhe1"><button class="MuiButtonBase-root MuiButton-root MuiLoadingButton-root MuiButton-outlined MuiButton-outlinedPrimary MuiButton-sizeSmall MuiButton-outlinedSizeSmall MuiButton-colorPrimary MuiButton-disableElevation MuiButton-root MuiLoadingButton-root MuiButton-outlined MuiButton-outlinedPrimary MuiButton-sizeSmall MuiButton-outlinedSizeSmall MuiButton-colorPrimary MuiButton-disableElevation css-56o1ha-MuiButtonBase-root-MuiButton-root-MuiLoadingButton-root" tabindex="0" type="button" id=":r20:"><span class="MuiButton-icon MuiButton-startIcon MuiButton-iconSizeSmall css-cstir9-MuiButton-startIcon"><svg viewBox="0 0 24 24" width="1.2em" height="1.2em"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="M19.875 6.27A2.23 2.23 0 0 1 21 8.218v7.284c0 .809-.443 1.555-1.158 1.948l-6.75 4.27a2.27 2.27 0 0 1-2.184 0l-6.75-4.27A2.23 2.23 0 0 1 3 15.502V8.217c0-.809.443-1.554 1.158-1.947l6.75-3.98a2.33 2.33 0 0 1 2.25 0l6.75 3.98z"></path><path d="M10 16v-6a2 2 0 1 1 4 0v6m-4-3h4"></path></g></svg></span><span class="MuiBox-root css-11qytbg">Actions</span><span class="MuiTouchRipple-root css-8je8zh-MuiTouchRipple-root"></span></button></div></div></div><hr class="MuiDivider-root MuiDivider-fullWidth css-121irhy-MuiDivider-root"></div></div></div></div></div><div><div class="MuiBox-root css-1o6981y"><div class="MuiBox-root css-1rr4qq7" id="1263fa5c-6933-4cd8-8985-3cc69f5bfd73"><div class="MuiBox-root css-1yb9fns"><div class="MuiBox-root css-fb23bp"><div class="MuiBox-root css-1453y9r" data-mui-internal-clone-element="true"><div class="MuiBox-root css-1xx7r4x" data-id="2" style="display: inline-block; width: 32px;"><div class="image avatar-img--circle Img-root" style="background-position: center top; background-size: cover; background-repeat: no-repeat; padding-top: 100%; background-image: url(&quot;https://bbqa6ip2nrhjek566zuwtwxx27v2da2qr2tbn35hjoi.did.abtnet.io/.well-known/service/user/avatar/52ce87886347ec98904b32e2c940dea3.png?imageFilter=resize&amp;w=72&amp;h=72&amp;f=webp&quot;);"><img class="image--img" src="https://bbqa6ip2nrhjek566zuwtwxx27v2da2qr2tbn35hjoi.did.abtnet.io/.well-known/service/user/avatar/52ce87886347ec98904b32e2c940dea3.png?imageFilter=resize&amp;w=72&amp;h=72&amp;f=webp" alt="z1i6UdXsCihRscHkB2X2o8mAZzuUtWKyhJL"></div></div></div><div class="MuiBox-root css-14884b4"><div class="author-info-title MuiBox-root css-1lqtqcs"><span class="MuiBox-root css-0">jianchao</span><span class="MuiBox-root css-mt4569">·</span><a class="MuiBox-root css-rgr9ed" href="#1263fa5c-6933-4cd8-8985-3cc69f5bfd73"><span aria-label="Apr 11, 2025 4:18 PM" class="" data-mui-internal-clone-element="true">5 hours ago</span></a></div></div></div><div class="MuiBox-root css-1baulvz" style="position: absolute; right: 0px; top: 0px;"><button class="MuiButtonBase-root MuiIconButton-root MuiIconButton-sizeMedium menu-icon css-17qxs5e-MuiButtonBase-root-MuiIconButton-root" tabindex="0" type="button"><svg class="MuiSvgIcon-root MuiSvgIcon-fontSizeMedium css-hwaqf3-MuiSvgIcon-root" focusable="false" aria-hidden="true" viewBox="0 0 24 24" data-testid="MoreVertIcon"><path d="M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2m0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2m0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2"></path></svg><span class="MuiTouchRipple-root css-8je8zh-MuiTouchRipple-root"></span></button></div></div><div class="MuiBox-root css-eznhef"><div class="MuiBox-root css-0"><div class="be-shell css-fot718"><div class="be-content MuiBox-root css-nj9o3m"><div aria-autocomplete="none" aria-readonly="true" class="be-editable notranslate css-dd3bub" contenteditable="false" role="textbox" spellcheck="true" data-lexical-editor="true" style="user-select: text; white-space: pre-wrap; word-break: break-word;"><p class="css-c86ruh"><span class="css-1io2pzh css-1j7b5mt" data-lexical-decorator="true" contenteditable="false"><span class="MuiSkeleton-root MuiSkeleton-rectangular MuiSkeleton-wave css-1g6vkzr-MuiSkeleton-root"></span></span><br></p></div></div><div></div></div></div><div class="MuiBox-root css-164r41r"><div class="MuiBox-root css-1480d6u"><div class="MuiBox-root css-13wylk3"><div class="MuiBox-root css-oxp7u2"><div class="MuiBox-root css-1l1ersm"><svg viewBox="0 0 24 24" width="1.2em" height="1.2em" class="github-reaction-icon MuiBox-root css-0"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="M20.985 12.528a9 9 0 1 0-8.45 8.456M16 19h6m-3-3v6M9 10h.01M15 10h.01"></path><path d="M9.5 15c.658.64 1.56 1 2.5 1s1.842-.36 2.5-1"></path></g></svg></div><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="github-reaction-icon iconify iconify--feather" width="1em" height="1em" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M21 11.5a8.4 8.4 0 0 1-.9 3.8a8.5 8.5 0 0 1-7.6 4.7a8.4 8.4 0 0 1-3.8-.9L3 21l1.9-5.7a8.4 8.4 0 0 1-.9-3.8a8.5 8.5 0 0 1 4.7-7.6a8.4 8.4 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8z"></path></svg></div></div><div class="MuiBox-root css-brejh2"><div class="MuiBox-root css-10swhe1"><button class="MuiButtonBase-root MuiButton-root MuiLoadingButton-root MuiButton-outlined MuiButton-outlinedPrimary MuiButton-sizeSmall MuiButton-outlinedSizeSmall MuiButton-colorPrimary MuiButton-disableElevation MuiButton-root MuiLoadingButton-root MuiButton-outlined MuiButton-outlinedPrimary MuiButton-sizeSmall MuiButton-outlinedSizeSmall MuiButton-colorPrimary MuiButton-disableElevation css-56o1ha-MuiButtonBase-root-MuiButton-root-MuiLoadingButton-root" tabindex="0" type="button" id=":r24:"><span class="MuiButton-icon MuiButton-startIcon MuiButton-iconSizeSmall css-cstir9-MuiButton-startIcon"><svg viewBox="0 0 24 24" width="1.2em" height="1.2em"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="M19.875 6.27A2.23 2.23 0 0 1 21 8.218v7.284c0 .809-.443 1.555-1.158 1.948l-6.75 4.27a2.27 2.27 0 0 1-2.184 0l-6.75-4.27A2.23 2.23 0 0 1 3 15.502V8.217c0-.809.443-1.554 1.158-1.947l6.75-3.98a2.33 2.33 0 0 1 2.25 0l6.75 3.98z"></path><path d="M10 16v-6a2 2 0 1 1 4 0v6m-4-3h4"></path></g></svg></span><span class="MuiBox-root css-11qytbg">Actions</span><span class="MuiTouchRipple-root css-8je8zh-MuiTouchRipple-root"></span></button></div></div></div><hr class="MuiDivider-root MuiDivider-fullWidth css-121irhy-MuiDivider-root"></div></div></div></div></div><div><div class="MuiBox-root css-1o6981y"><div class="MuiBox-root css-1rr4qq7" id="7413bbfa-7d9a-4164-ba3e-787cc281906a"><div class="MuiBox-root css-1yb9fns"><div class="MuiBox-root css-fb23bp"><div class="MuiBox-root css-1453y9r" data-mui-internal-clone-element="true"><div class="MuiBox-root css-1xx7r4x" data-id="2" style="display: inline-block; width: 32px;"><div class="image avatar-img--circle Img-root" style="background-position: center top; background-size: cover; background-repeat: no-repeat; padding-top: 100%; background-image: url(&quot;https://bbqa6ip2nrhjek566zuwtwxx27v2da2qr2tbn35hjoi.did.abtnet.io/.well-known/service/user/avatar/52ce87886347ec98904b32e2c940dea3.png?imageFilter=resize&amp;w=72&amp;h=72&amp;f=webp&quot;);"><img class="image--img" src="https://bbqa6ip2nrhjek566zuwtwxx27v2da2qr2tbn35hjoi.did.abtnet.io/.well-known/service/user/avatar/52ce87886347ec98904b32e2c940dea3.png?imageFilter=resize&amp;w=72&amp;h=72&amp;f=webp" alt="z1i6UdXsCihRscHkB2X2o8mAZzuUtWKyhJL"></div></div></div><div class="MuiBox-root css-14884b4"><div class="author-info-title MuiBox-root css-1lqtqcs"><span class="MuiBox-root css-0">jianchao</span><span class="MuiBox-root css-mt4569">·</span><a class="MuiBox-root css-rgr9ed" href="#7413bbfa-7d9a-4164-ba3e-787cc281906a"><span aria-label="Apr 11, 2025 4:42 PM" class="" data-mui-internal-clone-element="true">5 hours ago</span></a></div></div></div><div class="MuiBox-root css-1baulvz" style="position: absolute; right: 0px; top: 0px;"><button class="MuiButtonBase-root MuiIconButton-root MuiIconButton-sizeMedium menu-icon css-17qxs5e-MuiButtonBase-root-MuiIconButton-root" tabindex="0" type="button"><svg class="MuiSvgIcon-root MuiSvgIcon-fontSizeMedium css-hwaqf3-MuiSvgIcon-root" focusable="false" aria-hidden="true" viewBox="0 0 24 24" data-testid="MoreVertIcon"><path d="M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2m0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2m0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2"></path></svg><span class="MuiTouchRipple-root css-8je8zh-MuiTouchRipple-root"></span></button></div></div><div class="MuiBox-root css-eznhef"><div class="MuiBox-root css-0"><div class="be-shell css-fot718"><div class="be-content MuiBox-root css-nj9o3m"><div aria-autocomplete="none" aria-readonly="true" class="be-editable notranslate css-dd3bub" contenteditable="false" role="textbox" spellcheck="true" data-lexical-editor="true" style="user-select: text; white-space: pre-wrap; word-break: break-word;"><p class="css-c86ruh"><span class="css-1io2pzh css-1j7b5mt" data-lexical-decorator="true" contenteditable="false"><div draggable="false" class="css-cssveg"><img src="/uploads/1a7055d91671005503789d42df263ae4.png" alt="image.png" draggable="false" style="height: inherit; width: 560px;" class="medium-zoom-image"></div></span><br></p><p class="css-c86ruh"><br></p></div></div><div></div></div></div><div class="MuiBox-root css-164r41r"><div class="MuiBox-root css-1480d6u"><div class="MuiBox-root css-13wylk3"><div class="MuiBox-root css-oxp7u2"><div class="MuiBox-root css-1l1ersm"><svg viewBox="0 0 24 24" width="1.2em" height="1.2em" class="github-reaction-icon MuiBox-root css-0"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="M20.985 12.528a9 9 0 1 0-8.45 8.456M16 19h6m-3-3v6M9 10h.01M15 10h.01"></path><path d="M9.5 15c.658.64 1.56 1 2.5 1s1.842-.36 2.5-1"></path></g></svg></div><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="github-reaction-icon iconify iconify--feather" width="1em" height="1em" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M21 11.5a8.4 8.4 0 0 1-.9 3.8a8.5 8.5 0 0 1-7.6 4.7a8.4 8.4 0 0 1-3.8-.9L3 21l1.9-5.7a8.4 8.4 0 0 1-.9-3.8a8.5 8.5 0 0 1 4.7-7.6a8.4 8.4 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8z"></path></svg></div></div><div class="MuiBox-root css-brejh2"><div class="MuiBox-root css-10swhe1"><button class="MuiButtonBase-root MuiButton-root MuiLoadingButton-root MuiButton-outlined MuiButton-outlinedPrimary MuiButton-sizeSmall MuiButton-outlinedSizeSmall MuiButton-colorPrimary MuiButton-disableElevation MuiButton-root MuiLoadingButton-root MuiButton-outlined MuiButton-outlinedPrimary MuiButton-sizeSmall MuiButton-outlinedSizeSmall MuiButton-colorPrimary MuiButton-disableElevation css-56o1ha-MuiButtonBase-root-MuiButton-root-MuiLoadingButton-root" tabindex="0" type="button" id=":r28:"><span class="MuiButton-icon MuiButton-startIcon MuiButton-iconSizeSmall css-cstir9-MuiButton-startIcon"><svg viewBox="0 0 24 24" width="1.2em" height="1.2em"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="M19.875 6.27A2.23 2.23 0 0 1 21 8.218v7.284c0 .809-.443 1.555-1.158 1.948l-6.75 4.27a2.27 2.27 0 0 1-2.184 0l-6.75-4.27A2.23 2.23 0 0 1 3 15.502V8.217c0-.809.443-1.554 1.158-1.947l6.75-3.98a2.33 2.33 0 0 1 2.25 0l6.75 3.98z"></path><path d="M10 16v-6a2 2 0 1 1 4 0v6m-4-3h4"></path></g></svg></span><span class="MuiBox-root css-11qytbg">Actions</span><span class="MuiTouchRipple-root css-8je8zh-MuiTouchRipple-root"></span></button></div></div></div><hr class="MuiDivider-root MuiDivider-fullWidth css-121irhy-MuiDivider-root"></div></div></div></div></div><div><div class="MuiBox-root css-1o6981y"><div class="MuiBox-root css-1rr4qq7" id="636c3b04-e909-4e6b-935d-9c455637b202"><div class="MuiBox-root css-1yb9fns"><div class="MuiBox-root css-fb23bp"><div class="MuiBox-root css-1453y9r" data-mui-internal-clone-element="true"><div class="MuiBox-root css-1xx7r4x" data-id="2" style="display: inline-block; width: 32px;"><div class="image avatar-img--circle Img-root" style="background-position: center top; background-size: cover; background-repeat: no-repeat; padding-top: 100%; background-image: url(&quot;https://bbqa6ip2nrhjek566zuwtwxx27v2da2qr2tbn35hjoi.did.abtnet.io/.well-known/service/user/avatar/52ce87886347ec98904b32e2c940dea3.png?imageFilter=resize&amp;w=72&amp;h=72&amp;f=webp&quot;);"><img class="image--img" src="https://bbqa6ip2nrhjek566zuwtwxx27v2da2qr2tbn35hjoi.did.abtnet.io/.well-known/service/user/avatar/52ce87886347ec98904b32e2c940dea3.png?imageFilter=resize&amp;w=72&amp;h=72&amp;f=webp" alt="z1i6UdXsCihRscHkB2X2o8mAZzuUtWKyhJL"></div></div></div><div class="MuiBox-root css-14884b4"><div class="author-info-title MuiBox-root css-1lqtqcs"><span class="MuiBox-root css-0">jianchao</span><span class="MuiBox-root css-mt4569">·</span><a class="MuiBox-root css-rgr9ed" href="#636c3b04-e909-4e6b-935d-9c455637b202"><span aria-label="Apr 11, 2025 6:53 PM" class="" data-mui-internal-clone-element="true">2 hours ago</span></a></div></div></div><div class="MuiBox-root css-1baulvz" style="position: absolute; right: 0px; top: 0px;"><button class="MuiButtonBase-root MuiIconButton-root MuiIconButton-sizeMedium menu-icon css-17qxs5e-MuiButtonBase-root-MuiIconButton-root" tabindex="0" type="button"><svg class="MuiSvgIcon-root MuiSvgIcon-fontSizeMedium css-hwaqf3-MuiSvgIcon-root" focusable="false" aria-hidden="true" viewBox="0 0 24 24" data-testid="MoreVertIcon"><path d="M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2m0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2m0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2"></path></svg><span class="MuiTouchRipple-root css-8je8zh-MuiTouchRipple-root"></span></button></div></div><div class="MuiBox-root css-eznhef"><div class="MuiBox-root css-0"><div class="be-shell css-fot718"><div class="be-content MuiBox-root css-nj9o3m"><div aria-autocomplete="none" aria-readonly="true" class="be-editable notranslate css-dd3bub" contenteditable="false" role="textbox" spellcheck="true" data-lexical-editor="true" style="user-select: text; white-space: pre-wrap; word-break: break-word;"><p class="css-c86ruh"><p class="css-c86ruh"><p class="css-c86ruh"><span class="css-1io2pzh css-1j7b5mt" data-lexical-decorator="true" contenteditable="false"><div draggable="false" class="css-cssveg"><img src="/uploads/a20d91573ff00ea7454743521ea72e9f.png" alt="image.png" draggable="false" style="height: inherit; width: 560px;" class="medium-zoom-image"></div></span><br></p><p class="css-c86ruh"><span data-lexical-text="true">23</span></p><p class="css-c86ruh"><span class="css-1io2pzh css-1j7b5mt" data-lexical-decorator="true" contenteditable="false"><div draggable="false" class="css-cssveg"><img src="/uploads/a20d91573ff00ea7454743521ea72e9f.png" alt="image.png" draggable="false" style="height: inherit; width: 560px;" class="medium-zoom-image"></div></span><br></p><p class="css-c86ruh"><span class="css-1io2pzh css-1j7b5mt" data-lexical-decorator="true" contenteditable="false"><div draggable="false" class="css-cssveg"><img src="/uploads/a20d91573ff00ea7454743521ea72e9f.png" alt="image.png" draggable="false" style="height: inherit; width: 560px;" class="medium-zoom-image"></div></span><br></p><p class="css-c86ruh"><span data-lexical-text="true">231</span></p></p></p></div></div><div></div></div></div><div class="MuiBox-root css-164r41r"><div class="MuiBox-root css-1480d6u"><div class="MuiBox-root css-13wylk3"><div class="MuiBox-root css-oxp7u2"><div class="MuiBox-root css-1l1ersm"><svg viewBox="0 0 24 24" width="1.2em" height="1.2em" class="github-reaction-icon MuiBox-root css-0"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="M20.985 12.528a9 9 0 1 0-8.45 8.456M16 19h6m-3-3v6M9 10h.01M15 10h.01"></path><path d="M9.5 15c.658.64 1.56 1 2.5 1s1.842-.36 2.5-1"></path></g></svg></div><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="github-reaction-icon iconify iconify--feather" width="1em" height="1em" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M21 11.5a8.4 8.4 0 0 1-.9 3.8a8.5 8.5 0 0 1-7.6 4.7a8.4 8.4 0 0 1-3.8-.9L3 21l1.9-5.7a8.4 8.4 0 0 1-.9-3.8a8.5 8.5 0 0 1 4.7-7.6a8.4 8.4 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8z"></path></svg></div></div><div class="MuiBox-root css-brejh2"><div class="MuiBox-root css-10swhe1"><button class="MuiButtonBase-root MuiButton-root MuiLoadingButton-root MuiButton-outlined MuiButton-outlinedPrimary MuiButton-sizeSmall MuiButton-outlinedSizeSmall MuiButton-colorPrimary MuiButton-disableElevation MuiButton-root MuiLoadingButton-root MuiButton-outlined MuiButton-outlinedPrimary MuiButton-sizeSmall MuiButton-outlinedSizeSmall MuiButton-colorPrimary MuiButton-disableElevation css-56o1ha-MuiButtonBase-root-MuiButton-root-MuiLoadingButton-root" tabindex="0" type="button" id=":r2c:"><span class="MuiButton-icon MuiButton-startIcon MuiButton-iconSizeSmall css-cstir9-MuiButton-startIcon"><svg viewBox="0 0 24 24" width="1.2em" height="1.2em"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="M19.875 6.27A2.23 2.23 0 0 1 21 8.218v7.284c0 .809-.443 1.555-1.158 1.948l-6.75 4.27a2.27 2.27 0 0 1-2.184 0l-6.75-4.27A2.23 2.23 0 0 1 3 15.502V8.217c0-.809.443-1.554 1.158-1.947l6.75-3.98a2.33 2.33 0 0 1 2.25 0l6.75 3.98z"></path><path d="M10 16v-6a2 2 0 1 1 4 0v6m-4-3h4"></path></g></svg></span><span class="MuiBox-root css-11qytbg">Actions</span><span class="MuiTouchRipple-root css-8je8zh-MuiTouchRipple-root"></span></button></div></div></div><hr class="MuiDivider-root MuiDivider-fullWidth css-121irhy-MuiDivider-root"></div></div></div></div></div><div><div class="MuiBox-root css-1o6981y"><div class="MuiBox-root css-1rr4qq7" id="534cdf12-8a25-49e8-ac7d-2fe1ba89310d"><div class="MuiBox-root css-1yb9fns"><div class="MuiBox-root css-fb23bp"><div class="MuiBox-root css-1453y9r" data-mui-internal-clone-element="true"><div class="MuiBox-root css-1xx7r4x" data-id="2" style="display: inline-block; width: 32px;"><div class="image avatar-img--circle Img-root" style="background-position: center top; background-size: cover; background-repeat: no-repeat; padding-top: 100%; background-image: url(&quot;https://bbqa6ip2nrhjek566zuwtwxx27v2da2qr2tbn35hjoi.did.abtnet.io/.well-known/service/user/avatar/52ce87886347ec98904b32e2c940dea3.png?imageFilter=resize&amp;w=72&amp;h=72&amp;f=webp&quot;);"><img class="image--img" src="https://bbqa6ip2nrhjek566zuwtwxx27v2da2qr2tbn35hjoi.did.abtnet.io/.well-known/service/user/avatar/52ce87886347ec98904b32e2c940dea3.png?imageFilter=resize&amp;w=72&amp;h=72&amp;f=webp" alt="z1i6UdXsCihRscHkB2X2o8mAZzuUtWKyhJL"></div></div></div><div class="MuiBox-root css-14884b4"><div class="author-info-title MuiBox-root css-1lqtqcs"><span class="MuiBox-root css-0">jianchao</span><span class="MuiBox-root css-mt4569">·</span><a class="MuiBox-root css-rgr9ed" href="#534cdf12-8a25-49e8-ac7d-2fe1ba89310d"><span aria-label="Apr 11, 2025 9:15 PM" class="" data-mui-internal-clone-element="true">4 minutes ago</span></a></div></div></div><div class="MuiBox-root css-1baulvz" style="position: absolute; right: 0px; top: 0px;"><button class="MuiButtonBase-root MuiIconButton-root MuiIconButton-sizeMedium menu-icon css-17qxs5e-MuiButtonBase-root-MuiIconButton-root" tabindex="0" type="button"><svg class="MuiSvgIcon-root MuiSvgIcon-fontSizeMedium css-hwaqf3-MuiSvgIcon-root" focusable="false" aria-hidden="true" viewBox="0 0 24 24" data-testid="MoreVertIcon"><path d="M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2m0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2m0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2"></path></svg><span class="MuiTouchRipple-root css-8je8zh-MuiTouchRipple-root"></span></button></div></div><div class="MuiBox-root css-eznhef"><div class="MuiBox-root css-0"><div class="MuiBox-root css-fwl5id"><div class="MuiBox-root css-ibav4s"><div class="be-shell css-e5xp0t"><div class="toolbar css-12x7gcj"><button class="toolbar-item spaced css-mkrjxu" title="Component Picker" aria-label="Open component picker"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" width="1em" height="1em" viewBox="0 0 24 24" data-icon="tabler:circle-plus" class="iconify iconify--tabler"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 12a9 9 0 1 0 18 0a9 9 0 0 0-18 0m6 0h6m-3-3v6"></path></svg></button><button aria-label="Formatting options for text style" class="toolbar-item css-14mnd0x"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" width="1em" height="1em" viewBox="0 0 24 24" data-icon="tabler:align-justified" class="icon iconify iconify--tabler"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h12"></path></svg><span class="text dropdown-button-text">Normal</span></button><button aria-label="Formatting options for text alignment" class="toolbar-item spaced alignment css-14mnd0x"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" width="1em" height="1em" viewBox="0 0 24 24" data-icon="tabler:align-left" class="icon iconify iconify--tabler"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h10M4 18h14"></path></svg></button><button class="toolbar-item spaced css-mkrjxu" title="Bold (⌘B)" aria-label="Format text as bold. Shortcut: ⌘B"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" width="1em" height="1em" viewBox="0 0 24 24" data-icon="tabler:bold" class="iconify iconify--tabler"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 5h6a3.5 3.5 0 0 1 0 7H7zm6 7h1a3.5 3.5 0 0 1 0 7H7v-7"></path></svg></button><button class="toolbar-item spaced css-mkrjxu" title="Italic (⌘I)" aria-label="Format text as italics. Shortcut: ⌘I"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" width="1em" height="1em" viewBox="0 0 24 24" data-icon="tabler:italic" class="iconify iconify--tabler"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M11 5h6M7 19h6m1-14l-4 14"></path></svg></button><button class="toolbar-item spaced css-mkrjxu" title="Underline (⌘U)" aria-label="Format text to underlined. Shortcut: ⌘U"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" width="1em" height="1em" viewBox="0 0 24 24" data-icon="tabler:underline" class="iconify iconify--tabler"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 5v5a5 5 0 0 0 10 0V5M5 19h14"></path></svg></button><button class="toolbar-item spaced css-mkrjxu" title="Upload Image" aria-label="Upload Image"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" width="1em" height="1em" viewBox="0 0 24 24" data-icon="tabler:photo" class="iconify iconify--tabler"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="M15 8h.01M3 6a3 3 0 0 1 3-3h12a3 3 0 0 1 3 3v12a3 3 0 0 1-3 3H6a3 3 0 0 1-3-3z"></path><path d="m3 16l5-5c.928-.893 2.072-.893 3 0l5 5"></path><path d="m14 14l1-1c.928-.893 2.072-.893 3 0l3 3"></path></g></svg></button><button class="toolbar-item code css-mkrjxu" title="Insert code block" aria-label="Insert code block"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" width="1em" height="1em" viewBox="0 0 24 24" data-icon="tabler:code" class="iconify iconify--tabler"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m7 8l-4 4l4 4m10-8l4 4l-4 4M14 4l-4 16"></path></svg></button><button class="toolbar-item spaced link css-mkrjxu" aria-label="Insert link" title="Insert link"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" width="1em" height="1em" viewBox="0 0 24 24" data-icon="tabler:link" class="iconify iconify--tabler"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m9 15l6-6m-4-3l.463-.536a5 5 0 0 1 7.071 7.072L18 13m-5 5l-.397.534a5.07 5.07 0 0 1-7.127 0a4.97 4.97 0 0 1 0-7.071L6 11"></path></svg></button><button aria-label="Formatting text color" class="toolbar-item color-picker css-14mnd0x"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" width="1em" height="1em" viewBox="0 0 24 24" data-icon="tabler:text-color" class="icon iconify iconify--tabler"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 15V8a3 3 0 0 1 6 0v7m-6-4h6M5 19h14"></path></svg></button><button aria-label="Formatting background color" class="toolbar-item color-picker css-14mnd0x"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" width="1em" height="1em" viewBox="0 0 24 24" data-icon="tabler:bucket-droplet" class="icon iconify iconify--tabler"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="m5 16l1.465 1.638a2 2 0 1 1-3.015.099zm8.737-6.263c2.299-2.3 3.23-5.095 2.081-6.245s-3.945-.217-6.244 2.082s-3.231 5.095-2.082 6.244s3.946.218 6.245-2.081"></path><path d="M7.492 11.818c.362.362.768.676 1.208.934l6.895 4.047c1.078.557 2.255-.075 3.692-1.512s2.07-2.614 1.512-3.692q-.557-1.077-4.047-6.895a6 6 0 0 0-.934-1.208"></path></g></svg></button><button aria-label="Formatting options for additional text styles" class="toolbar-item spaced text-format-additional css-14mnd0x"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" width="1em" height="1em" viewBox="0 0 24 24" data-icon="tabler:letter-case" class="icon iconify iconify--tabler"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M14 15.5a3.5 3.5 0 1 0 7 0a3.5 3.5 0 1 0-7 0M3 19V8.5a3.5 3.5 0 0 1 7 0V19m-7-6h7m11-1v7"></path></svg></button></div><style>.mention[data-did="z1i6UdXsCihRscHkB2X2o8mAZzuUtWKyhJL"] {
15
+ color: #222!important;
16
+ background-color: #fff9cc!important;
17
+ }</style><div class="be-content editable MuiBox-root css-nj9o3m"><div class="be-editable notranslate css-dd3bub" contenteditable="true" role="textbox" spellcheck="false" data-lexical-editor="true" style="user-select: text; white-space: pre-wrap; word-break: break-word;"><p class="css-c86ruh css-xd87ek" dir="ltr"><span data-lexical-text="true">If you want to install</span></p><p class="css-c86ruh css-xd87ek" dir="ltr"><span data-lexical-text="true">If you want to installIf you want to install</span></p><ul class="css-1hrz7uh"><li value="1" class="css-10gqgts css-xd87ek" dir="ltr"><span data-lexical-text="true">If you want to install</span></li></ul><h1 class="css-1enq2o0 lexical-node-placeholder css-xd87ek" data-placeholder="Heading 1" dir="ltr"><span data-lexical-text="true">我是件的</span></h1><p class="css-c86ruh"><p class="css-c86ruh css-xd87ek" dir="ltr"><span data-lexical-text="true">关联 Issue</span><br><span data-lexical-text="true">fixes: </span><a href="https://team.arcblock.io/comment/discussions/a51d0ae6-22d9-48b6-93e8-72628e08ff24/#b1fecab0-9a1b-447a-bf8c-bf2c91ac778f" class="css-1ace5sm css-xd87ek" dir="ltr"><span data-lexical-text="true">https://team.arcblock.io/comment/discussions/a51d0ae6-22d9-48b6-93e8-72628e08ff24/#b1fecab0-9a1b-447a-bf8c-bf2c91ac778f</span></a><br><span data-lexical-text="true">主要改动</span><br><span data-lexical-text="true">支持了: 预览粘贴的 slack 图片</span><br><span data-lexical-text="true">支持了: 预览粘贴的 markdown</span><br><span data-lexical-text="true">界面截图</span><br><span data-lexical-text="true">支持了: 预览粘贴的 slack 图片</span><br><span data-lexical-text="true">2025-04-11.18-53-31.mp4</span><br><span data-lexical-text="true">支持了: 预览粘贴的 markdown</span><br><span data-lexical-text="true">2025-04-11.18-47-10.mp4</span><br><span data-lexical-text="true">测试计划 (暂无)</span><br><span data-lexical-text="true">同上</span><br><span data-lexical-text="true">检查清单</span><br><span data-lexical-text="true">ok</span></p></p></div><grammarly-extension data-grammarly-shadow-root="true" style="position: absolute; top: 0px; left: 0px; pointer-events: none; z-index: auto;" class="dnXmp"></grammarly-extension><grammarly-extension data-grammarly-shadow-root="true" class="dnXmp" style="position: absolute; top: 0px; left: 0px; pointer-events: none; z-index: auto;"></grammarly-extension><div class="icon draggable-block-menu" draggable="true" style="opacity: 0; transform: translate(-10000px, -10000px);"><div class="icon"></div></div><div class="draggable-block-target-line"></div><span></span><div class="table-cell-action-button-container"></div></div><div></div></div><div class="MuiBox-root css-svog11"><button class="MuiButtonBase-root MuiButton-root MuiButton-text MuiButton-textPrimary MuiButton-sizeSmall MuiButton-textSizeSmall MuiButton-colorPrimary MuiButton-disableElevation MuiButton-root MuiButton-text MuiButton-textPrimary MuiButton-sizeSmall MuiButton-textSizeSmall MuiButton-colorPrimary MuiButton-disableElevation css-qtnxxz-MuiButtonBase-root-MuiButton-root" tabindex="0" type="button">Cancel<span class="MuiTouchRipple-root css-8je8zh-MuiTouchRipple-root"></span></button><button class="MuiButtonBase-root MuiButton-root MuiLoadingButton-root MuiButton-contained MuiButton-containedPrimary MuiButton-sizeSmall MuiButton-containedSizeSmall MuiButton-colorPrimary MuiButton-disableElevation MuiButton-root MuiLoadingButton-root MuiButton-contained MuiButton-containedPrimary MuiButton-sizeSmall MuiButton-containedSizeSmall MuiButton-colorPrimary MuiButton-disableElevation css-t74u51-MuiButtonBase-root-MuiButton-root-MuiLoadingButton-root" tabindex="0" type="button" id=":r2l:" title="⌘ Enter"><span class="MuiButton-icon MuiButton-startIcon MuiButton-iconSizeSmall css-cstir9-MuiButton-startIcon"><svg class="MuiSvgIcon-root MuiSvgIcon-fontSizeMedium css-i4bv87-MuiSvgIcon-root" focusable="false" aria-hidden="true" viewBox="0 0 24 24" data-testid="SaveIcon"><path d="M17 3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V7zm-5 16c-1.66 0-3-1.34-3-3s1.34-3 3-3 3 1.34 3 3-1.34 3-3 3m3-10H5V5h10z"></path></svg></span>Save Changes<span class="MuiTouchRipple-root css-8je8zh-MuiTouchRipple-root"></span></button></div></div></div></div><div class="MuiBox-root css-164r41r"><div class="MuiBox-root css-1480d6u"><div class="MuiBox-root css-13wylk3"><div class="MuiBox-root css-oxp7u2"><div class="MuiBox-root css-1l1ersm"><svg viewBox="0 0 24 24" width="1.2em" height="1.2em" class="github-reaction-icon MuiBox-root css-0"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="M20.985 12.528a9 9 0 1 0-8.45 8.456M16 19h6m-3-3v6M9 10h.01M15 10h.01"></path><path d="M9.5 15c.658.64 1.56 1 2.5 1s1.842-.36 2.5-1"></path></g></svg></div><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="github-reaction-icon iconify iconify--feather" width="1em" height="1em" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M21 11.5a8.4 8.4 0 0 1-.9 3.8a8.5 8.5 0 0 1-7.6 4.7a8.4 8.4 0 0 1-3.8-.9L3 21l1.9-5.7a8.4 8.4 0 0 1-.9-3.8a8.5 8.5 0 0 1 4.7-7.6a8.4 8.4 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8z"></path></svg></div></div><div class="MuiBox-root css-brejh2"><div class="MuiBox-root css-10swhe1"><button class="MuiButtonBase-root MuiButton-root MuiLoadingButton-root MuiButton-outlined MuiButton-outlinedPrimary MuiButton-sizeSmall MuiButton-outlinedSizeSmall MuiButton-colorPrimary MuiButton-disableElevation MuiButton-root MuiLoadingButton-root MuiButton-outlined MuiButton-outlinedPrimary MuiButton-sizeSmall MuiButton-outlinedSizeSmall MuiButton-colorPrimary MuiButton-disableElevation css-56o1ha-MuiButtonBase-root-MuiButton-root-MuiLoadingButton-root" tabindex="0" type="button" id=":r2j:"><span class="MuiButton-icon MuiButton-startIcon MuiButton-iconSizeSmall css-cstir9-MuiButton-startIcon"><svg viewBox="0 0 24 24" width="1.2em" height="1.2em"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="M19.875 6.27A2.23 2.23 0 0 1 21 8.218v7.284c0 .809-.443 1.555-1.158 1.948l-6.75 4.27a2.27 2.27 0 0 1-2.184 0l-6.75-4.27A2.23 2.23 0 0 1 3 15.502V8.217c0-.809.443-1.554 1.158-1.947l6.75-3.98a2.33 2.33 0 0 1 2.25 0l6.75 3.98z"></path><path d="M10 16v-6a2 2 0 1 1 4 0v6m-4-3h4"></path></g></svg></span><span class="MuiBox-root css-11qytbg">Actions</span><span class="MuiTouchRipple-root css-8je8zh-MuiTouchRipple-root"></span></button></div></div></div><hr class="MuiDivider-root MuiDivider-fullWidth css-121irhy-MuiDivider-root"></div></div></div><grammarly-extension-vbars data-grammarly-shadow-root="true" class="dnXmp" style="display: contents;"></grammarly-extension-vbars></div></div></div><div class="MuiBox-root css-1hnm6b6"><div class="editor-input-container MuiBox-root css-ibav4s"><div class="be-shell css-e5xp0t"><div class="toolbar css-12x7gcj"><button class="toolbar-item spaced css-mkrjxu" title="Component Picker" aria-label="Open component picker"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" width="1em" height="1em" viewBox="0 0 24 24" data-icon="tabler:circle-plus" class="iconify iconify--tabler"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 12a9 9 0 1 0 18 0a9 9 0 0 0-18 0m6 0h6m-3-3v6"></path></svg></button><button aria-label="Formatting options for text style" class="toolbar-item css-14mnd0x"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" width="1em" height="1em" viewBox="0 0 24 24" data-icon="tabler:align-justified" class="icon iconify iconify--tabler"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h12"></path></svg><span class="text dropdown-button-text">Normal</span></button><button aria-label="Formatting options for text alignment" class="toolbar-item spaced alignment css-14mnd0x"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" width="1em" height="1em" viewBox="0 0 24 24" data-icon="tabler:align-left" class="icon iconify iconify--tabler"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h10M4 18h14"></path></svg></button><button class="toolbar-item spaced css-mkrjxu" title="Bold (⌘B)" aria-label="Format text as bold. Shortcut: ⌘B"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" width="1em" height="1em" viewBox="0 0 24 24" data-icon="tabler:bold" class="iconify iconify--tabler"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 5h6a3.5 3.5 0 0 1 0 7H7zm6 7h1a3.5 3.5 0 0 1 0 7H7v-7"></path></svg></button><button class="toolbar-item spaced css-mkrjxu" title="Italic (⌘I)" aria-label="Format text as italics. Shortcut: ⌘I"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" width="1em" height="1em" viewBox="0 0 24 24" data-icon="tabler:italic" class="iconify iconify--tabler"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M11 5h6M7 19h6m1-14l-4 14"></path></svg></button><button class="toolbar-item spaced css-mkrjxu" title="Underline (⌘U)" aria-label="Format text to underlined. Shortcut: ⌘U"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" width="1em" height="1em" viewBox="0 0 24 24" data-icon="tabler:underline" class="iconify iconify--tabler"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 5v5a5 5 0 0 0 10 0V5M5 19h14"></path></svg></button><button class="toolbar-item spaced css-mkrjxu" title="Upload Image" aria-label="Upload Image"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" width="1em" height="1em" viewBox="0 0 24 24" data-icon="tabler:photo" class="iconify iconify--tabler"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="M15 8h.01M3 6a3 3 0 0 1 3-3h12a3 3 0 0 1 3 3v12a3 3 0 0 1-3 3H6a3 3 0 0 1-3-3z"></path><path d="m3 16l5-5c.928-.893 2.072-.893 3 0l5 5"></path><path d="m14 14l1-1c.928-.893 2.072-.893 3 0l3 3"></path></g></svg></button><button class="toolbar-item code css-mkrjxu" title="Insert code block" aria-label="Insert code block"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" width="1em" height="1em" viewBox="0 0 24 24" data-icon="tabler:code" class="iconify iconify--tabler"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m7 8l-4 4l4 4m10-8l4 4l-4 4M14 4l-4 16"></path></svg></button><button class="toolbar-item spaced link css-mkrjxu" aria-label="Insert link" title="Insert link"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" width="1em" height="1em" viewBox="0 0 24 24" data-icon="tabler:link" class="iconify iconify--tabler"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m9 15l6-6m-4-3l.463-.536a5 5 0 0 1 7.071 7.072L18 13m-5 5l-.397.534a5.07 5.07 0 0 1-7.127 0a4.97 4.97 0 0 1 0-7.071L6 11"></path></svg></button><button aria-label="Formatting text color" class="toolbar-item color-picker css-14mnd0x"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" width="1em" height="1em" viewBox="0 0 24 24" data-icon="tabler:text-color" class="icon iconify iconify--tabler"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 15V8a3 3 0 0 1 6 0v7m-6-4h6M5 19h14"></path></svg></button><button aria-label="Formatting background color" class="toolbar-item color-picker css-14mnd0x"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" width="1em" height="1em" viewBox="0 0 24 24" data-icon="tabler:bucket-droplet" class="icon iconify iconify--tabler"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="m5 16l1.465 1.638a2 2 0 1 1-3.015.099zm8.737-6.263c2.299-2.3 3.23-5.095 2.081-6.245s-3.945-.217-6.244 2.082s-3.231 5.095-2.082 6.244s3.946.218 6.245-2.081"></path><path d="M7.492 11.818c.362.362.768.676 1.208.934l6.895 4.047c1.078.557 2.255-.075 3.692-1.512s2.07-2.614 1.512-3.692q-.557-1.077-4.047-6.895a6 6 0 0 0-.934-1.208"></path></g></svg></button><button aria-label="Formatting options for additional text styles" class="toolbar-item spaced text-format-additional css-14mnd0x"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" width="1em" height="1em" viewBox="0 0 24 24" data-icon="tabler:letter-case" class="icon iconify iconify--tabler"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M14 15.5a3.5 3.5 0 1 0 7 0a3.5 3.5 0 1 0-7 0M3 19V8.5a3.5 3.5 0 0 1 7 0V19m-7-6h7m11-1v7"></path></svg></button></div><style>.mention[data-did="z1i6UdXsCihRscHkB2X2o8mAZzuUtWKyhJL"] {
18
+ color: #222!important;
19
+ background-color: #fff9cc!important;
20
+ }</style><div class="be-content editable MuiBox-root css-nj9o3m"><div class="be-editable notranslate css-dd3bub" contenteditable="true" role="textbox" spellcheck="false" data-lexical-editor="true" style="user-select: text; white-space: pre-wrap; word-break: break-word;"><p class="css-c86ruh"><br></p></div><grammarly-extension data-grammarly-shadow-root="true" style="position: absolute; top: 0px; left: 0px; pointer-events: none; z-index: auto;" class="dnXmp"></grammarly-extension><grammarly-extension data-grammarly-shadow-root="true" style="position: absolute; top: 0px; left: 0px; pointer-events: none; z-index: auto;" class="dnXmp"></grammarly-extension><div class="icon draggable-block-menu" draggable="true" style="opacity: 0; transform: translate(-10000px, -10000px);"><div class="icon"></div></div><div class="draggable-block-target-line"></div><span></span><div class="table-cell-action-button-container"></div><div class="be-placeholder css-1wrq4vn">Write a comment</div></div><div></div><div class="MuiBox-root css-13ilul4"><a class="MuiBox-root css-pav3zy" href="https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax" target="_blank"><span class="MuiBox-root css-1yhryrq" title="Styling with Markdown is supported"><svg viewBox="0 0 24 24" width="1.2em" height="1.2em" style="font-size: 16px;"><path fill="currentColor" d="M20.56 18H3.44C2.65 18 2 17.37 2 16.59V7.41C2 6.63 2.65 6 3.44 6h17.12c.79 0 1.44.63 1.44 1.41v9.18c0 .78-.65 1.41-1.44 1.41M6.81 15.19v-3.66l1.92 2.35l1.92-2.35v3.66h1.93V8.81h-1.93l-1.92 2.35l-1.92-2.35H4.89v6.38zM19.69 12h-1.92V8.81h-1.92V12h-1.93l2.89 3.28z"></path></svg></span></a><div class="MuiBox-root css-1c1kq07"><button class="MuiButtonBase-root MuiButton-root MuiLoadingButton-root MuiButton-contained MuiButton-containedPrimary MuiButton-sizeSmall MuiButton-containedSizeSmall MuiButton-colorPrimary MuiButton-disableElevation Mui-disabled MuiButton-root MuiLoadingButton-root MuiButton-contained MuiButton-containedPrimary MuiButton-sizeSmall MuiButton-containedSizeSmall MuiButton-colorPrimary MuiButton-disableElevation editor-submit-button css-t74u51-MuiButtonBase-root-MuiButton-root-MuiLoadingButton-root" tabindex="-1" type="button" id=":r2e:" title="⌘ Enter" disabled=""><span class="MuiButton-icon MuiButton-startIcon MuiButton-iconSizeSmall css-cstir9-MuiButton-startIcon"><svg class="MuiSvgIcon-root MuiSvgIcon-fontSizeMedium css-1oauu3d-MuiSvgIcon-root" focusable="false" aria-hidden="true" viewBox="0 0 24 24" data-testid="SendIcon"><path d="M2.01 21 23 12 2.01 3 2 10l15 2-15 2z"></path></svg></span><span class="MuiBox-root css-oqdwhc"><span>Comment</span><span class="MuiBox-root css-6n7j50">(⌘ Enter)</span></span></button></div></div></div></div></div></div></div></div><div class="blocklet__footer MuiBox-root css-weeja"><div class="css-hk50hb"><div class="MuiContainer-root MuiContainer-maxWidthLg css-1oqqzyl-MuiContainer-root" style="padding: 0px;"><div class="MuiContainer-root MuiContainer-maxWidthLg plain-layout-container css-1oqqzyl-MuiContainer-root"><div class="css-1px04oi"><div><a class="footer-brand-logo MuiBox-root css-0" href="/"><img src="/.well-known/service/blocklet/logo?imageFilter=convert&amp;f=png&amp;h=80"></a></div></div><p class="css-1d4knkg">Copyright © 2025 Discuss Kit</p></div></div></div><div class="MuiBox-root css-1jrtbi8">2.2.35</div></div></div>`)).toBe(false);
21
+ });
22
+ // Test for the case when text is not valid Markdown
23
+ it('should return false if text is not valid Markdown', () => {
24
+ expect(isMarkdownText('{ not: markdown }')).toBe(false);
25
+ });
26
+ });
@@ -0,0 +1,2 @@
1
+ /// <reference types="react" />
2
+ export default function PasteSlackImagePlugin(): JSX.Element | null;
@@ -0,0 +1,22 @@
1
+ import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';
2
+ import { COMMAND_PRIORITY_CRITICAL, PASTE_COMMAND } from 'lexical';
3
+ import { useEffect } from 'react';
4
+ import { DRAG_DROP_PASTE, eventFiles } from '@lexical/rich-text';
5
+ export default function PasteSlackImagePlugin() {
6
+ const [editor] = useLexicalComposerContext();
7
+ useEffect(() => {
8
+ const unregister = editor.registerCommand(PASTE_COMMAND, (e) => {
9
+ const [, files] = eventFiles(e);
10
+ if (files.length && files.every((file) => file.type.startsWith('image/'))) {
11
+ editor.dispatchCommand(DRAG_DROP_PASTE, files);
12
+ return true;
13
+ }
14
+ return false;
15
+ }, COMMAND_PRIORITY_CRITICAL // 使用最高优先级
16
+ );
17
+ return () => {
18
+ unregister();
19
+ };
20
+ }, [editor]);
21
+ return null;
22
+ }
@@ -61,6 +61,7 @@ import BilibiliPlugin from '../ext/BilibiliPlugin';
61
61
  import ContentEditable from './ui/ContentEditable';
62
62
  import BlockletEmbedPlugin from '../ext/BlockletEmbedPlugin';
63
63
  import PostLinkEmbedPlugin from '../ext/PostLinkEmbedPlugin';
64
+ import PasteSlackImagePlugin from '../ext/PasteSlackImagePlugin';
64
65
  import BookmarkPlugin from '../ext/BookmarkPlugin';
65
66
  import Placeholder from './ui/Placeholder';
66
67
  import { useEditorConfig } from '../config';
@@ -83,6 +84,7 @@ import { useResponsiveTable } from './hooks/useResponsiveTable';
83
84
  import { useTranslationListener } from './hooks/useTranslationListener';
84
85
  import { PagesKitComponentPlugin } from '../ext/PagesKitComponent/PagesKitComponentPlugin';
85
86
  import { EditorHolderPlugin } from '../ext/EditorHolderPlugin';
87
+ import PasteMarkdownPlugin from '../ext/PasteMarkdownPlugin';
86
88
  export default function Editor({ children, prepend, placeholder, onChange, autoFocus = true, showToolbar = true, editorRef, onReady, enableHeadingsIdPlugin, }) {
87
89
  const [editor] = useLexicalComposerContext();
88
90
  const [editable, setEditable] = useState(false);
@@ -112,9 +114,9 @@ export default function Editor({ children, prepend, placeholder, onChange, autoF
112
114
  }
113
115
  }, [hasNodes('image'), hasUploader]);
114
116
  if (minimalMode) {
115
- return (_jsxs(_Fragment, { children: [prepend, isRichText && editable && showToolbar && _jsx(ToolbarPlugin, {}), hasNodes('image') && hasUploader && _jsx(DragDropPaste, {}), autoFocus && _jsx(AutoFocusPlugin, { defaultSelection: "rootEnd" }), _jsx(ClearEditorPlugin, {}), !!editable && _jsx(ComponentPickerPlugin, {}), !!editable && _jsx(MentionsPlugin, {}), hasNodes('link') && _jsx(AutoEmbedPlugin, {}), _jsx(EditorContent, { ref: onRef, className: cx('be-content', editable && 'editable'), children: _jsx(RichTextPlugin, { contentEditable: _jsx(ContentEditable, { className: cx('be-editable', 'notranslate') }), placeholder: _jsx(Placeholder, { className: "be-placeholder", children: placeholder }), ErrorBoundary: LexicalErrorBoundary }) }), hasNodes('code', 'code-highlight') && _jsx(CodeHighlightPlugin, {}), hasNodes('image') && hasUploader && _jsx(ImagesPlugin, {}), hasNodes('video') && _jsx(VideoPlugin, {}), hasNodes('link') && _jsx(LinkPlugin, {}), hasNodes('tweet') && _jsx(TwitterPlugin, {}), hasNodes('youtube') && _jsx(YouTubePlugin, {}), hasNodes('figma') && _jsx(FigmaPlugin, {}), _jsx(BilibiliPlugin, {}), _jsx(PostLinkEmbedPlugin, {}), _jsx(BookmarkPlugin, {}), editable && _jsx(CustomOnChangePlugin, { placeholder: placeholder }), editable && _jsx(TemplatePlugin, {}), !editable && _jsx(BlurTextPlugin, {}), hasNodes('pdf') && _jsx(PdfPlugin, {}), hasNodes('file') && _jsx(FilePlugin, {}), hasNodes('horizontalrule') && _jsx(HorizontalRulePlugin, {}), hasNodes('excalidraw') && _jsx(ExcalidrawPlugin, {}), hasNodes('alert') && _jsx(AlertPlugin, {}), hasNodes('pages-kit-component') && _jsx(PagesKitComponentPlugin, {}), _jsx(TabFocusPlugin, {}), onChange && _jsx(OnChangePlugin, { onChange: onChange }), floatingAnchorElem && editable && (_jsxs(_Fragment, { children: [hasNodes('code') && _jsx(CodeActionMenuPlugin, { anchorElem: floatingAnchorElem }), hasNodes('link') && _jsx(FloatingLinkEditorPlugin, { anchorElem: floatingAnchorElem })] })), _jsx(AiImagePlugin, {}), editorRef && _jsx(EditorRefPlugin, { editorRef: editorRef }), children] }));
117
+ return (_jsxs(_Fragment, { children: [prepend, isRichText && editable && showToolbar && _jsx(ToolbarPlugin, {}), hasNodes('image') && hasUploader && _jsx(DragDropPaste, {}), autoFocus && _jsx(AutoFocusPlugin, { defaultSelection: "rootEnd" }), _jsx(ClearEditorPlugin, {}), !!editable && _jsx(ComponentPickerPlugin, {}), !!editable && _jsx(MentionsPlugin, {}), hasNodes('link') && _jsx(AutoEmbedPlugin, {}), _jsx(PasteSlackImagePlugin, {}), _jsx(PasteMarkdownPlugin, {}), _jsx(EditorContent, { ref: onRef, className: cx('be-content', editable && 'editable'), children: _jsx(RichTextPlugin, { contentEditable: _jsx(ContentEditable, { className: cx('be-editable', 'notranslate') }), placeholder: _jsx(Placeholder, { className: "be-placeholder", children: placeholder }), ErrorBoundary: LexicalErrorBoundary }) }), hasNodes('code', 'code-highlight') && _jsx(CodeHighlightPlugin, {}), hasNodes('image') && hasUploader && _jsx(ImagesPlugin, {}), hasNodes('video') && _jsx(VideoPlugin, {}), hasNodes('link') && _jsx(LinkPlugin, {}), hasNodes('tweet') && _jsx(TwitterPlugin, {}), hasNodes('youtube') && _jsx(YouTubePlugin, {}), hasNodes('figma') && _jsx(FigmaPlugin, {}), _jsx(PostLinkEmbedPlugin, {}), _jsx(BookmarkPlugin, {}), editable && _jsx(CustomOnChangePlugin, { placeholder: placeholder }), editable && _jsx(TemplatePlugin, {}), !editable && _jsx(BlurTextPlugin, {}), hasNodes('pdf') && _jsx(PdfPlugin, {}), hasNodes('file') && _jsx(FilePlugin, {}), hasNodes('horizontalrule') && _jsx(HorizontalRulePlugin, {}), hasNodes('excalidraw') && _jsx(ExcalidrawPlugin, {}), hasNodes('alert') && _jsx(AlertPlugin, {}), hasNodes('pages-kit-component') && _jsx(PagesKitComponentPlugin, {}), _jsx(TabFocusPlugin, {}), onChange && _jsx(OnChangePlugin, { onChange: onChange }), floatingAnchorElem && editable && (_jsxs(_Fragment, { children: [hasNodes('code') && _jsx(CodeActionMenuPlugin, { anchorElem: floatingAnchorElem }), hasNodes('link') && _jsx(FloatingLinkEditorPlugin, { anchorElem: floatingAnchorElem })] })), _jsx(AiImagePlugin, {}), editorRef && _jsx(EditorRefPlugin, { editorRef: editorRef }), children] }));
116
118
  }
117
- return (_jsxs(_Fragment, { children: [prepend, isRichText && editable && showToolbar && _jsx(ToolbarPlugin, {}), isMaxLength && _jsx(MaxLengthPlugin, { maxLength: 30 }), hasNodes('image') && hasUploader && _jsx(DragDropPaste, {}), autoFocus && _jsx(AutoFocusPlugin, { defaultSelection: "rootEnd" }), _jsx(ClearEditorPlugin, {}), !!editable && _jsx(ComponentPickerPlugin, {}), !!editable && _jsx(EmojiPickerPlugin, {}), hasNodes('link') && _jsx(AutoEmbedPlugin, {}), !!editable && _jsx(MentionsPlugin, {}), hasNodes('emoji') && _jsx(EmojisPlugin, {}), hasNodes('hashtag') && _jsx(HashtagPlugin, {}), _jsx(SpeechToTextPlugin, {}), hasNodes('autolink') && _jsx(AutoLinkPlugin, {}), isRichText ? (_jsxs(_Fragment, { children: [_jsx(HistoryPlugin, { externalHistoryState: historyState }), _jsx(EditorContent, { ref: onRef, className: cx('be-content', editable && 'editable'), children: _jsx(RichTextPlugin, { contentEditable: _jsx(ContentEditable, { className: cx('be-editable', 'notranslate') }), placeholder: _jsx(Placeholder, { className: "be-placeholder", children: placeholder }), ErrorBoundary: LexicalErrorBoundary }) }), _jsx(MarkdownShortcutPlugin, {}), _jsx(TabIndentationPlugin, {}), hasNodes('code', 'code-highlight') && _jsx(CodeHighlightPlugin, {}), hasNodes('list', 'listitem') && _jsx(ListPlugin, {}), hasNodes('list', 'listitem') && _jsx(CheckListPlugin, {}), hasNodes('list', 'listitem') && _jsx(ListMaxIndentLevelPlugin, { maxDepth: 7 }), hasNodes('table', 'tablerow', 'tablecell') && editable && (_jsx(TablePlugin, { hasCellMerge: true, hasCellBackgroundColor: true })), hasNodes('table', 'tablerow', 'tablecell') && _jsx(TableCellResizer, {}), hasNodes('image') && hasUploader && _jsx(ImagesPlugin, {}), hasNodes('video') && _jsx(VideoPlugin, {}), hasNodes('link') && _jsx(LinkPlugin, {}), hasNodes('tweet') && _jsx(TwitterPlugin, {}), hasNodes('youtube') && _jsx(YouTubePlugin, {}), hasNodes('figma') && _jsx(FigmaPlugin, {}), _jsx(BilibiliPlugin, {}), _jsx(BlockletEmbedPlugin, {}), _jsx(PostLinkEmbedPlugin, {}), _jsx(BookmarkPlugin, {}), _jsx(AidePlugin, {}), editable && _jsx(CustomOnChangePlugin, { placeholder: placeholder }), editable && _jsx(TemplatePlugin, {}), !editable && _jsx(BlurTextPlugin, {}), hasNodes('pdf') && _jsx(PdfPlugin, {}), hasNodes('file') && _jsx(FilePlugin, {}), hasNodes('link') && _jsx(ClickableLinkPlugin, {}), hasNodes('horizontalrule') && _jsx(HorizontalRulePlugin, {}), hasNodes('excalidraw') && _jsx(ExcalidrawPlugin, {}), hasNodes('alert') && _jsx(AlertPlugin, {}), hasNodes('pages-kit-component') && _jsx(PagesKitComponentPlugin, {}), _jsx(TabFocusPlugin, {}), hasNodes('collapsible-container', 'collapsible-content', 'collapsible-title') && _jsx(CollapsiblePlugin, {}), onChange && _jsx(OnChangePlugin, { onChange: onChange }), floatingAnchorElem && editable && (_jsxs(_Fragment, { children: [_jsx(DraggableBlockPlugin, { anchorElem: floatingAnchorElem }), hasNodes('code') && _jsx(CodeActionMenuPlugin, { anchorElem: floatingAnchorElem }), hasNodes('link') && _jsx(FloatingLinkEditorPlugin, { anchorElem: floatingAnchorElem }), hasNodes('table') && _jsx(TableCellActionMenuPlugin, { anchorElem: floatingAnchorElem, cellMerge: true }), _jsx(FloatingTextFormatToolbarPlugin, { anchorElem: floatingAnchorElem })] })), enableHeadingsIdPlugin && _jsx(HeadingsIdPlugin, {})] })) : (_jsxs(_Fragment, { children: [_jsx(PlainTextPlugin, { contentEditable: _jsx(ContentEditable, {}), placeholder: _jsx(Placeholder, { children: "placeholder" }), ErrorBoundary: LexicalErrorBoundary }), _jsx(HistoryPlugin, { externalHistoryState: historyState })] })), (isCharLimit || isCharLimitUtf8) && (_jsx(CharacterLimitPlugin, { charset: isCharLimit ? 'UTF-16' : 'UTF-8', maxLength: 5 })), isAutocomplete && hasNodes('autocomplete') && _jsx(AutocompletePlugin, {}), _jsx("div", { children: showTableOfContents && _jsx(TableOfContentsPlugin, {}) }), _jsx(SelectBlockPlugin, {}), _jsx(RemoveListPlugin, {}), _jsx(MarkdownHeadTextPlugin, {}), _jsx(AiImagePlugin, {}), _jsx(EditorHolderPlugin, {}), editorRef && _jsx(EditorRefPlugin, { editorRef: editorRef }), onReady && _jsx(EditorReadyPlugin, { onReady: onReady }), children] }));
119
+ return (_jsxs(_Fragment, { children: [prepend, isRichText && editable && showToolbar && _jsx(ToolbarPlugin, {}), isMaxLength && _jsx(MaxLengthPlugin, { maxLength: 30 }), hasNodes('image') && hasUploader && _jsx(DragDropPaste, {}), autoFocus && _jsx(AutoFocusPlugin, { defaultSelection: "rootEnd" }), _jsx(ClearEditorPlugin, {}), !!editable && _jsx(ComponentPickerPlugin, {}), !!editable && _jsx(EmojiPickerPlugin, {}), hasNodes('link') && _jsx(AutoEmbedPlugin, {}), !!editable && _jsx(MentionsPlugin, {}), hasNodes('emoji') && _jsx(EmojisPlugin, {}), hasNodes('hashtag') && _jsx(HashtagPlugin, {}), _jsx(SpeechToTextPlugin, {}), hasNodes('autolink') && _jsx(AutoLinkPlugin, {}), isRichText ? (_jsxs(_Fragment, { children: [_jsx(PasteSlackImagePlugin, {}), _jsx(PasteMarkdownPlugin, {}), _jsx(HistoryPlugin, { externalHistoryState: historyState }), _jsx(EditorContent, { ref: onRef, className: cx('be-content', editable && 'editable'), children: _jsx(RichTextPlugin, { contentEditable: _jsx(ContentEditable, { className: cx('be-editable', 'notranslate') }), placeholder: _jsx(Placeholder, { className: "be-placeholder", children: placeholder }), ErrorBoundary: LexicalErrorBoundary }) }), _jsx(MarkdownShortcutPlugin, {}), _jsx(TabIndentationPlugin, {}), hasNodes('code', 'code-highlight') && _jsx(CodeHighlightPlugin, {}), hasNodes('list', 'listitem') && _jsx(ListPlugin, {}), hasNodes('list', 'listitem') && _jsx(CheckListPlugin, {}), hasNodes('list', 'listitem') && _jsx(ListMaxIndentLevelPlugin, { maxDepth: 7 }), hasNodes('table', 'tablerow', 'tablecell') && editable && (_jsx(TablePlugin, { hasCellMerge: true, hasCellBackgroundColor: true })), hasNodes('table', 'tablerow', 'tablecell') && _jsx(TableCellResizer, {}), hasNodes('image') && hasUploader && _jsx(ImagesPlugin, {}), hasNodes('video') && _jsx(VideoPlugin, {}), hasNodes('link') && _jsx(LinkPlugin, {}), hasNodes('tweet') && _jsx(TwitterPlugin, {}), hasNodes('youtube') && _jsx(YouTubePlugin, {}), hasNodes('figma') && _jsx(FigmaPlugin, {}), _jsx(BilibiliPlugin, {}), _jsx(BlockletEmbedPlugin, {}), _jsx(PostLinkEmbedPlugin, {}), _jsx(BookmarkPlugin, {}), _jsx(AidePlugin, {}), editable && _jsx(CustomOnChangePlugin, { placeholder: placeholder }), editable && _jsx(TemplatePlugin, {}), !editable && _jsx(BlurTextPlugin, {}), hasNodes('pdf') && _jsx(PdfPlugin, {}), hasNodes('file') && _jsx(FilePlugin, {}), hasNodes('link') && _jsx(ClickableLinkPlugin, {}), hasNodes('horizontalrule') && _jsx(HorizontalRulePlugin, {}), hasNodes('excalidraw') && _jsx(ExcalidrawPlugin, {}), hasNodes('alert') && _jsx(AlertPlugin, {}), hasNodes('pages-kit-component') && _jsx(PagesKitComponentPlugin, {}), _jsx(TabFocusPlugin, {}), hasNodes('collapsible-container', 'collapsible-content', 'collapsible-title') && _jsx(CollapsiblePlugin, {}), onChange && _jsx(OnChangePlugin, { onChange: onChange }), floatingAnchorElem && editable && (_jsxs(_Fragment, { children: [_jsx(DraggableBlockPlugin, { anchorElem: floatingAnchorElem }), hasNodes('code') && _jsx(CodeActionMenuPlugin, { anchorElem: floatingAnchorElem }), hasNodes('link') && _jsx(FloatingLinkEditorPlugin, { anchorElem: floatingAnchorElem }), hasNodes('table') && _jsx(TableCellActionMenuPlugin, { anchorElem: floatingAnchorElem, cellMerge: true }), _jsx(FloatingTextFormatToolbarPlugin, { anchorElem: floatingAnchorElem })] })), enableHeadingsIdPlugin && _jsx(HeadingsIdPlugin, {})] })) : (_jsxs(_Fragment, { children: [_jsx(PlainTextPlugin, { contentEditable: _jsx(ContentEditable, {}), placeholder: _jsx(Placeholder, { children: "placeholder" }), ErrorBoundary: LexicalErrorBoundary }), _jsx(HistoryPlugin, { externalHistoryState: historyState })] })), (isCharLimit || isCharLimitUtf8) && (_jsx(CharacterLimitPlugin, { charset: isCharLimit ? 'UTF-16' : 'UTF-8', maxLength: 5 })), isAutocomplete && hasNodes('autocomplete') && _jsx(AutocompletePlugin, {}), _jsx("div", { children: showTableOfContents && _jsx(TableOfContentsPlugin, {}) }), _jsx(SelectBlockPlugin, {}), _jsx(RemoveListPlugin, {}), _jsx(MarkdownHeadTextPlugin, {}), _jsx(AiImagePlugin, {}), _jsx(EditorHolderPlugin, {}), editorRef && _jsx(EditorRefPlugin, { editorRef: editorRef }), onReady && _jsx(EditorReadyPlugin, { onReady: onReady }), children] }));
118
120
  }
119
121
  const EditorContent = styled(Box) `
120
122
  position: relative;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@blocklet/editor",
3
- "version": "2.2.32",
3
+ "version": "2.2.37",
4
4
  "main": "lib/index.js",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -67,7 +67,8 @@
67
67
  "ufo": "^1.5.4",
68
68
  "url-join": "^4.0.1",
69
69
  "zustand": "^4.5.5",
70
- "@blocklet/pdf": "^2.2.32"
70
+ "marked": "^15.0.8",
71
+ "@blocklet/pdf": "^2.2.37"
71
72
  },
72
73
  "devDependencies": {
73
74
  "@babel/core": "^7.25.2",
@@ -108,6 +109,8 @@
108
109
  "scripts": {
109
110
  "dev": "npm run storybook",
110
111
  "clean": "rm -rf lib",
112
+ "test": "vitest",
113
+ "coverage": "vitest run --coverage",
111
114
  "build": "npm run clean && tsc --build && npm run cpfiles",
112
115
  "build:watch": "tsc --build --watch",
113
116
  "lint": "eslint src --ext .mjs,.js,.jsx,.ts,.tsx",