1- import { createEffect , createSignal , For , Show } from "solid-js" ;
1+ import { createEffect , createMemo , createSignal , For , Show } from "solid-js" ;
22import { A , useBeforeLeave , useLocation , useMatch } from "@solidjs/router" ;
33import { Icon } from "solid-heroicons" ;
44import { chevronDown } from "solid-heroicons/solid" ;
55import { setIsOpen } from "./mobile-navigation" ;
66import { Dynamic } from "solid-js/web" ;
7- import { SidebarItem , useSidebar } from "@kobalte/solidbase/client" ;
7+ import {
8+ SidebarItem ,
9+ SidebarItemLink ,
10+ useLocale ,
11+ useSidebar ,
12+ } from "@kobalte/solidbase/client" ;
813import { Collapsible } from "@kobalte/core/collapsible" ;
914import { Tabs } from "@kobalte/core/tabs" ;
15+ import { useRouteConfig , useSolidBaseContext } from "../../utils" ;
1016
1117interface Entry {
1218 title : string ;
@@ -19,94 +25,67 @@ interface Entry {
1925
2026interface MainNavigationProps { }
2127
22- function ListItemLink ( props : { item : Entry } ) {
28+ function ListItemLink ( props : { item : SidebarItemLink ; prefix ?: string } ) {
2329 const location = useLocation ( ) ;
30+ const locale = useLocale ( ) ;
31+
2432 const linkStyles = ( ) =>
25- location . pathname === props . item . path . replace ( / \\ / g, "/" )
33+ location . pathname === props . item . link . replace ( / \\ / g, "/" )
2634 ? "font-semibold text-blue-700 before:bg-blue-700 dark:before:bg-blue-200 dark:text-blue-300 before:block"
2735 : "text-slate-700 before:hidden before:bg-blue-600 before:dark:bg-blue-200 hover:text-blue-700 hover:before:block dark:text-slate-300 " ;
2836 return (
29- < Show when = { ! props . item . mainNavExclude } >
30- < li class = "relative" >
31- < Dynamic
32- component = { props . item . isTranslated ? A : "a" }
33- onClick = { ( ) => setIsOpen ( false ) }
34- href = { props . item . path }
35- class = { `block w-full pl-3.5 before:pointer-events-none before:absolute before:-left-1 before:top-1/2 before:h-1.5 before:w-1.5 before:-translate-y-1/2 before:rounded-full hover:text-blue-700 lg:text-sm dark:hover:text-blue-300 ${ linkStyles ( ) } ` }
36- >
37- { props . item . title }
38- < Show when = { props . item . isDeprecated } > (deprecated)</ Show >
39- < Show when = { ! props . item . isTranslated } >
40- < span >
41- < abbr
42- title = "english"
43- class = "relative -top-2 left-2 text-[0.7em] text-neutral-400 no-underline"
44- >
45- EN
46- </ abbr >
47- </ span >
48- </ Show >
49- </ Dynamic >
50- </ li >
51- </ Show >
37+ < li class = "relative" >
38+ < a
39+ onClick = { ( ) => setIsOpen ( false ) }
40+ href = { locale . applyPathPrefix (
41+ `${ props . prefix === "/" ? "" : ( props . prefix ?? "" ) } ${ props . item . link === "/" ? "" : props . item . link } `
42+ ) }
43+ class = { `block w-full pl-3.5 before:pointer-events-none before:absolute before:top-1/2 before:-left-1 before:h-1.5 before:w-1.5 before:-translate-y-1/2 before:rounded-full hover:text-blue-700 lg:text-sm dark:hover:text-blue-300 ${ linkStyles ( ) } ` }
44+ >
45+ { props . item . title }
46+ </ a >
47+ </ li >
5248 ) ;
5349}
5450
55- function DirList ( props : { list : Entry [ ] ; sortAlphabeticaly ?: boolean } ) {
51+ function DirList ( props : { items : SidebarItem [ ] } ) {
5652 return (
57- < For each = { props . list } >
58- { ( item ) => {
59- if ( Array . isArray ( item . children ) ) {
53+ < For each = { props . items } >
54+ { ( child ) => {
55+ if ( "items" in child ) {
6056 return (
61- < li >
62- < span class = "font-semibold text-slate-800 dark:text-slate-100" >
63- { item . title }
64- </ span >
65- < ul
66- role = "list"
67- class = "ml-2 mt-2 space-y-3 border-l border-slate-400 lg:border-slate-400 dark:border-slate-700"
68- >
69- < For each = { item . children } >
70- { ( child ) => {
71- return Array . isArray ( child . children ) ? (
72- < >
73- < li >
74- < Collapsible defaultOpen = { true } >
75- < Collapsible . Trigger class = "group relative flex w-full justify-between pl-3.5 hover:cursor-pointer dark:text-slate-300" >
76- < span class = "font-semibold dark:text-slate-100" >
77- { child . title }
78- </ span >
79- < Icon
80- aria-hidden = "true"
81- path = { chevronDown }
82- class = "my-auto h-4 transition-transform kb-group-closed:rotate-180"
83- />
84- </ Collapsible . Trigger >
85- < Collapsible . Content class = "navigation_collapsible" >
86- < ul
87- role = "list"
88- class = "ml-4 mt-3 space-y-3 border-l border-slate-400 dark:border-slate-700 dark:lg:border-slate-700"
89- >
90- < DirList
91- sortAlphabeticaly = { props . sortAlphabeticaly }
92- list = { child . children }
93- />
94- </ ul >
95- </ Collapsible . Content >
96- </ Collapsible >
97- </ li >
98- </ >
99- ) : (
100- < ListItemLink item = { child } />
101- ) ;
102- } }
103- </ For >
104- </ ul >
105- </ li >
57+ < >
58+ < li >
59+ < Collapsible defaultOpen = { true } >
60+ < Collapsible . Trigger class = "group relative flex w-full justify-between pl-3.5 hover:cursor-pointer dark:text-slate-300" >
61+ < span class = "font-semibold dark:text-slate-100" >
62+ { child . title }
63+ </ span >
64+ < Icon
65+ aria-hidden = "true"
66+ path = { chevronDown }
67+ class = "kb-group-closed:rotate-180 my-auto h-4 transition-transform"
68+ />
69+ </ Collapsible . Trigger >
70+ < Collapsible . Content class = "navigation_collapsible" >
71+ < ul
72+ role = "list"
73+ class = "mt-3 ml-4 space-y-3 border-l border-slate-400 dark:border-slate-700 dark:lg:border-slate-700"
74+ >
75+ < DirList items = { child . items } />
76+ </ ul >
77+ </ Collapsible . Content >
78+ </ Collapsible >
79+ </ li >
80+ </ >
10681 ) ;
107- } else {
108- return < ListItemLink item = { item } /> ;
10982 }
83+
84+ if ( "link" in child ) {
85+ return < ListItemLink item = { child } /> ;
86+ }
87+
88+ return "" ;
11089 } }
11190 </ For >
11291 ) ;
@@ -122,17 +101,26 @@ interface NavigationItemProps {
122101}
123102
124103export function MainNavigation ( props : MainNavigationProps ) {
125- const isReference = useMatch ( ( ) => "/:project?/reference/*?" , {
126- project : [ "solid-router" , "solid-meta" , "solid-start" ] ,
127- } ) ;
104+ const isReference = useMatch ( ( ) => "*/reference/*?" ) ;
128105
129106 const initialTab = ( ) => ( isReference ( ) ? "reference" : "learn" ) ;
130107
131108 const [ selectedTab , setSelectedTab ] = createSignal ( initialTab ( ) ) ;
132109
133110 const sidebar = useSidebar ( ) ;
134111
135- createEffect ( ( ) => console . log ( sidebar ( ) ) ) ;
112+ const sidebarEntries = createMemo ( ( ) => {
113+ const projects = useSolidBaseContext ( ) . config ( ) . themeConfig ?. projects ?? [ ] ;
114+ const projectNames = projects . map ( ( p ) => p . name . replaceAll ( " " , "" ) ) ;
115+
116+ return sidebar ( ) . items . filter (
117+ ( i ) =>
118+ ! projectNames . includes ( i . title . replaceAll ( " " , "" ) ) &&
119+ ( ! ( "link" in i ) || i . link !== "/" )
120+ ) ;
121+ } ) ;
122+
123+ createEffect ( ( ) => console . log ( sidebar ( ) , sidebarEntries ( ) ) ) ;
136124
137125 /**
138126 * Re-syncs the selected tab with the chosen route.
@@ -142,7 +130,7 @@ export function MainNavigation(props: MainNavigationProps) {
142130
143131 if ( to . includes ( "/reference/" ) ) {
144132 setSelectedTab ( "reference" ) ;
145- } else if ( to . includes ( "/learn/" ) ) {
133+ } else {
146134 setSelectedTab ( "learn" ) ;
147135 }
148136 } ) ;
@@ -169,15 +157,17 @@ export function MainNavigation(props: MainNavigationProps) {
169157 >
170158 Reference
171159 </ Tabs . Trigger >
172- < Tabs . Indicator class = "duration-250 absolute bottom-0 h-[2px] bg-blue-500 transition-all dark:bg-blue-500" />
160+ < Tabs . Indicator class = "absolute bottom-0 h-[2px] bg-blue-500 transition-all duration-250 dark:bg-blue-500" />
173161 </ Tabs . List >
174162 < Tabs . Content value = "learn" class = "relative mt-5 w-full" >
175163 < Show
176164 when = { true }
177165 fallback = { < p class = "text-white" > No routes found</ p > }
178166 >
179167 < ul role = "list" class = "space-y-3 px-4" >
180- < DirList list = { [ ] } />
168+ < DirList
169+ items = { sidebarEntries ( ) . filter ( ( e ) => e . title !== "Reference" ) }
170+ />
181171 </ ul >
182172 </ Show >
183173 </ Tabs . Content >
@@ -187,7 +177,11 @@ export function MainNavigation(props: MainNavigationProps) {
187177 fallback = { < p class = "text-white" > No routes found</ p > }
188178 >
189179 < ul role = "list" class = "space-y-3 px-4" >
190- < DirList list = { [ ] } />
180+ < DirList
181+ items = { sidebarEntries ( ) . flatMap ( ( e ) =>
182+ e . title === "Reference" && "items" in e ? e . items : [ ]
183+ ) }
184+ />
191185 </ ul >
192186 </ Show >
193187 </ Tabs . Content >
0 commit comments