refactor: extract FileBrowser and shared UI primitives (Task 1.2)

- Extract FileBrowser from inline definition in repo-workspace.tsx
- Create components/features/git/FileBrowser.tsx with module CSS
- Create reusable UI primitives: LoadingState, ErrorState, StatusBadge
- Create barrel exports for components/ui/ and components/features/git/
- Replace inline loading/error patterns in dashboard, sessions, repo-workspace

Quality gates: tsc (pass), eslint (pass)
Refs: repo-restructure Task 1.2
This commit is contained in:
Developer
2026-06-02 19:10:33 +00:00
parent 985ca538e3
commit aee3987c24
15 changed files with 1845 additions and 254 deletions
+9 -12
View File
@@ -19,6 +19,8 @@ import type { Session } from "../types/session";
import type { GitRepository } from "../types/git-repository";
import type { ToolType } from "../types/tool-type";
import { Icon } from "../components/icon";
import { LoadingState } from "../components/ui";
import { ErrorState } from "../components/ui";
type SessionsStatus = "loading" | "ready" | "error";
type CreateStatus = "idle" | "creating" | "error";
@@ -271,20 +273,15 @@ export const SessionsPage = () => {
<h1>Sessions</h1>
</div>
{status === "loading" && <p className="muted">Loading sessions...</p>}
{status === "loading" && (
<LoadingState message="Loading sessions..." />
)}
{status === "error" && (
<div className="card stack">
<p>Failed to load sessions</p>
<button
className="secondary-button"
onClick={() => void loadSessions()}
type="button"
>
<Icon name="refresh" size="sm" />
Retry
</button>
</div>
<ErrorState
message="Failed to load sessions"
onRetry={() => void loadSessions()}
/>
)}
{status === "ready" && (