refactor(web): standardize all component files to kebab-case

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

Rename all PascalCase component files to kebab-case across the
codebase for consistency with the ui/ (shadcn) convention:

- shared/: IssueRow→issue-row, LabelBadge→label-badge, StatusBadge→status-badge
- bugs/: CommentBox→comment-box, IssueFilters→issue-filters, etc.
- code/: CodeBreadcrumb→code-breadcrumb, FileTree→file-tree, etc.
- content/: Markdown→markdown
- layout/: Header→header, Shell→shell

All imports updated accordingly.

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

Change summary

webui2/src/components/bugs/comment-box.tsx                             |  2 
webui2/src/components/bugs/issue-filters.tsx                           |  2 
webui2/src/components/bugs/label-editor.tsx                            |  2 
webui2/src/components/bugs/timeline.graphql                            |  0 
webui2/src/components/bugs/timeline.tsx                                |  4 
webui2/src/components/bugs/title-editor.tsx                            |  0 
webui2/src/components/code/__snapshots__/code-breadcrumb.test.tsx.snap |  0 
webui2/src/components/code/__snapshots__/file-tree.test.tsx.snap       |  0 
webui2/src/components/code/__snapshots__/file-viewer.test.tsx.snap     |  0 
webui2/src/components/code/__snapshots__/ref-selector.test.tsx.snap    |  0 
webui2/src/components/code/code-breadcrumb.stories.tsx                 |  2 
webui2/src/components/code/code-breadcrumb.test.tsx                    |  2 
webui2/src/components/code/code-breadcrumb.tsx                         |  0 
webui2/src/components/code/commit-list.tsx                             |  0 
webui2/src/components/code/file-diff-view.tsx                          |  0 
webui2/src/components/code/file-tree.stories.tsx                       |  2 
webui2/src/components/code/file-tree.test.tsx                          |  2 
webui2/src/components/code/file-tree.tsx                               |  0 
webui2/src/components/code/file-viewer.stories.tsx                     |  2 
webui2/src/components/code/file-viewer.test.tsx                        |  2 
webui2/src/components/code/file-viewer.tsx                             |  0 
webui2/src/components/code/ref-selector.stories.tsx                    |  2 
webui2/src/components/code/ref-selector.test.tsx                       |  2 
webui2/src/components/code/ref-selector.tsx                            |  0 
webui2/src/components/content/__snapshots__/markdown.test.tsx.snap     |  0 
webui2/src/components/content/markdown.stories.tsx                     |  2 
webui2/src/components/content/markdown.test.tsx                        |  2 
webui2/src/components/content/markdown.tsx                             |  0 
webui2/src/components/layout/header.tsx                                |  0 
webui2/src/components/layout/shell.tsx                                 |  2 
webui2/src/components/shared/__snapshots__/issue-row.test.tsx.snap     |  0 
webui2/src/components/shared/__snapshots__/label-badge.test.tsx.snap   |  0 
webui2/src/components/shared/__snapshots__/status-badge.test.tsx.snap  |  0 
webui2/src/components/shared/identity-summary.graphql                  |  0 
webui2/src/components/shared/issue-row.graphql                         |  0 
webui2/src/components/shared/issue-row.stories.tsx                     |  4 
webui2/src/components/shared/issue-row.test.tsx                        |  2 
webui2/src/components/shared/issue-row.tsx                             |  0 
webui2/src/components/shared/label-badge.graphql                       |  0 
webui2/src/components/shared/label-badge.stories.tsx                   |  2 
webui2/src/components/shared/label-badge.test.tsx                      |  2 
webui2/src/components/shared/label-badge.tsx                           |  0 
webui2/src/components/shared/status-badge.stories.tsx                  |  2 
webui2/src/components/shared/status-badge.test.tsx                     |  2 
webui2/src/components/shared/status-badge.tsx                          |  0 
webui2/src/components/shared/write-preview.stories.tsx                 |  2 
webui2/src/routes/$repo/_code.tsx                                      |  4 
webui2/src/routes/$repo/_code/blob/$ref/$.tsx                          |  2 
webui2/src/routes/$repo/_code/commits/$ref.tsx                         |  2 
webui2/src/routes/$repo/_code/tree/$ref/$.tsx                          |  6 
webui2/src/routes/$repo/_issues/issues/$id.tsx                         | 10 
webui2/src/routes/$repo/_issues/issues/index.tsx                       |  8 
webui2/src/routes/$repo/_issues/issues/new.tsx                         |  2 
webui2/src/routes/$repo/_issues/user/$id.tsx                           |  4 
webui2/src/routes/$repo/commit/$hash.tsx                               |  2 
webui2/src/routes/__root.tsx                                           |  2 
56 files changed, 45 insertions(+), 45 deletions(-)

