Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions frontend/src/components/forge/BentoCard.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import React from 'react';

/**
* Hover-glow bento card. Tracks cursor for the radial glow (forge signature).
*/
export default function BentoCard({ icon: Icon, title, description, className = '' }) {
const onMove = (e) => {
const r = e.currentTarget.getBoundingClientRect();
e.currentTarget.style.setProperty('--mx', `${e.clientX - r.left}px`);
e.currentTarget.style.setProperty('--my', `${e.clientY - r.top}px`);
};
return (
<div className={`forge-card ${className}`} onMouseMove={onMove}>
{Icon && (
<div className="ico">
<Icon size={22} strokeWidth={1.8} />
</div>
)}
<h3>{title}</h3>
<p>{description}</p>
</div>
);
}
9 changes: 9 additions & 0 deletions frontend/src/components/forge/ForgeButton.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import React from 'react';
import { Link } from 'react-router-dom';

/** Forge button — renders as router Link or anchor. */
export default function ForgeButton({ to, href, children, variant = 'primary', ...rest }) {
const cls = `forge-btn ${variant === 'primary' ? 'forge-btn-primary' : 'forge-btn-ghost'}`;
if (to) return <Link to={to} className={cls} {...rest}>{children}</Link>;
return <a href={href || '#'} className={cls} {...rest}>{children}</a>;
}
166 changes: 166 additions & 0 deletions frontend/src/components/forge/ForgeFeaturePage.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,166 @@
import React from 'react';
import { Link } from 'react-router-dom';
import { useAuth } from '../../hooks/useAuth';
import { FEATURES_BY_SLUG } from '../../data/featuresConfig';
import Seo from '../../components/Seo';
import '../styles/forge.css';

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggestion: This stylesheet path resolves to components/styles/forge.css, but the CSS file lives under src/styles, so the import fails and Forge styles will not be applied. Fix the relative path to the actual stylesheet location. [import error]

Severity Level: Critical 🚨
❌ Missing CSS import may break build in bundler.
⚠️ Forge feature page renders without Forge visual styles.
Steps of Reproduction ✅
1. In `frontend/src/components/forge/ForgeFeaturePage.jsx`, note the stylesheet import at
line 6: `import '../styles/forge.css';`.

2. This file resides in `frontend/src/components/forge/`, so the `../styles/forge.css`
path resolves to `frontend/src/components/styles/forge.css`.

3. A Glob search for `**/forge.css` under `/workspace/career-pilot` finds only
`/workspace/career-pilot/frontend/src/styles/forge.css`, confirming there is no
`frontend/src/components/styles/forge.css` file.

4. When bundling `ForgeFeaturePage`, the CSS loader cannot resolve `../styles/forge.css`,
leading either to a build-time "file not found" error or Forge feature pages rendering
without the Forge design system styles defined in `frontend/src/styles/forge.css`.

Fix in Cursor Fix in VSCode Claude

(Use Cmd/Ctrl + Click for best experience)

Prompt for AI Agent 🤖
This is a comment left during a code review.

**Path:** frontend/src/components/forge/ForgeFeaturePage.jsx
**Line:** 6:6
**Comment:**
	*Import Error: This stylesheet path resolves to `components/styles/forge.css`, but the CSS file lives under `src/styles`, so the import fails and Forge styles will not be applied. Fix the relative path to the actual stylesheet location.

Validate the correctness of the flagged issue. If correct, How can I resolve this? If you propose a fix, implement it and please make it concise.
Once fix is implemented, also check other comments on the same PR, and ask user if the user wants to fix the rest of the comments as well. if said yes, then fetch all the comments validate the correctness and implement a minimal fix
👍 | 👎

import StatusBadge from './forge/StatusBadge';
import MetricChip from './forge/MetricChip';
import ForgeButton from './forge/ForgeButton';
import BentoCard from './forge/BentoCard';
Comment on lines +7 to +10

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggestion: The component imports point to a non-existent nested forge directory, so module resolution will fail and this page cannot load. Update these imports to reference sibling files in the same folder. [import error]

Severity Level: Critical 🚨
❌ Forge feature routes error; ResumeBuilderForge page fails to load.
⚠️ Other Forge routes break importing ForgeFeaturePage component.
Steps of Reproduction ✅
1. Open `frontend/src/pages/features/ResumeBuilderForge.jsx` (lines 1-4) which imports
`ForgeFeaturePage` from `../../components/forge/ForgeFeaturePage` and renders it with
`slug="resume-builder"`.

2. When the app bundles this route, the bundler loads
`frontend/src/components/forge/ForgeFeaturePage.jsx`, which at lines 7-10 imports
`StatusBadge`, `MetricChip`, `ForgeButton`, and `BentoCard` from `./forge/...`.

