+ {/* Header */}
+
+
Activity Log
+
+ {totalCount.toLocaleString()} changes recorded in the last 7 days
+
+
+
+ {/* Summary Cards */}
+ {summary &&
}
+
+ {/* Filter Bar */}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ setStartDate(e.target.value)}
+ className="w-full rounded-lg border border-gray-300 bg-white px-3 py-2 text-sm dark:border-slate-600 dark:bg-slate-700 dark:text-gray-200"
+ />
+
+
+
+
+ setEndDate(e.target.value)}
+ className="w-full rounded-lg border border-gray-300 bg-white px-3 py-2 text-sm dark:border-slate-600 dark:bg-slate-700 dark:text-gray-200"
+ />
+
+
+
+
+ setSearch(e.target.value)}
+ className="w-full rounded-lg border border-gray-300 bg-white px-3 py-2 text-sm dark:border-slate-600 dark:bg-slate-700 dark:text-gray-200"
+ />
+
+
+
+
+
+ {/* Timeline List */}
+
+ {isLoading && (
+
+ )}
+
+ {!isLoading && allEntries.length === 0 && (
+
+
+
No activity found
+
Try adjusting your filters or date range.
+
+ )}
+
+ {allEntries.map((entry) => {
+ const changes = parseChanges(entry.changes);
+ const isExpanded = expandedId === entry.id;
+ const entityLink = ENTITY_LINKS[entry.entityType]?.(entry.entityId);
+
+ return (
+
+
+
+ {/* Expanded Diff */}
+ {isExpanded && (
+
+
+
+ )}
+
+ );
+ })}
+
+ {/* Load More */}
+ {hasNextPage && (
+
+
+
+ )}
+
+
+ );
+}
diff --git a/apps/web/src/components/layout/AppShell.tsx b/apps/web/src/components/layout/AppShell.tsx
index 2066930..b63398f 100644
--- a/apps/web/src/components/layout/AppShell.tsx
+++ b/apps/web/src/components/layout/AppShell.tsx
@@ -76,6 +76,9 @@ function NotificationsIcon() {
function BroadcastIcon() {
return