Commit Graph
238 Commits
Author SHA1 Message Date
damjan_savic 43593c7654 auto-claude: subtask-2-1 - Add visibility detection to GlobalBackground component 2026-01-25 06:29:03 +01:00
damjan_savic 3047c8f7f2 auto-claude: subtask-1-1 - Create schemas directory and extract PersonJsonLd 2026-01-25 06:29:02 +01:00
damjan_savicandClaude Sonnet 4.5 f0490db544 auto-claude: subtask-1-1 - Install testing dependencies (@testing-library/react, @testing-library/jest-dom, jsdom)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-25 06:28:59 +01:00
damjan_savic 2eb3b5d421 auto-claude: subtask-1-1 - Create .env.example file with documented environme 2026-01-25 06:28:56 +01:00
damjan_savic 85398a58e0 auto-claude: subtask-2-1 - Remove base64 SVG placeholder constant 2026-01-25 06:28:28 +01:00
damjan_savic 3b4a10c90e auto-claude: subtask-2-1 - Delete src/components-vite directory (299KB, 50 fi 2026-01-25 06:28:08 +01:00
damjan_savicandClaude Sonnet 4.5 26955a7b64 auto-claude: subtask-1-2 - Verify current build succeeds before deletion
Verified that Next.js build completes successfully before proceeding with
deletion of components-vite and pages-vite directories. Build exited with
code 0 (success).

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-25 06:27:10 +01:00
damjan_savicandClaude Sonnet 4.5 75ffb59084 auto-claude: subtask-1-2 - Run optimization on existing blog post images
Generated responsive image variants for all 4 existing blog posts:
- automated-ad-creatives
- erp-integration-breuninger
- fullstack-development-timetracking
- rfid-automation

Each post now has optimized cover images in multiple sizes:
- JPG variants: 200w, 300w, 400w, 600w, 800w, 1200w
- WebP variants: 200w, 300w, 400w, 600w, 800w, 1200w
- Optimized originals: cover.jpg, cover.webp

This matches the optimization pipeline used for project images and
enables responsive image loading with WebP support.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-25 06:26:45 +01:00
damjan_savic 2b096416a0 auto-claude: subtask-1-3 - Create useIntersectionObserver hook for element vi 2026-01-25 06:26:31 +01:00
damjan_savic 77ceae5b9f auto-claude: subtask-1-2 - Create usePageVisibility hook for tab visibility detection 2026-01-25 06:25:05 +01:00
damjan_savic 7044e16911 auto-claude: subtask-1-1 - Add blog post image processing to optimize-images.js
Extended the image optimization script to process both project and blog post images:
- Added constants for posts input/output directories
- Refactored processImage to accept output directory parameter
- Updated processDirectory to handle multiple content types
- Main function now processes both projects and posts directories
- Gracefully handles missing directories with informative messages
2026-01-25 06:24:07 +01:00
damjan_savic c934eeaad8 auto-claude: subtask-1-1 - Create throttle utility function 2026-01-25 06:23:46 +01:00
damjan_savicandClaude Sonnet 4.5 009eb1d99f auto-claude: subtask-1-1 - Verify no imports from components-vite or pages-vite
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-25 06:23:08 +01:00
damjan_savicandClaude Sonnet 4.5 ffa56a7b50 auto-claude: subtask-2-2 - Manual browser verification
Created comprehensive test page at src/app/test-localstorage/page.tsx to verify useLocalStorage hook functionality in the browser.

Test Coverage:
- String values (basic get/set)
- Complex objects (nested properties)
- Arrays (add/remove items)
- Numbers (increment/decrement)
- Remove functionality
- State persistence across page refreshes
- Real-time localStorage updates visible in DevTools

Verification Guide:
A detailed manual verification guide has been created at .auto-claude/specs/004-add-uselocalstorage-custom-hook/MANUAL_VERIFICATION.md with step-by-step instructions for browser testing.

Manual Verification Checklist:
- [ ] No hydration errors in console
- [ ] localStorage updates visible in DevTools
- [ ] State persists across page refresh
- [ ] No TypeScript errors (verified with npx tsc --noEmit)

TypeScript compilation verified with no errors.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-25 04:07:29 +01:00
damjan_savic 34555de0e5 auto-claude: subtask-2-1 - Create basic unit tests for useLocalStorage 2026-01-25 04:01:47 +01:00
damjan_savic 2f8c79612d auto-claude: subtask-1-2 - Add JSDoc documentation to hook 2026-01-25 02:38:22 +01:00
damjan_savicandClaude Sonnet 4.5 7fa92a04b4 auto-claude: subtask-1-3 - Display reading time on blog post detail page
- Import Clock icon from lucide-react
- Export calculateReadingTime function from blog.ts
- Calculate reading time for post content
- Display reading time in post header with Clock icon
- Format matches listing page: "X min read"

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-25 02:38:16 +01:00
damjan_savic 29ad019884 auto-claude: subtask-1-1 - Create useLocalStorage hook with TypeScript 2026-01-25 02:36:05 +01:00
damjan_savicandClaude Sonnet 4.5 e749dce0a6 auto-claude: subtask-1-2 - Display reading time on blog listing page (BlogPostCard)
Added Clock icon import and reading time display to BlogPostCard component.
The reading time now appears between the date and tags with the format "X min read".

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-25 02:35:47 +01:00
damjan_savic 7bf3aa20ce auto-claude: subtask-1-1 - Add readingTime field to BlogPost interface and im 2026-01-25 02:32:33 +01:00
damjan_savic cba6c66ccc chore: add auto-claude entries to .gitignore 2026-01-22 15:27:30 +01:00
damjan_savicandClaude Opus 4.5 eec1758827 Change port mapping to 3003
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-19 23:53:09 +01:00
damjan_savicandClaude Opus 4.5 14b263eb78 Change port mapping to 3002
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-19 23:52:13 +01:00
damjan_savicandClaude Opus 4.5 69f88a08d4 Fix: Replace ES2018 regex flag with compatible pattern
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-19 23:49:46 +01:00
damjan_savicandClaude Opus 4.5 f98476c3fd Fix: Handle undefined content in blog post rendering
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-19 23:48:44 +01:00
damjan_savicandClaude Opus 4.5 a7ee78d194 Fix: Make content optional in BlogPost type
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-19 23:47:42 +01:00
damjan_savicandClaude Opus 4.5 f16b1bcbfd Fix: Add optional chaining for post.tags
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-19 23:46:16 +01:00
damjan_savicandClaude Opus 4.5 d6a67fc70f Fix: Update Docker config to use pnpm instead of npm
- Switched from npm ci to pnpm install --frozen-lockfile
- Added corepack enable for pnpm support
- Added .dockerignore for cleaner builds

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-19 23:44:21 +01:00
damjan_savicandClaude Opus 4.5 87c7ebc5e3 feat: Add professional portfolio images and Hero redesign
- Add 15 optimized WebP images for portfolio (21-53KB each)
- Redesign Hero section with full-width background image
- Add SSR support for Hero component
- Update About section with new portrait image
- Update Contact page with professional headshot
- Add images to Services/Leistungen page
- Add image optimization script (sharp)
- Update translations for gallery section

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-19 23:33:28 +01:00
damjan_savicandClaude Opus 4.5 b1ec7b4d61 Migrate from Vite to Next.js 15 with SSR
- Replace Vite + React Router with Next.js 15 App Router
- Implement i18n with next-intl (URL-based: /de, /en, /sr)
- Add SSR/SSG for all pages (48 static pages generated)
- Setup Supabase SSR client for auth
- Migrate all pages: Home, About, Portfolio, Blog, Contact, Login, Dashboard, Imprint, Privacy, Terms
- Add Docker support with standalone output
- Replace i18next with next-intl JSON translations
- Use next/image for optimized images

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-17 01:00:33 +01:00
damjan_savicandClaude Opus 4.5 a66f51b9a2 Fix: Hero Icons wie im Footer (lucide-react, nicht sticky)
- Linkedin und Github Icons aus lucide-react importiert
- fixed zu absolute geändert (nicht mehr sticky)
- Styling wie im Footer (text-zinc-400, hover-Effekte)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-05 23:50:10 +01:00
damjan_savicandClaude Opus 4.5 833dea46ae Fix: Hero Social Icons durch Text ersetzt (SVG Rendering-Problem)
- LinkedIn Icon durch "in" Text ersetzt
- GitHub Icon durch "</>" Text ersetzt
- Beide Icons haben bg-white/10 Hintergrund und hover-Effekte

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-05 23:48:53 +01:00
damjan_savicandClaude Opus 4.5 f6997ce629 Fix: Hero Social Links komplett neu implementiert
- SVGs direkt inline statt separate Komponenten
- Buttons mit bg-white/10 Hintergrund für Sichtbarkeit
- Fixed position statt absolute
- Runde Buttons mit Hover-Effekt

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-05 23:46:47 +01:00
damjan_savicandClaude Opus 4.5 bc68ea5c0c Fix: SVG Icons mit fill statt stroke
- Gefüllte SVG Icons (fill="#ffffff")
- Standard LinkedIn/GitHub/Mail Icon Pfade
- Sollte jetzt definitiv sichtbar sein

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-05 23:45:02 +01:00
damjan_savicandClaude Opus 4.5 195bc98791 Fix: SVG Icons mit expliziter weißer Stroke-Farbe
- stroke="currentColor" durch stroke="#ffffff" ersetzt
- Icons sind jetzt garantiert sichtbar

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-05 23:41:26 +01:00
damjan_savicandClaude Opus 4.5 cf74df445b Fix: Social Links unterhalb der Navigation positioniert
- Von top-4 auf top-20 verschoben (unter 64px Navigation)
- z-index auf 50 erhöht für Sichtbarkeit
- LinkedIn und GitHub Icons jetzt sichtbar

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-05 23:38:25 +01:00
damjan_savicandClaude Opus 4.5 bd5570aa87 Fix: Cookie-Banner Buttons stapeln sich auf Mobile
- Buttons werden vertikal gestapelt auf kleinen Bildschirmen
- Ab sm-Breakpoint (640px) nebeneinander
- Volle Breite auf Mobile für bessere Bedienbarkeit

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-05 23:35:47 +01:00
damjan_savicandClaude Opus 4.5 fc4d4f3cc3 Fix: GitHub/LinkedIn Icons im Hero-Bereich sichtbar machen
- Inline SVG Icons statt lucide-react Import
- Icons werden sofort gerendert ohne Lazy-Loading-Verzögerung

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-05 23:30:46 +01:00
damjan_savicandClaude Opus 4.5 3f32ad6081 Performance: Preload für Haupt-Script mit fetchpriority=high
- Entry-Script wird mit hoher Priorität vorgeladen
- Schnellerer JavaScript-Download und Ausführung

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-05 23:25:03 +01:00
damjan_savicandClaude Opus 4.5 db6d969874 Performance: i18n Lazy Loading, Bundle-Größe halbiert
- i18n lädt EN/SR Übersetzungen nur bei Bedarf
- Hauptbundle von 356KB auf 179KB reduziert (~50%)
- Entfernt modulepreload für nicht-kritische Chunks
- Nur react-vendor und i18n-vendor werden vorgeladen

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-05 23:20:18 +01:00
damjan_savicandClaude Opus 4.5 ff92b58e83 Performance: CSS async laden, kritisches CSS inline erweitert
- Vite Plugin für async CSS Loading (preload/onload Trick)
- Erweiterte kritische CSS Styles inline
- Eliminiert render-blocking CSS (~150ms Einsparung)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-05 23:16:35 +01:00
damjan_savicandClaude Opus 4.5 8f500bdc6b Performance: HTML-Skeleton für sofortige LCP hinzugefügt
- Portrait-Bild wird sofort in HTML gerendert (kein JS-Warten)
- Skeleton wird ausgeblendet wenn React mounted
- Unnötige preconnects entfernt

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-05 23:09:44 +01:00
damjan_savicandClaude Opus 4.5 090d640e9a Performance: Inter-Font auf 60KB Subset reduziert (vorher 344KB)
- Font Subsetting mit fonttools für Latin + German Zeichen
- 83% Reduktion der Font-Datei
- PageSpeed API Script hinzugefügt

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-05 23:05:09 +01:00
damjan_savicandClaude Opus 4.5 61c7c523ab Performance: Framer-motion aus kritischem Pfad entfernt
- Framer-motion aus Layout, NavLink, ContactInfo, LanguageSwitcher entfernt
- PageTransition komplett vereinfacht (keine 1200ms Verzögerung mehr)
- FloatingPaths wird erst nach 2s lazy geladen
- Framer-motion und lucide-react in separate Chunks getrennt
- Icons-Chunk: 10.87KB (statt 126KB ui-vendor)
- Animations-Chunk wird erst bei Bedarf geladen

Einsparung: ~115KB beim Initial Load

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-05 22:34:52 +01:00
damjan_savicandClaude Opus 4.5 c775f3bbb2 Performance: Hero-Text sofort sichtbar für bessere LCP
- Framer-motion Animationen aus Hero-Text entfernt
- Text-Elemente sind jetzt sofort sichtbar ohne opacity: 0
- Eliminiert 3.260ms Render-Verzögerung für LCP-Element
- Kontrast verbessert: text-zinc-500 -> text-zinc-400

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-05 22:23:38 +01:00
damjan_savicandClaude Opus 4.5 df053fb7a0 Performance: Portrait-Bilder exakt für Anzeigegröße optimiert
- Portrait-Bilder in exakten Größen: 224px, 288px, 448px, 576px
- Mobile lädt jetzt ~5KB statt 30KB
- Supabase-Check auf 5s verzögert (außerhalb kritischer Pfad)
- Preload für exakte Portrait-Größen

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-05 22:14:52 +01:00
damjan_savicandClaude Opus 4.5 4b9e457f4a Performance: Mobile-Optimierungen für besseren PageSpeed
- Portrait-Bild von 1.2MB auf ~20KB optimiert (300px/600px + WebP)
- Hero-Animation entfernt für schnelleren LCP
- WebP srcset für alle Projekt-Bilder (6 Größen: 200-1200px)
- Korrekte sizes-Attribute für Mobile (350px statt 1200px)
- Supabase lazy laden via dynamischen Import
- Admin-Check verzögert mit requestIdleCallback
- Hauptbundle von 461KB auf 358KB reduziert

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-05 22:02:57 +01:00
damjan_savic 0145beeac5 Update: Sitemap regeneriert 2026-01-05 21:15:48 +01:00
damjan_savicandClaude Opus 4.5 588d6e1f17 Performance: PageSpeed Optimierungen implementiert
- LCP-Bild (Portrait) mit fetchpriority="high" und Preload optimiert
- Logo SVG mit expliziten width/height Attributen versehen (CLS)
- Touch-Targets in Experience Navigation von 5px auf 24px vergrößert
- Kontrast für Firmenname/Zeitraum verbessert (zinc-300/zinc-400)
- PWA Service Worker mit script-defer für nicht-blockierendes Laden
- Responsive Bilder: srcset mit 400w/800w/1200w + WebP-Format
- Neues Build-Script für Bildoptimierung (scripts/optimize-images.js)
- Original-Bilder in source-images/ verschoben (gitignored)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-05 21:14:29 +01:00
damjan_savicandClaude Opus 4.5 bda8e34355 Update: Alle Projektdaten auf 2025 aktualisiert
- Alle Portfolio-Projekte haben jetzt Datumsangaben aus 2025
- Betrifft DE, EN und SR Sprachversionen

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-16 19:20:23 +01:00