3. Because `ForgeFeaturePage.jsx` lives in `frontend/src/components/forge/`, the
`./forge/StatusBadge` path resolves to
`frontend/src/components/forge/forge/StatusBadge.jsx`, but BulkRead shows the actual
component file at `frontend/src/components/forge/StatusBadge.jsx` (line 1) with no `forge`
subdirectory present.

4. At build or runtime, module resolution for `./forge/StatusBadge` (and the other three
imports) fails with a "Module not found" error, preventing `ForgeFeaturePage` and all
feature routes (e.g., `ResumeBuilderForge.jsx`, `ResumeRoastForge.jsx`,
`MockInterviewForge.jsx`, `ProjectVisualizerForge.jsx`) from loading.

Fix in Cursor Fix in VSCode Claude

(Use Cmd/Ctrl + Click for best experience)

Prompt for AI Agent 🤖
This is a comment left during a code review.

**Path:** frontend/src/components/forge/ForgeFeaturePage.jsx
**Line:** 7:10
**Comment:**
	*Import Error: The component imports point to a non-existent nested `forge` directory, so module resolution will fail and this page cannot load. Update these imports to reference sibling files in the same folder.

Validate the correctness of the flagged issue. If correct, How can I resolve this? If you propose a fix, implement it and please make it concise.
Once fix is implemented, also check other comments on the same PR, and ask user if the user wants to fix the rest of the comments as well. if said yes, then fetch all the comments validate the correctness and implement a minimal fix
👍 | 👎


const ICONS = {
FileText: 'M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z M14 2v6h6',
Type: 'M4 7V4h16v3 M9 20h6 M12 4v16',
Github: 'M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22',
Sparkles: 'M12 3v3 M12 18v3 M3 12h3 M18 12h3 M5.6 5.6l2.1 2.1 M16.3 16.3l2.1 2.1 M18.4 5.6l-2.1 2.1 M7.7 16.3l-2.1 2.1',
BarChart: 'M3 3v18h18 M8 17V9 M13 17V5 M18 17v-6',
Layout: 'M3 3h18v18H3z M3 9h18 M9 21V9',
Linkedin: 'M4 4a2 2 0 1 0 0 4 2 2 0 0 0 0-4z M4 9h4v11H4z M10 9h4v3a4 4 0 0 1 8 0v8h-4v-7a2 2 0 0 0-4 0v7h-4z',
Download: 'M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4 M7 10l5 5 5-5 M12 15V3',
Mic: 'M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z M19 10v2a7 7 0 0 1-14 0v-2 M12 19v4 M8 23h8',
Briefcase: 'M2 7h20v13H2z M16 21V5a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16',
Flame: 'M12 2s4 4 4 8a4 4 0 0 1-8 0c0-1 .5-2 1-3-2 1-4 3-4 6a7 7 0 0 0 14 0c0-5-7-11-7-11z',
Network: 'M12 2a3 3 0 1 0 0 6 3 3 0 0 0 0-6z M5 16a3 3 0 1 0 0 6 3 3 0 0 0 0-6z M19 16a3 3 0 1 0 0 6 3 3 0 0 0 0-6z M7 18l3-7 M17 18l-3-7 M8 19h8',
Users: 'M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2 M9 11a4 4 0 1 0 0-8 4 4 0 0 0 0 8z M23 21v-2a4 4 0 0 0-3-3.87 M16 3.13a4 4 0 0 1 0 7.75',
Palette: 'M12 2a9 9 0 0 0 0 18c1.1 0 2-.9 2-2 0-.5-.2-1-.5-1.3-.3-.4-.5-.8-.5-1.2 0-1 .8-1.8 1.8-1.8H17a4 4 0 0 0 4-4c0-4.4-4-8-9-8z M7.5 11.5A1 1 0 1 0 7 13a1 1 0 0 0 .5-1.5z M12 7.5A1 1 0 1 0 12.5 9 1 1 0 0 0 12 7.5z',
Zap: 'M13 2L3 14h9l-1 8 10-12h-9z',
Smartphone: 'M7 2h10a2 2 0 0 1 2 2v16a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2z M12 18h.01',
Globe: 'M12 2a10 10 0 1 0 0 20 10 10 0 0 0 0-20z M2 12h20 M12 2a15 15 0 0 1 0 20 M12 2a15 15 0 0 0 0 20',
};

