Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
ab5c720
feat(notifications): persistent ("sticky until resolved") notifications
elibosley Jun 19, 2026
8e132af
feat(notifications): pin persistent notifications to the top of the list
elibosley Jun 19, 2026
59ba79b
fix(notifications): parse persistent flag coerced to boolean by the i…
elibosley Jun 19, 2026
97d59e5
feat(notifications): give persistent items a pinned treatment + tight…
elibosley Jun 19, 2026
396ddf4
feat(notifications): allow dismissing pinned notifications behind a w…
elibosley Jun 19, 2026
8a63554
feat(notifications): sweep archive on clear-by-key; unify item card s…
elibosley Jun 19, 2026
be24dc3
style(notifications): make item actions subtle (ghost/sm) instead of …
elibosley Jun 19, 2026
b46fbab
style(notifications): smoother dismiss/list animation
elibosley Jun 19, 2026
27daa52
style(notifications): modernize the panel header
elibosley Jun 19, 2026
907c88f
style(notifications): smoother JS-driven dismiss (slide + height coll…
elibosley Jun 19, 2026
1b78c8c
style(notifications): give Archive all / Delete all icons + consisten…
elibosley Jun 19, 2026
9146385
fix(notifications): never archive persistent notifications in archiveAll
elibosley Jun 20, 2026
25297a7
fix(web): refine pinned notification styling, rename Dismiss -> Archive
elibosley Jun 20, 2026
1d85ec1
fix(web): keep orange pinned styling, neutralize the View link color
elibosley Jun 20, 2026
068ba21
fix(notifications): never bulk-delete persistent notifications
elibosley Jun 20, 2026
45eb228
fix(web): hide archive button on persistent notifications
elibosley Jun 20, 2026
76240f6
feat(web): add a Pinned filter toggle to the notifications sidebar
elibosley Jun 20, 2026
66c8244
style(web): match Pinned filter toggle to the importance filter UI
elibosley Jun 20, 2026
eb96cdb
style(web): drop icon from Pinned filter toggle
elibosley Jun 20, 2026
04088aa
refactor(web): label persistent notifications "Active" in the UI
elibosley Jun 20, 2026
dce0632
feat(web): persist notification filters for the browser session
elibosley Jun 20, 2026
e501c08
feat(web): persist the Unread/Archived tab for the session too
elibosley Jun 20, 2026
2a58ea4
refactor(web): tighten notifications panel header
elibosley Jun 20, 2026
6bf6df8
refactor(web): label bulk action, move settings gear back to header
elibosley Jun 20, 2026
91b0e4a
style(web): anchor settings gear to the title, not the corner
elibosley Jun 20, 2026
56cc247
feat(notifications): backend-authoritative banner reconciliation
elibosley Jun 20, 2026
1b5c705
fix(web): don't render empty subject/description lines on notifications
elibosley Jun 20, 2026
a726d30
fix(notifications): allow empty description; self-correct badge on load
elibosley Jun 20, 2026
7e56da0
fix(web): address CodeRabbit review (cast + timestamp fallback)
elibosley Jun 20, 2026
9986475
fix(notifications): hoist persistent notifications into the first page
elibosley Jun 22, 2026
0aab59c
refactor(notifications): read persistent notifications from a dedicat…
elibosley Jun 22, 2026
39d46aa
feat(notifications): dedicated Active tab for persistent notifications
elibosley Jun 22, 2026
adda214
test(notifications): missing description is valid, not masked
elibosley Jun 23, 2026
7e1e904
fix(notifications): always read/write active notifications from tmpfs
elibosley Jun 23, 2026
31e3608
test(notifications): watch active dir as a second path when off-disk
elibosley Jun 23, 2026
a0f0372
fix(notifications): reflect external file removals in the overview
elibosley Jun 23, 2026
9fe768b
fix(web): hide the Active notifications tab when there are none
elibosley Jun 23, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
feat(notifications): give persistent items a pinned treatment + tight…
…en hierarchy

- Persistent notifications now render as a pinned card: orange left-accent
  border, subtle tint, and an uppercase "Pinned" badge in the header.
- Tighten the item typography to feel native to the webgui: text-sm base,
  muted/condensed description, smaller timestamp, less vertical gap.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
  • Loading branch information
elibosley and claude committed Jun 23, 2026
commit 97d59e5e8b240b19971de8ed2943c0f1711df03e
31 changes: 23 additions & 8 deletions web/src/components/Notifications/Item.vue
Original file line number Diff line number Diff line change
Expand Up @@ -91,10 +91,17 @@ const reformattedTimestamp = computed<string>(() => {
</script>

<template>
<div class="group/item relative flex flex-col gap-2 py-3 text-base">
<header class="flex -translate-y-1 flex-row items-baseline justify-between gap-2">
<div
class="group/item relative flex flex-col gap-1.5 py-3 text-sm"
:class="
persistent
? 'my-1 rounded-md border border-l-4 border-orange-300/70 border-l-orange-500 bg-orange-50/70 py-2.5 pr-3 pl-3 dark:border-orange-500/30 dark:border-l-orange-500 dark:bg-orange-500/10'
: ''
"
>
<header class="flex flex-row items-baseline justify-between gap-2">
<h3
class="m-0 flex flex-row items-baseline gap-2 overflow-x-hidden text-base font-semibold normal-case"
class="m-0 flex flex-row items-baseline gap-2 overflow-x-hidden text-sm font-semibold normal-case"
>
<!-- the `translate` compensates for extra space added by the `svg` element when rendered -->
<component
Expand All @@ -107,19 +114,27 @@ const reformattedTimestamp = computed<string>(() => {
</h3>

<div
class="mt-1 flex shrink-0 flex-row items-baseline justify-end gap-2"
class="flex shrink-0 flex-row items-baseline justify-end gap-2"
:title="formattedTimestamp ?? reformattedTimestamp"
>
<p class="text-secondary-foreground text-sm">{{ reformattedTimestamp }}</p>
<span
v-if="persistent"
class="inline-flex items-center gap-1 self-center rounded-full border border-orange-300 bg-orange-100 px-2 py-0.5 text-[1rem] font-semibold tracking-wide text-orange-700 uppercase dark:border-orange-500/40 dark:bg-orange-500/20 dark:text-orange-200"
>
{{ t('notifications.item.pinned') }}
</span>
<p class="text-secondary-foreground text-xs whitespace-nowrap">{{ reformattedTimestamp }}</p>
</div>
</header>

<h4 class="m-0 font-normal">
<h4 class="m-0 text-sm font-normal">
{{ subject }}
</h4>

<div class="flex flex-row items-center justify-between gap-2">
<div class="" v-html="descriptionMarkup" />
<div
class="text-secondary-foreground flex flex-row items-center justify-between gap-2 text-sm leading-snug"
>
<div v-html="descriptionMarkup" />
</div>

<p v-if="mutationError" class="text-red-600">{{ t('common.error') }}: {{ mutationError }}</p>
Expand Down
1 change: 1 addition & 0 deletions web/src/locales/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -656,6 +656,7 @@
"notifications.importance.warning": "Warning",
"notifications.item.archive": "Archive",
"notifications.item.delete": "Delete",
"notifications.item.pinned": "Pinned",
"notifications.item.viewLink": "View",
"notifications.list.noNotifications": "No notifications to see here!",
"notifications.list.noNotificationsWithImportance": "No {importance} notifications to see here!",
Expand Down