first commit

This commit is contained in:
Your NamebaishaliHolocron
2026-06-15 12:57:03 +05:30
commit b9ac5ae0b2
398 changed files with 49583 additions and 0 deletions

View File

@@ -0,0 +1,47 @@
"use client";
import { Button, Card } from "ikoncomponents";
import { ArrowRight } from "lucide-react";
import { useRouter } from "next/dist/client/components/navigation";
export function CTASection() {
const router = useRouter();
const handleGetStarted = () => {
router.push("/main/overview/dashboard");
};
return (
<section className="py-20">
<div className="container mx-auto px-4">
<Card className="relative max-w-5xl mx-auto overflow-hidden rounded-3xl border p-10 text-center">
{/* Decorative radial glow */}
<div className="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-full h-full blur-[120px] pointer-events-none" />
<div className="relative z-10 space-y-8">
<h2 className="text-4xl md:text-5xl font-bold tracking-tight">
Ready to Transform Your Projects?
</h2>
<p className="text-gray-400 text-lg max-w-xl mx-auto">
Join thousands of teams using AI to deliver projects on time and
under budget.
</p>
<div className="flex flex-wrap justify-center gap-4 pt-2">
<Button
className="bg-indigo-600 hover:bg-indigo-700 px-8 py-6 text-lg group"
onClick={handleGetStarted}
>
Get Start
<ArrowRight className="ml-2 h-5 w-5 transition-transform group-hover:translate-x-1" />
</Button>
<Button
variant="outline"
className="border-gray-800 bg-transparent px-8 py-6 text-lg hover:bg-white/5"
>
Contact Sales
</Button>
</div>
</div>
</Card>
</div>
</section>
);
}

View File