function Icon({ name, size = 22, strokeWidth = 1.8 }) {
const d = ICONS[name];
if (!d) return null;
Comment on lines +33 to +34

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggestion: Returning null for unknown icon names causes empty icon slots for configured features whose icon keys are not present in the local icon map (for example Target, Share, Code, Star, MessageSquare, BookOpen, Search, ListTodo, Bell, Video). Add these mappings or provide a visible fallback icon instead of rendering nothing. [incomplete implementation]

Severity Level: Major ⚠️
⚠️ Showcase cards lose icons for several Forge features.
⚠️ Visual polish degraded on resume roast, job finder pages.
Steps of Reproduction ✅
1. Inspect `frontend/src/data/featuresConfig.js` lines 123-260 where multiple feature
configs define `showcase.features` icons: e.g., Resume Roast uses `'Target'` and `'Share'`
(lines 124-129), GitHub Portfolio uses `'Code'` and `'Star'` (lines 167-172), Project
Visualizer uses `'MessageSquare'` and `'BookOpen'` (lines 210-215), and Job Finder uses
`'Search'`, `'Target'`, `'ListTodo'`, and `'Bell'` (lines 253-258).

2. In `frontend/src/components/forge/ForgeFeaturePage.jsx` lines 12-29, the local `ICONS`
map defines paths for `FileText`, `Type`, `Github`, `Sparkles`, `BarChart`, `Layout`,
`Linkedin`, `Download`, `Mic`, `Briefcase`, `Flame`, `Network`, `Users`, `Palette`, `Zap`,
`Smartphone`, and `Globe`, but contains no entries for `Target`, `Share`, `Code`, `Star`,
`MessageSquare`, `BookOpen`, `Search`, `ListTodo`, or `Bell`.

3. The `Icon` component at lines 32-40 reads `const d = ICONS[name];` and executes `if
(!d) return null;`, so when `ForgeFeaturePage` renders showcase cards at lines 98-110
(`config.showcase.features.map((f, i) => <BentoCard ... icon={(p) => <Icon name={f.icon}
{...p} />} />)`), any feature whose `f.icon` is one of the missing names causes `Icon` to
return `null`.

4. `frontend/src/components/forge/BentoCard.jsx` lines 13-18 render the icon only when the
`Icon` prop is truthy; since `Icon` returns `null` for these names, the `.ico` container
for those showcase cards is empty, resulting in blank icon slots for several feature pages
once `ForgeFeaturePage` is successfully wired and the `FEATURES_BY_SLUG[slug]` config is
exported correctly.

Fix in Cursor Fix in VSCode Claude

(Use Cmd/Ctrl + Click for best experience)

Prompt for AI Agent 🤖
This is a comment left during a code review.

**Path:** frontend/src/components/forge/ForgeFeaturePage.jsx
**Line:** 33:34
**Comment:**
	*Incomplete Implementation: Returning `null` for unknown icon names causes empty icon slots for configured features whose icon keys are not present in the local icon map (for example `Target`, `Share`, `Code`, `Star`, `MessageSquare`, `BookOpen`, `Search`, `ListTodo`, `Bell`, `Video`). Add these mappings or provide a visible fallback icon instead of rendering nothing.

Validate the correctness of the flagged issue. If correct, How can I resolve this? If you propose a fix, implement it and please make it concise.
Once fix is implemented, also check other comments on the same PR, and ask user if the user wants to fix the rest of the comments as well. if said yes, then fetch all the comments validate the correctness and implement a minimal fix
👍 | 👎

return (
<svg width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth={strokeWidth} strokeLinecap="round" strokeLinejoin="round" aria-hidden="true">
{d.split(' M').map((seg, i) => (
<path key={i} d={(i === 0 ? seg : 'M' + seg)} />
))}
</svg>
);
}

