Skip to content

Store editor

Course outline section

The read-only outline shown to a prospective buyer.
Available
Needs mock props

Examples

Rendered live from the maintained Storybook story. Lantern stores only the story id and embeds Storybook rather than duplicating the component or its demo.

Course outline section

Rendered live from Storybook

Storybook must be running for this to load — bun run start:storybook from the monorepo root, or set NEXT_PUBLIC_STORYBOOK_URL to a deployed instance.

Props

The component's public API, read from its TypeScript source. Descriptions come from TSDoc on the prop, so this table cannot drift from the component.

PropTypeDefaultDescription
modules*CourseModule[]—Undocumented — add TSDoc to the prop in the library.
onModulesChange*(modules: CourseModule[]) => void—Undocumented — add TSDoc to the prop in the library.
generateModuleId(index: number) => stringdefaultGenerateModuleIdMints the id for a newly added module. The app called `crypto.randomUUID()`, which makes every render a fresh snapshot; the default here is deterministic and derived from the current module count.
generateLessonId(moduleIndex: number, lessonIndex: number) => stringdefaultGenerateLessonIdMints the id for a newly added lesson. Same story as `generateModuleId`.
initialExpandedModuleIdsstring[]—Which modules start expanded. Defaults to all of them, matching the app. Pass `[]` to snapshot the fully collapsed tree.
initialSelectedLessonCourseOutlineSelection | null—Which lesson the editor starts on. Defaults to the first lesson of the first module; pass `null` to snapshot the "Select a lesson to edit" empty state while modules still exist.
onSelectedLessonChange(selection: CourseOutlineSelection | null) => void—Undocumented — add TSDoc to the prop in the library.
initialDragIndexnumber | nullnullSeeds the "this module is being dragged" state so the mid-drag look is a static story instead of a pointer gesture.
initialDropTargetModuleDropTarget | nullnullSeeds the drop indicator. Pair with `initialDragIndex`.
autoFocusNewItemsbooleanfalseSteal focus into a module or lesson title as soon as it appears. The app did this on mount for the first module, which yanks focus in a gallery, so it is off by default here and on in the app's shell.
descriptionWordLimitnumber100Module descriptions are truncated to this many words.
addModuleLabelstring"New Module"Undocumented — add TSDoc to the prop in the library.
addLessonLabelstring"Add lesson"Undocumented — add TSDoc to the prop in the library.
emptyTitlestring"Select a lesson to edit"Copy for the right-hand pane when no lesson is selected.
emptyDescriptionstring"Choose from the module list or create a new one"Undocumented — add TSDoc to the prop in the library.
videoUploadLabelstring—Copy passed through to the lesson's video field.
videoFileTypesLabelstring—Undocumented — add TSDoc to the prop in the library.
classNamestring—Undocumented — add TSDoc to the prop in the library.

Reference

Transcribed from the component audit. If this disagrees with the source, the source is right.

Source
src/components/store/editor/sections/CourseOutlineSection.tsx
Portability
Needs its app dependencies replaced by props before it renders in isolation.