diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index acd1cda..e3fcd0f 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -4,8 +4,6 @@ name: Deploy to GitHub Pages on: push: branches: [ main ] - pull_request: - branches: [ main ] # Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages permissions: diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..b2245c8 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,28 @@ +name: Test Build + +on: + pull_request: + branches: [ main ] + +jobs: + test-build: + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '18' + cache: 'npm' + + - name: Install dependencies + run: npm ci + + - name: Test Build + run: npm run build + env: + VITE_SUPABASE_URL: ${{ secrets.VITE_SUPABASE_URL }} + VITE_SUPABASE_ANON_KEY: ${{ secrets.VITE_SUPABASE_ANON_KEY }} \ No newline at end of file diff --git a/CONTENT_GUIDE.md b/CONTENT_GUIDE.md new file mode 100644 index 0000000..4fb85a8 --- /dev/null +++ b/CONTENT_GUIDE.md @@ -0,0 +1,143 @@ +# Content Management Guide + +## Centralized Content Management System + +You now have a **single place** to manage all your content! No more managing titles and metadata in multiple places. + +## Quick Start - Adding New Content + +### 1. Adding a New Blog Post + +**Step 1:** Add entry to `/src/config/content-registry.ts` in the `BLOG_REGISTRY` array: + +```typescript +{ + id: 'my-new-blog-post', + title: 'My Amazing New Blog Post', + excerpt: 'A brief description of what this post is about', + date: '2024-01-20', + tags: ['React', 'TypeScript', 'Web Development'], + order: 4, // This determines the display order + featured: true, // Will show on homepage if true + pinned: false, // Optional: pin to top + image: 'https://example.com/image.jpg' // Optional: custom image +} +``` + +**Step 2:** Create your markdown file at `/public/content/blog/my-new-blog-post.md`: + +```markdown +# My Amazing New Blog Post + +Your blog content goes here. You can write in markdown format. + +## Subheading + +More content... +``` + +**That's it!** Your blog post will automatically appear in the correct order. + +### 2. Adding a New Project + +**Step 1:** Add entry to the `PROJECT_REGISTRY` array: + +```typescript +{ + id: 'my-awesome-project', + title: 'My Awesome Project', + description: 'A brief description of your project', + tags: ['React', 'Node.js', 'MongoDB'], + githubUrl: 'https://github.com/yourusername/project', + demoUrl: 'https://your-project-demo.com', // Optional + order: 7, + featured: true, // Will show on homepage if true +} +``` + +**Step 2:** Create your project markdown file at `/public/content/projects/my-awesome-project.md`: + +```markdown +# My Awesome Project + +Detailed description of your project, installation instructions, usage, etc. + +## Features + +- Feature 1 +- Feature 2 + +## Getting Started + +Installation and setup instructions... +``` + +### 3. Adding a New Publication + +**Step 1:** Add entry to the `PUBLICATION_REGISTRY` array: + +```typescript +{ + id: 'my-research-paper', + title: 'My Research Paper Title', + date: '2024-01-15', + summary: 'A brief summary of your research findings', + link: 'https://arxiv.org/abs/your-paper', + tags: ['Machine Learning', 'Deep Learning', 'Computer Vision'], + order: 5, + featured: true, // Will show on homepage if true +} +``` + +**Step 2:** Create your publication markdown file at `/public/content/publications/my-research-paper.md`: + +```markdown +# My Research Paper Title + +## Abstract + +Your abstract goes here... + +## Introduction + +Your paper content... +``` + +## Key Benefits + +1. **Single Source of Truth**: All titles, order, and metadata in one file +2. **Automatic Ordering**: Content displays in the order you specify +3. **Featured Control**: Easy toggle for homepage display +4. **Type Safety**: TypeScript ensures all required fields are present +5. **Fallback Support**: Markdown frontMatter still works as backup + +## Important Notes + +- **Order numbers** determine display sequence (1, 2, 3, etc.) +- **Featured items** appear on the homepage +- **IDs** must match your markdown filenames exactly +- **Markdown files** are optional - content can be empty if you only want the registry metadata + +## File Structure + +``` +/public/content/ +├── blog/ +│ ├── my-blog-post.md +│ └── another-post.md +├── projects/ +│ ├── my-project.md +│ └── another-project.md +└── publications/ + ├── my-paper.md + └── another-paper.md +``` + +## Migration from Old System + +Your existing content will continue to work! The new system: +- Uses registry data as the primary source +- Falls back to markdown frontMatter if registry entry is missing +- Maintains backward compatibility + +Now you can manage everything from one place! 🎉 \ No newline at end of file diff --git a/src/App.tsx b/src/App.tsx index a04dc97..7e9674a 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -5,17 +5,17 @@ import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; import { BrowserRouter, Routes, Route, Navigate } from "react-router-dom"; import { ThemeProvider } from "@/components/theme-provider"; import { Layout } from "@/components/layout"; -import Home from "./pages/Home"; -import Projects from "./pages/Projects"; -import Project from "./pages/Project"; -import Blog from "./pages/Blog"; -import BlogPost from "./pages/BlogPost"; -import About from "./pages/About"; -import Publications from "./pages/Publications"; -import Publication from "./pages/Publication"; -import NotFound from "./pages/NotFound"; +import Home from "./pages/home/Home"; +import Projects from "./pages/projects/Projects"; +import Project from "./pages/project/Project"; +import Blog from "./pages/blog/Blog"; +import BlogPost from "./pages/blogpost/BlogPost"; +import About from "./pages/about/About"; +import Publications from "./pages/publications/Publications"; +import Publication from "./pages/publication/Publication"; +import NotFound from "./pages/notfound/NotFound"; import { sectionConfig } from "./config/sectionConfig"; -import AuthCallback from "@/pages/AuthCallback"; +import AuthCallback from "./pages/authcallback/AuthCallback"; const queryClient = new QueryClient(); diff --git a/src/components/CareerTimeline.module.css b/src/components/CareerTimeline.module.css new file mode 100644 index 0000000..850fa6b --- /dev/null +++ b/src/components/CareerTimeline.module.css @@ -0,0 +1,253 @@ +/* Career Timeline Component CSS Module */ + +.section { + @apply space-y-6; +} + +.title { + @apply text-xl font-bold; +} + +.timelineContainer { + @apply relative; +} + +.mainTimelineLine { + @apply absolute left-6 top-0 bottom-0 w-0.5 bg-gradient-to-b from-primary via-primary/60 to-primary/20; +} + +.timelineItems { + @apply space-y-8; +} + +.companyItem { + @apply relative; +} + +.companyHeader { + @apply relative flex items-start gap-6 mb-4; +} + +.companyNode { + @apply relative z-10 flex-shrink-0; +} + +.companyNodeCircle { + @apply w-12 h-12 rounded-full bg-gradient-to-br from-primary to-primary/60 shadow-md flex items-center justify-center border-2 border-background; +} + +.companyIcon { + @apply w-4 h-4 text-primary-foreground; +} + +.companyConnector { + @apply absolute top-6 left-12 w-6 h-0.5 bg-gradient-to-r from-primary/60 to-transparent; +} + +.companyContent { + @apply flex-1 min-w-0; +} + +.companyCard { + @apply shadow-md border-l-4 border-l-primary bg-primary/5; +} + +.companyCard .cardHeader { + @apply px-4 py-3; +} + +.companyCardHeader { + @apply pb-2; +} + +.companyInfo { + @apply flex flex-wrap items-start justify-between gap-2; +} + +.companyDetails { + @apply space-y-1; +} + +.companyName { + @apply text-lg font-bold text-foreground; +} + +.locationContainer { + @apply flex items-center gap-2 text-muted-foreground; +} + +.locationIcon { + @apply w-4 h-4; +} + +.locationText { + @apply text-sm; +} + +.periodBadge { + @apply flex items-center gap-1 pt-2; +} + +.periodIcon { + @apply w-3 h-3; +} + +.rolesSection { + @apply ml-12 relative; +} + +.rolesTimelineLine { + @apply absolute left-4 top-0 bottom-0 w-0.5 bg-gradient-to-b from-blue-500 via-blue-500/80 to-blue-500/40; +} + +.rolesItems { + @apply space-y-6; +} + +.roleItem { + @apply relative flex items-start gap-4; +} + +.roleNode { + @apply relative z-10 flex-shrink-0; +} + +.roleNodeCircle { + @apply w-8 h-8 rounded-full bg-gradient-to-br from-secondary to-secondary/60 shadow-sm flex items-center justify-center border-2 border-background; +} + +.roleNodeDot { + @apply w-1.5 h-1.5 rounded-full bg-secondary-foreground; +} + +.roleConnector { + @apply absolute top-4 left-8 w-4 h-0.5 bg-gradient-to-r from-secondary/60 to-transparent; +} + +.roleContent { + @apply flex-1 min-w-0; +} + +.roleCard { + @apply shadow-sm hover:shadow-md transition-all duration-300 border-l-2 border-l-secondary/30; +} + +.roleCard .cardHeader { + @apply px-4 py-2; +} + +.roleCard .cardContent { + @apply px-4 py-2; +} + +.roleCardHeader { + @apply pb-2 pt-3; +} + +.roleInfo { + @apply flex flex-wrap items-start justify-between gap-2; +} + +.roleTitle { + @apply text-base font-bold text-foreground pt-2; +} + +.roleCardContent { + @apply pt-3 space-y-2; +} + +.sectionHeader { + @apply font-semibold text-foreground mb-1 flex items-center gap-2 text-sm; +} + +.sectionDot { + @apply w-1.5 h-1.5 rounded-full; +} + +.achievementsDot { + @apply bg-primary; +} + +.responsibilitiesDot { + @apply bg-primary/80; +} + +.milestonesDot { + @apply bg-primary/60; +} + +.list { + @apply space-y-1 ml-2; +} + +.listItem { + @apply text-muted-foreground flex items-start gap-2; +} + +.listItemDot { + @apply w-1 h-1 rounded-full mt-2 flex-shrink-0; +} + +.achievementsListDot { + @apply bg-secondary; +} + +.responsibilitiesListDot { + @apply bg-secondary/80; +} + +.listItemText { + @apply text-sm leading-relaxed; +} + +.milestonesGrid { + @apply grid gap-2 sm:grid-cols-2 ml-2; +} + +.milestoneItem { + @apply bg-muted/50 rounded-md p-2 border border-muted; +} + +.milestoneText { + @apply text-xs text-foreground font-medium; +} + +.roleProgression { + @apply mt-3 ml-4 flex items-center gap-2 text-muted-foreground; +} + +.progressionLineBefore { + @apply flex-1 h-px bg-gradient-to-r from-secondary/20 to-transparent; +} + +.progressionBadge { + @apply text-xs font-medium bg-secondary/10 px-2 py-1 rounded-full border border-secondary/20; +} + +.progressionLineAfter { + @apply flex-1 h-px bg-gradient-to-l from-secondary/20 to-transparent; +} + +.companyProgression { + @apply mt-6 ml-6 flex items-center gap-3 text-muted-foreground; +} + +.companyProgressionLineBefore { + @apply flex-1 h-px bg-gradient-to-r from-primary/30 to-transparent; +} + +.companyProgressionBadge { + @apply text-xs font-medium bg-muted px-3 py-1 rounded-full; +} + +.companyProgressionLineAfter { + @apply flex-1 h-px bg-gradient-to-l from-primary/30 to-transparent; +} + +.timelineEnd { + @apply absolute left-6 bottom-0 w-0.5 h-8 bg-gradient-to-b from-primary/20 to-transparent; +} + +.timelineEndDot { + @apply absolute left-5 -bottom-1 w-3 h-3 rounded-full bg-primary/20 border-2 border-background; +} \ No newline at end of file diff --git a/src/components/CareerTimeline.tsx b/src/components/CareerTimeline.tsx index 874cb7d..c8ccf39 100644 --- a/src/components/CareerTimeline.tsx +++ b/src/components/CareerTimeline.tsx @@ -1,6 +1,7 @@ import { Badge } from "@/components/ui/badge"; import { Card, CardContent, CardHeader } from "@/components/ui/card"; import { Building, Calendar, MapPin } from "lucide-react"; +import styles from './CareerTimeline.module.css'; interface Role { id: string; @@ -27,44 +28,44 @@ interface CareerTimelineProps { export function CareerTimeline({ items, title = "Career Journey" }: CareerTimelineProps) { return ( -
-

