From 70f99f049953d2809959cab1550c4be87d447e66 Mon Sep 17 00:00:00 2001 From: WCY-dt <834421194@qq.com> Date: Mon, 21 Sep 2026 01:03:50 +0800 Subject: [PATCH 01/11] release: Upgrade version to v1.3.37 --- CHANGELOG.md | 2 ++ README.md | 2 +- README_zh.md | 2 +- build/config.yml | 4 ++-- build/darwin/Info.dev.plist | 4 ++-- build/darwin/Info.plist | 4 ++-- build/darwin/Taskfile.yml | 4 ++-- build/darwin/create-dmg.sh | 2 +- build/ios/Info.dev.plist | 4 ++-- build/ios/Info.plist | 4 ++-- build/ios/build.sh | 4 ++-- build/linux/Taskfile.yml | 2 +- build/linux/create-appimage.sh | 2 +- build/linux/nfpm/nfpm.yaml | 2 +- build/windows/info.json | 4 ++-- build/windows/installer.nsi | 4 ++-- build/windows/nsis/wails_tools.nsh | 2 +- build/windows/wails.exe.manifest | 2 +- docs/SERVER_MODE/swagger.json | 2 +- frontend/package-lock.json | 4 ++-- frontend/package.json | 2 +- internal/version/version.go | 2 +- main-core.go | 2 +- skills/mrrss-assistant/references/api.md | 2 +- website/package-lock.json | 4 ++-- website/package.json | 2 +- 26 files changed, 38 insertions(+), 36 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 11babb12..460c7fc2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,8 @@ All notable changes to MrRSS will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [Unreleased] + ## [1.3.36] - 2026-09-20 ### Added diff --git a/README.md b/README.md index 613adfe5..b7c2b684 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ English | 简体中文

