+
Error details (development only)
-
+
{this.state.error.toString()}
{this.state.error.stack && `\n\n${this.state.error.stack}`}
@@ -101,7 +101,7 @@ class ErrorBoundary extends Component {
window.location.reload()}
- className="w-full px-4 py-2 bg-blue-600 text-white rounded-md hover:bg-blue-700 transition-colors"
+ className="w-full px-4 py-2 bg-primary text-primary-foreground rounded-md hover:bg-primary/90 transition-colors"
>
Refresh Page
diff --git a/web-ui/src/components/Navigation.tsx b/web-ui/src/components/Navigation.tsx
index 236aa3a0..b5162512 100644
--- a/web-ui/src/components/Navigation.tsx
+++ b/web-ui/src/components/Navigation.tsx
@@ -27,26 +27,26 @@ export default function Navigation() {
};
return (
-
+
- CodeFRAME
+ CodeFRAME
{isPending ? (
-
Loading...
+
Loading...
) : session ? (
<>
-
+
{session.user.name || session.user.email}
Logout
@@ -55,13 +55,13 @@ export default function Navigation() {
<>
Login
Signup
diff --git a/web-ui/src/components/PRDModal.tsx b/web-ui/src/components/PRDModal.tsx
index 42903562..f799fb4b 100644
--- a/web-ui/src/components/PRDModal.tsx
+++ b/web-ui/src/components/PRDModal.tsx
@@ -75,7 +75,7 @@ const PRDModal = memo(function PRDModal({ isOpen, onClose, prdData }: PRDModalPr
const renderContent = () => {
if (!prdData) {
return (
-
+
No PRD data available
);
@@ -84,15 +84,15 @@ const PRDModal = memo(function PRDModal({ isOpen, onClose, prdData }: PRDModalPr
if (prdData.status === 'generating') {
return (
-
-
Generating PRD...
+
+
Generating PRD...
);
}
if (prdData.status === 'not_found') {
return (
-
+
PRD Not Found
No Product Requirements Document has been generated for this project yet.
@@ -101,7 +101,7 @@ const PRDModal = memo(function PRDModal({ isOpen, onClose, prdData }: PRDModalPr
if (!prdData.prd_content || prdData.prd_content.trim() === '') {
return (
-
+
No content available
);
@@ -127,17 +127,17 @@ const PRDModal = memo(function PRDModal({ isOpen, onClose, prdData }: PRDModalPr
role="dialog"
aria-modal="true"
aria-labelledby="prd-modal-title"
- className="bg-white rounded-lg shadow-xl w-full max-w-4xl max-h-[90vh] flex flex-col"
+ className="bg-card rounded-lg shadow-xl w-full max-w-4xl max-h-[90vh] flex flex-col"
onClick={(e) => e.stopPropagation()}
>
{/* Header */}
-
+
-
+
Product Requirements Document
{prdData && (
-
+
Project: {prdData.project_id}
{prdData.status.toUpperCase()}
@@ -156,7 +156,7 @@ const PRDModal = memo(function PRDModal({ isOpen, onClose, prdData }: PRDModalPr
-
+
+
Generated: {' '}
{formatTimestamp(prdData.generated_at)}
diff --git a/web-ui/src/components/PhaseIndicator.tsx b/web-ui/src/components/PhaseIndicator.tsx
index 6ed41b36..88f84538 100644
--- a/web-ui/src/components/PhaseIndicator.tsx
+++ b/web-ui/src/components/PhaseIndicator.tsx
@@ -20,13 +20,13 @@ interface PhaseConfig {
const PHASE_CONFIGS: Record = {
discovery: {
label: 'Discovery',
- bgColor: 'bg-blue-100',
- textColor: 'text-blue-800',
+ bgColor: 'bg-primary/10',
+ textColor: 'text-primary',
},
planning: {
label: 'Planning',
- bgColor: 'bg-purple-100',
- textColor: 'text-purple-800',
+ bgColor: 'bg-secondary',
+ textColor: 'text-secondary-foreground',
},
active: {
label: 'Active',
@@ -40,15 +40,15 @@ const PHASE_CONFIGS: Record = {
},
complete: {
label: 'Complete',
- bgColor: 'bg-gray-100',
- textColor: 'text-gray-800',
+ bgColor: 'bg-muted',
+ textColor: 'text-muted-foreground',
},
};
const DEFAULT_PHASE_CONFIG: PhaseConfig = {
label: 'Unknown',
- bgColor: 'bg-gray-100',
- textColor: 'text-gray-800',
+ bgColor: 'bg-muted',
+ textColor: 'text-muted-foreground',
};
export default function PhaseIndicator({ phase }: PhaseIndicatorProps) {
diff --git a/web-ui/src/components/ProgressBar.tsx b/web-ui/src/components/ProgressBar.tsx
index 65feedf0..bdf0c25c 100644
--- a/web-ui/src/components/ProgressBar.tsx
+++ b/web-ui/src/components/ProgressBar.tsx
@@ -31,7 +31,7 @@ export default function ProgressBar({ percentage, label, showPercentage = false
{label && (
{label}
@@ -45,7 +45,7 @@ export default function ProgressBar({ percentage, label, showPercentage = false
aria-valuemin={0}
aria-valuemax={100}
aria-label={ariaLabel}
- className="w-full bg-gray-200 rounded-full h-4 relative overflow-hidden"
+ className="w-full bg-muted rounded-full h-4 relative overflow-hidden"
>
{/* Filled Progress Bar */}
-
+
{clampedPercentage}%
diff --git a/web-ui/src/components/ProjectCreationForm.tsx b/web-ui/src/components/ProjectCreationForm.tsx
index f88cce73..adc317f5 100644
--- a/web-ui/src/components/ProjectCreationForm.tsx
+++ b/web-ui/src/components/ProjectCreationForm.tsx
@@ -150,14 +150,14 @@ const ProjectCreationForm: React.FC = ({
!isSubmitting;
return (
-
-
Create New Project
+
+
Create New Project
{/* US3: Error Message Display */}
{errors.submit && (
-
-
+
+
⚠️
Error: {errors.submit}
diff --git a/web-ui/src/components/ProjectList.tsx b/web-ui/src/components/ProjectList.tsx
index 66e56978..321948af 100644
--- a/web-ui/src/components/ProjectList.tsx
+++ b/web-ui/src/components/ProjectList.tsx
@@ -53,7 +53,7 @@ export default function ProjectList() {
if (isLoading) {
return (
-
Loading projects...
+
Loading projects...
);
}
@@ -62,7 +62,7 @@ export default function ProjectList() {
if (error) {
return (
-
Failed to load projects. Please try again.
+
Failed to load projects. Please try again.
);
}
@@ -73,10 +73,10 @@ export default function ProjectList() {
{/* Header with Create button */}
-
Your Projects
+
Your Projects
setShowForm(true)}
- className="px-4 py-2 bg-blue-600 text-white rounded-md hover:bg-blue-700 transition-colors"
+ className="px-4 py-2 bg-primary text-primary-foreground rounded-md hover:bg-primary/90 transition-colors"
>
Create New Project
@@ -84,12 +84,12 @@ export default function ProjectList() {
{/* Project Creation Form */}
{showForm && (
-
+
-
Create New Project
+
Create New Project
setShowForm(false)}
- className="text-gray-500 hover:text-gray-700"
+ className="text-muted-foreground hover:text-foreground"
>
✕
@@ -100,9 +100,9 @@ export default function ProjectList() {
{/* Projects Grid or Empty State */}
{projects.length === 0 ? (
-
+
-
+
No projects yet. Create your first project!
@@ -113,10 +113,10 @@ export default function ProjectList() {
handleProjectClick(project.id)}
- className="bg-white rounded-lg shadow p-6 cursor-pointer hover:shadow-lg transition-shadow"
+ className="bg-card rounded-lg shadow p-6 cursor-pointer hover:shadow-lg transition-shadow"
>
-
{project.name}
-
+
{project.name}
+
Status: {project.status}
@@ -124,7 +124,7 @@ export default function ProjectList() {
Phase:
{project.phase}
{project.created_at && (
-
{formatDate(project.created_at)}
+
{formatDate(project.created_at)}
)}
diff --git a/web-ui/src/components/SessionStatus.tsx b/web-ui/src/components/SessionStatus.tsx
index 11a0cb28..1657176e 100644
--- a/web-ui/src/components/SessionStatus.tsx
+++ b/web-ui/src/components/SessionStatus.tsx
@@ -54,10 +54,10 @@ export function SessionStatus({ projectId }: SessionStatusProps) {
if (isLoading) {
return (
-
+
📋
- Loading session...
+ Loading session...
);
@@ -65,10 +65,10 @@ export function SessionStatus({ projectId }: SessionStatusProps) {
if (error) {
return (
-
+
⚠️
-
+
Could not load session state: {error}
@@ -84,18 +84,18 @@ export function SessionStatus({ projectId }: SessionStatusProps) {
const isNewSession = session.last_session.summary === 'No previous session';
return (
-
+
📋
-
+
Session Context
{isNewSession ? (
-
+
🚀 Starting new session...
-
+
No previous session state found
@@ -103,11 +103,11 @@ export function SessionStatus({ projectId }: SessionStatusProps) {
<>
{/* Last Session */}
-
+
Last session:
- {session.last_session.summary}
-
+
{session.last_session.summary}
+
{formatDistanceToNow(new Date(session.last_session.timestamp), {
addSuffix: true,
})}
@@ -117,10 +117,10 @@ export function SessionStatus({ projectId }: SessionStatusProps) {
{/* Next Actions */}
{session.next_actions && session.next_actions.length > 0 && (