@@ -0,0 +1,210 @@
"use client";
import { Badge, Card } from "ikoncomponents";
import {
Zap,
Users,
BarChart3,
FileText,
Layout,
Settings2,
Lock,
FolderKanban,
AlertTriangle,
RotateCcw,
Binary,
Link2,
Shield,
Brain,
TrendingUp,
Calendar,
} from "lucide-react";
const features = [
{
title: "AI Health Scores",
desc: "Real-time project health monitoring powered by machine learning. Predict risks before they happen.",
icon: Brain,
bg: "bg-purple-600",
},
{
title: "Predictive Analytics",
desc: "Forecast completion dates with confidence percentages. Know your slippage risk in advance.",
icon: TrendingUp,
bg: "bg-indigo-600",
},
{
title: "AI Assessment Tool",
desc: "LLM-powered project planning wizard generating BRD, SRS, timeline, budget breakdown, and risk identification.",
icon: Zap,
bg: "bg-blue-600",
},
{
title: "Project Management",
desc: "Complete project lifecycle management with Kanban boards, task tracking, and team collaboration.",
icon: Layout,
bg: "bg-cyan-600",
},
{
title: "Task Management",
desc: "Create, assign, and track tasks with priorities, story points, and sprint integration.",
icon: Settings2,
bg: "bg-blue-600",
},
{
title: "Sprint Planning",
desc: "Sprint velocity tracking, backlog grooming, and automated burndown charts for Agile teams..",
icon: Calendar,
bg: "bg-sky-600",
},
{
title: "Analytics Dashboard",
desc: "Task distribution charts, project metrics, and financial analytics in one unified view.",
icon: BarChart3,
bg: "bg-emerald-600",
},
{
title: "Reports & Downloads",
desc: "Generate downloadable reports filtered by time frame, projects, resources, and finances - export as CSV or PDF.",
icon: FileText,
bg: "bg-green-600",
},
{
title: "Resource Management",
desc: "Full team member lifecycle with CRUD, CSV bulk import, onboard/offboard workflow, and FTE calculation.",
icon: Users,
bg: "bg-orange-600",
},
{
title: "Project Access Control",
desc: "Request, grant, modify, and revoke resource access to projects with approval workflows.",
icon: Lock,
bg: "bg-amber-600",
},
{
title: "Portfolio Management",
desc: "Department-level project grouping for strategic oversight and portfolio performance tracking.",
icon: FolderKanban,
bg: "bg-rose-600",
},
{
title: "Risk Management",
desc: "Risk register with probability/impact scoring, severity levels, and mitigation tracking.",
icon: AlertTriangle,
bg: "bg-pink-600",
},
{
title: "Change Management",
desc: "Variation orders with approval workflow, budget impact tracking, and schedule adjustments.",
icon: RotateCcw,
bg: "bg-pink-600",
},
{
title: "No-Code Automation",
desc: "Create powerful If/Then triggers without writing code. Automate repetitive tasks instantly.",
icon: Binary,
bg: "bg-violet-600",
},
{
title: "External Integrations",
desc: "Connect to HRMS, CRM, ERP systems via REST API, GraphQL, webhooks, or database probes.",
icon: Link2,
bg: "bg-indigo-600",
},
{
title: "Enterprise Security",
desc: "Role-based access control, session management, and secure authentication for 8 stakeholder types.",
icon: Shield,
bg: "bg-orange-600",
},
];
const categories = [
{
label: "AI-Powered",
dot: "bg-fuchsia-500",
},
{
label: "Core Features",
dot: "bg-cyan-500",
},
{
label: "Analytics",
dot: "bg-emerald-500",
},
{
label: "Resources",
dot: "bg-orange-500",
},
{
label: "Management",
dot: "bg-sky-500",
},
{
label: "Automation",
dot: "bg-violet-500",
},
{
label: "Security",
dot: "bg-orange-500",
},
] as const;
export function FeaturesSection() {
return (
<section className="py-10 px-4 sm:px-6">
<div className="max-w-7xl mx-auto">
{/* Header */}
<div className="text-center space-y-4 mb-10">
<Badge variant="outline" className="border px-4 py-1">
Complete Platform
</Badge>
<h2 className="text-3xl sm:text-4xl md:text-5xl font-bold tracking-tight">
Everything You Need to Succeed
</h2>
<p className="text-gray-400 max-w-2xl mx-auto text-base sm:text-lg">
A comprehensive suite of 16 powerful features designed for modern
project management.
</p>
</div>
{/* Categories */}
<div className="flex flex-wrap justify-center gap-3 mb-8">
{categories.map((cat) => (
<button
key={cat.label}
className="px-4 py-1.5 rounded-full text-xs font-medium border border-white/10
hover:bg-white/5 transition-colors flex items-center gap-2"
>
<span className={`w-1.5 h-1.5 rounded-full ${cat.dot}`} />
{cat.label}
</button>
))}
</div>
{/* Features Grid */}
<div className="grid sm:grid-cols-2 lg:grid-cols-4 gap-4">
{features.map((feature, idx) => (
<Card
key={idx}
className="p-4 hover:bg-white/10 transition-all group"
>
<div
className={`w-10 h-10 rounded-lg ${feature.bg} flex items-center justify-center group-hover:scale-105 transition-transform`}
>
<feature.icon size={20} />
</div>
<h4 className="font-semibold">{feature.title}</h4>
<p className="text-gray-500 text-sm leading-relaxed">
{feature.desc}
</p>
</Card>
))}
</div>
</div>
</section>
);
}

View File

@@ -0,0 +1,55 @@
"use client";
import { Brain} from "lucide-react";
const footerLinks = {
Product: ["Features", "Pricing", "Integrations", "API"],
Resources: ["Documentation", "Blog", "Support", "Community"],
Company: ["About", "Careers", "Privacy", "Terms"]
};
export function Footer() {
return (
<footer className="pt-10 pb-12 border-t">
<div className="container mx-auto px-6 lg:px-24">
<div className="grid grid-cols-2 md:grid-cols-4 lg:grid-cols-5 gap-12 mb-10">
{/* Brand Column */}
<div className="col-span-2 space-y-6">
<div className="flex items-center gap-2 font-bold text-xl">
<div className="p-1.5 rounded-lg bg-indigo-600">
<Brain size={20} />
</div>
ProjectAI
</div>
<p className="text-gray-400 max-w-xs leading-relaxed">
AI-powered project management for the modern enterprise.
</p>
</div>
{/* Links Columns */}
{Object.entries(footerLinks).map(([category, links]) => (
<div key={category} className="space-y-3">
<h4 className=" font-semibold">{category}</h4>
<ul className="space-y-2">
{links.map((link) => (
<li key={link}>
<a href="#" className="text-gray-400 hover:text-indigo-400 transition-colors text-sm">
{link}
</a>
</li>
))}
</ul>
</div>
))}
</div>
{/* Bottom Bar */}
<div className="pt-8 border-t flex flex-col justify-between items-center gap-4">
<p className="text-gray-400 text-sm">
© 2025 ProjectAI. All rights reserved.
</p>
</div>
</div>
</footer>
);
}

