From 129c7fdc2929f560b2e06b1c17931e35b09038b5 Mon Sep 17 00:00:00 2001 From: Yuurin Bee Date: Sat, 23 May 2026 19:02:01 +0700 Subject: [PATCH 01/13] Fix: Clear Pending Avatar Path on Profile Edit Cancel --- src/main.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main.js b/src/main.js index fd34e242..3b0657fa 100644 --- a/src/main.js +++ b/src/main.js @@ -8247,6 +8247,7 @@ function exitProfileEditMode(fCancel = false) { cProfile.name = objProfileEditSnapshot.name; cProfile.status = objProfileEditSnapshot.status; cProfile.about = objProfileEditSnapshot.about; + strPendingProfileAvatarPath = null; } else { const nameInput = document.querySelector('#profile-edit-name input'); const statusInput = document.querySelector('#profile-edit-status input'); From fd15afa11356cd5cb43386da99f50cef822a0eda Mon Sep 17 00:00:00 2001 From: Yuurin Bee Date: Sat, 23 May 2026 19:04:41 +0700 Subject: [PATCH 02/13] Remove Mousemove Listener Leak on Profile Edit Mode Exit --- src/main.js | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/src/main.js b/src/main.js index 3b0657fa..b3a3f84c 100644 --- a/src/main.js +++ b/src/main.js @@ -8207,24 +8207,25 @@ function enterProfileEditMode() { const bannerContainer = document.getElementById('profile-banner-container'); const avatarContainer = document.querySelector('.profile-avatar-container'); - bannerContainer.addEventListener('mousemove', (e) => { - const bannerRect = bannerContainer.getBoundingClientRect(); - const avatarRect = avatarContainer.getBoundingClientRect(); - - const inBanner = e.clientY <= bannerRect.top + 200; - const inAvatar = ( - e.clientX >= avatarRect.left && - e.clientX <= avatarRect.right && - e.clientY >= avatarRect.top && - e.clientY <= avatarRect.bottom - ); + bannerContainer._editMoveHandler = (e) => { + const bannerRect = bannerContainer.getBoundingClientRect(); + const avatarRect = avatarContainer.getBoundingClientRect(); + + const inBanner = e.clientY <= bannerRect.top + 200; + const inAvatar = ( + e.clientX >= avatarRect.left && + e.clientX <= avatarRect.right && + e.clientY >= avatarRect.top && + e.clientY <= avatarRect.bottom + ); if (inAvatar || !inBanner) { bannerContainer.classList.add('avatar-hovered'); } else { bannerContainer.classList.remove('avatar-hovered'); } -}); +}; +bannerContainer.addEventListener('mousemove', bannerContainer._editMoveHandler); } function exitProfileEditMode(fCancel = false) { @@ -8306,6 +8307,11 @@ function exitProfileEditMode(fCancel = false) { renderProfileTab(cProfile); } domProfileBanner.onclick = null; + const _bc = document.getElementById('profile-banner-container'); + if (_bc._editMoveHandler) { + _bc.removeEventListener('mousemove', _bc._editMoveHandler); + _bc._editMoveHandler = null; +} } function editProfileDescription() { From 7177a85a52407564b5b998eb4c5f964858bf9d3d Mon Sep 17 00:00:00 2001 From: Yuurin Bee Date: Sat, 23 May 2026 19:05:53 +0700 Subject: [PATCH 03/13] Restore Edit & Share Button Visibility on Profile Edit Exit --- src/main.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main.js b/src/main.js index b3a3f84c..100a543f 100644 --- a/src/main.js +++ b/src/main.js @@ -8238,6 +8238,8 @@ function exitProfileEditMode(fCancel = false) { document.getElementById('profile-npub-container').style.display = ''; document.getElementById('profile-badges').style.display = ''; document.getElementById('profile-edit-fields').style.display = 'none'; + document.getElementById('profile-edit-btn').style.display = ''; + document.getElementById('profile-share-btn').style.display = ''; document.getElementById('profile-secondary-name').style.display = ''; document.getElementById('profile-secondary-status').style.display = ''; document.getElementById('profile-description').style.display = ''; From 32ed10c928908aac2c9d6d7b7afbef885bf23bad Mon Sep 17 00:00:00 2001 From: Yuurin Bee Date: Sat, 23 May 2026 19:09:30 +0700 Subject: [PATCH 04/13] Remove Avatar-Hovered Class on Profile Edit Mode Exit --- src/main.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main.js b/src/main.js index 100a543f..2ca2e864 100644 --- a/src/main.js +++ b/src/main.js @@ -8308,6 +8308,7 @@ function exitProfileEditMode(fCancel = false) { } renderProfileTab(cProfile); } + document.getElementById('profile-banner-container').classList.remove('avatar-hovered'); domProfileBanner.onclick = null; const _bc = document.getElementById('profile-banner-container'); if (_bc._editMoveHandler) { From 60a21d1e35109afd8831e01797cb3d569ea7dde7 Mon Sep 17 00:00:00 2001 From: Yuurin Bee Date: Sat, 23 May 2026 19:13:33 +0700 Subject: [PATCH 05/13] Update Unsaved Changes Banner After Uploading New Image --- src/main.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main.js b/src/main.js index 2ca2e864..e10d76f7 100644 --- a/src/main.js +++ b/src/main.js @@ -8130,8 +8130,9 @@ function updateProfileEditLabel() { const nameChanged = nameInput?.value.trim() !== (objProfileEditSnapshot.name || ''); const statusChanged = statusInput?.value.trim() !== (objProfileEditSnapshot.status?.title ?? objProfileEditSnapshot.status ?? ''); const bioChanged = bioInput?.value.trim() !== (objProfileEditSnapshot.about || ''); + const avatarChanged = strPendingProfileAvatarPath !== null; - if (nameChanged || statusChanged || bioChanged) { + if (nameChanged || statusChanged || bioChanged || avatarChanged) { label.textContent = 'Unsaved changes made.'; label.style.opacity = '1'; } else { @@ -8201,6 +8202,7 @@ function enterProfileEditMode() { }); if (!file) return; strPendingProfileAvatarPath = file; + updateProfileEditLabel(); domProfileAvatar.src = convertFileSrc(file); }; From 02e78a65371843528a6d8c374ef925a1194f4c87 Mon Sep 17 00:00:00 2001 From: Yuurin Bee Date: Sat, 23 May 2026 21:57:59 +0700 Subject: [PATCH 06/13] Fix: Profile Edit Mode State Management --- src/main.js | 121 +++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 100 insertions(+), 21 deletions(-) diff --git a/src/main.js b/src/main.js index e10d76f7..c2e38c4b 100644 --- a/src/main.js +++ b/src/main.js @@ -858,6 +858,7 @@ const domProfileStatus = document.getElementById('profile-status'); let fProfileEditMode = false; let objProfileEditSnapshot = {}; let strPendingProfileAvatarPath = null; +let strPendingProfileBannerPath = null; const domProfileEditBtn = document.getElementById('profile-edit-btn'); const domProfileEditBar = document.getElementById('profile-edit-bar'); const domProfileEditCancelBtn = document.getElementById('profile-edit-cancel-btn'); @@ -8131,8 +8132,9 @@ function updateProfileEditLabel() { const statusChanged = statusInput?.value.trim() !== (objProfileEditSnapshot.status?.title ?? objProfileEditSnapshot.status ?? ''); const bioChanged = bioInput?.value.trim() !== (objProfileEditSnapshot.about || ''); const avatarChanged = strPendingProfileAvatarPath !== null; + const bannerChanged = strPendingProfileBannerPath !== null; - if (nameChanged || statusChanged || bioChanged || avatarChanged) { + if (nameChanged || statusChanged || bioChanged || avatarChanged || bannerChanged) { label.textContent = 'Unsaved changes made.'; label.style.opacity = '1'; } else { @@ -8147,15 +8149,38 @@ function enterProfileEditMode() { objProfileEditSnapshot = { name: cProfile.name || '', status: cProfile.status || '', - about: cProfile.about || '' + about: cProfile.about || '', + avatar: getProfileAvatarSrc(cProfile) || null, + banner: cProfile.banner || null }; + strPendingProfileAvatarPath = null; + strPendingProfileBannerPath = null; fProfileEditMode = true; domProfileEditBar.style.opacity = '0'; domProfileEditBar.style.display = 'flex'; setTimeout(() => domProfileEditBar.style.opacity = '1', 10); domProfileBackBtn.style.display = 'none'; document.querySelector('.profile-header-info').style.display = 'none'; - domProfileBanner.onclick = askForBanner; + domProfileBanner.onclick = async () => { + if (!fProfileEditMode) return; + const { open } = window.__TAURI__.dialog; + const file = await open({ + title: 'Choose Banner Image', + multiple: false, + directory: false, + filters: [{ name: 'Image', extensions: ['png', 'jpeg', 'jpg', 'gif', 'webp'] }] + }); + if (!file) return; + strPendingProfileBannerPath = file; + updateProfileEditLabel(); + if (domProfileBanner.tagName === 'DIV') { + const newBanner = document.createElement('img'); + newBanner.className = domProfileBanner.className; + domProfileBanner.replaceWith(newBanner); + domProfileBanner = newBanner; + } + domProfileBanner.src = convertFileSrc(file); + }; document.getElementById('profile-edit-btn').style.display = 'none'; document.getElementById('profile-share-btn').style.display = 'none'; document.getElementById('profile-npub-label').style.display = 'none'; @@ -8183,9 +8208,7 @@ function enterProfileEditMode() { }); const nameInput = document.querySelector('#profile-edit-name input'); const statusInput = document.querySelector('#profile-edit-status input'); - nameInput?.addEventListener('input', updateProfileEditLabel); - statusInput?.addEventListener('input', updateProfileEditLabel); bioTextarea.addEventListener('input', updateProfileEditLabel); document.getElementById('profile-edit-fields').style.display = 'flex'; @@ -8206,13 +8229,14 @@ function enterProfileEditMode() { domProfileAvatar.src = convertFileSrc(file); }; + // Reset label to clean state on entry + updateProfileEditLabel(); + const bannerContainer = document.getElementById('profile-banner-container'); const avatarContainer = document.querySelector('.profile-avatar-container'); - bannerContainer._editMoveHandler = (e) => { const bannerRect = bannerContainer.getBoundingClientRect(); const avatarRect = avatarContainer.getBoundingClientRect(); - const inBanner = e.clientY <= bannerRect.top + 200; const inAvatar = ( e.clientX >= avatarRect.left && @@ -8220,14 +8244,13 @@ function enterProfileEditMode() { e.clientY >= avatarRect.top && e.clientY <= avatarRect.bottom ); - - if (inAvatar || !inBanner) { - bannerContainer.classList.add('avatar-hovered'); - } else { - bannerContainer.classList.remove('avatar-hovered'); - } -}; -bannerContainer.addEventListener('mousemove', bannerContainer._editMoveHandler); + if (inAvatar || !inBanner) { + bannerContainer.classList.add('avatar-hovered'); + } else { + bannerContainer.classList.remove('avatar-hovered'); + } + }; + bannerContainer.addEventListener('mousemove', bannerContainer._editMoveHandler); } function exitProfileEditMode(fCancel = false) { @@ -8246,13 +8269,56 @@ function exitProfileEditMode(fCancel = false) { document.getElementById('profile-secondary-status').style.display = ''; document.getElementById('profile-description').style.display = ''; document.getElementById('profile').classList.remove('profile-edit-active'); + + // Reset label back to clean state + const label = document.getElementById('profile-edit-mode-label'); + if (label) { + label.textContent = 'Edit Mode is enabled.'; + label.style.opacity = '0.6'; + } + const cProfile = arrProfiles.find(a => a.mine); if (cProfile) { if (fCancel) { cProfile.name = objProfileEditSnapshot.name; cProfile.status = objProfileEditSnapshot.status; cProfile.about = objProfileEditSnapshot.about; - strPendingProfileAvatarPath = null; + // Revert avatar preview + if (strPendingProfileAvatarPath) { + strPendingProfileAvatarPath = null; + const originalSrc = objProfileEditSnapshot.avatar; + if (originalSrc) { + if (domProfileAvatar.tagName === 'DIV') { + const newAvatar = document.createElement('img'); + newAvatar.className = domProfileAvatar.className; + domProfileAvatar.replaceWith(newAvatar); + domProfileAvatar = newAvatar; + } + domProfileAvatar.src = originalSrc; + } else { + const placeholder = createPlaceholderAvatar(false, 175); + placeholder.classList.add('profile-avatar'); + domProfileAvatar.replaceWith(placeholder); + domProfileAvatar = placeholder; + } + } + // Revert banner preview + if (strPendingProfileBannerPath) { + strPendingProfileBannerPath = null; + const originalBannerSrc = objProfileEditSnapshot.banner; + if (originalBannerSrc) { + if (domProfileBanner.tagName === 'DIV') { + const newBanner = document.createElement('img'); + newBanner.className = domProfileBanner.className; + domProfileBanner.replaceWith(newBanner); + domProfileBanner = newBanner; + } + domProfileBanner.src = originalBannerSrc; + } else { + domProfileBanner.src = ''; + domProfileBanner.style.backgroundColor = 'rgb(27, 27, 27)'; + } + } } else { const nameInput = document.querySelector('#profile-edit-name input'); const statusInput = document.querySelector('#profile-edit-status input'); @@ -8264,14 +8330,10 @@ function exitProfileEditMode(fCancel = false) { const prevStatus = objProfileEditSnapshot.status?.title ?? objProfileEditSnapshot.status ?? ''; const prevAbout = objProfileEditSnapshot.about || ''; - // Optimistic update so the UI reflects the save instantly. cProfile.name = newName; if (cProfile.status) cProfile.status.title = newStatus; cProfile.about = newAbout; - // Persist to the network. Each field maps to its own backend - // call; only fire on actual changes to avoid pointless relay - // chatter and stray kind-0 / kind-30315 events. const nameChanged = newName !== prevName; const aboutChanged = newAbout !== prevAbout; const statusChanged = newStatus !== prevStatus; @@ -8305,6 +8367,23 @@ function exitProfileEditMode(fCancel = false) { .catch(e => popupConfirm('Avatar Upload Failed!', escapeHtml(String(e)), true, '', 'vector_warning.svg')); strPendingProfileAvatarPath = null; } + if (strPendingProfileBannerPath) { + invoke('upload_avatar', { filepath: strPendingProfileBannerPath, uploadType: 'banner' }) + .then(bannerUrl => { + if (bannerUrl) { + invoke('update_profile', { + name: '', + avatar: '', + banner: bannerUrl, + about: '', + }).then(ok => { + if (!ok) popupConfirm('Banner Update Failed!', 'Failed to broadcast banner update to the network.', true, '', 'vector_warning.svg'); + }).catch(e => popupConfirm('Banner Update Failed!', escapeHtml(String(e)), true, '', 'vector_warning.svg')); + } + }) + .catch(e => popupConfirm('Banner Upload Failed!', escapeHtml(String(e)), true, '', 'vector_warning.svg')); + strPendingProfileBannerPath = null; + } showToast('Profile Saved'); } @@ -8316,7 +8395,7 @@ function exitProfileEditMode(fCancel = false) { if (_bc._editMoveHandler) { _bc.removeEventListener('mousemove', _bc._editMoveHandler); _bc._editMoveHandler = null; -} + } } function editProfileDescription() { From 26388fb8a17c4a273668ea9b37f968ccc52894a3 Mon Sep 17 00:00:00 2001 From: Yuurin Bee Date: Sat, 23 May 2026 22:03:21 +0700 Subject: [PATCH 07/13] Refactor: Remove Duplicate Onclick Assignments for Name/Status in renderProfileTab --- src/main.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main.js b/src/main.js index c2e38c4b..56d91553 100644 --- a/src/main.js +++ b/src/main.js @@ -4589,9 +4589,7 @@ function renderProfileTab(cProfile) { document.getElementById('profile-status').style.display = 'none'; // Configure other clickables - domProfileName.onclick = askForUsername; domProfileName.classList.add('btn'); - domProfileStatus.onclick = askForStatus; domProfileStatus.classList.add('btn'); domProfileName.onclick = () => { if (fProfileEditMode) askForUsername(); }; domProfileStatus.onclick = () => { if (fProfileEditMode) askForStatus(); }; From 88bb4d38461b686a387124c863e7e92e304cffc3 Mon Sep 17 00:00:00 2001 From: Yuurin Bee Date: Sat, 23 May 2026 22:04:22 +0700 Subject: [PATCH 08/13] Add btn class to Avatar in Profile Edit Mode for Hover Cursor --- src/main.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main.js b/src/main.js index 56d91553..cae6e65e 100644 --- a/src/main.js +++ b/src/main.js @@ -8212,6 +8212,7 @@ function enterProfileEditMode() { document.getElementById('profile-edit-fields').style.display = 'flex'; document.getElementById('profile').classList.add('profile-edit-active'); + domProfileAvatar.classList.add('btn'); domProfileAvatar.onclick = async () => { if (!fProfileEditMode) return; const { open } = window.__TAURI__.dialog; From adf4ae4cfb64bc1e91b17248da00cf1095cb4075 Mon Sep 17 00:00:00 2001 From: Yuurin Bee Date: Sat, 23 May 2026 22:05:44 +0700 Subject: [PATCH 09/13] Refactor: Remove Empty if (cProfile.mine) Block in Avatar onerror Handler --- src/main.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main.js b/src/main.js index cae6e65e..3d96cc8a 100644 --- a/src/main.js +++ b/src/main.js @@ -4465,8 +4465,6 @@ function renderProfileTab(cProfile) { domProfileAvatar.onerror = function() { const placeholder = createPlaceholderAvatar(false, 175); placeholder.classList.add('profile-avatar'); - if (cProfile.mine) { - } domProfileAvatar.replaceWith(placeholder); domProfileAvatar = placeholder; }; From 3618861b8a51a4c7f34748376f6bfcdd1167abae Mon Sep 17 00:00:00 2001 From: Yuurin Bee Date: Sat, 23 May 2026 22:16:24 +0700 Subject: [PATCH 10/13] Trivial: Adjust Text Color & Messaging Opacity --- src/main.js | 12 ++++++------ src/styles.css | 5 +++++ 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/main.js b/src/main.js index 3d96cc8a..5eb1ed89 100644 --- a/src/main.js +++ b/src/main.js @@ -8131,11 +8131,11 @@ function updateProfileEditLabel() { const bannerChanged = strPendingProfileBannerPath !== null; if (nameChanged || statusChanged || bioChanged || avatarChanged || bannerChanged) { - label.textContent = 'Unsaved changes made.'; - label.style.opacity = '1'; + label.textContent = 'Unsaved Changes Made'; + label.style.opacity = '0.8'; } else { - label.textContent = 'Edit Mode is enabled.'; - label.style.opacity = '0.6'; + label.textContent = 'Edit Mode is Enabled'; + label.style.opacity = '0.8'; } } @@ -8270,8 +8270,8 @@ function exitProfileEditMode(fCancel = false) { // Reset label back to clean state const label = document.getElementById('profile-edit-mode-label'); if (label) { - label.textContent = 'Edit Mode is enabled.'; - label.style.opacity = '0.6'; + label.textContent = 'Edit Mode is Enabled'; + label.style.opacity = '0.8'; } const cProfile = arrProfiles.find(a => a.mine); diff --git a/src/styles.css b/src/styles.css index 9a62c9d7..d931e02f 100644 --- a/src/styles.css +++ b/src/styles.css @@ -1416,6 +1416,11 @@ html, body { -moz-user-select: none; } +#profile-edit-mode-label { + color: rgba(255, 255, 255, 0.6); + font-size: 12px; +} + #profile-edit-cancel-btn .icon, #profile-edit-cancel-btn span, #profile-edit-save-btn .icon, From 20ca99bbba2751c2825afce36814b71a1692e186 Mon Sep 17 00:00:00 2001 From: Yuurin Bee Date: Sat, 23 May 2026 22:32:48 +0700 Subject: [PATCH 11/13] Fix: Allow Users to Delete Bio & Save Empty --- src/main.js | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/main.js b/src/main.js index 5eb1ed89..f7ffa5f4 100644 --- a/src/main.js +++ b/src/main.js @@ -8339,7 +8339,7 @@ function exitProfileEditMode(fCancel = false) { name: nameChanged ? newName : '', avatar: '', banner: '', - about: aboutChanged ? newAbout : '', + about: aboutChanged ? (newAbout.length > 0 ? newAbout : ' ') : '', }).then(ok => { if (!ok) popupConfirm('Profile Update Failed!', 'Failed to broadcast profile update to the network.', true, '', 'vector_warning.svg'); }).catch(e => popupConfirm('Profile Update Failed!', escapeHtml(String(e)), true, '', 'vector_warning.svg')); @@ -8420,9 +8420,7 @@ function editProfileDescription() { domProfileDescriptionEditor.onblur = null; // If nothing was edited, don't change anything - if (!domProfileDescriptionEditor.value || - domProfileDescriptionEditor.value === cProfile.about - ) return; + if (domProfileDescriptionEditor.value === cProfile.about) return; // Update the profile's about property cProfile.about = domProfileDescriptionEditor.value; @@ -8432,7 +8430,14 @@ function editProfileDescription() { twemojify(domProfileDescription); // Upload new About Me to Nostr - setAboutMe(cProfile.about); + invoke('update_profile', { + name: '', + avatar: '', + banner: '', + about: cProfile.about, + }).then(ok => { + if (!ok) popupConfirm('Bio Update Failed!', 'Failed to broadcast bio update to the network.', true, '', 'vector_warning.svg'); + }).catch(e => popupConfirm('Bio Update Failed!', escapeHtml(String(e)), true, '', 'vector_warning.svg')); }; // Resize it to match the content size (CSS cannot scale textareas based on content) From 45e2c60f2c40fff1f52817bf7076741a0711f72e Mon Sep 17 00:00:00 2001 From: Yuurin Bee Date: Sat, 23 May 2026 22:49:18 +0700 Subject: [PATCH 12/13] Fix: Rendering Issue with Contact Avatar & Name Display on Chat Screen --- src/js/render/chatlist/list.js | 2 +- src/js/render/chatlist/row.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/js/render/chatlist/list.js b/src/js/render/chatlist/list.js index a24a2f47..00fe4e42 100644 --- a/src/js/render/chatlist/list.js +++ b/src/js/render/chatlist/list.js @@ -31,7 +31,7 @@ function generateChatlistStateHash() { // Add chat states (including chat ID to capture order changes) for (const chat of arrChats) { const isGroup = chat.chat_type === 'MlsGroup'; - const profile = !isGroup && chat.participants.length === 1 ? getProfile(chat.id) : null; + const profile = !isGroup ? getProfile(chat.id) : null; const cLastMsg = chat.messages[chat.messages.length - 1]; const nUnread = computeRowBadgeCount(chat); const activeTypers = chat.active_typers || []; diff --git a/src/js/render/chatlist/row.js b/src/js/render/chatlist/row.js index 7b0064d4..463f275c 100644 --- a/src/js/render/chatlist/row.js +++ b/src/js/render/chatlist/row.js @@ -16,7 +16,7 @@ function renderChat(chat, primaryColor) { // For groups, we don't have a profile, for DMs we do const isGroup = chat.chat_type === 'MlsGroup'; - const profile = !isGroup && chat.participants.length === 1 ? getProfile(chat.id) : null; + const profile = !isGroup ? getProfile(chat.id) : null; // Muted DMs stay silent; muted groups still surface pings (mentions of // you / admin @everyone). See `computeRowBadgeCount` for the policy. From fa8e452f78205b78dbfafaa570b12790d41132a7 Mon Sep 17 00:00:00 2001 From: Yuurin Bee Date: Sun, 24 May 2026 01:51:22 +0700 Subject: [PATCH 13/13] Adjust Spacing for Continuous Messages & Padding on Custom Sound Notification Upload --- src/styles.css | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/styles.css b/src/styles.css index d931e02f..25149a2d 100644 --- a/src/styles.css +++ b/src/styles.css @@ -13766,6 +13766,7 @@ hr { display: flex; align-items: center; text-align: center; + margin-top: 20px; margin-bottom: 10px; } @@ -14035,7 +14036,7 @@ hr { --dmsg-row-padding-y: 0px; --dmsg-row-padding-x: 2px; --dmsg-streak-gap: 16px; - --dmsg-continuation-gap: 2px; + --dmsg-continuation-gap: 3px; --dmsg-gutter-width: 56px; --dmsg-avatar-size: 40px; --dmsg-author-color: #ffffff;