diff --git a/.gitignore b/.gitignore index 1924897..a484ab2 100644 --- a/.gitignore +++ b/.gitignore @@ -78,4 +78,7 @@ supabase/.temp/ .settings/ *.sublime-workspace *.sublime-project -.history/ \ No newline at end of file +.history/ + +# Source images (originals before optimization) +source-images/ \ No newline at end of file diff --git a/index.html b/index.html index 501b56b..e82cab5 100644 --- a/index.html +++ b/index.html @@ -125,6 +125,7 @@ + diff --git a/package.json b/package.json index f9ed713..4ec9ac4 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "scripts": { "dev": "vite", "build": "npm run generate-sitemap && vite build", + "build:images": "node scripts/optimize-images.js", "lint": "eslint .", "preview": "vite preview", "test": "vitest", diff --git a/public/images/projects/ai-data-reader/cover-1200w.jpg b/public/images/projects/ai-data-reader/cover-1200w.jpg new file mode 100644 index 0000000..f2c2d53 Binary files /dev/null and b/public/images/projects/ai-data-reader/cover-1200w.jpg differ diff --git a/public/images/projects/ai-data-reader/cover-400w.jpg b/public/images/projects/ai-data-reader/cover-400w.jpg new file mode 100644 index 0000000..b2d7e69 Binary files /dev/null and b/public/images/projects/ai-data-reader/cover-400w.jpg differ diff --git a/public/images/projects/ai-data-reader/cover-800w.jpg b/public/images/projects/ai-data-reader/cover-800w.jpg new file mode 100644 index 0000000..1e2a9df Binary files /dev/null and b/public/images/projects/ai-data-reader/cover-800w.jpg differ diff --git a/public/images/projects/ai-data-reader/cover.jpg b/public/images/projects/ai-data-reader/cover.jpg index 370e1be..63c88d7 100644 Binary files a/public/images/projects/ai-data-reader/cover.jpg and b/public/images/projects/ai-data-reader/cover.jpg differ diff --git a/public/images/projects/ai-data-reader/cover.webp b/public/images/projects/ai-data-reader/cover.webp new file mode 100644 index 0000000..fd1cda3 Binary files /dev/null and b/public/images/projects/ai-data-reader/cover.webp differ diff --git a/public/images/projects/ai-music-production/cover-1200w.jpg b/public/images/projects/ai-music-production/cover-1200w.jpg new file mode 100644 index 0000000..0bba9c4 Binary files /dev/null and b/public/images/projects/ai-music-production/cover-1200w.jpg differ diff --git a/public/images/projects/ai-music-production/cover-400w.jpg b/public/images/projects/ai-music-production/cover-400w.jpg new file mode 100644 index 0000000..79dc14b Binary files /dev/null and b/public/images/projects/ai-music-production/cover-400w.jpg differ diff --git a/public/images/projects/ai-music-production/cover-800w.jpg b/public/images/projects/ai-music-production/cover-800w.jpg new file mode 100644 index 0000000..17dc202 Binary files /dev/null and b/public/images/projects/ai-music-production/cover-800w.jpg differ diff --git a/public/images/projects/ai-music-production/cover.jpg b/public/images/projects/ai-music-production/cover.jpg index b052965..22cd63a 100644 Binary files a/public/images/projects/ai-music-production/cover.jpg and b/public/images/projects/ai-music-production/cover.jpg differ diff --git a/public/images/projects/ai-music-production/cover.webp b/public/images/projects/ai-music-production/cover.webp new file mode 100644 index 0000000..ebe0baf Binary files /dev/null and b/public/images/projects/ai-music-production/cover.webp differ diff --git a/public/images/projects/automated-ad-creatives/cover-1200w.jpg b/public/images/projects/automated-ad-creatives/cover-1200w.jpg new file mode 100644 index 0000000..9e44de7 Binary files /dev/null and b/public/images/projects/automated-ad-creatives/cover-1200w.jpg differ diff --git a/public/images/projects/automated-ad-creatives/cover-400w.jpg b/public/images/projects/automated-ad-creatives/cover-400w.jpg new file mode 100644 index 0000000..4d7c2b4 Binary files /dev/null and b/public/images/projects/automated-ad-creatives/cover-400w.jpg differ diff --git a/public/images/projects/automated-ad-creatives/cover-800w.jpg b/public/images/projects/automated-ad-creatives/cover-800w.jpg new file mode 100644 index 0000000..f7a4925 Binary files /dev/null and b/public/images/projects/automated-ad-creatives/cover-800w.jpg differ diff --git a/public/images/projects/automated-ad-creatives/cover.jpg b/public/images/projects/automated-ad-creatives/cover.jpg index de440f4..2e3c60c 100644 Binary files a/public/images/projects/automated-ad-creatives/cover.jpg and b/public/images/projects/automated-ad-creatives/cover.jpg differ diff --git a/public/images/projects/automated-ad-creatives/cover.webp b/public/images/projects/automated-ad-creatives/cover.webp new file mode 100644 index 0000000..0acf4f2 Binary files /dev/null and b/public/images/projects/automated-ad-creatives/cover.webp differ diff --git a/public/images/projects/bi-vision/cover-1200w.jpg b/public/images/projects/bi-vision/cover-1200w.jpg new file mode 100644 index 0000000..05d5102 Binary files /dev/null and b/public/images/projects/bi-vision/cover-1200w.jpg differ diff --git a/public/images/projects/bi-vision/cover-400w.jpg b/public/images/projects/bi-vision/cover-400w.jpg new file mode 100644 index 0000000..9843880 Binary files /dev/null and b/public/images/projects/bi-vision/cover-400w.jpg differ diff --git a/public/images/projects/bi-vision/cover-800w.jpg b/public/images/projects/bi-vision/cover-800w.jpg new file mode 100644 index 0000000..75bfaac Binary files /dev/null and b/public/images/projects/bi-vision/cover-800w.jpg differ diff --git a/public/images/projects/bi-vision/cover.jpg b/public/images/projects/bi-vision/cover.jpg index 51f6dbd..87d9a93 100644 Binary files a/public/images/projects/bi-vision/cover.jpg and b/public/images/projects/bi-vision/cover.jpg differ diff --git a/public/images/projects/bi-vision/cover.webp b/public/images/projects/bi-vision/cover.webp new file mode 100644 index 0000000..e1b36f4 Binary files /dev/null and b/public/images/projects/bi-vision/cover.webp differ diff --git a/public/images/projects/business-intelligence-ai/cover-1200w.jpg b/public/images/projects/business-intelligence-ai/cover-1200w.jpg new file mode 100644 index 0000000..ad6bdc9 Binary files /dev/null and b/public/images/projects/business-intelligence-ai/cover-1200w.jpg differ diff --git a/public/images/projects/business-intelligence-ai/cover-400w.jpg b/public/images/projects/business-intelligence-ai/cover-400w.jpg new file mode 100644 index 0000000..6b73d4a Binary files /dev/null and b/public/images/projects/business-intelligence-ai/cover-400w.jpg differ diff --git a/public/images/projects/business-intelligence-ai/cover-800w.jpg b/public/images/projects/business-intelligence-ai/cover-800w.jpg new file mode 100644 index 0000000..4f384da Binary files /dev/null and b/public/images/projects/business-intelligence-ai/cover-800w.jpg differ diff --git a/public/images/projects/business-intelligence-ai/cover.jpg b/public/images/projects/business-intelligence-ai/cover.jpg index cbfebcf..24ecf0c 100644 Binary files a/public/images/projects/business-intelligence-ai/cover.jpg and b/public/images/projects/business-intelligence-ai/cover.jpg differ diff --git a/public/images/projects/business-intelligence-ai/cover.webp b/public/images/projects/business-intelligence-ai/cover.webp new file mode 100644 index 0000000..8e72c7c Binary files /dev/null and b/public/images/projects/business-intelligence-ai/cover.webp differ diff --git a/public/images/projects/claude-personal-assistant/cover-1200w.jpg b/public/images/projects/claude-personal-assistant/cover-1200w.jpg new file mode 100644 index 0000000..567aacb Binary files /dev/null and b/public/images/projects/claude-personal-assistant/cover-1200w.jpg differ diff --git a/public/images/projects/claude-personal-assistant/cover-400w.jpg b/public/images/projects/claude-personal-assistant/cover-400w.jpg new file mode 100644 index 0000000..b8fb466 Binary files /dev/null and b/public/images/projects/claude-personal-assistant/cover-400w.jpg differ diff --git a/public/images/projects/claude-personal-assistant/cover-800w.jpg b/public/images/projects/claude-personal-assistant/cover-800w.jpg new file mode 100644 index 0000000..1d7aafe Binary files /dev/null and b/public/images/projects/claude-personal-assistant/cover-800w.jpg differ diff --git a/public/images/projects/claude-personal-assistant/cover.jpg b/public/images/projects/claude-personal-assistant/cover.jpg index 60ebb8f..d8553aa 100644 Binary files a/public/images/projects/claude-personal-assistant/cover.jpg and b/public/images/projects/claude-personal-assistant/cover.jpg differ diff --git a/public/images/projects/claude-personal-assistant/cover.webp b/public/images/projects/claude-personal-assistant/cover.webp new file mode 100644 index 0000000..67a81cc Binary files /dev/null and b/public/images/projects/claude-personal-assistant/cover.webp differ diff --git a/public/images/projects/cursor-ide/cover-1200w.jpg b/public/images/projects/cursor-ide/cover-1200w.jpg new file mode 100644 index 0000000..dfa9df7 Binary files /dev/null and b/public/images/projects/cursor-ide/cover-1200w.jpg differ diff --git a/public/images/projects/cursor-ide/cover-400w.jpg b/public/images/projects/cursor-ide/cover-400w.jpg new file mode 100644 index 0000000..7ad2184 Binary files /dev/null and b/public/images/projects/cursor-ide/cover-400w.jpg differ diff --git a/public/images/projects/cursor-ide/cover-800w.jpg b/public/images/projects/cursor-ide/cover-800w.jpg new file mode 100644 index 0000000..0a98923 Binary files /dev/null and b/public/images/projects/cursor-ide/cover-800w.jpg differ diff --git a/public/images/projects/cursor-ide/cover.jpg b/public/images/projects/cursor-ide/cover.jpg index 1dc7fae..30a00cc 100644 Binary files a/public/images/projects/cursor-ide/cover.jpg and b/public/images/projects/cursor-ide/cover.jpg differ diff --git a/public/images/projects/cursor-ide/cover.webp b/public/images/projects/cursor-ide/cover.webp new file mode 100644 index 0000000..8020cc5 Binary files /dev/null and b/public/images/projects/cursor-ide/cover.webp differ diff --git a/public/images/projects/e-commerce-integration/cover-1200w.jpg b/public/images/projects/e-commerce-integration/cover-1200w.jpg new file mode 100644 index 0000000..1f5424d Binary files /dev/null and b/public/images/projects/e-commerce-integration/cover-1200w.jpg differ diff --git a/public/images/projects/e-commerce-integration/cover-400w.jpg b/public/images/projects/e-commerce-integration/cover-400w.jpg new file mode 100644 index 0000000..4cf18a4 Binary files /dev/null and b/public/images/projects/e-commerce-integration/cover-400w.jpg differ diff --git a/public/images/projects/e-commerce-integration/cover-800w.jpg b/public/images/projects/e-commerce-integration/cover-800w.jpg new file mode 100644 index 0000000..8739116 Binary files /dev/null and b/public/images/projects/e-commerce-integration/cover-800w.jpg differ diff --git a/public/images/projects/e-commerce-integration/cover.jpg b/public/images/projects/e-commerce-integration/cover.jpg index 162b059..307d6ec 100644 Binary files a/public/images/projects/e-commerce-integration/cover.jpg and b/public/images/projects/e-commerce-integration/cover.jpg differ diff --git a/public/images/projects/e-commerce-integration/cover.webp b/public/images/projects/e-commerce-integration/cover.webp new file mode 100644 index 0000000..f586ab5 Binary files /dev/null and b/public/images/projects/e-commerce-integration/cover.webp differ diff --git a/public/images/projects/kamenpro/cover-1200w.jpg b/public/images/projects/kamenpro/cover-1200w.jpg new file mode 100644 index 0000000..374004f Binary files /dev/null and b/public/images/projects/kamenpro/cover-1200w.jpg differ diff --git a/public/images/projects/kamenpro/cover-400w.jpg b/public/images/projects/kamenpro/cover-400w.jpg new file mode 100644 index 0000000..26c0507 Binary files /dev/null and b/public/images/projects/kamenpro/cover-400w.jpg differ diff --git a/public/images/projects/kamenpro/cover-800w.jpg b/public/images/projects/kamenpro/cover-800w.jpg new file mode 100644 index 0000000..7d4f00b Binary files /dev/null and b/public/images/projects/kamenpro/cover-800w.jpg differ diff --git a/public/images/projects/kamenpro/cover.jpg b/public/images/projects/kamenpro/cover.jpg index f7c8f6e..afeccca 100644 Binary files a/public/images/projects/kamenpro/cover.jpg and b/public/images/projects/kamenpro/cover.jpg differ diff --git a/public/images/projects/kamenpro/cover.webp b/public/images/projects/kamenpro/cover.webp new file mode 100644 index 0000000..7775b31 Binary files /dev/null and b/public/images/projects/kamenpro/cover.webp differ diff --git a/public/images/projects/local-llm-training/cover-1200w.jpg b/public/images/projects/local-llm-training/cover-1200w.jpg new file mode 100644 index 0000000..c6e1256 Binary files /dev/null and b/public/images/projects/local-llm-training/cover-1200w.jpg differ diff --git a/public/images/projects/local-llm-training/cover-400w.jpg b/public/images/projects/local-llm-training/cover-400w.jpg new file mode 100644 index 0000000..a06f684 Binary files /dev/null and b/public/images/projects/local-llm-training/cover-400w.jpg differ diff --git a/public/images/projects/local-llm-training/cover-800w.jpg b/public/images/projects/local-llm-training/cover-800w.jpg new file mode 100644 index 0000000..16be319 Binary files /dev/null and b/public/images/projects/local-llm-training/cover-800w.jpg differ diff --git a/public/images/projects/local-llm-training/cover.jpg b/public/images/projects/local-llm-training/cover.jpg index 531c3c7..f0918d0 100644 Binary files a/public/images/projects/local-llm-training/cover.jpg and b/public/images/projects/local-llm-training/cover.jpg differ diff --git a/public/images/projects/local-llm-training/cover.webp b/public/images/projects/local-llm-training/cover.webp new file mode 100644 index 0000000..8722da7 Binary files /dev/null and b/public/images/projects/local-llm-training/cover.webp differ diff --git a/public/images/projects/power-platform-governance/cover-1200w.jpg b/public/images/projects/power-platform-governance/cover-1200w.jpg new file mode 100644 index 0000000..a0e1a51 Binary files /dev/null and b/public/images/projects/power-platform-governance/cover-1200w.jpg differ diff --git a/public/images/projects/power-platform-governance/cover-400w.jpg b/public/images/projects/power-platform-governance/cover-400w.jpg new file mode 100644 index 0000000..d074704 Binary files /dev/null and b/public/images/projects/power-platform-governance/cover-400w.jpg differ diff --git a/public/images/projects/power-platform-governance/cover-800w.jpg b/public/images/projects/power-platform-governance/cover-800w.jpg new file mode 100644 index 0000000..ab0bfbf Binary files /dev/null and b/public/images/projects/power-platform-governance/cover-800w.jpg differ diff --git a/public/images/projects/power-platform-governance/cover.jpg b/public/images/projects/power-platform-governance/cover.jpg index bf415ff..22b0dd5 100644 Binary files a/public/images/projects/power-platform-governance/cover.jpg and b/public/images/projects/power-platform-governance/cover.jpg differ diff --git a/public/images/projects/power-platform-governance/cover.webp b/public/images/projects/power-platform-governance/cover.webp new file mode 100644 index 0000000..ba12b04 Binary files /dev/null and b/public/images/projects/power-platform-governance/cover.webp differ diff --git a/public/images/projects/rfid-automation/cover-1200w.jpg b/public/images/projects/rfid-automation/cover-1200w.jpg new file mode 100644 index 0000000..af10dc5 Binary files /dev/null and b/public/images/projects/rfid-automation/cover-1200w.jpg differ diff --git a/public/images/projects/rfid-automation/cover-400w.jpg b/public/images/projects/rfid-automation/cover-400w.jpg new file mode 100644 index 0000000..6e6d8a8 Binary files /dev/null and b/public/images/projects/rfid-automation/cover-400w.jpg differ diff --git a/public/images/projects/rfid-automation/cover-800w.jpg b/public/images/projects/rfid-automation/cover-800w.jpg new file mode 100644 index 0000000..e75c91b Binary files /dev/null and b/public/images/projects/rfid-automation/cover-800w.jpg differ diff --git a/public/images/projects/rfid-automation/cover.jpg b/public/images/projects/rfid-automation/cover.jpg index 64e9c81..083b190 100644 Binary files a/public/images/projects/rfid-automation/cover.jpg and b/public/images/projects/rfid-automation/cover.jpg differ diff --git a/public/images/projects/rfid-automation/cover.webp b/public/images/projects/rfid-automation/cover.webp new file mode 100644 index 0000000..438b19a Binary files /dev/null and b/public/images/projects/rfid-automation/cover.webp differ diff --git a/public/images/projects/smart-warehouse/cover-1200w.jpg b/public/images/projects/smart-warehouse/cover-1200w.jpg new file mode 100644 index 0000000..9f6d297 Binary files /dev/null and b/public/images/projects/smart-warehouse/cover-1200w.jpg differ diff --git a/public/images/projects/smart-warehouse/cover-400w.jpg b/public/images/projects/smart-warehouse/cover-400w.jpg new file mode 100644 index 0000000..e7ea14a Binary files /dev/null and b/public/images/projects/smart-warehouse/cover-400w.jpg differ diff --git a/public/images/projects/smart-warehouse/cover-800w.jpg b/public/images/projects/smart-warehouse/cover-800w.jpg new file mode 100644 index 0000000..936f928 Binary files /dev/null and b/public/images/projects/smart-warehouse/cover-800w.jpg differ diff --git a/public/images/projects/smart-warehouse/cover.jpg b/public/images/projects/smart-warehouse/cover.jpg index 53bdd25..8eac6b9 100644 Binary files a/public/images/projects/smart-warehouse/cover.jpg and b/public/images/projects/smart-warehouse/cover.jpg differ diff --git a/public/images/projects/smart-warehouse/cover.webp b/public/images/projects/smart-warehouse/cover.webp new file mode 100644 index 0000000..6de3a6a Binary files /dev/null and b/public/images/projects/smart-warehouse/cover.webp differ diff --git a/public/images/projects/timetracking-software/cover-1200w.jpg b/public/images/projects/timetracking-software/cover-1200w.jpg new file mode 100644 index 0000000..1619f51 Binary files /dev/null and b/public/images/projects/timetracking-software/cover-1200w.jpg differ diff --git a/public/images/projects/timetracking-software/cover-400w.jpg b/public/images/projects/timetracking-software/cover-400w.jpg new file mode 100644 index 0000000..a9ea4b9 Binary files /dev/null and b/public/images/projects/timetracking-software/cover-400w.jpg differ diff --git a/public/images/projects/timetracking-software/cover-800w.jpg b/public/images/projects/timetracking-software/cover-800w.jpg new file mode 100644 index 0000000..5d784c6 Binary files /dev/null and b/public/images/projects/timetracking-software/cover-800w.jpg differ diff --git a/public/images/projects/timetracking-software/cover.jpg b/public/images/projects/timetracking-software/cover.jpg index 7256ba5..df0adf9 100644 Binary files a/public/images/projects/timetracking-software/cover.jpg and b/public/images/projects/timetracking-software/cover.jpg differ diff --git a/public/images/projects/timetracking-software/cover.webp b/public/images/projects/timetracking-software/cover.webp new file mode 100644 index 0000000..2d5e1c4 Binary files /dev/null and b/public/images/projects/timetracking-software/cover.webp differ diff --git a/public/images/projects/website-mit-ki/cover-1200w.jpg b/public/images/projects/website-mit-ki/cover-1200w.jpg new file mode 100644 index 0000000..4004753 Binary files /dev/null and b/public/images/projects/website-mit-ki/cover-1200w.jpg differ diff --git a/public/images/projects/website-mit-ki/cover-400w.jpg b/public/images/projects/website-mit-ki/cover-400w.jpg new file mode 100644 index 0000000..09e5f42 Binary files /dev/null and b/public/images/projects/website-mit-ki/cover-400w.jpg differ diff --git a/public/images/projects/website-mit-ki/cover-800w.jpg b/public/images/projects/website-mit-ki/cover-800w.jpg new file mode 100644 index 0000000..7064c3c Binary files /dev/null and b/public/images/projects/website-mit-ki/cover-800w.jpg differ diff --git a/public/images/projects/website-mit-ki/cover.jpg b/public/images/projects/website-mit-ki/cover.jpg index c307be3..59eec9a 100644 Binary files a/public/images/projects/website-mit-ki/cover.jpg and b/public/images/projects/website-mit-ki/cover.jpg differ diff --git a/public/images/projects/website-mit-ki/cover.webp b/public/images/projects/website-mit-ki/cover.webp new file mode 100644 index 0000000..b36e975 Binary files /dev/null and b/public/images/projects/website-mit-ki/cover.webp differ diff --git a/scripts/optimize-images.js b/scripts/optimize-images.js new file mode 100644 index 0000000..4195945 --- /dev/null +++ b/scripts/optimize-images.js @@ -0,0 +1,115 @@ +import sharp from 'sharp'; +import { readdir, mkdir } from 'fs/promises'; +import { join, dirname, basename, extname } from 'path'; +import { fileURLToPath } from 'url'; +import { existsSync } from 'fs'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); + +const SIZES = [400, 800, 1200]; +const INPUT_DIR = join(__dirname, '../source-images/projects'); +const OUTPUT_DIR = join(__dirname, '../public/images/projects'); + +async function processImage(inputPath, projectSlug) { + const filename = basename(inputPath, extname(inputPath)); + const ext = extname(inputPath).toLowerCase(); + + // Skip non-image files + if (!['.jpg', '.jpeg', '.png', '.webp'].includes(ext)) { + return; + } + + const outputDir = join(OUTPUT_DIR, projectSlug); + + // Create output directory if it doesn't exist + await mkdir(outputDir, { recursive: true }); + + console.log(`Processing: ${projectSlug}/${filename}${ext}`); + + // Create optimized original size (cover.jpg) + const originalOutputPath = join(outputDir, `${filename}.jpg`); + try { + await sharp(inputPath) + .jpeg({ quality: 85, progressive: true }) + .toFile(originalOutputPath); + console.log(` Created: ${filename}.jpg (optimized original)`); + } catch (error) { + console.error(` Error creating optimized original:`, error.message); + } + + // Create different sizes + for (const width of SIZES) { + const outputFilename = `${filename}-${width}w.jpg`; + const outputPath = join(outputDir, outputFilename); + + try { + await sharp(inputPath) + .resize(width, null, { + withoutEnlargement: true, + fit: 'inside' + }) + .jpeg({ quality: 80, progressive: true }) + .toFile(outputPath); + + console.log(` Created: ${outputFilename}`); + } catch (error) { + console.error(` Error creating ${outputFilename}:`, error.message); + } + } + + // Create WebP version of original size + const webpFilename = `${filename}.webp`; + const webpPath = join(outputDir, webpFilename); + + try { + await sharp(inputPath) + .webp({ quality: 80 }) + .toFile(webpPath); + + console.log(` Created: ${webpFilename}`); + } catch (error) { + console.error(` Error creating WebP:`, error.message); + } +} + +async function processDirectory(dirPath) { + if (!existsSync(dirPath)) { + console.error(`Error: Source directory not found: ${dirPath}`); + console.log('\nPlease ensure original images are placed in:'); + console.log(' source-images/projects//cover.jpg'); + process.exit(1); + } + + const entries = await readdir(dirPath, { withFileTypes: true }); + + for (const entry of entries) { + const fullPath = join(dirPath, entry.name); + + if (entry.isDirectory()) { + // Check for cover.jpg in this project directory + const coverPath = join(fullPath, 'cover.jpg'); + if (existsSync(coverPath)) { + await processImage(coverPath, entry.name); + } else { + console.log(`Skipping ${entry.name}: no cover.jpg found`); + } + } + } +} + +async function main() { + console.log('Starting image optimization...'); + console.log(`Source: ${INPUT_DIR}`); + console.log(`Output: ${OUTPUT_DIR}\n`); + + try { + await processDirectory(INPUT_DIR); + console.log('\nImage optimization complete!'); + } catch (error) { + console.error('Error during optimization:', error); + process.exit(1); + } +} + +main(); diff --git a/src/components/Layout.tsx b/src/components/Layout.tsx index 6b5fb64..f7067b9 100644 --- a/src/components/Layout.tsx +++ b/src/components/Layout.tsx @@ -156,6 +156,8 @@ const Layout = ({ children }: LayoutProps) => { src="/header-logo.svg" alt="Damjan Savić Logo" className="h-8 w-auto" + width={120} + height={32} whileHover={{ scale: 1.05 }} transition={{ type: "spring", stiffness: 400, damping: 10 }} /> diff --git a/src/pages/home/components/Experience.tsx b/src/pages/home/components/Experience.tsx index 86377e3..9c67fff 100644 --- a/src/pages/home/components/Experience.tsx +++ b/src/pages/home/components/Experience.tsx @@ -117,10 +117,10 @@ const Experience = () => { {exp.role} - + {exp.company} - + {exp.period} @@ -158,25 +158,32 @@ const Experience = () => { > ‹ - + {[...Array(totalPages)].map((_, index) => ( setCurrentPage(index)} - className={`rounded-full transition-all duration-300 ${ - index === currentPage - ? 'bg-white' - : 'bg-zinc-600 hover:bg-zinc-400' - }`} + className="relative flex items-center justify-center transition-all duration-300" style={{ - width: '5px', - height: '5px', - minWidth: '5px', - minHeight: '5px', - padding: '0' + width: '24px', + height: '24px', + minWidth: '24px', + minHeight: '24px' }} aria-label={t('pages.home.experience.navigation.page', { page: index + 1 })} - /> + > + + ))} { alt={t('pages.home.hero.image.alt')} className="w-full h-full object-cover" loading="eager" + fetchPriority="high" + width={288} + height={288} style={{ transform: 'scale(1.01)' }} /> diff --git a/src/pages/portfolio/components/PortfolioCard.tsx b/src/pages/portfolio/components/PortfolioCard.tsx index 424710f..46d68b3 100644 --- a/src/pages/portfolio/components/PortfolioCard.tsx +++ b/src/pages/portfolio/components/PortfolioCard.tsx @@ -30,6 +30,8 @@ const PortfolioCard: React.FC = ({ project }) => { }; const imagePath = `/images/projects/${project.slug}/cover.jpg`; + const imagePathWebP = `/images/projects/${project.slug}/cover.webp`; + const srcSet = `/images/projects/${project.slug}/cover-400w.jpg 400w, /images/projects/${project.slug}/cover-800w.jpg 800w, /images/projects/${project.slug}/cover-1200w.jpg 1200w`; // Verwende technologies anstelle von tags wenn verfügbar const displayTags = project.technologies || project.tags; @@ -60,14 +62,22 @@ const PortfolioCard: React.FC = ({ project }) => { > {/* Image Container */} - + + + + {/* Content - with relative positioning to overlap the gradient */} diff --git a/vite.config.ts b/vite.config.ts index ce345ba..64e6174 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -28,6 +28,7 @@ export default defineConfig({ VitePWA({ strategies: 'generateSW', registerType: 'autoUpdate', + injectRegister: 'script-defer', manifest: { name: 'Damjan Savić - JTL Integration Expert', short_name: 'Damjan Savić',
+
{exp.period}