<!DOCTYPE html>
<html>

  <head>
    <base href="." />
    <script type="text/javascript" charset="utf-8">
      window.AngularVersionForThisPlunker = 'latest'
    </script>
    <title>angular playground</title>
    <link rel="stylesheet" href="style.css" />
    <script src="https://unpkg.com/core-js@2.4.1/client/shim.min.js"></script>
    <script src="https://unpkg.com/zone.js/dist/zone.js"></script>
    <script src="https://unpkg.com/zone.js/dist/long-stack-trace-zone.js"></script>
    <script src="https://unpkg.com/reflect-metadata@0.1.3/Reflect.js"></script>
    <script src="https://unpkg.com/systemjs@0.19.31/dist/system.js"></script>
    <script src="config.js"></script>
    <script>
    System.import('app')
      .catch(console.error.bind(console));
  </script>
  </head>

  <body>
    <my-app>
    loading...
  </my-app>
  </body>

</html>
/* Styles go here */

### Angular Starter Plunker - Typescript
var angularVersion;
if(window.AngularVersionForThisPlunker === 'latest'){
  angularVersion = ''; //picks up latest
}
else {
  angularVersion = '@' + window.AngularVersionForThisPlunker;
}

System.config({
  //use typescript for compilation
  transpiler: 'typescript',
  //typescript compiler options
  typescriptOptions: {
    emitDecoratorMetadata: true
  },
  paths: {
    'npm:': 'https://unpkg.com/'
  },
  //map tells the System loader where to look for things
  map: {
    
    'app': './src',
    '@angular/core': 'npm:@angular/core'+ angularVersion + '/bundles/core.umd.js',
    '@angular/common': 'npm:@angular/common' + angularVersion + '/bundles/common.umd.js',
    '@angular/common/http': 'npm:@angular/common' + angularVersion + '/bundles/common-http.umd.js',
    '@angular/compiler': 'npm:@angular/compiler' + angularVersion  + '/bundles/compiler.umd.js',
    '@angular/platform-browser': 'npm:@angular/platform-browser' + angularVersion + '/bundles/platform-browser.umd.js',
    '@angular/platform-browser-dynamic': 'npm:@angular/platform-browser-dynamic' + angularVersion + '/bundles/platform-browser-dynamic.umd.js',
    '@angular/http': 'npm:@angular/http' + angularVersion + '/bundles/http.umd.js',
    '@angular/router': 'npm:@angular/router' + angularVersion +'/bundles/router.umd.js',
    '@angular/forms': 'npm:@angular/forms' + angularVersion + '/bundles/forms.umd.js',
    '@angular/animations': 'npm:@angular/animations' + angularVersion + '/bundles/animations.umd.js',
    '@angular/platform-browser/animations': 'npm:@angular/platform-browser' + angularVersion + '/bundles/platform-browser-animations.umd.js',
    '@angular/animations/browser': 'npm:@angular/animations' + angularVersion + '/bundles/animations-browser.umd.js',
    
    '@angular/core/testing': 'npm:@angular/core' + angularVersion + '/bundles/core-testing.umd.js',
    '@angular/common/testing': 'npm:@angular/common' + angularVersion + '/bundles/common-testing.umd.js',
    '@angular/common/http/testing': 'npm:@angular/common' + angularVersion + '/bundles/common-http-testing.umd.js',
    '@angular/compiler/testing': 'npm:@angular/compiler' + angularVersion + '/bundles/compiler-testing.umd.js',
    '@angular/platform-browser/testing': 'npm:@angular/platform-browser' + angularVersion + '/bundles/platform-browser-testing.umd.js',
    '@angular/platform-browser-dynamic/testing': 'npm:@angular/platform-browser-dynamic' + angularVersion + '/bundles/platform-browser-dynamic-testing.umd.js',
    '@angular/http/testing': 'npm:@angular/http' + angularVersion + '/bundles/http-testing.umd.js',
    '@angular/router/testing': 'npm:@angular/router' + angularVersion + '/bundles/router-testing.umd.js',
    'tslib': 'npm:tslib@1.6.1',
    'rxjs': 'npm:rxjs',
    'rxjs-compat': 'npm:rxjs-compat',
    'rxjs/operators': 'npm:rxjs/operators',
    'ts': 'npm:plugin-typescript',
    'typescript': 'npm:typescript@2.2.1/lib/typescript.js'
  },
  //packages defines our app package
  packages: {
    app: {
      main: './main.ts',
      defaultExtension: 'ts'
    },
    rxjs: {
      main: 'index.js',
      defaultExtension: 'js'
    },
    'rxjs/operators': {
        main: 'index.js',
        defaultExtension: 'js'
    }
  }
});
//main entry point
import {platformBrowserDynamic} from '@angular/platform-browser-dynamic';
import {AppModule} from './app';

