diff --git a/CHANGELOG.md b/CHANGELOG.md index 7baf3c7..fd931d9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [1.29.0](https://github.com/rodrigogs/whats-reader/compare/v1.28.0...v1.29.0) (2026-01-05) + + +### Features + +* improve bookmark button positioning and UI responsiveness ([68327cb](https://github.com/rodrigogs/whats-reader/commit/68327cb6d0119ce28ea1d66828a66f272199bc85)) + # [1.28.0](https://github.com/rodrigogs/whats-reader/compare/v1.27.0...v1.28.0) (2026-01-05) diff --git a/package-lock.json b/package-lock.json index 20f75e1..caa4ec5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "whats-reader", - "version": "1.28.0", + "version": "1.29.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "whats-reader", - "version": "1.28.0", + "version": "1.29.0", "license": "AGPL-3.0", "dependencies": { "@floating-ui/dom": "^1.7.4", diff --git a/package.json b/package.json index 6a36218..3a38da4 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "whats-reader", "productName": "WhatsApp Backup Reader", - "version": "1.28.0", + "version": "1.29.0", "description": "A desktop app to read and visualize WhatsApp chat exports", "license": "AGPL-3.0", "author": { diff --git a/src/lib/components/MessageBubble.svelte b/src/lib/components/MessageBubble.svelte index 581096e..51aad99 100644 --- a/src/lib/components/MessageBubble.svelte +++ b/src/lib/components/MessageBubble.svelte @@ -88,9 +88,7 @@ $effect(() => { }); const bubbleClass = $derived( - isOwn - ? 'bg-[var(--color-message-out)] ml-auto' - : 'bg-[var(--color-message-in)] mr-auto', + isOwn ? 'bg-[var(--color-message-out)]' : 'bg-[var(--color-message-in)]', ); // Use wider bubble for audio messages to fit the audio player @@ -209,8 +207,16 @@ function highlightText(text: string, query: string): string { // Combine and sort all markers const markers: Array< - | { type: 'url'; pos: number; data: { start: number; end: number; url: string } } - | { type: 'search'; pos: number; data: { start: number; end: number; text: string } } + | { + type: 'url'; + pos: number; + data: { start: number; end: number; url: string }; + } + | { + type: 'search'; + pos: number; + data: { start: number; end: number; text: string }; + } > = []; urls.forEach((url) => { @@ -277,7 +283,7 @@ function linkifyText(text: string): string { let lastIndex = 0; let result = ''; let match; - + while ((match = urlRegex.exec(text)) !== null) { // Add text before the URL, escaped result += escapeHtml(text.slice(lastIndex, match.index)); @@ -286,7 +292,7 @@ function linkifyText(text: string): string { result += `${escapeHtml(url)}`; lastIndex = match.index + url.length; } - + // Add the rest of the text, escaped result += escapeHtml(text.slice(lastIndex)); return result; @@ -326,6 +332,22 @@ async function transcribeVoiceMessage() { } +{#snippet bookmarkButton(isBookmarked: boolean, className: string)} + +{/snippet} + {#if message.isSystemMessage} {@const isBookmarked = bookmarkedMessageIds.has(message.id)} @@ -340,19 +362,7 @@ async function transcribeVoiceMessage() {