@dotglitch/ngx-common
Version:
Angular components and utilities that are commonly used.
255 lines (251 loc) • 14.6 kB
JavaScript
import { NgTemplateOutlet } from '@angular/common';
import * as i0 from '@angular/core';
import { TemplateRef, ContentChild, Component } from '@angular/core';
import gsap from 'gsap';
class TransitionPanelComponent {
constructor(elementRef) {
this.elementRef = elementRef;
}
ngAfterViewInit() {
const el = this.elementRef.nativeElement;
//OPEN TRIGGER
const openTrigger = el.querySelector('.menu-trigger');
const openTriggerTop = openTrigger.querySelector('.menu-trigger-bar.top');
const openTriggerMiddle = openTrigger.querySelector('.menu-trigger-bar.middle');
const openTriggerBottom = openTrigger.querySelector('.menu-trigger-bar.bottom');
//CLOSE TRIGGER
const closeTrigger = el.querySelector('.close-trigger');
const closeTriggerLeft = closeTrigger.querySelector('.close-trigger-bar.left');
const closeTriggerRight = closeTrigger.querySelector('.close-trigger-bar.right');
//LOGO
const front = el.querySelector('.front');
//MENU
const menu = el.querySelector('.back-content');
const menuTop = el.querySelector('.rect.top');
const menuMiddle = el.querySelector('.rect.middle');
const menuBottom = el.querySelector('.rect.bottom');
//TL
const tlOpen = gsap.timeline({
paused: true
});
const tlClose = gsap.timeline({
paused: true
});
//OPEN TIMELINE
tlOpen
.add("preOpen")
.to(front, {
duration: 0.4,
scale: 0.8,
opacity: 0,
ease: "power2.easeOut"
}, "preOpen")
.to(openTriggerTop, {
duration: 0.4,
x: "+80px",
y: "-80px",
delay: 0.1,
ease: "power4.easeIn",
onComplete: function () {
closeTrigger.style['z-index'] = '25';
}
}, "preOpen")
.to(openTriggerMiddle, {
duration: 0.4,
x: "+=80px",
y: "-=80px",
ease: "power4.easeIn",
onComplete: function () {
openTrigger.style['visibility'] = 'hidden';
}
}, "preOpen")
.to(openTriggerBottom, {
duration: 0.4,
x: "+=80px", y: "-=80px", delay: 0.2, ease: "power4.easeIn"
}, "preOpen")
.add("open", "-=0.4")
.to(menuTop, {
duration: 0.8,
bottom: "25%",
right: "25%",
left: "-75%",
top: "-75%",
ease: "power4.inOut"
}, "open")
.to(menuMiddle, {
duration: 0.8,
scaleX: 1,
ease: "power4.inOut"
}, "open")
.to(menuBottom, {
duration: 0.8,
top: "25%",
left: "25%",
right: "-75%",
bottom: "-75%",
ease: "power4.inOut"
}, "open")
.fromTo(menu, {
duration: 0.6,
y: 30,
opacity: 0,
visibility: 'hidden'
}, {
y: 0,
opacity: 1,
visibility: 'visible',
ease: "power4.out"
}, "-=0.2")
.add("preClose", "-=0.8")
.to(closeTriggerLeft, {
duration: 0.8,
x: "-=100px",
y: "+=100px",
ease: "power4.easeOut"
}, "preClose")
.to(closeTriggerRight, {
duration: 0.8,
x: "+=100px",
y: "+=100px",
delay: 0.2,
ease: "power4.easeOut"
}, "preClose");
//CLOSE TIMELINE
tlClose
.add("close")
.to(menuTop, {
duration: 0.2,
backgroundColor: "#6295ca",
ease: "power4.inOut",
onComplete: function () {
front.style['z-index'] = '26';
closeTrigger.style['z-index'] = '5';
openTrigger.style['visibility'] = 'visible';
}
}, "close")
.to(menuMiddle, {
duration: 0.2,
backgroundColor: "#6295ca",
ease: "power4.inOut"
}, "close")
.to(menuBottom, {
duration: 0.2,
backgroundColor: "#6295ca",
ease: "power4.inOut"
}, "close")
.to(menu, {
duration: 0.6,
y: 20,
opacity: 0,
ease: "power4.easeOut",
onComplete: function () {
menu.style['visibility'] = 'hidden';
}
}, "close")
.to(front, {
duration: 0.8,
delay: "+=0.2",
scale: 1,
opacity: 1,
ease: "power4.inOut",
}, "close")
.to(menuTop, {
duration: 0.8,
delay: "+=0.2",
bottom: "100%",
right: "100%",
left: "-50%",
top: "-50%",
ease: "power4.inOut"
}, "close")
.to(menuMiddle, {
duration: 0.8,
delay: "+=0.2",
scaleX: 0,
ease: "power4.inOut"
}, "close")
.to(menuBottom, {
duration: 0.8,
delay: "+=0.2",
bottom: "-50%",
right: "-50%",
left: "100%",
top: "100%",
ease: "power4.inOut",
onComplete: function () {
menuTop.style['background-color'] = '#ffffff';
menuMiddle.style['background-color'] = '#ffffff';
menuBottom.style['background-color'] = '#ffffff';
}
}, "close")
.to(closeTriggerLeft, {
duration: 0.2,
x: "+=100px",
y: "-=100px",
ease: "power4.easeIn"
}, "close")
.to(closeTriggerRight, {
duration: 0.2,
x: "-=100px",
y: "-=100px",
delay: 0.1,
ease: "power4.easeIn"
}, "close")
.to(openTriggerTop, {
duration: 1,
x: "-=80px",
y: "+=80px",
delay: 0.2,
ease: "power4.easeOut"
}, "close")
.to(openTriggerMiddle, {
duration: 1,
x: "-=80px",
y: "+=80px",
ease: "power4.easeOut"
}, "close")
.to(openTriggerBottom, {
duration: 1,
x: "-=80px",
y: "+=80px",
delay: 0.1,
ease: "power4.easeOut"
}, "close");
//EVENTS
openTrigger.onclick = function () {
if (tlOpen.progress() < 1) {
tlOpen.play();
}
else {
tlOpen.restart();
}
};
closeTrigger.onclick = function () {
if (tlClose.progress() < 1) {
tlClose.play();
}
else {
tlClose.restart();
}
};
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TransitionPanelComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: TransitionPanelComponent, isStandalone: true, selector: "ngx-transition-panel", queries: [{ propertyName: "content", first: true, predicate: ["content"], descendants: true, read: TemplateRef }, { propertyName: "background", first: true, predicate: ["background"], descendants: true, read: TemplateRef }], ngImport: i0, template: "<!-- BASEN ON DRIBBBLE SHOT: https://dribbble.com/shots/2209627-UI8-Nav -->\n\n <span class=\"menu-trigger\">\n <span class=\"menu-trigger-bar top\"></span>\n <span class=\"menu-trigger-bar middle\"></span>\n <span class=\"menu-trigger-bar bottom\"></span>\n </span>\n <span class=\"close-trigger\">\n <span class=\"close-trigger-bar left\"></span>\n <span class=\"close-trigger-bar right\"></span>\n </span>\n <span class=\"front\">\n @if (content) {\n <ng-template [ngTemplateOutlet]=\"content\"/>\n }\n @else {\n <ng-content />\n }\n </span>\n <div class=\"inner-container\">\n <span class=\"rect top\"></span>\n <span class=\"rect middle\"></span>\n <span class=\"rect bottom\"></span>\n\n <div class=\"back-content\">\n @if (background) {\n <ng-template [ngTemplateOutlet]=\"background\" />\n }\n </div>\n </div>\n", styles: [":host{display:block;background-color:#222;width:100%;max-width:620px;min-height:568px;margin:0 auto;border-radius:8px;position:relative;overflow:hidden;box-shadow:0 9px 13px #0000004d;transform:scale(1)}.menu-trigger,.close-trigger{position:absolute;top:32px;right:20px;display:block;width:42px;height:42px;cursor:pointer;z-index:333}.menu-trigger:hover .menu-trigger-bar:before,.close-trigger:hover .menu-trigger-bar:before{width:100%}.menu-trigger:hover .close-trigger-bar:before,.close-trigger:hover .close-trigger-bar:before{width:100%}.close-trigger{z-index:5;top:42px}.menu-trigger-bar{display:block;width:100%;height:4px;background-color:#fff;margin-bottom:6px;transform:rotate(-45deg);position:relative}.menu-trigger-bar:before{content:\"\";position:absolute;top:0;left:0;display:block;width:0%;height:100%;background-color:#0003;transition:all .3s cubic-bezier(.55,0,.1,1)}.menu-trigger-bar.top{width:50%}.menu-trigger-bar.middle:before{left:auto;right:0}.menu-trigger-bar.bottom{width:50%;margin-left:50%}.close-trigger-bar{display:block;width:100%;height:4px;background-color:#222;position:relative}.close-trigger-bar:before{content:\"\";position:absolute;top:0;left:0;display:block;width:0%;height:100%;background-color:#fff3;transition:all .3s cubic-bezier(.55,0,.1,1)}.close-trigger-bar.left{transform:translate(100px) translateY(-100px) rotate(-45deg)}.close-trigger-bar.right{transform:translate(-100px) translateY(-100px) rotate(45deg);top:-3px}.inner-container,.menu-container{position:absolute;height:100%;width:100%;left:0;top:0}.inner-container{z-index:20;display:flex;align-items:center}.menu-container{display:flex;align-items:center}.back-content{display:block;width:100%;height:100%}.rect{position:absolute;display:block;inset:-50%;background-color:#fff;transform:rotate(45deg)}.rect.top{bottom:100%;right:100%}.rect.middle{inset:-25%;transform:rotate(45deg) scaleX(0)}.rect.bottom{top:100%;left:100%}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TransitionPanelComponent, decorators: [{
type: Component,
args: [{ selector: 'ngx-transition-panel', imports: [
NgTemplateOutlet
], standalone: true, template: "<!-- BASEN ON DRIBBBLE SHOT: https://dribbble.com/shots/2209627-UI8-Nav -->\n\n <span class=\"menu-trigger\">\n <span class=\"menu-trigger-bar top\"></span>\n <span class=\"menu-trigger-bar middle\"></span>\n <span class=\"menu-trigger-bar bottom\"></span>\n </span>\n <span class=\"close-trigger\">\n <span class=\"close-trigger-bar left\"></span>\n <span class=\"close-trigger-bar right\"></span>\n </span>\n <span class=\"front\">\n @if (content) {\n <ng-template [ngTemplateOutlet]=\"content\"/>\n }\n @else {\n <ng-content />\n }\n </span>\n <div class=\"inner-container\">\n <span class=\"rect top\"></span>\n <span class=\"rect middle\"></span>\n <span class=\"rect bottom\"></span>\n\n <div class=\"back-content\">\n @if (background) {\n <ng-template [ngTemplateOutlet]=\"background\" />\n }\n </div>\n </div>\n", styles: [":host{display:block;background-color:#222;width:100%;max-width:620px;min-height:568px;margin:0 auto;border-radius:8px;position:relative;overflow:hidden;box-shadow:0 9px 13px #0000004d;transform:scale(1)}.menu-trigger,.close-trigger{position:absolute;top:32px;right:20px;display:block;width:42px;height:42px;cursor:pointer;z-index:333}.menu-trigger:hover .menu-trigger-bar:before,.close-trigger:hover .menu-trigger-bar:before{width:100%}.menu-trigger:hover .close-trigger-bar:before,.close-trigger:hover .close-trigger-bar:before{width:100%}.close-trigger{z-index:5;top:42px}.menu-trigger-bar{display:block;width:100%;height:4px;background-color:#fff;margin-bottom:6px;transform:rotate(-45deg);position:relative}.menu-trigger-bar:before{content:\"\";position:absolute;top:0;left:0;display:block;width:0%;height:100%;background-color:#0003;transition:all .3s cubic-bezier(.55,0,.1,1)}.menu-trigger-bar.top{width:50%}.menu-trigger-bar.middle:before{left:auto;right:0}.menu-trigger-bar.bottom{width:50%;margin-left:50%}.close-trigger-bar{display:block;width:100%;height:4px;background-color:#222;position:relative}.close-trigger-bar:before{content:\"\";position:absolute;top:0;left:0;display:block;width:0%;height:100%;background-color:#fff3;transition:all .3s cubic-bezier(.55,0,.1,1)}.close-trigger-bar.left{transform:translate(100px) translateY(-100px) rotate(-45deg)}.close-trigger-bar.right{transform:translate(-100px) translateY(-100px) rotate(45deg);top:-3px}.inner-container,.menu-container{position:absolute;height:100%;width:100%;left:0;top:0}.inner-container{z-index:20;display:flex;align-items:center}.menu-container{display:flex;align-items:center}.back-content{display:block;width:100%;height:100%}.rect{position:absolute;display:block;inset:-50%;background-color:#fff;transform:rotate(45deg)}.rect.top{bottom:100%;right:100%}.rect.middle{inset:-25%;transform:rotate(45deg) scaleX(0)}.rect.bottom{top:100%;left:100%}\n"] }]
}], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { content: [{
type: ContentChild,
args: ['content', { read: TemplateRef }]
}], background: [{
type: ContentChild,
args: ['background', { read: TemplateRef }]
}] } });
/**
* Generated bundle index. Do not edit.
*/
export { TransitionPanelComponent };
//# sourceMappingURL=dotglitch-ngx-common-overlay-wrapper.mjs.map