Responsiveness of sidebar

feat/ai-courses
Kamran Ahmed 2 months ago
parent b3e80cff97
commit acb2e3dafd
  1. 29
      src/components/GenerateCourse/AICourseContent.tsx
  2. 2
      src/components/GenerateCourse/AICourseModuleList.tsx

@ -24,7 +24,7 @@ export function AICourseContent(props: AICourseContentProps) {
const [activeModuleIndex, setActiveModuleIndex] = useState(0); const [activeModuleIndex, setActiveModuleIndex] = useState(0);
const [activeLessonIndex, setActiveLessonIndex] = useState(0); const [activeLessonIndex, setActiveLessonIndex] = useState(0);
const [sidebarOpen, setSidebarOpen] = useState(true); const [sidebarOpen, setSidebarOpen] = useState(false);
const [viewMode, setViewMode] = useState<'module' | 'full'>('full'); const [viewMode, setViewMode] = useState<'module' | 'full'>('full');
const { data: aiCourseProgress } = useQuery( const { data: aiCourseProgress } = useQuery(
@ -115,7 +115,7 @@ export function AICourseContent(props: AICourseContentProps) {
return ( return (
<section className="flex h-screen flex-grow flex-col overflow-hidden bg-gray-50"> <section className="flex h-screen flex-grow flex-col overflow-hidden bg-gray-50">
<div className="border-b border-gray-200 bg-gray-100"> <div className="border-b border-gray-200 bg-gray-100">
<div className="flex items-center px-4 py-2"> <div className="flex items-center justify-between px-4 py-2">
<a <a
href="/ai-tutor" href="/ai-tutor"
className="flex flex-row items-center gap-1.5 text-sm font-medium text-gray-700 hover:text-gray-900" className="flex flex-row items-center gap-1.5 text-sm font-medium text-gray-700 hover:text-gray-900"
@ -124,6 +124,16 @@ export function AICourseContent(props: AICourseContentProps) {
<ChevronLeft className="size-4" strokeWidth={2.5} /> <ChevronLeft className="size-4" strokeWidth={2.5} />
Back to Generator Back to Generator
</a> </a>
<button
onClick={() => setSidebarOpen(!sidebarOpen)}
className="flex items-center justify-center text-gray-400 shadow-sm transition-colors hover:bg-gray-50 hover:text-gray-900 lg:hidden"
>
{sidebarOpen ? (
<X size={17} strokeWidth={3} />
) : (
<Menu size={17} strokeWidth={3} />
)}
</button>
</div> </div>
</div> </div>
<header className="flex h-[80px] items-center justify-between border-b border-gray-200 bg-white px-6 shadow-sm"> <header className="flex h-[80px] items-center justify-between border-b border-gray-200 bg-white px-6 shadow-sm">
@ -162,19 +172,13 @@ export function AICourseContent(props: AICourseContentProps) {
View Course Outline View Course Outline
</button> </button>
)} )}
<button
onClick={() => setSidebarOpen(!sidebarOpen)}
className="flex h-10 w-10 items-center justify-center rounded-md border border-gray-300 bg-white text-gray-700 shadow-sm transition-colors hover:bg-gray-50 hover:text-gray-900 md:hidden"
>
{sidebarOpen ? <X size={20} /> : <Menu size={20} />}
</button>
</div> </div>
</header> </header>
<div className="flex flex-1 overflow-hidden"> <div className="flex flex-1 overflow-hidden">
<aside <aside
className={cn( className={cn(
'fixed inset-y-0 left-0 z-20 w-80 transform overflow-y-auto border-r border-gray-200 bg-white transition-transform duration-200 ease-in-out md:relative md:mt-0 md:translate-x-0', 'fixed inset-y-0 left-0 z-20 w-80 transform overflow-y-auto border-r border-gray-200 bg-white transition-transform duration-200 ease-in-out lg:relative lg:mt-0 lg:translate-x-0',
sidebarOpen ? 'translate-x-0' : '-translate-x-full', sidebarOpen ? 'translate-x-0' : '-translate-x-full',
)} )}
> >
@ -204,7 +208,7 @@ export function AICourseContent(props: AICourseContentProps) {
<button <button
onClick={() => setSidebarOpen(false)} onClick={() => setSidebarOpen(false)}
className="rounded-md p-1 hover:bg-gray-100 md:hidden" className="rounded-md p-1 hover:bg-gray-100 lg:hidden"
> >
<X size={18} /> <X size={18} />
</button> </button>
@ -233,7 +237,7 @@ export function AICourseContent(props: AICourseContentProps) {
<main <main
className={cn( className={cn(
'flex-1 overflow-y-auto p-6 transition-all duration-200 ease-in-out', 'flex-1 overflow-y-auto p-6 transition-all duration-200 ease-in-out',
sidebarOpen ? 'md:ml-0' : '', sidebarOpen ? 'lg:ml-0' : '',
)} )}
> >
{viewMode === 'module' && ( {viewMode === 'module' && (
@ -302,6 +306,7 @@ export function AICourseContent(props: AICourseContentProps) {
return newState; return newState;
}); });
setSidebarOpen(false);
setViewMode('module'); setViewMode('module');
}} }}
> >
@ -345,7 +350,7 @@ export function AICourseContent(props: AICourseContentProps) {
{sidebarOpen && ( {sidebarOpen && (
<div <div
className="fixed inset-0 z-10 bg-gray-900 bg-opacity-50 md:hidden" className="fixed inset-0 z-10 bg-gray-900 bg-opacity-50 lg:hidden"
onClick={() => setSidebarOpen(false)} onClick={() => setSidebarOpen(false)}
></div> ></div>
)} )}

@ -156,7 +156,7 @@ export function AICourseModuleList(props: AICourseModuleListProps) {
newState[moduleIdx] = true; newState[moduleIdx] = true;
return newState; return newState;
}); });
setSidebarOpen(true); setSidebarOpen(false);
setViewMode('module'); setViewMode('module');
}} }}
className={cn( className={cn(

Loading…
Cancel
Save