73 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			73 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @file
							 | 
						||
| 
								 | 
							
								 * Prevents flicker of the toolbar on page load.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(() => {
							 | 
						||
| 
								 | 
							
								  const toolbarState = sessionStorage.getItem('Drupal.toolbar.toolbarState')
							 | 
						||
| 
								 | 
							
								    ? JSON.parse(sessionStorage.getItem('Drupal.toolbar.toolbarState'))
							 | 
						||
| 
								 | 
							
								    : false;
							 | 
						||
| 
								 | 
							
								  // These are classes that toolbar typically adds to <body>, but this code
							 | 
						||
| 
								 | 
							
								  // executes before the first paint, when <body> is not yet present. The
							 | 
						||
| 
								 | 
							
								  // classes are added to <html> so styling immediately reflects the current
							 | 
						||
| 
								 | 
							
								  // toolbar state. The classes are removed after the toolbar completes
							 | 
						||
| 
								 | 
							
								  // initialization.
							 | 
						||
| 
								 | 
							
								  const classesToAdd = ['toolbar-loading', 'toolbar-anti-flicker'];
							 | 
						||
| 
								 | 
							
								  if (toolbarState) {
							 | 
						||
| 
								 | 
							
								    const {
							 | 
						||
| 
								 | 
							
								      orientation,
							 | 
						||
| 
								 | 
							
								      hasActiveTab,
							 | 
						||
| 
								 | 
							
								      isFixed,
							 | 
						||
| 
								 | 
							
								      activeTray,
							 | 
						||
| 
								 | 
							
								      activeTabId,
							 | 
						||
| 
								 | 
							
								      isOriented,
							 | 
						||
| 
								 | 
							
								      userButtonMinWidth,
							 | 
						||
| 
								 | 
							
								    } = toolbarState;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    classesToAdd.push(
							 | 
						||
| 
								 | 
							
								      orientation ? `toolbar-${orientation}` : 'toolbar-horizontal',
							 | 
						||
| 
								 | 
							
								    );
							 | 
						||
| 
								 | 
							
								    if (hasActiveTab !== false) {
							 | 
						||
| 
								 | 
							
								      classesToAdd.push('toolbar-tray-open');
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    if (isFixed) {
							 | 
						||
| 
								 | 
							
								      classesToAdd.push('toolbar-fixed');
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    if (isOriented) {
							 | 
						||
| 
								 | 
							
								      classesToAdd.push('toolbar-oriented');
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (activeTray) {
							 | 
						||
| 
								 | 
							
								      // These styles are added so the active tab/tray styles are present
							 | 
						||
| 
								 | 
							
								      // immediately instead of "flickering" on as the toolbar initializes. In
							 | 
						||
| 
								 | 
							
								      // instances where a tray is lazy loaded, these styles facilitate the
							 | 
						||
| 
								 | 
							
								      // lazy loaded tray appearing gracefully and without reflow.
							 | 
						||
| 
								 | 
							
								      const styleContent = `
							 | 
						||
| 
								 | 
							
								      .toolbar-loading #${activeTabId} {
							 | 
						||
| 
								 | 
							
								        background-image: linear-gradient(rgba(255, 255, 255, 0.25) 20%, transparent 200%);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      .toolbar-loading #${activeTabId}-tray {
							 | 
						||
| 
								 | 
							
								        display: block; box-shadow: -1px 0 5px 2px rgb(0 0 0 / 33%);
							 | 
						||
| 
								 | 
							
								        border-right: 1px solid #aaa; background-color: #f5f5f5;
							 | 
						||
| 
								 | 
							
								        z-index: 0;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      .toolbar-loading.toolbar-vertical.toolbar-tray-open #${activeTabId}-tray {
							 | 
						||
| 
								 | 
							
								        width: 15rem; height: 100vh;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								     .toolbar-loading.toolbar-horizontal :not(#${activeTray}) > .toolbar-lining {opacity: 0}`;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      const style = document.createElement('style');
							 | 
						||
| 
								 | 
							
								      style.textContent = styleContent;
							 | 
						||
| 
								 | 
							
								      style.setAttribute('data-toolbar-anti-flicker-loading', true);
							 | 
						||
| 
								 | 
							
								      document.querySelector('head').appendChild(style);
							 | 
						||
| 
								 | 
							
								      if (userButtonMinWidth) {
							 | 
						||
| 
								 | 
							
								        const userButtonStyle = document.createElement('style');
							 | 
						||
| 
								 | 
							
								        userButtonStyle.textContent = `
							 | 
						||
| 
								 | 
							
								        #toolbar-item-user {min-width: ${userButtonMinWidth}px;}`;
							 | 
						||
| 
								 | 
							
								        document.querySelector('head').appendChild(userButtonStyle);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  document.querySelector('html').classList.add(...classesToAdd);
							 | 
						||
| 
								 | 
							
								})();
							 |