/** * SlideshowSubPanels — internal sub-surface components for SlideshowPanel. * Not exported from the package index; used only by SlideshowPanel.tsx. */ import { useState, useCallback, useId } from "react"; import type { SlideRef, SlideHotspot, SlideSequence } from "@hyperframes/core/slideshow"; import type { DomEditSelection } from "../editor/domEditing"; import type { SceneInfo } from "./slideshowPanelHelpers"; import { generateId } from "../../utils/generateId"; // ── Section header (accordion toggle) ──────────────────────────────────── export function SectionHeader({ children, expanded, onToggle, }: { children: React.ReactNode; expanded: boolean; onToggle: () => void; }) { return ( ); } // ── Sub-surface: Slide List ────────────────────────────────────────────── export interface SlideListProps { scenes: SceneInfo[]; slides: SlideRef[]; selectedSceneId: string | null; onSelect: (sceneId: string) => void; onToggle: (sceneId: string) => void; onReorder: (sceneId: string, dir: "up" | "down") => void; } export function SlideList({ scenes, slides, selectedSceneId, onSelect, onToggle, onReorder, }: SlideListProps) { const slideIds = new Set(slides.map((s) => s.sceneId)); const sceneById = new Map(scenes.map((s) => [s.id, s])); const orderedSlideScenes = slides .map((sl) => sceneById.get(sl.sceneId)) .filter((s): s is SceneInfo => s !== undefined); const nonSlideScenes = scenes.filter((sc) => !slideIds.has(sc.id)); const rows = [...orderedSlideScenes, ...nonSlideScenes]; return (
{rows.map((scene) => { const isSlide = slideIds.has(scene.id); const isSelected = selectedSceneId === scene.id; return (
onSelect(scene.id)} onKeyDown={(e) => { if (e.key === "Enter" || e.key === " ") { e.preventDefault(); onSelect(scene.id); } }} > onToggle(scene.id)} onClick={(e) => e.stopPropagation()} className="accent-studio-accent flex-shrink-0" /> {scene.label || scene.id} {isSlide && ( )}
); })} {scenes.length === 0 && (

No scenes found

)}
); } // ── Sub-surface: Slide Inspector ───────────────────────────────────────── export interface SlideInspectorProps { sceneId: string; slide: SlideRef | undefined; currentTime: number; onSetNotes: (notes: string) => void; onMarkFragment: () => void; onRemoveFragment: (time: number) => void; } // fallow-ignore-next-line complexity export function SlideInspector({ sceneId, slide, currentTime, onSetNotes, onMarkFragment, onRemoveFragment, }: SlideInspectorProps) { const fragments = slide?.fragments ?? []; return (

Scene: {sceneId}