OrgOutline.jsx (1249B)
1 import { useMemo } from 'react'; 2 import { parseOrgDocument } from '../lib/org/parseDocument.js'; 3 import { STR } from '../lib/strings.js'; 4 5 export default function OrgOutline({ content, onSelectHeading, collapsed = false }) { 6 const { headings } = useMemo(() => parseOrgDocument(content), [content]); 7 8 if (collapsed || headings.length === 0) { 9 return null; 10 } 11 12 return ( 13 <aside className="org-outline" aria-label={STR.ORG_OUTLINE}> 14 <div className="org-outline__title">{STR.ORG_OUTLINE}</div> 15 <ul className="org-outline__list"> 16 {headings.map((heading) => ( 17 <li 18 key={`${heading.line}-${heading.title}`} 19 className="org-outline__item" 20 style={{ paddingLeft: `${(heading.level - 1) * 0.65}rem` }} 21 > 22 <button 23 type="button" 24 className="org-outline__link" 25 onClick={() => onSelectHeading?.(heading.line)} 26 > 27 {heading.todo && ( 28 <span className={`org-badge org-${heading.todo.toLowerCase()}`}> 29 {heading.todo} 30 </span> 31 )} 32 {heading.title} 33 </button> 34 </li> 35 ))} 36 </ul> 37 </aside> 38 ); 39 }