View File

@@ -0,0 +1,137 @@
"use client";
import { Badge, Button, Card } from "ikoncomponents";
import { ArrowRight, Brain, BrainCircuit } from "lucide-react";
import { useRouter } from "next/dist/client/components/navigation";
export function HeroSection() {
const router = useRouter();
const handleStartTrial = () => {
router.push("/main/overview/dashboard");
};
return (
<section className="min-h-[70vh] flex justify-center py-12 px-4 sm:px-6">
<div className="grid sm:grid-cols-1 lg:grid-cols-2 gap-12 lg:gap-16 items-center max-w-7xl w-full">
{/* LEFT SECTION */}
<div className="space-y-8">
<Badge className="bg-indigo-500/10 text-indigo-400 border-indigo-500/20 px-3 py-1 flex items-center gap-2 w-fit">
<BrainCircuit size={14} />
AI-Powered Platform
</Badge>
<div className="space-y-4">
<h1 className="text-4xl sm:text-5xl lg:text-6xl font-bold tracking-tight">
Predictive Project <br />
<span className="text-transparent bg-clip-text bg-gradient-to-r from-indigo-400 to-cyan-400">
Management
</span>
</h1>
<p className="text-gray-400 text-base sm:text-lg max-w-lg leading-relaxed">
Transform reactive project tracking into proactive, predictive
management. Leverage AI and ML for executive-level insights into
financial health, resource optimization, and schedule
predictability.
</p>
</div>
<div className="flex gap-4">
<Button
className="bg-indigo-600 hover:bg-indigo-700 text-white px-8 py-6 text-lg rounded-md group"
onClick={handleStartTrial}
>
Get Started
<ArrowRight className="ml-2 h-5 w-5 transition-transform group-hover:translate-x-1" />
</Button>
</div>
<div className="grid grid-cols-2 gap-8 pt-8 border-t border-white/5 max-w-md">
<div>
<div className="text-3xl font-bold text-indigo-400">20%</div>
<p className="text-sm text-gray-500 uppercase tracking-wider mt-1">
Reduced Schedule Overruns
</p>
</div>
<div>
<div className="text-3xl font-bold text-indigo-400">85%</div>
<p className="text-sm text-gray-500 uppercase tracking-wider mt-1">
AI Prediction Accuracy
</p>
</div>
</div>
</div>
{/* RIGHT SECTION */}
<div className="relative max-w-lg w-full">
<Card className="p-4 rounded-2xl shadow-2xl">
<div className="flex justify-between items-center mb-3">
<div className="flex gap-2">
<div className="w-3 h-3 rounded-full bg-red-500/80" />
<div className="w-3 h-3 rounded-full bg-yellow-500/80" />
<div className="w-3 h-3 rounded-full bg-green-500/80" />
</div>
<Badge variant="secondary" className="bg-white/5 font-normal">
Live Preview
</Badge>
</div>
<div className="flex justify-between items-start p-3 border rounded-xl">
<div>
<h3 className="text-lg font-semibold">Enterprise Rollout</h3>
<p className="text-sm">Phase 2 Active</p>
</div>
<div className="flex items-center gap-4 text-right">
<div>
<div className="text-2xl font-bold text-green-400">92</div>
<div className="text-[10px] uppercase tracking-widest">
AI Score
</div>
</div>
<div className="p-2 rounded-full border border-green-500/30 bg-green-500/10">
<Brain className="text-green-400" size={24} />
</div>
</div>
</div>
<div className="grid lg:grid-cols-3 gap-3">
<StatBox label="Budget" value="$2.4M" />
<StatBox label="P/L Health" value="+12%" highlight />
<StatBox label="On-Time" value="98%" />
</div>
<div className="flex items-center gap-1">
<div className="flex-1 h-2 bg-gray-800 rounded-full overflow-hidden">
<div className="h-full bg-gradient-to-r from-indigo-500 to-cyan-400 w-[75%]" />
</div>
<span className="text-xs w-10 text-right">75%</span>
</div>
</Card>
</div>
</div>
</section>
);
}
function StatBox({
label,
value,
highlight,
}: {
label: string;
value: string;
highlight?: boolean;
}) {
return (
<div className="p-4 rounded-xl border text-center">
<div className={`text-xl font-bold ${highlight ? "text-green-400" : ""}`}>
{value}
</div>
<div className="text-[10px] text-gray-500 uppercase mt-1">{label}</div>
</div>
);
}