/**
* ForgeFeaturePage — data-driven landing for a single feature route.
* Reads the existing FEATURES_BY_SLUG[slug] config and renders a cohesive,
* forge-ai-inspired page (status chips, monospace metrics, bento showcase, steps).
* Each route landing imports this with its slug.
*/
export default function ForgeFeaturePage({ slug }) {
const { user } = useAuth();
const config = FEATURES_BY_SLUG[slug];
if (!config) return <div className="forge-page">Unknown feature: {slug}</div>;

const heroCtaText = user ? config.primaryAction.label : config.hero.primaryCta.text;
const heroCtaLink = user ? config.primaryAction.to : config.hero.primaryCta.to;
const ctaText = user ? config.primaryAction.label : config.cta.ctaText;
const ctaLink = user ? config.primaryAction.to : config.cta.ctaTo;

return (
<div className="forge-page">
<Seo {...config.seo} />

<nav className="forge-nav">
<Link to="/" className="forge-brand">CareerPilot<span className="dot">.</span></Link>
<div className="forge-nav-links">
<Link to="/resume-builder" className="forge-nav-link">Resume Builder</Link>
<Link to="/portfolio-builder" className="forge-nav-link">Portfolio</Link>
<Link to="/job-finder" className="forge-nav-link">Job Finder</Link>
<Link to="/mock-interview" className="forge-nav-link">Mock Interview</Link>
</div>
<div className="forge-nav-actions">
{!user && <ForgeButton href="/login" variant="ghost">Sign in</ForgeButton>}
<ForgeButton to={heroCtaLink} variant="primary">{user ? 'Dashboard' : 'Get started for free'}</ForgeButton>
</div>
</nav>

{/* HERO */}
<section className="forge-section forge-container forge-hero">
<StatusBadge label="OPERATIONAL" />
<h1>
{config.hero.title} <span className="accent">{config.hero.accentText}</span>
</h1>
<p>{config.hero.description}</p>
<div className="forge-hero-actions">
<ForgeButton to={heroCtaLink} variant="primary">{heroCtaText}</ForgeButton>
{config.hero.secondaryCta && (
<ForgeButton href={config.hero.secondaryCta.href} variant="ghost">{config.hero.secondaryCta.text}</ForgeButton>
)}
</div>
<div className="forge-metrics">
{config.hero.stats.map((s, i) => (
<MetricChip key={i} value={s.value} label={s.label} accent={i === 0} />
))}
</div>
</section>

{/* SHOWCASE */}
{config.showcase && (
<section className="forge-section forge-container" id="demo">
<div style={{ textAlign: 'center' }}>
<span className="forge-label">Capabilities</span>
<h2 className="forge-h2">{config.showcase.heading}</h2>
</div>
<div className="forge-bento">
{config.showcase.features.map((f, i) => (
<BentoCard key={i} icon={(p) => <Icon name={f.icon} {...p} />} title={f.title} description={f.description} />
))}
</div>
</section>
)}

{/* HOW IT WORKS */}
{config.howItWorks && (
<section className="forge-section forge-container">
<div style={{ textAlign: 'center' }}>
<span className="forge-label">Workflow</span>
<h2 className="forge-h2">{config.howItWorks.title}</h2>
</div>
<div className="forge-steps">
{config.howItWorks.steps.map((s, i) => (
<div key={i} className="forge-step">
<span className="n">STEP {s.number}</span>
<h4>{s.title}</h4>
<p>{s.description}</p>
</div>
))}
</div>
</section>
)}

{/* TESTIMONIALS */}
{config.testimonials && config.testimonials.items?.length > 0 && (
<section className="forge-section forge-container">
<div style={{ textAlign: 'center' }}>
<span className="forge-label">Signal</span>
<h2 className="forge-h2">{config.testimonials.heading}</h2>
</div>
{config.testimonials.items.map((t, i) => (
<div key={i} className="forge-quote">
<p className="q">“{t.quote}”</p>
<div className="who">
{t.avatar && <img src={t.avatar} alt="" width="36" height="36" style={{ borderRadius: '50%' }} />}
<span><strong style={{ color: 'var(--forge-text)' }}>{t.name}</strong> · {t.role}{t.company ? ` @ ${t.company}` : ''}</span>
<span className="metric" style={{ marginLeft: 'auto' }}>{t.metric}</span>
</div>
</div>
))}
</section>
)}

{/* CTA */}
<section className="forge-container">
<div className="forge-cta">
<h2>{config.cta.headline}</h2>
<p>{config.cta.subtext}</p>
<ForgeButton to={ctaLink} variant="primary">{ctaText}</ForgeButton>
</div>
</section>

<footer className="forge-foot">
CareerPilot · {config.name} · built with the Forge design system
</footer>
</div>
);
}
11 changes: 11 additions & 0 deletions frontend/src/components/forge/MetricChip.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import React from 'react';

/** Monospace metric chip used in hero stat rows. */
export default function MetricChip({ value, label, accent = false }) {
return (
<div className="forge-metric">
<div className={`v ${accent ? 'accent' : ''}`}>{value}</div>
<div className="l">{label}</div>
</div>
);
}
15 changes: 15 additions & 0 deletions frontend/src/components/forge/StatusBadge.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import React from 'react';

