<ahref="#my-heading">This link will scroll to</a><h3id="my-heading">The element with matching `id`</h3>
<ahref="#my-heading">This link will scroll to</a><h3id="my-heading">The element with matching `id`</h3>
Highlight active heading
Optionally wrap the content in an element with .bf-hightlight-target to
highlight the currently active header.
<articleclass="bf-highlight-target"><ahref="#my-heading">This link will scroll to</a><h3id="my-heading">The element with matching `id`</h3></article>
<articleclass="bf-highlight-target"><ahref="#my-heading">This link will scroll to</a><h3id="my-heading">The element with matching `id`</h3></article>
Responsive components
Depending on the width required for your page content, you can probably placed
the table of contents on the right hand side in a sticky container, replaced by
an accordion for small screens.
1. Sticky box for desktop
We provide a <Sticky> component to create a box that follows
scrollable content, then sticks to the top.
<Sticky><olclassName="bf-toc">...</ol></Sticky>
<Sticky><olclassName="bf-toc">...</ol></Sticky>
2. Accordion for mobile
For mobile screens, we don't have sufficient space for the sticky box, instead
we can use a full-width <Accordion> preceding the content.
<Accordion><Accordion.Itemtitle="On this page"><olclassName="bf-toc">...</ol></Accordion.Item></Accordion>
<Accordion><Accordion.Itemtitle="On this page"><olclassName="bf-toc">...</ol></Accordion.Item></Accordion>
3. Breakpoint CSS
Since we don't want to show all of these elements for all screens, we can use
some breakpoint classes.
.to-medium for mobile-only elements; the accordion
.from-medium on desktop-only elements; the sticky box
The medium keyword breaks at 960px viewport width.
4. All of the above
Here we've also added an "On this page" header in the sticky box.
const toc =(<olclassName='bf-toc'><li><aclassName="bf-title-link">Link</a></li>{/* more items... */}</ol>);// placed in a right-hand column layout<StickyclassName='from-medium'><headerclassName='bfc-base-2 bf-medium bf-strong'>On this Page</header>{toc}</Sticky>// placed preceding content<AccordionclassName="to-medium"><Accordion.Itemtitle="On this page">{toc}</Accordion.Item></Accordion>
const toc =(<olclassName='bf-toc'><li><aclassName="bf-title-link">Link</a></li>{/* more items... */}</ol>);// placed in a right-hand column layout<StickyclassName='from-medium'><headerclassName='bfc-base-2 bf-medium bf-strong'>On this Page</header>{toc}</Sticky>// placed preceding content<AccordionclassName="to-medium"><Accordion.Itemtitle="On this page">{toc}</Accordion.Item></Accordion>
Live demo
Try resizing the preview pane to see mobile/desktop version, or open in
codesanbox.io and resize window.
import{useState}from"react";import{faList}from"@fortawesome/free-regular-svg-icons";importStickyfrom"@intility/bifrost-react/Sticky";importAccordionfrom"@intility/bifrost-react/Accordion";importButtonfrom"@intility/bifrost-react/Button";importIconfrom"@intility/bifrost-react/Icon";exportdefaultfunctionTocDemo(){consttoc = (<olclassName="bf-toc"><li><ahref="#scrolldown"className="bf-title-link">
Scroll downwards
</a></li><li><ahref="#secondSection"className="bf-title-link">
Second section
</a><ol><li><ahref="#firstSubSection"className="bf-title-link">
First sub-section
</a></li><li><ahref="#secondSubSection"className="bf-title-link">
Second sub-section
</a></li></ol></li><li><ahref="#scrollup"className="bf-title-link">
Scroll upwards
</a></li></ol>);return(<><divclassName="bf-content bf-highlight-target"><h1><spanclassName="from-medium">Desktop demo</span><spanclassName="to-medium">Mobile demo</span></h1><p>
On desktop screens over 960px you should get a sticky box, but on
smaller screens a floating button instead, which opens a drawer from
bottom.
</p><p>
Resize your browser window to test{" "}<spanclassName="from-medium">mobile</span><spanclassName="to-medium">desktop</span> mode.
</p><AccordionclassName="to-medium"><Accordion.Itemtitle="On this page">{toc}</Accordion.Item></Accordion><divclassName="toc-demo-layout"><StickyclassName="from-medium bfl-grid"><headerclassName="bfc-base-2 bf-medium bf-strong">
On this Page
</header>{toc}</Sticky><div><h2id="scrolldown">Scroll downwards</h2><p>
Lorem ipsum dolor sit amet. Eos Quis laudantium 33 consequatur
dicta eum expedita dolore aut nostrum nihil. Est dolorem
consequuntur et accusamus fuga et repellendus facilis et incidunt
explicabo. 33 galisum sapiente non provident itaque et itaque
dolores non maiores doloribus a suscipit eveniet! 33 illum labore
id veniam sint cum deserunt omnis est deserunt facere et eaque
exercitationem et pariatur velit?
</p><p>
Qui minima doloribus ut dolore iure qui debitis voluptatibus aut
dolore nostrum hic consequatur. Sed consequatur nemo qui ipsum
enim et velit architecto sit perferendis repellendus.
</p><p>
Sed deserunt voluptatum et voluptate voluptatem aut labore
reprehenderit vel corporis sapiente. 33 omnis magnam et ratione
saepe aut dicta veritatis rem voluptatem necessitatibus aut
voluptates autem est sunt delectus aut commodi doloribus.
</p><p>
Lorem ipsum dolor sit amet. Eos Quis laudantium 33 consequatur
dicta eum expedita dolore aut nostrum nihil. Est dolorem
consequuntur et accusamus fuga et repellendus facilis et incidunt
explicabo. 33 galisum sapiente non provident itaque et itaque
dolores non maiores doloribus a suscipit eveniet! 33 illum labore
id veniam sint cum deserunt omnis est deserunt facere et eaque
exercitationem et pariatur velit?
</p><h2id="secondSection">Second section</h2><p>
Lorem ipsum dolor sit amet. Eos Quis laudantium 33 consequatur
dicta eum expedita dolore aut nostrum nihil. Est dolorem
consequuntur et accusamus fuga et repellendus facilis et incidunt
explicabo. 33 galisum sapiente non provident itaque et itaque
dolores non maiores doloribus a suscipit eveniet! 33 illum labore
id veniam sint cum deserunt omnis est deserunt facere et eaque
exercitationem et pariatur velit?
</p><h3id="firstSubSection">First sub-section</h3><p>
Sed deserunt voluptatum et voluptate voluptatem aut labore
reprehenderit vel corporis sapiente. 33 omnis magnam et ratione
saepe aut dicta veritatis rem voluptatem necessitatibus aut
voluptates autem est sunt delectus aut commodi doloribus.
</p><h3id="secondSubSection">Second sub-section</h3><p>
Sed deserunt voluptatum et voluptate voluptatem aut labore
reprehenderit vel corporis sapiente. 33 omnis magnam et ratione
saepe aut dicta veritatis rem voluptatem necessitatibus aut
voluptates autem est sunt delectus aut commodi doloribus.
</p><h2id="scrollup">Scroll upwards</h2><p>
Qui minima doloribus ut dolore iure qui debitis voluptatibus aut
dolore nostrum hic consequatur. Sed consequatur nemo qui ipsum
enim et velit architecto sit perferendis repellendus.
</p><p>
Sed deserunt voluptatum et voluptate voluptatem aut labore
reprehenderit vel corporis sapiente. 33 omnis magnam et ratione
saepe aut dicta veritatis rem voluptatem necessitatibus aut
voluptates autem est sunt delectus aut commodi doloribus.
</p><p><ahref="#top">Scroll to top</a></p></div></div></div><style>{`
.toc-demo-layout h2:first-child { margin-top: 12px }
@media (min-width: 960px) {
.toc-demo-layout {
display: grid;
grid-template-columns: 1fr auto;
gap: 1rem;
margin-block: 2rem 10rem;
place-items: start;
}
.toc-demo-layout > :first-child {
grid-column-start: 2;
}
.toc-demo-layout > :last-child {
grid-row-start: 1;
grid-column-start: 1;
}
}
`}</style></>);}