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