Last commit:
commit e1c180565e48ae1b595f44edef319872262a99c7
Merge: b8d97d2 f2b0316
Author: Hakim El Hattab <hakim.elhattab@gmail.com>
Date:   Wed Aug 9 15:17:25 2023 +0200
    Merge pull request #3445 from t-fritsch/fix-scss-watch-tasks
    fix scss watch tasks broken on syntax error
		
	
			
		
			
				
	
	
		
			103 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			103 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| import { closest } from '../utils/util.js'
 | |
| 
 | |
| /**
 | |
|  * Manages focus when a presentation is embedded. This
 | |
|  * helps us only capture keyboard from the presentation
 | |
|  * a user is currently interacting with in a page where
 | |
|  * multiple presentations are embedded.
 | |
|  */
 | |
| 
 | |
| const STATE_FOCUS = 'focus';
 | |
| const STATE_BLUR = 'blur';
 | |
| 
 | |
| export default class Focus {
 | |
| 
 | |
| 	constructor( Reveal ) {
 | |
| 
 | |
| 		this.Reveal = Reveal;
 | |
| 
 | |
| 		this.onRevealPointerDown = this.onRevealPointerDown.bind( this );
 | |
| 		this.onDocumentPointerDown = this.onDocumentPointerDown.bind( this );
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Called when the reveal.js config is updated.
 | |
| 	 */
 | |
| 	configure( config, oldConfig ) {
 | |
| 
 | |
| 		if( config.embedded ) {
 | |
| 			this.blur();
 | |
| 		}
 | |
| 		else {
 | |
| 			this.focus();
 | |
| 			this.unbind();
 | |
| 		}
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 	bind() {
 | |
| 
 | |
| 		if( this.Reveal.getConfig().embedded ) {
 | |
| 			this.Reveal.getRevealElement().addEventListener( 'pointerdown', this.onRevealPointerDown, false );
 | |
| 		}
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 	unbind() {
 | |
| 
 | |
| 		this.Reveal.getRevealElement().removeEventListener( 'pointerdown', this.onRevealPointerDown, false );
 | |
| 		document.removeEventListener( 'pointerdown', this.onDocumentPointerDown, false );
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 	focus() {
 | |
| 
 | |
| 		if( this.state !== STATE_FOCUS ) {
 | |
| 			this.Reveal.getRevealElement().classList.add( 'focused' );
 | |
| 			document.addEventListener( 'pointerdown', this.onDocumentPointerDown, false );
 | |
| 		}
 | |
| 
 | |
| 		this.state = STATE_FOCUS;
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 	blur() {
 | |
| 
 | |
| 		if( this.state !== STATE_BLUR ) {
 | |
| 			this.Reveal.getRevealElement().classList.remove( 'focused' );
 | |
| 			document.removeEventListener( 'pointerdown', this.onDocumentPointerDown, false );
 | |
| 		}
 | |
| 
 | |
| 		this.state = STATE_BLUR;
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 	isFocused() {
 | |
| 
 | |
| 		return this.state === STATE_FOCUS;
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 	destroy() {
 | |
| 
 | |
| 		this.Reveal.getRevealElement().classList.remove( 'focused' );
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 	onRevealPointerDown( event ) {
 | |
| 
 | |
| 		this.focus();
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 	onDocumentPointerDown( event ) {
 | |
| 
 | |
| 		let revealElement = closest( event.target, '.reveal' );
 | |
| 		if( !revealElement || revealElement !== this.Reveal.getRevealElement() ) {
 | |
| 			this.blur();
 | |
| 		}
 | |
| 
 | |
| 	}
 | |
| 
 | |
| } |