platformBrowserDynamic().bootstrapModule(AppModule)
//our root app component
import {Component, NgModule, VERSION} from '@angular/core'
import {BrowserModule} from '@angular/platform-browser'
import {Popup} from './popup'

@Component({
  selector: 'my-app',
  template: `
    <div>
      <h2>Hello {{name}}</h2>
      
<popup #popup1 [title]="'Title of Popup1'">
    <p>html content of  Popup1</p>
    <popup #popup11 [title]="'Title of Popup11'">
        <p>html content of Popup1.1</p>
        <popup #popup111 [title]="'Title of Popup111'">
            <p>html content of  Popup1.1.1</p>
        </popup>
        <button md-button (click)="popup111.appear()">show popup 1.1.1</button>
    </popup>
    <popup #popup12 [title]="'Title of Popup12'">
        <p>html content of  Popup1.2</p>
    </popup>
    <button md-button (click)="popup11.appear()">show popup 1.1</button>
    <button md-button (click)="popup12.appear()">show popup 1.2</button>
</popup>
<popup #popup2 [title]="'Title of Popup2'">
    <p>html content of  Popup2</p>
</popup>
<button md-button (click)="popup1.appear()">show popup 1</button>
<button md-button (click)="popup2.appear()">show popup 2</button>

    </div>
  `,
})
export class App {
  name:string;
  showPopup1: boolean;
    showPopup11: boolean;
    showPopup111: boolean;
    showPopup12: boolean;
    showPopup2: boolean;
  constructor() {
    this.name = `Angular! v${VERSION.full}`
  }
  showPopup(num: number) {
        this["showPopup" + num] = true;
    }


    hidePopup(num: number) {
        this["showPopup" + num] = false;
    }
}

@NgModule({
  imports: [ BrowserModule ],
  declarations: [ App, Popup ],
  bootstrap: [ App ]
})
export class AppModule {}
import { Component, Input, Output, EventEmitter, AfterContentInit, ContentChildren, QueryList, ElementRef, Renderer2 } from '@angular/core';

@Component({
    selector: 'popup',
    templateUrl: 'src/popup.html',
    styleUrls: ['src/popup.css']
})
export class Popup implements AfterContentInit {
    @ContentChildren(Popup) popupChildren: QueryList<PopUpComponent>

    private show = false;

    @Input() title: string;

    mousemoveEvent: any;
    mouseupEvent: any;

    fatherPopup: Popup;
    firstPopupX: number = 100;
    firstPopupY: number = 100;
    firstPopupZ: number = 3;
    xStep: number = 30;
    yStep: number = 30;
    zStep: number = 3;
    curX: number;
    curY: number;
    curZIndex: number;
    xStartElementPoint: number;
    yStartElementPoint: number;
    xStartMousePoint: number;
    yStartMousePoint: number;

    isMouseBtnOnPress: boolean;

    constructor(private elementRef: ElementRef,
        private renderer: Renderer2) {
        this.mouseup = this.unboundMouseup.bind(this);
        this.dragging = this.unboundDragging.bind(this);
    }

