diff --git a/frontend/index.html b/frontend/index.html index 0fca6f0..1f4026a 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -4,7 +4,15 @@ - frontend + ForgeBucket +
diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 4cda9e0..42deec2 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -50,8 +50,8 @@ function CSRFBootstrap() { function NotFound() { return (
-

404

-

Page not found.

+

404

+

Page not found.

) } diff --git a/frontend/src/components/ci/PipelineWaterfall.tsx b/frontend/src/components/ci/PipelineWaterfall.tsx index a262164..a463124 100644 --- a/frontend/src/components/ci/PipelineWaterfall.tsx +++ b/frontend/src/components/ci/PipelineWaterfall.tsx @@ -13,19 +13,19 @@ interface PipelineWaterfallProps { } const STATUS_COLOR: Record = { - pending: 'bg-[#F4F5F7] border-[#DFE1E6] text-[#5E6C84]', - running: 'bg-[#DEEBFF] border-[#4C9AFF] text-[#0052CC]', + pending: 'bg-[var(--c-surface-muted)] border-[var(--c-border)] text-[var(--c-muted)]', + running: 'bg-[var(--c-brand-tint)] border-[var(--c-brand-focus)] text-[var(--c-brand)]', success: 'bg-[#E3FCEF] border-[#79F2C0] text-[#006644]', - failure: 'bg-[#FFEBE6] border-[#FF8F73] text-[#BF2600]', - cancelled: 'bg-[#F4F5F7] border-[#DFE1E6] text-[#5E6C84]', + failure: 'bg-[var(--c-danger-tint)] border-[#FF8F73] text-[var(--c-danger-dark)]', + cancelled: 'bg-[var(--c-surface-muted)] border-[var(--c-border)] text-[var(--c-muted)]', } const STATUS_DOT: Record = { - pending: 'bg-[#97A0AF]', - running: 'bg-[#0052CC] animate-pulse', - success: 'bg-[#00875A]', - failure: 'bg-[#DE350B]', - cancelled: 'bg-[#97A0AF]', + pending: 'bg-[var(--c-subtle)]', + running: 'bg-[var(--c-brand)] animate-pulse', + success: 'bg-[var(--c-success)]', + failure: 'bg-[var(--c-danger)]', + cancelled: 'bg-[var(--c-subtle)]', } const STATUS_LABEL: Record = { @@ -71,12 +71,12 @@ export function PipelineWaterfall({ pipeline, stages }: PipelineWaterfallProps) const resolvedStages = stages ?? defaultStages(pipeline.status) return ( -
+
{/* Pipeline header */}
- + Pipeline #{pipeline.id}
- {pipeline.ref} + {pipeline.ref}
{/* Waterfall stages */} @@ -108,8 +108,8 @@ export function PipelineWaterfall({ pipeline, stages }: PipelineWaterfallProps) {/* Connector arrow (not after last) */} {i < resolvedStages.length - 1 && (
-
- +
+
@@ -124,21 +124,21 @@ export function PipelineWaterfall({ pipeline, stages }: PipelineWaterfallProps) function StatusIcon({ status }: { status: Pipeline['status'] }) { if (status === 'success') { return ( - + ) } if (status === 'failure') { return ( - + ) } if (status === 'running') { return ( - + ) diff --git a/frontend/src/components/diff/DiffViewer.tsx b/frontend/src/components/diff/DiffViewer.tsx index 80d8105..a24a86d 100644 --- a/frontend/src/components/diff/DiffViewer.tsx +++ b/frontend/src/components/diff/DiffViewer.tsx @@ -16,7 +16,7 @@ interface DiffViewerProps { export function DiffViewer({ files }: DiffViewerProps) { if (!files.length) { return ( -
+
No changes in this diff.
) @@ -36,9 +36,9 @@ function FileDiffBlock({ file }: { file: FileDiff }) { const lines = useMemo(() => parsePatch(file.patch), [file.patch]) return ( -
+
{/* File header */} -
+
{file.additions > 0 && ( - +{file.additions} + +{file.additions} )} {file.deletions > 0 && ( - -{file.deletions} + -{file.deletions} )}
@@ -120,10 +120,10 @@ function parsePatch(patch: string): ParsedLine[] { function DiffLine({ line }: { line: ParsedLine }) { if (line.type === 'hunk') { return ( - - - - {line.content} + + + + {line.content} ) } @@ -131,14 +131,14 @@ function DiffLine({ line }: { line: ParsedLine }) { const bg = line.type === 'added' ? 'bg-[#E3FCEF]' : line.type === 'removed' - ? 'bg-[#FFEBE6]' + ? 'bg-[var(--c-danger-tint)]' : '' const gutter = line.type === 'added' ? 'bg-[#ABF5D1] text-[#006644]' : line.type === 'removed' - ? 'bg-[#FFBDAD] text-[#BF2600]' - : 'bg-[#F4F5F7] text-[#5E6C84]' + ? 'bg-[#FFBDAD] text-[var(--c-danger-dark)]' + : 'bg-[var(--c-surface-muted)] text-[var(--c-muted)]' const prefix = line.type === 'added' ? '+' : line.type === 'removed' ? '-' : ' ' diff --git a/frontend/src/components/diff/MobileComment.tsx b/frontend/src/components/diff/MobileComment.tsx index 73edbe7..2a5de66 100644 --- a/frontend/src/components/diff/MobileComment.tsx +++ b/frontend/src/components/diff/MobileComment.tsx @@ -48,7 +48,7 @@ export function MobileComment({ open, onClose, filePath, lineNumber, children }:
{/* Handle */}
-
+
{/* Header */} -
+
-

{filePath}

-

Line {lineNumber}

+

{filePath}

+

Line {lineNumber}

-
diff --git a/frontend/src/components/layout/AppShell.tsx b/frontend/src/components/layout/AppShell.tsx index 7f1be30..571e3b9 100644 --- a/frontend/src/components/layout/AppShell.tsx +++ b/frontend/src/components/layout/AppShell.tsx @@ -5,7 +5,7 @@ import { BottomTabBar } from './BottomTabBar' export function AppShell() { return ( -
+
{/* Top header — full width, always visible */}
diff --git a/frontend/src/components/layout/BottomTabBar.tsx b/frontend/src/components/layout/BottomTabBar.tsx index 83ddf15..0346a6e 100644 --- a/frontend/src/components/layout/BottomTabBar.tsx +++ b/frontend/src/components/layout/BottomTabBar.tsx @@ -57,7 +57,7 @@ export function BottomTabBar({ className }: BottomTabBarProps) { return (
@@ -46,7 +48,7 @@ export function Header() {
)} + {/* Dark mode toggle */} + + {/* Notifications (placeholder) */} - {updateBlob.isError && ( - {(updateBlob.error as Error)?.message} + {(updateBlob.error as Error)?.message} )}
) : isMarkdown && preview ? ( -
+
{blob.content}
) : ( @@ -184,10 +184,10 @@ export default function BlobPage() { {lines.map((line, i) => ( - + {i + 1} - {line || ' '} + {line || ' '} ))} diff --git a/frontend/src/pages/BranchesPage.tsx b/frontend/src/pages/BranchesPage.tsx index 1ed33a4..780151c 100644 --- a/frontend/src/pages/BranchesPage.tsx +++ b/frontend/src/pages/BranchesPage.tsx @@ -22,29 +22,29 @@ export default function BranchesPage() { return (
- {repo} - / - Branches + {repo} + / + Branches
-

Branches

+

Branches

- {isLoading &&

Loading branches…

} - {isError &&

Failed to load branches.

} + {isLoading &&

Loading branches…

} + {isError &&

Failed to load branches.

} {!isLoading && !branches?.length && ( -

No branches yet.

+

No branches yet.

)} {branches && branches.length > 0 && ( -
+
{branches.map((branch, i) => (
0 ? 'border-t border-[#DFE1E6]' : ''} hover:bg-[#FAFBFC]`}> - + className={`flex items-center gap-3 px-4 py-3 ${i > 0 ? 'border-t border-[var(--c-border)]' : ''} hover:bg-[var(--c-surface-raised)]`}> + + className="text-sm text-[var(--c-brand)] hover:underline font-mono"> {branch.name}
diff --git a/frontend/src/pages/CommitsPage.tsx b/frontend/src/pages/CommitsPage.tsx index 5cbd0b4..19fa90e 100644 --- a/frontend/src/pages/CommitsPage.tsx +++ b/frontend/src/pages/CommitsPage.tsx @@ -27,32 +27,32 @@ export default function CommitsPage() { return (
- {repo} - / - Commits + {repo} + / + Commits
- {isLoading &&

Loading commits…

} - {isError &&

Failed to load commits.

} + {isLoading &&

Loading commits…

} + {isError &&

Failed to load commits.

} {!isLoading && !commits?.length && ( -

No commits yet. Push your first commit to get started.

+

No commits yet. Push your first commit to get started.

)} {commits && commits.length > 0 && ( -
+
{commits.map((commit, i) => (
0 ? 'border-t border-[#DFE1E6]' : ''} hover:bg-[#FAFBFC]`}> -
+ className={`flex items-start gap-4 px-4 py-3 ${i > 0 ? 'border-t border-[var(--c-border)]' : ''} hover:bg-[var(--c-surface-raised)]`}> +
{commit.author?.[0]?.toUpperCase()}
-

{commit.message}

-

+

{commit.message}

+

{commit.author} · {new Date(commit.date).toLocaleDateString()}

- + {commit.hash.slice(0, 7)}
diff --git a/frontend/src/pages/CreateRepoPage.tsx b/frontend/src/pages/CreateRepoPage.tsx index f6792d2..725a9ab 100644 --- a/frontend/src/pages/CreateRepoPage.tsx +++ b/frontend/src/pages/CreateRepoPage.tsx @@ -32,12 +32,12 @@ export default function CreateRepoPage() {
{/* Header */}
-

Create a new repository

- +

Create a new repository

+ Import repository
-
+
@@ -49,10 +49,10 @@ export default function CreateRepoPage() { placeholder="my-repository" required autoFocus - className="w-full border border-[#DFE1E6] rounded px-3 py-2 text-sm focus:outline-none focus:border-[#4C9AFF] focus:ring-1 focus:ring-[#4C9AFF]" + className="w-full border border-[var(--c-border)] rounded px-3 py-2 text-sm focus:outline-none focus:border-[var(--c-brand-focus)] focus:ring-1 focus:ring-[var(--c-brand-focus)]" /> {name && !/^[a-zA-Z0-9._-]+$/.test(name) && ( -

Only letters, numbers, hyphens, underscores and dots are allowed.

+

Only letters, numbers, hyphens, underscores and dots are allowed.

)} @@ -63,11 +63,11 @@ export default function CreateRepoPage() { type="checkbox" checked={isPrivate} onChange={e => setIsPrivate(e.target.checked)} - className="mt-0.5 w-4 h-4 accent-[#0052CC]" + className="mt-0.5 w-4 h-4 accent-[var(--c-brand)]" />
- Private repository -

+ Private repository +

{isPrivate ? 'Uncheck to make this repository public. Public repositories typically contain open-source code and can be viewed by anyone.' : 'Check to make this repository private. Only invited collaborators can see and push to it.'} @@ -81,7 +81,7 @@ export default function CreateRepoPage() { setInitGitignore(e.target.value === 'yes')} - className="w-full border border-[#DFE1E6] rounded px-3 py-2 text-sm focus:outline-none focus:border-[#4C9AFF] bg-white" + className="w-full border border-[var(--c-border)] rounded px-3 py-2 text-sm focus:outline-none focus:border-[var(--c-brand-focus)] bg-[var(--c-surface)]" > @@ -116,7 +116,7 @@ export default function CreateRepoPage() {