Primary types
- slides — Presentation with rich elements (heading, paragraph, image, list, code, callout). Speaker notes. Fullscreen viewer with keyboard navigation.
- video — youtube/vimeo/upload sources. Auto-transcription via Whisper when mediaAssetId.
- pdf_viewer — react-pdf, navigation, zoom, full text search.
- rich_text — Tiptap editor with extensions (tables, code blocks, images, links, math). HTML sanitized server-side.
- quiz — 8+ question types, full configuration (maxAttempts, timeLimit, shuffle, etc).
- assignment — Instructions, dueDate, maxScore, submissionType (text/file/both), rubricId. Submissions in private bucket.
- live_class — References LiveClass entity (BBB/Zoom/Teams/Meet).
- external_link — URL with description, openInNewTab.
Interactive subtypes
When lesson.subtype !== null:
- interactive_video — Video with checkpoints (mandatory questions before continuing)
- drag_drop — Items to drag to targets
- fill_blanks — Text with placeholders, accepted answers
- flashcard_set — Cards with SRS SM-2 spaced repetition
- timeline — Interactive timeline with zoom
- branching_scenario — Decision tree for simulations (clinical case, ethical dilemma, negotiation)
Editors (Lesson Builder)
Each type has dedicated visual editor in components/lesson-builder/. Subtypes in components/interactive/.
Limitations
- Quiz essay without native auto-correction — admin can enable LLM grading (additional cost)
- Interactive subtypes don't migrate to H5P — Studeia proprietary format
- Branching_scenario max depth 10 levels — anti-infinite loop