/**
* Forge signature status chip — operational/SLA style pill.
* variant: 'ok' | 'warn' | 'danger'
*/
export default function StatusBadge({ label = 'OPERATIONAL', variant = 'ok', className = '' }) {
const v = variant === 'danger' ? 'danger' : variant === 'warn' ? 'warn' : 'ok';
return (
<span className={`forge-status ${v} ${className}`}>
<span className="pulse" />
{label}
</span>
);
}
80 changes: 80 additions & 0 deletions frontend/src/components/landing/ForgeToolsSection.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
import React from 'react';
import { motion } from 'framer-motion';
import { FEATURES } from '../../data/featuresConfig';
import '../styles/forge.css';

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggestion: This stylesheet import also points to a non-existent components/styles/forge.css path, which breaks CSS loading for the landing tools section. Update it to the correct path under src/styles. [import error]

Severity Level: Critical 🚨
❌ Homepage tools section may fail CSS import at build.
⚠️ Tools grid renders unstyled without Forge design system.
Steps of Reproduction ✅
1. In `frontend/src/components/landing/ForgeToolsSection.jsx`, observe the stylesheet
import at line 4: `import '../styles/forge.css';`.

2. This component resides in `frontend/src/components/landing/`, so `../styles/forge.css`
resolves to `frontend/src/components/styles/forge.css`.

3. A Glob search for `**/forge.css` under `/workspace/career-pilot` shows the only Forge
stylesheet at `/workspace/career-pilot/frontend/src/styles/forge.css`, with no
`frontend/src/components/styles/forge.css` present.

4. When the homepage renders `ForgeToolsSection` from `frontend/src/pages/Home.jsx` (as
per repo context), the bundler attempts to load `../styles/forge.css` and fails to find
the file, leading to either a build-time error or the "Powerful AI tools for every step"
section rendering without the intended Forge design system styling.

Fix in Cursor Fix in VSCode Claude

(Use Cmd/Ctrl + Click for best experience)

Prompt for AI Agent 🤖
This is a comment left during a code review.

**Path:** frontend/src/components/landing/ForgeToolsSection.jsx
**Line:** 4:4
**Comment:**
	*Import Error: This stylesheet import also points to a non-existent `components/styles/forge.css` path, which breaks CSS loading for the landing tools section. Update it to the correct path under `src/styles`.

Validate the correctness of the flagged issue. If correct, How can I resolve this? If you propose a fix, implement it and please make it concise.
Once fix is implemented, also check other comments on the same PR, and ask user if the user wants to fix the rest of the comments as well. if said yes, then fetch all the comments validate the correctness and implement a minimal fix
👍 | 👎

import StatusBadge from '../forge/StatusBadge';
import ForgeButton from '../forge/ForgeButton';

const ICON_PATHS = {
FileText: 'M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z M14 2v6h6',
Palette: 'M12 2a9 9 0 0 0 0 18c1.1 0 2-.9 2-2 0-.5-.2-1-.5-1.3-.3-.4-.5-.8-.5-1.2 0-1 .8-1.8 1.8-1.8H17a4 4 0 0 0 4-4c0-4.4-4-8-9-8z M7.5 11.5A1 1 0 1 0 7 13a1 1 0 0 0 .5-1.5z M12 7.5A1 1 0 1 0 12.5 9 1 1 0 0 0 12 7.5z',
Flame: 'M12 2s4 4 4 8a4 4 0 0 1-8 0c0-1 .5-2 1-3-2 1-4 3-4 6a7 7 0 0 0 14 0c0-5-7-11-7-11z',
Github: 'M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22',
Network: 'M12 2a3 3 0 1 0 0 6 3 3 0 0 0 0-6z M5 16a3 3 0 1 0 0 6 3 3 0 0 0 0-6z M19 16a3 3 0 1 0 0 6 3 3 0 0 0 0-6z M7 18l3-7 M17 18l-3-7 M8 19h8',
Mic: 'M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z M19 10v2a7 7 0 0 1-14 0v-2 M12 19v4 M8 23h8',
Users: 'M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2 M9 11a4 4 0 1 0 0-8 4 4 0 0 0 0 8z M23 21v-2a4 4 0 0 0-3-3.87 M16 3.13a4 4 0 0 1 0 7.75',
Briefcase: 'M2 7h20v13H2z M16 21V5a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16',
};

const header = { hidden: {}, show: { transition: { staggerChildren: 0.12 } } };
const item = {
hidden: { opacity: 0, y: 24 },
show: { opacity: 1, y: 0, transition: { duration: 0.6, ease: [0.16, 1, 0.3, 1] } },
};

