@@ -14,6 +14,7 @@ import {
1414 type ReactNode ,
1515 useContext ,
1616 useEffect ,
17+ useLayoutEffect ,
1718 useState ,
1819} from 'react'
1920import { useSet } from 'react-use'
@@ -33,7 +34,6 @@ import {
3334 BookOpenText ,
3435 Files ,
3536 House ,
36- List ,
3737 MagnifyingGlass ,
3838 RoleIndexer ,
3939 SidebarSimple ,
@@ -43,7 +43,6 @@ import {
4343 Substreams ,
4444 SubstreamsPoweredSubgraph ,
4545 TheGraph ,
46- X ,
4746} from '@edgeandnode/gds/icons'
4847
4948import {
@@ -104,11 +103,20 @@ export default function Layout({ pageOpts, children }: NextraThemeLayoutProps<Fr
104103 const [ sidebarExpandedOnDesktop , setSidebarExpandedOnDesktop ] = useState ( true )
105104
106105 // Collapse the sidebar on mobile when the route changes
107- // TODO: Also collapse it when clicking outside the sidebar
108106 useEffect ( ( ) => {
109107 setSidebarExpandedOnMobile ( false )
110108 } , [ router . pathname ] )
111109
110+ // TODO: Create `useTailwindScreen` hook in GDS, with usage like `const screen = useTailwindScreen()` and then you can check `screen.md`, etc.
111+ const [ mobile , setMobile ] = useState ( false )
112+ useLayoutEffect ( ( ) => {
113+ const mediaQueryList = matchMedia ( '(min-width: 768px)' )
114+ setMobile ( ! mediaQueryList . matches )
115+ const onChange = ( event : MediaQueryListEvent ) => setMobile ( ! event . matches )
116+ mediaQueryList . addEventListener ( 'change' , onChange )
117+ return ( ) => mediaQueryList . removeEventListener ( 'change' , onChange )
118+ } , [ ] )
119+
112120 const normalizedPages = normalizePages ( {
113121 list : pageMap ,
114122 route : fsPath ,
@@ -297,93 +305,80 @@ export default function Layout({ pageOpts, children }: NextraThemeLayoutProps<Fr
297305
298306 < div
299307 className = { `
300- isolate overflow-x-clip
308+ isolate
301309 [--graph-docs-content-padding-bottom:theme(spacing.12)]
302310 [--graph-docs-content-padding-top:theme(spacing.12)]
303311 [--graph-docs-content-padding:theme(spacing.6)]
304- [--graph-docs-header-height:theme(spacing.14 )]
312+ [--graph-docs-header-height:theme(spacing.16 )]
305313 [--graph-docs-header-padding:theme(spacing.4)]
306314 [--graph-docs-layout-transition-duration:300ms]
307315 [--graph-docs-sidebar-width:theme(spacing.64)]
308316 [--graph-docs-toc-width:theme(spacing.66)]
309- xs:[--graph-docs-header-height:theme(spacing.16)]
310- xs:[--graph-docs-header-padding:theme(spacing.6)]
311317 md:[--graph-docs-content-padding-bottom:theme(spacing.16)]
312318 md:[--graph-docs-content-padding:theme(spacing.16)]
319+ md:[--graph-docs-header-padding:theme(spacing.6)]
313320 ` }
314321 >
315322 < header
316323 className = { `
317- sticky top-0 z-10 grid h-[var(--graph-docs-header-height)] grid-cols-[1fr_auto_1fr] border-b border-white/8 bg-background
324+ sticky top-0 z-10 grid h-[var(--graph-docs-header-height)] grid-cols-[1fr_auto_1fr] items-center border-b border-white/8 bg-background
318325 md:grid-cols-[var(--graph-docs-sidebar-width),auto]
319326 ` }
320327 >
321- < div className = "flex items-center px-[var(--graph-docs-header-padding)] md:hidden" >
322- { /* TODO: Use tertiary `ExperimentalButton` after new design is implemented */ }
323- < button
324- type = "button"
325- data-sidebar-expanded = { sidebarExpandedOnMobile || undefined }
326- className = { `
327- flex size-8 items-center justify-center text-white/88 transition
328- hocus-visible:text-white
329- active:text-white/64
330- active:transition-none
331- ` }
332- onClick = { ( ) => {
333- setSidebarExpandedOnMobile ( ( expanded ) => ! expanded )
334- } }
335- >
336- < List
337- alt = { t ( 'global.navigation.show' ) }
338- variant = "regular"
339- className = "prop-size-5 in-clickable-[[data-sidebar-expanded]]:hidden xs:prop-size-6"
340- />
341- < X
342- alt = { t ( 'global.navigation.hide' ) }
343- className = "prop-size-5 in-clickable-not-[[data-sidebar-expanded]]:hidden xs:prop-size-6"
344- />
345- </ button >
346- </ div >
347- < div className = "flex items-center justify-center md:ps-[var(--graph-docs-header-padding)]" >
348- < ButtonOrLink href = "https://thegraph.com" className = "outline-offset-2" >
328+ < div className = "contents md:flex md:items-center md:justify-center md:ps-[var(--graph-docs-header-padding)]" >
329+ < ButtonOrLink href = "https://thegraph.com" className = "outline-offset-2 md:-ms-1.5" >
349330 < span className = "absolute -inset-2" />
350- < TheGraph className = "prop- size-6 xs:prop-size-7" />
331+ < TheGraph size = { 7 } />
351332 </ ButtonOrLink >
352- < div className = "me-4.5 ms-3.5 h-7 w-px shrink-0 bg-white/8 xs:h-9" />
353- < div className = "text-body-small me-auto text-text xs:text-body-large" > Docs</ div >
333+ < div className = "me-auto hidden md:flex md:items-center" >
334+ < div className = "me-4.5 ms-3.5 h-9 w-px shrink-0 bg-white/8" />
335+ < div className = "text-body-large text-text" > Docs</ div >
336+ </ div >
354337 { /* TODO: Use naked `ExperimentalButton` after new design is implemented */ }
355- < button
356- type = "button"
357- data-sidebar-expanded = { sidebarExpandedOnDesktop || undefined }
358- className = { `
359- hidden size-8 items-center justify-center text-white/88 transition
360- hocus-visible:text-white
361- active:text-white/64
362- active:transition-none
363- md:flex
364- ` }
365- onClick = { ( ) => {
366- if ( ! sidebarExpandedOnDesktop ) {
367- setSidebarExpandedOnDesktop ( true )
368- } else {
369- setSidebarExpandedOnDesktop ( false )
370- setSidebarExpandedOnMobile ( false )
371- }
372- } }
373- >
374- < SidebarSimple
375- alt = { t ( 'global.navigation.show' ) }
376- variant = "regular"
377- size = { 6 }
378- className = "in-clickable-[[data-sidebar-expanded]]:hidden"
379- />
380- < SidebarSimple
381- alt = { t ( 'global.navigation.hide' ) }
382- variant = "fill"
383- size = { 6 }
384- className = "in-clickable-not-[[data-sidebar-expanded]]:hidden"
385- />
386- </ button >
338+ < div className = "order-first px-[var(--graph-docs-header-padding)] md:order-none md:px-0" >
339+ < button
340+ type = "button"
341+ data-sidebar-expanded-on-mobile = { sidebarExpandedOnMobile || undefined }
342+ data-sidebar-expanded-on-desktop = { sidebarExpandedOnDesktop || undefined }
343+ className = { `
344+ flex size-8 items-center justify-center text-white/88 transition
345+ hocus-visible:text-white
346+ active:text-white/64
347+ active:transition-none
348+ ` }
349+ onClick = { ( ) => {
350+ if ( mobile ) {
351+ setSidebarExpandedOnMobile ( ( expanded ) => ! expanded )
352+ } else {
353+ if ( ! sidebarExpandedOnDesktop ) {
354+ setSidebarExpandedOnDesktop ( true )
355+ } else {
356+ setSidebarExpandedOnDesktop ( false )
357+ setSidebarExpandedOnMobile ( false )
358+ }
359+ }
360+ } }
361+ >
362+ < SidebarSimple
363+ alt = { t ( 'global.navigation.show' ) }
364+ variant = "regular"
365+ size = { 6 }
366+ className = { `
367+ max-md:in-clickable-[[data-sidebar-expanded-on-mobile]]:hidden
368+ md:in-clickable-[[data-sidebar-expanded-on-desktop]]:hidden
369+ ` }
370+ />
371+ < SidebarSimple
372+ alt = { t ( 'global.navigation.hide' ) }
373+ variant = "fill"
374+ size = { 6 }
375+ className = { `
376+ max-md:in-clickable-not-[[data-sidebar-expanded-on-mobile]]:hidden
377+ md:in-clickable-not-[[data-sidebar-expanded-on-desktop]]:hidden
378+ ` }
379+ />
380+ </ button >
381+ </ div >
387382 < div className = "ms-3.5 hidden h-9 w-px shrink-0 bg-white/8 md:block" />
388383 </ div >
389384 < div className = "flex items-center gap-4 px-[var(--graph-docs-header-padding)]" >
@@ -441,6 +436,7 @@ export default function Layout({ pageOpts, children }: NextraThemeLayoutProps<Fr
441436 </ button >
442437 ) }
443438 </ DocSearch >
439+ { /* TODO: Implement new design */ }
444440 < ExperimentalLocaleSwitcher className = "prop-display-format-short lg:prop-display-format-full" />
445441 { /* TODO: Fix app launcher */ }
446442 { /* <ExperimentalAppLauncher /> */ }
@@ -457,6 +453,16 @@ export default function Layout({ pageOpts, children }: NextraThemeLayoutProps<Fr
457453 md:data-[sidebar-expanded-on-desktop]:grid-cols-[var(--graph-docs-sidebar-width),auto]
458454 ` }
459455 >
456+ < div
457+ onClick = { ( ) => setSidebarExpandedOnMobile ( false ) }
458+ className = { `
459+ pointer-events-none absolute inset-0 z-10 hidden bg-background/64 opacity-0
460+ transition-[opacity,display] duration-[var(--graph-docs-layout-transition-duration)] transition-allow-discrete +:starting:opacity-0
461+ max-md:group-data-[sidebar-expanded-on-mobile]/layout-sidebar-grid:pointer-events-auto
462+ max-md:group-data-[sidebar-expanded-on-mobile]/layout-sidebar-grid:block
463+ max-md:group-data-[sidebar-expanded-on-mobile]/layout-sidebar-grid:opacity-100
464+ ` }
465+ />
460466 < div className = "sticky top-[var(--graph-docs-header-height)] z-10 h-[calc(100vh-var(--graph-docs-header-height))]" >
461467 < nav
462468 aria-label = { t ( 'global.navigation.title' ) }
@@ -604,7 +610,7 @@ function MDXContent({ toc: headings, children }: ComponentPropsWithoutRef<Nextra
604610 < main
605611 data-hide-table-of-contents = { frontMatter . hideTableOfContents || undefined }
606612 className = { `
607- group/layout-toc-grid grid grid-cols-[auto,0]
613+ group/layout-toc-grid grid grid-cols-[auto,0] overflow-x-clip
608614 transition-[grid-template-columns]
609615 duration-[var(--graph-docs-layout-transition-duration)]
610616 xl:not-data-[hide-table-of-contents]:grid-cols-[auto,var(--graph-docs-toc-width)]
@@ -683,6 +689,7 @@ function MDXContent({ toc: headings, children }: ComponentPropsWithoutRef<Nextra
683689 mdx-[hr]:bg-white/8
684690 mdx-[li]:ps-1.5
685691 mdx-[ul,ol]:ps-5
692+ mdx-[b,strong]:font-medium
686693 mdx-[b,strong]:text-white
687694 mdx-[h2,h3,h4,h5,h6]:text-white
688695 mdx-[ul>li]:after:absolute
0 commit comments