diff --git a/src/app/components/accessibility/ScreenReaderOptimizer.tsx b/src/app/components/accessibility/ScreenReaderOptimizer.tsx index b1dc78a8..698d3360 100644 --- a/src/app/components/accessibility/ScreenReaderOptimizer.tsx +++ b/src/app/components/accessibility/ScreenReaderOptimizer.tsx @@ -104,11 +104,19 @@ export function AccessibleDescription({ id, children }: AccessibleDescriptionPro interface AccessibleLoadingProps { message?: string; isLoading: boolean; + className?: string; + spinnerClassName?: string; + showText?: boolean; + spinner?: React.ReactNode; } export function AccessibleLoading({ message = 'Loading content', isLoading, + className = 'flex items-center justify-center p-4', + spinnerClassName = 'animate-spin rounded-full h-8 w-8 border-b-2 border-blue-600', + showText = false, + spinner, }: AccessibleLoadingProps) { const announce = useScreenReaderAnnouncement(); @@ -127,10 +135,14 @@ export function AccessibleLoading({ role="status" aria-live="polite" aria-busy="true" - className="flex items-center justify-center p-4" + className={className} > -
- {message} + {spinner ||
} + {showText ? ( + {message} + ) : ( + {message} + )}
); } diff --git a/src/app/components/dashboard/widgets/LearningStreakWidget.tsx b/src/app/components/dashboard/widgets/LearningStreakWidget.tsx index ec16e53b..9b075cde 100644 --- a/src/app/components/dashboard/widgets/LearningStreakWidget.tsx +++ b/src/app/components/dashboard/widgets/LearningStreakWidget.tsx @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from 'react'; +import { AccessibleLoading } from '../../accessibility/ScreenReaderOptimizer'; import { motion } from 'framer-motion'; import { Flame, Trophy, Target, Settings } from 'lucide-react'; @@ -177,7 +177,7 @@ export const LearningStreakWidget: React.FC = ({ {/* Content */}
- {isLoading &&
Loading…
} + {isLoading && } {error &&
{error}
} {/* Current Streak */}
diff --git a/src/app/components/dashboard/widgets/ProgressSummaryWidget.tsx b/src/app/components/dashboard/widgets/ProgressSummaryWidget.tsx index 2ad0790f..a0ea93b8 100644 --- a/src/app/components/dashboard/widgets/ProgressSummaryWidget.tsx +++ b/src/app/components/dashboard/widgets/ProgressSummaryWidget.tsx @@ -2,7 +2,7 @@ import React, { useEffect, useState } from 'react'; import { motion } from 'framer-motion'; -import { DollarSign, Users, BarChart3, BookOpen, TrendingUp, Settings } from 'lucide-react'; +import { AccessibleLoading } from '../../accessibility/ScreenReaderOptimizer'; interface ProgressSummaryWidgetProps { id: string; @@ -162,7 +162,7 @@ export const ProgressSummaryWidget: React.FC = ({ layout className="bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 p-6 hover:shadow-md transition-shadow" > - {isLoading &&
Loading…
} + {isLoading && } {error &&
{error}
}
@@ -321,7 +321,7 @@ export const ProgressSummaryWidget: React.FC = ({ {/* Content */}
- {isLoading &&
Loading…
} + {isLoading && } {error &&
{error}
}
diff --git a/src/app/components/dashboard/widgets/RecentActivityWidget.tsx b/src/app/components/dashboard/widgets/RecentActivityWidget.tsx index f2c4ba6a..2cf9d003 100644 --- a/src/app/components/dashboard/widgets/RecentActivityWidget.tsx +++ b/src/app/components/dashboard/widgets/RecentActivityWidget.tsx @@ -1,6 +1,6 @@ 'use client'; -import React, { useEffect, useState } from 'react'; +import { AccessibleLoading } from '../../accessibility/ScreenReaderOptimizer'; import { motion } from 'framer-motion'; import { Activity, Settings, Clock } from 'lucide-react'; import { format } from 'date-fns'; @@ -245,7 +245,7 @@ export const RecentActivityWidget: React.FC = ({ {/* Content */}
- {isLoading &&
Loading…
} + {isLoading && } {error &&
{error}
} {/* Subtitle */} diff --git a/src/app/components/dashboard/widgets/RecentSalesWidget.tsx b/src/app/components/dashboard/widgets/RecentSalesWidget.tsx index 786ed029..f65b1eaa 100644 --- a/src/app/components/dashboard/widgets/RecentSalesWidget.tsx +++ b/src/app/components/dashboard/widgets/RecentSalesWidget.tsx @@ -1,6 +1,7 @@ 'use client'; import React, { useEffect, useState } from 'react'; +import { AccessibleLoading } from '../../accessibility/ScreenReaderOptimizer'; import { motion } from 'framer-motion'; import { DollarSign, Settings } from 'lucide-react'; import { format } from 'date-fns'; @@ -236,7 +237,7 @@ export const RecentSalesWidget: React.FC = ({ {/* Content */}
- {isLoading &&
Loading…
} + {isLoading && } {error &&
{error}
} {/* Subtitle */} diff --git a/src/app/components/dashboard/widgets/RecommendedCoursesWidget.tsx b/src/app/components/dashboard/widgets/RecommendedCoursesWidget.tsx index 11ca5408..8c545625 100644 --- a/src/app/components/dashboard/widgets/RecommendedCoursesWidget.tsx +++ b/src/app/components/dashboard/widgets/RecommendedCoursesWidget.tsx @@ -1,4 +1,5 @@ import React, { useEffect, useState } from 'react'; +import { AccessibleLoading } from '../../accessibility/ScreenReaderOptimizer'; import { motion } from 'framer-motion'; import { BookOpen, Star, Clock, Users, Settings } from 'lucide-react'; @@ -217,7 +218,7 @@ export const RecommendedCoursesWidget: React.FC =
- {isLoading &&
Loading...
} + {isLoading && } {error &&
{error}
} {recommendedCourses.map((course, index) => ( = ( {/* Content */}
- {isLoading &&
Loading…
} + {isLoading && } {error &&
{error}
} {/* Subtitle */} diff --git a/src/components/forms/SubmitButton.tsx b/src/components/forms/SubmitButton.tsx index 543308f3..77ece121 100644 --- a/src/components/forms/SubmitButton.tsx +++ b/src/components/forms/SubmitButton.tsx @@ -13,27 +13,11 @@ */ import React from 'react'; +import { AccessibleLoading } from '../../app/components/accessibility/ScreenReaderOptimizer'; // ─── Spinner ────────────────────────────────────────────────────────────────── -function Spinner({ className = '' }: { className?: string }) { - return ( - - ); -} + // ─── Props ──────────────────────────────────────────────────────────────────── @@ -73,10 +57,13 @@ export const SubmitButton: React.FC = ({ {...props} > {isLoading ? ( - - - {loadingText} - + ) : ( children )}