diff --git a/apps/web/app/(dashboard)/issues/[id]/page.tsx b/apps/web/app/(dashboard)/issues/[id]/page.tsx
index 47f615f6..06441140 100644
--- a/apps/web/app/(dashboard)/issues/[id]/page.tsx
+++ b/apps/web/app/(dashboard)/issues/[id]/page.tsx
@@ -7,7 +7,6 @@ import {
Bot,
Calendar,
ChevronRight,
- Circle,
User,
} from "lucide-react";
import {
@@ -16,6 +15,7 @@ import {
PRIORITY_CONFIG,
} from "../_data/mock";
import type { MockAssignee } from "../_data/mock";
+import { StatusIcon, PriorityIcon } from "../page";
// ---------------------------------------------------------------------------
// Helpers
@@ -32,7 +32,7 @@ function timeAgo(dateStr: string): string {
}
function formatDate(date: string | null): string {
- if (!date) return "—";
+ if (!date) return "None";
return new Date(date).toLocaleDateString("en-US", {
month: "short",
day: "numeric",
@@ -40,16 +40,41 @@ function formatDate(date: string | null): string {
});
}
-function ActorBadge({ actor }: { actor: MockAssignee }) {
+function ActorAvatar({ actor, size = "sm" }: { actor: MockAssignee; size?: "sm" | "md" }) {
+ const sizeClass = size === "sm" ? "h-5 w-5 text-[10px]" : "h-6 w-6 text-xs";
return (
-
- {actor.type === "agent" && }
- {actor.name}
-
+ {actor.type === "agent" ? (
+
+ ) : (
+ actor.avatar.charAt(0)
+ )}
+
+ );
+}
+
+// ---------------------------------------------------------------------------
+// Properties Sidebar
+// ---------------------------------------------------------------------------
+
+function PropertyRow({
+ label,
+ children,
+}: {
+ label: string;
+ children: React.ReactNode;
+}) {
+ return (
+
);
}
@@ -67,7 +92,7 @@ export default function IssueDetailPage({
if (!issue) {
return (
-
+
Issue not found
);
@@ -78,18 +103,17 @@ export default function IssueDetailPage({
const isOverdue =
issue.dueDate && new Date(issue.dueDate) < new Date() && issue.status !== "done";
- // Merge comments + activity into a single timeline sorted by time
const timeline = [
...issue.activity.map((a) => ({
id: a.id,
- type: "activity" as const,
+ kind: "activity" as const,
actor: a.actor,
content: a.action,
createdAt: a.createdAt,
})),
...issue.comments.map((c) => ({
id: c.id,
- type: "comment" as const,
+ kind: "comment" as const,
actor: c.author,
content: c.body,
createdAt: c.createdAt,
@@ -100,60 +124,54 @@ export default function IssueDetailPage({
return (
- {/* Left column — content */}
+ {/* ---- Left: Content ---- */}
- {/* Breadcrumb */}
-
+ {/* Breadcrumb bar */}
+
-
Issues
-
-
{issue.key}
+
+
{issue.key}
-
+
{/* Title */}
-
{issue.title}
+
{issue.title}
{/* Description */}
{issue.description && (
-
+
{issue.description}
)}
- {/* Activity section */}
+ {/* Activity */}
-
Activity
-
+
+
+ Activity
+
+
+
+
{timeline.map((entry) =>
- entry.type === "comment" ? (
-
-
- {entry.actor.type === "agent" ? (
-
- ) : (
- entry.actor.avatar.charAt(0)
- )}
-
+ entry.kind === "comment" ? (
+
+
-
-
+
+ {entry.actor.name}
+
+
{timeAgo(entry.createdAt)}
-
@@ -161,24 +179,28 @@ export default function IssueDetailPage({
) : (
-
-
+
+
-
+
+ {entry.actor.name}
+
{entry.content}
-
{timeAgo(entry.createdAt)}
+
+ {timeAgo(entry.createdAt)}
+
)
)}
- {/* Comment input placeholder */}
-
-
-
+ {/* Comment placeholder */}
+
+
+
-
@@ -187,102 +209,57 @@ export default function IssueDetailPage({
- {/* Right column — properties sidebar */}
-
-
- {/* Status */}
-
-
Status
-
-
-
- {statusCfg.label}
-
-
-
+ {/* ---- Right: Properties ---- */}
+
+
+ Properties
+
- {/* Priority */}
-
-
Priority
-
-
- {priorityCfg.shortLabel}
-
- {priorityCfg.label}
-
-
+
+
+
+
+ {statusCfg.label}
+
+
- {/* Assignee */}
-
-
Assignee
+
+
+ {priorityCfg.label}
+
+
+
{issue.assignee ? (
-
-
- {issue.assignee.type === "agent" ? (
-
- ) : (
- issue.assignee.avatar.charAt(0)
- )}
-
-
{issue.assignee.name}
- {issue.assignee.type === "agent" && (
-
Agent
- )}
-
+ <>
+
+ {issue.assignee.name}
+ >
) : (
- Unassigned
+ Unassigned
)}
-
+
- {/* Due Date */}
-
-
Due Date
-
-
-
- {formatDate(issue.dueDate)}
-
-
-
+
+
+
+ {formatDate(issue.dueDate)}
+
+
- {/* Creator */}
-
-
Created by
-
-
- {issue.creator.type === "agent" ? (
-
- ) : (
- issue.creator.avatar.charAt(0)
- )}
-
-
{issue.creator.name}
-
-
+
+
+ {issue.creator.name}
+
- {/* Dates */}
-
-
Created
-
{formatDate(issue.createdAt)}
-
-
-
Updated
-
{formatDate(issue.updatedAt)}
-
+
+ {formatDate(issue.createdAt)}
+
+
+
+ {formatDate(issue.updatedAt)}
+