@@ -57,6 +57,11 @@ const useLocalCurrentFramework = create<{
5757 */
5858function useCurrentFramework ( frameworks : Framework [ ] ) {
5959 const navigate = useNavigate ( )
60+ const matches = useMatches ( )
61+ const lastMatch = last ( matches )
62+ const { libraryId, version } = useParams ( {
63+ from : '/$libraryId/$version/docs' ,
64+ } )
6065
6166 const { framework : paramsFramework } = useParams ( {
6267 strict : false ,
@@ -72,15 +77,29 @@ function useCurrentFramework(frameworks: Framework[]) {
7277
7378 const setFramework = React . useCallback (
7479 ( framework : string ) => {
80+ const currentPath = lastMatch . pathname
81+ const frameworkIndex = currentPath . indexOf ( '/framework/' )
82+
83+ if ( frameworkIndex === - 1 ) {
84+ // If we're not on a framework path, just update the framework in localStorage
85+ localCurrentFramework . setCurrentFramework ( framework )
86+ return
87+ }
88+
89+ const pathAfterFramework = currentPath . slice ( frameworkIndex + '/framework/' . length ) . split ( '/' ) . slice ( 1 ) . join ( '/' )
90+
7591 navigate ( {
76- params : ( prev ) => ( {
77- ...prev ,
92+ to : '/$libraryId/$version/docs/framework/$framework/$' ,
93+ params : {
94+ libraryId,
95+ version : version || 'latest' ,
7896 framework,
79- } ) ,
97+ _splat : pathAfterFramework ,
98+ } ,
8099 } )
81100 localCurrentFramework . setCurrentFramework ( framework )
82101 } ,
83- [ localCurrentFramework , navigate ]
102+ [ localCurrentFramework , navigate , libraryId , version , lastMatch . pathname ]
84103 )
85104
86105 React . useEffect ( ( ) => {
@@ -128,6 +147,9 @@ const useLocalCurrentVersion = create<{
128147 */
129148function useCurrentVersion ( versions : string [ ] ) {
130149 const navigate = useNavigate ( )
150+ const { libraryId } = useParams ( {
151+ from : '/$libraryId/$version/docs' ,
152+ } )
131153
132154 const { version : paramsVersion } = useParams ( {
133155 strict : false ,
@@ -142,14 +164,15 @@ function useCurrentVersion(versions: string[]) {
142164 const setVersion = React . useCallback (
143165 ( version : string ) => {
144166 navigate ( {
145- params : ( prev : Record < string , string > ) => ( {
146- ...prev ,
167+ to : '/$libraryId/$version/docs' ,
168+ params : {
169+ libraryId,
147170 version,
148- } ) ,
171+ } ,
149172 } )
150173 localCurrentVersion . setCurrentVersion ( version )
151174 } ,
152- [ localCurrentVersion , navigate ]
175+ [ localCurrentVersion , navigate , libraryId ]
153176 )
154177
155178 React . useEffect ( ( ) => {
@@ -326,9 +349,12 @@ export function DocsLayout({
326349 children,
327350} : DocsLayoutProps ) {
328351 const params = useParams ( { strict : false } )
329- const libraryId = params . libraryId || ''
330-
352+ const { libraryId } = useParams ( {
353+ from : '/$libraryId/$version/docs' ,
354+ } )
331355 const { _splat } = params
356+
357+ const { framework : currentFramework } = useCurrentFramework ( frameworks )
332358 const frameworkConfig = useFrameworkConfig ( { frameworks } )
333359 const versionConfig = useVersionConfig ( { versions } )
334360 const menuConfig = useMenuConfig ( { config, frameworks, repo } )
@@ -402,12 +428,21 @@ export function DocsLayout({
402428 to = {
403429 child . to . startsWith ( '/' )
404430 ? child . to
431+ : child . to . includes ( 'framework/' )
432+ ? '/$libraryId/$version/docs/framework/$framework/$'
405433 : '/$libraryId/$version/docs/$'
406434 }
407435 params = { {
408436 libraryId,
409437 version : params . version || 'latest' ,
410- _splat : child . to ,
438+ ...( child . to . includes ( 'framework/' )
439+ ? {
440+ framework : currentFramework ,
441+ _splat : child . to . split ( '/' ) . slice ( 2 ) . join ( '/' ) ,
442+ }
443+ : {
444+ _splat : child . to ,
445+ } ) ,
411446 } }
412447 onClick = { ( ) => {
413448 detailsRef . current . removeAttribute ( 'open' )
@@ -580,34 +615,92 @@ export function DocsLayout({
580615 < div className = "sticky flex items-center flex-wrap bottom-2 z-10 right-0 text-xs md:text-sm px-1 print:hidden" >
581616 < div className = "w-1/2 px-1 flex justify-end flex-wrap" >
582617 { prevItem ? (
583- < Link
584- to = { prevItem . to }
585- params
586- className = "py-1 px-2 bg-white/70 text-black dark:bg-gray-500/40 dark:text-white shadow-lg shadow-black/20 flex items-center justify-center backdrop-blur-sm z-20 rounded-lg overflow-hidden"
587- >
588- < div className = "flex gap-2 items-center font-bold" >
589- < FaArrowLeft />
590- { prevItem . label }
591- </ div >
592- </ Link >
618+ prevItem . to . startsWith ( 'http' ) ? (
619+ < a
620+ href = { prevItem . to }
621+ className = "py-1 px-2 bg-white/70 text-black dark:bg-gray-500/40 dark:text-white shadow-lg shadow-black/20 flex items-center justify-center backdrop-blur-sm z-20 rounded-lg overflow-hidden"
622+ >
623+ < div className = "flex gap-2 items-center font-bold" >
624+ < FaArrowLeft />
625+ { prevItem . label }
626+ </ div >
627+ </ a >
628+ ) : (
629+ < Link
630+ to = { prevItem . to . startsWith ( '/' )
631+ ? prevItem . to
632+ : prevItem . to . includes ( 'framework/' )
633+ ? '/$libraryId/$version/docs/framework/$framework/$'
634+ : '/$libraryId/$version/docs/$' }
635+ params = { {
636+ libraryId,
637+ version : params . version || 'latest' ,
638+ ...( prevItem . to . includes ( 'framework/' )
639+ ? {
640+ framework : currentFramework ,
641+ _splat : prevItem . to . split ( '/' ) . slice ( 2 ) . join ( '/' ) ,
642+ }
643+ : {
644+ _splat : prevItem . to ,
645+ } ) ,
646+ } }
647+ className = "py-1 px-2 bg-white/70 text-black dark:bg-gray-500/40 dark:text-white shadow-lg shadow-black/20 flex items-center justify-center backdrop-blur-sm z-20 rounded-lg overflow-hidden"
648+ >
649+ < div className = "flex gap-2 items-center font-bold" >
650+ < FaArrowLeft />
651+ { prevItem . label }
652+ </ div >
653+ </ Link >
654+ )
593655 ) : null }
594656 </ div >
595657 < div className = "w-1/2 px-1 flex justify-start flex-wrap" >
596658 { nextItem ? (
597- < Link
598- to = { nextItem . to }
599- params
600- className = "py-1 px-2 bg-white/70 text-black dark:bg-gray-500/40 dark:text-white shadow-lg shadow-black/20 flex items-center justify-center backdrop-blur-sm z-20 rounded-lg overflow-hidden"
601- >
602- < div className = "flex gap-2 items-center font-bold" >
603- < span
604- className = { `bg-gradient-to-r ${ colorFrom } ${ colorTo } bg-clip-text text-transparent` }
605- >
606- { nextItem . label }
607- </ span > { ' ' }
608- < FaArrowRight className = { textColor } />
609- </ div >
610- </ Link >
659+ nextItem . to . startsWith ( 'http' ) ? (
660+ < a
661+ href = { nextItem . to }
662+ className = "py-1 px-2 bg-white/70 text-black dark:bg-gray-500/40 dark:text-white shadow-lg shadow-black/20 flex items-center justify-center backdrop-blur-sm z-20 rounded-lg overflow-hidden"
663+ >
664+ < div className = "flex gap-2 items-center font-bold" >
665+ < span
666+ className = { `bg-gradient-to-r ${ colorFrom } ${ colorTo } bg-clip-text text-transparent` }
667+ >
668+ { nextItem . label }
669+ </ span > { ' ' }
670+ < FaArrowRight className = { textColor } />
671+ </ div >
672+ </ a >
673+ ) : (
674+ < Link
675+ to = { nextItem . to . startsWith ( '/' )
676+ ? nextItem . to
677+ : nextItem . to . includes ( 'framework/' )
678+ ? '/$libraryId/$version/docs/framework/$framework/$'
679+ : '/$libraryId/$version/docs/$' }
680+ params = { {
681+ libraryId,
682+ version : params . version || 'latest' ,
683+ ...( nextItem . to . includes ( 'framework/' )
684+ ? {
685+ framework : currentFramework ,
686+ _splat : nextItem . to . split ( '/' ) . slice ( 2 ) . join ( '/' ) ,
687+ }
688+ : {
689+ _splat : nextItem . to ,
690+ } ) ,
691+ } }
692+ className = "py-1 px-2 bg-white/70 text-black dark:bg-gray-500/40 dark:text-white shadow-lg shadow-black/20 flex items-center justify-center backdrop-blur-sm z-20 rounded-lg overflow-hidden"
693+ >
694+ < div className = "flex gap-2 items-center font-bold" >
695+ < span
696+ className = { `bg-gradient-to-r ${ colorFrom } ${ colorTo } bg-clip-text text-transparent` }
697+ >
698+ { nextItem . label }
699+ </ span > { ' ' }
700+ < FaArrowRight className = { textColor } />
701+ </ div >
702+ </ Link >
703+ )
611704 ) : null }
612705 </ div >
613706 </ div >
0 commit comments