View File

@@ -0,0 +1,61 @@
"use client";
import { Badge, Card } from "ikoncomponents";
import { Github, Slack, Code2 } from "lucide-react";
import Image from "next/image";
const integrations = [
{ name: "Slack", icon: Slack, color: "text-purple-400" },
{ name: "GitHub", icon: Github, color: "text-gray-400" },
{ name: "Jira", image: "/jira.svg", color: "text-blue-400" },
{ name: "API", icon: Code2, color: "text-green-400" },
];
export function IntegrationSection() {
return (
<section className="py-13">
<div className="container mx-auto px-4">
{/* Header */}
<div className="text-center space-y-4 mb-8">
<Badge variant="outline" className="border px-4 py-1">
Ecosystem
</Badge>
<h2 className="text-4xl md:text-5xl font-bold tracking-tight">
Seamless Integrations
</h2>
<p className="text-gray-400 max-w-2xl mx-auto text-lg">
Connect with your favorite tools through our RESTful API and
webhooks.
</p>
</div>
{/* Integration Grid */}
<div className="flex flex-wrap justify-center gap-6 max-w-4xl mx-auto">
{integrations.map((item) => (
<Card
key={item.name}
className="w-32 h-36 flex flex-col items-center justify-center gap-4 transition-all cursor-pointer group"
>
<div className="p-3 rounded-xl bg-white/5 group-hover:scale-110 transition-transform">
{item.icon ? (
<item.icon className={item.color} size={32} />
) : (
<Image
src={item.image!}
alt={item.name}
width={32}
height={32}
className={`object-contain ${item.color}`}
/>
)}
</div>
<span className="text-gray-400 text-sm font-medium">
{item.name}
</span>
</Card>
))}
</div>
</div>
</section>
);
}

View File

@@ -0,0 +1,97 @@
"use client";
import { Badge, Card } from "ikoncomponents";
import { CheckCircle2, GitBranch, CalendarDays } from "lucide-react";
const methodologyData = [
{
title: "Agile & Scrum",
description:
"Sprint planning, velocity tracking, and automated burndown charts.",
icon: GitBranch,
iconColor: "text-indigo-400",
iconBg: "bg-indigo-500/10",
features: [
"Kanban Boards",
"Sprint Backlogs",
"Velocity Metrics",
"WIP Limits",
],
},
{
title: "Waterfall & Gantt",
description: "Dynamic Gantt charts with drag-and-drop dependency mapping.",
icon: CalendarDays,
iconColor: "text-blue-400",
iconBg: "bg-blue-500/10",
features: ["Timeline Views", "Dependencies", "Milestones", "Critical Path"],
},
];
export function MethodologySection() {
return (
<section className="py-12">
<div className="container mx-auto px-4">
{/* Header */}
<div className="text-center space-y-4 mb-12">
<Badge variant="outline" className="border px-4 py-1">
Flexible Workflows
</Badge>
<h2 className="text-3xl md:text-4xl lg:text-5xl font-bold tracking-tight">
Your Methodology, Your Way
</h2>
<p className="text-gray-400 max-w-2xl mx-auto text-lg">
Support diverse team workflows across Agile and Waterfall in one
unified interface.
</p>
</div>
{/* Cards Grid */}
<div className="grid lg:grid-cols-2 gap-6 max-w-7xl mx-auto">
{methodologyData.map((item, idx) => (
<Card
key={idx}
className="p-6 rounded-2xl hover:border-white/10 transition-all"
>
{/* Top Section */}
<div className="flex items-start gap-5 mb-6">
<div className={`p-4 rounded-xl ${item.iconBg}`}>
<item.icon className={item.iconColor} size={28} />
</div>
<div>
<h3 className="text-xl lg:text-2xl font-bold mb-1">
{item.title}
</h3>
<p className="text-gray-400 leading-relaxed">
{item.description}
</p>
</div>
</div>
{/* Features */}
<div className="grid sm:grid-cols-2 gap-y-3 gap-x-4">
{item.features.map((feature) => (
<div
key={feature}
className="flex items-center gap-3"
>
<CheckCircle2
className="text-emerald-500 shrink-0"
size={18}
/>
<span className="text-sm font-medium">
{feature}
</span>
</div>
))}
</div>
</Card>
))}
</div>
</div>
</section>
);
}