{title}

+
+

{title}

-
+
{/* Main timeline line */} -
+
{/* Timeline items */} -
+
{items.map((item, companyIndex) => ( -
+
{/* Company Header */} -
+
{/* Company timeline node */} -
-
- +
+
+
{/* Connecting line to content */} -
+
{/* Company header card */}
- - -
-
-

{item.company}

+ + +
+
+

{item.company}

{item.location && ( -
- - {item.location} +
+ + {item.location}
)}
- - + + {item.overallPeriod}
@@ -74,48 +75,47 @@ export function CareerTimeline({ items, title = "Career Journey" }: CareerTimeli
{/* Roles Sub-timeline */} -
+
{/* Sub-timeline line */} -
+
-
+
{item.roles.map((role, roleIndex) => (
{/* Role timeline node */}
-
-
+
+
{/* Connecting line to content */} -
+
{/* Role content card */}
- - -
-

{role.title}

- - + + +
+

{role.title}

+ + {role.period}
- + {/* Key Achievements */} {role.achievements.length > 0 && (
-
-
+
Key Achievements
-
    +
      {role.achievements.map((achievement, idx) => ( -
    • -
      - {achievement} +
    • +
      + {achievement}
    • ))}
    @@ -125,15 +125,14 @@ export function CareerTimeline({ items, title = "Career Journey" }: CareerTimeli {/* Responsibilities */} {role.responsibilities && role.responsibilities.length > 0 && (
    -
    -
    +
    Core Responsibilities
    -
      +
        {role.responsibilities.map((responsibility, idx) => ( -
      • -
        - {responsibility} +
      • +
        + {responsibility}
      • ))}
      @@ -143,14 +142,13 @@ export function CareerTimeline({ items, title = "Career Journey" }: CareerTimeli {/* Milestones */} {role.milestones && role.milestones.length > 0 && (
      -
      -
      +
      Key Milestones
      -
      +
      {role.milestones.map((milestone, idx) => ( -
      - {milestone} +
      + {milestone}
      ))}
      diff --git a/src/components/ProfileSlideshow.tsx b/src/components/ProfileSlideshow.tsx index 40333ae..954ce04 100644 --- a/src/components/ProfileSlideshow.tsx +++ b/src/components/ProfileSlideshow.tsx @@ -67,12 +67,28 @@ export function ProfileSlideshow() { const currentSlide = slideData[currentIndex]; return ( -
      -
      setIsPlaying(!isPlaying)}> +
      + {/* Left Navigation Button - Outside slideshow */} + + + {/* Slideshow Container */} +
      +
      setIsPlaying(!isPlaying)} style={{ perspective: '800px', transformStyle: 'preserve-3d' }}> {/* Stacked Cards - Simplified transforms for better performance */} {slideData.map((slide, index) => { const offset = (index - currentIndex + slideData.length) % slideData.length; - const isVisible = offset <= 2; // Show fewer cards for better performance + const isVisible = offset <= 2; // Show background cards let transform = ''; let opacity = 0; @@ -81,26 +97,26 @@ export function ProfileSlideshow() { let shadowClass = 'shadow-lg'; if (offset === 0) { - // Current image - front and center - transform = 'translate3d(0px, 0px, 0px) scale(1)'; + // Current image - front and center - full priority + transform = 'translateX(0px) translateY(0px) translateZ(50px) scale(1) rotateY(0deg) rotateZ(0deg)'; opacity = 1; - zIndex = 30; - borderColor = 'border-primary/20'; - shadowClass = 'shadow-2xl shadow-primary/20'; + zIndex = 100; + borderColor = 'border-primary/40'; + shadowClass = 'shadow-2xl shadow-primary/30'; } else if (offset === 1) { - // Next image - simpler transform - transform = 'translate3d(25px, 20px, 0px) scale(0.90)'; - opacity = 0.8; - zIndex = 20; - borderColor = 'border-muted/30'; - shadowClass = 'shadow-xl shadow-primary/10'; + // Next image - more visible behind and to the right + transform = 'translateX(35px) translateY(20px) translateZ(0px) scale(0.92) rotateY(-6deg) rotateZ(2deg)'; + opacity = 0.85; + zIndex = 50; + borderColor = 'border-primary/25'; + shadowClass = 'shadow-xl shadow-primary/20'; } else if (offset === 2) { - // Third image - minimal background presence - transform = 'translate3d(50px, 40px, 0px) scale(0.80)'; - opacity = 0.6; - zIndex = 10; - borderColor = 'border-muted/20'; - shadowClass = 'shadow-lg shadow-primary/5'; + // Third image - visible further back + transform = 'translateX(65px) translateY(35px) translateZ(-30px) scale(0.84) rotateY(-12deg) rotateZ(4deg)'; + opacity = 0.7; + zIndex = 25; + borderColor = 'border-primary/15'; + shadowClass = 'shadow-lg shadow-primary/15'; } return ( @@ -113,7 +129,8 @@ export function ProfileSlideshow() { transform, opacity, zIndex, - transition: 'transform 0.5s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.5s ease-out', + transition: 'all 1s cubic-bezier(0.175, 0.885, 0.32, 1.275)', + transformStyle: 'preserve-3d', backfaceVisibility: 'hidden', // Prevent flickering WebkitBackfaceVisibility: 'hidden', }} @@ -142,53 +159,58 @@ export function ProfileSlideshow() { ); })} - {/* Navigation Arrows - Simplified styling */} - - - - {/* Play/Pause Indicator */} -
      - - {isPlaying ? 'Playing' : 'Paused'} + {/* Play/Pause Indicator - Always visible and prominent */} +
      + { + e.stopPropagation(); + setIsPlaying(!isPlaying); + }} + > + {isPlaying ? '▶ Playing' : '⏸ Paused'}
      -
      - {/* Dots Indicator */} -
      - {slideData.map((_, index) => ( -
      +
      + + {/* Right Navigation Button - Outside slideshow */} +
      ); } \ No newline at end of file diff --git a/src/components/blog-post-card.module.css b/src/components/blog-post-card.module.css new file mode 100644 index 0000000..61308eb --- /dev/null +++ b/src/components/blog-post-card.module.css @@ -0,0 +1,55 @@ +/* Blog Post Card Component CSS Module */ + +.card { + @apply overflow-hidden rounded-lg border bg-card transition-colors hover:bg-accent/50 h-full flex flex-col; +} + +.pinnedCard { + @apply ring-2 ring-primary/20; +} + +.imageContainer { + @apply aspect-[2/1] w-full overflow-hidden bg-muted; +} + +.image { + @apply w-full h-full object-cover object-center transition-transform duration-300 group-hover:scale-105; +} + +.content { + @apply p-6 flex flex-col flex-grow; +} + +.badgeContainer { + @apply flex flex-wrap items-center gap-2 mb-3; +} + +/* .pinnedBadge styles now handled by .badge-featured utility class */ + +.dateContainer { + @apply flex items-center text-xs text-muted-foreground ml-auto; +} + +.dateIcon { + @apply mr-1 h-3 w-3; +} + +.title { + @apply text-xl font-bold hover:text-primary transition-colors line-clamp-2; +} + +.titleLink { + @apply block; +} + +.excerpt { + @apply mt-2 text-muted-foreground line-clamp-3 flex-grow; +} + +.tagsContainer { + @apply mt-4 flex flex-wrap gap-2; +} + +.tag { + @apply hover:bg-secondary/80; +} \ No newline at end of file diff --git a/src/components/blog-post-card.tsx b/src/components/blog-post-card.tsx index 67ad583..72a62fb 100644 --- a/src/components/blog-post-card.tsx +++ b/src/components/blog-post-card.tsx @@ -2,6 +2,8 @@ import { BlogPost } from '@/types/blog'; import { Badge } from '@/components/ui/badge'; import { Calendar } from 'lucide-react'; import { Link } from 'react-router-dom'; +import styles from './blog-post-card.module.css'; +import badgeStyles from '@/styles/badges.module.css'; interface BlogPostCardProps { post: BlogPost; @@ -18,49 +20,49 @@ export function BlogPostCard({ post, className = '' }: BlogPostCardProps) { return (
      {post.image && ( -
      +
      {post.title}
      )} -
      -
      +
      +
      {post.pinned && ( - + Pinned )} {post.release && ( - + New )} -
      - +
      +
      -

      - +

      + {post.title}

      -

      {post.excerpt}

      +

      {post.excerpt}

      -
      +
      {post.tags.map(tag => ( - + {tag} ))} diff --git a/src/components/contact-modal.module.css b/src/components/contact-modal.module.css new file mode 100644 index 0000000..fe338b3 --- /dev/null +++ b/src/components/contact-modal.module.css @@ -0,0 +1,57 @@ +/* Contact Modal Component CSS Module */ + +.content { + @apply sm:max-w-md; +} + +.contactsContainer { + @apply space-y-6 py-4; +} + +.contactItem { + @apply flex items-center gap-4 rounded-lg border p-4; +} + +.iconContainer { + @apply rounded-full bg-primary/10 p-2; +} + +.icon { + @apply h-5 w-5 text-primary; +} + +.contactInfo { + @apply flex-1; +} + +.label { + @apply text-sm font-medium; +} + +.link { + @apply text-sm text-muted-foreground hover:underline; +} + +.copyButton { + @apply h-8 w-8 p-0; +} + +.copyIcon { + @apply h-4 w-4; +} + +.srOnly { + @apply sr-only; +} + +.footer { + @apply p-0; +} + +.actionButtons { + @apply flex w-full gap-2; +} + +.fullWidthButton { + @apply flex-1 rounded-md; +} \ No newline at end of file diff --git a/src/components/contact-modal.tsx b/src/components/contact-modal.tsx index 12bd1ea..995a12e 100644 --- a/src/components/contact-modal.tsx +++ b/src/components/contact-modal.tsx @@ -1,8 +1,10 @@ import { useState } from 'react'; import { Button } from '@/components/ui/button'; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from '@/components/ui/dialog'; -import { Mail, Phone, Copy, Check } from 'lucide-react'; +import { Mail, Phone, Copy, Check, Linkedin, Download } from 'lucide-react'; import { toast } from 'sonner'; +import { siteConfig } from '@/config'; +import styles from './contact-modal.module.css'; interface ContactModalProps { open: boolean; @@ -13,8 +15,7 @@ export function ContactModal({ open, onOpenChange }: ContactModalProps) { const [emailCopied, setEmailCopied] = useState(false); // const [phoneCopied, setPhoneCopied] = useState(false); - // Replace with your actual contact info - const email = 'kumar.ayush.cs@gmail.com'; + const email = siteConfig.personal.email; // const phone = "+1 (123) 456-7890"; const copyToClipboard = (text: string, type: 'email' | 'phone') => { @@ -34,25 +35,25 @@ export function ContactModal({ open, onOpenChange }: ContactModalProps) { return ( - + Contact Me Feel free to reach out via email. -
      -
      -
      - +
      +
      +
      +
      -
      -

      Email

      - + -
      @@ -81,10 +82,36 @@ export function ContactModal({ open, onOpenChange }: ContactModalProps) {
      */}
      - - + +
      diff --git a/src/components/layout.module.css b/src/components/layout.module.css new file mode 100644 index 0000000..19f7d8d --- /dev/null +++ b/src/components/layout.module.css @@ -0,0 +1,29 @@ +/* Layout Component CSS Module */ + +.layoutContainer { + @apply relative min-h-screen flex flex-col; +} + +.main { + @apply flex-1 pt-16; +} + +.footer { + @apply border-t py-6 md:py-8; +} + +.footerContent { + @apply flex flex-col items-center justify-between gap-4 md:flex-row; +} + +.copyright { + @apply text-center text-sm leading-loose text-muted-foreground md:text-left; +} + +.socialLinks { + @apply flex items-center gap-4; +} + +.socialLink { + @apply text-muted-foreground hover:text-foreground; +} \ No newline at end of file diff --git a/src/components/layout.tsx b/src/components/layout.tsx index 84c978a..8f0bf71 100644 --- a/src/components/layout.tsx +++ b/src/components/layout.tsx @@ -1,5 +1,6 @@ import { MainNav } from "./main-nav"; +import styles from './layout.module.css'; interface LayoutProps { children: React.ReactNode; @@ -7,20 +8,20 @@ interface LayoutProps { export function Layout({ children }: LayoutProps) { return ( -
      +
      -
      {children}
      -