+ {/* Header */}
+
+
+
Content Calendar
+
+ Schedule and manage your agent posts across platforms
+
+
+
+
+
+ {/* Week navigation */}
+
+
+
+
+ {weekLabel}
+
+
+
+
+ {/* Error banner */}
+ {isError && (
+
+ Could not load scheduled posts. Showing empty calendar.
+
+ )}
+
+ {/* Weekly grid */}
+
+ {DAYS.map((dayName, i) => {
+ const day = dayDates[i] ?? addDays(weekStart, i);
+ const dayPosts = postsForDay(day);
+ const today = isToday(day);
+
+ return (
+
+ {/* Day header */}
+
+ {dayName}
+
+ {day.getDate()}
+
+
+
+ {/* Post chips */}
+
+ {dayPosts.length > 0 ? (
+ dayPosts.map((post) =>
)
+ ) : (
+
No posts
+ )}
+
+
+ {/* Add post shortcut */}
+
+
+ );
+ })}
+
+
+ {/* Legend */}
+
+ {(['twitter', 'instagram', 'linkedin'] as Platform[]).map((p) => (
+
+
+
{PLATFORM_LABELS[p]}
+
+ ))}
+
+
+ {/* Schedule post modal */}
+
setModalOpen(false)}
+ defaultDate={selectedDay}
+ onSuccess={() => setModalOpen(false)}
+ />
+
+ );
+}
diff --git a/src/components/features/content-calendar/index.ts b/src/components/features/content-calendar/index.ts
new file mode 100644
index 0000000..d4cd1b1
--- /dev/null
+++ b/src/components/features/content-calendar/index.ts
@@ -0,0 +1 @@
+export { ContentCalendar } from './ContentCalendar';
diff --git a/src/components/features/dashboard-top-bar.tsx b/src/components/features/dashboard-top-bar.tsx
new file mode 100644
index 0000000..8420f38
--- /dev/null
+++ b/src/components/features/dashboard-top-bar.tsx
@@ -0,0 +1,36 @@
+'use client';
+
+/**
+ * DashboardTopBar
+ * 56px top bar — ozskr.ai wordmark (left) + wallet button (right).
+ * Replaces the old TopBar which included a command bar trigger.
+ * The command interaction is now handled by the YellowBrick component.
+ */
+
+import { WalletButton } from '@/features/wallet/components/wallet-button';
+
+export function DashboardTopBar() {
+ return (
+