Markdown Overview Buttons Tabs Footnotes Collapse ToC Navigation Formula Page-Specific Meta Custom Components
For this recipe we want to move the hamburger menu there on desktop, while keeping it at its current place on mobile phones (since it is more reachable on a phone).
The default CODEDOC header sits at the top-right corner of the screen, so lets create a
left-header component which sits at the top-left and hosts our hamburger menu. Lets create
the file .codedoc/content/left-header.tsx
:
1linkimport { ThemedComponentThis, themedStyle } from '@connectv/jss-theme'; // --> for theming
2linkimport { CodedocTheme } from '@codedoc/core'; // --> we want our left-header's style to be compliant with codedoc theme
3linkimport { ToCToggle$ } from '@codedoc/core/components'; // --> this is the hamburger menu
4link
5link
6linkconst LeftHeaderStyle = themedStyle((theme: CodedocTheme) => ({ // --> defined a themed-based style
7link leftHeader: { // --> styles of the main left-header component
8link position: 'fixed',
9link top: 24,
10link left: 24,
11link zIndex: 999, // --> make sure it is above the ToC
12link '@media screen and (max-width: 1200px)': { // --> lets hide it on mobile
13link '&': { display: 'none' }
14link },
15link },
16link leftHeaderPadding: { // --> also a padding element that we'll use to pad ToC to not overlap with the left-header
17link height: 80,
18link position: 'sticky', // --> it should stick to the top of ToC
19link top: -32, // --> this is because ToC has a padding by default
20link marginTop: -32,
21link background: theme.toc.light.background, // --> should be of same background as ToC
22link 'body.dark &': { background: theme.toc.dark.background }, // --> also should share the ToC background in dark mode
23link '@media (prefers-color-scheme: dark)': { // --> this is for when the page scripts have not yet determined the user preference for dark mode/light mode and the system-settings is being adhered to
24link 'body:not(.dark-mode-animate) &': {
25link background: theme.toc.dark.background,
26link }
27link },
28link 'body.dark-mode-animate &': { transition: 'background .3s' }, // --> should animate its dark-mode-dependent properties
29link '@media screen and (max-width: 1200px)': { // --> also make it go away on mobile.
30link '&': { display: 'none' }
31link },
32link }
33link}));
34link
35link
36linkexport function LeftHeader( // --> the main left-header component
37link this: ThemedComponentThis,
38link _: any,
39link renderer: any,
40link) {
41link const classes = this.theme.classes(LeftHeaderStyle); // --> just get the styles resolved based on theme
42link return <div class={classes.leftHeader}><ToCToggle$/></div> // --> and return a div
43link}
44link
45link
46linkexport function LeftHeaderPadding( // --> the padding element
47link this: ThemedComponentThis,
48link _: any,
49link renderer: any,
50link) {
51link const classes = this.theme.classes(LeftHeaderStyle);
52link return <div class={classes.leftHeaderPadding}/>
53link}
The styling used for the components are based on @connectv/jss-theme
which is in turn based on JSS.
To add the left-header to our page, lets modify .codedoc/content/index.tsx
:
1linkimport { RendererLike } from '@connectv/html';
2linkimport { File } from 'rxline/fs';
3linkimport { Page, Meta, ContentNav, Fonts, ToC, GithubSearch$ } from '@codedoc/core/components';
4link
5linkimport { config } from '../config';
6linkimport { Header } from './header';
7linkimport { LeftHeader, LeftHeaderPadding } from './left-header'; // --> import the left-header and its padding element
8linkimport { Footer } from './footer';
9link
10link
11linkexport function content(_content: HTMLElement, toc: HTMLElement, renderer: RendererLike<any, any>, file: File<string>) {
12link return (
13link <Page title={config.page.title.extractor(_content, config, file)}
14link favicon={config.page.favicon}
15link meta={<Meta {...config.page.meta}/>}
16link fonts={<Fonts {...config.page.fonts}/>}
17link
18link scripts={config.page.scripts}
19link stylesheets={config.page.stylesheets}
20link
21link header={<Header {...config}/>}
22link footer={<Footer {...config}/>}
23link toc={
24link <ToC search={
25link config.misc?.github ?
26link <GithubSearch$
27link repo={config.misc.github.repo}
28link user={config.misc.github.user}
29link root={config.src.base}
30link pick={config.src.pick.source}
31link drop={config.src.drop.source}
32link /> : false
33link }>
34link <LeftHeaderPadding/> {/* --> add the padding */}
35link {toc} {/* --> on top of ToC content */}
36link </ToC>
37link }>
38link {_content}
39link <ContentNav content={_content}/>
40link <LeftHeader/> {/* --> also add the header itself! */}
41link </Page>
42link )
43link}
Now lets remove the previous hamburger menu from the footer. For this purpose, lets modify contents
of .codedoc/content/footer.tsx
and create our own custom footer component:
1linkimport { ThemedComponentThis, themedStyle } from '@connectv/jss-theme';
2linkimport { CodedocConfig, CodedocTheme } from '@codedoc/core';
3linkimport { FooterStyle, DarkModeSwitch$, ToCToggle$ } from '@codedoc/core/components';
4link
5link
6linkconst _FooterStyle = themedStyle((theme: CodedocTheme) => {
7link const parent = FooterStyle.style(theme); // --> get the style for original footer
8link return {
9link footer: {
10link extend: parent.footer, // --> simply extend them
11link '@media screen and (min-width: 1200px)': { // --> and make the left corner of the footer disappear on desktops
12link '& .left': { opacity: 0 },
13link },
14link }
15link } as any;
16link});
17link
18link
19linkexport function Footer(
20link this: ThemedComponentThis,
21link config: CodedocConfig,
22link renderer: any
23link) {
24link const classes = this.theme.classes(_FooterStyle);
25link
26link return <div class={classes.footer}>
27link <div class="left"><ToCToggle$/></div> {/* --> the toggle is included, but hidden on desktop via css */}
28link <div class="main">
29link <div class="inside">
30link <a href={`https://github.com/${config.misc?.github?.user}/${config.misc?.github?.repo}/`}
31link target="_blank">GitHub</a>
32link </div>
33link </div>
34link <div class="right"><DarkModeSwitch$/></div> {/* --> also do not forget the dark mode switch. */}
35link </div>
36link}
Notice how for this recipe we adopted the original code of CODEDOC's own footer.