Compare commits

..
Author SHA1 Message Date
damjan_savicandClaude Sonnet 4.5 c170f75219 auto-claude: subtask-1-4 - Document request.ts configuration and next-intl setup
- Added comprehensive Configuration & Setup section
- Documented getRequestConfig() function with full implementation
- Explained locale validation logic with examples and security benefits
- Detailed dynamic message loading mechanism and performance comparison
- Documented createNextIntlPlugin() integration in next.config.ts
- Explained plugin composition pattern with MDX
- Added server-side vs client-side translation comparison
- Included best practices for component splitting and performance optimization
- Provided code examples for all patterns and troubleshooting guides

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-25 06:39:53 +01:00
damjan_savicandClaude Sonnet 4.5 2abfcbe217 auto-claude: subtask-1-3 - Document how to add new translation keys
Added comprehensive documentation for adding translation keys:
- Step-by-step guide with namespace identification
- Detailed JSON structure explanation with real examples
- Namespace organization patterns (meta, common, navigation, pages, etc.)
- Code examples using useTranslations() hook
- Advanced usage: dynamic keys, string interpolation, rich content
- Best practices for key naming and structure consistency
- Examples for arrays, objects, and nested translations

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-25 06:36:36 +01:00
damjan_savic 1b148fa574 auto-claude: subtask-1-2 - Document directory structure and file organization 2026-01-25 06:33:10 +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
3 changed files with 1469 additions and 58 deletions
+1 -4
View File
@@ -81,7 +81,4 @@ supabase/.temp/
.history/ .history/
# Source images (originals before optimization) # Source images (originals before optimization)
source-images/ source-images/
# Auto Claude data directory
.auto-claude/
+1459
View File
File diff suppressed because it is too large Load Diff
+9 -54
View File
@@ -11,46 +11,6 @@ interface Skill {
description: string; description: string;
} }
interface SkeletonProps {
className?: string;
}
const Skeleton: React.FC<SkeletonProps> = ({ className }) => (
<div className={`animate-pulse bg-zinc-700/50 rounded ${className}`}></div>
);
const SkillsSkeleton = () => (
<section id="skills" className="py-24 relative" aria-label="Loading skills" aria-busy="true">
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<Skeleton className="h-8 w-48 mb-12" />
<div className="grid grid-cols-1 lg:grid-cols-2 gap-8">
{/* Skills Progress Bars Skeleton */}
<div className="space-y-6">
{[1, 2, 3, 4, 5, 6, 7, 8].map((i) => (
<div key={i} className="space-y-2">
<div className="flex justify-between items-center">
<Skeleton className="h-4 w-24" />
<Skeleton className="h-4 w-12" />
</div>
<Skeleton className="h-2 w-full rounded-full" />
</div>
))}
</div>
{/* Skills Icons Grid Skeleton */}
<div className="grid grid-cols-2 sm:grid-cols-3 gap-4">
{[1, 2, 3, 4, 5, 6].map((i) => (
<div key={i} className="p-6 rounded-xl bg-zinc-800/30 backdrop-blur-sm">
<Skeleton className="w-8 h-8 mx-auto mb-3" />
<Skeleton className="h-4 w-16 mx-auto" />
</div>
))}
</div>
</div>
</div>
</section>
);
const iconMap: Record<string, React.ReactNode> = { const iconMap: Record<string, React.ReactNode> = {
'AI & LLMs': <Bot className="w-8 h-8" />, 'AI & LLMs': <Bot className="w-8 h-8" />,
'Automation': <Workflow className="w-8 h-8" />, 'Automation': <Workflow className="w-8 h-8" />,
@@ -69,24 +29,19 @@ const Skills = () => {
const [skills, setSkills] = useState<Skill[]>([]); const [skills, setSkills] = useState<Skill[]>([]);
useEffect(() => { useEffect(() => {
// Temporary delay to see skeleton loading state try {
const timer = setTimeout(() => { const translatedSkills = t.raw('skills') as Skill[];
try { if (Array.isArray(translatedSkills)) {
const translatedSkills = t.raw('skills') as Skill[]; setSkills(translatedSkills);
if (Array.isArray(translatedSkills)) {
setSkills(translatedSkills);
}
} catch (error) {
console.error('Error loading skills:', error);
setSkills([]);
} }
}, 2000); } catch (error) {
console.error('Error loading skills:', error);
return () => clearTimeout(timer); setSkills([]);
}
}, [t]); }, [t]);
if (skills.length === 0) { if (skills.length === 0) {
return <SkillsSkeleton />; return <div className="py-24 text-center text-zinc-400">Loading skills...</div>;
} }
return ( return (