diff --git a/index.html b/index.html index e82cab5..44bed95 100644 --- a/index.html +++ b/index.html @@ -125,7 +125,8 @@ - + + diff --git a/public/images/projects/ai-data-reader/cover-1200w.webp b/public/images/projects/ai-data-reader/cover-1200w.webp new file mode 100644 index 0000000..83c0861 Binary files /dev/null and b/public/images/projects/ai-data-reader/cover-1200w.webp differ diff --git a/public/images/projects/ai-data-reader/cover-200w.jpg b/public/images/projects/ai-data-reader/cover-200w.jpg new file mode 100644 index 0000000..db228e2 Binary files /dev/null and b/public/images/projects/ai-data-reader/cover-200w.jpg differ diff --git a/public/images/projects/ai-data-reader/cover-200w.webp b/public/images/projects/ai-data-reader/cover-200w.webp new file mode 100644 index 0000000..18d423d Binary files /dev/null and b/public/images/projects/ai-data-reader/cover-200w.webp differ diff --git a/public/images/projects/ai-data-reader/cover-300w.jpg b/public/images/projects/ai-data-reader/cover-300w.jpg new file mode 100644 index 0000000..433bca3 Binary files /dev/null and b/public/images/projects/ai-data-reader/cover-300w.jpg differ diff --git a/public/images/projects/ai-data-reader/cover-300w.webp b/public/images/projects/ai-data-reader/cover-300w.webp new file mode 100644 index 0000000..24bad74 Binary files /dev/null and b/public/images/projects/ai-data-reader/cover-300w.webp differ diff --git a/public/images/projects/ai-data-reader/cover-400w.webp b/public/images/projects/ai-data-reader/cover-400w.webp new file mode 100644 index 0000000..01d6ab5 Binary files /dev/null and b/public/images/projects/ai-data-reader/cover-400w.webp differ diff --git a/public/images/projects/ai-data-reader/cover-600w.jpg b/public/images/projects/ai-data-reader/cover-600w.jpg new file mode 100644 index 0000000..090aa61 Binary files /dev/null and b/public/images/projects/ai-data-reader/cover-600w.jpg differ diff --git a/public/images/projects/ai-data-reader/cover-600w.webp b/public/images/projects/ai-data-reader/cover-600w.webp new file mode 100644 index 0000000..d818b10 Binary files /dev/null and b/public/images/projects/ai-data-reader/cover-600w.webp differ diff --git a/public/images/projects/ai-data-reader/cover-800w.webp b/public/images/projects/ai-data-reader/cover-800w.webp new file mode 100644 index 0000000..e176fa4 Binary files /dev/null and b/public/images/projects/ai-data-reader/cover-800w.webp differ diff --git a/public/images/projects/ai-music-production/cover-1200w.webp b/public/images/projects/ai-music-production/cover-1200w.webp new file mode 100644 index 0000000..8d6ee2f Binary files /dev/null and b/public/images/projects/ai-music-production/cover-1200w.webp differ diff --git a/public/images/projects/ai-music-production/cover-200w.jpg b/public/images/projects/ai-music-production/cover-200w.jpg new file mode 100644 index 0000000..83e2979 Binary files /dev/null and b/public/images/projects/ai-music-production/cover-200w.jpg differ diff --git a/public/images/projects/ai-music-production/cover-200w.webp b/public/images/projects/ai-music-production/cover-200w.webp new file mode 100644 index 0000000..407c518 Binary files /dev/null and b/public/images/projects/ai-music-production/cover-200w.webp differ diff --git a/public/images/projects/ai-music-production/cover-300w.jpg b/public/images/projects/ai-music-production/cover-300w.jpg new file mode 100644 index 0000000..e4fa5a8 Binary files /dev/null and b/public/images/projects/ai-music-production/cover-300w.jpg differ diff --git a/public/images/projects/ai-music-production/cover-300w.webp b/public/images/projects/ai-music-production/cover-300w.webp new file mode 100644 index 0000000..c7d144c Binary files /dev/null and b/public/images/projects/ai-music-production/cover-300w.webp differ diff --git a/public/images/projects/ai-music-production/cover-400w.webp b/public/images/projects/ai-music-production/cover-400w.webp new file mode 100644 index 0000000..a723ebd Binary files /dev/null and b/public/images/projects/ai-music-production/cover-400w.webp differ diff --git a/public/images/projects/ai-music-production/cover-600w.jpg b/public/images/projects/ai-music-production/cover-600w.jpg new file mode 100644 index 0000000..4c1ddd2 Binary files /dev/null and b/public/images/projects/ai-music-production/cover-600w.jpg differ diff --git a/public/images/projects/ai-music-production/cover-600w.webp b/public/images/projects/ai-music-production/cover-600w.webp new file mode 100644 index 0000000..e85c46a Binary files /dev/null and b/public/images/projects/ai-music-production/cover-600w.webp differ diff --git a/public/images/projects/ai-music-production/cover-800w.webp b/public/images/projects/ai-music-production/cover-800w.webp new file mode 100644 index 0000000..0c2780d Binary files /dev/null and b/public/images/projects/ai-music-production/cover-800w.webp differ diff --git a/public/images/projects/automated-ad-creatives/cover-1200w.webp b/public/images/projects/automated-ad-creatives/cover-1200w.webp new file mode 100644 index 0000000..e7703a8 Binary files /dev/null and b/public/images/projects/automated-ad-creatives/cover-1200w.webp differ diff --git a/public/images/projects/automated-ad-creatives/cover-200w.jpg b/public/images/projects/automated-ad-creatives/cover-200w.jpg new file mode 100644 index 0000000..4e64866 Binary files /dev/null and b/public/images/projects/automated-ad-creatives/cover-200w.jpg differ diff --git a/public/images/projects/automated-ad-creatives/cover-200w.webp b/public/images/projects/automated-ad-creatives/cover-200w.webp new file mode 100644 index 0000000..bc7d22a Binary files /dev/null and b/public/images/projects/automated-ad-creatives/cover-200w.webp differ diff --git a/public/images/projects/automated-ad-creatives/cover-300w.jpg b/public/images/projects/automated-ad-creatives/cover-300w.jpg new file mode 100644 index 0000000..bc7b26f Binary files /dev/null and b/public/images/projects/automated-ad-creatives/cover-300w.jpg differ diff --git a/public/images/projects/automated-ad-creatives/cover-300w.webp b/public/images/projects/automated-ad-creatives/cover-300w.webp new file mode 100644 index 0000000..fcb0144 Binary files /dev/null and b/public/images/projects/automated-ad-creatives/cover-300w.webp differ diff --git a/public/images/projects/automated-ad-creatives/cover-400w.webp b/public/images/projects/automated-ad-creatives/cover-400w.webp new file mode 100644 index 0000000..19c3262 Binary files /dev/null and b/public/images/projects/automated-ad-creatives/cover-400w.webp differ diff --git a/public/images/projects/automated-ad-creatives/cover-600w.jpg b/public/images/projects/automated-ad-creatives/cover-600w.jpg new file mode 100644 index 0000000..953f288 Binary files /dev/null and b/public/images/projects/automated-ad-creatives/cover-600w.jpg differ diff --git a/public/images/projects/automated-ad-creatives/cover-600w.webp b/public/images/projects/automated-ad-creatives/cover-600w.webp new file mode 100644 index 0000000..82cd756 Binary files /dev/null and b/public/images/projects/automated-ad-creatives/cover-600w.webp differ diff --git a/public/images/projects/automated-ad-creatives/cover-800w.webp b/public/images/projects/automated-ad-creatives/cover-800w.webp new file mode 100644 index 0000000..d6a655a Binary files /dev/null and b/public/images/projects/automated-ad-creatives/cover-800w.webp differ diff --git a/public/images/projects/bi-vision/cover-1200w.webp b/public/images/projects/bi-vision/cover-1200w.webp new file mode 100644 index 0000000..5974bf8 Binary files /dev/null and b/public/images/projects/bi-vision/cover-1200w.webp differ diff --git a/public/images/projects/bi-vision/cover-200w.jpg b/public/images/projects/bi-vision/cover-200w.jpg new file mode 100644 index 0000000..6215c2e Binary files /dev/null and b/public/images/projects/bi-vision/cover-200w.jpg differ diff --git a/public/images/projects/bi-vision/cover-200w.webp b/public/images/projects/bi-vision/cover-200w.webp new file mode 100644 index 0000000..db0ff1c Binary files /dev/null and b/public/images/projects/bi-vision/cover-200w.webp differ diff --git a/public/images/projects/bi-vision/cover-300w.jpg b/public/images/projects/bi-vision/cover-300w.jpg new file mode 100644 index 0000000..61f3578 Binary files /dev/null and b/public/images/projects/bi-vision/cover-300w.jpg differ diff --git a/public/images/projects/bi-vision/cover-300w.webp b/public/images/projects/bi-vision/cover-300w.webp new file mode 100644 index 0000000..8da34ff Binary files /dev/null and b/public/images/projects/bi-vision/cover-300w.webp differ diff --git a/public/images/projects/bi-vision/cover-400w.webp b/public/images/projects/bi-vision/cover-400w.webp new file mode 100644 index 0000000..9b20f90 Binary files /dev/null and b/public/images/projects/bi-vision/cover-400w.webp differ diff --git a/public/images/projects/bi-vision/cover-600w.jpg b/public/images/projects/bi-vision/cover-600w.jpg new file mode 100644 index 0000000..e21b707 Binary files /dev/null and b/public/images/projects/bi-vision/cover-600w.jpg differ diff --git a/public/images/projects/bi-vision/cover-600w.webp b/public/images/projects/bi-vision/cover-600w.webp new file mode 100644 index 0000000..b93550b Binary files /dev/null and b/public/images/projects/bi-vision/cover-600w.webp differ diff --git a/public/images/projects/bi-vision/cover-800w.webp b/public/images/projects/bi-vision/cover-800w.webp new file mode 100644 index 0000000..11886b8 Binary files /dev/null and b/public/images/projects/bi-vision/cover-800w.webp differ diff --git a/public/images/projects/business-intelligence-ai/cover-1200w.webp b/public/images/projects/business-intelligence-ai/cover-1200w.webp new file mode 100644 index 0000000..fe720a2 Binary files /dev/null and b/public/images/projects/business-intelligence-ai/cover-1200w.webp differ diff --git a/public/images/projects/business-intelligence-ai/cover-200w.jpg b/public/images/projects/business-intelligence-ai/cover-200w.jpg new file mode 100644 index 0000000..68c0913 Binary files /dev/null and b/public/images/projects/business-intelligence-ai/cover-200w.jpg differ diff --git a/public/images/projects/business-intelligence-ai/cover-200w.webp b/public/images/projects/business-intelligence-ai/cover-200w.webp new file mode 100644 index 0000000..2b87d6c Binary files /dev/null and b/public/images/projects/business-intelligence-ai/cover-200w.webp differ diff --git a/public/images/projects/business-intelligence-ai/cover-300w.jpg b/public/images/projects/business-intelligence-ai/cover-300w.jpg new file mode 100644 index 0000000..0a08e35 Binary files /dev/null and b/public/images/projects/business-intelligence-ai/cover-300w.jpg differ diff --git a/public/images/projects/business-intelligence-ai/cover-300w.webp b/public/images/projects/business-intelligence-ai/cover-300w.webp new file mode 100644 index 0000000..4eb1156 Binary files /dev/null and b/public/images/projects/business-intelligence-ai/cover-300w.webp differ diff --git a/public/images/projects/business-intelligence-ai/cover-400w.webp b/public/images/projects/business-intelligence-ai/cover-400w.webp new file mode 100644 index 0000000..d9a7561 Binary files /dev/null and b/public/images/projects/business-intelligence-ai/cover-400w.webp differ diff --git a/public/images/projects/business-intelligence-ai/cover-600w.jpg b/public/images/projects/business-intelligence-ai/cover-600w.jpg new file mode 100644 index 0000000..fc1a18a Binary files /dev/null and b/public/images/projects/business-intelligence-ai/cover-600w.jpg differ diff --git a/public/images/projects/business-intelligence-ai/cover-600w.webp b/public/images/projects/business-intelligence-ai/cover-600w.webp new file mode 100644 index 0000000..ea8f93b Binary files /dev/null and b/public/images/projects/business-intelligence-ai/cover-600w.webp differ diff --git a/public/images/projects/business-intelligence-ai/cover-800w.webp b/public/images/projects/business-intelligence-ai/cover-800w.webp new file mode 100644 index 0000000..9782185 Binary files /dev/null and b/public/images/projects/business-intelligence-ai/cover-800w.webp differ diff --git a/public/images/projects/claude-personal-assistant/cover-1200w.webp b/public/images/projects/claude-personal-assistant/cover-1200w.webp new file mode 100644 index 0000000..f51de94 Binary files /dev/null and b/public/images/projects/claude-personal-assistant/cover-1200w.webp differ diff --git a/public/images/projects/claude-personal-assistant/cover-200w.jpg b/public/images/projects/claude-personal-assistant/cover-200w.jpg new file mode 100644 index 0000000..2a15ea8 Binary files /dev/null and b/public/images/projects/claude-personal-assistant/cover-200w.jpg differ diff --git a/public/images/projects/claude-personal-assistant/cover-200w.webp b/public/images/projects/claude-personal-assistant/cover-200w.webp new file mode 100644 index 0000000..758444e Binary files /dev/null and b/public/images/projects/claude-personal-assistant/cover-200w.webp differ diff --git a/public/images/projects/claude-personal-assistant/cover-300w.jpg b/public/images/projects/claude-personal-assistant/cover-300w.jpg new file mode 100644 index 0000000..083ffa7 Binary files /dev/null and b/public/images/projects/claude-personal-assistant/cover-300w.jpg differ diff --git a/public/images/projects/claude-personal-assistant/cover-300w.webp b/public/images/projects/claude-personal-assistant/cover-300w.webp new file mode 100644 index 0000000..61862a9 Binary files /dev/null and b/public/images/projects/claude-personal-assistant/cover-300w.webp differ diff --git a/public/images/projects/claude-personal-assistant/cover-400w.webp b/public/images/projects/claude-personal-assistant/cover-400w.webp new file mode 100644 index 0000000..80d360f Binary files /dev/null and b/public/images/projects/claude-personal-assistant/cover-400w.webp differ diff --git a/public/images/projects/claude-personal-assistant/cover-600w.jpg b/public/images/projects/claude-personal-assistant/cover-600w.jpg new file mode 100644 index 0000000..c185ce0 Binary files /dev/null and b/public/images/projects/claude-personal-assistant/cover-600w.jpg differ diff --git a/public/images/projects/claude-personal-assistant/cover-600w.webp b/public/images/projects/claude-personal-assistant/cover-600w.webp new file mode 100644 index 0000000..faf7209 Binary files /dev/null and b/public/images/projects/claude-personal-assistant/cover-600w.webp differ diff --git a/public/images/projects/claude-personal-assistant/cover-800w.webp b/public/images/projects/claude-personal-assistant/cover-800w.webp new file mode 100644 index 0000000..9b71cc1 Binary files /dev/null and b/public/images/projects/claude-personal-assistant/cover-800w.webp differ diff --git a/public/images/projects/cursor-ide/cover-1200w.webp b/public/images/projects/cursor-ide/cover-1200w.webp new file mode 100644 index 0000000..5e4196d Binary files /dev/null and b/public/images/projects/cursor-ide/cover-1200w.webp differ diff --git a/public/images/projects/cursor-ide/cover-200w.jpg b/public/images/projects/cursor-ide/cover-200w.jpg new file mode 100644 index 0000000..b4b5e1f Binary files /dev/null and b/public/images/projects/cursor-ide/cover-200w.jpg differ diff --git a/public/images/projects/cursor-ide/cover-200w.webp b/public/images/projects/cursor-ide/cover-200w.webp new file mode 100644 index 0000000..2478435 Binary files /dev/null and b/public/images/projects/cursor-ide/cover-200w.webp differ diff --git a/public/images/projects/cursor-ide/cover-300w.jpg b/public/images/projects/cursor-ide/cover-300w.jpg new file mode 100644 index 0000000..d12fff9 Binary files /dev/null and b/public/images/projects/cursor-ide/cover-300w.jpg differ diff --git a/public/images/projects/cursor-ide/cover-300w.webp b/public/images/projects/cursor-ide/cover-300w.webp new file mode 100644 index 0000000..fec3968 Binary files /dev/null and b/public/images/projects/cursor-ide/cover-300w.webp differ diff --git a/public/images/projects/cursor-ide/cover-400w.webp b/public/images/projects/cursor-ide/cover-400w.webp new file mode 100644 index 0000000..10d1ed3 Binary files /dev/null and b/public/images/projects/cursor-ide/cover-400w.webp differ diff --git a/public/images/projects/cursor-ide/cover-600w.jpg b/public/images/projects/cursor-ide/cover-600w.jpg new file mode 100644 index 0000000..d10092f Binary files /dev/null and b/public/images/projects/cursor-ide/cover-600w.jpg differ diff --git a/public/images/projects/cursor-ide/cover-600w.webp b/public/images/projects/cursor-ide/cover-600w.webp new file mode 100644 index 0000000..54194f6 Binary files /dev/null and b/public/images/projects/cursor-ide/cover-600w.webp differ diff --git a/public/images/projects/cursor-ide/cover-800w.webp b/public/images/projects/cursor-ide/cover-800w.webp new file mode 100644 index 0000000..b6fe2eb Binary files /dev/null and b/public/images/projects/cursor-ide/cover-800w.webp differ diff --git a/public/images/projects/e-commerce-integration/cover-1200w.webp b/public/images/projects/e-commerce-integration/cover-1200w.webp new file mode 100644 index 0000000..e471cc5 Binary files /dev/null and b/public/images/projects/e-commerce-integration/cover-1200w.webp differ diff --git a/public/images/projects/e-commerce-integration/cover-200w.jpg b/public/images/projects/e-commerce-integration/cover-200w.jpg new file mode 100644 index 0000000..431eba9 Binary files /dev/null and b/public/images/projects/e-commerce-integration/cover-200w.jpg differ diff --git a/public/images/projects/e-commerce-integration/cover-200w.webp b/public/images/projects/e-commerce-integration/cover-200w.webp new file mode 100644 index 0000000..b6b6850 Binary files /dev/null and b/public/images/projects/e-commerce-integration/cover-200w.webp differ diff --git a/public/images/projects/e-commerce-integration/cover-300w.jpg b/public/images/projects/e-commerce-integration/cover-300w.jpg new file mode 100644 index 0000000..048d805 Binary files /dev/null and b/public/images/projects/e-commerce-integration/cover-300w.jpg differ diff --git a/public/images/projects/e-commerce-integration/cover-300w.webp b/public/images/projects/e-commerce-integration/cover-300w.webp new file mode 100644 index 0000000..1d0f9ab Binary files /dev/null and b/public/images/projects/e-commerce-integration/cover-300w.webp differ diff --git a/public/images/projects/e-commerce-integration/cover-400w.webp b/public/images/projects/e-commerce-integration/cover-400w.webp new file mode 100644 index 0000000..443397f Binary files /dev/null and b/public/images/projects/e-commerce-integration/cover-400w.webp differ diff --git a/public/images/projects/e-commerce-integration/cover-600w.jpg b/public/images/projects/e-commerce-integration/cover-600w.jpg new file mode 100644 index 0000000..31ffdfb Binary files /dev/null and b/public/images/projects/e-commerce-integration/cover-600w.jpg differ diff --git a/public/images/projects/e-commerce-integration/cover-600w.webp b/public/images/projects/e-commerce-integration/cover-600w.webp new file mode 100644 index 0000000..1c98c9c Binary files /dev/null and b/public/images/projects/e-commerce-integration/cover-600w.webp differ diff --git a/public/images/projects/e-commerce-integration/cover-800w.webp b/public/images/projects/e-commerce-integration/cover-800w.webp new file mode 100644 index 0000000..9b43145 Binary files /dev/null and b/public/images/projects/e-commerce-integration/cover-800w.webp differ diff --git a/public/images/projects/kamenpro/cover-1200w.webp b/public/images/projects/kamenpro/cover-1200w.webp new file mode 100644 index 0000000..44fd896 Binary files /dev/null and b/public/images/projects/kamenpro/cover-1200w.webp differ diff --git a/public/images/projects/kamenpro/cover-200w.jpg b/public/images/projects/kamenpro/cover-200w.jpg new file mode 100644 index 0000000..ca7cf01 Binary files /dev/null and b/public/images/projects/kamenpro/cover-200w.jpg differ diff --git a/public/images/projects/kamenpro/cover-200w.webp b/public/images/projects/kamenpro/cover-200w.webp new file mode 100644 index 0000000..02c3340 Binary files /dev/null and b/public/images/projects/kamenpro/cover-200w.webp differ diff --git a/public/images/projects/kamenpro/cover-300w.jpg b/public/images/projects/kamenpro/cover-300w.jpg new file mode 100644 index 0000000..8b56290 Binary files /dev/null and b/public/images/projects/kamenpro/cover-300w.jpg differ diff --git a/public/images/projects/kamenpro/cover-300w.webp b/public/images/projects/kamenpro/cover-300w.webp new file mode 100644 index 0000000..692695c Binary files /dev/null and b/public/images/projects/kamenpro/cover-300w.webp differ diff --git a/public/images/projects/kamenpro/cover-400w.webp b/public/images/projects/kamenpro/cover-400w.webp new file mode 100644 index 0000000..f22cdb8 Binary files /dev/null and b/public/images/projects/kamenpro/cover-400w.webp differ diff --git a/public/images/projects/kamenpro/cover-600w.jpg b/public/images/projects/kamenpro/cover-600w.jpg new file mode 100644 index 0000000..a7835b6 Binary files /dev/null and b/public/images/projects/kamenpro/cover-600w.jpg differ diff --git a/public/images/projects/kamenpro/cover-600w.webp b/public/images/projects/kamenpro/cover-600w.webp new file mode 100644 index 0000000..ca4c80d Binary files /dev/null and b/public/images/projects/kamenpro/cover-600w.webp differ diff --git a/public/images/projects/kamenpro/cover-800w.webp b/public/images/projects/kamenpro/cover-800w.webp new file mode 100644 index 0000000..87d29e3 Binary files /dev/null and b/public/images/projects/kamenpro/cover-800w.webp differ diff --git a/public/images/projects/local-llm-training/cover-1200w.webp b/public/images/projects/local-llm-training/cover-1200w.webp new file mode 100644 index 0000000..17e4e74 Binary files /dev/null and b/public/images/projects/local-llm-training/cover-1200w.webp differ diff --git a/public/images/projects/local-llm-training/cover-200w.jpg b/public/images/projects/local-llm-training/cover-200w.jpg new file mode 100644 index 0000000..6bf8488 Binary files /dev/null and b/public/images/projects/local-llm-training/cover-200w.jpg differ diff --git a/public/images/projects/local-llm-training/cover-200w.webp b/public/images/projects/local-llm-training/cover-200w.webp new file mode 100644 index 0000000..c1ae112 Binary files /dev/null and b/public/images/projects/local-llm-training/cover-200w.webp differ diff --git a/public/images/projects/local-llm-training/cover-300w.jpg b/public/images/projects/local-llm-training/cover-300w.jpg new file mode 100644 index 0000000..d59fd63 Binary files /dev/null and b/public/images/projects/local-llm-training/cover-300w.jpg differ diff --git a/public/images/projects/local-llm-training/cover-300w.webp b/public/images/projects/local-llm-training/cover-300w.webp new file mode 100644 index 0000000..b4c1067 Binary files /dev/null and b/public/images/projects/local-llm-training/cover-300w.webp differ diff --git a/public/images/projects/local-llm-training/cover-400w.webp b/public/images/projects/local-llm-training/cover-400w.webp new file mode 100644 index 0000000..150cc4a Binary files /dev/null and b/public/images/projects/local-llm-training/cover-400w.webp differ diff --git a/public/images/projects/local-llm-training/cover-600w.jpg b/public/images/projects/local-llm-training/cover-600w.jpg new file mode 100644 index 0000000..3473109 Binary files /dev/null and b/public/images/projects/local-llm-training/cover-600w.jpg differ diff --git a/public/images/projects/local-llm-training/cover-600w.webp b/public/images/projects/local-llm-training/cover-600w.webp new file mode 100644 index 0000000..5bc08e8 Binary files /dev/null and b/public/images/projects/local-llm-training/cover-600w.webp differ diff --git a/public/images/projects/local-llm-training/cover-800w.webp b/public/images/projects/local-llm-training/cover-800w.webp new file mode 100644 index 0000000..ca42a5d Binary files /dev/null and b/public/images/projects/local-llm-training/cover-800w.webp differ diff --git a/public/images/projects/power-platform-governance/cover-1200w.webp b/public/images/projects/power-platform-governance/cover-1200w.webp new file mode 100644 index 0000000..c23a7a2 Binary files /dev/null and b/public/images/projects/power-platform-governance/cover-1200w.webp differ diff --git a/public/images/projects/power-platform-governance/cover-200w.jpg b/public/images/projects/power-platform-governance/cover-200w.jpg new file mode 100644 index 0000000..7a01e95 Binary files /dev/null and b/public/images/projects/power-platform-governance/cover-200w.jpg differ diff --git a/public/images/projects/power-platform-governance/cover-200w.webp b/public/images/projects/power-platform-governance/cover-200w.webp new file mode 100644 index 0000000..e503cde Binary files /dev/null and b/public/images/projects/power-platform-governance/cover-200w.webp differ diff --git a/public/images/projects/power-platform-governance/cover-300w.jpg b/public/images/projects/power-platform-governance/cover-300w.jpg new file mode 100644 index 0000000..f680c4d Binary files /dev/null and b/public/images/projects/power-platform-governance/cover-300w.jpg differ diff --git a/public/images/projects/power-platform-governance/cover-300w.webp b/public/images/projects/power-platform-governance/cover-300w.webp new file mode 100644 index 0000000..71502c7 Binary files /dev/null and b/public/images/projects/power-platform-governance/cover-300w.webp differ diff --git a/public/images/projects/power-platform-governance/cover-400w.webp b/public/images/projects/power-platform-governance/cover-400w.webp new file mode 100644 index 0000000..003083c Binary files /dev/null and b/public/images/projects/power-platform-governance/cover-400w.webp differ diff --git a/public/images/projects/power-platform-governance/cover-600w.jpg b/public/images/projects/power-platform-governance/cover-600w.jpg new file mode 100644 index 0000000..7601353 Binary files /dev/null and b/public/images/projects/power-platform-governance/cover-600w.jpg differ diff --git a/public/images/projects/power-platform-governance/cover-600w.webp b/public/images/projects/power-platform-governance/cover-600w.webp new file mode 100644 index 0000000..b301967 Binary files /dev/null and b/public/images/projects/power-platform-governance/cover-600w.webp differ diff --git a/public/images/projects/power-platform-governance/cover-800w.webp b/public/images/projects/power-platform-governance/cover-800w.webp new file mode 100644 index 0000000..8c11d49 Binary files /dev/null and b/public/images/projects/power-platform-governance/cover-800w.webp differ diff --git a/public/images/projects/rfid-automation/cover-1200w.webp b/public/images/projects/rfid-automation/cover-1200w.webp new file mode 100644 index 0000000..7c5432b Binary files /dev/null and b/public/images/projects/rfid-automation/cover-1200w.webp differ diff --git a/public/images/projects/rfid-automation/cover-200w.jpg b/public/images/projects/rfid-automation/cover-200w.jpg new file mode 100644 index 0000000..545b6f6 Binary files /dev/null and b/public/images/projects/rfid-automation/cover-200w.jpg differ diff --git a/public/images/projects/rfid-automation/cover-200w.webp b/public/images/projects/rfid-automation/cover-200w.webp new file mode 100644 index 0000000..451585e Binary files /dev/null and b/public/images/projects/rfid-automation/cover-200w.webp differ diff --git a/public/images/projects/rfid-automation/cover-300w.jpg b/public/images/projects/rfid-automation/cover-300w.jpg new file mode 100644 index 0000000..f61c6f5 Binary files /dev/null and b/public/images/projects/rfid-automation/cover-300w.jpg differ diff --git a/public/images/projects/rfid-automation/cover-300w.webp b/public/images/projects/rfid-automation/cover-300w.webp new file mode 100644 index 0000000..a9542bd Binary files /dev/null and b/public/images/projects/rfid-automation/cover-300w.webp differ diff --git a/public/images/projects/rfid-automation/cover-400w.webp b/public/images/projects/rfid-automation/cover-400w.webp new file mode 100644 index 0000000..a8d6b6c Binary files /dev/null and b/public/images/projects/rfid-automation/cover-400w.webp differ diff --git a/public/images/projects/rfid-automation/cover-600w.jpg b/public/images/projects/rfid-automation/cover-600w.jpg new file mode 100644 index 0000000..9953281 Binary files /dev/null and b/public/images/projects/rfid-automation/cover-600w.jpg differ diff --git a/public/images/projects/rfid-automation/cover-600w.webp b/public/images/projects/rfid-automation/cover-600w.webp new file mode 100644 index 0000000..0fb2a9a Binary files /dev/null and b/public/images/projects/rfid-automation/cover-600w.webp differ diff --git a/public/images/projects/rfid-automation/cover-800w.webp b/public/images/projects/rfid-automation/cover-800w.webp new file mode 100644 index 0000000..74547b1 Binary files /dev/null and b/public/images/projects/rfid-automation/cover-800w.webp differ diff --git a/public/images/projects/smart-warehouse/cover-1200w.webp b/public/images/projects/smart-warehouse/cover-1200w.webp new file mode 100644 index 0000000..8bc8f1b Binary files /dev/null and b/public/images/projects/smart-warehouse/cover-1200w.webp differ diff --git a/public/images/projects/smart-warehouse/cover-200w.jpg b/public/images/projects/smart-warehouse/cover-200w.jpg new file mode 100644 index 0000000..376c34a Binary files /dev/null and b/public/images/projects/smart-warehouse/cover-200w.jpg differ diff --git a/public/images/projects/smart-warehouse/cover-200w.webp b/public/images/projects/smart-warehouse/cover-200w.webp new file mode 100644 index 0000000..cd3a108 Binary files /dev/null and b/public/images/projects/smart-warehouse/cover-200w.webp differ diff --git a/public/images/projects/smart-warehouse/cover-300w.jpg b/public/images/projects/smart-warehouse/cover-300w.jpg new file mode 100644 index 0000000..520ca04 Binary files /dev/null and b/public/images/projects/smart-warehouse/cover-300w.jpg differ diff --git a/public/images/projects/smart-warehouse/cover-300w.webp b/public/images/projects/smart-warehouse/cover-300w.webp new file mode 100644 index 0000000..ce35776 Binary files /dev/null and b/public/images/projects/smart-warehouse/cover-300w.webp differ diff --git a/public/images/projects/smart-warehouse/cover-400w.webp b/public/images/projects/smart-warehouse/cover-400w.webp new file mode 100644 index 0000000..7a132ac Binary files /dev/null and b/public/images/projects/smart-warehouse/cover-400w.webp differ diff --git a/public/images/projects/smart-warehouse/cover-600w.jpg b/public/images/projects/smart-warehouse/cover-600w.jpg new file mode 100644 index 0000000..dea7126 Binary files /dev/null and b/public/images/projects/smart-warehouse/cover-600w.jpg differ diff --git a/public/images/projects/smart-warehouse/cover-600w.webp b/public/images/projects/smart-warehouse/cover-600w.webp new file mode 100644 index 0000000..5d9c5ea Binary files /dev/null and b/public/images/projects/smart-warehouse/cover-600w.webp differ diff --git a/public/images/projects/smart-warehouse/cover-800w.webp b/public/images/projects/smart-warehouse/cover-800w.webp new file mode 100644 index 0000000..714dc17 Binary files /dev/null and b/public/images/projects/smart-warehouse/cover-800w.webp differ diff --git a/public/images/projects/timetracking-software/cover-1200w.webp b/public/images/projects/timetracking-software/cover-1200w.webp new file mode 100644 index 0000000..64410f2 Binary files /dev/null and b/public/images/projects/timetracking-software/cover-1200w.webp differ diff --git a/public/images/projects/timetracking-software/cover-200w.jpg b/public/images/projects/timetracking-software/cover-200w.jpg new file mode 100644 index 0000000..eb6f9ee Binary files /dev/null and b/public/images/projects/timetracking-software/cover-200w.jpg differ diff --git a/public/images/projects/timetracking-software/cover-200w.webp b/public/images/projects/timetracking-software/cover-200w.webp new file mode 100644 index 0000000..4360db5 Binary files /dev/null and b/public/images/projects/timetracking-software/cover-200w.webp differ diff --git a/public/images/projects/timetracking-software/cover-300w.jpg b/public/images/projects/timetracking-software/cover-300w.jpg new file mode 100644 index 0000000..c39418b Binary files /dev/null and b/public/images/projects/timetracking-software/cover-300w.jpg differ diff --git a/public/images/projects/timetracking-software/cover-300w.webp b/public/images/projects/timetracking-software/cover-300w.webp new file mode 100644 index 0000000..3ff8d44 Binary files /dev/null and b/public/images/projects/timetracking-software/cover-300w.webp differ diff --git a/public/images/projects/timetracking-software/cover-400w.webp b/public/images/projects/timetracking-software/cover-400w.webp new file mode 100644 index 0000000..7b3107c Binary files /dev/null and b/public/images/projects/timetracking-software/cover-400w.webp differ diff --git a/public/images/projects/timetracking-software/cover-600w.jpg b/public/images/projects/timetracking-software/cover-600w.jpg new file mode 100644 index 0000000..feb77fe Binary files /dev/null and b/public/images/projects/timetracking-software/cover-600w.jpg differ diff --git a/public/images/projects/timetracking-software/cover-600w.webp b/public/images/projects/timetracking-software/cover-600w.webp new file mode 100644 index 0000000..ac469dd Binary files /dev/null and b/public/images/projects/timetracking-software/cover-600w.webp differ diff --git a/public/images/projects/timetracking-software/cover-800w.webp b/public/images/projects/timetracking-software/cover-800w.webp new file mode 100644 index 0000000..a645535 Binary files /dev/null and b/public/images/projects/timetracking-software/cover-800w.webp differ diff --git a/public/images/projects/website-mit-ki/cover-1200w.webp b/public/images/projects/website-mit-ki/cover-1200w.webp new file mode 100644 index 0000000..d3ab225 Binary files /dev/null and b/public/images/projects/website-mit-ki/cover-1200w.webp differ diff --git a/public/images/projects/website-mit-ki/cover-200w.jpg b/public/images/projects/website-mit-ki/cover-200w.jpg new file mode 100644 index 0000000..b9ca479 Binary files /dev/null and b/public/images/projects/website-mit-ki/cover-200w.jpg differ diff --git a/public/images/projects/website-mit-ki/cover-200w.webp b/public/images/projects/website-mit-ki/cover-200w.webp new file mode 100644 index 0000000..7a44a5d Binary files /dev/null and b/public/images/projects/website-mit-ki/cover-200w.webp differ diff --git a/public/images/projects/website-mit-ki/cover-300w.jpg b/public/images/projects/website-mit-ki/cover-300w.jpg new file mode 100644 index 0000000..c89c6f9 Binary files /dev/null and b/public/images/projects/website-mit-ki/cover-300w.jpg differ diff --git a/public/images/projects/website-mit-ki/cover-300w.webp b/public/images/projects/website-mit-ki/cover-300w.webp new file mode 100644 index 0000000..ffaa470 Binary files /dev/null and b/public/images/projects/website-mit-ki/cover-300w.webp differ diff --git a/public/images/projects/website-mit-ki/cover-400w.webp b/public/images/projects/website-mit-ki/cover-400w.webp new file mode 100644 index 0000000..6bf2119 Binary files /dev/null and b/public/images/projects/website-mit-ki/cover-400w.webp differ diff --git a/public/images/projects/website-mit-ki/cover-600w.jpg b/public/images/projects/website-mit-ki/cover-600w.jpg new file mode 100644 index 0000000..3491abb Binary files /dev/null and b/public/images/projects/website-mit-ki/cover-600w.jpg differ diff --git a/public/images/projects/website-mit-ki/cover-600w.webp b/public/images/projects/website-mit-ki/cover-600w.webp new file mode 100644 index 0000000..fd418e1 Binary files /dev/null and b/public/images/projects/website-mit-ki/cover-600w.webp differ diff --git a/public/images/projects/website-mit-ki/cover-800w.webp b/public/images/projects/website-mit-ki/cover-800w.webp new file mode 100644 index 0000000..9adc7d2 Binary files /dev/null and b/public/images/projects/website-mit-ki/cover-800w.webp differ diff --git a/public/portrait-300.jpg b/public/portrait-300.jpg new file mode 100644 index 0000000..fdbe292 Binary files /dev/null and b/public/portrait-300.jpg differ diff --git a/public/portrait-300.webp b/public/portrait-300.webp new file mode 100644 index 0000000..605b2cf Binary files /dev/null and b/public/portrait-300.webp differ diff --git a/public/portrait-600.jpg b/public/portrait-600.jpg new file mode 100644 index 0000000..0c5d0ac Binary files /dev/null and b/public/portrait-600.jpg differ diff --git a/public/portrait-600.webp b/public/portrait-600.webp new file mode 100644 index 0000000..41b1cbc Binary files /dev/null and b/public/portrait-600.webp differ diff --git a/public/portrait-optimized.jpg b/public/portrait-optimized.jpg new file mode 100644 index 0000000..0c5d0ac Binary files /dev/null and b/public/portrait-optimized.jpg differ diff --git a/scripts/optimize-images.js b/scripts/optimize-images.js index 4195945..e002765 100644 --- a/scripts/optimize-images.js +++ b/scripts/optimize-images.js @@ -7,7 +7,8 @@ import { existsSync } from 'fs'; const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); -const SIZES = [400, 800, 1200]; +// Mehr Größen für bessere Mobile-Unterstützung +const SIZES = [200, 300, 400, 600, 800, 1200]; const INPUT_DIR = join(__dirname, '../source-images/projects'); const OUTPUT_DIR = join(__dirname, '../public/images/projects'); @@ -15,19 +16,16 @@ 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) + // Optimierte Originalversion (cover.jpg) const originalOutputPath = join(outputDir, `${filename}.jpg`); try { await sharp(inputPath) @@ -38,7 +36,7 @@ async function processImage(inputPath, projectSlug) { console.error(` Error creating optimized original:`, error.message); } - // Create different sizes + // JPG-Versionen in verschiedenen Größen for (const width of SIZES) { const outputFilename = `${filename}-${width}w.jpg`; const outputPath = join(outputDir, outputFilename); @@ -58,18 +56,35 @@ async function processImage(inputPath, projectSlug) { } } - // Create WebP version of original size - const webpFilename = `${filename}.webp`; - const webpPath = join(outputDir, webpFilename); + // WebP-Versionen in verschiedenen Größen + for (const width of SIZES) { + const webpFilename = `${filename}-${width}w.webp`; + const webpPath = join(outputDir, webpFilename); + try { + await sharp(inputPath) + .resize(width, null, { + withoutEnlargement: true, + fit: 'inside' + }) + .webp({ quality: 75 }) + .toFile(webpPath); + + console.log(` Created: ${webpFilename}`); + } catch (error) { + console.error(` Error creating ${webpFilename}:`, error.message); + } + } + + // Volle WebP-Version + const webpFullPath = join(outputDir, `${filename}.webp`); try { await sharp(inputPath) .webp({ quality: 80 }) - .toFile(webpPath); - - console.log(` Created: ${webpFilename}`); + .toFile(webpFullPath); + console.log(` Created: ${filename}.webp`); } catch (error) { - console.error(` Error creating WebP:`, error.message); + console.error(` Error creating full WebP:`, error.message); } } @@ -87,7 +102,6 @@ async function processDirectory(dirPath) { 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); @@ -101,7 +115,8 @@ async function processDirectory(dirPath) { async function main() { console.log('Starting image optimization...'); console.log(`Source: ${INPUT_DIR}`); - console.log(`Output: ${OUTPUT_DIR}\n`); + console.log(`Output: ${OUTPUT_DIR}`); + console.log(`Sizes: ${SIZES.join(', ')}px\n`); try { await processDirectory(INPUT_DIR); diff --git a/src/components/Layout.tsx b/src/components/Layout.tsx index f7067b9..546ce6f 100644 --- a/src/components/Layout.tsx +++ b/src/components/Layout.tsx @@ -12,7 +12,7 @@ import { Phone, LayoutDashboard, } from "lucide-react"; -import { supabase } from "../utils/supabaseClient"; +// Supabase wird lazy geladen um Initial Bundle zu reduzieren import { ContactInfo } from "./ContactInfo"; import { NavLink } from "./NavLink"; import LanguageSwitcher from "./LanguageSwitcher"; @@ -52,9 +52,21 @@ const Layout = ({ children }: LayoutProps) => { setIsMenuOpen(!isMenuOpen); }; - // Prüfe Admin-Status und registriere den Scroll-Handler + // Scroll-Handler + useEffect(() => { + const handleScroll = () => { + setScrolled(window.scrollY > 0); + }; + window.addEventListener("scroll", handleScroll); + return () => window.removeEventListener("scroll", handleScroll); + }, []); + + // Prüfe Admin-Status verzögert und lazy (nach Initial Render) useEffect(() => { const checkAdmin = async () => { + // Dynamischer Import von Supabase - wird erst geladen wenn benötigt + const { supabase } = await import("../utils/supabaseClient"); + const { data, error } = await supabase.auth.getSession(); if (error) { console.error("Error checking admin status:", error); @@ -74,13 +86,13 @@ const Layout = ({ children }: LayoutProps) => { setIsAdmin(adminData.isAdmin); } }; - checkAdmin(); - const handleScroll = () => { - setScrolled(window.scrollY > 0); - }; - window.addEventListener("scroll", handleScroll); - return () => window.removeEventListener("scroll", handleScroll); + // Verzögere Admin-Check bis nach dem Initial Paint + if ('requestIdleCallback' in window) { + requestIdleCallback(() => checkAdmin()); + } else { + setTimeout(checkAdmin, 2000); + } }, []); const navigationLinks = [ diff --git a/src/pages/home/components/Hero.tsx b/src/pages/home/components/Hero.tsx index 28c92c1..275112d 100644 --- a/src/pages/home/components/Hero.tsx +++ b/src/pages/home/components/Hero.tsx @@ -63,25 +63,34 @@ const Hero = () => { {/* Main Content */}
- {/* Profile Image */} - - {t('pages.home.hero.image.alt')} - + + + + {t('pages.home.hero.image.alt')} + +
{/* Title and Name */} = ({ project }) => { visible: { opacity: 1, y: 0 } }; - 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`; + const basePath = `/images/projects/${project.slug}`; + const imagePath = `${basePath}/cover.jpg`; + const srcSetJpg = `${basePath}/cover-200w.jpg 200w, ${basePath}/cover-300w.jpg 300w, ${basePath}/cover-400w.jpg 400w, ${basePath}/cover-600w.jpg 600w, ${basePath}/cover-800w.jpg 800w, ${basePath}/cover-1200w.jpg 1200w`; + const srcSetWebP = `${basePath}/cover-200w.webp 200w, ${basePath}/cover-300w.webp 300w, ${basePath}/cover-400w.webp 400w, ${basePath}/cover-600w.webp 600w, ${basePath}/cover-800w.webp 800w, ${basePath}/cover-1200w.webp 1200w`; + // Mobile: ~350px, Tablet: ~400px, Desktop 2-col: ~550px, Desktop 3-col: ~400px + const imageSizes = "(max-width: 640px) 350px, (max-width: 768px) 400px, (max-width: 1024px) 550px, 400px"; // Verwende technologies anstelle von tags wenn verfügbar const displayTags = project.technologies || project.tags; @@ -63,17 +66,24 @@ const PortfolioCard: React.FC = ({ project }) => { {/* Image Container */}
- + + {project.title}