diff --git a/package.json b/package.json index ba652b3c..265a81f2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "impro", - "version": "0.17.31", + "version": "0.17.32", "type": "module", "scripts": { "start": "rm -rf \"${BUILD_DIR:-build}\" && NODE_ENV=development eleventy --serve", diff --git a/src/css/style.css b/src/css/style.css index 59ec65fd..2d25b1e8 100644 --- a/src/css/style.css +++ b/src/css/style.css @@ -3805,6 +3805,7 @@ image-carousel { border-radius: 8px; font-size: 13px; opacity: 0.9; + cursor: pointer; } .message-sent .message-reply-quote { @@ -3843,6 +3844,7 @@ image-carousel { font-size: 12px; color: var(--text-color-muted); margin-bottom: 2px; + cursor: pointer; } .message-reply-caption-arrow { @@ -3860,6 +3862,28 @@ image-carousel { padding-left: 44px; } +@keyframes message-highlight-flash { + 0% { + background-color: transparent; + } + 10%, + 37% { + background-color: color-mix( + in srgb, + var(--highlight-color) 22%, + transparent + ); + } + 67% { + background-color: transparent; + } +} + +.message-wrapper.message-highlighted { + border-radius: 12px; + animation: message-highlight-flash 1000ms ease-out; +} + .message-sent a { color: var(--off-white); } diff --git a/src/js/views/chatDetail.view.js b/src/js/views/chatDetail.view.js index 0b6433b3..0ece626e 100644 --- a/src/js/views/chatDetail.view.js +++ b/src/js/views/chatDetail.view.js @@ -50,6 +50,29 @@ class ChatDetailView extends View { state.$paletteMessageId = new Signal.State(null); state.$reactionsDialogMessageId = new Signal.State(null); + function triggerHighlightAnimation(messageEl) { + messageEl.classList.remove("message-highlighted"); + // Force a reflow + void messageEl.offsetWidth; + messageEl.classList.add("message-highlighted"); + messageEl.addEventListener( + "animationend", + () => messageEl.classList.remove("message-highlighted"), + { once: true }, + ); + } + + function scrollToAndHighlightMessage(messageId) { + const element = root.querySelector( + `.message-wrapper[data-message-id="${CSS.escape(messageId)}"]`, + ); + if (!element) { + return; + } + element.scrollIntoView({ block: "center" }); + triggerHighlightAnimation(element); + } + function focusChatInput() { const chatInput = root.querySelector("chat-input"); if (chatInput) { @@ -613,6 +636,10 @@ class ChatDetailView extends View { ? "message-reply-quote-sent" : "message-reply-quote-received"}" data-testid="message-reply-quote" + @click=${(event) => { + event.stopPropagation(); + scrollToAndHighlightMessage(replyTo.id); + }} >