Detailed changes

webui2/src/components/bugs/CommentBox.tsx → webui2/src/components/bugs/comment-box.tsx 🔗

@@ -9,7 +9,7 @@ import {
   useBugStatusOpenMutation,
   BugDetailDocument,
 } from "@/__generated__/graphql";
-import { Markdown } from "@/components/content/Markdown";
+import { Markdown } from "@/components/content/markdown";
 import { Button } from "@/components/ui/button";
 import * as CommentCard from "@/components/shared/comment-card";
 import { Textarea } from "@/components/ui/textarea";

webui2/src/components/bugs/IssueFilters.tsx → webui2/src/components/bugs/issue-filters.tsx 🔗

@@ -6,7 +6,7 @@ import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover
 import { useAuth } from "@/lib/auth";
 import { cn } from "@/lib/utils";
 
-import { LabelBadge } from "@/components/shared/LabelBadge";
+import { LabelBadge } from "@/components/shared/label-badge";
 
 // Max authors shown in the non-searching state. We intentionally cap this to
 // avoid a giant list — the current-user + recently-seen pattern covers the

webui2/src/components/bugs/LabelEditor.tsx → webui2/src/components/bugs/label-editor.tsx 🔗

@@ -5,7 +5,7 @@ import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover
 import { SectionHeading } from "@/components/shared/section-heading";
 import { useAuth } from "@/lib/auth";
 
