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);
 | 
						|
})();
 |