nandi/gleanpublic Fork 0
0fd82a4
Commits
Clone
git clone https://git.rickub.com/nandi/glean.git
git clone ssh://git@rickub.com/nandi/glean.git

Host key fingerprint (ed25519): SHA256:iycHnxEyq0Q7uyVpB7JlznP0G7JrTPXLYRcAU5CSLhc — verify it before your first connect.

Link dashboard articles to their original source instead of the internal reader page

Adds a linkToOriginal prop to ArticleCard and TrendingCard so the
Dashboard's recommended/unread/trending article links open the
original article URL (in a new tab) rather than navigating to the
internal /articles/{id} reader page. Other pages (Library, Articles,
Trending) keep linking to the internal reader view since they retain
in-app affordances like annotations and mark-as-read there.
Cyrus committed 2026-08-21T07:48:29Z Browse files
0fd82a4 parent: c177ffe
modified web/src/lib/components/ArticleCard.svelte +7 -1
@@ -12,6 +12,7 @@
1212 navSuffix?: string;
1313 dismissible?: boolean;
1414 onDismiss?: () => void;
15+ linkToOriginal?: boolean;
1516 }
1617 let {
1718 article,
@@ -19,6 +20,7 @@
1920 navSuffix = "",
2021 dismissible = false,
2122 onDismiss,
23+ linkToOriginal = false,
2224 }: Props = $props();
2325
2426 {
@@ -83,7 +85,11 @@
8385 <div class="flex items-start justify-between gap-4">
8486 <div class="min-w-0 flex-1">
8587 <a
86- href="/articles/{article.id}{navSuffix}"
88+ href={linkToOriginal
89+ ? article.url
90+ : `/articles/${article.id}${navSuffix}`}
91+ target={linkToOriginal ? "_blank" : undefined}
92+ rel={linkToOriginal ? "noopener noreferrer" : undefined}
8793 class="block {read
8894 ? 'text-[var(--muted)]'
8995 : 'text-[var(--fg)]'} hover:text-[var(--accent)]"
@@ -12,6 +12,7 @@
12 navSuffix?: string;12 navSuffix?: string;
13 dismissible?: boolean;13 dismissible?: boolean;
14 onDismiss?: () => void;14 onDismiss?: () => void;
15+ linkToOriginal?: boolean;
15 }16 }
16 let {17 let {
17 article,18 article,
@@ -19,6 +20,7 @@
19 navSuffix = "",20 navSuffix = "",
20 dismissible = false,21 dismissible = false,
21 onDismiss,22 onDismiss,
23+ linkToOriginal = false,
22 }: Props = $props();24 }: Props = $props();
23 25
24 {26 {
@@ -83,7 +85,11 @@
83 <div class="flex items-start justify-between gap-4">85 <div class="flex items-start justify-between gap-4">
84 <div class="min-w-0 flex-1">86 <div class="min-w-0 flex-1">
85 <a87 <a
86- href="/articles/{article.id}{navSuffix}"88+ href={linkToOriginal
89+ ? article.url
90+ : `/articles/${article.id}${navSuffix}`}
91+ target={linkToOriginal ? "_blank" : undefined}
92+ rel={linkToOriginal ? "noopener noreferrer" : undefined}
87 class="block {read93 class="block {read
88 ? 'text-[var(--muted)]'94 ? 'text-[var(--muted)]'
89 : 'text-[var(--fg)]'} hover:text-[var(--accent)]"95 : 'text-[var(--fg)]'} hover:text-[var(--accent)]"
modified web/src/lib/components/TrendingCard.svelte +7 -2
@@ -7,15 +7,20 @@
77
88 interface Props {
99 item: TrendingItem;
10+ linkToOriginal?: boolean;
1011 }
11- let { item }: Props = $props();
12+ let { item, linkToOriginal = false }: Props = $props();
1213 </script>
1314
1415 <div class="panel panel-press p-4">
1516 <div class="flex items-start justify-between gap-4">
1617 <div class="min-w-0 flex-1">
1718 <a
18- href="/articles/{item.article_id}"
19+ href={linkToOriginal
20+ ? item.url
21+ : `/articles/${item.article_id}`}
22+ target={linkToOriginal ? "_blank" : undefined}
23+ rel={linkToOriginal ? "noopener noreferrer" : undefined}
1924 class="block text-base font-bold leading-snug hover:text-[var(--accent)]"
2025 >{item.title}</a
2126 >
@@ -7,15 +7,20 @@
7 7
8 interface Props {8 interface Props {
9 item: TrendingItem;9 item: TrendingItem;
10+ linkToOriginal?: boolean;
10 }11 }
11- let { item }: Props = $props();12+ let { item, linkToOriginal = false }: Props = $props();
12 </script>13 </script>
13 14
14 <div class="panel panel-press p-4">15 <div class="panel panel-press p-4">
15 <div class="flex items-start justify-between gap-4">16 <div class="flex items-start justify-between gap-4">
16 <div class="min-w-0 flex-1">17 <div class="min-w-0 flex-1">
17 <a18 <a
18- href="/articles/{item.article_id}"19+ href={linkToOriginal
20+ ? item.url
21+ : `/articles/${item.article_id}`}
22+ target={linkToOriginal ? "_blank" : undefined}
23+ rel={linkToOriginal ? "noopener noreferrer" : undefined}
19 class="block text-base font-bold leading-snug hover:text-[var(--accent)]"24 class="block text-base font-bold leading-snug hover:text-[var(--accent)]"
20 >{item.title}</a25 >{item.title}</a
21 >26 >
modified web/src/routes/dashboard/+page.svelte +4 -2
@@ -147,6 +147,7 @@
147147 article={a}
148148 dismissible
149149 onDismiss={() => dismissArticle(a.url)}
150+ linkToOriginal
150151 />
151152 {/each}
152153 </div>
@@ -228,7 +229,7 @@
228229 </div>
229230 <div class="space-y-3">
230231 {#each unreadArticles as a (a.id)}
231- <ArticleCard article={a} />
232+ <ArticleCard article={a} linkToOriginal />
232233 {/each}
233234 </div>
234235 {#if data.unread_count > 5}
@@ -255,6 +256,7 @@
255256 article={a}
256257 dismissible
257258 onDismiss={() => dismissArticle(a.url)}
259+ linkToOriginal
258260 />
259261 {/each}
260262 </div>
@@ -295,7 +297,7 @@
295297 </div>
296298 <div class="grid grid-cols-1 gap-3 md:grid-cols-2 lg:grid-cols-3">
297299 {#each trending as t (t.article_id)}
298- <TrendingCard item={t} />
300+ <TrendingCard item={t} linkToOriginal />
299301 {/each}
300302 </div>
301303 </section>
@@ -147,6 +147,7 @@
147 article={a}147 article={a}
148 dismissible148 dismissible
149 onDismiss={() => dismissArticle(a.url)}149 onDismiss={() => dismissArticle(a.url)}
150+ linkToOriginal
150 />151 />
151 {/each}152 {/each}
152 </div>153 </div>
@@ -228,7 +229,7 @@
228 </div>229 </div>
229 <div class="space-y-3">230 <div class="space-y-3">
230 {#each unreadArticles as a (a.id)}231 {#each unreadArticles as a (a.id)}
231- <ArticleCard article={a} />232+ <ArticleCard article={a} linkToOriginal />
232 {/each}233 {/each}
233 </div>234 </div>
234 {#if data.unread_count > 5}235 {#if data.unread_count > 5}
@@ -255,6 +256,7 @@
255 article={a}256 article={a}
256 dismissible257 dismissible
257 onDismiss={() => dismissArticle(a.url)}258 onDismiss={() => dismissArticle(a.url)}
259+ linkToOriginal
258 />260 />
259 {/each}261 {/each}
260 </div>262 </div>
@@ -295,7 +297,7 @@
295 </div>297 </div>
296 <div class="grid grid-cols-1 gap-3 md:grid-cols-2 lg:grid-cols-3">298 <div class="grid grid-cols-1 gap-3 md:grid-cols-2 lg:grid-cols-3">
297 {#each trending as t (t.article_id)}299 {#each trending as t (t.article_id)}
298- <TrendingCard item={t} />300+ <TrendingCard item={t} linkToOriginal />
299 {/each}301 {/each}
300 </div>302 </div>
301 </section>303 </section>