90 lines
		
	
	
		
			No EOL
		
	
	
		
			2.3 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			90 lines
		
	
	
		
			No EOL
		
	
	
		
			2.3 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
| <:Window bind:innerHeight />
 | |
| <Nav page={{page}} />
 | |
| 
 | |
| <div class="container" on:scroll="onScroll(event)" on:fullscreen="onFullscreenChange()" ref:node>
 | |
|   <main>
 | |
|     <slot></slot>
 | |
|   </main>
 | |
| </div>
 | |
| <script>
 | |
| 	import Nav from './Nav.html';
 | |
| 	import { virtualListStore } from '../_utils/virtualListStore'
 | |
| 
 | |
|   import debounce from 'lodash/debounce'
 | |
|   import throttle from 'lodash/throttle'
 | |
|   import { isFullscreen, attachFullscreenListener, detachFullscreenListener } from '../_utils/fullscreen'
 | |
|   import { mark, stop } from '../_utils/marks'
 | |
| 
 | |
|   const SCROLL_EVENT_DELAY = 300
 | |
|   const RESIZE_EVENT_DELAY = 700
 | |
| 
 | |
| 	export default {
 | |
| 	  oncreate() {
 | |
|       mark('onCreate Layout')
 | |
|       let node = this.refs.node
 | |
|       this.observe('innerHeight', debounce(() => {
 | |
|         // respond to window resize events
 | |
|         this.store.set({
 | |
|           offsetHeight: node.offsetHeight
 | |
|         })
 | |
|       }, RESIZE_EVENT_DELAY))
 | |
| 	    this.store.set({
 | |
|         scrollTop: node.scrollTop,
 | |
|         scrollHeight: node.scrollHeight,
 | |
|         offsetHeight: node.offsetHeight
 | |
|       })
 | |
|       stop('onCreate Layout')
 | |
|     },
 | |
| 		components: {
 | |
| 			Nav
 | |
| 		},
 | |
|     store: () => virtualListStore,
 | |
|     events: {
 | |
|       scroll(node, callback) {
 | |
|         const onScroll = throttle(event => {
 | |
|           mark('onScroll')
 | |
|           if (this.get('fullscreen')) {
 | |
|             return
 | |
|           }
 | |
|           callback(event)
 | |
|           stop('onScroll')
 | |
|         }, SCROLL_EVENT_DELAY, {
 | |
|           leading: true,
 | |
|           trailing: true
 | |
|         })
 | |
|         node.addEventListener('scroll', onScroll)
 | |
| 
 | |
|         return {
 | |
|           teardown() {
 | |
|             node.removeEventListener('scroll', onScroll)
 | |
|           }
 | |
|         }
 | |
|       },
 | |
|       fullscreen(node, callback) {
 | |
|         const onFullscreen = (() => {
 | |
|           callback()
 | |
|         })
 | |
|         attachFullscreenListener(onFullscreen)
 | |
|         return {
 | |
|           teardown() {
 | |
|             detachFullscreenListener(onFullscreen)
 | |
|           }
 | |
|         }
 | |
|       }
 | |
|     },
 | |
|     methods: {
 | |
| 		  onScroll(event) {
 | |
| 		    this.store.set({
 | |
|           scrollTop: event.target.scrollTop,
 | |
|           scrollHeight: event.target.scrollHeight
 | |
|         })
 | |
|       },
 | |
|       onFullscreenChange() {
 | |
|         mark('onFullscreenChange')
 | |
|         console.log('is fullscreen? ', isFullscreen())
 | |
|         this.set({ fullscreen: isFullscreen() })
 | |
|         stop('onFullscreenChange')
 | |
|       }
 | |
|     }
 | |
| 	};
 | |
| </script> |