diff --git a/packages/theme/styles/_layouts.scss b/packages/theme/styles/_layouts.scss index c7803099ce..1de004397f 100644 --- a/packages/theme/styles/_layouts.scss +++ b/packages/theme/styles/_layouts.scss @@ -109,6 +109,7 @@ li { p { user-select: text; + cursor: auto; a { word-break: break-all; diff --git a/packages/theme/styles/prose.scss b/packages/theme/styles/prose.scss index 21a1e33a17..21b30c1d2f 100644 --- a/packages/theme/styles/prose.scss +++ b/packages/theme/styles/prose.scss @@ -359,6 +359,7 @@ table.proseTable { border-radius: .25rem; padding: .5rem; user-select: text; + cursor: auto; pre { white-space: pre-wrap; } } diff --git a/plugins/activity-resources/src/components/activity-message/ActivityMessageTemplate.svelte b/plugins/activity-resources/src/components/activity-message/ActivityMessageTemplate.svelte index e7d6a2dfaf..4c3931157e 100644 --- a/plugins/activity-resources/src/components/activity-message/ActivityMessageTemplate.svelte +++ b/plugins/activity-resources/src/components/activity-message/ActivityMessageTemplate.svelte @@ -104,6 +104,42 @@ } $: isShort = canDisplayShort(type, isSaved) + + function isInside (x: number, y: number, rect: DOMRect): boolean { + return x >= rect.left && y >= rect.top && x <= rect.right && y <= rect.bottom + } + + function isTextClicked (element: HTMLElement | null, x: number, y: number): boolean { + if (element == null) { + return false + } + + const nodes = element.childNodes + const range = document.createRange() + + for (let i = 0; i < nodes.length; i++) { + const node = nodes[i] + + if (node.nodeType !== Node.TEXT_NODE) continue + + range.selectNodeContents(node) + + if (isInside(x, y, range.getBoundingClientRect())) { + return true + } + } + return false + } + + function handleContextMenu (event: MouseEvent): void { + const showCustomPopup = !isTextClicked(event.target as HTMLElement, event.clientX, event.clientY) + if (showCustomPopup) { + showMenu(event, { object: message, baseMenuClass: activity.class.ActivityMessage }, () => { + isActionsOpened = false + }) + isActionsOpened = true + } + } {#if !isHidden} @@ -123,12 +159,7 @@ class:borderedHover={hoverStyles === 'borderedHover'} class:filledHover={hoverStyles === 'filledHover'} on:click={onClick} - on:contextmenu={(evt) => { - showMenu(evt, { object: message, baseMenuClass: activity.class.ActivityMessage }, () => { - isActionsOpened = false - }) - isActionsOpened = true - }} + on:contextmenu={handleContextMenu} > {#if showNotify && !embedded && !isShort}