-[![Version](https://img.shields.io/badge/version-1.3.36-blue.svg)](https://github.com/DevXDojo/MrRSS/releases) +[![Version](https://img.shields.io/badge/version-1.3.37-blue.svg)](https://github.com/DevXDojo/MrRSS/releases) [![License](https://img.shields.io/badge/license-GPLv3-green.svg)](LICENSE) [![Go](https://img.shields.io/badge/Go-1.27+-00ADD8?logo=go)](https://go.dev/) [![Wails](https://img.shields.io/badge/Wails-v3%20alpha-red)](https://wails.io/) diff --git a/README_zh.md b/README_zh.md index 2ce870b6..753a63ae 100644 --- a/README_zh.md +++ b/README_zh.md @@ -8,7 +8,7 @@ English | 简体中文

-[![Version](https://img.shields.io/badge/version-1.3.36-blue.svg)](https://github.com/DevXDojo/MrRSS/releases) +[![Version](https://img.shields.io/badge/version-1.3.37-blue.svg)](https://github.com/DevXDojo/MrRSS/releases) [![License](https://img.shields.io/badge/license-GPLv3-green.svg)](LICENSE) [![Go](https://img.shields.io/badge/Go-1.27+-00ADD8?logo=go)](https://go.dev/) [![Wails](https://img.shields.io/badge/Wails-v3%20alpha-red)](https://wails.io/) diff --git a/build/config.yml b/build/config.yml index 1f852d07..5187fc1c 100644 --- a/build/config.yml +++ b/build/config.yml @@ -11,7 +11,7 @@ info: description: "A modern, standalone RSS reader" # The application description copyright: "Copyright © 2026" # Copyright text comments: "Built with Wails" # Comments - version: "1.3.36" # The application version + version: "1.3.37" # The application version # iOS build configuration (uncomment to customise iOS project generation) # Note: Keys under `ios` OVERRIDE values under `info` when set. @@ -21,7 +21,7 @@ info: # # The display name shown under the app icon (CFBundleDisplayName/CFBundleName) # displayName: "MrRSS" # # The app version to embed in Info.plist (CFBundleShortVersionString/CFBundleVersion) -# version: "1.3.36" +# version: "1.3.37" # # The company/organisation name for templates and project settings # company: "Ch3nyang" # # Additional comments to embed in Info.plist metadata diff --git a/build/darwin/Info.dev.plist b/build/darwin/Info.dev.plist index 1ea37049..dee0b6fe 100644 --- a/build/darwin/Info.dev.plist +++ b/build/darwin/Info.dev.plist @@ -10,11 +10,11 @@ CFBundleIdentifier com.mrrss.app CFBundleVersion - 1.3.36 + 1.3.37 CFBundleGetInfoString Built with Wails CFBundleShortVersionString - 1.3.36 + 1.3.37 CFBundleIconFile icons LSMinimumSystemVersion diff --git a/build/darwin/Info.plist b/build/darwin/Info.plist index 88444ac8..cdad3ad7 100644 --- a/build/darwin/Info.plist +++ b/build/darwin/Info.plist @@ -10,11 +10,11 @@ CFBundleIdentifier com.mrrss.app CFBundleVersion - 1.3.36 + 1.3.37 CFBundleGetInfoString Built with Wails CFBundleShortVersionString - 1.3.36 + 1.3.37 CFBundleIconFile icons LSMinimumSystemVersion diff --git a/build/darwin/Taskfile.yml b/build/darwin/Taskfile.yml index 9b4f8338..c82a4fb7 100644 --- a/build/darwin/Taskfile.yml +++ b/build/darwin/Taskfile.yml @@ -72,9 +72,9 @@ tasks: CFBundlePackageType APPL CFBundleShortVersionString - 1.3.36 + 1.3.37 CFBundleVersion - 1.3.36 + 1.3.37 LSMinimumSystemVersion 10.13 NSHighResolutionCapable diff --git a/build/darwin/create-dmg.sh b/build/darwin/create-dmg.sh index 740ee40e..87c6c616 100644 --- a/build/darwin/create-dmg.sh +++ b/build/darwin/create-dmg.sh @@ -12,7 +12,7 @@ set -e APP_NAME="MrRSS" # Get version from frontend/package.json if available, otherwise use default -VERSION=$(grep -o '"version"[[:space:]]*:[[:space:]]*"[^"]*"' frontend/package.json 2>/dev/null | head -1 | sed 's/.*"\([^"]*\)".*/\1/' || echo "1.3.36") +VERSION=$(grep -o '"version"[[:space:]]*:[[:space:]]*"[^"]*"' frontend/package.json 2>/dev/null | head -1 | sed 's/.*"\([^"]*\)".*/\1/' || echo "1.3.37") APP_PUBLISHER="Ch3nyang" APP_URL="https://github.com/DevXDojo/MrRSS" APP_DESCRIPTION="A Modern, Cross-Platform Desktop RSS Reader" diff --git a/build/ios/Info.dev.plist b/build/ios/Info.dev.plist index 00a3061d..1fe79923 100644 --- a/build/ios/Info.dev.plist +++ b/build/ios/Info.dev.plist @@ -13,9 +13,9 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.3.36-dev + 1.3.37-dev CFBundleVersion - 1.3.36 + 1.3.37 LSRequiresIPhoneOS MinimumOSVersion diff --git a/build/ios/Info.plist b/build/ios/Info.plist index f586e85e..3f0e32ca 100644 --- a/build/ios/Info.plist +++ b/build/ios/Info.plist @@ -13,9 +13,9 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.3.36 + 1.3.37 CFBundleVersion - 1.3.36 + 1.3.37 LSRequiresIPhoneOS MinimumOSVersion diff --git a/build/ios/build.sh b/build/ios/build.sh index 65261008..a26ac527 100644 --- a/build/ios/build.sh +++ b/build/ios/build.sh @@ -4,8 +4,8 @@ set -e # Build configuration APP_NAME="MrRSS" BUNDLE_ID="com.mrrss.app" -VERSION="1.3.36" -BUILD_NUMBER="1.3.36" +VERSION="1.3.37" +BUILD_NUMBER="1.3.37" BUILD_DIR="build/ios" TARGET="simulator" diff --git a/build/linux/Taskfile.yml b/build/linux/Taskfile.yml index af0f05c4..b655750f 100644 --- a/build/linux/Taskfile.yml +++ b/build/linux/Taskfile.yml @@ -124,7 +124,7 @@ tasks: cmds: - cd {{.BIN_DIR}} && tar -czf {{.APP_NAME}}-{{.VERSION}}-linux-{{.ARCH}}.tar.gz {{.APP_NAME}} vars: - VERSION: '1.3.36' + VERSION: '1.3.37' ARCH: '{{.ARCH | default "amd64"}}' generate:dotdesktop: diff --git a/build/linux/create-appimage.sh b/build/linux/create-appimage.sh index 12f49ed6..c6302d23 100755 --- a/build/linux/create-appimage.sh +++ b/build/linux/create-appimage.sh @@ -13,7 +13,7 @@ set -e APP_NAME="MrRSS" # Get version from frontend/package.json if available, otherwise use default -VERSION=$(grep -o '"version"[[:space:]]*:[[:space:]]*"[^"]*"' frontend/package.json 2>/dev/null | head -1 | sed 's/.*"\([^"]*\)".*/\1/' || echo "1.3.36") +VERSION=$(grep -o '"version"[[:space:]]*:[[:space:]]*"[^"]*"' frontend/package.json 2>/dev/null | head -1 | sed 's/.*"\([^"]*\)".*/\1/' || echo "1.3.37") # Get architecture from environment variable or default to amd64 ARCH=${ARCH:-amd64} echo "Target architecture: ${ARCH}" diff --git a/build/linux/nfpm/nfpm.yaml b/build/linux/nfpm/nfpm.yaml index ff461f85..56f26a1e 100644 --- a/build/linux/nfpm/nfpm.yaml +++ b/build/linux/nfpm/nfpm.yaml @@ -6,7 +6,7 @@ name: "MrRSS" arch: ${GOARCH} platform: "linux" -version: "1.3.36" +version: "1.3.37" section: "default" priority: "extra" maintainer: ${GIT_COMMITTER_NAME} <${GIT_COMMITTER_EMAIL}> diff --git a/build/windows/info.json b/build/windows/info.json index d92d96f6..3209b0de 100644 --- a/build/windows/info.json +++ b/build/windows/info.json @@ -1,10 +1,10 @@ { "fixed": { - "file_version": "1.3.36" + "file_version": "1.3.37" }, "info": { "0000": { - "ProductVersion": "1.3.36", + "ProductVersion": "1.3.37", "CompanyName": "Ch3nyang", "FileDescription": "MrRSS", "LegalCopyright": "Copyright © 2026", diff --git a/build/windows/installer.nsi b/build/windows/installer.nsi index 0559ba64..9101f2ca 100644 --- a/build/windows/installer.nsi +++ b/build/windows/installer.nsi @@ -9,8 +9,8 @@ ; All paths in this script are relative to the script directory. !define APP_NAME "MrRSS" -!define APP_VERSION "1.3.36" -!define APP_VERSION_NUMERIC "1.3.36.0" ; NSIS requires X.X.X.X format +!define APP_VERSION "1.3.37" +!define APP_VERSION_NUMERIC "1.3.37.0" ; NSIS requires X.X.X.X format !define APP_PUBLISHER "Ch3nyang" !define APP_URL "https://github.com/DevXDojo/MrRSS" !define APP_DESCRIPTION "A Modern, Cross-Platform Desktop RSS Reader" diff --git a/build/windows/nsis/wails_tools.nsh b/build/windows/nsis/wails_tools.nsh index 8096b669..08afbfdd 100644 --- a/build/windows/nsis/wails_tools.nsh +++ b/build/windows/nsis/wails_tools.nsh @@ -14,7 +14,7 @@ !define INFO_PRODUCTNAME "MrRSS" !endif !ifndef INFO_PRODUCTVERSION - !define INFO_PRODUCTVERSION "1.3.36" + !define INFO_PRODUCTVERSION "1.3.37" !endif !ifndef INFO_COPYRIGHT !define INFO_COPYRIGHT "Copyright © 2026" diff --git a/build/windows/wails.exe.manifest b/build/windows/wails.exe.manifest index 2b79da19..d587e2ba 100644 --- a/build/windows/wails.exe.manifest +++ b/build/windows/wails.exe.manifest @@ -1,6 +1,6 @@ - + diff --git a/docs/SERVER_MODE/swagger.json b/docs/SERVER_MODE/swagger.json index b8d794c6..9193b79d 100644 --- a/docs/SERVER_MODE/swagger.json +++ b/docs/SERVER_MODE/swagger.json @@ -12,7 +12,7 @@ "name": "GPL-3.0", "url": "https://www.gnu.org/licenses/gpl-3.0.en.html" }, - "version": "1.3.36" + "version": "1.3.37" }, "host": "localhost:1234", "basePath": "/api", diff --git a/frontend/package-lock.json b/frontend/package-lock.json index b08a6730..934bc175 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,12 +1,12 @@ { "name": "mrrss-frontend", - "version": "1.3.36", + "version": "1.3.37", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "mrrss-frontend", - "version": "1.3.36", + "version": "1.3.37", "dependencies": { "@eslint/js": "^10.0.1", "@phosphor-icons/vue": "^2.2.1", diff --git a/frontend/package.json b/frontend/package.json index 0ed57cb8..fe8c4ed4 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,7 +1,7 @@ { "name": "mrrss-frontend", "private": true, - "version": "1.3.36", + "version": "1.3.37", "type": "module", "scripts": { "dev": "vite", diff --git a/internal/version/version.go b/internal/version/version.go index 801e5a05..e541a4e5 100644 --- a/internal/version/version.go +++ b/internal/version/version.go @@ -1,4 +1,4 @@ package version // Version is the current application version -const Version = "1.3.36" +const Version = "1.3.37" diff --git a/main-core.go b/main-core.go index ec1f7bf1..d1891d70 100644 --- a/main-core.go +++ b/main-core.go @@ -31,7 +31,7 @@ import ( ) // @title MrRSS API -// @version 1.3.36 +// @version 1.3.37 // @description MrRSS is a modern, cross-platform desktop RSS reader with auto-translation, smart feed discovery, and AI-powered summarization. // @contact.name API Support diff --git a/skills/mrrss-assistant/references/api.md b/skills/mrrss-assistant/references/api.md index 98d058fb..e9e525be 100644 --- a/skills/mrrss-assistant/references/api.md +++ b/skills/mrrss-assistant/references/api.md @@ -6,7 +6,7 @@ Generated from `docs/SERVER_MODE/swagger.json`. Regenerate with: python skills/mrrss-assistant/scripts/generate_api_reference.py docs/SERVER_MODE/swagger.json skills/mrrss-assistant/references/api.md ``` -- API version: `1.3.36` +- API version: `1.3.37` - API root: `{base_url}/api` - Endpoint paths below are relative to the API root unless they already start with `/api/`. diff --git a/website/package-lock.json b/website/package-lock.json index 3723af1f..8869bd6a 100644 --- a/website/package-lock.json +++ b/website/package-lock.json @@ -1,12 +1,12 @@ { "name": "mrrss-website", - "version": "1.3.36", + "version": "1.3.37", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "mrrss-website", - "version": "1.3.36", + "version": "1.3.37", "dependencies": { "@phosphor-icons/vue": "^2.2.1", "vue": "^3.5.42" diff --git a/website/package.json b/website/package.json index 42ce835a..cd800cfc 100644 --- a/website/package.json +++ b/website/package.json @@ -1,6 +1,6 @@ { "name": "mrrss-website", - "version": "1.3.36", + "version": "1.3.37", "description": "MrRSS - AI-Powered RSS Reader Landing Page", "type": "module", "scripts": { From ad783778d1c950dc1bd1f46a623af7dd07d3d146 Mon Sep 17 00:00:00 2001 From: WCY-dt <834421194@qq.com> Date: Mon, 21 Sep 2026 01:18:37 +0800 Subject: [PATCH 02/11] fix: isolate article images from chat UI (#1212) --- .../components/article/ArticleDetailModal.vue | 3 +- .../composables/article/useArticleDetail.ts | 23 +++++++------- frontend/src/utils/articleContentDom.test.ts | 30 +++++++++++++++++++ frontend/src/utils/articleContentDom.ts | 13 ++++++++ 4 files changed, 55 insertions(+), 14 deletions(-) create mode 100644 frontend/src/utils/articleContentDom.test.ts create mode 100644 frontend/src/utils/articleContentDom.ts diff --git a/frontend/src/components/article/ArticleDetailModal.vue b/frontend/src/components/article/ArticleDetailModal.vue index 5d9b5c19..615ef646 100644 --- a/frontend/src/components/article/ArticleDetailModal.vue +++ b/frontend/src/components/article/ArticleDetailModal.vue @@ -11,6 +11,7 @@ import FindInPage from '../common/FindInPage.vue'; import type { Article } from '@/types/models'; import { openInBrowser } from '@/utils/browser'; import { useSettings } from '@/composables/core/useSettings'; +import { queryArticleContentImages } from '@/utils/articleContentDom'; interface Props { article: Article; @@ -266,7 +267,7 @@ function attachImageEventListeners() { const contentEl = document.querySelector('.modal-prose-content'); if (!contentEl) return; - const images = contentEl.querySelectorAll('img'); + const images = queryArticleContentImages(contentEl); const allImages: string[] = []; images.forEach((img) => { diff --git a/frontend/src/composables/article/useArticleDetail.ts b/frontend/src/composables/article/useArticleDetail.ts index c2310055..c7ac0601 100644 --- a/frontend/src/composables/article/useArticleDetail.ts +++ b/frontend/src/composables/article/useArticleDetail.ts @@ -3,6 +3,11 @@ import { useAppStore } from '@/stores/app'; import { useI18n } from 'vue-i18n'; import { openInBrowser } from '@/utils/browser'; import type { Article } from '@/types/models'; +import { + hasArticleContent, + queryArticleContentImages, + queryArticleContentLinks, +} from '@/utils/articleContentDom'; import { proxyImagesInHtml, isMediaCacheEnabled } from '@/utils/mediaProxy'; import { loadArticleContent, invalidateArticleContent } from '@/utils/articleContentCache'; @@ -374,7 +379,7 @@ export function useArticleDetail() { // Works on both main content and translated content function unwrapImagesFromLinks() { // Process all links in prose content (both main content and translations) - const links = document.querySelectorAll('.prose-content a, .prose a'); + const links = queryArticleContentLinks(); const linksToProcess: HTMLAnchorElement[] = []; // Collect links that contain images (check both direct children and nested) @@ -414,15 +419,11 @@ export function useArticleDetail() { unwrapImagesFromLinks(); // Get all images in prose content (use more specific selector) - const proseContainers = document.querySelectorAll('[data-article-content] .prose-content'); - - if (proseContainers.length === 0) { + if (!hasArticleContent()) { return; } - const images = document.querySelectorAll( - '[data-article-content] .prose-content img' - ); + const images = queryArticleContentImages(); // Process images if there are any if (images.length > 0) { @@ -464,11 +465,7 @@ export function useArticleDetail() { } // Collect all images from the article content - const allImages = Array.from( - document.querySelectorAll( - '[data-article-content] .prose-content img' - ) - ) + const allImages = queryArticleContentImages() .filter((img) => { // Filter out small icons return !(img.height <= 24 && img.height > 0); @@ -554,7 +551,7 @@ export function useArticleDetail() { // Works for dynamically added content (e.g., translations) function attachLinkEventListeners() { // Get all text-only links (no images) in prose content - const links = document.querySelectorAll('.prose-content a, .prose a'); + const links = queryArticleContentLinks(); links.forEach((link) => { try { diff --git a/frontend/src/utils/articleContentDom.test.ts b/frontend/src/utils/articleContentDom.test.ts new file mode 100644 index 00000000..71c2c42c --- /dev/null +++ b/frontend/src/utils/articleContentDom.test.ts @@ -0,0 +1,30 @@ +import { describe, expect, it } from 'vitest'; +import { + hasArticleContent, + queryArticleContentImages, + queryArticleContentLinks, +} from './articleContentDom'; + +describe('article content DOM queries', () => { + it('excludes images and links rendered by adjacent AI chat UI', () => { + document.body.innerHTML = ` + + `; + + const modal = document.querySelector('.modal-prose-content')!; + expect(hasArticleContent(modal)).toBe(true); + expect(queryArticleContentImages(modal).map((image) => image.id)).toEqual(['article-image']); + expect(queryArticleContentLinks(modal).map((link) => link.href)).toEqual([ + 'https://example.com/article', + ]); + }); +}); diff --git a/frontend/src/utils/articleContentDom.ts b/frontend/src/utils/articleContentDom.ts new file mode 100644 index 00000000..cfbf5755 --- /dev/null +++ b/frontend/src/utils/articleContentDom.ts @@ -0,0 +1,13 @@ +const ARTICLE_CONTENT_SELECTOR = '[data-article-content] .prose-content'; + +export function queryArticleContentImages(root: ParentNode = document): HTMLImageElement[] { + return Array.from(root.querySelectorAll(`${ARTICLE_CONTENT_SELECTOR} img`)); +} + +export function queryArticleContentLinks(root: ParentNode = document): HTMLAnchorElement[] { + return Array.from(root.querySelectorAll(`${ARTICLE_CONTENT_SELECTOR} a`)); +} + +export function hasArticleContent(root: ParentNode = document): boolean { + return root.querySelector(ARTICLE_CONTENT_SELECTOR) !== null; +} From d14f3d00824f38428e008513d3a48b844800292f Mon Sep 17 00:00:00 2001 From: WCY-dt <834421194@qq.com> Date: Mon, 21 Sep 2026 01:18:59 +0800 Subject: [PATCH 03/11] fix: close card context menus through overlays (#1213) --- .../src/components/common/ContextMenu.test.ts | 29 +++++++++++++++++++ .../src/components/common/ContextMenu.vue | 9 +++--- 2 files changed, 34 insertions(+), 4 deletions(-) create mode 100644 frontend/src/components/common/ContextMenu.test.ts diff --git a/frontend/src/components/common/ContextMenu.test.ts b/frontend/src/components/common/ContextMenu.test.ts new file mode 100644 index 00000000..13a80c96 --- /dev/null +++ b/frontend/src/components/common/ContextMenu.test.ts @@ -0,0 +1,29 @@ +import { mount } from '@vue/test-utils'; +import { afterEach, describe, expect, it } from 'vitest'; +import ContextMenu from './ContextMenu.vue'; + +afterEach(() => { + document.body.innerHTML = ''; +}); + +describe('ContextMenu', () => { + it('closes when an overlay stops bubbling outside clicks', async () => { + const wrapper = mount(ContextMenu, { + attachTo: document.body, + props: { + items: [{ label: 'Action', action: 'action' }], + x: 10, + y: 10, + }, + }); + await new Promise((resolve) => window.setTimeout(resolve, 0)); + + const overlay = document.createElement('div'); + overlay.addEventListener('click', (event) => event.stopPropagation()); + document.body.appendChild(overlay); + overlay.dispatchEvent(new MouseEvent('click', { bubbles: true })); + + expect(wrapper.emitted('close')).toHaveLength(1); + wrapper.unmount(); + }); +}); diff --git a/frontend/src/components/common/ContextMenu.vue b/frontend/src/components/common/ContextMenu.vue index aa877f77..8477e10b 100644 --- a/frontend/src/components/common/ContextMenu.vue +++ b/frontend/src/components/common/ContextMenu.vue @@ -115,8 +115,9 @@ onMounted(() => { // Use setTimeout to avoid catching the event that opened the menu document.addEventListener('keydown', handleKeyDown, true); listenerTimer = setTimeout(() => { - document.addEventListener('click', handleClickOutside); - document.addEventListener('contextmenu', handleClickOutside); + // Capture outside presses before card/detail overlays stop propagation. + document.addEventListener('click', handleClickOutside, true); + document.addEventListener('contextmenu', handleClickOutside, true); }, 0); }); @@ -131,8 +132,8 @@ watch( onUnmounted(() => { clearTimeout(listenerTimer); document.removeEventListener('keydown', handleKeyDown, true); - document.removeEventListener('click', handleClickOutside); - document.removeEventListener('contextmenu', handleClickOutside); + document.removeEventListener('click', handleClickOutside, true); + document.removeEventListener('contextmenu', handleClickOutside, true); }); function handleAction(item: ContextMenuItem) { From 3d7c0af7e87645e1d6d23114ce4b42133e69a023 Mon Sep 17 00:00:00 2001 From: WCY-dt <834421194@qq.com> Date: Mon, 21 Sep 2026 01:19:24 +0800 Subject: [PATCH 04/11] feat: show unread state in media gallery (#1214) --- .../article/imageGallery/components/ImageCard.vue | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/frontend/src/components/article/imageGallery/components/ImageCard.vue b/frontend/src/components/article/imageGallery/components/ImageCard.vue index 17489328..b15d14b4 100644 --- a/frontend/src/components/article/imageGallery/components/ImageCard.vue +++ b/frontend/src/components/article/imageGallery/components/ImageCard.vue @@ -2,6 +2,7 @@ import { useArticleDateFormat } from '@/composables/article/useArticleDateFormat'; import { PhImage, PhStar, PhPlay } from '@phosphor-icons/vue'; import { computed } from 'vue'; +import { useI18n } from 'vue-i18n'; import type { Article } from '@/types/models'; import { getProxiedMediaUrl } from '@/utils/mediaProxy'; import { isYouTubeArticle, extractYouTubeVideoId, getYouTubeThumbnailUrl } from '@/utils/youtube'; @@ -15,6 +16,7 @@ interface Props { } const props = defineProps(); +const { t } = useI18n(); const emit = defineEmits<{ imageSize: [width: number, height: number]; @@ -120,10 +122,20 @@ const { formatArticleDate: formatDate, formatArticleDateTime } = useArticleDateF " /> +
+ + {{ t('article.table.unread') }} +
+
{{ platformBadge.label }} From 67e18b47e959e5ac98ce93a6d54370845ac42ae7 Mon Sep 17 00:00:00 2001 From: WCY-dt <834421194@qq.com> Date: Mon, 21 Sep 2026 01:21:03 +0800 Subject: [PATCH 05/11] feat: allow system startup in tray (#1215) --- config/defaults.json | 1 + .../settings/general/ApplicationSettings.vue | 17 +++++++++++++++++ .../composables/core/useSettings.generated.ts | 3 +++ frontend/src/i18n/locales/en.ts | 2 ++ frontend/src/i18n/locales/zh.ts | 2 ++ frontend/src/types/settings.generated.ts | 1 + internal/config/config.go | 3 +++ internal/config/defaults.json | 1 + internal/config/settings_keys.go | 2 +- internal/config/settings_schema.json | 7 +++++++ internal/handlers/settings/settings_base.go | 1 + internal/utils/startup.go | 5 +++-- internal/utils/startup_test.go | 12 ++++++++++-- main.go | 16 ++++++++++++++-- 14 files changed, 66 insertions(+), 7 deletions(-) diff --git a/config/defaults.json b/config/defaults.json index f3895369..56edd835 100644 --- a/config/defaults.json +++ b/config/defaults.json @@ -117,6 +117,7 @@ "siyuan_endpoint": "http://127.0.0.1:6806", "siyuan_folder": "/MrRSS", "siyuan_notebook_id": "", + "startup_minimized": false, "startup_on_boot": false, "summary_enabled": true, "summary_length": "medium", diff --git a/frontend/src/components/modals/settings/general/ApplicationSettings.vue b/frontend/src/components/modals/settings/general/ApplicationSettings.vue index 086f12e9..86ea04f3 100644 --- a/frontend/src/components/modals/settings/general/ApplicationSettings.vue +++ b/frontend/src/components/modals/settings/general/ApplicationSettings.vue @@ -9,6 +9,7 @@ import { PhArchiveTray, PhTextT, PhTextAa, + PhArrowLineDown, } from '@phosphor-icons/vue'; import { SettingGroup, @@ -16,6 +17,9 @@ import { SettingWithToggle, SettingWithSelect, NumberControl, + NestedSettingsContainer, + SubSettingItem, + ToggleControl, } from '@/components/settings'; import FontFamilySelect from '@/components/settings/FontFamilySelect.vue'; import type { SettingsData } from '@/types/settings'; @@ -59,6 +63,19 @@ function updateUiFontSize(value: number) { @update:model-value="updateSetting('startup_on_boot', $event)" /> + + + + + + ): SettingsData { siyuan_endpoint: data.siyuan_endpoint || settingsDefaults.siyuan_endpoint, siyuan_folder: data.siyuan_folder || settingsDefaults.siyuan_folder, siyuan_notebook_id: data.siyuan_notebook_id || settingsDefaults.siyuan_notebook_id, + startup_minimized: data.startup_minimized === 'true', startup_on_boot: data.startup_on_boot === 'true', summary_enabled: data.summary_enabled === 'true', summary_length: data.summary_length || settingsDefaults.summary_length, @@ -436,6 +438,7 @@ export function buildAutoSavePayload(settingsRef: Ref): Record