export default function ForgeToolsSection() {
return (
<section className="forge-page" style={{ padding: '84px 0' }}>
<div className="forge-container">
<motion.div
variants={header}
initial="hidden"
whileInView="show"
viewport={{ once: true, margin: '-100px' }}
style={{ textAlign: 'center' }}
>
<motion.div variants={item} style={{ display: 'flex', justifyContent: 'center', marginBottom: 18 }}>
<StatusBadge label="ALL SYSTEMS OPERATIONAL" />
</motion.div>
<motion.h2 variants={item} className="forge-h2">
Powerful AI tools for <span style={{ color: 'var(--forge-accent)' }}>every step</span>
</motion.h2>
<motion.p variants={item} className="forge-sub">
From your first resume draft to your final interview, CareerPilot gives you the unfair advantage you need.
</motion.p>
</motion.div>

<div className="forge-tools-grid" style={{ marginTop: 44 }}>
{FEATURES.map((f, i) => {
const Icon = (p) => (
<svg width={24} height={24} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth={1.8} strokeLinecap="round" strokeLinejoin="round" {...p}>
{(ICON_PATHS[f.icon?.name] || ICON_PATHS.FileText).split(' M').map((seg, k) => (
<path key={k} d={k === 0 ? seg : 'M' + seg} />
))}
</svg>
);
const large = f.size === 'large';
return (
<motion.div
key={f.slug}
variants={item}
className={`forge-tool ${large ? 'lg' : ''}`}
style={large ? { display: 'flex', flexDirection: 'column', justifyContent: 'space-between' } : {}}
>
<div className="ico"><Icon /></div>
<div>
<span className="badge-tag">{f.badge || 'Tool'}</span>
<h3>{f.name}</h3>
<p>{f.tagline}</p>
</div>
<div style={{ marginTop: 18 }}>
<ForgeButton to={f.primaryAction.to} variant="ghost">{f.primaryAction.label} →</ForgeButton>
</div>
</motion.div>
);
})}
</div>
</div>
</section>
);
}
5 changes: 3 additions & 2 deletions frontend/src/pages/Home.jsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
Warning: Identity file /home/azureuser/.ssh/id_rsa not accessible: No such file or directory.
import Navbar from '../components/Navbar'
import HeroSection from '../components/ui/HeroSection'
import OurToolsSection from '../components/landing/OurToolsSection'
import OurToolsSection from '../components/landing/ForgeToolsSection'

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggestion: The new homepage import wires in ForgeToolsSection, but that component currently imports its stylesheet via ../styles/forge.css from components/landing, which resolves to a non-existent components/styles path. This will fail module resolution when Home loads. Update the stylesheet import in ForgeToolsSection to the correct src/styles/forge.css relative path (or move to a shared alias import) before using it here. [import error]

Severity Level: Critical 🚨
- ❌ Home page bundle fails due to missing CSS import.
- ❌ New Forge tools section cannot render at all.
- ⚠️ Any route loading Home component experiences runtime failure.
Steps of Reproduction ✅
1. Start the frontend dev server or build (`npm run dev` / `npm run build`) so that
`frontend/src/pages/Home.jsx` is compiled and the `Home` component (lines 16-38 in the PR
hunk) is included in the main bundle.

2. During compilation, the static import at `frontend/src/pages/Home.jsx:4` (`import
OurToolsSection from '../components/landing/ForgeToolsSection'`) causes the bundler to
load `frontend/src/components/landing/ForgeToolsSection.jsx` (verified via BulkRead).

3. The `ForgeToolsSection.jsx` file at
`frontend/src/components/landing/ForgeToolsSection.jsx:4` contains `import
'../styles/forge.css';`, which resolves to `frontend/src/components/styles/forge.css`
because of the `../styles` relative path (components/landing → components/styles).

4. A Glob search shows the stylesheet actually lives at `frontend/src/styles/forge.css`
(not under `components/styles`), so the bundler cannot find `../styles/forge.css` and
raises a module resolution error (e.g., esbuild/webpack “Could not resolve
'../styles/forge.css'”), preventing the Home page bundle from building and stopping the
app from serving the homepage.

Fix in Cursor Fix in VSCode Claude

(Use Cmd/Ctrl + Click for best experience)

Prompt for AI Agent 🤖
This is a comment left during a code review.

**Path:** frontend/src/pages/Home.jsx
**Line:** 4:4
**Comment:**
	*Import Error: The new homepage import wires in `ForgeToolsSection`, but that component currently imports its stylesheet via `../styles/forge.css` from `components/landing`, which resolves to a non-existent `components/styles` path. This will fail module resolution when Home loads. Update the stylesheet import in `ForgeToolsSection` to the correct `src/styles/forge.css` relative path (or move to a shared alias import) before using it here.

Validate the correctness of the flagged issue. If correct, How can I resolve this? If you propose a fix, implement it and please make it concise.
Once fix is implemented, also check other comments on the same PR, and ask user if the user wants to fix the rest of the comments as well. if said yes, then fetch all the comments validate the correctness and implement a minimal fix
👍 | 👎

