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.
| Prop | Type | Default | Description |
|---|---|---|---|
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) => string | defaultGenerateModuleId | Mints 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) => string | defaultGenerateLessonId | Mints the id for a newly added lesson. Same story as `generateModuleId`. |
initialExpandedModuleIds | string[] | — | Which modules start expanded. Defaults to all of them, matching the app. Pass `[]` to snapshot the fully collapsed tree. |
initialSelectedLesson | CourseOutlineSelection | 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. |
initialDragIndex | number | null | null | Seeds the "this module is being dragged" state so the mid-drag look is a static story instead of a pointer gesture. |
initialDropTarget | ModuleDropTarget | null | null | Seeds the drop indicator. Pair with `initialDragIndex`. |
autoFocusNewItems | boolean | false | Steal 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. |
descriptionWordLimit | number | 100 | Module descriptions are truncated to this many words. |
addModuleLabel | string | "New Module" | Undocumented — add TSDoc to the prop in the library. |
addLessonLabel | string | "Add lesson" | Undocumented — add TSDoc to the prop in the library. |
emptyTitle | string | "Select a lesson to edit" | Copy for the right-hand pane when no lesson is selected. |
emptyDescription | string | "Choose from the module list or create a new one" | Undocumented — add TSDoc to the prop in the library. |
videoUploadLabel | string | — | Copy passed through to the lesson's video field. |
videoFileTypesLabel | string | — | Undocumented — add TSDoc to the prop in the library. |
className | string | — | 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.