diff --git a/Dockerfile b/Dockerfile index 3109424..312d9bd 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,7 +4,7 @@ FROM node:20 AS base # Install dependencies only when needed FROM base AS deps # Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed. -RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/* +RUN apt-get update && apt-get install -y --no-install-recommends curl && rm -rf /var/lib/apt/lists/* WORKDIR /app # Install dependencies based on the preferred package manager diff --git a/app/components/Contact.tsx b/app/components/Contact.tsx index d968927..e93cd82 100644 --- a/app/components/Contact.tsx +++ b/app/components/Contact.tsx @@ -93,10 +93,10 @@ const Contact = () => { className="text-center mb-16" >

- Get In Touch + Contact Me

- Have a project in mind or want to collaborate? I would love to hear from you! + Interested in working together or have questions about my projects? Feel free to reach out!

@@ -111,11 +111,11 @@ const Contact = () => { >

- Let's Connect + Get In Touch

- I'm always open to discussing new opportunities, interesting projects, - or just having a chat about technology and innovation. + I'm always available to discuss new opportunities, interesting projects, + or simply chat about technology and innovation.

diff --git a/app/components/Hero.tsx b/app/components/Hero.tsx index b5336f3..97ba3a5 100644 --- a/app/components/Hero.tsx +++ b/app/components/Hero.tsx @@ -216,7 +216,7 @@ const Hero = () => { whileTap={{ scale: 0.95 }} className="px-8 py-4 text-lg font-semibold border-2 border-gray-600 text-gray-300 hover:text-white hover:border-gray-500 rounded-lg transition-all duration-200" > - Get In Touch + Contact Me diff --git a/app/layout.tsx b/app/layout.tsx index 270c153..f6edce4 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -42,7 +42,7 @@ export const metadata: Metadata = { authors: [{name: "Dennis Konkol", url: "https://dk0.dev"}], openGraph: { title: "Dennis Konkol | Portfolio", - description: "Explore my projects and get in touch!", + description: "Explore my projects and contact me for collaboration opportunities!", url: "https://dk0.dev", siteName: "Dennis Konkol Portfolio", images: [ diff --git a/next.config.ts b/next.config.ts index 2c05905..70fa257 100644 --- a/next.config.ts +++ b/next.config.ts @@ -8,6 +8,7 @@ dotenv.config({ path: path.resolve(__dirname, '.env') }); const nextConfig: NextConfig = { // Enable standalone output for Docker output: 'standalone', + outputFileTracingRoot: path.join(__dirname, '../../'), // Optimize for production compress: true, @@ -42,8 +43,7 @@ const nextConfig: NextConfig = { minimumCacheTTL: 60, }, - // Disable static generation for dynamic routes - generateStaticParams: false, + // Dynamic routes are handled automatically by Next.js // Add cache-busting headers async headers() { diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 44b46c9..f34bf02 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -1,6 +1,3 @@ -// This is your Prisma schema file, -// learn more about it in the docs: https://pris.ly/d/prisma-schema - generator client { provider = "prisma-client-js" } @@ -11,46 +8,37 @@ datasource db { } model Project { - id Int @id @default(autoincrement()) - title String @db.VarChar(255) - description String @db.Text - content String @db.Text - tags String[] @default([]) - featured Boolean @default(false) - category String @db.VarChar(100) - date String @db.VarChar(10) - github String? @db.VarChar(500) - live String? @db.VarChar(500) - published Boolean @default(true) - imageUrl String? @db.VarChar(500) - metaDescription String? @db.Text - keywords String? @db.Text - ogImage String? @db.VarChar(500) - schema Json? - - // Advanced features - difficulty Difficulty @default(INTERMEDIATE) - timeToComplete String? @db.VarChar(100) - technologies String[] @default([]) - challenges String[] @default([]) - lessonsLearned String[] @default([]) - futureImprovements String[] @default([]) - demoVideo String? @db.VarChar(500) - screenshots String[] @default([]) - colorScheme String @db.VarChar(100) @default("Dark") - accessibility Boolean @default(true) - - // Performance metrics - performance Json @default("{\"lighthouse\": 90, \"bundleSize\": \"50KB\", \"loadTime\": \"1.5s\"}") - - // Analytics - analytics Json @default("{\"views\": 0, \"likes\": 0, \"shares\": 0}") - - // Timestamps - createdAt DateTime @default(now()) @map("created_at") - updatedAt DateTime @updatedAt @map("updated_at") - - // Indexes for performance + id Int @id @default(autoincrement()) + title String @db.VarChar(255) + description String + content String + tags String[] @default([]) + featured Boolean @default(false) + category String @db.VarChar(100) + date String @db.VarChar(10) + github String? @db.VarChar(500) + live String? @db.VarChar(500) + published Boolean @default(true) + imageUrl String? @db.VarChar(500) + metaDescription String? + keywords String? + ogImage String? @db.VarChar(500) + schema Json? + difficulty Difficulty @default(INTERMEDIATE) + timeToComplete String? @db.VarChar(100) + technologies String[] @default([]) + challenges String[] @default([]) + lessonsLearned String[] @default([]) + futureImprovements String[] @default([]) + demoVideo String? @db.VarChar(500) + screenshots String[] @default([]) + colorScheme String @default("Dark") @db.VarChar(100) + accessibility Boolean @default(true) + performance Json @default("{\"loadTime\": \"1.5s\", \"bundleSize\": \"50KB\", \"lighthouse\": 90}") + analytics Json @default("{\"likes\": 0, \"views\": 0, \"shares\": 0}") + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @updatedAt @map("updated_at") + @@index([category]) @@index([featured]) @@index([published]) @@ -59,6 +47,49 @@ model Project { @@index([tags]) } +model PageView { + id Int @id @default(autoincrement()) + projectId Int? @map("project_id") + page String @db.VarChar(100) + ip String? @db.VarChar(45) + userAgent String? @map("user_agent") + referrer String? @db.VarChar(500) + timestamp DateTime @default(now()) + + @@index([projectId]) + @@index([timestamp]) + @@index([page]) +} + +model UserInteraction { + id Int @id @default(autoincrement()) + projectId Int @map("project_id") + type InteractionType + ip String? @db.VarChar(45) + userAgent String? @map("user_agent") + timestamp DateTime @default(now()) + + @@index([projectId]) + @@index([type]) + @@index([timestamp]) +} + +model Contact { + id Int @id @default(autoincrement()) + name String @db.VarChar(255) + email String @db.VarChar(255) + subject String @db.VarChar(500) + message String + responded Boolean @default(false) + responseTemplate String? @map("response_template") @db.VarChar(50) + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @updatedAt @map("updated_at") + + @@index([email]) + @@index([responded]) + @@index([createdAt]) +} + enum Difficulty { BEGINNER INTERMEDIATE @@ -66,55 +97,9 @@ enum Difficulty { EXPERT } -// Analytics tracking -model PageView { - id Int @id @default(autoincrement()) - projectId Int? @map("project_id") - page String @db.VarChar(100) - ip String? @db.VarChar(45) - userAgent String? @db.Text @map("user_agent") - referrer String? @db.VarChar(500) - timestamp DateTime @default(now()) - - @@index([projectId]) - @@index([timestamp]) - @@index([page]) -} - -// User interactions -model UserInteraction { - id Int @id @default(autoincrement()) - projectId Int @map("project_id") - type InteractionType - ip String? @db.VarChar(45) - userAgent String? @db.Text @map("user_agent") - timestamp DateTime @default(now()) - - @@index([projectId]) - @@index([type]) - @@index([timestamp]) -} - enum InteractionType { LIKE SHARE BOOKMARK COMMENT } - -// Contact form submissions -model Contact { - id Int @id @default(autoincrement()) - name String @db.VarChar(255) - email String @db.VarChar(255) - subject String @db.VarChar(500) - message String @db.Text - responded Boolean @default(false) - responseTemplate String? @db.VarChar(50) @map("response_template") - createdAt DateTime @default(now()) @map("created_at") - updatedAt DateTime @updatedAt @map("updated_at") - - @@index([email]) - @@index([responded]) - @@index([createdAt]) -}