feat: add collapseByDefault option to TableOfContents (closes #566)
This commit is contained in:
		
							parent
							
								
									a62a97c7ab
								
							
						
					
					
						commit
						101e9946bd
					
				
					 4 changed files with 9 additions and 3 deletions
				
			
		| 
						 | 
				
			
			@ -20,7 +20,7 @@ function TableOfContents({ fileData, displayClass }: QuartzComponentProps) {
 | 
			
		|||
 | 
			
		||||
  return (
 | 
			
		||||
    <div class={`toc ${displayClass ?? ""}`}>
 | 
			
		||||
      <button type="button" id="toc">
 | 
			
		||||
      <button type="button" id="toc" class={fileData.collapseToc ? "collapsed" : ""}>
 | 
			
		||||
        <h3>Table of Contents</h3>
 | 
			
		||||
        <svg
 | 
			
		||||
          xmlns="http://www.w3.org/2000/svg"
 | 
			
		||||
| 
						 | 
				
			
			@ -60,7 +60,7 @@ function LegacyTableOfContents({ fileData }: QuartzComponentProps) {
 | 
			
		|||
  }
 | 
			
		||||
 | 
			
		||||
  return (
 | 
			
		||||
    <details id="toc" open>
 | 
			
		||||
    <details id="toc" open={!fileData.collapseToc}>
 | 
			
		||||
      <summary>
 | 
			
		||||
        <h3>Table of Contents</h3>
 | 
			
		||||
      </summary>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -24,8 +24,9 @@ function toggleToc(this: HTMLElement) {
 | 
			
		|||
function setupToc() {
 | 
			
		||||
  const toc = document.getElementById("toc")
 | 
			
		||||
  if (toc) {
 | 
			
		||||
    const collapsed = toc.classList.contains("collapsed")
 | 
			
		||||
    const content = toc.nextElementSibling as HTMLElement
 | 
			
		||||
    content.style.maxHeight = content.scrollHeight + "px"
 | 
			
		||||
    content.style.maxHeight = collapsed ? "0px" : content.scrollHeight + "px"
 | 
			
		||||
    toc.removeEventListener("click", toggleToc)
 | 
			
		||||
    toc.addEventListener("click", toggleToc)
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -8,12 +8,14 @@ export interface Options {
 | 
			
		|||
  maxDepth: 1 | 2 | 3 | 4 | 5 | 6
 | 
			
		||||
  minEntries: 1
 | 
			
		||||
  showByDefault: boolean
 | 
			
		||||
  collapseByDefault: boolean
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const defaultOptions: Options = {
 | 
			
		||||
  maxDepth: 3,
 | 
			
		||||
  minEntries: 1,
 | 
			
		||||
  showByDefault: true,
 | 
			
		||||
  collapseByDefault: false,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
interface TocEntry {
 | 
			
		||||
| 
						 | 
				
			
			@ -54,6 +56,7 @@ export const TableOfContents: QuartzTransformerPlugin<Partial<Options> | undefin
 | 
			
		|||
                  ...entry,
 | 
			
		||||
                  depth: entry.depth - highestDepth,
 | 
			
		||||
                }))
 | 
			
		||||
                file.data.collapseToc = opts.collapseByDefault
 | 
			
		||||
              }
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
| 
						 | 
				
			
			@ -66,5 +69,6 @@ export const TableOfContents: QuartzTransformerPlugin<Partial<Options> | undefin
 | 
			
		|||
declare module "vfile" {
 | 
			
		||||
  interface DataMap {
 | 
			
		||||
    toc: TocEntry[]
 | 
			
		||||
    collapseToc: boolean
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue