MultimediaChoice¶
H5P equivalent
H5P Multimedia Choice
When to use¶
Use MultimediaChoice for multiple choice with image or audio options — each choice can include media alongside a label.
Set kind: "multimediaChoice" in lessonkit.json when packaging.
Requirements¶
Requires
checkIdinsideLesson.Props and telemetry: block catalog — MultimediaChoice.
Try it¶
Documentation demo
Use the Live demo, React, AI prompt, and Packaging / Manifest tabs below. Embedded demos disable telemetry, xAPI, and the LMS bridge. For production delivery, use the CLI template src/courseConfig.ts and LMS Go-Live.
<MultimediaChoice
checkId="channel-mm"
question="Which channel is approved for IT requests?"
choices={[
{
label: "Service portal",
mediaUrl: "/media/service-portal.png",
mediaKind: "image",
altText: "Corporate service portal home screen",
},
{
label: "Unknown email link",
mediaUrl: "/media/suspicious-email.png",
mediaKind: "image",
altText: "Suspicious email screenshot",
},
]}
answer="Service portal"
/>
Copy into Cursor, Copilot, or ChatGPT after the vibe coding starter context:
Read lessonkit.json and src/App.tsx before editing.
Add a MultimediaChoice block (H5P-style: Multimedia Choice) like this example inside the active <Lesson>:
<MultimediaChoice
checkId="channel-mm"
question="Which channel is approved for IT requests?"
choices={[
{
label: "Service portal",
mediaUrl: "/media/service-portal.png",
mediaKind: "image",
altText: "Corporate service portal home screen",
},
{
label: "Unknown email link",
mediaUrl: "/media/suspicious-email.png",
mediaKind: "image",
altText: "Suspicious email screenshot",
},
]}
answer="Service portal"
/>
Requirements:
- Import only from @lessonkit/react; use block types from block-catalog.v3.json.
- Keep existing courseId, lessonId, and navigation stable unless I ask to add a lesson.
Sync lessonkit.json — add under course.assessments[]:
{
"checkId": "channel-mm",
"kind": "multimediaChoice",
"question": "Which channel is approved for IT requests?",
"choices": ["Service portal", "Unknown email link"],
"answer": "Service portal"
}
- After edits, list changed files and what to verify in the browser (lessonkit dev).
Workflow tips: https://lessonkit.readthedocs.io/en/latest/guides/vibe-coding/prompting-and-workflows.html
Injectable via MCQ shell (kind: "multimediaChoice"). Media URLs are SPA-only; labels must match React props.
{
"checkId": "channel-mm",
"kind": "multimediaChoice",
"question": "Which channel is approved for IT requests?",
"choices": ["Service portal", "Unknown email link"],
"answer": "Service portal"
}
Touch behavior¶
Radio rows use lk-quiz-choice sizing. Image thumbnails scale down on narrow viewports; labels remain the tappable primary target.
Audio choices¶
Set mediaKind: "audio" for spoken options. Every choice needs non-empty label and altText (text equivalent for screen readers):
<MultimediaChoice
checkId="tone-mm"
question="Which clip matches our verified callback greeting?"
choices={[
{
label: "Standard verification",
mediaUrl: "/media/callback-good.mp3",
mediaKind: "audio",
altText: "Agent confirms account number before discussing charges",
},
{
label: "Pressure tactic",
mediaUrl: "/media/callback-bad.mp3",
mediaKind: "audio",
altText: "Caller demands immediate payment without verification",
},
]}
answer="Standard verification"
/>
LMS shell vs SPA media¶
kind: "multimediaChoice" injects into the LMS MCQ shell using choice labels only. Image and audio URLs render in the SPA — host assets under your production media allowlist. Labels in lessonkit.json must match React props exactly.
See also¶
Quiz — text-only multiple choice