diff --git a/app/src/emoji/index.ts b/app/src/emoji/index.ts
index 873ab323e..7e26cedf2 100644
--- a/app/src/emoji/index.ts
+++ b/app/src/emoji/index.ts
@@ -229,7 +229,12 @@ const renderEmojiContent = (previousIndex: string, previousContentElement: Eleme
previousContentElement.removeAttribute("style");
};
-export const openEmojiPanel = (id: string, type: "doc" | "notebook" | "av", position: IPosition, callback?: (emoji: string) => void, dynamicImgElement?: HTMLElement) => {
+export const openEmojiPanel = (
+ id: string,
+ type: "doc" | "notebook" | "av",
+ position: IPosition,
+ callback?: (emoji: string) => void,
+ dynamicImgElement?: HTMLElement) => {
if (type !== "av") {
window.siyuan.menus.menu.remove();
} else {
diff --git a/app/src/protyle/wysiwyg/index.ts b/app/src/protyle/wysiwyg/index.ts
index 1f86663a2..51b1072a9 100644
--- a/app/src/protyle/wysiwyg/index.ts
+++ b/app/src/protyle/wysiwyg/index.ts
@@ -3036,6 +3036,37 @@ export class WYSIWYG {
return;
}
+ const calloutIconElement = hasTopClosestByClassName(event.target, "callout-icon");
+ if (!protyle.disabled && !event.shiftKey && !ctrlIsPressed && calloutIconElement) {
+ const nodeElement = hasClosestBlock(calloutIconElement);
+ if (nodeElement) {
+ const emojiRect = calloutIconElement.getBoundingClientRect();
+ openEmojiPanel("", "av", {
+ x: emojiRect.left,
+ y: emojiRect.bottom,
+ h: emojiRect.height,
+ w: emojiRect.width
+ }, (unicode) => {
+ const oldHTML = nodeElement.outerHTML;
+ let emojiHTML;
+ if (unicode.startsWith("api/icon/getDynamicIcon")) {
+ emojiHTML = `
`;
+ } else if (unicode.indexOf(".") > -1) {
+ emojiHTML = `
`;
+ } else {
+ emojiHTML = unicode2Emoji(unicode);
+ }
+ calloutIconElement.innerHTML = emojiHTML;
+ hideElements(["dialog"]);
+ updateTransaction(protyle, nodeElement.getAttribute("data-node-id"), nodeElement.outerHTML, oldHTML);
+ focusByWbr(nodeElement, range);
+ }, calloutIconElement.querySelector("img"));
+ }
+ event.preventDefault();
+ event.stopPropagation();
+ return;
+ }
+
const emojiElement = hasTopClosestByClassName(event.target, "emoji");
if (!protyle.disabled && !event.shiftKey && !ctrlIsPressed && emojiElement) {
const nodeElement = hasClosestBlock(emojiElement);