Frontend development agent for Resume Matcher. Handles Next.js pages, React components, Tailwind CSS with Swiss International Style, API integration, hooks, and i18n. Use when creating or modifying frontend code.
Use when creating or modifying Next.js pages, React components, Tailwind CSS styles, API integration, hooks, or i18n.
docs/agent/architecture/frontend-workflow.md for user flowdocs/agent/design/style-guide.md for Swiss International Style (REQUIRED)docs/agent/coding-standards.md for conventionsapps/frontend/components/ for patternsrounded-none everywhere - no rounded corners, evershadow-[4px_4px_0px_0px_#000000]npm run lint before committingnpm run format before committingapps/frontend/
├── app/ # Next.js pages
│ ├── dashboard/ # Main dashboard
│ ├── builder/ # Resume builder
│ ├── tailor/ # AI tailoring
│ ├── print/ # PDF print view
│ └── settings/ # User settings
├── components/ # Reusable UI components
├── lib/ # API client, utilities, i18n
├── hooks/ # Custom React hooks
└── messages/ # i18n translations (en, es, zh, ja)
| Element | Value |
|---|---|
| Canvas bg | #F0F0E8 / bg-[#F0F0E8] |
| Ink text | #000000 |
| Hyper Blue | #1D4ED8 / text-blue-700 |
| Signal Green | #15803D / text-green-700 |
| Alert Red | #DC2626 / text-red-600 |
| Headers | font-serif |
| Body | font-sans |
| Labels | font-mono text-sm uppercase tracking-wider |
| Borders | rounded-none border-2 border-black |
| Shadows | shadow-[4px_4px_0px_0px_#000000] |
| Hover | hover:translate-y-[1px] hover:translate-x-[1px] hover:shadow-none |
rounded-* (except rounded-none)'use client';
interface MyComponentProps {
title: string;
onAction: () => void;
}
export function MyComponent({ title, onAction }: MyComponentProps) {
return (
<div className="bg-white border-2 border-black shadow-[4px_4px_0px_0px_#000000] p-6">
<h3 className="font-serif text-xl mb-4">{title}</h3>
<button
onClick={onAction}
className="rounded-none border-2 border-black px-4 py-2 bg-blue-700 text-white shadow-[2px_2px_0px_0px_#000000] hover:translate-y-[1px] hover:translate-x-[1px] hover:shadow-none transition-all"
>
Action
</button>
</div>
);
}
const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {
if (e.key === 'Enter') e.stopPropagation();
};
<textarea
onKeyDown={handleKeyDown}
className="w-full rounded-none border-2 border-black p-3 font-sans"
/>
// Direct icon import (NOT barrel import)
import FileText from 'lucide-react/dist/esm/icons/file-text';
// Dynamic import for heavy components
import dynamic from 'next/dynamic';
const PDFViewer = dynamic(() => import('./PDFViewer'), { ssr: false });
import { api } from '@/lib/api';
async function loadResumes() {
// Use Promise.all for independent fetches
const [resumes, jobs] = await Promise.all([
api.get('/api/v1/resumes'),
api.get('/api/v1/jobs'),
]);
return { resumes, jobs };
}
import { useTranslations } from '@/lib/i18n';
export function MyComponent() {
const { t } = useTranslations();
return <h1>{t('dashboard.title')}</h1>;
}
npm run lint passesnpm run format runrounded-none on all elementsnext/dynamicPromise.all()