    ngAfterContentInit() {
        for (var i = 1, l = this.popupChildren.length; i < l; i++) {
            this.popupChildren["_results"][i].fatherPopup = this;
        }
    }

    isTopPopup(): boolean {
        return !this.hasAnyShowChild();
    }

    hasAnyShowChild(): boolean {
        for (var i = 1, l = this.popupChildren.length; i < l; i++) {
            if (this.popupChildren["_results"][i].show)
                return true;
        }
        return false;
    }

    appear() {
        //prevent drag event 
        document.getSelection().removeAllRanges();
        this.setPos();
        this.show = true;
    }

    disappear() {
        if (this.isTopPopup()) {
            this.show = false;
        }
    }

    setPos() {
        if (this.fatherPopup == undefined) {
            this.curX = this.firstPopupX;
            this.curY = this.firstPopupY;
            this.curZIndex = this.firstPopupZ;
        }
        else {
            this.curX = this.fatherPopup.curX + this.xStep;
            this.curY = this.fatherPopup.curY + this.yStep;
            this.curZIndex = this.fatherPopup.curZIndex + this.zStep;
        }
    }

    mouseup: (event: any) => void;
    unboundMouseup(event: any) {
        // Remove listeners
        this.mousemoveEvent();
        this.mouseupEvent();
    }

    mousedown(event: any) {
        if (this.isTopPopup() && event.button === 0/*only left mouse click*/) {
            this.xStartElementPoint = this.curX;
            this.yStartElementPoint = this.curY;
            this.xStartMousePoint = event.pageX;
            this.yStartMousePoint = event.pageY;

            // if listeners exist, first Remove listeners
            if (this.mousemoveEvent)
                this.mousemoveEvent();
            if (this.mouseupEvent)
                this.mouseupEvent();

            this.mousemoveEvent = this.renderer.listen("document", "mousemove", this.dragging);
            this.mouseupEvent = this.renderer.listen("document", "mouseup", this.mouseup);
        }
    }
    dragging: (event: any) => void;
    unboundDragging(event: any) {
        this.curX = this.xStartElementPoint + (event.pageX - this.xStartMousePoint);
        this.curY = this.yStartElementPoint + (event.pageY - this.yStartMousePoint);
    }
}
<div class="popup" *ngIf="show">

    <div class="popup-win"
         [ngStyle]="{'top': curY + 'px', 'left': curX + 'px','z-index': curZIndex}"
          (mousedown)="mousedown($event)">
        <div class="popup-title-bar popup-drag">
            <h2>
                {{title}}
            </h2>
        </div>

        <div class="popup-content">
            <ng-content></ng-content>
        </div>
    </div>

    <div class="popup-overlay blur-in" [ngStyle]="{'z-index': curZIndex - 1}" (click)="disappear()">
    </div>
</div>

.popup-win {
    position: fixed;
    min-width: 300px;
    box-shadow: 0 11px 15px -7px rgba(0,0,0,.2), 0 24px 38px 3px rgba(0,0,0,.14), 0 9px 46px 8px rgba(0,0,0,.12);
}

.popup-content {
    opacity: 1;
    padding: 15px;
    background-color: #fff;
}

.popup-overlay {
    /*justify-content: center;*/
    /*align-items: center;*/
    position: fixed;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
    -webkit-tap-highlight-color: transparent;
    transition: opacity .4s cubic-bezier(.25,.8,.25,1);
    opacity: 0.5;
    background: rgba(0,0,0,.6);
}

.blur-in {
    -webkit-animation: blur 2s forwards;
    -moz-animation: blur 2s forwards;
    -o-animation: blur 2s forwards;
    animation: blur 2s forwards;
}

.blur-out {
    -webkit-animation: blur-out 2s forwards;
    -moz-animation: blur-out 2s forwards;
    -o-animation: blur-out 2s forwards;
    animation: blur-out 2s forwards;
}

.popup-title-bar {
    text-align: center;
    padding-top: 15px;
    padding-bottom: 15px;
    color: #fff;
    background-color: #07a5e7;
}