810485ecc8
---ci--- phase: 7 milestone: v0.1 status: complete requirements: covered: [REQ-001, REQ-002, REQ-003, REQ-004, REQ-005, REQ-006, REQ-007, REQ-008, REQ-009, REQ-010, REQ-011, REQ-012, REQ-013, REQ-014, REQ-015, REQ-016, REQ-017, REQ-018, REQ-019, REQ-020, REQ-021, REQ-022, REQ-023, REQ-024, REQ-025, REQ-026, REQ-027, REQ-028] partial: [] ---/ci--- Milestone v0.1 (nextcraft-ui-prototype) complete. Summary: - 7 phases (P0 pre-execution + P1-P6 execution + P7 final review) - 28 requirements covered (all complete) - 4 surfaces: Learner (7 pages), Marketplace (5), Employer Dashboard (4), Admin (4) - 19 routes, 104 TypeScript files - Shared component library (5 primitives + design tokens) - Mock data: 5 competency stacks (70 competencies), 20 jobs, 15 candidates, 10 employers - Tech: Next.js 15, Tailwind CSS v4, lucide-react, recharts, @xyflow/react, Inter font - Storybook with 6 stories - Dark mode, breadcrumbs, role switcher, responsive design - Build passes, typecheck passes, Storybook build passes Phases: P0 pre-execution → v0.0.1 P1 project-scaffolding → v0.0.2 P2 learner-surface → v0.0.3 P3 marketplace-surface → v0.0.4 P4 employer-dashboard → v0.0.5 P5 admin-surface → v0.0.6 P6 polish-integration → v0.0.7 P7 final-review-ship → v0.1.0 (milestone release)
47 lines
1.6 KiB
TypeScript
47 lines
1.6 KiB
TypeScript
'use client';
|
|
|
|
import type { ReactNode } from 'react';
|
|
import Link from 'next/link';
|
|
import { usePathname } from 'next/navigation';
|
|
import { Building2 } from 'lucide-react';
|
|
|
|
const LINKS = [
|
|
{ label: 'Overview', href: '/employer' },
|
|
{ label: 'Talent search', href: '/employer/talent' },
|
|
{ label: 'Postings', href: '/employer/postings' },
|
|
];
|
|
|
|
export default function EmployerLayout({ children }: { children: ReactNode }) {
|
|
const pathname = usePathname() ?? '';
|
|
|
|
return (
|
|
<div className="mx-auto flex max-w-7xl gap-6 px-4 py-8 sm:px-6">
|
|
<aside className="hidden w-56 shrink-0 md:block">
|
|
<div className="mb-4 flex items-center gap-2 text-sm font-semibold text-slate-500 dark:text-slate-400">
|
|
<Building2 className="h-4 w-4 text-primary-600" />
|
|
Employer surface
|
|
</div>
|
|
<nav className="flex flex-col gap-1">
|
|
{LINKS.map((l) => {
|
|
const isActive = pathname === l.href || pathname.startsWith(l.href + '/');
|
|
return (
|
|
<Link
|
|
key={l.href}
|
|
href={l.href}
|
|
aria-current={isActive ? 'page' : undefined}
|
|
className={`rounded-md px-3 py-2 text-sm font-medium transition-colors ${
|
|
isActive
|
|
? 'bg-primary-50 text-primary-700 dark:bg-primary-900/30 dark:text-primary-200'
|
|
: 'text-slate-700 hover:bg-slate-100 dark:text-slate-200 dark:hover:bg-slate-800'
|
|
}`}
|
|
>
|
|
{l.label}
|
|
</Link>
|
|
);
|
|
})}
|
|
</nav>
|
|
</aside>
|
|
<div className="flex-1">{children}</div>
|
|
</div>
|
|
);
|
|
} |