refactor(web): remove deprecated BugRow component

Quentin Gliech and Claude Opus 4.6 (1M context) created

All consumers now use the IssueRow composition components.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

Change summary

webui2/src/components/bugs/BugRow.stories.tsx | 74 ------------------
webui2/src/components/bugs/BugRow.tsx         | 85 ---------------------
2 files changed, 159 deletions(-)

Detailed changes

webui2/src/components/bugs/BugRow.stories.tsx 🔗

@@ -1,74 +0,0 @@
-import type { Meta, StoryObj } from "@storybook/react-vite";
-
-import { Status } from "@/__generated__/graphql";
-import { withRouter } from "@/../.storybook/decorators";
-
-import { BugRow } from "./BugRow";
-
-const meta = {
-  component: BugRow,
-  decorators: [withRouter],
-} satisfies Meta<typeof BugRow>;
-
-export default meta;
-type Story = StoryObj<typeof meta>;
-
-const baseArgs = {
-  id: "abc123",
-  humanId: "a1b2c3",
-  repo: "my-repo",
-  author: {
-    humanId: "user1",
-    displayName: "Jane Doe",
-    avatarUrl: null,
-  },
-  createdAt: new Date(Date.now() - 3600 * 1000).toISOString(),
-};
-
-export const OpenBug: Story = {
-  args: {
-    ...baseArgs,
-    status: Status.Open,
-    title: "Fix login page crash on empty email",
-    labels: [
-      { name: "bug", color: { R: 252, G: 41, B: 41 } },
-      { name: "priority", color: { R: 255, G: 152, B: 0 } },
-    ],
-    commentCount: 3,
-  },
-};
-
-export const ClosedBug: Story = {
-  args: {
-    ...baseArgs,
-    status: Status.Closed,
-    title: "Add dark mode support",
-    labels: [{ name: "enhancement", color: { R: 163, G: 230, B: 53 } }],
-    commentCount: 12,
-  },
-};
-
-export const NoLabels: Story = {
-  args: {
-    ...baseArgs,
-    status: Status.Open,
-    title: "Simple bug with no labels",
-    labels: [],
-    commentCount: 0,
-  },
-};
-
-export const LongTitle: Story = {
-  args: {
-    ...baseArgs,
-    status: Status.Open,
-    title:
-      "This is a very long bug title that should demonstrate how the component handles overflow and wrapping when the title extends beyond the available space",
-    labels: [
-      { name: "bug", color: { R: 252, G: 41, B: 41 } },
-      { name: "documentation", color: { R: 30, G: 80, B: 160 } },
-      { name: "help wanted", color: { R: 0, G: 150, B: 136 } },
-    ],
-    commentCount: 42,
-  },
-};

webui2/src/components/bugs/BugRow.tsx 🔗

@@ -1,85 +0,0 @@
-import { Link } from "@tanstack/react-router";
-import { formatDistanceToNow } from "date-fns";
-import { MessageSquare, CircleDot, CircleCheck } from "lucide-react";
-
-import { Status } from "@/__generated__/graphql";
-
-import { LabelBadge } from "./LabelBadge";
-
-interface BugRowProps {
-  id: string;
-  humanId: string;
-  status: Status;
-  title: string;
-  labels: Array<{ name: string; color: { R: number; G: number; B: number } }>;
-  author: { humanId: string; displayName: string; avatarUrl?: string | null };
-  createdAt: string;
-  commentCount: number;
-  repo: string;
-}
-
-// Single row in the issue list. Shows status icon, title, labels, author and
-// comment count.
-/** @deprecated Use IssueRow composition components instead. */
-export function BugRow({
-  humanId,
-  status,
-  title,
-  labels,
-  author,
-  createdAt,
-  commentCount,
-  repo,
-}: BugRowProps) {
-  const isOpen = status === Status.Open;
-  const StatusIcon = isOpen ? CircleDot : CircleCheck;
-
-  return (
-    <div className="border-border hover:bg-muted/30 flex items-start gap-3 border-b px-4 py-3 last:border-0">
-      <StatusIcon
-        className={
-          isOpen
-            ? "mt-0.5 size-4 shrink-0 text-green-600 dark:text-green-400"
-            : "mt-0.5 size-4 shrink-0 text-purple-600 dark:text-purple-400"
-        }
-      />
-
-      <div className="min-w-0 flex-1">
-        <div className="flex flex-wrap items-baseline gap-2">
-          <Link
-            to="/$repo/issues/$id"
-            params={{ repo, id: humanId }}
-            className="text-foreground hover:text-primary font-medium hover:underline"
-          >
-            {title}
-          </Link>
-          {labels.map((label) => (
-            <LabelBadge
-              key={label.name}
-              name={label.name}
-              color={label.color}
-            />
-          ))}
-        </div>
-        <p className="text-muted-foreground mt-0.5 text-xs">
-          #{humanId} opened {formatDistanceToNow(new Date(createdAt), { addSuffix: true })} by{" "}
-          <Link
-            to="/$repo/user/$id"
-            params={{ repo, id: author.humanId }}
-            search={{ status: "open" as const, after: "" }}
-            className="hover:underline"
-          >
-            {author.displayName}
-          </Link>
-        </p>
-      </div>
-
-      {commentCount > 0 && (
-        <div className="text-muted-foreground flex shrink-0 items-center gap-1 text-xs">
-          <MessageSquare className="size-3.5" />
-          {commentCount}
-        </div>
-      )}
-    </div>
-  );
-}