diff --git a/public/file.svg b/public/file.svg deleted file mode 100644 index 004145c..0000000 --- a/public/file.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/globe.svg b/public/globe.svg deleted file mode 100644 index 567f17b..0000000 --- a/public/globe.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/images/onboarding/anon.png b/public/images/onboarding/anon.png new file mode 100644 index 0000000..bf30cab Binary files /dev/null and b/public/images/onboarding/anon.png differ diff --git a/public/images/onboarding/anonymous.svg b/public/images/onboarding/anonymous.svg deleted file mode 100644 index b591ec6..0000000 --- a/public/images/onboarding/anonymous.svg +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - Anonymous - - - - ON - - - - - \ No newline at end of file diff --git a/public/images/onboarding/ask-questions.svg b/public/images/onboarding/ask-questions.svg deleted file mode 100644 index 7564d4a..0000000 --- a/public/images/onboarding/ask-questions.svg +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - LIVE - Q&A - - - - S - Can you go over that last - example one more time? - - - 9 - - - - TA - Sure! The key idea is that - each call reduces by half... - - - - A - Is this on the midterm? - - 3 - - - Ask a question... - - - - - - \ No newline at end of file diff --git a/public/images/onboarding/community-rules.svg b/public/images/onboarding/community-rules.svg deleted file mode 100644 index 13b7c78..0000000 --- a/public/images/onboarding/community-rules.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/images/onboarding/join-class.svg b/public/images/onboarding/join-class.svg deleted file mode 100644 index 76c58e1..0000000 --- a/public/images/onboarding/join-class.svg +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - LIVE - - - CSC108 - - - - - - - - - - - Fall 2025 - - - Join - - - - \ No newline at end of file diff --git a/public/images/onboarding/kind.png b/public/images/onboarding/kind.png new file mode 100644 index 0000000..4830578 Binary files /dev/null and b/public/images/onboarding/kind.png differ diff --git a/public/images/onboarding/onboard-anon.jpg b/public/images/onboarding/onboard-anon.jpg deleted file mode 100644 index 75e85d1..0000000 Binary files a/public/images/onboarding/onboard-anon.jpg and /dev/null differ diff --git a/public/images/onboarding/onboard-answers.jpg b/public/images/onboarding/onboard-answers.jpg deleted file mode 100644 index cb89da5..0000000 Binary files a/public/images/onboarding/onboard-answers.jpg and /dev/null differ diff --git a/public/images/onboarding/onboard-upvotes.jpg b/public/images/onboarding/onboard-upvotes.jpg deleted file mode 100644 index 4dc5cda..0000000 Binary files a/public/images/onboarding/onboard-upvotes.jpg and /dev/null differ diff --git a/public/images/onboarding/onboard-welcome.jpg b/public/images/onboarding/onboard-welcome.jpg deleted file mode 100644 index ccec97f..0000000 Binary files a/public/images/onboarding/onboard-welcome.jpg and /dev/null differ diff --git a/public/images/onboarding/question.png b/public/images/onboarding/question.png new file mode 100644 index 0000000..1f57067 Binary files /dev/null and b/public/images/onboarding/question.png differ diff --git a/public/images/onboarding/upvote-rank.png b/public/images/onboarding/upvote-rank.png new file mode 100644 index 0000000..67c9f57 Binary files /dev/null and b/public/images/onboarding/upvote-rank.png differ diff --git a/public/images/onboarding/upvote.svg b/public/images/onboarding/upvote.svg deleted file mode 100644 index 476c5af..0000000 --- a/public/images/onboarding/upvote.svg +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - All - - Unresolved - - Resolved - - - - - - 24 - - How does binary search - handle edge cases? - - - Open - - - - - 8 - What's the time complexity - of merge sort? - - Open - - - - - 5 - Will this topic be on the - final exam? - - - ✓ Resolved - - - - \ No newline at end of file diff --git a/public/next.svg b/public/next.svg deleted file mode 100644 index 5174b28..0000000 --- a/public/next.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/placeholder/test_lec.pdf b/public/placeholder/test_lec.pdf deleted file mode 100644 index a2e8ba5..0000000 Binary files a/public/placeholder/test_lec.pdf and /dev/null differ diff --git a/public/vercel.svg b/public/vercel.svg deleted file mode 100644 index 7705396..0000000 --- a/public/vercel.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/window.svg b/public/window.svg deleted file mode 100644 index b2b2a44..0000000 --- a/public/window.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/app/components/OnboardingCarousel.tsx b/src/app/components/OnboardingCarousel.tsx index 18287ab..128ff2d 100644 --- a/src/app/components/OnboardingCarousel.tsx +++ b/src/app/components/OnboardingCarousel.tsx @@ -1,22 +1,7 @@ "use client"; import { useState } from "react"; -import { - Check, - ChevronLeft, - ChevronRight, - ShieldCheck, - LogIn, - MessageSquarePlus, - MessageCircleReply, - Ghost, - UserCheck, - ShieldAlert, - MonitorUp, - Presentation, - BookOpen, - LucideIcon, -} from "lucide-react"; +import { Check, ChevronLeft, ChevronRight } from "lucide-react"; import { OnboardingStep } from "@/constants/onboarding"; interface OnboardingCarouselProps { @@ -25,19 +10,6 @@ interface OnboardingCarouselProps { requireAgreement?: boolean; } -const iconMap: Record = { - LogIn, - MessageSquarePlus, - MessageCircleReply, - Ghost, - UserCheck, - ShieldAlert, - MonitorUp, - Presentation, - BookOpen, - ShieldCheck, // for the community rules -}; - export default function OnboardingCarousel({ steps, onComplete, @@ -67,51 +39,40 @@ export default function OnboardingCarousel({ const stepData = isAgreementStep ? { title: "Community Rules", - icon: "ShieldCheck", - image: "/images/onboarding/community-rules.svg", + image: "/images/onboarding/kind.png", description: [ - "Post only genuine questions related to the lecture.", + "Post only questions related to the lecture.", "Be respectful toward instructors and peers.", - "Spam or off-topic posts may be removed.", + "Spam or off-topic posts may be removed by TAs.", ], altText: "Community rules and guidelines", } : steps[currentStepIndex]; - const StepIcon = stepData.icon ? iconMap[stepData.icon] : null; - - /** Which step index last failed to load a hero image (no effect needed to reset on navigation). */ - const [heroFailedAtIndex, setHeroFailedAtIndex] = useState(null); - const heroSrc = "image" in stepData ? stepData.image : undefined; - const showHeroPhoto = Boolean(heroSrc && heroFailedAtIndex !== currentStepIndex); return ( -
- {/* Main Container - Responsive Height & Mobile Stacking */} -
+
+ {/* Fills the viewport — the two halves split it rather than a floating card. + Text only on mobile; an even side-by-side split from md up. */} +
{/* Left Content Half */} -
-
-
- {/* Flex Row: Icon + Title */} -
- {StepIcon && ( -
- -
- )} -

