Commit Graph
344 Commits
Author SHA1 Message Date
damjan_savic b1e89b64c5 auto-claude: subtask-1-1 - Create server-side CSRF token generation and valid 2026-01-25 06:31:45 +01:00
damjan_savicandClaude Sonnet 4.5 a21553c885 auto-claude: subtask-4-1 - Verify TypeScript compilation succeeds
- Ran npx tsc --noEmit successfully with no errors
- TypeScript compilation verified after deletion of components-vite and pages-vite
- No type errors or compilation issues found

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-25 06:31:44 +01:00
damjan_savicandClaude Sonnet 4.5 3377744111 auto-claude: subtask-1-2 - Create vitest.config.ts with Next.js and React support
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-25 06:31:41 +01:00
damjan_savic 4e7699b585 auto-claude: subtask-1-1 - Add Content-Security-Policy header with directives 2026-01-25 06:31:20 +01:00
damjan_savicandClaude Sonnet 4.5 a46b4f61fe auto-claude: subtask-1-1 - Add character counter state and logic to ContactForm
- Added MAX_MESSAGE_LENGTH constant (1000 characters)
- Added messageLength calculation from formData.message
- Implemented character counter display below message textarea
- Added color feedback: red (over limit), yellow (80%+), gray (normal)
- Counter updates in real-time as user types

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-25 06:31:18 +01:00
damjan_savic 742fd3ea2a auto-claude: subtask-1-2 - Fix incorrect build tool references (Vite → Next.js) 2026-01-25 06:31:09 +01:00
damjan_savic 018921b6ea auto-claude: subtask-3-1 - Apply throttle to Header scroll event listener 2026-01-25 06:31:07 +01:00
damjan_savic c80f60cf4e auto-claude: subtask-2-2 - Update BlogImage component to use optimized responsive images
- Changed sizes attribute from viewport-based (vw) to pixel-based values
- Matches PortfolioCard pattern for consistent image optimization
- Enables Next.js to generate optimal image sizes for each breakpoint
- Improves performance by serving appropriately sized WebP images
2026-01-25 06:31:03 +01:00
damjan_savicandClaude Sonnet 4.5 75d4e006ff auto-claude: subtask-1-2 - Replace Math.random() with deterministic durations
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-25 06:31:01 +01:00
damjan_savic 52ef3b96da auto-claude: subtask-1-1 - Add focus state styling to NavLink component 2026-01-25 06:30:55 +01:00
damjan_savic 22e7b1e7c9 auto-claude: subtask-2-1 - Verify no broken imports or references 2026-01-25 06:30:54 +01:00
damjan_savic e8431af213 auto-claude: subtask-1-1 - Create scripts/README.md with comprehensive documentation 2026-01-25 06:30:54 +01:00
damjan_savic 4ef3b4267d auto-claude: subtask-1-1 - Create CONTRIBUTING.md with project overview and development setup 2026-01-25 06:30:54 +01:00
damjan_savic 2f2f4cdf8c auto-claude: subtask-1-2 - Extract ProfessionalServiceJsonLd component 2026-01-25 06:30:51 +01:00
damjan_savic ac36667dad auto-claude: subtask-1-1 - Add JSDoc to errorHandling.ts (AppError class, han 2026-01-25 06:30:49 +01:00
damjan_savic 87694077d9 auto-claude: subtask-1-1 - Create main i18n documentation directory and README 2026-01-25 06:30:48 +01:00
damjan_savic 4c22898d7a auto-claude: subtask-1-1 - Create rate_limits table migration in Supabase 2026-01-25 06:30:46 +01:00
damjan_savic c3d2037b09 auto-claude: subtask-3-1 - Remove components-vite and pages-vite from tsconfig.json 2026-01-25 06:30:33 +01:00
damjan_savicandClaude Sonnet 4.5 2bb0003902 auto-claude: subtask-1-1 - Create legacyBlogPosts data file with TypeScript types
- Created src/data/legacyBlogPosts.ts following pattern from cities.ts and services.ts
- Exported LegacyBlogPostsData type and legacyBlogPosts constant
- Includes all 8 legacy blog posts with translations (de, en, sr)
- Build succeeds with no type errors

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-25 06:30:23 +01:00
damjan_savic 9baffe9405 auto-claude: subtask-1-2 - Delete src/i18n/locales-old directory with all 135 2026-01-25 06:29:48 +01:00
damjan_savicandClaude Sonnet 4.5 0f5bba66a8 auto-claude: subtask-1-1 - Move iconMap outside component and memoize event h
- Import useCallback from 'react'
- Add memoized handleHoverStart and handleHoverEnd handlers
- Update event handlers to use memoized versions
- iconMap already at module level outside component

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-25 06:29:41 +01:00
damjan_savic 18f71c6730 auto-claude: subtask-1-1 - Reduce path count from 36 to 12 paths 2026-01-25 06:29:22 +01:00
damjan_savic 142e582886 auto-claude: subtask-2-2 - Delete src/pages-vite directory (454KB, 50 files) 2026-01-25 06:29:15 +01:00
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 eee79e31da auto-claude: subtask-1-1 - Remove eslintignore reference to locales-old 2026-01-25 06:28:54 +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_savic a6c00b4cd2 auto-claude: subtask-1-1 - Remove src/hooks, src/services, and src/utils from tsconfig.json exclude array 2026-01-25 06:22:58 +01:00
damjan_savicandClaude Sonnet 4.5 51e3be3a63 fix: remove auto-claude framework files from version control (qa-requested)
Removed framework metadata files that should not be version controlled:
- .auto-claude-security.json
- .auto-claude-status
- .claude_settings.json

Updated .gitignore to exclude these files pattern-wide.

Files removed from git tracking but preserved on disk.

QA Fix Session: 1

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-25 04:13:14 +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 b89031576d auto-claude: subtask-1-4 - Add URL state management using searchParams and router.push 2026-01-25 04:03:05 +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_savicandClaude Sonnet 4.5 d130972cd7 auto-claude: subtask-1-3 - Add filtering logic and integrate components into blog page
- Created BlogList client component with search and category filtering
- Integrated SearchBar and CategoryFilter components
- Implemented case-insensitive search by title/excerpt/tags
- Added category filtering with AND logic for combined filters
- Updated pagination to work with filtered results
- Added search placeholder translations for de/en/sr
- Moved blog card and pagination logic to client component

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-25 02:47:52 +01:00
damjan_savicandClaude Sonnet 4.5 cfa2bc81e6 auto-claude: subtask-1-2 - Create CategoryFilter component with category buttons/dropdown
Created CategoryFilter component with the following features:
- Client component with 'use client' directive and framer-motion animations
- Props: categories, selectedCategory, onCategoryChange, className
- Uses lucide-react Tag icon
- Responsive design: horizontal scrollable on mobile, grid layout on desktop
- Active category highlighted with bg-[#697565] text-white
- Includes 'All' option to clear filter
- Follows established patterns from SearchBar and ContactForm
- Consistent styling with bg-zinc-900/50 and border-zinc-800
- Smooth transitions and hover states

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-25 02:39:30 +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 0cc34aa007 auto-claude: subtask-1-1 - Create SearchBar component with search input and r 2026-01-25 02:37:31 +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_savicandClaude Opus 4.5 ac4b85bbc1 auto-claude: subtask-8-4 - Create optimization recommendations document
Create comprehensive OPTIMIZATION_RECOMMENDATIONS.md based on audit results:
- Priority 1: Critical optimizations (image compression, production verification)
- Priority 2: High-impact (client component audit, loading states, blur placeholders)
- Priority 3: Medium-impact (reduced motion, third-party scripts, font loading, DB indexes)
- Priority 4: Strategic (PWA, bundle analysis, edge caching, CDN optimization)
- Implementation roadmap with weekly/monthly milestones
- Success metrics and targets

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-25 02:34:17 +01:00