Loading...
Loading...
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.
npx skill4agent add srbhr/resume-matcher frontend-devUse when creating or modifying Next.js pages, React components, Tailwind CSS styles, API integration, hooks, or i18n.
docs/agent/architecture/frontend-workflow.mddocs/agent/design/style-guide.mddocs/agent/coding-standards.mdapps/frontend/components/rounded-noneshadow-[4px_4px_0px_0px_#000000]npm run lintnpm run formatapps/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 | |
| Ink text | |
| Hyper Blue | |
| Signal Green | |
| Alert Red | |
| Headers | |
| Body | |
| Labels | |
| Borders | |
| Shadows | |
| Hover | |
rounded-*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 lintnpm run formatrounded-nonenext/dynamicPromise.all()