feat: add collapseByDefault option to TableOfContents (closes #566)
This commit is contained in:
		
							parent
							
								
									a62a97c7ab
								
							
						
					
					
						commit
						101e9946bd
					
				| @ -18,6 +18,7 @@ You can also hide the table of contents on a page by adding `showToc: false` to | ||||
| - Removing table of contents: remove all instances of `Plugin.TableOfContents()` from `quartz.config.ts`. and `Component.TableOfContents()` from `quartz.layout.ts` | ||||
| - Changing the max depth: pass in a parameter to `Plugin.TableOfContents({ maxDepth: 4 })` | ||||
| - Changing the minimum number of entries in the Table of Contents before it renders: pass in a parameter to `Plugin.TableOfContents({ minEntries: 3 })` | ||||
| - Collapse the table of content by default: pass in a parameter to `Plugin.TableOfContents({ collapseByDefault: true })` | ||||
| - Component: `quartz/components/TableOfContents.tsx` | ||||
| - Style: | ||||
|   - Modern (default): `quartz/components/styles/toc.scss` | ||||
|  | ||||
| @ -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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user