@@ -10,6 +10,7 @@ type MenuItem = {
1010
1111const ensureMenuSkeleton = ( ) => {
1212 const root = document . querySelector ( '[role="main"]' ) || document . body
13+ const headerHost = document . getElementById ( 'mainSolidUiHeader' ) || document . querySelector ( 'solid-ui-header' ) || document . getElementById ( 'PageHeader' )
1314
1415 let navMenu = document . getElementById ( 'NavMenu' ) as HTMLElement | null
1516 if ( ! navMenu ) {
@@ -39,6 +40,12 @@ const ensureMenuSkeleton = () => {
3940 toggle . type = 'button'
4041 toggle . setAttribute ( 'aria-label' , 'Toggle navigation menu' )
4142 toggle . textContent = '\u2630'
43+ }
44+
45+ toggle . slot = 'navigation-toggle'
46+ if ( headerHost && toggle . parentElement !== headerHost ) {
47+ headerHost . appendChild ( toggle )
48+ } else if ( ! headerHost && toggle . parentElement !== root ) {
4249 root . insertBefore ( toggle , root . firstChild )
4350 }
4451
@@ -101,6 +108,42 @@ const renderMenuItems = async (outliner: OutlineManager, container: HTMLElement)
101108 container . replaceChildren ( ...menuItems . map ( createMenuButton ) )
102109}
103110
111+ const applyMobileMenuStyles = ( navMenu : HTMLElement , isOpen : boolean ) => {
112+ navMenu . hidden = false
113+ navMenu . style . position = 'fixed'
114+ navMenu . style . top = 'var(--app-header-height, 4.5rem)'
115+ navMenu . style . left = '0'
116+ navMenu . style . bottom = '0'
117+ navMenu . style . width = 'min(80vw, 320px)'
118+ navMenu . style . maxWidth = 'min(80vw, 320px)'
119+ navMenu . style . zIndex = '110'
120+ navMenu . style . display = 'block'
121+ navMenu . style . visibility = 'visible'
122+ navMenu . style . overflowY = 'auto'
123+ navMenu . style . background = 'var(--color-background)'
124+ navMenu . style . borderRight = '1px solid var(--color-border)'
125+ navMenu . style . boxShadow = '0 0.75rem 2rem rgba(0, 0, 0, 0.2)'
126+ navMenu . style . transform = isOpen ? 'translateX(0)' : 'translateX(-100%)'
127+ }
128+
129+ const clearDesktopMenuStyles = ( navMenu : HTMLElement ) => {
130+ navMenu . hidden = false
131+ navMenu . style . position = ''
132+ navMenu . style . top = ''
133+ navMenu . style . left = ''
134+ navMenu . style . bottom = ''
135+ navMenu . style . width = ''
136+ navMenu . style . maxWidth = ''
137+ navMenu . style . zIndex = ''
138+ navMenu . style . display = ''
139+ navMenu . style . visibility = ''
140+ navMenu . style . overflowY = ''
141+ navMenu . style . background = ''
142+ navMenu . style . borderRight = ''
143+ navMenu . style . boxShadow = ''
144+ navMenu . style . transform = ''
145+ }
146+
104147export const refreshMenu = ( layout : 'mobile' | 'desktop' ) => {
105148 const navMenu = document . getElementById ( 'NavMenu' ) as HTMLElement | null
106149 const toggle = document . getElementById ( 'MenuToggleBtn' ) as HTMLButtonElement | null
@@ -111,15 +154,15 @@ export const refreshMenu = (layout: 'mobile' | 'desktop') => {
111154 if ( layout === 'mobile' ) {
112155 navMenu . classList . add ( 'mobile-hidden' )
113156 navMenu . classList . remove ( 'mobile-visible' )
157+ applyMobileMenuStyles ( navMenu , false )
114158 toggle . hidden = false
115159 overlay . hidden = true
116- navMenu . hidden = false
117160 toggle . setAttribute ( 'aria-expanded' , 'false' )
118161 } else {
119162 navMenu . classList . remove ( 'mobile-hidden' , 'mobile-visible' )
163+ clearDesktopMenuStyles ( navMenu )
120164 toggle . hidden = true
121165 overlay . hidden = true
122- navMenu . hidden = false
123166 toggle . setAttribute ( 'aria-expanded' , 'false' )
124167 }
125168}
@@ -135,6 +178,7 @@ export const createLeftSideMenu = async (outliner: OutlineManager) => {
135178 if ( ! navMenu || ! menuToggle || ! menuOverlay ) return
136179 navMenu . classList . remove ( 'mobile-visible' )
137180 navMenu . classList . add ( 'mobile-hidden' )
181+ applyMobileMenuStyles ( navMenu , false )
138182 menuToggle . setAttribute ( 'aria-expanded' , 'false' )
139183 menuOverlay . hidden = true
140184 }
@@ -143,6 +187,7 @@ export const createLeftSideMenu = async (outliner: OutlineManager) => {
143187 if ( ! navMenu || ! menuToggle || ! menuOverlay ) return
144188 navMenu . classList . remove ( 'mobile-hidden' )
145189 navMenu . classList . add ( 'mobile-visible' )
190+ applyMobileMenuStyles ( navMenu , true )
146191 menuToggle . setAttribute ( 'aria-expanded' , 'true' )
147192 menuOverlay . hidden = false
148193 }
@@ -184,6 +229,8 @@ export const createLeftSideMenu = async (outliner: OutlineManager) => {
184229 }
185230 } )
186231 }
232+
233+ refreshMenu ( outliner . context ?. environment ?. layout === 'mobile' ? 'mobile' : 'desktop' )
187234}
188235
189236async function openDashboardPane ( outliner : any , pane : string ) : Promise < void > {
0 commit comments