@@ -13,6 +13,7 @@ function resolveApiBase() {
1313
1414const body = document . body ;
1515const sidebar = document . querySelector ( "#sidebar" ) ;
16+ const sidebarScrim = document . querySelector ( "#sidebar-scrim" ) ;
1617const sidebarResize = document . querySelector ( "#sidebar-resize" ) ;
1718const mobileMenuButton = document . querySelector ( "#mobile-menu-button" ) ;
1819const sidebarCloseButton = document . querySelector ( "#sidebar-close-button" ) ;
@@ -72,6 +73,7 @@ const helpClose = document.querySelector("#help-close");
7273helpBackdrop . addEventListener ( "click" , ( ) => { helpModal . hidden = true ; } ) ;
7374helpClose . addEventListener ( "click" , ( ) => { helpModal . hidden = true ; } ) ;
7475const documentList = document . querySelector ( "#document-list" ) ;
76+ const pageShell = document . querySelector ( ".page-shell" ) ;
7577const documentRowTemplate = document . querySelector ( "#document-row-template" ) ;
7678const breadcrumb = document . querySelector ( "#breadcrumb" ) ;
7779const toolbarTitle = document . querySelector ( "#toolbar-title" ) ;
@@ -134,6 +136,7 @@ let activeTaskPanelTask = null;
134136let activeTaskPanelArtifacts = [ ] ;
135137let activeBundlePanelId = null ;
136138let activeBundlePanelData = null ;
139+ let lastSidebarOpener = null ;
137140
138141let allDocuments = [ ] ;
139142let visibleDocuments = [ ] ;
@@ -154,6 +157,7 @@ const LIST_LIMIT = 120;
154157
155158mobileMenuButton . addEventListener ( "click" , openSidebar ) ;
156159sidebarCloseButton . addEventListener ( "click" , closeSidebar ) ;
160+ sidebarScrim ?. addEventListener ( "click" , closeSidebar ) ;
157161sidebarCollapseButton . addEventListener ( "click" , ( ) => setSidebarCollapsed ( true ) ) ;
158162sidebarExpandButton . addEventListener ( "click" , ( ) => setSidebarCollapsed ( false ) ) ;
159163themeToggleButton . addEventListener ( "click" , ( ) => setDarkMode ( ! body . classList . contains ( "dark" ) ) ) ;
@@ -186,6 +190,7 @@ documentTitle.addEventListener("keydown", (event) => {
186190 }
187191} ) ;
188192window . addEventListener ( "resize" , resizeDocumentTitle ) ;
193+ window . addEventListener ( "resize" , syncSidebarShellState ) ;
189194editor . addEventListener ( "input" , ( ) => {
190195 if ( ! currentDoc ) return ;
191196 storeDraft ( ) ;
@@ -286,6 +291,7 @@ restoreDarkMode();
286291restoreSidebarCollapsed ( ) ;
287292restoreSidebarWidth ( ) ;
288293attachSidebarResize ( ) ;
294+ syncSidebarShellState ( ) ;
289295
290296function setDarkMode ( on ) {
291297 body . classList . toggle ( "dark" , on ) ;
@@ -447,8 +453,9 @@ function updatePinButton() {
447453 }
448454 docPinButton . hidden = false ;
449455 const pinned = readPins ( ) . has ( currentDoc . path ) ;
450- docPinButton . textContent = pinned ? "★ " : "☆ " ;
456+ docPinButton . textContent = pinned ? "Pinned " : "Pin " ;
451457 docPinButton . title = pinned ? "Unpin from sidebar" : "Pin to sidebar" ;
458+ docPinButton . setAttribute ( "aria-label" , pinned ? "Unpin from sidebar" : "Pin to sidebar" ) ;
452459 docPinButton . classList . toggle ( "is-pinned" , pinned ) ;
453460}
454461
@@ -471,7 +478,7 @@ function renderPinned() {
471478 label . textContent = doc . title || basename ( path ) ;
472479 const star = document . createElement ( "span" ) ;
473480 star . className = "recent-row-when" ;
474- star . textContent = "★ " ;
481+ star . textContent = "Pinned " ;
475482 btn . append ( label , star ) ;
476483 btn . addEventListener ( "click" , ( ) => openDocument ( path ) ) ;
477484 return btn ;
@@ -3824,8 +3831,45 @@ function setView(view) {
38243831
38253832const FOCUSABLE_SELECTOR = 'button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])' ;
38263833
3834+ function isMobileShell ( ) {
3835+ return window . matchMedia ( "(max-width: 820px)" ) . matches ;
3836+ }
3837+
3838+ function syncSidebarShellState ( ) {
3839+ const open = body . classList . contains ( "sidebar-open" ) ;
3840+ if ( ! isMobileShell ( ) ) {
3841+ body . classList . remove ( "sidebar-open" ) ;
3842+ sidebarScrim . hidden = true ;
3843+ mobileMenuButton . setAttribute ( "aria-expanded" , "false" ) ;
3844+ sidebar . removeAttribute ( "role" ) ;
3845+ sidebar . removeAttribute ( "aria-modal" ) ;
3846+ sidebar . removeAttribute ( "aria-hidden" ) ;
3847+ pageShell . inert = false ;
3848+ if ( mobileWorkBellButton ) mobileWorkBellButton . inert = false ;
3849+ mobileNewButton . inert = false ;
3850+ document . removeEventListener ( "keydown" , handleSidebarKeydown ) ;
3851+ return ;
3852+ }
3853+ sidebarScrim . hidden = ! open ;
3854+ mobileMenuButton . setAttribute ( "aria-expanded" , open ? "true" : "false" ) ;
3855+ if ( open ) {
3856+ sidebar . setAttribute ( "role" , "dialog" ) ;
3857+ sidebar . setAttribute ( "aria-modal" , "true" ) ;
3858+ sidebar . removeAttribute ( "aria-hidden" ) ;
3859+ } else {
3860+ sidebar . removeAttribute ( "role" ) ;
3861+ sidebar . removeAttribute ( "aria-modal" ) ;
3862+ sidebar . setAttribute ( "aria-hidden" , "true" ) ;
3863+ }
3864+ pageShell . inert = open ;
3865+ if ( mobileWorkBellButton ) mobileWorkBellButton . inert = open ;
3866+ mobileNewButton . inert = open ;
3867+ }
3868+
38273869function openSidebar ( ) {
3870+ lastSidebarOpener = document . activeElement instanceof HTMLElement ? document . activeElement : mobileMenuButton ;
38283871 body . classList . add ( "sidebar-open" ) ;
3872+ syncSidebarShellState ( ) ;
38293873 document . addEventListener ( "keydown" , handleSidebarKeydown ) ;
38303874 const first = sidebar . querySelector ( FOCUSABLE_SELECTOR ) ;
38313875 first ?. focus ( ) ;
@@ -3834,10 +3878,11 @@ function openSidebar() {
38343878function closeSidebar ( ) {
38353879 if ( ! body . classList . contains ( "sidebar-open" ) ) return ;
38363880 body . classList . remove ( "sidebar-open" ) ;
3881+ syncSidebarShellState ( ) ;
38373882 document . removeEventListener ( "keydown" , handleSidebarKeydown ) ;
3838- if ( sidebar . contains ( document . activeElement ) ) {
3839- mobileMenuButton . focus ( ) ;
3840- }
3883+ const focusTarget = lastSidebarOpener ?. isConnected ? lastSidebarOpener : mobileMenuButton ;
3884+ if ( focusTarget instanceof HTMLElement ) focusTarget . focus ( ) ;
3885+ lastSidebarOpener = null ;
38413886}
38423887
38433888function handleSidebarKeydown ( event ) {
0 commit comments