mirror of
				https://github.com/Redocly/redoc.git
				synced 2025-11-04 09:47:31 +03:00 
			
		
		
		
	- renam DOM elements variables to start from $ - use DI for OptionsManager - move loading styles into separate CSS file - minor other refactors
		
			
				
	
	
		
			64 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			64 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
'use strict';
 | 
						|
 | 
						|
import {Directive, ElementRef} from 'angular2/core';
 | 
						|
import {BrowserDomAdapter} from 'angular2/platform/browser';
 | 
						|
 | 
						|
@Directive({
 | 
						|
  selector: '[sticky-sidebar]',
 | 
						|
  inputs: ['scrollParent', 'scrollYOffset']
 | 
						|
})
 | 
						|
@Reflect.metadata('parameters', [[ElementRef], [BrowserDomAdapter]])
 | 
						|
export default class StickySidebar {
 | 
						|
  constructor(elementRef, dom) {
 | 
						|
    this.$element = elementRef.nativeElement;
 | 
						|
    this.dom = dom;
 | 
						|
 | 
						|
    // initial styling
 | 
						|
    this.dom.setStyle(this.$element, 'position', 'absolute');
 | 
						|
    this.dom.setStyle(this.$element, 'top', '0');
 | 
						|
    this.dom.setStyle(this.$element, 'bottom', '0');
 | 
						|
    this.dom.setStyle(this.$element, 'max-height', '100%');
 | 
						|
  }
 | 
						|
 | 
						|
  bind() {
 | 
						|
    this.cancelScrollBinding = this.dom.onAndCancel(this.scrollParent, 'scroll', () => { this.updatePosition(); });
 | 
						|
    this.updatePosition();
 | 
						|
  }
 | 
						|
 | 
						|
  unbind() {
 | 
						|
    this.cancelScrollBinding && this.cancelScrollBinding();
 | 
						|
  }
 | 
						|
 | 
						|
  updatePosition() {
 | 
						|
    if ( this.scrollY + this.scrollYOffset() >= this.$redocEl.offsetTop) {
 | 
						|
      this.stick();
 | 
						|
    } else {
 | 
						|
      this.unstick();
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  stick() {
 | 
						|
    this.dom.setStyle(this.$element, 'position', 'fixed');
 | 
						|
    this.dom.setStyle(this.$element, 'top', this.scrollYOffset() + 'px');
 | 
						|
  }
 | 
						|
 | 
						|
  unstick() {
 | 
						|
    this.dom.setStyle(this.$element, 'position', 'absolute');
 | 
						|
    this.dom.setStyle(this.$element, 'top', 0);
 | 
						|
  }
 | 
						|
 | 
						|
  get scrollY() {
 | 
						|
    return (this.scrollParent.pageYOffset != null) ? this.scrollParent.pageYOffset : this.scrollParent.scrollTop;
 | 
						|
  }
 | 
						|
 | 
						|
  ngOnInit() {
 | 
						|
    // FIXME use more reliable code
 | 
						|
    this.$redocEl = this.$element.offsetParent;
 | 
						|
    this.bind();
 | 
						|
  }
 | 
						|
 | 
						|
  ngOnDestroy() {
 | 
						|
    this.unbind();
 | 
						|
  }
 | 
						|
}
 |