diff --git a/package.json b/package.json
index 5ddc5fb40..389d8ff37 100644
--- a/package.json
+++ b/package.json
@@ -71,6 +71,7 @@
"rehype-parse": "9.0.0",
"rehype-sanitize": "6.0.0",
"rehype-stringify": "10.0.0",
+ "swiper": "11.1.4",
"tailwind-merge": "2.3.0",
"tailwindcss-animate": "1.0.7",
"tldts": "6.1.23",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index cbcf1784d..41d9d126f 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -152,6 +152,9 @@ importers:
rehype-stringify:
specifier: 10.0.0
version: 10.0.0
+ swiper:
+ specifier: 11.1.4
+ version: 11.1.4
tailwind-merge:
specifier: 2.3.0
version: 2.3.0
@@ -4769,6 +4772,10 @@ packages:
resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
engines: {node: '>= 0.4'}
+ swiper@11.1.4:
+ resolution: {integrity: sha512-1n7kbYJB2dFEpUHRFszq7gys/ofIBrMNibwTiMvPHwneKND/t9kImnHt6CfGPScMHgI+dWMbGTycCKGMoOO1KA==}
+ engines: {node: '>= 4.7.0'}
+
synckit@0.6.2:
resolution: {integrity: sha512-Vhf+bUa//YSTYKseDiiEuQmhGCoIF3CVBhunm3r/DQnYiGT4JssmnKQc44BIyOZRK2pKjXXAgbhfmbeoC9CJpA==}
engines: {node: '>=12.20'}
@@ -10460,6 +10467,8 @@ snapshots:
supports-preserve-symlinks-flag@1.0.0: {}
+ swiper@11.1.4: {}
+
synckit@0.6.2:
dependencies:
tslib: 2.6.2
diff --git a/src/renderer/src/assets/base.css b/src/renderer/src/assets/base.css
index e6ec9676e..bd32ea22a 100644
--- a/src/renderer/src/assets/base.css
+++ b/src/renderer/src/assets/base.css
@@ -20,3 +20,15 @@ a {
.dark {
color-scheme: dark;
}
+
+.swiper {
+ @apply bg-zinc-50;
+}
+
+.swiper-button {
+ @apply absolute top-1/2 -translate-y-1/2 bg-white rounded-full z-[1] w-6 h-6 flex items-center justify-center opacity-80;
+}
+
+.swiper-wrapper {
+ @apply flex items-center;
+}
diff --git a/src/renderer/src/components/entry-column/article-item.tsx b/src/renderer/src/components/entry-column/article-item.tsx
index 76b5a4d3f..4a5c4b270 100644
--- a/src/renderer/src/components/entry-column/article-item.tsx
+++ b/src/renderer/src/components/entry-column/article-item.tsx
@@ -17,7 +17,7 @@ export function ArticleItem({ entryId, entryPreview }: UniversalItemProps) {
-
+
{entry.feeds.title}
ยท
@@ -32,7 +32,7 @@ export function ArticleItem({ entryId, entryPreview }: UniversalItemProps) {
{entry.entries.title}
-
+
{entry.entries.description}
diff --git a/src/renderer/src/components/entry-column/index.tsx b/src/renderer/src/components/entry-column/index.tsx
index 2b4db5697..78514fbad 100644
--- a/src/renderer/src/components/entry-column/index.tsx
+++ b/src/renderer/src/components/entry-column/index.tsx
@@ -127,7 +127,7 @@ export function EntryColumn() {
{activeList?.view && views[activeList.view].gridMode ?
(
) :
diff --git a/src/renderer/src/components/entry-column/item-wrapper.tsx b/src/renderer/src/components/entry-column/item-wrapper.tsx
index 5df516e56..fe32dd4ad 100644
--- a/src/renderer/src/components/entry-column/item-wrapper.tsx
+++ b/src/renderer/src/components/entry-column/item-wrapper.tsx
@@ -51,7 +51,7 @@ export function EntryItemWrapper({
"rounded-md transition-colors",
!views[view || 0].wideMode && activeEntry === entry.entries.id && "bg-native-active/40",
views[view || 0].wideMode && !views[view || 0].gridMode && "hover:bg-native-active/30",
- entry.read ? "text-zinc-600 opacity-85" : "text-zinc-900 dark:text-white/90",
+ entry.read ? "text-zinc-500" : "text-zinc-900 dark:text-white/90",
)}
// ref={ref}
onClick={(e) => {
diff --git a/src/renderer/src/components/entry-column/picture-item.tsx b/src/renderer/src/components/entry-column/picture-item.tsx
index 8599c6dac..090e6a369 100644
--- a/src/renderer/src/components/entry-column/picture-item.tsx
+++ b/src/renderer/src/components/entry-column/picture-item.tsx
@@ -1,9 +1,10 @@
import { FeedIcon } from "@renderer/components/feed-icon"
+import { SwipeImages } from "@renderer/components/swipe-images"
import { Image } from "@renderer/components/ui/image"
+import { ReactVirtuosoItemPlaceholder } from "@renderer/components/ui/placeholder"
import dayjs from "@renderer/lib/dayjs"
import { useEntry } from "@renderer/store/entry"
-import { ReactVirtuosoItemPlaceholder } from "../ui/placeholder"
import type { UniversalItemProps } from "./types"
export function PictureItem({ entryId, entryPreview }: UniversalItemProps) {
@@ -12,19 +13,13 @@ export function PictureItem({ entryId, entryPreview }: UniversalItemProps) {
return (
-
- {entry.entries.images?.slice(0, 1).map((image) => (
-
- ))}
+
+
{entry.entries.title}
diff --git a/src/renderer/src/components/entry-column/video-item.tsx b/src/renderer/src/components/entry-column/video-item.tsx
index 161124589..5f750bb9e 100644
--- a/src/renderer/src/components/entry-column/video-item.tsx
+++ b/src/renderer/src/components/entry-column/video-item.tsx
@@ -12,7 +12,7 @@ export function VideoItem({ entryId, entryPreview }: UniversalItemProps) {
return (
-
+
+ {(images?.length || 0) > 1 ?
+ (
+ <>
+
+ {images?.slice(0, 5).map((image) => (
+
+
+
+ ))}
+
+ e.stopPropagation()}
+ >
+
+
+ e.stopPropagation()}
+ >
+
+
+ >
+ ) :
+ images?.length === 1 ?
+ (
+
+
+ ) :
+ (
+
+ )}
+
+ )
+}