View File

@@ -0,0 +1,91 @@
"use client";
import Link from "next/link";
import { Button } from "ikoncomponents";
import { useRouter } from "next/dist/client/components/navigation";
import { Brain, Menu, X } from "lucide-react";
import { useState } from "react";
export default function Navbar() {
const router = useRouter();
const [open, setOpen] = useState(false);
const handleStartTrial = () => {
router.push("/main/overview/dashboard");
};
return (
<header className="w-full">
<div className="mx-auto flex h-16 max-w-7xl items-center justify-between px-6">
{/* Logo */}
<div className="flex items-center gap-2">
<div className="flex h-8 w-8 items-center justify-center rounded-lg bg-gradient-to-br from-indigo-500 to-purple-600 font-bold">
<Brain size={20} />
</div>
<span className="text-lg font-semibold">ProjectAI</span>
</div>
{/* Desktop Navigation */}
<nav className="hidden md:flex items-center gap-8 text-sm text-gray-400">
<Link href="#features" className="hover:text-gray-500 transition">
Features
</Link>
<Link href="#methodology" className="hover:text-gray-500 transition">
Methodology
</Link>
<Link href="#integrations" className="hover:text-gray-500 transition">
Integrations
</Link>
<Link href="#security" className="hover:text-gray-500 transition">
Security
</Link>
</nav>
{/* Right Actions (Desktop) */}
<div className="hidden md:flex items-center gap-4">
<Button
className="bg-indigo-600 hover:bg-indigo-700"
onClick={handleStartTrial}
>
Get Started
</Button>
</div>
{/* Mobile Menu Button */}
<button
className="md:hidden text-gray-300"
onClick={() => setOpen(!open)}
>
{open ? <X size={24} /> : <Menu size={24} />}
</button>
</div>
{/* Mobile Navigation */}
{open && (
<div className="md:hidden border-t backdrop-blur">
<nav className="flex flex-col gap-4 px-6 py-4 text-sm text-gray-400">
<Link href="#features" onClick={() => setOpen(false)}>
Features
</Link>
<Link href="#methodology" onClick={() => setOpen(false)}>
Methodology
</Link>
<Link href="#integrations" onClick={() => setOpen(false)}>
Integrations
</Link>
<Link href="#security" onClick={() => setOpen(false)}>
Security
</Link>
<Button
className="mt-2 bg-indigo-600 hover:bg-indigo-700"
onClick={handleStartTrial}
>
Get Started
</Button>
</nav>
</div>
)}
</header>
);
}

View File

@@ -0,0 +1,78 @@
"use client";
import { Badge, Card } from "ikoncomponents";
import { Lock, ShieldCheck, Globe } from "lucide-react";
const securityFeatures = [
{
title: "SSO & MFA",
description: "Okta, Azure AD integration",
icon: Lock,
},
{
title: "SOC2 & GDPR",
description: "Regulatory compliance",
icon: ShieldCheck,
},
{
title: "Data Sovereignty",
description: "Regional data hosting",
icon: Globe,
},
];
export function SecuritySection() {
return (
<section className="py-14 md:py-20">
<div className="container mx-auto px-4">
{/* Header */}
<div className="text-center space-y-4 mb-12 md:mb-16">
<Badge
variant="outline"
className="text-gray-400 px-4 py-1"
>
Enterprise Grade
</Badge>
<h2 className="text-3xl md:text-4xl lg:text-5xl font-bold tracking-tight">
Security & Compliance
</h2>
<p className="text-gray-400 max-w-2xl mx-auto text-lg">
Built with enterprise security requirements in mind, ensuring your
data is protected at every level.
</p>
</div>
{/* Security Grid */}
<div className="grid md:grid-cols-2 lg:grid-cols-3 gap-6 md:gap-8 max-w-6xl mx-auto">
{securityFeatures.map((feature, idx) => (
<Card
key={idx}
className="p-6 flex flex-col items-center text-center gap-4
group hover:border-white/10 transition-all"
>
<div className="p-4 rounded-2xl bg-indigo-500/5 border border-indigo-500/10
group-hover:bg-indigo-500/10 transition-colors">
<feature.icon
className="text-indigo-400"
size={32}
/>
</div>
<h3 className="text-xl font-bold">
{feature.title}
</h3>
<p className="text-gray-400 text-sm">
{feature.description}
</p>
</Card>
))}
</div>
</div>
</section>
);
}

