aboutsummaryrefslogtreecommitdiff
path: root/static/presentations/2021-11-13/garage/js/controllers/focus.js
diff options
context:
space:
mode:
Diffstat (limited to 'static/presentations/2021-11-13/garage/js/controllers/focus.js')
-rw-r--r--static/presentations/2021-11-13/garage/js/controllers/focus.js97
1 files changed, 97 insertions, 0 deletions
diff --git a/static/presentations/2021-11-13/garage/js/controllers/focus.js b/static/presentations/2021-11-13/garage/js/controllers/focus.js
new file mode 100644
index 0000000..2191807
--- /dev/null
+++ b/static/presentations/2021-11-13/garage/js/controllers/focus.js
@@ -0,0 +1,97 @@
+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;
+
+ }
+
+ onRevealPointerDown( event ) {
+
+ this.focus();
+
+ }
+
+ onDocumentPointerDown( event ) {
+
+ let revealElement = closest( event.target, '.reveal' );
+ if( !revealElement || revealElement !== this.Reveal.getRevealElement() ) {
+ this.blur();
+ }
+
+ }
+
+} \ No newline at end of file