11import { useState , useEffect , useRef , useMemo , useCallback } from 'react' ;
22import { marked } from 'marked' ;
3+ import SkillSlideView from './SkillSlideView' ;
34
45interface Heading {
56 level : number ;
@@ -135,7 +136,7 @@ export default function SkillExplorer({ skillContent, skillName, skillPath, refe
135136 const [ fileContent , setFileContent ] = useState ( skillContent ) ;
136137 const [ loading , setLoading ] = useState ( false ) ;
137138 const [ error , setError ] = useState ( '' ) ;
138- const [ mode , setMode ] = useState < 'code' | 'preview' > ( 'preview' ) ;
139+ const [ mode , setMode ] = useState < 'code' | 'preview' | 'slides' > ( 'preview' ) ;
139140 const [ expanded , setExpanded ] = useState ( false ) ;
140141 const [ activeHeading , setActiveHeading ] = useState ( '' ) ;
141142 const [ searchQuery , setSearchQuery ] = useState ( '' ) ;
@@ -290,7 +291,7 @@ export default function SkillExplorer({ skillContent, skillName, skillPath, refe
290291
291292 const handleFileClick = ( path : string ) => {
292293 setSelectedFile ( path ) ;
293- setMode ( 'preview' ) ;
294+ if ( mode === 'slides' ) setMode ( 'preview' ) ;
294295 setSearchOpen ( false ) ;
295296 setSearchQuery ( '' ) ;
296297 setExpanded ( false ) ;
@@ -374,6 +375,15 @@ export default function SkillExplorer({ skillContent, skillName, skillPath, refe
374375 </ svg >
375376 Preview
376377 </ button >
378+ { selectedFile === 'SKILL.md' && (
379+ < button onClick = { ( ) => setMode ( 'slides' ) }
380+ className = { `flex items-center gap-1.5 px-3 py-1.5 rounded-md text-xs font-medium transition-colors ${ mode === 'slides' ? 'bg-surface-2 text-text-primary shadow-sm' : 'text-text-tertiary hover:text-text-secondary' } ` } >
381+ < svg className = "w-3.5 h-3.5" fill = "none" viewBox = "0 0 24 24" stroke = "currentColor" strokeWidth = { 2 } >
382+ < path strokeLinecap = "round" strokeLinejoin = "round" d = "M3.75 3v11.25A2.25 2.25 0 006 16.5h2.25M3.75 3h-1.5m1.5 0h16.5m0 0h1.5m-1.5 0v11.25A2.25 2.25 0 0118 16.5h-2.25m-7.5 0h7.5m-7.5 0l-1 3m8.5-3l1 3m0 0l.5 1.5m-.5-1.5h-9.5m0 0l-.5 1.5" />
383+ </ svg >
384+ Slides
385+ </ button >
386+ ) }
377387 </ div >
378388 ) }
379389 { isMarkdown && (
@@ -397,7 +407,7 @@ export default function SkillExplorer({ skillContent, skillName, skillPath, refe
397407 </ div >
398408
399409 { /* Search bar */ }
400- { searchOpen && isMarkdown && (
410+ { searchOpen && isMarkdown && mode !== 'slides' && (
401411 < div className = "mb-3 relative" >
402412 < div className = "relative" >
403413 < svg className = "absolute left-3 top-1/2 -translate-y-1/2 w-3.5 h-3.5 text-[var(--color-text-tertiary)] pointer-events-none" fill = "none" viewBox = "0 0 24 24" stroke = "currentColor" strokeWidth = { 2 } >
@@ -452,6 +462,11 @@ export default function SkillExplorer({ skillContent, skillName, skillPath, refe
452462 </ div >
453463 ) }
454464
465+ { /* Slides mode */ }
466+ { mode === 'slides' && selectedFile === 'SKILL.md' ? (
467+ < SkillSlideView content = { skillContent } skillName = { skillName } />
468+ ) : (
469+ < >
455470 { /* Content + TOC — identical layout to MarkdownViewer */ }
456471 < div className = "flex gap-0 items-stretch" >
457472 { /* File tree panel */ }
@@ -532,6 +547,8 @@ export default function SkillExplorer({ skillContent, skillName, skillPath, refe
532547 ) }
533548 </ div >
534549 </ div >
550+ </ >
551+ ) }
535552 </ div >
536553 ) ;
537554}
0 commit comments