import FeaturesSection, { AdditionalFeatures } from '../components/ui/FeaturesSection'
import PortfolioShowcaseSection from '../components/ui/PortfolioShowcaseSection'
import ProjectVisualizerSection from '../components/ui/ProjectVisualizerSection'
Expand All @@ -26,7 +27,7 @@ export default function Home() {
{/* Hero Section with World Map */}
<HeroSection />

{/* Our Tools Section - Premium Feature Cards Grid */}
{/* Our Tools Section - Forge redesign */}
<OurToolsSection />

{/* Main Features Section - Bento Grid */}
Expand Down
5 changes: 5 additions & 0 deletions frontend/src/pages/features/GithubPortfolioForge.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import React from 'react';
import ForgeFeaturePage from '../../components/forge/ForgeFeaturePage';
export default function GithubPortfolioForge() {
return <ForgeFeaturePage slug="github-portfolio" />;
}
5 changes: 5 additions & 0 deletions frontend/src/pages/features/MockInterviewForge.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import React from 'react';
import ForgeFeaturePage from '../../components/forge/ForgeFeaturePage';
export default function MockInterviewForge() {
return <ForgeFeaturePage slug="mock-interview" />;
}
5 changes: 5 additions & 0 deletions frontend/src/pages/features/ProjectVisualizerForge.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import React from 'react';
import ForgeFeaturePage from '../../components/forge/ForgeFeaturePage';
export default function ProjectVisualizerForge() {
return <ForgeFeaturePage slug="project-visualizer" />;
}
Comment on lines +3 to +5

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggestion: This wrapper is currently dead code because no route or parent imports it, so the new Forge version of the page will never be rendered. Wire this component into the router (or replace the current landing component import) so the new page is actually reachable. [incomplete implementation]

Severity Level: Major ⚠️
- ⚠️ Project Visualizer Forge landing never displayed via routing.
- ⚠️ Existing /project-visualizer route still uses legacy landing.
Steps of Reproduction ✅
1. Open `frontend/src/pages/features/ProjectVisualizerForge.jsx` and observe the new
component definition at lines 3-5: `ProjectVisualizerForge` returns a `ForgeFeaturePage`
with `slug="project-visualizer"`.

2. Search the codebase for `ProjectVisualizerForge` (e.g. via ripgrep); the only match is
the definition in `frontend/src/pages/features/ProjectVisualizerForge.jsx:3-5`, confirming
no other file imports or renders this component.

3. Inspect the router in `frontend/src/App.jsx`: the `/project-visualizer` public landing
route is defined twice (lines 80-86 and again around 61-66 in the later block) and both
use `ProjectVisualizerLanding` imported from `./pages/features/ProjectVisualizerLanding`,
not `ProjectVisualizerForge`.

4. Run the frontend and navigate to `/project-visualizer` (or click any link to that slug,
for example links described in `README.md:322,434`); the rendered component is
`ProjectVisualizerLanding` wired in `App.jsx`, while `ProjectVisualizerForge` is never
mounted, demonstrating the new Forge page is currently dead code.

Fix in Cursor Fix in VSCode Claude

(Use Cmd/Ctrl + Click for best experience)

Prompt for AI Agent 🤖
This is a comment left during a code review.

**Path:** frontend/src/pages/features/ProjectVisualizerForge.jsx
**Line:** 3:5
**Comment:**
	*Incomplete Implementation: This wrapper is currently dead code because no route or parent imports it, so the new Forge version of the page will never be rendered. Wire this component into the router (or replace the current landing component import) so the new page is actually reachable.

Validate the correctness of the flagged issue. If correct, How can I resolve this? If you propose a fix, implement it and please make it concise.
Once fix is implemented, also check other comments on the same PR, and ask user if the user wants to fix the rest of the comments as well. if said yes, then fetch all the comments validate the correctness and implement a minimal fix
👍 | 👎

5 changes: 5 additions & 0 deletions frontend/src/pages/features/ResumeBuilderForge.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import React from 'react';
import ForgeFeaturePage from '../../components/forge/ForgeFeaturePage';
export default function ResumeBuilderForge() {
return <ForgeFeaturePage slug="resume-builder" />;
}
Comment on lines +3 to +5

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggestion: This wrapper is not integrated into routing or any caller, so adding it does not change runtime behavior and users will never hit this Forge page. Connect it to the /resume-builder route (or the intended navigation path) to complete the feature. [incomplete implementation]

Severity Level: Major ⚠️
- ⚠️ Resume Builder Forge landing cannot be reached from router.
- ⚠️ Existing /resume-builder route continues using ResumeBuilderLanding component.
Steps of Reproduction ✅
1. Open `frontend/src/pages/features/ResumeBuilderForge.jsx` and note the wrapper at lines
3-5: `ResumeBuilderForge` returns `ForgeFeaturePage` with `slug="resume-builder"`.

2. Search the repository for `ResumeBuilderForge`; the only hit is its definition in
`frontend/src/pages/features/ResumeBuilderForge.jsx:3-5`, showing no router or parent
component imports it.

3. Check the router configuration in `frontend/src/App.jsx` around lines 79-81: the public
route `<Route path="/resume-builder" element={...}>` renders `ResumeBuilderLanding` via
the lazy import `const ResumeBuilderLanding = lazy(() =>
import('./pages/features/ResumeBuilderLanding'));` (lines 105-113), not
`ResumeBuilderForge`.

4. Start the app and navigate to `/resume-builder` using the browser or any in-app link
targeting that path; `ResumeBuilderLanding` is rendered as configured in `App.jsx`, while
`ResumeBuilderForge` is never mounted, confirming the new Forge wrapper is currently
unreachable.

Fix in Cursor Fix in VSCode Claude

(Use Cmd/Ctrl + Click for best experience)

Prompt for AI Agent 🤖
This is a comment left during a code review.

**Path:** frontend/src/pages/features/ResumeBuilderForge.jsx
**Line:** 3:5
**Comment:**
	*Incomplete Implementation: This wrapper is not integrated into routing or any caller, so adding it does not change runtime behavior and users will never hit this Forge page. Connect it to the `/resume-builder` route (or the intended navigation path) to complete the feature.

Validate the correctness of the flagged issue. If correct, How can I resolve this? If you propose a fix, implement it and please make it concise.
Once fix is implemented, also check other comments on the same PR, and ask user if the user wants to fix the rest of the comments as well. if said yes, then fetch all the comments validate the correctness and implement a minimal fix
👍 | 👎

5 changes: 5 additions & 0 deletions frontend/src/pages/features/ResumeRoastForge.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import React from 'react';
import ForgeFeaturePage from '../../components/forge/ForgeFeaturePage';
export default function ResumeRoastForge() {
return <ForgeFeaturePage slug="resume-roast" />;
}
Comment on lines +3 to +5

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggestion: This component is added but not used by any route/import, so the Forge redesign for this feature cannot be accessed in production. Register this component in the router (or replace the existing landing component) to make the change effective. [incomplete implementation]

Severity Level: Major ⚠️
- ⚠️ Resume Roast Forge landing never served at /resume-roast.
- ⚠️ New component remains untested and unmounted in production.
Steps of Reproduction ✅
1. Open `frontend/src/pages/features/ResumeRoastForge.jsx` and observe the component
defined at lines 3-5: `ResumeRoastForge` returns `ForgeFeaturePage` with
`slug="resume-roast"`.

2. Run a search for `ResumeRoastForge` across the repo; the only occurrence is this
definition in `frontend/src/pages/features/ResumeRoastForge.jsx:3-5`, so no route or
parent component imports it.

3. Inspect the router in `frontend/src/App.jsx` around lines 80-82: the route `<Route
path="/resume-roast" element={...}>` renders `ResumeRoastLanding`, wired via `const
ResumeRoastLanding = lazy(() => import('./pages/features/ResumeRoastLanding'));` (lines
105-113), rather than `ResumeRoastForge`.

4. Launch the app and navigate to `/resume-roast` (for example via `RoastHub`, which links
to `/resume-roast` in `frontend/src/pages/hubs/RoastHub.jsx:30,53`); the runtime uses
`ResumeRoastLanding` from `App.jsx`, and `ResumeRoastForge` is never rendered,
demonstrating the new Forge redesign page is currently unused.

Fix in Cursor Fix in VSCode Claude

(Use Cmd/Ctrl + Click for best experience)

Prompt for AI Agent 🤖
This is a comment left during a code review.

**Path:** frontend/src/pages/features/ResumeRoastForge.jsx
**Line:** 3:5
**Comment:**
	*Incomplete Implementation: This component is added but not used by any route/import, so the Forge redesign for this feature cannot be accessed in production. Register this component in the router (or replace the existing landing component) to make the change effective.

Validate the correctness of the flagged issue. If correct, How can I resolve this? If you propose a fix, implement it and please make it concise.
Once fix is implemented, also check other comments on the same PR, and ask user if the user wants to fix the rest of the comments as well. if said yes, then fetch all the comments validate the correctness and implement a minimal fix
👍 | 👎

Loading
Loading