- {stepData.title} -

-
+
+
+
+ {/* Centred with auto margins rather than justify-center, which can + clip the top of a step that overflows. The fixed min height + keeps the heading still as bullet counts change. */} +

+ {stepData.title} +

{/* Clean Bullets */}
    {stepData.description.map((bullet, idx) => (
  • - + {bullet}
  • @@ -142,7 +103,7 @@ export default function OnboardingCarousel({
{/* Locked Footer Controls */} -
+
{/* Dots */}
{Array.from({ length: totalSteps }).map((_, idx) => ( @@ -160,7 +121,7 @@ export default function OnboardingCarousel({ @@ -171,7 +132,7 @@ export default function OnboardingCarousel({ className={`flex items-center justify-center gap-1.5 sm:gap-2 px-5 sm:px-6 h-10 sm:h-12 rounded-md font-bold transition-all duration-200 text-sm sm:text-base ${ isLastStep ? "bg-green-600 hover:bg-green-700 text-white shadow-md hover:shadow-lg shadow-green-500/20" - : "bg-gray-400 hover:bg-gray-500 text-white shadow-md hover:shadow-lg" + : "bg-stone-900 hover:bg-stone-800 text-stone-50 shadow-md hover:shadow-lg" } disabled:opacity-50 disabled:pointer-events-none disabled:shadow-none`} > {isLastStep ? "Get Started" : "Next"} @@ -182,29 +143,14 @@ export default function OnboardingCarousel({
{/* Right visual: illustration image */} -
-
- {showHeroPhoto ? ( - <> - {/* eslint-disable-next-line @next/next/no-img-element */} - {stepData.altText} setHeroFailedAtIndex(currentStepIndex)} - /> - - ) : ( -
- {StepIcon && ( -
- -
- )} -

- {stepData.altText} -

-
+
+ {heroSrc && ( + /* eslint-disable-next-line @next/next/no-img-element */ + {stepData.altText} )}
diff --git a/src/app/room/classChat/ChatHeader.tsx b/src/app/room/classChat/ChatHeader.tsx index 1408316..324267b 100644 --- a/src/app/room/classChat/ChatHeader.tsx +++ b/src/app/room/classChat/ChatHeader.tsx @@ -9,6 +9,9 @@ import { SlideUpdateContext } from "../SlideUpdateContext"; import { useRoom } from "../RoomContext"; import type { Role } from "@/utils/types"; +/** Course names are cut to this many characters so the header controls keep their room. */ +const TITLE_MAX_CHARS = 6; + interface ChatHeaderProps { role: Role; answerMode: "all" | "instructors_only"; @@ -116,8 +119,8 @@ export default function ChatHeader({ )} {sessionTitle && ( -

- {sessionTitle} +

+ {sessionTitle.slice(0, TITLE_MAX_CHARS)}

)}
diff --git a/src/constants/onboarding.ts b/src/constants/onboarding.ts index bddf16c..4bfa127 100644 --- a/src/constants/onboarding.ts +++ b/src/constants/onboarding.ts @@ -4,49 +4,36 @@ export interface OnboardingStep { /** Optional hero image under `public/` (e.g. `/images/onboarding/foo.svg`). */ image?: string; altText: string; - icon: string; } export const STUDENT_ONBOARDING_STEPS: OnboardingStep[] = [ { title: "Welcome to AskEasy", description: [ - "When your professor starts a lecture, it will appear as a live session on your dashboard.", - 'Just click "Join" on any live lecture to enter the Q&A room.', + "Post a question and get answered in real-time during lectures.", + "TAs reply directly, so you get answers without disrupting the lecture.", ], - image: "/images/onboarding/onboard-welcome.jpg", - altText: "Joining a live lecture session", - icon: "LogIn", - }, - { - title: "Ask & Get Answers Live", - description: [ - "Post your question during lecture and it appears in the live feed instantly.", - "TAs and your professor can reply directly, so you get answers without disrupting the lecture.", - ], - image: "/images/onboarding/onboard-answers.jpg", + image: "/images/onboarding/question.png", altText: "Live Q&A feed with questions and replies", - icon: "MessageSquarePlus", }, { - title: "Upvote & Track Questions", + title: "Upvote Questions", description: [ - "See a question you also have? Upvote it. The most popular questions rise to the top.", - "Questions are marked as resolved once answered. Filter between unresolved and resolved to find what you need.", + "The most upvoted unresolved questions rise to the top.", + "Everyone can mark their own question as resolved.", + "Only TAs and professors can mark other people's questions as resolved.", ], - image: "/images/onboarding/onboard-upvotes.jpg", + image: "/images/onboarding/upvote-rank.png", altText: "Questions ranked by upvotes with resolution filters", - icon: "MessageCircleReply", }, { title: "Stay Anonymous", description: [ - "Toggle Anonymous Mode to hide your name from other students.", - "TAs and professors can still see who you are to prevent misuse, but your classmates won't know.", + "Toggle Anonymous Mode to hide your name.", + "TAs and professors can still find you if misused.", ], - image: "/images/onboarding/onboard-anon.jpg", + image: "/images/onboarding/anon.png", altText: "Anonymous mode toggle hiding your identity", - icon: "Ghost", }, ]; @@ -59,7 +46,6 @@ export const PROF_ONBOARDING_STEPS: OnboardingStep[] = [ ], image: "/images/onboarding/onboard-classes.jpg", altText: "Starting a live session with slides and chat", - icon: "MonitorUp", }, { title: "Engage With Your Class", @@ -69,7 +55,6 @@ export const PROF_ONBOARDING_STEPS: OnboardingStep[] = [ ], image: "/images/onboarding/onboard-engage.jpg", altText: "Professor replying to student questions in real time", - icon: "Presentation", }, { title: "Manage & Export", @@ -79,6 +64,5 @@ export const PROF_ONBOARDING_STEPS: OnboardingStep[] = [ ], image: "/images/onboarding/onboard-end.jpg", altText: "Session management tools and chat export", - icon: "BookOpen", }, ];