UNPKG

@alyle/ui

Version:

Minimal Design, a set of components for Angular

462 lines (457 loc) 23 kB
import * as i0 from '@angular/core'; import { forwardRef, Inject, Directive, ContentChild, TemplateRef, Input, ViewChild, ChangeDetectionStrategy, Component, NgModule } from '@angular/core'; import * as i1 from '@alyle/ui'; import { XPosition, st2c, LY_COMMON_STYLES, StyleCollection, StyleRenderer, eachMedia, DirPosition, YPosition, LyCommonModule } from '@alyle/ui'; import { coerceBooleanProperty } from '@angular/cdk/coercion'; import * as i2 from '@angular/cdk/scrolling'; import * as i3 from '@angular/cdk/platform'; import { CommonModule } from '@angular/common'; const DEFAULT_MODE = 'side'; const DEFAULT_WIDTH = '230px'; const DEFAULT_VALUE = ''; const STYLE_PRIORITY = -2; const DEFAULT_POSITION = XPosition.before; const STYLES = (theme, ref) => { const __ = ref.selectorsOf(STYLES); return { $name: LyDrawerContent.и, $priority: STYLE_PRIORITY + 1.9, root: () => (theme.drawer && theme.drawer.root && (theme.drawer.root instanceof StyleCollection ? theme.drawer.root.setTransformer(fn => fn(__)).css : theme.drawer.root(__))), drawerContainer: (_className) => `${_className}{display:block;position:relative;overflow:hidden;-webkit-overflow-scrolling:touch;}`, drawer: (_className) => `${_className}{display:block;position:fixed;z-index:${theme.zIndex.drawer};overflow:auto;visibility:hidden;}`, drawerContent: (_className) => `${_className}{display:block;}`, drawerOpened: (_className) => `${_className}{transform:translate(0px,0px);visibility:visible;}`, drawerClosed: null, backdrop: (_className) => `${st2c((LY_COMMON_STYLES.fill), `${_className}`)}${_className}{background-color:${theme.drawer.backdrop};}`, transition: (_className) => `${_className}{transition:${theme.animations.durations.complex}ms ${theme.animations.curves.deceleration};transition-property:transform,margin,visibility;}` }; }; class LyDrawerContent { static { this.и = 'LyDrawerContent'; } constructor(_renderer, _el, drawerContainer) { this._renderer = _renderer; this._el = _el; this._renderer.addClass(this._el.nativeElement, drawerContainer.classes.drawerContent); } _getHostElement() { return this._el.nativeElement; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.10", ngImport: i0, type: LyDrawerContent, deps: [{ token: i0.Renderer2 }, { token: i0.ElementRef }, { token: forwardRef(() => LyDrawerContainer) }], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.10", type: LyDrawerContent, isStandalone: false, selector: "ly-drawer-content", ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.10", ngImport: i0, type: LyDrawerContent, decorators: [{ type: Directive, args: [{ selector: 'ly-drawer-content', standalone: false }] }], ctorParameters: () => [{ type: i0.Renderer2 }, { type: i0.ElementRef }, { type: undefined, decorators: [{ type: Inject, args: [forwardRef(() => LyDrawerContainer)] }] }] }); class LyDrawerContainer { constructor(_renderer, _el, sRenderer) { this._renderer = _renderer; this._el = _el; this.sRenderer = sRenderer; /** @docs-private */ this.classes = this.sRenderer.renderSheet(STYLES, true); this._openDrawers = 0; this._renderer.addClass(this._el.nativeElement, this.classes.drawerContainer); } _getHostElement() { return this._el.nativeElement; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.10", ngImport: i0, type: LyDrawerContainer, deps: [{ token: i0.Renderer2 }, { token: i0.ElementRef }, { token: i1.StyleRenderer }], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.10", type: LyDrawerContainer, isStandalone: false, selector: "ly-drawer-container", providers: [ StyleRenderer ], queries: [{ propertyName: "_drawerContent", first: true, predicate: i0.forwardRef(() => LyDrawerContent), descendants: true, static: true }], ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.10", ngImport: i0, type: LyDrawerContainer, decorators: [{ type: Directive, args: [{ selector: 'ly-drawer-container', providers: [ StyleRenderer ], standalone: false }] }], ctorParameters: () => [{ type: i0.Renderer2 }, { type: i0.ElementRef }, { type: i1.StyleRenderer }], propDecorators: { _drawerContent: [{ type: ContentChild, args: [forwardRef(() => LyDrawerContent), { static: true }] }] } }); class LyDrawer { static { this.и = 'LyDrawer'; } set width(_val) { console.log(LyDrawer.и, this._el.nativeElement); throw new Error(`${LyDrawer.и}: [width] is deprecated instead use [drawerWidth].`); } set height(_val) { console.log(LyDrawer.и, this._el.nativeElement); throw new Error(`${LyDrawer.и}: [height] is deprecated instead use [drawerHeight].`); } set opened(val) { if (val !== this.opened) { this._opened = coerceBooleanProperty(val); this._isOpen = this._opened; } } get opened() { return this._opened; } get hasBackdrop() { return this._hasBackdrop; } set hasBackdrop(val) { this._hasBackdrop = val == null ? null : coerceBooleanProperty(val); } set position(val) { if (val !== this.position) { this._position = val; this[0x1] = this._styleRenderer.add(`${LyDrawer.и}--position-${val}`, (theme) => (_className) => `${_className}{${theme.getDirection(val)}:0;}`, STYLE_PRIORITY, this[0x1]); } } get position() { return this._position; } constructor(_theme, _styleRenderer, _renderer, _el, _drawerContainer, _vcr, _viewportRuler, _cd, _zone, _platform) { this._theme = _theme; this._styleRenderer = _styleRenderer; this._renderer = _renderer; this._el = _el; this._drawerContainer = _drawerContainer; this._vcr = _vcr; this._viewportRuler = _viewportRuler; this._cd = _cd; this._zone = _zone; this._platform = _platform; /** * Styles * @docs-private */ this.classes = this._drawerContainer.classes; this._position = DEFAULT_POSITION; this.mode = DEFAULT_MODE; this._renderer.addClass(this._el.nativeElement, _drawerContainer.classes.drawer); } ngOnChanges() { this._updateBackdrop(); this._updateAnimations(); const __mode = this.mode; const __forceModeOverOpened = this._forceModeOverOpened; const __opened = this.opened; let __width = this.drawerWidth; const __height = this.drawerHeight; const __position = this.position; const __spacingAbove = this.spacingAbove; const __spacingBelow = this.spacingBelow; const __spacingBefore = this.spacingBefore; const __spacingAfter = this.spacingAfter; if (__width && __height) { throw new Error(`\`width\` and \`height\` are defined, you can only define one`); } else if (!__width) { if (!__height) { /** set default __width if `width` & `height` is `undefined` */ __width = DEFAULT_WIDTH; } } if ((this._isOpen && __opened) || (this._isOpen) || __forceModeOverOpened) { /** create styles for mode side */ this._drawerClass = this._theme.updateClass(this._el.nativeElement, this._renderer, this._drawerContainer.classes.drawerOpened, this._drawerClass); // styles for <ly-drawer-content> if (__mode === 'side') { const newKeyDrawerContent = `ly-drawer-content----:${__width || DEFAULT_VALUE}·${__position || DEFAULT_VALUE}`; this._drawerContentClass = this._theme.addStyle(newKeyDrawerContent, (theme) => { const drawerContentStyles = {}; const positionVal = `margin-${__position}`; if (__width) { eachMedia(__width, (val, media) => { const newStyleWidth = val === 'over' ? '0px' : toPx(val); if (media) { const breakPoint = theme.getBreakpoint(media); const styleOfBreakPoint = createEmptyPropOrUseExisting(drawerContentStyles, breakPoint); styleOfBreakPoint[positionVal] = newStyleWidth; } else { drawerContentStyles[positionVal] = newStyleWidth; } }); } return drawerContentStyles; }, this._drawerContainer._drawerContent._getHostElement(), this._drawerContentClass); } else if (this._drawerContentClass) { /** remove styles for <ly-drawer-content> */ this._renderer.removeClass(this._drawerContainer._drawerContent._getHostElement(), this._drawerContentClass); this._drawerContentClass = undefined; } } else { if (this._drawerContentClass) { this._renderer.removeClass(this._drawerContainer._drawerContent._getHostElement(), this._drawerContentClass); this._drawerContentClass = undefined; } if (this._drawerClass) { this._renderer.removeClass(this._el.nativeElement, this._drawerClass); this._drawerClass = undefined; } } /** default styles */ this._drawerRootClass = this._theme.addStyle(`ly-drawer-root:${__width}·${__height}·${__spacingAbove}·${__spacingBelow}·${__spacingBefore}·${__spacingAfter}·${__position}·${__mode}·${__forceModeOverOpened}`, (theme) => { const stylesDrawerRoot = {}; const pos = theme.getDirection(__position); const positionSign = __position === 'above' ? '-' : '+'; if (__width) { const dirXSign = pos === DirPosition.left ? '-' : '+'; eachMedia(__width, (val, media) => { if ((__mode === 'over' || __forceModeOverOpened) && (val === 0 || val === 'over')) { return; } const newVal = val === 'over' ? '0px' : toPx(val); const newStyleWidth = newVal; const newTranslateX = `translateX(${dirXSign + newVal})`; if (media) { const breakPoint = theme.getBreakpoint(media); const styleOfBreakPoint = createEmptyPropOrUseExisting(stylesDrawerRoot, breakPoint); styleOfBreakPoint.width = newStyleWidth; styleOfBreakPoint.transform = newTranslateX; } else { stylesDrawerRoot.width = newStyleWidth; stylesDrawerRoot.transform = newTranslateX; } }); } else if (__height) { eachMedia(__height, (val, media) => { const newStyleHeight = toPx(val); const newTranslateY = `translateY(${positionSign + toPx(val)})`; if (media) { const breakPoint = theme.getBreakpoint(media); const styleOfBreakPoint = createEmptyPropOrUseExisting(stylesDrawerRoot, breakPoint); styleOfBreakPoint.height = newStyleHeight; styleOfBreakPoint.transform = newTranslateY; } else { stylesDrawerRoot.height = newStyleHeight; stylesDrawerRoot.transform = newTranslateY; } }); } if (__position === 'before' || __position === 'after') { eachMedia(__spacingAbove, (val, media) => { const newStyleSpacingTop = toPx(val || 0); if (media) { const breakPoint = theme.getBreakpoint(media); const styleOfBreakPoint = createEmptyPropOrUseExisting(stylesDrawerRoot, breakPoint); styleOfBreakPoint.top = newStyleSpacingTop; } else { stylesDrawerRoot.top = newStyleSpacingTop; } }); eachMedia(__spacingBelow, (val, media) => { const newStyleSpacingBottom = toPx(val || 0); if (media) { const breakPoint = theme.getBreakpoint(media); const styleOfBreakPoint = createEmptyPropOrUseExisting(stylesDrawerRoot, breakPoint); styleOfBreakPoint.bottom = newStyleSpacingBottom; } else { stylesDrawerRoot.bottom = newStyleSpacingBottom; } }); } else if (__position === YPosition.above || __position === YPosition.below) { eachMedia(__spacingBefore, (val, media) => { const newStyleSpacingBefore = toPx(val || 0); if (media) { const breakPoint = theme.getBreakpoint(media); const styleOfBreakPoint = createEmptyPropOrUseExisting(stylesDrawerRoot, breakPoint); styleOfBreakPoint.before = newStyleSpacingBefore; } else { stylesDrawerRoot.before = newStyleSpacingBefore; } }); eachMedia(__spacingAfter, (val, media) => { const newStyleSpacingAfter = toPx(val || 0); if (media) { const breakPoint = theme.getBreakpoint(media); const styleOfBreakPoint = createEmptyPropOrUseExisting(stylesDrawerRoot, breakPoint); styleOfBreakPoint.after = newStyleSpacingAfter; } else { stylesDrawerRoot.after = newStyleSpacingAfter; } }); } return stylesDrawerRoot; }, this._el.nativeElement, this._drawerRootClass, __mode === 'side' ? STYLE_PRIORITY : STYLE_PRIORITY + 1); this._fromToggle = false; } ngAfterViewInit() { if (this._platform.isBrowser) { this._tabResizeSub = this._viewportRuler.change().subscribe(() => { this.ngOnChanges(); }); } } ngOnDestroy() { if (this._tabResizeSub) { this._tabResizeSub.unsubscribe(); } } toggle() { const width = getComputedStyle(this._el.nativeElement).width; this._fromToggle = true; if (width === '0px') { this._forceModeOverOpened = true; this._isOpen = true; } else { if (this._forceModeOverOpened) { this._forceModeOverOpened = false; this._isOpen = this.opened; } else { this._isOpen = !this._isOpen; } } this.ngOnChanges(); } _contentHasMargin() { const content = this._drawerContainer._drawerContent._getHostElement(); const container = this._drawerContainer._getHostElement(); return (content.offsetWidth === container.offsetWidth); } _updateBackdrop() { if (((this._isOpen && this.opened) || this._isOpen) && (this.hasBackdrop != null ? this.hasBackdrop : (this.mode === 'over' || (this._forceModeOverOpened && this._contentHasMargin())))) { // create only if is necessary if (!this._viewRef) { this._zone.run(() => { this._drawerContainer._openDrawers++; this._viewRef = this._vcr.createEmbeddedView(this._backdrop); this._cd.markForCheck(); this._viewRef.rootNodes[0].style.zIndex = `${this._drawerContainer._openDrawers}`; }); } } else if (this._viewRef) { this._zone.run(() => { this._drawerContainer._openDrawers--; this._vcr.clear(); this._viewRef = undefined; this._cd.markForCheck(); if (this._forceModeOverOpened) { this._forceModeOverOpened = false; this._isOpen = this.opened; } }); } } _updateAnimations() { if (this._fromToggle && !this._isAnimation) { this._renderer.addClass(this._el.nativeElement, this.classes.transition); this._renderer.addClass(this._drawerContainer._drawerContent._getHostElement(), this.classes.transition); this._isAnimation = true; } else if (!this._fromToggle && this._isAnimation) { this._renderer.removeClass(this._el.nativeElement, this.classes.transition); this._renderer.removeClass(this._drawerContainer._drawerContent._getHostElement(), this.classes.transition); this._isAnimation = false; } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.10", ngImport: i0, type: LyDrawer, deps: [{ token: i1.LyTheme2 }, { token: i1.StyleRenderer }, { token: i0.Renderer2 }, { token: i0.ElementRef }, { token: LyDrawerContainer }, { token: i0.ViewContainerRef }, { token: i2.ViewportRuler }, { token: i0.ChangeDetectorRef }, { token: i0.NgZone }, { token: i3.Platform }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.10", type: LyDrawer, isStandalone: false, selector: "ly-drawer", inputs: { width: "width", height: "height", opened: "opened", mode: "mode", spacingAbove: "spacingAbove", spacingBelow: "spacingBelow", spacingBefore: "spacingBefore", spacingAfter: "spacingAfter", drawerWidth: "drawerWidth", drawerHeight: "drawerHeight", hasBackdrop: "hasBackdrop", position: "position" }, providers: [ StyleRenderer ], viewQueries: [{ propertyName: "_backdrop", first: true, predicate: TemplateRef, descendants: true }], exportAs: ["lyDrawer"], usesOnChanges: true, ngImport: i0, template: "<ng-content></ng-content>\n<ng-template>\n <div [className]=\"classes.backdrop\" (click)=\"toggle()\"></div>\n</ng-template>", changeDetection: i0.ChangeDetectionStrategy.OnPush }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.10", ngImport: i0, type: LyDrawer, decorators: [{ type: Component, args: [{ selector: 'ly-drawer', changeDetection: ChangeDetectionStrategy.OnPush, exportAs: 'lyDrawer', providers: [ StyleRenderer ], standalone: false, template: "<ng-content></ng-content>\n<ng-template>\n <div [className]=\"classes.backdrop\" (click)=\"toggle()\"></div>\n</ng-template>" }] }], ctorParameters: () => [{ type: i1.LyTheme2 }, { type: i1.StyleRenderer }, { type: i0.Renderer2 }, { type: i0.ElementRef }, { type: LyDrawerContainer }, { type: i0.ViewContainerRef }, { type: i2.ViewportRuler }, { type: i0.ChangeDetectorRef }, { type: i0.NgZone }, { type: i3.Platform }], propDecorators: { _backdrop: [{ type: ViewChild, args: [TemplateRef] }], width: [{ type: Input }], height: [{ type: Input }], opened: [{ type: Input }], mode: [{ type: Input }], spacingAbove: [{ type: Input }], spacingBelow: [{ type: Input }], spacingBefore: [{ type: Input }], spacingAfter: [{ type: Input }], drawerWidth: [{ type: Input }], drawerHeight: [{ type: Input }], hasBackdrop: [{ type: Input }], position: [{ type: Input }] } }); /** * convert number to px */ function toPx(val) { if (typeof val === 'number') { return `${val}px`; } else { return val; } } function createEmptyPropOrUseExisting(object, key, _new) { return key in object ? object[key] : object[key] = _new || {}; } class LyDrawerModule { static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.10", ngImport: i0, type: LyDrawerModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); } static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.2.10", ngImport: i0, type: LyDrawerModule, declarations: [LyDrawer, LyDrawerContainer, LyDrawerContent], imports: [CommonModule, LyCommonModule], exports: [LyDrawer, LyDrawerContainer, LyDrawerContent, LyCommonModule] }); } static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.2.10", ngImport: i0, type: LyDrawerModule, imports: [CommonModule, LyCommonModule, LyCommonModule] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.10", ngImport: i0, type: LyDrawerModule, decorators: [{ type: NgModule, args: [{ imports: [ CommonModule, LyCommonModule ], exports: [ LyDrawer, LyDrawerContainer, LyDrawerContent, LyCommonModule ], declarations: [LyDrawer, LyDrawerContainer, LyDrawerContent], }] }] }); /** * Generated bundle index. Do not edit. */ export { LyDrawer, LyDrawerContainer, LyDrawerContent, LyDrawerModule, STYLES }; //# sourceMappingURL=alyle-ui-drawer.mjs.map