View File

@@ -0,0 +1,95 @@
"use client";
import { Badge, Card } from "ikoncomponents";
import { CheckCircle2 } from "lucide-react";
const visibilityPoints = [
"AI Health Scores with confidence percentages",
"Real-time P/L and budget tracking",
"Resource utilization heatmaps",
"Portfolio-level performance metrics",
];
const dashboardStats = [
{ label: "Active Projects", value: "12" },
{ label: "Avg Health Score", value: "87%", color: "text-emerald-400" },
{ label: "Total Budget", value: "$4.2M" },
{ label: "At Risk", value: "3", color: "text-amber-500" },
];
export function VisibilitySection() {
return (
<section className="py-12">
<div className="container mx-auto px-4">
<div className="grid sm:grid-cols-1 lg:grid-cols-2 gap-12 lg:gap-16 items-center max-w-7xl w-full mx-auto">
{/* Left Column */}
<div className="space-y-6">
<Badge variant="outline" className="px-3 py-1 w-fit border">
Executive Dashboard
</Badge>
<div className="space-y-4">
<h2 className="text-3xl md:text-4xl lg:text-5xl font-bold tracking-tight">
Complete Visibility <br /> at a Glance
</h2>
<p className="text-gray-400 text-lg max-w-md leading-relaxed">
A unified view of project health, financial metrics, and
predictive insights designed for strategic decision-making.
</p>
</div>
<div className="space-y-3">
{visibilityPoints.map((point) => (
<div key={point} className="flex items-start gap-3">
<div className="mt-1 flex-shrink-0 w-5 h-5 rounded-full border border-indigo-500/30 flex items-center justify-center">
<CheckCircle2 className="text-indigo-400" size={12} />
</div>
<span className="font-medium">{point}</span>
</div>
))}
</div>
</div>
{/* Right Column */}
<div className="relative">
{/* Background glow */}
<div className="absolute -inset-6 bg-indigo-500/5 rounded-3xl blur-3xl" />
<Card className="relative p-6 rounded-2xl shadow-2xl">
<div className="flex justify-between items-center mb-6">
<h3 className="font-semibold text-lg">
Portfolio Overview
</h3>
<Badge className="bg-emerald-500/10 text-emerald-400 border-emerald-500/20">
Healthy
</Badge>
</div>
<div className="grid sm:grid-cols-2 gap-4">
{dashboardStats.map((stat) => (
<div
key={stat.label}
className="border p-4 rounded-xl"
>
<div
className={`text-3xl font-bold mb-1 ${
stat.color ?? ""
}`}
>
{stat.value}
</div>
<div className="text-xs text-gray-500 uppercase tracking-wider font-medium">
{stat.label}
</div>
</div>
))}
</div>
</Card>
</div>
</div>
</div>
</section>
);
}

View File

@@ -0,0 +1,16 @@
"use client";
export default function HomeLayout({
children,
}: Readonly<{
children: React.ReactNode;
}>) {
return (
<>
{children}
</>
);
}

View File

@@ -0,0 +1,22 @@
"use client";
import { useEffect } from "react";
import { useRouter } from "next/navigation";
// The marketing landing page (Hero + sections) is no longer used — opening the
// app should land directly on the dashboard. We keep the same auth check as the
// root page: send unauthenticated visitors to login, everyone else to the dashboard.
export default function page() {
const router = useRouter();
useEffect(() => {
const hasToken = document.cookie.includes("accessToken");
if (!hasToken) {
window.location.href = "/login.html";
} else {
router.replace("/main/overview/dashboard");
}
}, [router]);
return null;
}

View File

@@ -0,0 +1,13 @@
import React from "react";
export default function ProjectsLayout({
children,
}: {
children: React.ReactNode;
}) {
return (
<div className="projects-layout">
{children}
</div>
);
}

View File

@@ -0,0 +1,9 @@
import { redirect } from "next/navigation";
export default function Project() {
return (
<div>
<h1>Project</h1>
</div>
)
}