Academy Audit Normalize Polish Distill
Academy audit / normalize / polish / distill
Scope#
Reviewed the current apps/academy UI conventions and the text-first academy additions:
apps/academy/app/(protected)/instructor/academy/page.tsxapps/academy/components/authoring/text-lecture-authoring.tsxapps/academy/components/learning/lecture-learning-mode.tsxapps/academy/components/learning/slide-deck-viewer.tsxapps/academy/lib/authoring/*
Existing conventions to preserve#
- Academy pages use
max-w-[var(--learn-page-max-width)],text-foreground*,bg-surface-*,border-border/*, andbrand-*tokens rather than raw colors. - Interactive elements commonly include
transition-colors,hover:*, andfocus-visible:ring-*states, e.g. dashboard cards and course hero CTAs. - Protected pages are wrapped by
apps/academy/app/(protected)/layout.tsx; route pages should not add an extra<main>because the layout already owns that landmark. - Course pages favor clear sections, concise upper-label metadata, and rounded surface panels.
Findings#
P1 — Normalize interaction states on new controls#
apps/academy/components/authoring/text-lecture-authoring.tsxbuttons and inputs have minimal hover/focus/disabled affordances compared with existing Academy controls.apps/academy/components/learning/slide-deck-viewer.tsxprevious/next buttons only exposedisabled:opacity-50; add focus-visible rings, hover states, and cursor affordance.
P1 — Distill the instructor page hierarchy#
apps/academy/app/(protected)/instructor/academy/page.tsxcurrently shows a stats strip plus three separate cards after the authoring grid. This creates many equal-weight containers and no single next step.- Keep the essential story: course/module/status → author lecture → preview slides → attach test/lab/live session. Compress supporting status cards into a compact checklist or summary.
P1 — Avoid client/server barrel footguns#
apps/academy/lib/authoring/bigbluebutton.tsimports Nodecrypto. Keep it out of the generic@/lib/authoringclient-facing barrel so client components do not accidentally pull server-only code.- Import BBB helpers directly only from server components or server-only modules.
P2 — Improve slide/text learner empty states#
apps/academy/components/learning/lecture-learning-mode.tsxandslide-deck-viewer.tsxreturnnullwhen no slide exists. Provide a small empty state so authors/learners understand what happened.
P2 — Copy can be shorter and more consistent#
- Current phrases like “Progress sync: slide …” and “Write Markdown now; generated slides stay editable” are accurate but mechanical.
- Prefer user-facing copy: “Slide 1 of 4”, “Write once. Preview as slides.”, “Publish draft”.
P2 — Reduce duplicated slide preview/list styling#
- Authoring slide preview and learner slide viewer both render slide title/content with separate markup. Keep separate components for editing vs viewing, but normalize spacing, line-height, and empty content treatment.
Recommended task order#
- Normalize components: shared button/input class constants or local helpers, focus states, client-safe barrel exports.
- Polish visual details: consistent section spacing, compact status labels, empty states.
- Distill instructor flow: replace bottom three cards with a focused readiness checklist and one primary action.
- Verify with focused ESLint, authoring Vitest tests, and a narrow TypeScript check for pure authoring modules.