-import { LabelBadge } from "@/components/shared/LabelBadge";
+import { LabelBadge } from "@/components/shared/label-badge";
 
 interface LabelEditorProps {
   bugPrefix: string;

webui2/src/components/bugs/Timeline.tsx → webui2/src/components/bugs/timeline.tsx 🔗

@@ -9,13 +9,13 @@ import {
   useBugEditCommentMutation,
   BugDetailDocument,
 } from "@/__generated__/graphql";
-import { Markdown } from "@/components/content/Markdown";
+import { Markdown } from "@/components/content/markdown";
 import { Button } from "@/components/ui/button";
 import * as CommentCard from "@/components/shared/comment-card";
 import { Textarea } from "@/components/ui/textarea";
 import { useAuth } from "@/lib/auth";
 
-import { LabelBadge } from "@/components/shared/LabelBadge";
+import { LabelBadge } from "@/components/shared/label-badge";
 
 type TimelineNode = NonNullable<
   NonNullable<NonNullable<BugDetailQuery["repository"]>["bug"]>["timeline"]["nodes"][number]

webui2/src/components/code/CodeBreadcrumb.stories.tsx → webui2/src/components/code/code-breadcrumb.stories.tsx 🔗

@@ -2,7 +2,7 @@ import type { Meta, StoryObj } from "@storybook/react-vite";
 
 import { withRouter } from "@/../.storybook/decorators";
 
-import { CodeBreadcrumb } from "./CodeBreadcrumb";
+import { CodeBreadcrumb } from "./code-breadcrumb";
 
 const meta = {
   component: CodeBreadcrumb,

webui2/src/components/code/CodeBreadcrumb.test.tsx → webui2/src/components/code/code-breadcrumb.test.tsx 🔗

@@ -1,7 +1,7 @@
 import { composeStories } from "@storybook/react-vite";
 import { expect, test } from "vitest";
 
-import * as stories from "./CodeBreadcrumb.stories";
+import * as stories from "./code-breadcrumb.stories";
 
 const composed = composeStories(stories);
 

webui2/src/components/code/FileTree.stories.tsx → webui2/src/components/code/file-tree.stories.tsx 🔗

@@ -3,7 +3,7 @@ import type { Meta, StoryObj } from "@storybook/react-vite";
 import { GitObjectType } from "@/__generated__/graphql";
 import { withRouter } from "@/../.storybook/decorators";
 
-import { FileTree } from "./FileTree";
+import { FileTree } from "./file-tree";
 
 const meta = {
   component: FileTree,

webui2/src/components/code/FileTree.test.tsx → webui2/src/components/code/file-tree.test.tsx 🔗

@@ -1,7 +1,7 @@
 import { composeStories } from "@storybook/react-vite";
 import { expect, test } from "vitest";
 
-import * as stories from "./FileTree.stories";
+import * as stories from "./file-tree.stories";
 
 const composed = composeStories(stories);
 

webui2/src/components/code/FileViewer.stories.tsx → webui2/src/components/code/file-viewer.stories.tsx 🔗

@@ -1,6 +1,6 @@
 import type { Meta, StoryObj } from "@storybook/react-vite";
 
-import { FileViewer } from "./FileViewer";
+import { FileViewer } from "./file-viewer";
 
 const meta = {
   component: FileViewer,

webui2/src/components/code/FileViewer.test.tsx → webui2/src/components/code/file-viewer.test.tsx 🔗

@@ -1,7 +1,7 @@
 import { composeStories } from "@storybook/react-vite";
 import { expect, test } from "vitest";
 
-import * as stories from "./FileViewer.stories";
+import * as stories from "./file-viewer.stories";
 
 const composed = composeStories(stories);
 

webui2/src/components/code/RefSelector.stories.tsx → webui2/src/components/code/ref-selector.stories.tsx 🔗

@@ -3,7 +3,7 @@ import { fn } from "storybook/test";
 
 import { GitRefType } from "@/__generated__/graphql";
 
-import { RefSelector } from "./RefSelector";
+import { RefSelector } from "./ref-selector";
 
 const meta = {
   component: RefSelector,

webui2/src/components/code/RefSelector.test.tsx → webui2/src/components/code/ref-selector.test.tsx 🔗

@@ -1,7 +1,7 @@
 import { composeStories } from "@storybook/react-vite";
 import { expect, test } from "vitest";
 
-import * as stories from "./RefSelector.stories";
+import * as stories from "./ref-selector.stories";
 
 const composed = composeStories(stories);
 

webui2/src/components/content/Markdown.stories.tsx → webui2/src/components/content/markdown.stories.tsx 🔗

@@ -2,7 +2,7 @@ import type { Meta, StoryObj } from "@storybook/react-vite";
 
 import { withRouter } from "@/../.storybook/decorators";
 
-import { Markdown } from "./Markdown";
+import { Markdown } from "./markdown";
 
 const meta = {
   component: Markdown,

webui2/src/components/content/Markdown.test.tsx → webui2/src/components/content/markdown.test.tsx 🔗

@@ -1,7 +1,7 @@
 import { composeStories } from "@storybook/react-vite";
 import { expect, test } from "vitest";
 
-import * as stories from "./Markdown.stories";
+import * as stories from "./markdown.stories";
 
 const composed = composeStories(stories);
 

webui2/src/components/layout/Shell.tsx → webui2/src/components/layout/shell.tsx 🔗

@@ -1,6 +1,6 @@
 import { Outlet } from "@tanstack/react-router";
 
-import { Header } from "./Header";
+import { Header } from "./header";
 
 // Top-level page wrapper used as the root layout in App.tsx. Renders the
 // Header above the current route's page component via <Outlet>.

webui2/src/components/shared/IssueRow.stories.tsx → webui2/src/components/shared/issue-row.stories.tsx 🔗

@@ -5,8 +5,8 @@ import type { BugSummaryFragment } from "@/__generated__/graphql";
 import { Status } from "@/__generated__/graphql";
 import { withRouter } from "@/../.storybook/decorators";
 
-import * as IssueRow from "./IssueRow";
-import { LabelBadge } from "./LabelBadge";
+import * as IssueRow from "./issue-row";
+import { LabelBadge } from "./label-badge";
 
 const meta = {
   component: IssueRow.Root,

webui2/src/components/shared/IssueRow.test.tsx → webui2/src/components/shared/issue-row.test.tsx 🔗

@@ -1,7 +1,7 @@
 import { composeStories } from "@storybook/react-vite";
 import { expect, test } from "vitest";
 
-import * as stories from "./IssueRow.stories";
+import * as stories from "./issue-row.stories";
 
 const composed = composeStories(stories);
 

webui2/src/components/shared/LabelBadge.stories.tsx → webui2/src/components/shared/label-badge.stories.tsx 🔗

@@ -3,7 +3,7 @@ import { fn } from "storybook/test";
 
 import type { LabelFieldsFragment } from "@/__generated__/graphql";
 
-import { LabelBadge } from "./LabelBadge";
+import { LabelBadge } from "./label-badge";
 
 const meta = {
   component: LabelBadge,

webui2/src/components/shared/LabelBadge.test.tsx → webui2/src/components/shared/label-badge.test.tsx 🔗

@@ -1,7 +1,7 @@
 import { composeStories } from "@storybook/react-vite";
 import { expect, test } from "vitest";
 
-import * as stories from "./LabelBadge.stories";
+import * as stories from "./label-badge.stories";
 
 const composed = composeStories(stories);
 

webui2/src/components/shared/StatusBadge.stories.tsx → webui2/src/components/shared/status-badge.stories.tsx 🔗

@@ -2,7 +2,7 @@ import type { Meta, StoryObj } from "@storybook/react-vite";
 
 import { Status } from "@/__generated__/graphql";
 
-import { StatusBadge } from "./StatusBadge";
+import { StatusBadge } from "./status-badge";
 
 const meta = {
   component: StatusBadge,

webui2/src/components/shared/StatusBadge.test.tsx → webui2/src/components/shared/status-badge.test.tsx 🔗

@@ -1,7 +1,7 @@
 import { composeStories } from "@storybook/react-vite";
 import { expect, test } from "vitest";
 
-import * as stories from "./StatusBadge.stories";
+import * as stories from "./status-badge.stories";
 
 const composed = composeStories(stories);
 

webui2/src/components/shared/write-preview.stories.tsx 🔗

@@ -1,7 +1,7 @@
 import type { Meta, StoryObj } from "@storybook/react-vite";
 import { useState } from "react";
 
-import { Markdown } from "@/components/content/Markdown";
+import { Markdown } from "@/components/content/markdown";
 import { Textarea } from "@/components/ui/textarea";
 import { withRouter } from "@/../.storybook/decorators";
 

webui2/src/routes/$repo/_code.tsx 🔗

@@ -13,8 +13,8 @@ import {
 import { GitCommit } from "lucide-react";
 
 import type { GitRef } from "@/__generated__/graphql";
-import { CodeBreadcrumb } from "@/components/code/CodeBreadcrumb";
-import { RefSelector } from "@/components/code/RefSelector";
+import { CodeBreadcrumb } from "@/components/code/code-breadcrumb";
+import { RefSelector } from "@/components/code/ref-selector";
 import { ButtonLink } from "@/components/ui/button-link";
 import { Skeleton } from "@/components/ui/skeleton";
 

webui2/src/routes/$repo/_code/blob/$ref/$.tsx 🔗

@@ -5,7 +5,7 @@ import { useReadQuery } from "@apollo/client/react";
 import { createFileRoute } from "@tanstack/react-router";
 
 import type { GitBlob } from "@/__generated__/graphql";
-import { FileViewer } from "@/components/code/FileViewer";
+import { FileViewer } from "@/components/code/file-viewer";
 import { Skeleton } from "@/components/ui/skeleton";
 
 const BLOB_QUERY = gql`

webui2/src/routes/$repo/_code/commits/$ref.tsx 🔗

@@ -2,7 +2,7 @@
 
 import { createFileRoute } from "@tanstack/react-router";
 
-import { CommitList } from "@/components/code/CommitList";
+import { CommitList } from "@/components/code/commit-list";
 
 export const Route = createFileRoute("/$repo/_code/commits/$ref")({
   component: CommitsView,

webui2/src/routes/$repo/_code/tree/$ref/$.tsx 🔗

@@ -10,9 +10,9 @@ import {
   type GitLastCommit,
   type GitBlob,
 } from "@/__generated__/graphql";
-import { FileTree } from "@/components/code/FileTree";
-import type { TreeEntryWithCommit } from "@/components/code/FileTree";
-import { Markdown } from "@/components/content/Markdown";
+import { FileTree } from "@/components/code/file-tree";
+import type { TreeEntryWithCommit } from "@/components/code/file-tree";
+import { Markdown } from "@/components/content/markdown";
 import { Skeleton } from "@/components/ui/skeleton";
 
 const TREE_QUERY = gql`

webui2/src/routes/$repo/_issues/issues/$id.tsx 🔗

@@ -3,11 +3,11 @@ import { createFileRoute, Link } from "@tanstack/react-router";
 import { formatDistanceToNow } from "date-fns";
 
 import { type BugDetailQuery, BugDetailDocument } from "@/__generated__/graphql";
-import { CommentBox } from "@/components/bugs/CommentBox";
-import { LabelEditor } from "@/components/bugs/LabelEditor";
-import { StatusBadge } from "@/components/shared/StatusBadge";
-import { Timeline } from "@/components/bugs/Timeline";
-import { TitleEditor } from "@/components/bugs/TitleEditor";
+import { CommentBox } from "@/components/bugs/comment-box";
+import { LabelEditor } from "@/components/bugs/label-editor";
+import { StatusBadge } from "@/components/shared/status-badge";
+import { Timeline } from "@/components/bugs/timeline";
+import { TitleEditor } from "@/components/bugs/title-editor";
 import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar";
 import { BackLink } from "@/components/ui/back-link";
 import { EmptyState } from "@/components/shared/empty-state";

webui2/src/routes/$repo/_issues/issues/index.tsx 🔗

@@ -6,10 +6,10 @@ import { useMemo, useState } from "react";
 import * as v from "valibot";
 
 import { type BugListQuery, BugListDocument } from "@/__generated__/graphql";
-import { IssueFilters } from "@/components/bugs/IssueFilters";
-import type { SortValue } from "@/components/bugs/IssueFilters";
-import * as IssueRow from "@/components/shared/IssueRow";
-import { LabelBadgeLink } from "@/components/shared/LabelBadge";
+import { IssueFilters } from "@/components/bugs/issue-filters";
+import type { SortValue } from "@/components/bugs/issue-filters";
+import * as IssueRow from "@/components/shared/issue-row";
+import { LabelBadgeLink } from "@/components/shared/label-badge";
 import { Button } from "@/components/ui/button";
 import { EmptyState } from "@/components/shared/empty-state";
 import * as Pagination from "@/components/shared/pagination";

webui2/src/routes/$repo/_issues/issues/new.tsx 🔗

@@ -2,7 +2,7 @@ import { createFileRoute, useNavigate } from "@tanstack/react-router";
 import { useState } from "react";
 
 import { useBugCreateMutation } from "@/__generated__/graphql";
-import { Markdown } from "@/components/content/Markdown";
+import { Markdown } from "@/components/content/markdown";
 import { BackLink } from "@/components/ui/back-link";
 import { Button } from "@/components/ui/button";
 import { ButtonLink } from "@/components/ui/button-link";

webui2/src/routes/$repo/_issues/user/$id.tsx 🔗

@@ -14,8 +14,8 @@ import {
 import * as v from "valibot";
 
 import { type UserProfileQuery, UserProfileDocument } from "@/__generated__/graphql";
-import * as IssueRow from "@/components/shared/IssueRow";
-import { LabelBadge } from "@/components/shared/LabelBadge";
+import * as IssueRow from "@/components/shared/issue-row";
+import { LabelBadge } from "@/components/shared/label-badge";
 import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar";
 import { BackLink } from "@/components/ui/back-link";
 import { EmptyState } from "@/components/shared/empty-state";

webui2/src/routes/$repo/commit/$hash.tsx 🔗

@@ -7,7 +7,7 @@ import { createFileRoute, Link } from "@tanstack/react-router";
 import { format } from "date-fns";
 import { GitCommit } from "lucide-react";
 
-import { FileDiffView } from "@/components/code/FileDiffView";
+import { FileDiffView } from "@/components/code/file-diff-view";
 import { BackLink } from "@/components/ui/back-link";
 import { Skeleton } from "@/components/ui/skeleton";
 

webui2/src/routes/__root.tsx 🔗

@@ -1,7 +1,7 @@
 import { createRootRouteWithContext, useRouter } from "@tanstack/react-router";
 import { AlertTriangle } from "lucide-react";
 
-import { Shell } from "@/components/layout/Shell";
+import { Shell } from "@/components/layout/shell";
 import { Button } from "@/components/ui/button";
 import { ButtonLink } from "@/components/ui/button-link";
 import type { preloadQuery } from "@/lib/apollo";