ngx-kit 7.0.1 → 7.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/angle-selector/README.md +34 -34
- package/box-shadow/README.md +33 -33
- package/color-picker/README.md +52 -52
- package/data-table/README.md +120 -120
- package/date-picker/README.md +74 -74
- package/dialog/README.md +92 -92
- package/drag-resize/README.md +55 -55
- package/fesm2022/ngx-kit-color-picker.mjs.map +1 -1
- package/fesm2022/ngx-kit-date-picker.mjs +7 -1
- package/fesm2022/ngx-kit-date-picker.mjs.map +1 -1
- package/fesm2022/ngx-kit-dialog.mjs.map +1 -1
- package/fesm2022/ngx-kit-drag-resize.mjs +76 -104
- package/fesm2022/ngx-kit-drag-resize.mjs.map +1 -1
- package/fesm2022/ngx-kit-drawer-menu.mjs +3 -3
- package/fesm2022/ngx-kit-drawer-menu.mjs.map +1 -1
- package/fesm2022/ngx-kit-dropzone.mjs.map +1 -1
- package/fesm2022/ngx-kit-form-field.mjs +9 -3
- package/fesm2022/ngx-kit-form-field.mjs.map +1 -1
- package/fesm2022/ngx-kit-gallery.mjs +2 -2
- package/fesm2022/ngx-kit-gallery.mjs.map +1 -1
- package/fesm2022/ngx-kit-grid-layout.mjs +32 -30
- package/fesm2022/ngx-kit-grid-layout.mjs.map +1 -1
- package/fesm2022/ngx-kit-infinite-scroll.mjs +467 -0
- package/fesm2022/ngx-kit-infinite-scroll.mjs.map +1 -0
- package/fesm2022/ngx-kit-message.mjs +1 -1
- package/fesm2022/ngx-kit-message.mjs.map +1 -1
- package/fesm2022/ngx-kit-shared.mjs +64 -1
- package/fesm2022/ngx-kit-shared.mjs.map +1 -1
- package/fesm2022/ngx-kit-virtual-scroll.mjs +2 -2
- package/fesm2022/ngx-kit-virtual-scroll.mjs.map +1 -1
- package/fesm2022/ngx-kit-webflow.mjs +38 -38
- package/fesm2022/ngx-kit-webflow.mjs.map +1 -1
- package/gallery/README.md +71 -71
- package/gradient-picker/README.md +41 -41
- package/grid-layout/README.md +64 -64
- package/image-editor/README.md +44 -44
- package/infinite-scroll/README.md +252 -0
- package/menu/README.md +85 -85
- package/message/README.md +70 -70
- package/notify/README.md +56 -56
- package/package.json +5 -1
- package/shared/README.md +117 -117
- package/time-picker/README.md +89 -89
- package/types/ngx-kit-date-picker.d.ts +14 -11
- package/types/ngx-kit-drag-resize.d.ts +44 -44
- package/types/ngx-kit-form-field.d.ts +26 -23
- package/types/ngx-kit-infinite-scroll.d.ts +86 -0
- package/types/ngx-kit-shared.d.ts +39 -1
- package/virtual-scroll/README.md +199 -199
|
@@ -240,7 +240,7 @@ class NgxDrawerMenuComponent {
|
|
|
240
240
|
}
|
|
241
241
|
setupMediaQuery() {
|
|
242
242
|
const config = this.responsiveConfig();
|
|
243
|
-
if (config.mode !== 'auto') {
|
|
243
|
+
if (config.mode !== 'auto' || this.isBrowser) {
|
|
244
244
|
this.isMobile.set(config.mode === 'mobile');
|
|
245
245
|
return;
|
|
246
246
|
}
|
|
@@ -396,11 +396,11 @@ class NgxDrawerMenuComponent {
|
|
|
396
396
|
this.renderer.removeStyle(document.body, 'overflow');
|
|
397
397
|
}
|
|
398
398
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxDrawerMenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
399
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: NgxDrawerMenuComponent, isStandalone: true, selector: "ngx-drawer-menu", inputs: { side: { classPropertyName: "side", publicName: "side", isSignal: true, isRequired: false, transformFunction: null }, effect: { classPropertyName: "effect", publicName: "effect", isSignal: true, isRequired: false, transformFunction: null }, width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null }, pinned: { classPropertyName: "pinned", publicName: "pinned", isSignal: true, isRequired: false, transformFunction: null }, responsive: { classPropertyName: "responsive", publicName: "responsive", isSignal: true, isRequired: false, transformFunction: null }, closeOnBackdrop: { classPropertyName: "closeOnBackdrop", publicName: "closeOnBackdrop", isSignal: true, isRequired: false, transformFunction: null }, closeOnEscape: { classPropertyName: "closeOnEscape", publicName: "closeOnEscape", isSignal: true, isRequired: false, transformFunction: null }, lockBodyScroll: { classPropertyName: "lockBodyScroll", publicName: "lockBodyScroll", isSignal: true, isRequired: false, transformFunction: null }, animationDuration: { classPropertyName: "animationDuration", publicName: "animationDuration", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { open: "openChange", pinned: "pinnedChange" }, host: { properties: { "class.drawer-start": "this.drawerStart", "class.drawer-end": "this.drawerEnd", "class.drawer-open": "this.drawerOpen", "class.drawer-mobile": "this.drawerMobile", "class.drawer-desktop": "this.drawerDesktop", "class.drawer-overlay": "this.drawerOverlay", "class.drawer-dock": "this.drawerDock", "style.--ngx-drawer-width": "this.hostWidth", "style.--ngx-drawer-duration": "this.hostDuration", "style.--ngx-drawer-z-index": "this.hostZIndex", "class.effect-none": "this.effectNone", "class.effect-fabric": "this.effectFabric", "class.effect-slide": "this.effectSlide", "class.effect-push": "this.effectPush", "class.effect-scale": "this.effectScale" } }, ngImport: i0, template: "<div\n class=\"ngx-drawer-root\"\n [class.is-open]=\"drawerVisible()\"\n [class.is-closed]=\"!drawerVisible()\"\n [class.is-overlay]=\"isOverlay()\"\n [class.is-dock]=\"isDocked()\"\n [class.is-pinned]=\"pinned()\"\n [class.is-mobile]=\"currentMode() === 'mobile'\"\n [class.is-desktop]=\"currentMode() === 'desktop'\"\n (keydown)=\"onKeyDown($event)\"\n tabindex=\"-1\">\n <!-- ===================================================================== -->\n <!-- Backdrop -->\n <!-- ===================================================================== -->\n\n @if (shouldShowBackdrop()) {\n <div class=\"ngx-drawer-backdrop\" aria-hidden=\"true\" (click)=\"onBackdropClick()\"></div>\n }\n\n <!-- ===================================================================== -->\n <!-- Drawer -->\n <!-- ===================================================================== -->\n\n <aside\n class=\"ngx-drawer\"\n [attr.aria-hidden]=\"!drawerVisible()\"\n [attr.data-side]=\"side()\"\n [attr.data-mode]=\"currentMode()\"\n [attr.data-behavior]=\"currentBehavior()\"\n [attr.data-effect]=\"effect()\"\n [attr.data-pinned]=\"pinned()\">\n <div class=\"ngx-drawer-surface\">\n <!-- Drawer Content -->\n <div class=\"ngx-drawer-content\">\n <ng-content select=\"[drawerContent]\"></ng-content>\n </div>\n </div>\n </aside>\n\n <!-- ===================================================================== -->\n <!-- Main Content -->\n <!-- ===================================================================== -->\n\n <main class=\"ngx-drawer-main\">\n <div class=\"ngx-drawer-main-content\">\n <ng-content></ng-content>\n </div>\n </main>\n</div>\n", styles: [":host{--ngx-drawer-width: 300px;--ngx-drawer-duration: .28s;--ngx-drawer-z-index: 1000;display:block;width:100%;position:relative;isolation:isolate}:host,:host *,:host *:before,:host *:after{box-sizing:border-box}.ngx-drawer-root{position:relative;display:flex;width:100%;height:100%;min-width:0;min-height:0;overflow:hidden;outline:none}.ngx-drawer-main{position:relative;flex:1 1 auto;width:100%;min-width:0;min-height:0;overflow:hidden;display:flex;transition:width var(--ngx-drawer-duration) cubic-bezier(.4,0,.2,1),margin var(--ngx-drawer-duration) cubic-bezier(.4,0,.2,1),transform var(--ngx-drawer-duration) cubic-bezier(.4,0,.2,1),opacity var(--ngx-drawer-duration) cubic-bezier(.4,0,.2,1)}.ngx-drawer-main-content{width:100%;min-width:0;min-height:0;overflow:auto}.ngx-drawer{position:relative;flex:0 0 var(--ngx-drawer-width);width:var(--ngx-drawer-width);min-width:var(--ngx-drawer-width);max-width:var(--ngx-drawer-width);height:100%;z-index:calc(var(--ngx-drawer-z-index) + 2);transition:transform var(--ngx-drawer-duration) cubic-bezier(.4,0,.2,1),width var(--ngx-drawer-duration) cubic-bezier(.4,0,.2,1),opacity var(--ngx-drawer-duration) cubic-bezier(.4,0,.2,1),box-shadow var(--ngx-drawer-duration) cubic-bezier(.4,0,.2,1)}.ngx-drawer-surface{position:relative;width:100%;height:100%;display:flex;flex-direction:column;overflow:hidden;background:var(--ngx-drawer-background, #fff);color:var(--ngx-drawer-color, #1f2937);border:0;box-shadow:0 0 #0000}.ngx-drawer-content{width:100%;height:100%;min-width:0;min-height:0;overflow:auto}:host.drawer-start .ngx-drawer{order:0}:host.drawer-start .ngx-drawer-main{order:1}:host.drawer-end .ngx-drawer{order:1}:host.drawer-end .ngx-drawer-main{order:0}:host.drawer-dock .ngx-drawer{transform:translate(0);opacity:1;visibility:visible}:host.drawer-dock.drawer-start.drawer-open .ngx-drawer{transform:translate(0)}:host.drawer-dock.drawer-start:not(.drawer-open) .ngx-drawer{transform:translate(-100%)}:host.drawer-dock.drawer-end.drawer-open .ngx-drawer{transform:translate(0)}:host.drawer-dock.drawer-end:not(.drawer-open) .ngx-drawer{transform:translate(100%)}:host.drawer-overlay .ngx-drawer{position:absolute;top:0;bottom:0;z-index:calc(var(--ngx-drawer-z-index) + 2);box-shadow:0 12px 40px #0000002e}:host.drawer-start.drawer-overlay .ngx-drawer{left:0}:host.drawer-end.drawer-overlay .ngx-drawer{right:0}:host.drawer-overlay.drawer-start.drawer-open .ngx-drawer{transform:translate(0)}:host.drawer-overlay.drawer-start:not(.drawer-open) .ngx-drawer{transform:translate(-105%)}:host.drawer-overlay.drawer-end.drawer-open .ngx-drawer{transform:translate(0)}:host.drawer-overlay.drawer-end:not(.drawer-open) .ngx-drawer{transform:translate(105%)}.ngx-drawer-backdrop{position:absolute;inset:0;z-index:calc(var(--ngx-drawer-z-index) + 1);background:#00000061;-webkit-backdrop-filter:blur(1px);backdrop-filter:blur(1px);opacity:1;animation:ngx-drawer-backdrop-in var(--ngx-drawer-duration) cubic-bezier(.4,0,.2,1);cursor:default}@keyframes ngx-drawer-backdrop-in{0%{opacity:0}to{opacity:1}}:host.effect-fabric .ngx-drawer-surface{position:relative;overflow:hidden}:host.effect-fabric .ngx-drawer-surface:before{content:\"\";position:absolute;top:0;bottom:0;width:100px;pointer-events:none;opacity:0;transition:opacity var(--ngx-drawer-duration) ease,transform var(--ngx-drawer-duration) ease;background:linear-gradient(90deg,transparent 0%,rgba(255,255,255,.08) 45%,rgba(255,255,255,.2) 50%,rgba(255,255,255,.08) 55%,transparent 100%)}:host.effect-fabric.drawer-start .ngx-drawer-surface:before{right:-100px}:host.effect-fabric.drawer-end .ngx-drawer-surface:before{left:-100px}:host.effect-fabric.drawer-open .ngx-drawer-surface:before{opacity:1}:host.effect-slide .ngx-drawer{will-change:transform}:host.effect-push.drawer-start.drawer-open .ngx-drawer-main{transform:translate(calc(var(--ngx-drawer-width) / 2))}:host.effect-push.drawer-end.drawer-open .ngx-drawer-main{transform:translate(calc(var(--ngx-drawer-width) / -2))}:host.effect-scale.drawer-open .ngx-drawer-main-content{transform:scale(.985);opacity:.92}.ngx-drawer-main-content{transition:transform var(--ngx-drawer-duration) cubic-bezier(.4,0,.2,1),opacity var(--ngx-drawer-duration) cubic-bezier(.4,0,.2,1)}:host.drawer-dock.drawer-open.drawer-desktop.drawer-start{--ngx-drawer-shadow: 8px 0 24px rgba(0, 0, 0, .06)}:host.drawer-dock.drawer-open.drawer-desktop.drawer-end{--ngx-drawer-shadow: -8px 0 24px rgba(0, 0, 0, .06)}:host.drawer-dock .ngx-drawer-surface{box-shadow:var(--ngx-drawer-shadow, none)}:host.drawer-dock.drawer-desktop.drawer-open .ngx-drawer{box-shadow:none}:host.drawer-mobile{--ngx-drawer-duration: .26s}:host.drawer-mobile .ngx-drawer{box-shadow:0 12px 40px #0003}@media(prefers-color-scheme:dark){:host{--ngx-drawer-background: #111827;--ngx-drawer-color: #f3f4f6}.ngx-drawer-surface{border-color:#ffffff14}.ngx-drawer-backdrop{background:#0009}}@media(prefers-reduced-motion:reduce){:host{--ngx-drawer-duration: 0ms}.ngx-drawer,.ngx-drawer-main,.ngx-drawer-main-content,.ngx-drawer-backdrop{transition:none!important;animation:none!important}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
399
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: NgxDrawerMenuComponent, isStandalone: true, selector: "ngx-drawer-menu", inputs: { side: { classPropertyName: "side", publicName: "side", isSignal: true, isRequired: false, transformFunction: null }, effect: { classPropertyName: "effect", publicName: "effect", isSignal: true, isRequired: false, transformFunction: null }, width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null }, pinned: { classPropertyName: "pinned", publicName: "pinned", isSignal: true, isRequired: false, transformFunction: null }, responsive: { classPropertyName: "responsive", publicName: "responsive", isSignal: true, isRequired: false, transformFunction: null }, closeOnBackdrop: { classPropertyName: "closeOnBackdrop", publicName: "closeOnBackdrop", isSignal: true, isRequired: false, transformFunction: null }, closeOnEscape: { classPropertyName: "closeOnEscape", publicName: "closeOnEscape", isSignal: true, isRequired: false, transformFunction: null }, lockBodyScroll: { classPropertyName: "lockBodyScroll", publicName: "lockBodyScroll", isSignal: true, isRequired: false, transformFunction: null }, animationDuration: { classPropertyName: "animationDuration", publicName: "animationDuration", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { open: "openChange", pinned: "pinnedChange" }, host: { properties: { "class.drawer-start": "this.drawerStart", "class.drawer-end": "this.drawerEnd", "class.drawer-open": "this.drawerOpen", "class.drawer-mobile": "this.drawerMobile", "class.drawer-desktop": "this.drawerDesktop", "class.drawer-overlay": "this.drawerOverlay", "class.drawer-dock": "this.drawerDock", "style.--ngx-drawer-width": "this.hostWidth", "style.--ngx-drawer-duration": "this.hostDuration", "style.--ngx-drawer-z-index": "this.hostZIndex", "class.effect-none": "this.effectNone", "class.effect-fabric": "this.effectFabric", "class.effect-slide": "this.effectSlide", "class.effect-push": "this.effectPush", "class.effect-scale": "this.effectScale" } }, ngImport: i0, template: "<div\r\n class=\"ngx-drawer-root\"\r\n [class.is-open]=\"drawerVisible()\"\r\n [class.is-closed]=\"!drawerVisible()\"\r\n [class.is-overlay]=\"isOverlay()\"\r\n [class.is-dock]=\"isDocked()\"\r\n [class.is-pinned]=\"pinned()\"\r\n [class.is-mobile]=\"currentMode() === 'mobile'\"\r\n [class.is-desktop]=\"currentMode() === 'desktop'\"\r\n (keydown)=\"onKeyDown($event)\"\r\n tabindex=\"-1\">\r\n <!-- ===================================================================== -->\r\n <!-- Backdrop -->\r\n <!-- ===================================================================== -->\r\n\r\n @if (shouldShowBackdrop()) {\r\n <div class=\"ngx-drawer-backdrop\" aria-hidden=\"true\" (click)=\"onBackdropClick()\"></div>\r\n }\r\n\r\n <!-- ===================================================================== -->\r\n <!-- Drawer -->\r\n <!-- ===================================================================== -->\r\n\r\n <aside\r\n class=\"ngx-drawer\"\r\n [attr.aria-hidden]=\"!drawerVisible()\"\r\n [attr.data-side]=\"side()\"\r\n [attr.data-mode]=\"currentMode()\"\r\n [attr.data-behavior]=\"currentBehavior()\"\r\n [attr.data-effect]=\"effect()\"\r\n [attr.data-pinned]=\"pinned()\">\r\n <div class=\"ngx-drawer-surface\">\r\n <!-- Drawer Content -->\r\n <div class=\"ngx-drawer-content\">\r\n <ng-content select=\"[drawerContent]\"></ng-content>\r\n </div>\r\n </div>\r\n </aside>\r\n\r\n <!-- ===================================================================== -->\r\n <!-- Main Content -->\r\n <!-- ===================================================================== -->\r\n\r\n <main class=\"ngx-drawer-main\">\r\n <div class=\"ngx-drawer-main-content\">\r\n <ng-content></ng-content>\r\n </div>\r\n </main>\r\n</div>\r\n", styles: [":host{--ngx-drawer-width: 300px;--ngx-drawer-duration: .28s;--ngx-drawer-z-index: 1000;display:block;width:100%;position:relative;isolation:isolate}:host,:host *,:host *:before,:host *:after{box-sizing:border-box}.ngx-drawer-root{position:relative;display:flex;width:100%;height:100%;min-width:0;min-height:0;overflow:hidden;outline:none}.ngx-drawer-main{position:relative;flex:1 1 auto;width:100%;min-width:0;min-height:0;overflow:hidden;display:flex;transition:width var(--ngx-drawer-duration) cubic-bezier(.4,0,.2,1),margin var(--ngx-drawer-duration) cubic-bezier(.4,0,.2,1),transform var(--ngx-drawer-duration) cubic-bezier(.4,0,.2,1),opacity var(--ngx-drawer-duration) cubic-bezier(.4,0,.2,1)}.ngx-drawer-main-content{width:100%;min-width:0;min-height:0;overflow:auto}.ngx-drawer{position:relative;flex:0 0 var(--ngx-drawer-width);width:var(--ngx-drawer-width);min-width:var(--ngx-drawer-width);max-width:var(--ngx-drawer-width);height:100%;z-index:calc(var(--ngx-drawer-z-index) + 2);transition:transform var(--ngx-drawer-duration) cubic-bezier(.4,0,.2,1),width var(--ngx-drawer-duration) cubic-bezier(.4,0,.2,1),opacity var(--ngx-drawer-duration) cubic-bezier(.4,0,.2,1),box-shadow var(--ngx-drawer-duration) cubic-bezier(.4,0,.2,1)}.ngx-drawer-surface{position:relative;width:100%;height:100%;display:flex;flex-direction:column;overflow:hidden;background:var(--ngx-drawer-background, #fff);color:var(--ngx-drawer-color, #1f2937);border:0;box-shadow:0 0 #0000}.ngx-drawer-content{width:100%;height:100%;min-width:0;min-height:0;overflow:auto}:host.drawer-start .ngx-drawer{order:0}:host.drawer-start .ngx-drawer-main{order:1}:host.drawer-end .ngx-drawer{order:1}:host.drawer-end .ngx-drawer-main{order:0}:host.drawer-dock .ngx-drawer{transform:translate(0);opacity:1;visibility:visible}:host.drawer-dock.drawer-start.drawer-open .ngx-drawer{transform:translate(0)}:host.drawer-dock.drawer-start:not(.drawer-open) .ngx-drawer{transform:translate(-100%)}:host.drawer-dock.drawer-end.drawer-open .ngx-drawer{transform:translate(0)}:host.drawer-dock.drawer-end:not(.drawer-open) .ngx-drawer{transform:translate(100%)}:host.drawer-overlay .ngx-drawer{position:absolute;top:0;bottom:0;z-index:calc(var(--ngx-drawer-z-index) + 2);box-shadow:0 12px 40px #0000002e}:host.drawer-start.drawer-overlay .ngx-drawer{left:0}:host.drawer-end.drawer-overlay .ngx-drawer{right:0}:host.drawer-overlay.drawer-start.drawer-open .ngx-drawer{transform:translate(0)}:host.drawer-overlay.drawer-start:not(.drawer-open) .ngx-drawer{transform:translate(-105%)}:host.drawer-overlay.drawer-end.drawer-open .ngx-drawer{transform:translate(0)}:host.drawer-overlay.drawer-end:not(.drawer-open) .ngx-drawer{transform:translate(105%)}.ngx-drawer-backdrop{position:absolute;inset:0;z-index:calc(var(--ngx-drawer-z-index) + 1);background:#00000061;-webkit-backdrop-filter:blur(1px);backdrop-filter:blur(1px);opacity:1;animation:ngx-drawer-backdrop-in var(--ngx-drawer-duration) cubic-bezier(.4,0,.2,1);cursor:default}@keyframes ngx-drawer-backdrop-in{0%{opacity:0}to{opacity:1}}:host.effect-fabric .ngx-drawer-surface{position:relative;overflow:hidden}:host.effect-fabric .ngx-drawer-surface:before{content:\"\";position:absolute;top:0;bottom:0;width:100px;pointer-events:none;opacity:0;transition:opacity var(--ngx-drawer-duration) ease,transform var(--ngx-drawer-duration) ease;background:linear-gradient(90deg,transparent 0%,rgba(255,255,255,.08) 45%,rgba(255,255,255,.2) 50%,rgba(255,255,255,.08) 55%,transparent 100%)}:host.effect-fabric.drawer-start .ngx-drawer-surface:before{right:-100px}:host.effect-fabric.drawer-end .ngx-drawer-surface:before{left:-100px}:host.effect-fabric.drawer-open .ngx-drawer-surface:before{opacity:1}:host.effect-slide .ngx-drawer{will-change:transform}:host.effect-push.drawer-start.drawer-open .ngx-drawer-main{transform:translate(calc(var(--ngx-drawer-width) / 2))}:host.effect-push.drawer-end.drawer-open .ngx-drawer-main{transform:translate(calc(var(--ngx-drawer-width) / -2))}:host.effect-scale.drawer-open .ngx-drawer-main-content{transform:scale(.985);opacity:.92}.ngx-drawer-main-content{transition:transform var(--ngx-drawer-duration) cubic-bezier(.4,0,.2,1),opacity var(--ngx-drawer-duration) cubic-bezier(.4,0,.2,1)}:host.drawer-dock.drawer-open.drawer-desktop.drawer-start{--ngx-drawer-shadow: 8px 0 24px rgba(0, 0, 0, .06)}:host.drawer-dock.drawer-open.drawer-desktop.drawer-end{--ngx-drawer-shadow: -8px 0 24px rgba(0, 0, 0, .06)}:host.drawer-dock .ngx-drawer-surface{box-shadow:var(--ngx-drawer-shadow, none)}:host.drawer-dock.drawer-desktop.drawer-open .ngx-drawer{box-shadow:none}:host.drawer-mobile{--ngx-drawer-duration: .26s}:host.drawer-mobile .ngx-drawer{box-shadow:0 12px 40px #0003}@media(prefers-color-scheme:dark){:host{--ngx-drawer-background: #111827;--ngx-drawer-color: #f3f4f6}.ngx-drawer-surface{border-color:#ffffff14}.ngx-drawer-backdrop{background:#0009}}@media(prefers-reduced-motion:reduce){:host{--ngx-drawer-duration: 0ms}.ngx-drawer,.ngx-drawer-main,.ngx-drawer-main-content,.ngx-drawer-backdrop{transition:none!important;animation:none!important}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
400
400
|
}
|
|
401
401
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxDrawerMenuComponent, decorators: [{
|
|
402
402
|
type: Component,
|
|
403
|
-
args: [{ selector: 'ngx-drawer-menu', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"ngx-drawer-root\"\n [class.is-open]=\"drawerVisible()\"\n [class.is-closed]=\"!drawerVisible()\"\n [class.is-overlay]=\"isOverlay()\"\n [class.is-dock]=\"isDocked()\"\n [class.is-pinned]=\"pinned()\"\n [class.is-mobile]=\"currentMode() === 'mobile'\"\n [class.is-desktop]=\"currentMode() === 'desktop'\"\n (keydown)=\"onKeyDown($event)\"\n tabindex=\"-1\">\n <!-- ===================================================================== -->\n <!-- Backdrop -->\n <!-- ===================================================================== -->\n\n @if (shouldShowBackdrop()) {\n <div class=\"ngx-drawer-backdrop\" aria-hidden=\"true\" (click)=\"onBackdropClick()\"></div>\n }\n\n <!-- ===================================================================== -->\n <!-- Drawer -->\n <!-- ===================================================================== -->\n\n <aside\n class=\"ngx-drawer\"\n [attr.aria-hidden]=\"!drawerVisible()\"\n [attr.data-side]=\"side()\"\n [attr.data-mode]=\"currentMode()\"\n [attr.data-behavior]=\"currentBehavior()\"\n [attr.data-effect]=\"effect()\"\n [attr.data-pinned]=\"pinned()\">\n <div class=\"ngx-drawer-surface\">\n <!-- Drawer Content -->\n <div class=\"ngx-drawer-content\">\n <ng-content select=\"[drawerContent]\"></ng-content>\n </div>\n </div>\n </aside>\n\n <!-- ===================================================================== -->\n <!-- Main Content -->\n <!-- ===================================================================== -->\n\n <main class=\"ngx-drawer-main\">\n <div class=\"ngx-drawer-main-content\">\n <ng-content></ng-content>\n </div>\n </main>\n</div>\n", styles: [":host{--ngx-drawer-width: 300px;--ngx-drawer-duration: .28s;--ngx-drawer-z-index: 1000;display:block;width:100%;position:relative;isolation:isolate}:host,:host *,:host *:before,:host *:after{box-sizing:border-box}.ngx-drawer-root{position:relative;display:flex;width:100%;height:100%;min-width:0;min-height:0;overflow:hidden;outline:none}.ngx-drawer-main{position:relative;flex:1 1 auto;width:100%;min-width:0;min-height:0;overflow:hidden;display:flex;transition:width var(--ngx-drawer-duration) cubic-bezier(.4,0,.2,1),margin var(--ngx-drawer-duration) cubic-bezier(.4,0,.2,1),transform var(--ngx-drawer-duration) cubic-bezier(.4,0,.2,1),opacity var(--ngx-drawer-duration) cubic-bezier(.4,0,.2,1)}.ngx-drawer-main-content{width:100%;min-width:0;min-height:0;overflow:auto}.ngx-drawer{position:relative;flex:0 0 var(--ngx-drawer-width);width:var(--ngx-drawer-width);min-width:var(--ngx-drawer-width);max-width:var(--ngx-drawer-width);height:100%;z-index:calc(var(--ngx-drawer-z-index) + 2);transition:transform var(--ngx-drawer-duration) cubic-bezier(.4,0,.2,1),width var(--ngx-drawer-duration) cubic-bezier(.4,0,.2,1),opacity var(--ngx-drawer-duration) cubic-bezier(.4,0,.2,1),box-shadow var(--ngx-drawer-duration) cubic-bezier(.4,0,.2,1)}.ngx-drawer-surface{position:relative;width:100%;height:100%;display:flex;flex-direction:column;overflow:hidden;background:var(--ngx-drawer-background, #fff);color:var(--ngx-drawer-color, #1f2937);border:0;box-shadow:0 0 #0000}.ngx-drawer-content{width:100%;height:100%;min-width:0;min-height:0;overflow:auto}:host.drawer-start .ngx-drawer{order:0}:host.drawer-start .ngx-drawer-main{order:1}:host.drawer-end .ngx-drawer{order:1}:host.drawer-end .ngx-drawer-main{order:0}:host.drawer-dock .ngx-drawer{transform:translate(0);opacity:1;visibility:visible}:host.drawer-dock.drawer-start.drawer-open .ngx-drawer{transform:translate(0)}:host.drawer-dock.drawer-start:not(.drawer-open) .ngx-drawer{transform:translate(-100%)}:host.drawer-dock.drawer-end.drawer-open .ngx-drawer{transform:translate(0)}:host.drawer-dock.drawer-end:not(.drawer-open) .ngx-drawer{transform:translate(100%)}:host.drawer-overlay .ngx-drawer{position:absolute;top:0;bottom:0;z-index:calc(var(--ngx-drawer-z-index) + 2);box-shadow:0 12px 40px #0000002e}:host.drawer-start.drawer-overlay .ngx-drawer{left:0}:host.drawer-end.drawer-overlay .ngx-drawer{right:0}:host.drawer-overlay.drawer-start.drawer-open .ngx-drawer{transform:translate(0)}:host.drawer-overlay.drawer-start:not(.drawer-open) .ngx-drawer{transform:translate(-105%)}:host.drawer-overlay.drawer-end.drawer-open .ngx-drawer{transform:translate(0)}:host.drawer-overlay.drawer-end:not(.drawer-open) .ngx-drawer{transform:translate(105%)}.ngx-drawer-backdrop{position:absolute;inset:0;z-index:calc(var(--ngx-drawer-z-index) + 1);background:#00000061;-webkit-backdrop-filter:blur(1px);backdrop-filter:blur(1px);opacity:1;animation:ngx-drawer-backdrop-in var(--ngx-drawer-duration) cubic-bezier(.4,0,.2,1);cursor:default}@keyframes ngx-drawer-backdrop-in{0%{opacity:0}to{opacity:1}}:host.effect-fabric .ngx-drawer-surface{position:relative;overflow:hidden}:host.effect-fabric .ngx-drawer-surface:before{content:\"\";position:absolute;top:0;bottom:0;width:100px;pointer-events:none;opacity:0;transition:opacity var(--ngx-drawer-duration) ease,transform var(--ngx-drawer-duration) ease;background:linear-gradient(90deg,transparent 0%,rgba(255,255,255,.08) 45%,rgba(255,255,255,.2) 50%,rgba(255,255,255,.08) 55%,transparent 100%)}:host.effect-fabric.drawer-start .ngx-drawer-surface:before{right:-100px}:host.effect-fabric.drawer-end .ngx-drawer-surface:before{left:-100px}:host.effect-fabric.drawer-open .ngx-drawer-surface:before{opacity:1}:host.effect-slide .ngx-drawer{will-change:transform}:host.effect-push.drawer-start.drawer-open .ngx-drawer-main{transform:translate(calc(var(--ngx-drawer-width) / 2))}:host.effect-push.drawer-end.drawer-open .ngx-drawer-main{transform:translate(calc(var(--ngx-drawer-width) / -2))}:host.effect-scale.drawer-open .ngx-drawer-main-content{transform:scale(.985);opacity:.92}.ngx-drawer-main-content{transition:transform var(--ngx-drawer-duration) cubic-bezier(.4,0,.2,1),opacity var(--ngx-drawer-duration) cubic-bezier(.4,0,.2,1)}:host.drawer-dock.drawer-open.drawer-desktop.drawer-start{--ngx-drawer-shadow: 8px 0 24px rgba(0, 0, 0, .06)}:host.drawer-dock.drawer-open.drawer-desktop.drawer-end{--ngx-drawer-shadow: -8px 0 24px rgba(0, 0, 0, .06)}:host.drawer-dock .ngx-drawer-surface{box-shadow:var(--ngx-drawer-shadow, none)}:host.drawer-dock.drawer-desktop.drawer-open .ngx-drawer{box-shadow:none}:host.drawer-mobile{--ngx-drawer-duration: .26s}:host.drawer-mobile .ngx-drawer{box-shadow:0 12px 40px #0003}@media(prefers-color-scheme:dark){:host{--ngx-drawer-background: #111827;--ngx-drawer-color: #f3f4f6}.ngx-drawer-surface{border-color:#ffffff14}.ngx-drawer-backdrop{background:#0009}}@media(prefers-reduced-motion:reduce){:host{--ngx-drawer-duration: 0ms}.ngx-drawer,.ngx-drawer-main,.ngx-drawer-main-content,.ngx-drawer-backdrop{transition:none!important;animation:none!important}}\n"] }]
|
|
403
|
+
args: [{ selector: 'ngx-drawer-menu', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\r\n class=\"ngx-drawer-root\"\r\n [class.is-open]=\"drawerVisible()\"\r\n [class.is-closed]=\"!drawerVisible()\"\r\n [class.is-overlay]=\"isOverlay()\"\r\n [class.is-dock]=\"isDocked()\"\r\n [class.is-pinned]=\"pinned()\"\r\n [class.is-mobile]=\"currentMode() === 'mobile'\"\r\n [class.is-desktop]=\"currentMode() === 'desktop'\"\r\n (keydown)=\"onKeyDown($event)\"\r\n tabindex=\"-1\">\r\n <!-- ===================================================================== -->\r\n <!-- Backdrop -->\r\n <!-- ===================================================================== -->\r\n\r\n @if (shouldShowBackdrop()) {\r\n <div class=\"ngx-drawer-backdrop\" aria-hidden=\"true\" (click)=\"onBackdropClick()\"></div>\r\n }\r\n\r\n <!-- ===================================================================== -->\r\n <!-- Drawer -->\r\n <!-- ===================================================================== -->\r\n\r\n <aside\r\n class=\"ngx-drawer\"\r\n [attr.aria-hidden]=\"!drawerVisible()\"\r\n [attr.data-side]=\"side()\"\r\n [attr.data-mode]=\"currentMode()\"\r\n [attr.data-behavior]=\"currentBehavior()\"\r\n [attr.data-effect]=\"effect()\"\r\n [attr.data-pinned]=\"pinned()\">\r\n <div class=\"ngx-drawer-surface\">\r\n <!-- Drawer Content -->\r\n <div class=\"ngx-drawer-content\">\r\n <ng-content select=\"[drawerContent]\"></ng-content>\r\n </div>\r\n </div>\r\n </aside>\r\n\r\n <!-- ===================================================================== -->\r\n <!-- Main Content -->\r\n <!-- ===================================================================== -->\r\n\r\n <main class=\"ngx-drawer-main\">\r\n <div class=\"ngx-drawer-main-content\">\r\n <ng-content></ng-content>\r\n </div>\r\n </main>\r\n</div>\r\n", styles: [":host{--ngx-drawer-width: 300px;--ngx-drawer-duration: .28s;--ngx-drawer-z-index: 1000;display:block;width:100%;position:relative;isolation:isolate}:host,:host *,:host *:before,:host *:after{box-sizing:border-box}.ngx-drawer-root{position:relative;display:flex;width:100%;height:100%;min-width:0;min-height:0;overflow:hidden;outline:none}.ngx-drawer-main{position:relative;flex:1 1 auto;width:100%;min-width:0;min-height:0;overflow:hidden;display:flex;transition:width var(--ngx-drawer-duration) cubic-bezier(.4,0,.2,1),margin var(--ngx-drawer-duration) cubic-bezier(.4,0,.2,1),transform var(--ngx-drawer-duration) cubic-bezier(.4,0,.2,1),opacity var(--ngx-drawer-duration) cubic-bezier(.4,0,.2,1)}.ngx-drawer-main-content{width:100%;min-width:0;min-height:0;overflow:auto}.ngx-drawer{position:relative;flex:0 0 var(--ngx-drawer-width);width:var(--ngx-drawer-width);min-width:var(--ngx-drawer-width);max-width:var(--ngx-drawer-width);height:100%;z-index:calc(var(--ngx-drawer-z-index) + 2);transition:transform var(--ngx-drawer-duration) cubic-bezier(.4,0,.2,1),width var(--ngx-drawer-duration) cubic-bezier(.4,0,.2,1),opacity var(--ngx-drawer-duration) cubic-bezier(.4,0,.2,1),box-shadow var(--ngx-drawer-duration) cubic-bezier(.4,0,.2,1)}.ngx-drawer-surface{position:relative;width:100%;height:100%;display:flex;flex-direction:column;overflow:hidden;background:var(--ngx-drawer-background, #fff);color:var(--ngx-drawer-color, #1f2937);border:0;box-shadow:0 0 #0000}.ngx-drawer-content{width:100%;height:100%;min-width:0;min-height:0;overflow:auto}:host.drawer-start .ngx-drawer{order:0}:host.drawer-start .ngx-drawer-main{order:1}:host.drawer-end .ngx-drawer{order:1}:host.drawer-end .ngx-drawer-main{order:0}:host.drawer-dock .ngx-drawer{transform:translate(0);opacity:1;visibility:visible}:host.drawer-dock.drawer-start.drawer-open .ngx-drawer{transform:translate(0)}:host.drawer-dock.drawer-start:not(.drawer-open) .ngx-drawer{transform:translate(-100%)}:host.drawer-dock.drawer-end.drawer-open .ngx-drawer{transform:translate(0)}:host.drawer-dock.drawer-end:not(.drawer-open) .ngx-drawer{transform:translate(100%)}:host.drawer-overlay .ngx-drawer{position:absolute;top:0;bottom:0;z-index:calc(var(--ngx-drawer-z-index) + 2);box-shadow:0 12px 40px #0000002e}:host.drawer-start.drawer-overlay .ngx-drawer{left:0}:host.drawer-end.drawer-overlay .ngx-drawer{right:0}:host.drawer-overlay.drawer-start.drawer-open .ngx-drawer{transform:translate(0)}:host.drawer-overlay.drawer-start:not(.drawer-open) .ngx-drawer{transform:translate(-105%)}:host.drawer-overlay.drawer-end.drawer-open .ngx-drawer{transform:translate(0)}:host.drawer-overlay.drawer-end:not(.drawer-open) .ngx-drawer{transform:translate(105%)}.ngx-drawer-backdrop{position:absolute;inset:0;z-index:calc(var(--ngx-drawer-z-index) + 1);background:#00000061;-webkit-backdrop-filter:blur(1px);backdrop-filter:blur(1px);opacity:1;animation:ngx-drawer-backdrop-in var(--ngx-drawer-duration) cubic-bezier(.4,0,.2,1);cursor:default}@keyframes ngx-drawer-backdrop-in{0%{opacity:0}to{opacity:1}}:host.effect-fabric .ngx-drawer-surface{position:relative;overflow:hidden}:host.effect-fabric .ngx-drawer-surface:before{content:\"\";position:absolute;top:0;bottom:0;width:100px;pointer-events:none;opacity:0;transition:opacity var(--ngx-drawer-duration) ease,transform var(--ngx-drawer-duration) ease;background:linear-gradient(90deg,transparent 0%,rgba(255,255,255,.08) 45%,rgba(255,255,255,.2) 50%,rgba(255,255,255,.08) 55%,transparent 100%)}:host.effect-fabric.drawer-start .ngx-drawer-surface:before{right:-100px}:host.effect-fabric.drawer-end .ngx-drawer-surface:before{left:-100px}:host.effect-fabric.drawer-open .ngx-drawer-surface:before{opacity:1}:host.effect-slide .ngx-drawer{will-change:transform}:host.effect-push.drawer-start.drawer-open .ngx-drawer-main{transform:translate(calc(var(--ngx-drawer-width) / 2))}:host.effect-push.drawer-end.drawer-open .ngx-drawer-main{transform:translate(calc(var(--ngx-drawer-width) / -2))}:host.effect-scale.drawer-open .ngx-drawer-main-content{transform:scale(.985);opacity:.92}.ngx-drawer-main-content{transition:transform var(--ngx-drawer-duration) cubic-bezier(.4,0,.2,1),opacity var(--ngx-drawer-duration) cubic-bezier(.4,0,.2,1)}:host.drawer-dock.drawer-open.drawer-desktop.drawer-start{--ngx-drawer-shadow: 8px 0 24px rgba(0, 0, 0, .06)}:host.drawer-dock.drawer-open.drawer-desktop.drawer-end{--ngx-drawer-shadow: -8px 0 24px rgba(0, 0, 0, .06)}:host.drawer-dock .ngx-drawer-surface{box-shadow:var(--ngx-drawer-shadow, none)}:host.drawer-dock.drawer-desktop.drawer-open .ngx-drawer{box-shadow:none}:host.drawer-mobile{--ngx-drawer-duration: .26s}:host.drawer-mobile .ngx-drawer{box-shadow:0 12px 40px #0003}@media(prefers-color-scheme:dark){:host{--ngx-drawer-background: #111827;--ngx-drawer-color: #f3f4f6}.ngx-drawer-surface{border-color:#ffffff14}.ngx-drawer-backdrop{background:#0009}}@media(prefers-reduced-motion:reduce){:host{--ngx-drawer-duration: 0ms}.ngx-drawer,.ngx-drawer-main,.ngx-drawer-main-content,.ngx-drawer-backdrop{transition:none!important;animation:none!important}}\n"] }]
|
|
404
404
|
}], ctorParameters: () => [], propDecorators: { side: [{ type: i0.Input, args: [{ isSignal: true, alias: "side", required: false }] }], effect: [{ type: i0.Input, args: [{ isSignal: true, alias: "effect", required: false }] }], width: [{ type: i0.Input, args: [{ isSignal: true, alias: "width", required: false }] }], open: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: false }] }, { type: i0.Output, args: ["openChange"] }], pinned: [{ type: i0.Input, args: [{ isSignal: true, alias: "pinned", required: false }] }, { type: i0.Output, args: ["pinnedChange"] }], responsive: [{ type: i0.Input, args: [{ isSignal: true, alias: "responsive", required: false }] }], closeOnBackdrop: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeOnBackdrop", required: false }] }], closeOnEscape: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeOnEscape", required: false }] }], lockBodyScroll: [{ type: i0.Input, args: [{ isSignal: true, alias: "lockBodyScroll", required: false }] }], animationDuration: [{ type: i0.Input, args: [{ isSignal: true, alias: "animationDuration", required: false }] }], zIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "zIndex", required: false }] }], drawerStart: [{
|
|
405
405
|
type: HostBinding,
|
|
406
406
|
args: ['class.drawer-start']
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngx-kit-drawer-menu.mjs","sources":["../../../projects/libs/drawer-menu/contracts/drawer-menu-types.ts","../../../projects/libs/drawer-menu/components/drawer-menu.component.ts","../../../projects/libs/drawer-menu/components/drawer-menu.component.html","../../../projects/libs/drawer-menu/ngx-kit-drawer-menu.ts"],"sourcesContent":["/** Logical drawer placement. `start` is right in RTL and left in LTR. */\nexport type NgxDrawerSide = 'start' | 'end';\n\n/** Visual physics used by the drawer while opening/closing. */\nexport type NgxDrawerEffect =\n | 'none'\n | 'fabric'\n | 'slide'\n | 'push'\n | 'scale';\n\nexport type NgxDrawerBehavior =\n | 'dock'\n | 'overlay';\n\nexport type NgxDrawerResponsiveMode =\n | 'auto'\n | 'desktop'\n | 'mobile';\n\nexport interface NgxDrawerResponsive {\n /**\n * auto:\n * breakpoint determines desktop/mobile mode\n *\n * desktop:\n * always desktop\n *\n * mobile:\n * always mobile\n */\n mode?: NgxDrawerResponsiveMode;\n\n /**\n * Width at which the drawer switches\n * between desktop and mobile.\n */\n breakpoint?: number;\n\n /**\n * Initial/default state on desktop.\n */\n desktopOpen?: boolean;\n\n /**\n * Initial/default state on mobile.\n */\n mobileOpen?: boolean;\n\n /**\n * Desktop drawer behavior.\n */\n desktopBehavior?: NgxDrawerBehavior;\n\n /**\n * Mobile drawer behavior.\n */\n mobileBehavior?: NgxDrawerBehavior;\n\n /**\n * If true, pinned state is preserved\n * when switching between desktop/mobile.\n */\n respectPinned?: boolean;\n}\n\nexport const DEFAULT_DRAWER_RESPONSIVE: Required<NgxDrawerResponsive> = {\n mode: 'auto',\n breakpoint: 960,\n desktopOpen: true,\n mobileOpen: false,\n desktopBehavior: 'dock',\n mobileBehavior: 'overlay',\n respectPinned: true,\n};","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n HostBinding,\n PLATFORM_ID,\n Renderer2,\n afterNextRender,\n computed,\n effect,\n inject,\n input,\n model,\n signal,\n} from '@angular/core';\n\nimport { isPlatformBrowser } from '@angular/common';\nimport {\n DEFAULT_DRAWER_RESPONSIVE,\n NgxDrawerBehavior,\n NgxDrawerEffect,\n NgxDrawerResponsive,\n NgxDrawerSide,\n} from '../contracts/drawer-menu-types';\n\n@Component({\n selector: 'ngx-drawer-menu',\n standalone: true,\n templateUrl: './drawer-menu.component.html',\n styleUrl: './drawer-menu.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class NgxDrawerMenuComponent {\n private readonly elementRef = inject(ElementRef<HTMLElement>);\n private readonly renderer = inject(Renderer2);\n private readonly destroyRef = inject(DestroyRef);\n private readonly platformId = inject(PLATFORM_ID);\n\n // ---------------------------------------------------------------------------\n // Inputs\n // ---------------------------------------------------------------------------\n\n readonly side = input<NgxDrawerSide>('start');\n\n readonly effect = input<NgxDrawerEffect>('fabric');\n\n readonly width = input<number | string>(300);\n\n /**\n * Main drawer state.\n *\n * Usage:\n *\n * [(open)]=\"sidebarOpen\"\n */\n readonly open = model<boolean>(false);\n\n /**\n * Pinned state.\n *\n * Useful for desktop layouts.\n *\n * [(pinned)]=\"sidebarPinned\"\n */\n readonly pinned = model<boolean>(false);\n\n readonly responsive = input<NgxDrawerResponsive>(DEFAULT_DRAWER_RESPONSIVE);\n\n /**\n * Whether clicking backdrop closes drawer.\n */\n readonly closeOnBackdrop = input(true);\n\n /**\n * Whether Escape closes drawer.\n */\n readonly closeOnEscape = input(true);\n\n /**\n * Whether body scrolling should be locked\n * while an overlay drawer is open.\n */\n readonly lockBodyScroll = input(true);\n\n /**\n * Animation duration in milliseconds.\n */\n readonly animationDuration = input(280);\n\n /**\n * z-index.\n */\n readonly zIndex = input(1000);\n\n // ---------------------------------------------------------------------------\n // Internal state\n // ---------------------------------------------------------------------------\n\n private readonly isBrowser = isPlatformBrowser(this.platformId);\n\n readonly isMobile = signal(false);\n\n readonly initialized = signal(false);\n\n /**\n * Used to avoid applying responsive defaults repeatedly.\n */\n private previousResponsiveMode: 'desktop' | 'mobile' | null = null;\n\n private mediaQuery?: MediaQueryList;\n\n private removeMediaQueryListener?: () => void;\n\n // ---------------------------------------------------------------------------\n // Computed\n // ---------------------------------------------------------------------------\n\n readonly responsiveConfig = computed(() => {\n const config = this.responsive();\n\n return {\n ...DEFAULT_DRAWER_RESPONSIVE,\n ...config,\n };\n });\n\n readonly currentMode = computed<'desktop' | 'mobile'>(() => {\n const config = this.responsiveConfig();\n\n if (config.mode === 'desktop') {\n return 'desktop';\n }\n\n if (config.mode === 'mobile') {\n return 'mobile';\n }\n\n return this.isMobile() ? 'mobile' : 'desktop';\n });\n\n readonly currentBehavior = computed<NgxDrawerBehavior>(() => {\n const config = this.responsiveConfig();\n\n return this.currentMode() === 'mobile' ? config.mobileBehavior : config.desktopBehavior;\n });\n\n readonly isOverlay = computed(() => {\n return this.currentBehavior() === 'overlay';\n });\n\n readonly isDocked = computed(() => {\n return this.currentBehavior() === 'dock';\n });\n\n readonly shouldShowBackdrop = computed(() => {\n return this.isOverlay() && this.open();\n });\n\n readonly drawerWidth = computed(() => {\n const width = this.width();\n\n if (typeof width === 'number') {\n return `${width}px`;\n }\n\n return width;\n });\n\n readonly drawerVisible = computed(() => {\n return this.open();\n });\n\n readonly shouldPreservePinned = computed(() => {\n return this.responsiveConfig().respectPinned;\n });\n\n readonly isPinnedAndDesktop = computed(() => {\n return this.currentMode() === 'desktop' && this.pinned() && this.shouldPreservePinned();\n });\n\n // ---------------------------------------------------------------------------\n // Host bindings\n // ---------------------------------------------------------------------------\n\n @HostBinding('class.drawer-start')\n get drawerStart(): boolean {\n return this.side() === 'start';\n }\n\n @HostBinding('class.drawer-end')\n get drawerEnd(): boolean {\n return this.side() === 'end';\n }\n\n @HostBinding('class.drawer-open')\n get drawerOpen(): boolean {\n return this.open();\n }\n\n @HostBinding('class.drawer-mobile')\n get drawerMobile(): boolean {\n return this.currentMode() === 'mobile';\n }\n\n @HostBinding('class.drawer-desktop')\n get drawerDesktop(): boolean {\n return this.currentMode() === 'desktop';\n }\n\n @HostBinding('class.drawer-overlay')\n get drawerOverlay(): boolean {\n return this.isOverlay();\n }\n\n @HostBinding('class.drawer-dock')\n get drawerDock(): boolean {\n return this.isDocked();\n }\n\n @HostBinding('style.--ngx-drawer-width')\n get hostWidth(): string {\n return this.drawerWidth();\n }\n\n @HostBinding('style.--ngx-drawer-duration')\n get hostDuration(): string {\n return `${this.animationDuration()}ms`;\n }\n\n @HostBinding('style.--ngx-drawer-z-index')\n get hostZIndex(): number {\n return this.zIndex();\n }\n\n @HostBinding('class.effect-none')\n get effectNone(): boolean {\n return this.effect() === 'none';\n }\n\n @HostBinding('class.effect-fabric')\n get effectFabric(): boolean {\n return this.effect() === 'fabric';\n }\n\n @HostBinding('class.effect-slide')\n get effectSlide(): boolean {\n return this.effect() === 'slide';\n }\n\n @HostBinding('class.effect-push')\n get effectPush(): boolean {\n return this.effect() === 'push';\n }\n\n @HostBinding('class.effect-scale')\n get effectScale(): boolean {\n return this.effect() === 'scale';\n }\n\n // ---------------------------------------------------------------------------\n // Constructor\n // ---------------------------------------------------------------------------\n\n constructor() {\n this.setupResponsive();\n\n effect(() => {\n const mode = this.currentMode();\n\n if (!this.initialized()) {\n return;\n }\n\n this.handleResponsiveModeChange(mode);\n });\n\n effect(() => {\n const shouldLock = this.lockBodyScroll();\n const shouldLockNow = this.isOverlay() && this.open();\n\n if (!shouldLock) {\n return;\n }\n\n if (shouldLockNow) {\n this.lockScroll();\n } else {\n this.unlockScroll();\n }\n });\n\n this.destroyRef.onDestroy(() => {\n this.destroyResponsive();\n\n this.unlockScroll();\n });\n }\n\n // ---------------------------------------------------------------------------\n // Responsive\n // ---------------------------------------------------------------------------\n\n private setupResponsive(): void {\n if (!this.isBrowser) {\n return;\n }\n\n afterNextRender(() => {\n this.setupMediaQuery();\n\n this.initialized.set(true);\n\n const mode = this.currentMode();\n\n this.previousResponsiveMode = mode;\n\n this.applyInitialResponsiveState(mode);\n });\n }\n\n private setupMediaQuery(): void {\n const config = this.responsiveConfig();\n\n if (config.mode !== 'auto') {\n this.isMobile.set(config.mode === 'mobile');\n\n return;\n }\n\n const breakpoint = config.breakpoint;\n\n this.mediaQuery = window.matchMedia(`(max-width: ${breakpoint - 0.02}px)`);\n\n this.updateMobileState();\n\n const listener = () => {\n this.updateMobileState();\n };\n\n this.mediaQuery.addEventListener('change', listener);\n\n this.removeMediaQueryListener = () => {\n this.mediaQuery?.removeEventListener('change', listener);\n };\n }\n\n private updateMobileState(): void {\n if (!this.mediaQuery) {\n return;\n }\n\n this.isMobile.set(this.mediaQuery.matches);\n }\n\n private handleResponsiveModeChange(mode: 'desktop' | 'mobile'): void {\n if (this.previousResponsiveMode === null) {\n this.previousResponsiveMode = mode;\n return;\n }\n\n if (this.previousResponsiveMode === mode) {\n return;\n }\n\n const previousMode = this.previousResponsiveMode;\n\n this.previousResponsiveMode = mode;\n\n const config = this.responsiveConfig();\n\n /**\n * If pinned should be respected,\n * don't overwrite the current open state.\n */\n if (config.respectPinned && this.pinned()) {\n return;\n }\n\n if (mode === 'desktop') {\n this.open.set(config.desktopOpen);\n } else {\n this.open.set(config.mobileOpen);\n }\n\n this.renderer.setAttribute(this.elementRef.nativeElement, 'data-previous-mode', previousMode);\n }\n\n private applyInitialResponsiveState(mode: 'desktop' | 'mobile'): void {\n const config = this.responsiveConfig();\n\n if (config.respectPinned && this.pinned()) {\n return;\n }\n\n /**\n * Don't blindly overwrite an explicitly bound\n * [(open)] value after initialization.\n *\n * The default is only applied when the model\n * has not already been initialized.\n */\n if (mode === 'desktop') {\n this.open.set(config.desktopOpen);\n } else {\n this.open.set(config.mobileOpen);\n }\n }\n\n private destroyResponsive(): void {\n this.removeMediaQueryListener?.();\n\n this.mediaQuery = undefined;\n }\n\n // ---------------------------------------------------------------------------\n // Public API\n // ---------------------------------------------------------------------------\n\n toggle(): void {\n if (this.open()) {\n this.close();\n } else {\n this.openDrawer();\n }\n }\n\n openDrawer(): void {\n this.open.set(true);\n }\n\n close(): void {\n if (this.pinned() && this.isPinnedAndDesktop()) {\n return;\n }\n\n this.open.set(false);\n }\n\n pin(): void {\n this.pinned.set(true);\n this.open.set(true);\n }\n\n unpin(): void {\n this.pinned.set(false);\n }\n\n togglePinned(): void {\n if (this.pinned()) {\n this.unpin();\n } else {\n this.pin();\n }\n }\n\n // ---------------------------------------------------------------------------\n // Events\n // ---------------------------------------------------------------------------\n\n onBackdropClick(): void {\n if (!this.closeOnBackdrop()) {\n return;\n }\n\n this.close();\n }\n\n onKeyDown(event: KeyboardEvent): void {\n if (event.key !== 'Escape') {\n return;\n }\n\n if (!this.closeOnEscape()) {\n return;\n }\n\n if (!this.open()) {\n return;\n }\n\n this.close();\n }\n\n // ---------------------------------------------------------------------------\n // Scroll locking\n // ---------------------------------------------------------------------------\n\n private lockScroll(): void {\n if (!this.isBrowser) {\n return;\n }\n\n if (!document.body) {\n return;\n }\n\n if (document.body.dataset['ngxDrawerScrollLocked'] === 'true') {\n return;\n }\n\n this.renderer.setAttribute(document.body, 'data-ngx-drawer-scroll-locked', 'true');\n\n this.renderer.setStyle(document.body, 'overflow', 'hidden');\n }\n\n private unlockScroll(): void {\n if (!this.isBrowser) {\n return;\n }\n\n if (!document.body) {\n return;\n }\n\n if (document.body.dataset['ngxDrawerScrollLocked'] !== 'true') {\n return;\n }\n\n this.renderer.removeAttribute(document.body, 'data-ngx-drawer-scroll-locked');\n\n this.renderer.removeStyle(document.body, 'overflow');\n }\n}\n","<div\n class=\"ngx-drawer-root\"\n [class.is-open]=\"drawerVisible()\"\n [class.is-closed]=\"!drawerVisible()\"\n [class.is-overlay]=\"isOverlay()\"\n [class.is-dock]=\"isDocked()\"\n [class.is-pinned]=\"pinned()\"\n [class.is-mobile]=\"currentMode() === 'mobile'\"\n [class.is-desktop]=\"currentMode() === 'desktop'\"\n (keydown)=\"onKeyDown($event)\"\n tabindex=\"-1\">\n <!-- ===================================================================== -->\n <!-- Backdrop -->\n <!-- ===================================================================== -->\n\n @if (shouldShowBackdrop()) {\n <div class=\"ngx-drawer-backdrop\" aria-hidden=\"true\" (click)=\"onBackdropClick()\"></div>\n }\n\n <!-- ===================================================================== -->\n <!-- Drawer -->\n <!-- ===================================================================== -->\n\n <aside\n class=\"ngx-drawer\"\n [attr.aria-hidden]=\"!drawerVisible()\"\n [attr.data-side]=\"side()\"\n [attr.data-mode]=\"currentMode()\"\n [attr.data-behavior]=\"currentBehavior()\"\n [attr.data-effect]=\"effect()\"\n [attr.data-pinned]=\"pinned()\">\n <div class=\"ngx-drawer-surface\">\n <!-- Drawer Content -->\n <div class=\"ngx-drawer-content\">\n <ng-content select=\"[drawerContent]\"></ng-content>\n </div>\n </div>\n </aside>\n\n <!-- ===================================================================== -->\n <!-- Main Content -->\n <!-- ===================================================================== -->\n\n <main class=\"ngx-drawer-main\">\n <div class=\"ngx-drawer-main-content\">\n <ng-content></ng-content>\n </div>\n </main>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ngx-kit-drawer-menu.mjs","sources":["../../../projects/libs/drawer-menu/contracts/drawer-menu-types.ts","../../../projects/libs/drawer-menu/components/drawer-menu.component.ts","../../../projects/libs/drawer-menu/components/drawer-menu.component.html","../../../projects/libs/drawer-menu/ngx-kit-drawer-menu.ts"],"sourcesContent":["/** Logical drawer placement. `start` is right in RTL and left in LTR. */\r\nexport type NgxDrawerSide = 'start' | 'end';\r\n\r\n/** Visual physics used by the drawer while opening/closing. */\r\nexport type NgxDrawerEffect =\r\n | 'none'\r\n | 'fabric'\r\n | 'slide'\r\n | 'push'\r\n | 'scale';\r\n\r\nexport type NgxDrawerBehavior =\r\n | 'dock'\r\n | 'overlay';\r\n\r\nexport type NgxDrawerResponsiveMode =\r\n | 'auto'\r\n | 'desktop'\r\n | 'mobile';\r\n\r\nexport interface NgxDrawerResponsive {\r\n /**\r\n * auto:\r\n * breakpoint determines desktop/mobile mode\r\n *\r\n * desktop:\r\n * always desktop\r\n *\r\n * mobile:\r\n * always mobile\r\n */\r\n mode?: NgxDrawerResponsiveMode;\r\n\r\n /**\r\n * Width at which the drawer switches\r\n * between desktop and mobile.\r\n */\r\n breakpoint?: number;\r\n\r\n /**\r\n * Initial/default state on desktop.\r\n */\r\n desktopOpen?: boolean;\r\n\r\n /**\r\n * Initial/default state on mobile.\r\n */\r\n mobileOpen?: boolean;\r\n\r\n /**\r\n * Desktop drawer behavior.\r\n */\r\n desktopBehavior?: NgxDrawerBehavior;\r\n\r\n /**\r\n * Mobile drawer behavior.\r\n */\r\n mobileBehavior?: NgxDrawerBehavior;\r\n\r\n /**\r\n * If true, pinned state is preserved\r\n * when switching between desktop/mobile.\r\n */\r\n respectPinned?: boolean;\r\n}\r\n\r\nexport const DEFAULT_DRAWER_RESPONSIVE: Required<NgxDrawerResponsive> = {\r\n mode: 'auto',\r\n breakpoint: 960,\r\n desktopOpen: true,\r\n mobileOpen: false,\r\n desktopBehavior: 'dock',\r\n mobileBehavior: 'overlay',\r\n respectPinned: true,\r\n};","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n DestroyRef,\r\n ElementRef,\r\n HostBinding,\r\n PLATFORM_ID,\r\n Renderer2,\r\n afterNextRender,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n model,\r\n signal,\r\n} from '@angular/core';\r\n\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport {\r\n DEFAULT_DRAWER_RESPONSIVE,\r\n NgxDrawerBehavior,\r\n NgxDrawerEffect,\r\n NgxDrawerResponsive,\r\n NgxDrawerSide,\r\n} from '../contracts/drawer-menu-types';\r\n\r\n@Component({\r\n selector: 'ngx-drawer-menu',\r\n standalone: true,\r\n templateUrl: './drawer-menu.component.html',\r\n styleUrl: './drawer-menu.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class NgxDrawerMenuComponent {\r\n private readonly elementRef = inject(ElementRef<HTMLElement>);\r\n private readonly renderer = inject(Renderer2);\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly platformId = inject(PLATFORM_ID);\r\n\r\n // ---------------------------------------------------------------------------\r\n // Inputs\r\n // ---------------------------------------------------------------------------\r\n\r\n readonly side = input<NgxDrawerSide>('start');\r\n\r\n readonly effect = input<NgxDrawerEffect>('fabric');\r\n\r\n readonly width = input<number | string>(300);\r\n\r\n /**\r\n * Main drawer state.\r\n *\r\n * Usage:\r\n *\r\n * [(open)]=\"sidebarOpen\"\r\n */\r\n readonly open = model<boolean>(false);\r\n\r\n /**\r\n * Pinned state.\r\n *\r\n * Useful for desktop layouts.\r\n *\r\n * [(pinned)]=\"sidebarPinned\"\r\n */\r\n readonly pinned = model<boolean>(false);\r\n\r\n readonly responsive = input<NgxDrawerResponsive>(DEFAULT_DRAWER_RESPONSIVE);\r\n\r\n /**\r\n * Whether clicking backdrop closes drawer.\r\n */\r\n readonly closeOnBackdrop = input(true);\r\n\r\n /**\r\n * Whether Escape closes drawer.\r\n */\r\n readonly closeOnEscape = input(true);\r\n\r\n /**\r\n * Whether body scrolling should be locked\r\n * while an overlay drawer is open.\r\n */\r\n readonly lockBodyScroll = input(true);\r\n\r\n /**\r\n * Animation duration in milliseconds.\r\n */\r\n readonly animationDuration = input(280);\r\n\r\n /**\r\n * z-index.\r\n */\r\n readonly zIndex = input(1000);\r\n\r\n // ---------------------------------------------------------------------------\r\n // Internal state\r\n // ---------------------------------------------------------------------------\r\n\r\n private readonly isBrowser = isPlatformBrowser(this.platformId);\r\n\r\n readonly isMobile = signal(false);\r\n\r\n readonly initialized = signal(false);\r\n\r\n /**\r\n * Used to avoid applying responsive defaults repeatedly.\r\n */\r\n private previousResponsiveMode: 'desktop' | 'mobile' | null = null;\r\n\r\n private mediaQuery?: MediaQueryList;\r\n\r\n private removeMediaQueryListener?: () => void;\r\n\r\n // ---------------------------------------------------------------------------\r\n // Computed\r\n // ---------------------------------------------------------------------------\r\n\r\n readonly responsiveConfig = computed(() => {\r\n const config = this.responsive();\r\n\r\n return {\r\n ...DEFAULT_DRAWER_RESPONSIVE,\r\n ...config,\r\n };\r\n });\r\n\r\n readonly currentMode = computed<'desktop' | 'mobile'>(() => {\r\n const config = this.responsiveConfig();\r\n\r\n if (config.mode === 'desktop') {\r\n return 'desktop';\r\n }\r\n\r\n if (config.mode === 'mobile') {\r\n return 'mobile';\r\n }\r\n\r\n return this.isMobile() ? 'mobile' : 'desktop';\r\n });\r\n\r\n readonly currentBehavior = computed<NgxDrawerBehavior>(() => {\r\n const config = this.responsiveConfig();\r\n\r\n return this.currentMode() === 'mobile' ? config.mobileBehavior : config.desktopBehavior;\r\n });\r\n\r\n readonly isOverlay = computed(() => {\r\n return this.currentBehavior() === 'overlay';\r\n });\r\n\r\n readonly isDocked = computed(() => {\r\n return this.currentBehavior() === 'dock';\r\n });\r\n\r\n readonly shouldShowBackdrop = computed(() => {\r\n return this.isOverlay() && this.open();\r\n });\r\n\r\n readonly drawerWidth = computed(() => {\r\n const width = this.width();\r\n\r\n if (typeof width === 'number') {\r\n return `${width}px`;\r\n }\r\n\r\n return width;\r\n });\r\n\r\n readonly drawerVisible = computed(() => {\r\n return this.open();\r\n });\r\n\r\n readonly shouldPreservePinned = computed(() => {\r\n return this.responsiveConfig().respectPinned;\r\n });\r\n\r\n readonly isPinnedAndDesktop = computed(() => {\r\n return this.currentMode() === 'desktop' && this.pinned() && this.shouldPreservePinned();\r\n });\r\n\r\n // ---------------------------------------------------------------------------\r\n // Host bindings\r\n // ---------------------------------------------------------------------------\r\n\r\n @HostBinding('class.drawer-start')\r\n get drawerStart(): boolean {\r\n return this.side() === 'start';\r\n }\r\n\r\n @HostBinding('class.drawer-end')\r\n get drawerEnd(): boolean {\r\n return this.side() === 'end';\r\n }\r\n\r\n @HostBinding('class.drawer-open')\r\n get drawerOpen(): boolean {\r\n return this.open();\r\n }\r\n\r\n @HostBinding('class.drawer-mobile')\r\n get drawerMobile(): boolean {\r\n return this.currentMode() === 'mobile';\r\n }\r\n\r\n @HostBinding('class.drawer-desktop')\r\n get drawerDesktop(): boolean {\r\n return this.currentMode() === 'desktop';\r\n }\r\n\r\n @HostBinding('class.drawer-overlay')\r\n get drawerOverlay(): boolean {\r\n return this.isOverlay();\r\n }\r\n\r\n @HostBinding('class.drawer-dock')\r\n get drawerDock(): boolean {\r\n return this.isDocked();\r\n }\r\n\r\n @HostBinding('style.--ngx-drawer-width')\r\n get hostWidth(): string {\r\n return this.drawerWidth();\r\n }\r\n\r\n @HostBinding('style.--ngx-drawer-duration')\r\n get hostDuration(): string {\r\n return `${this.animationDuration()}ms`;\r\n }\r\n\r\n @HostBinding('style.--ngx-drawer-z-index')\r\n get hostZIndex(): number {\r\n return this.zIndex();\r\n }\r\n\r\n @HostBinding('class.effect-none')\r\n get effectNone(): boolean {\r\n return this.effect() === 'none';\r\n }\r\n\r\n @HostBinding('class.effect-fabric')\r\n get effectFabric(): boolean {\r\n return this.effect() === 'fabric';\r\n }\r\n\r\n @HostBinding('class.effect-slide')\r\n get effectSlide(): boolean {\r\n return this.effect() === 'slide';\r\n }\r\n\r\n @HostBinding('class.effect-push')\r\n get effectPush(): boolean {\r\n return this.effect() === 'push';\r\n }\r\n\r\n @HostBinding('class.effect-scale')\r\n get effectScale(): boolean {\r\n return this.effect() === 'scale';\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Constructor\r\n // ---------------------------------------------------------------------------\r\n\r\n constructor() {\r\n this.setupResponsive();\r\n\r\n effect(() => {\r\n const mode = this.currentMode();\r\n\r\n if (!this.initialized()) {\r\n return;\r\n }\r\n\r\n this.handleResponsiveModeChange(mode);\r\n });\r\n\r\n effect(() => {\r\n const shouldLock = this.lockBodyScroll();\r\n const shouldLockNow = this.isOverlay() && this.open();\r\n\r\n if (!shouldLock) {\r\n return;\r\n }\r\n\r\n if (shouldLockNow) {\r\n this.lockScroll();\r\n } else {\r\n this.unlockScroll();\r\n }\r\n });\r\n\r\n this.destroyRef.onDestroy(() => {\r\n this.destroyResponsive();\r\n\r\n this.unlockScroll();\r\n });\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Responsive\r\n // ---------------------------------------------------------------------------\r\n\r\n private setupResponsive(): void {\r\n if (!this.isBrowser) {\r\n return;\r\n }\r\n\r\n afterNextRender(() => {\r\n this.setupMediaQuery();\r\n\r\n this.initialized.set(true);\r\n\r\n const mode = this.currentMode();\r\n\r\n this.previousResponsiveMode = mode;\r\n\r\n this.applyInitialResponsiveState(mode);\r\n });\r\n }\r\n\r\n private setupMediaQuery(): void {\r\n const config = this.responsiveConfig();\r\n\r\n if (config.mode !== 'auto' || this.isBrowser) {\r\n this.isMobile.set(config.mode === 'mobile');\r\n\r\n return;\r\n }\r\n\r\n const breakpoint = config.breakpoint;\r\n\r\n this.mediaQuery = window.matchMedia(`(max-width: ${breakpoint - 0.02}px)`);\r\n\r\n this.updateMobileState();\r\n\r\n const listener = () => {\r\n this.updateMobileState();\r\n };\r\n\r\n this.mediaQuery.addEventListener('change', listener);\r\n\r\n this.removeMediaQueryListener = () => {\r\n this.mediaQuery?.removeEventListener('change', listener);\r\n };\r\n }\r\n\r\n private updateMobileState(): void {\r\n if (!this.mediaQuery) {\r\n return;\r\n }\r\n\r\n this.isMobile.set(this.mediaQuery.matches);\r\n }\r\n\r\n private handleResponsiveModeChange(mode: 'desktop' | 'mobile'): void {\r\n if (this.previousResponsiveMode === null) {\r\n this.previousResponsiveMode = mode;\r\n return;\r\n }\r\n\r\n if (this.previousResponsiveMode === mode) {\r\n return;\r\n }\r\n\r\n const previousMode = this.previousResponsiveMode;\r\n\r\n this.previousResponsiveMode = mode;\r\n\r\n const config = this.responsiveConfig();\r\n\r\n /**\r\n * If pinned should be respected,\r\n * don't overwrite the current open state.\r\n */\r\n if (config.respectPinned && this.pinned()) {\r\n return;\r\n }\r\n\r\n if (mode === 'desktop') {\r\n this.open.set(config.desktopOpen);\r\n } else {\r\n this.open.set(config.mobileOpen);\r\n }\r\n\r\n this.renderer.setAttribute(this.elementRef.nativeElement, 'data-previous-mode', previousMode);\r\n }\r\n\r\n private applyInitialResponsiveState(mode: 'desktop' | 'mobile'): void {\r\n const config = this.responsiveConfig();\r\n\r\n if (config.respectPinned && this.pinned()) {\r\n return;\r\n }\r\n\r\n /**\r\n * Don't blindly overwrite an explicitly bound\r\n * [(open)] value after initialization.\r\n *\r\n * The default is only applied when the model\r\n * has not already been initialized.\r\n */\r\n if (mode === 'desktop') {\r\n this.open.set(config.desktopOpen);\r\n } else {\r\n this.open.set(config.mobileOpen);\r\n }\r\n }\r\n\r\n private destroyResponsive(): void {\r\n this.removeMediaQueryListener?.();\r\n\r\n this.mediaQuery = undefined;\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Public API\r\n // ---------------------------------------------------------------------------\r\n\r\n toggle(): void {\r\n if (this.open()) {\r\n this.close();\r\n } else {\r\n this.openDrawer();\r\n }\r\n }\r\n\r\n openDrawer(): void {\r\n this.open.set(true);\r\n }\r\n\r\n close(): void {\r\n if (this.pinned() && this.isPinnedAndDesktop()) {\r\n return;\r\n }\r\n\r\n this.open.set(false);\r\n }\r\n\r\n pin(): void {\r\n this.pinned.set(true);\r\n this.open.set(true);\r\n }\r\n\r\n unpin(): void {\r\n this.pinned.set(false);\r\n }\r\n\r\n togglePinned(): void {\r\n if (this.pinned()) {\r\n this.unpin();\r\n } else {\r\n this.pin();\r\n }\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Events\r\n // ---------------------------------------------------------------------------\r\n\r\n onBackdropClick(): void {\r\n if (!this.closeOnBackdrop()) {\r\n return;\r\n }\r\n\r\n this.close();\r\n }\r\n\r\n onKeyDown(event: KeyboardEvent): void {\r\n if (event.key !== 'Escape') {\r\n return;\r\n }\r\n\r\n if (!this.closeOnEscape()) {\r\n return;\r\n }\r\n\r\n if (!this.open()) {\r\n return;\r\n }\r\n\r\n this.close();\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Scroll locking\r\n // ---------------------------------------------------------------------------\r\n\r\n private lockScroll(): void {\r\n if (!this.isBrowser) {\r\n return;\r\n }\r\n\r\n if (!document.body) {\r\n return;\r\n }\r\n\r\n if (document.body.dataset['ngxDrawerScrollLocked'] === 'true') {\r\n return;\r\n }\r\n\r\n this.renderer.setAttribute(document.body, 'data-ngx-drawer-scroll-locked', 'true');\r\n\r\n this.renderer.setStyle(document.body, 'overflow', 'hidden');\r\n }\r\n\r\n private unlockScroll(): void {\r\n if (!this.isBrowser) {\r\n return;\r\n }\r\n\r\n if (!document.body) {\r\n return;\r\n }\r\n\r\n if (document.body.dataset['ngxDrawerScrollLocked'] !== 'true') {\r\n return;\r\n }\r\n\r\n this.renderer.removeAttribute(document.body, 'data-ngx-drawer-scroll-locked');\r\n\r\n this.renderer.removeStyle(document.body, 'overflow');\r\n }\r\n}\r\n","<div\r\n class=\"ngx-drawer-root\"\r\n [class.is-open]=\"drawerVisible()\"\r\n [class.is-closed]=\"!drawerVisible()\"\r\n [class.is-overlay]=\"isOverlay()\"\r\n [class.is-dock]=\"isDocked()\"\r\n [class.is-pinned]=\"pinned()\"\r\n [class.is-mobile]=\"currentMode() === 'mobile'\"\r\n [class.is-desktop]=\"currentMode() === 'desktop'\"\r\n (keydown)=\"onKeyDown($event)\"\r\n tabindex=\"-1\">\r\n <!-- ===================================================================== -->\r\n <!-- Backdrop -->\r\n <!-- ===================================================================== -->\r\n\r\n @if (shouldShowBackdrop()) {\r\n <div class=\"ngx-drawer-backdrop\" aria-hidden=\"true\" (click)=\"onBackdropClick()\"></div>\r\n }\r\n\r\n <!-- ===================================================================== -->\r\n <!-- Drawer -->\r\n <!-- ===================================================================== -->\r\n\r\n <aside\r\n class=\"ngx-drawer\"\r\n [attr.aria-hidden]=\"!drawerVisible()\"\r\n [attr.data-side]=\"side()\"\r\n [attr.data-mode]=\"currentMode()\"\r\n [attr.data-behavior]=\"currentBehavior()\"\r\n [attr.data-effect]=\"effect()\"\r\n [attr.data-pinned]=\"pinned()\">\r\n <div class=\"ngx-drawer-surface\">\r\n <!-- Drawer Content -->\r\n <div class=\"ngx-drawer-content\">\r\n <ng-content select=\"[drawerContent]\"></ng-content>\r\n </div>\r\n </div>\r\n </aside>\r\n\r\n <!-- ===================================================================== -->\r\n <!-- Main Content -->\r\n <!-- ===================================================================== -->\r\n\r\n <main class=\"ngx-drawer-main\">\r\n <div class=\"ngx-drawer-main-content\">\r\n <ng-content></ng-content>\r\n </div>\r\n </main>\r\n</div>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;AAkEO,MAAM,yBAAyB,GAAkC;AACtE,IAAA,IAAI,EAAE,MAAM;AACZ,IAAA,UAAU,EAAE,GAAG;AACf,IAAA,WAAW,EAAE,IAAI;AACjB,IAAA,UAAU,EAAE,KAAK;AACjB,IAAA,eAAe,EAAE,MAAM;AACvB,IAAA,cAAc,EAAE,SAAS;AACzB,IAAA,aAAa,EAAE,IAAI;;;MCxCR,sBAAsB,CAAA;AAChB,IAAA,UAAU,GAAG,MAAM,EAAC,UAAuB,EAAC;AAC5C,IAAA,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC;AAC5B,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAC/B,IAAA,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC;;;;IAMxC,IAAI,GAAG,KAAK,CAAgB,OAAO;6EAAC;IAEpC,MAAM,GAAG,KAAK,CAAkB,QAAQ;+EAAC;IAEzC,KAAK,GAAG,KAAK,CAAkB,GAAG;8EAAC;AAE5C;;;;;;AAMG;IACM,IAAI,GAAG,KAAK,CAAU,KAAK;6EAAC;AAErC;;;;;;AAMG;IACM,MAAM,GAAG,KAAK,CAAU,KAAK;+EAAC;IAE9B,UAAU,GAAG,KAAK,CAAsB,yBAAyB;mFAAC;AAE3E;;AAEG;IACM,eAAe,GAAG,KAAK,CAAC,IAAI;wFAAC;AAEtC;;AAEG;IACM,aAAa,GAAG,KAAK,CAAC,IAAI;sFAAC;AAEpC;;;AAGG;IACM,cAAc,GAAG,KAAK,CAAC,IAAI;uFAAC;AAErC;;AAEG;IACM,iBAAiB,GAAG,KAAK,CAAC,GAAG;0FAAC;AAEvC;;AAEG;IACM,MAAM,GAAG,KAAK,CAAC,IAAI;+EAAC;;;;AAMZ,IAAA,SAAS,GAAG,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC;IAEtD,QAAQ,GAAG,MAAM,CAAC,KAAK;iFAAC;IAExB,WAAW,GAAG,MAAM,CAAC,KAAK;oFAAC;AAEpC;;AAEG;IACK,sBAAsB,GAAgC,IAAI;AAE1D,IAAA,UAAU;AAEV,IAAA,wBAAwB;;;;AAMvB,IAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAK;AACxC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE;QAEhC,OAAO;AACL,YAAA,GAAG,yBAAyB;AAC5B,YAAA,GAAG,MAAM;SACV;IACH,CAAC;yFAAC;AAEO,IAAA,WAAW,GAAG,QAAQ,CAAuB,MAAK;AACzD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,EAAE;AAEtC,QAAA,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE;AAC7B,YAAA,OAAO,SAAS;QAClB;AAEA,QAAA,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE;AAC5B,YAAA,OAAO,QAAQ;QACjB;AAEA,QAAA,OAAO,IAAI,CAAC,QAAQ,EAAE,GAAG,QAAQ,GAAG,SAAS;IAC/C,CAAC;oFAAC;AAEO,IAAA,eAAe,GAAG,QAAQ,CAAoB,MAAK;AAC1D,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,EAAE;AAEtC,QAAA,OAAO,IAAI,CAAC,WAAW,EAAE,KAAK,QAAQ,GAAG,MAAM,CAAC,cAAc,GAAG,MAAM,CAAC,eAAe;IACzF,CAAC;wFAAC;AAEO,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAK;AACjC,QAAA,OAAO,IAAI,CAAC,eAAe,EAAE,KAAK,SAAS;IAC7C,CAAC;kFAAC;AAEO,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAK;AAChC,QAAA,OAAO,IAAI,CAAC,eAAe,EAAE,KAAK,MAAM;IAC1C,CAAC;iFAAC;AAEO,IAAA,kBAAkB,GAAG,QAAQ,CAAC,MAAK;QAC1C,OAAO,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE;IACxC,CAAC;2FAAC;AAEO,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;AACnC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;AAE1B,QAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;YAC7B,OAAO,CAAA,EAAG,KAAK,CAAA,EAAA,CAAI;QACrB;AAEA,QAAA,OAAO,KAAK;IACd,CAAC;oFAAC;AAEO,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAK;AACrC,QAAA,OAAO,IAAI,CAAC,IAAI,EAAE;IACpB,CAAC;sFAAC;AAEO,IAAA,oBAAoB,GAAG,QAAQ,CAAC,MAAK;AAC5C,QAAA,OAAO,IAAI,CAAC,gBAAgB,EAAE,CAAC,aAAa;IAC9C,CAAC;6FAAC;AAEO,IAAA,kBAAkB,GAAG,QAAQ,CAAC,MAAK;AAC1C,QAAA,OAAO,IAAI,CAAC,WAAW,EAAE,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,oBAAoB,EAAE;IACzF,CAAC;2FAAC;;;;AAMF,IAAA,IACI,WAAW,GAAA;AACb,QAAA,OAAO,IAAI,CAAC,IAAI,EAAE,KAAK,OAAO;IAChC;AAEA,IAAA,IACI,SAAS,GAAA;AACX,QAAA,OAAO,IAAI,CAAC,IAAI,EAAE,KAAK,KAAK;IAC9B;AAEA,IAAA,IACI,UAAU,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,IAAI,EAAE;IACpB;AAEA,IAAA,IACI,YAAY,GAAA;AACd,QAAA,OAAO,IAAI,CAAC,WAAW,EAAE,KAAK,QAAQ;IACxC;AAEA,IAAA,IACI,aAAa,GAAA;AACf,QAAA,OAAO,IAAI,CAAC,WAAW,EAAE,KAAK,SAAS;IACzC;AAEA,IAAA,IACI,aAAa,GAAA;AACf,QAAA,OAAO,IAAI,CAAC,SAAS,EAAE;IACzB;AAEA,IAAA,IACI,UAAU,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,QAAQ,EAAE;IACxB;AAEA,IAAA,IACI,SAAS,GAAA;AACX,QAAA,OAAO,IAAI,CAAC,WAAW,EAAE;IAC3B;AAEA,IAAA,IACI,YAAY,GAAA;AACd,QAAA,OAAO,GAAG,IAAI,CAAC,iBAAiB,EAAE,IAAI;IACxC;AAEA,IAAA,IACI,UAAU,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,MAAM,EAAE;IACtB;AAEA,IAAA,IACI,UAAU,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,MAAM,EAAE,KAAK,MAAM;IACjC;AAEA,IAAA,IACI,YAAY,GAAA;AACd,QAAA,OAAO,IAAI,CAAC,MAAM,EAAE,KAAK,QAAQ;IACnC;AAEA,IAAA,IACI,WAAW,GAAA;AACb,QAAA,OAAO,IAAI,CAAC,MAAM,EAAE,KAAK,OAAO;IAClC;AAEA,IAAA,IACI,UAAU,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,MAAM,EAAE,KAAK,MAAM;IACjC;AAEA,IAAA,IACI,WAAW,GAAA;AACb,QAAA,OAAO,IAAI,CAAC,MAAM,EAAE,KAAK,OAAO;IAClC;;;;AAMA,IAAA,WAAA,GAAA;QACE,IAAI,CAAC,eAAe,EAAE;QAEtB,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE;AAE/B,YAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE;gBACvB;YACF;AAEA,YAAA,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC;AACvC,QAAA,CAAC,CAAC;QAEF,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,EAAE;YACxC,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE;YAErD,IAAI,CAAC,UAAU,EAAE;gBACf;YACF;YAEA,IAAI,aAAa,EAAE;gBACjB,IAAI,CAAC,UAAU,EAAE;YACnB;iBAAO;gBACL,IAAI,CAAC,YAAY,EAAE;YACrB;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAK;YAC7B,IAAI,CAAC,iBAAiB,EAAE;YAExB,IAAI,CAAC,YAAY,EAAE;AACrB,QAAA,CAAC,CAAC;IACJ;;;;IAMQ,eAAe,GAAA;AACrB,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACnB;QACF;QAEA,eAAe,CAAC,MAAK;YACnB,IAAI,CAAC,eAAe,EAAE;AAEtB,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;AAE1B,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE;AAE/B,YAAA,IAAI,CAAC,sBAAsB,GAAG,IAAI;AAElC,YAAA,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC;AACxC,QAAA,CAAC,CAAC;IACJ;IAEQ,eAAe,GAAA;AACrB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,EAAE;QAEtC,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,SAAS,EAAE;YAC5C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC;YAE3C;QACF;AAEA,QAAA,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU;AAEpC,QAAA,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,CAAA,YAAA,EAAe,UAAU,GAAG,IAAI,CAAA,GAAA,CAAK,CAAC;QAE1E,IAAI,CAAC,iBAAiB,EAAE;QAExB,MAAM,QAAQ,GAAG,MAAK;YACpB,IAAI,CAAC,iBAAiB,EAAE;AAC1B,QAAA,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC;AAEpD,QAAA,IAAI,CAAC,wBAAwB,GAAG,MAAK;YACnC,IAAI,CAAC,UAAU,EAAE,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,CAAC;AAC1D,QAAA,CAAC;IACH;IAEQ,iBAAiB,GAAA;AACvB,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YACpB;QACF;QAEA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;IAC5C;AAEQ,IAAA,0BAA0B,CAAC,IAA0B,EAAA;AAC3D,QAAA,IAAI,IAAI,CAAC,sBAAsB,KAAK,IAAI,EAAE;AACxC,YAAA,IAAI,CAAC,sBAAsB,GAAG,IAAI;YAClC;QACF;AAEA,QAAA,IAAI,IAAI,CAAC,sBAAsB,KAAK,IAAI,EAAE;YACxC;QACF;AAEA,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,sBAAsB;AAEhD,QAAA,IAAI,CAAC,sBAAsB,GAAG,IAAI;AAElC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,EAAE;AAEtC;;;AAGG;QACH,IAAI,MAAM,CAAC,aAAa,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;YACzC;QACF;AAEA,QAAA,IAAI,IAAI,KAAK,SAAS,EAAE;YACtB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC;QACnC;aAAO;YACL,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC;QAClC;AAEA,QAAA,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,oBAAoB,EAAE,YAAY,CAAC;IAC/F;AAEQ,IAAA,2BAA2B,CAAC,IAA0B,EAAA;AAC5D,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,EAAE;QAEtC,IAAI,MAAM,CAAC,aAAa,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;YACzC;QACF;AAEA;;;;;;AAMG;AACH,QAAA,IAAI,IAAI,KAAK,SAAS,EAAE;YACtB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC;QACnC;aAAO;YACL,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC;QAClC;IACF;IAEQ,iBAAiB,GAAA;AACvB,QAAA,IAAI,CAAC,wBAAwB,IAAI;AAEjC,QAAA,IAAI,CAAC,UAAU,GAAG,SAAS;IAC7B;;;;IAMA,MAAM,GAAA;AACJ,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE;YACf,IAAI,CAAC,KAAK,EAAE;QACd;aAAO;YACL,IAAI,CAAC,UAAU,EAAE;QACnB;IACF;IAEA,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;IACrB;IAEA,KAAK,GAAA;QACH,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,kBAAkB,EAAE,EAAE;YAC9C;QACF;AAEA,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;IACtB;IAEA,GAAG,GAAA;AACD,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;AACrB,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;IACrB;IAEA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;IACxB;IAEA,YAAY,GAAA;AACV,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;YACjB,IAAI,CAAC,KAAK,EAAE;QACd;aAAO;YACL,IAAI,CAAC,GAAG,EAAE;QACZ;IACF;;;;IAMA,eAAe,GAAA;AACb,QAAA,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE;YAC3B;QACF;QAEA,IAAI,CAAC,KAAK,EAAE;IACd;AAEA,IAAA,SAAS,CAAC,KAAoB,EAAA;AAC5B,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE;YAC1B;QACF;AAEA,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE;YACzB;QACF;AAEA,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE;YAChB;QACF;QAEA,IAAI,CAAC,KAAK,EAAE;IACd;;;;IAMQ,UAAU,GAAA;AAChB,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACnB;QACF;AAEA,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;YAClB;QACF;QAEA,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,uBAAuB,CAAC,KAAK,MAAM,EAAE;YAC7D;QACF;AAEA,QAAA,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,EAAE,+BAA+B,EAAE,MAAM,CAAC;AAElF,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,CAAC;IAC7D;IAEQ,YAAY,GAAA;AAClB,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACnB;QACF;AAEA,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;YAClB;QACF;QAEA,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,uBAAuB,CAAC,KAAK,MAAM,EAAE;YAC7D;QACF;QAEA,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,EAAE,+BAA+B,CAAC;QAE7E,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IACtD;uGAzeW,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAtB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,sBAAsB,ouECjCnC,o9DAiDA,EAAA,MAAA,EAAA,CAAA,0+JAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FDhBa,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAPlC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iBAAiB,EAAA,UAAA,EACf,IAAI,EAAA,eAAA,EAGC,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,o9DAAA,EAAA,MAAA,EAAA,CAAA,0+JAAA,CAAA,EAAA;;sBA0J9C,WAAW;uBAAC,oBAAoB;;sBAKhC,WAAW;uBAAC,kBAAkB;;sBAK9B,WAAW;uBAAC,mBAAmB;;sBAK/B,WAAW;uBAAC,qBAAqB;;sBAKjC,WAAW;uBAAC,sBAAsB;;sBAKlC,WAAW;uBAAC,sBAAsB;;sBAKlC,WAAW;uBAAC,mBAAmB;;sBAK/B,WAAW;uBAAC,0BAA0B;;sBAKtC,WAAW;uBAAC,6BAA6B;;sBAKzC,WAAW;uBAAC,4BAA4B;;sBAKxC,WAAW;uBAAC,mBAAmB;;sBAK/B,WAAW;uBAAC,qBAAqB;;sBAKjC,WAAW;uBAAC,oBAAoB;;sBAKhC,WAAW;uBAAC,mBAAmB;;sBAK/B,WAAW;uBAAC,oBAAoB;;;AE/PnC;;AAEG;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngx-kit-dropzone.mjs","sources":["../../../projects/libs/dropzone/services/ngx-dropzone-http-upload.service.ts","../../../projects/libs/dropzone/services/ngx-dropzone-upload.token.ts","../../../projects/libs/dropzone/utils/file-matching.ts","../../../projects/libs/dropzone/components/dropzone.component.ts","../../../projects/libs/dropzone/components/dropzone.component.html","../../../projects/libs/dropzone/ngx-kit-dropzone.ts"],"sourcesContent":["import {\n HttpClient,\n HttpEvent,\n HttpEventType,\n HttpHeaders,\n HttpResponse,\n HttpUploadProgressEvent,\n} from '@angular/common/http';\nimport { Injectable, inject } from '@angular/core';\nimport { Observable, filter, map } from 'rxjs';\nimport {\n NgxDropzoneUploadEvent,\n NgxDropzoneUploadRequest,\n NgxDropzoneUploadService,\n} from '../contracts/dropzone-upload';\n\n@Injectable({ providedIn: 'root' })\nexport class NgxDropzoneHttpUploadService implements NgxDropzoneUploadService {\n private readonly http = inject(HttpClient);\n\n upload<TResponse = unknown>(\n request: NgxDropzoneUploadRequest,\n ): Observable<NgxDropzoneUploadEvent<TResponse>> {\n const body = new FormData();\n body.append(request.alias, request.file, request.file.name);\n\n for (const [key, value] of Object.entries(request.data ?? {})) {\n body.append(key, value instanceof Blob ? value : String(value));\n }\n\n const headers =\n request.headers instanceof HttpHeaders ? request.headers : new HttpHeaders(request.headers);\n\n return this.http\n .post<TResponse>(request.url, body, {\n headers,\n withCredentials: request.withCredentials ?? false,\n observe: 'events',\n reportProgress: true,\n })\n .pipe(\n filter(\n (event): event is HttpUploadProgressEvent | HttpResponse<TResponse> =>\n event.type === HttpEventType.UploadProgress || event.type === HttpEventType.Response,\n ),\n map((event): NgxDropzoneUploadEvent<TResponse> => {\n if (event.type === HttpEventType.UploadProgress) {\n const total = event.total;\n\n return {\n type: 'progress',\n loaded: event.loaded,\n total,\n percent: total ? Math.min(100, Math.round((event.loaded / total) * 100)) : 0,\n };\n }\n\n return {\n type: 'response',\n response: event.body as TResponse,\n status: event.status,\n headers: event.headers,\n };\n }),\n );\n }\n}\n","import { InjectionToken, inject } from '@angular/core';\nimport { NgxDropzoneHttpUploadService } from './ngx-dropzone-http-upload.service';\nimport { NgxDropzoneUploadService } from '../contracts/dropzone-upload';\n\n/**\n * Upload adapter used by ngx-dropzone.\n *\n * Default: Angular HttpClient.\n * Override this token at application/component level to use Axios or any\n * other upload implementation.\n */\nexport const NGX_DROPZONE_UPLOAD_SERVICE = new InjectionToken<NgxDropzoneUploadService>(\n 'NGX_DROPZONE_UPLOAD_SERVICE',\n {\n providedIn: 'root',\n factory: () => inject(NgxDropzoneHttpUploadService),\n },\n);\n","/**\n * چک میکنه یه فایل با pattern رشتهای accept (مثل input[type=file])\n * مطابقت داره یا نه. پشتیبانی میشه از:\n * - MIME کامل: \"image/png\"\n * - MIME با wildcard: \"image/*\"\n * - پسوند فایل: \".png\", \".jpg\"\n * - لیست کاما-جدا از موارد بالا: \"image/*,.pdf,.docx\"\n */\nexport function matchesAccept(file: File, accept?: string): boolean {\n if (!accept || accept.trim() === '') return true;\n\n const patterns = accept\n .split(',')\n .map((p) => p.trim().toLowerCase())\n .filter(Boolean);\n\n if (!patterns.length) return true;\n\n const fileName = file.name.toLowerCase();\n const fileType = (file.type || '').toLowerCase();\n\n return patterns.some((pattern) => {\n if (pattern.startsWith('.')) {\n return fileName.endsWith(pattern);\n }\n if (pattern.endsWith('/*')) {\n const prefix = pattern.slice(0, -1); // \"image/\"\n return fileType.startsWith(prefix);\n }\n return fileType === pattern;\n });\n}\n\n/** تبدیل بایت به یه رشتهی خوانا (KB/MB/GB) */\nexport function formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B';\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\n const i = Math.floor(Math.log(bytes) / Math.log(1024));\n const value = bytes / Math.pow(1024, i);\n return `${value.toFixed(i === 0 ? 0 : 1)} ${units[i]}`;\n}\n\n/** استخراج فایلهای واقعی از یک DataTransfer، شامل پیمایش بازگشتیِ پوشهها (وقتی مرورگر پشتیبانی کنه) */\nexport async function extractFilesFromDataTransfer(dataTransfer: DataTransfer): Promise<File[]> {\n const items = Array.from(dataTransfer.items || []);\n const hasEntrySupport = items.length > 0 && typeof items[0].webkitGetAsEntry === 'function';\n\n if (!hasEntrySupport) {\n return Array.from(dataTransfer.files || []);\n }\n\n const entries = items\n .map((item) => item.webkitGetAsEntry?.())\n .filter((e): e is FileSystemEntry => !!e);\n\n if (!entries.length) {\n return Array.from(dataTransfer.files || []);\n }\n\n const files: File[] = [];\n await Promise.all(entries.map((entry) => walkEntry(entry, files)));\n return files;\n}\n\nfunction walkEntry(entry: FileSystemEntry, out: File[]): Promise<void> {\n return new Promise((resolve) => {\n if (entry.isFile) {\n (entry as FileSystemFileEntry).file(\n (file) => {\n out.push(file);\n resolve();\n },\n () => resolve(),\n );\n } else if (entry.isDirectory) {\n const reader = (entry as FileSystemDirectoryEntry).createReader();\n const readAll: FileSystemEntry[] = [];\n const readBatch = () => {\n reader.readEntries(\n async (batch) => {\n if (!batch.length) {\n await Promise.all(readAll.map((e) => walkEntry(e, out)));\n resolve();\n return;\n }\n readAll.push(...batch);\n readBatch();\n },\n () => resolve(),\n );\n };\n readBatch();\n } else {\n resolve();\n }\n });\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n OnDestroy,\n computed,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { Subscription, finalize } from 'rxjs';\nimport {\n NgxDropzoneFile,\n NgxDropzoneRejectedFile,\n NgxDropzoneRejectionReason,\n} from '../contracts/dropzone-file';\nimport {\n NgxDropzoneUploadProgressEvent,\n NgxDropzoneUploadService,\n} from '../contracts/dropzone-upload';\nimport { NGX_DROPZONE_UPLOAD_SERVICE } from '../services/ngx-dropzone-upload.token';\nimport { extractFilesFromDataTransfer, formatBytes, matchesAccept } from '../utils/file-matching';\n\nlet uidCounter = 0;\nfunction nextId(): string {\n return `ngx-dz-${Date.now().toString(36)}-${uidCounter++}`;\n}\n\nexport type NgxDropzoneUploadMode = 'all' | 'single';\n\n@Component({\n selector: 'ngx-dropzone',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './dropzone.component.html',\n styleUrl: './dropzone.component.scss',\n host: {\n class: 'ngx-dropzone-host',\n },\n})\nexport class NgxDropzoneComponent implements OnDestroy {\n /** الگوی accept مثل input[type=file]: \"image/*\", \".pdf,.docx\" و ... */\n accept = input<string>('');\n multiple = input<boolean>(true);\n /** حداکثر حجم هر فایل به بایت؛ undefined یعنی بدون محدودیت */\n maxFileSize = input<number | undefined>(undefined);\n /** حداکثر تعداد فایل مجاز؛ undefined یعنی بدون محدودیت */\n maxFiles = input<number | undefined>(undefined);\n disabled = input<boolean>(false);\n /** نمایش لیست/پیشنمایش فایلهای انتخابشده داخل خودِ کامپوننت */\n showFileList = input<boolean>(true);\n\n /** Upload endpoint. */\n uploadUrl = input<string>('');\n /** Multipart form-data field name. */\n uploadAlias = input<string>('file');\n /** Automatically enqueue newly accepted files for upload. */\n autoUpload = input<boolean>(false);\n /** Maximum number of simultaneous uploads. */\n maxParallel = input<number>(3);\n /**\n * Manual upload behavior:\n * - all: one \"Upload all\" action uploads all pending files.\n * - single: every pending row gets its own Upload button.\n */\n uploadMode = input<NgxDropzoneUploadMode>('all');\n /** Extra multipart form fields sent with every file. */\n uploadData = input<Record<string, string | Blob | number | boolean>>({});\n /** Optional request headers. */\n uploadHeaders = input<Record<string, string | string[]>>({});\n /** Send credentials/cookies with the upload request. */\n uploadWithCredentials = input<boolean>(false);\n\n filesAdded = output<File[]>();\n filesRejected = output<NgxDropzoneRejectedFile[]>();\n filesChange = output<File[]>();\n\n /** Emitted when an individual upload starts. */\n uploadStarted = output<NgxDropzoneFile>();\n /** Emitted for every upload progress update. */\n uploadProgress = output<NgxDropzoneUploadProgressEvent>();\n /** Emitted after a file is successfully uploaded. */\n uploadSuccess = output<NgxDropzoneFile>();\n /** Emitted when an upload fails. */\n uploadError = output<{ item: NgxDropzoneFile; error: unknown }>();\n\n protected readonly files = signal<NgxDropzoneFile[]>([]);\n protected readonly isDragging = signal(false);\n private dragCounter = 0;\n\n private readonly uploadService = inject<NgxDropzoneUploadService>(NGX_DROPZONE_UPLOAD_SERVICE);\n private readonly fileInput = viewChild<ElementRef<HTMLInputElement>>('fileInput');\n private readonly uploadSubscriptions = new Map<string, Subscription>();\n private readonly uploadQueue: string[] = [];\n private activeUploads = 0;\n private readonly activeUploadIds = new Set<string>();\n\n protected readonly pendingCount = computed(\n () => this.files().filter((item) => this.isPending(item)).length,\n );\n\n protected readonly hasUploadConfiguration = computed(() => this.uploadUrl().trim().length > 0);\n\n protected readonly hint = computed(() => {\n const parts: string[] = [];\n const accept = this.accept();\n if (accept) parts.push(accept);\n const max = this.maxFileSize();\n if (max) parts.push(`max ${formatBytes(max)}`);\n return parts.join(' · ');\n });\n\n protected formatSize(bytes: number): string {\n return formatBytes(bytes);\n }\n\n protected isPending(item: NgxDropzoneFile): boolean {\n return item.status === 'pending' || item.status === 'accepted';\n }\n\n protected trackById(_index: number, item: NgxDropzoneFile): string {\n return item.id;\n }\n\n ngOnDestroy(): void {\n for (const subscription of this.uploadSubscriptions.values()) {\n subscription.unsubscribe();\n }\n this.uploadSubscriptions.clear();\n\n for (const item of this.files()) {\n if (item.previewUrl) URL.revokeObjectURL(item.previewUrl);\n }\n }\n\n protected onDragEnter(ev: DragEvent): void {\n ev.preventDefault();\n if (this.disabled()) return;\n this.dragCounter++;\n this.isDragging.set(true);\n }\n\n protected onDragOver(ev: DragEvent): void {\n ev.preventDefault();\n if (ev.dataTransfer) {\n ev.dataTransfer.dropEffect = this.disabled() ? 'none' : 'copy';\n }\n }\n\n protected onDragLeave(ev: DragEvent): void {\n ev.preventDefault();\n if (this.disabled()) return;\n this.dragCounter = Math.max(0, this.dragCounter - 1);\n if (this.dragCounter === 0) this.isDragging.set(false);\n }\n\n protected async onDrop(ev: DragEvent): Promise<void> {\n ev.preventDefault();\n this.dragCounter = 0;\n this.isDragging.set(false);\n if (this.disabled() || !ev.dataTransfer) return;\n\n const files = await extractFilesFromDataTransfer(ev.dataTransfer);\n this.handleIncomingFiles(files);\n }\n\n protected onBrowseClick(): void {\n if (this.disabled()) return;\n this.fileInput()?.nativeElement.click();\n }\n\n protected onKeydown(ev: KeyboardEvent): void {\n if (ev.key === 'Enter' || ev.key === ' ') {\n ev.preventDefault();\n this.onBrowseClick();\n }\n }\n\n protected onFileInputChange(ev: Event): void {\n const input = ev.target as HTMLInputElement;\n const files = Array.from(input.files ?? []);\n this.handleIncomingFiles(files);\n input.value = '';\n }\n\n protected removeFile(id: string): void {\n const target = this.files().find((f) => f.id === id);\n this.uploadSubscriptions.get(id)?.unsubscribe();\n this.uploadSubscriptions.delete(id);\n\n // Unsubscribing an HttpClient upload cancels the request. Release its\n // concurrency slot immediately; finalize() will see that the id is no\n // longer active and won't decrement twice.\n if (this.activeUploadIds.delete(id)) {\n this.activeUploads = Math.max(0, this.activeUploads - 1);\n }\n\n if (target?.previewUrl) URL.revokeObjectURL(target.previewUrl);\n\n this.files.update((list) => list.filter((f) => f.id !== id));\n\n // Remove stale queue entries. The queue is intentionally lazy, so an\n // entry can safely remain until pumpQueue() sees that it no longer exists.\n this.emitCurrentFiles();\n this.pumpQueue();\n }\n\n protected uploadAll(): void {\n this.enqueueUploads(\n this.files()\n .filter((item) => this.isPending(item))\n .map((item) => item.id),\n );\n }\n\n protected uploadSingle(id: string): void {\n this.enqueueUploads([id]);\n }\n\n protected retryUpload(id: string): void {\n this.files.update((list) =>\n list.map((item) =>\n item.id === id ? { ...item, status: 'pending', progress: 0, error: undefined } : item,\n ),\n );\n this.enqueueUploads([id]);\n }\n\n private handleIncomingFiles(incoming: File[]): void {\n if (!incoming.length) return;\n\n const accepted: NgxDropzoneFile[] = [];\n const rejected: NgxDropzoneRejectedFile[] = [];\n\n // A single-file dropzone behaves like a native single-select input:\n // selecting another file replaces the previous one.\n const existingCount = this.multiple() ? this.files().length : 0;\n const maxFiles = this.maxFiles();\n const maxSize = this.maxFileSize();\n const isMultiple = this.multiple();\n\n const pool = isMultiple ? incoming : incoming.slice(0, 1);\n\n for (const file of pool) {\n let reason: NgxDropzoneRejectionReason | undefined;\n\n if (!matchesAccept(file, this.accept())) {\n reason = 'type';\n } else if (maxSize != null && file.size > maxSize) {\n reason = 'size';\n } else if (maxFiles != null && existingCount + accepted.length >= maxFiles) {\n reason = 'count';\n }\n\n if (reason) {\n rejected.push({ file, reason });\n continue;\n }\n\n const isImage = file.type.startsWith('image/');\n accepted.push({\n id: nextId(),\n file,\n previewUrl: isImage ? URL.createObjectURL(file) : undefined,\n status: 'accepted',\n progress: 0,\n });\n }\n\n if (accepted.length) {\n if (!isMultiple) {\n for (const previous of this.files()) {\n this.uploadSubscriptions.get(previous.id)?.unsubscribe();\n this.uploadSubscriptions.delete(previous.id);\n this.activeUploadIds.delete(previous.id);\n if (previous.previewUrl) URL.revokeObjectURL(previous.previewUrl);\n }\n this.activeUploads = this.activeUploadIds.size;\n }\n\n this.files.update((list) => (isMultiple ? [...list, ...accepted] : accepted));\n this.filesAdded.emit(accepted.map((a) => a.file));\n this.emitCurrentFiles();\n\n if (this.autoUpload()) {\n this.enqueueUploads(accepted.map((item) => item.id));\n }\n }\n\n if (rejected.length) {\n this.filesRejected.emit(rejected);\n }\n }\n\n private enqueueUploads(ids: string[]): void {\n if (!this.uploadUrl().trim()) {\n const error = new Error('ngx-dropzone: uploadUrl is required for uploading files.');\n for (const id of ids) this.markUploadError(id, error, false);\n return;\n }\n\n const queued = new Set(this.uploadQueue);\n for (const id of ids) {\n const item = this.files().find((file) => file.id === id);\n if (!item || !this.isPending(item) || queued.has(id)) continue;\n this.uploadQueue.push(id);\n queued.add(id);\n }\n\n this.pumpQueue();\n }\n\n private pumpQueue(): void {\n const limit = Math.max(1, Math.floor(this.maxParallel() || 1));\n\n while (this.activeUploads < limit && this.uploadQueue.length) {\n const id = this.uploadQueue.shift()!;\n const item = this.files().find((file) => file.id === id);\n\n if (!item || !this.isPending(item)) continue;\n\n this.startUpload(item);\n }\n }\n\n private startUpload(item: NgxDropzoneFile): void {\n this.activeUploads++;\n this.activeUploadIds.add(item.id);\n\n this.updateFile(item.id, {\n status: 'uploading',\n progress: 0,\n error: undefined,\n });\n\n const current = this.files().find((file) => file.id === item.id);\n if (current) this.uploadStarted.emit(current);\n\n let subscription: Subscription;\n\n try {\n subscription = this.uploadService\n .upload({\n url: this.uploadUrl(),\n alias: this.uploadAlias() || 'file',\n file: item.file,\n data: this.uploadData(),\n headers: this.uploadHeaders(),\n withCredentials: this.uploadWithCredentials(),\n })\n .pipe(finalize(() => this.finishUpload(item.id)))\n .subscribe({\n next: (event) => {\n if (event.type === 'progress') {\n this.updateFile(item.id, {\n progress: event.percent,\n });\n\n const updated = this.files().find((file) => file.id === item.id);\n if (updated) {\n this.uploadProgress.emit({\n item: updated,\n loaded: event.loaded,\n total: event.total,\n percent: event.percent,\n });\n }\n return;\n }\n\n this.updateFile(item.id, {\n status: 'uploaded',\n progress: 100,\n response: event.response,\n error: undefined,\n });\n\n const updated = this.files().find((file) => file.id === item.id);\n if (updated) this.uploadSuccess.emit(updated);\n },\n error: (error) => {\n this.markUploadError(item.id, error, true);\n },\n });\n } catch (error) {\n this.markUploadError(item.id, error, true);\n this.finishUpload(item.id);\n return;\n }\n\n if (!subscription.closed) this.uploadSubscriptions.set(item.id, subscription);\n }\n\n private markUploadError(id: string, error: unknown, releaseActiveSlot: boolean): void {\n this.updateFile(id, {\n status: 'error',\n error,\n });\n\n const item = this.files().find((file) => file.id === id);\n if (item) this.uploadError.emit({ item, error });\n\n if (!releaseActiveSlot) {\n this.pumpQueue();\n }\n }\n\n private finishUpload(id: string): void {\n this.uploadSubscriptions.delete(id);\n\n if (this.activeUploadIds.delete(id)) {\n this.activeUploads = Math.max(0, this.activeUploads - 1);\n }\n\n this.pumpQueue();\n }\n\n private updateFile(id: string, patch: Partial<NgxDropzoneFile>): void {\n this.files.update((list) =>\n list.map((item) => (item.id === id ? { ...item, ...patch } : item)),\n );\n }\n\n private emitCurrentFiles(): void {\n this.filesChange.emit(this.files().map((f) => f.file));\n }\n}\n","<div\n class=\"ngx-dropzone\"\n [class.dragging]=\"isDragging()\"\n [class.disabled]=\"disabled()\"\n [class.has-files]=\"files().length > 0\"\n tabindex=\"0\"\n role=\"button\"\n [attr.aria-disabled]=\"disabled()\"\n (click)=\"onBrowseClick()\"\n (keydown)=\"onKeydown($event)\"\n (dragenter)=\"onDragEnter($event)\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\">\n <input\n #fileInput\n type=\"file\"\n class=\"ngx-dropzone-input\"\n [accept]=\"accept()\"\n [multiple]=\"multiple()\"\n [disabled]=\"disabled()\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"onFileInputChange($event)\" />\n\n <div class=\"ngx-dropzone-icon-wrap\">\n <ng-content select=\"[dropzone-icon]\">\n <svg class=\"ngx-dropzone-icon\" viewBox=\"0 0 24 24\" fill=\"none\" width=\"30\" height=\"30\">\n <path\n d=\"M12 16V4M12 4l-4 4M12 4l4 4M4 16v2a2 2 0 002 2h12a2 2 0 002-2v-2\"\n stroke=\"currentColor\"\n stroke-width=\"1.8\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </ng-content>\n </div>\n\n <div class=\"ngx-dropzone-text\">\n <ng-content>\n <strong>Drop files here</strong>\n <span>or click to browse</span>\n </ng-content>\n </div>\n\n @if (hint()) {\n <div class=\"ngx-dropzone-hint\">{{ hint() }}</div>\n }\n</div>\n\n@if (!autoUpload() && uploadMode() === 'all' && pendingCount() > 0) {\n <div class=\"ngx-dropzone-actions\">\n <button\n type=\"button\"\n class=\"ngx-dropzone-upload-all\"\n [disabled]=\"disabled() || !hasUploadConfiguration()\"\n (click)=\"uploadAll(); $event.stopPropagation()\">\n Upload all\n <span>{{ pendingCount() }}</span>\n </button>\n </div>\n}\n\n@if (showFileList() && files().length) {\n <ul class=\"ngx-dropzone-list\">\n @for (item of files(); track item.id) {\n <li class=\"ngx-dropzone-item\" [class.is-uploading]=\"item.status === 'uploading'\">\n <div class=\"ngx-dropzone-thumb-wrap\">\n @if (item.previewUrl) {\n <img class=\"ngx-dropzone-thumb\" [src]=\"item.previewUrl\" [alt]=\"item.file.name\" />\n } @else {\n <span class=\"ngx-dropzone-file-icon\">📄</span>\n }\n </div>\n\n <div class=\"ngx-dropzone-meta\">\n <span class=\"ngx-dropzone-name\" [title]=\"item.file.name\">{{ item.file.name }}</span>\n <span class=\"ngx-dropzone-size\">{{ formatSize(item.file.size) }}</span>\n\n @if (item.status === 'uploading' || item.status === 'uploaded') {\n <div\n class=\"ngx-dropzone-progress\"\n role=\"progressbar\"\n [attr.aria-valuenow]=\"item.progress\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n [attr.aria-label]=\"'Upload progress for ' + item.file.name\">\n <span class=\"ngx-dropzone-progress-bar\" [style.width.%]=\"item.progress\"></span>\n </div>\n <span class=\"ngx-dropzone-progress-text\">{{ item.progress }}%</span>\n }\n\n @if (item.status === 'error') {\n <span class=\"ngx-dropzone-error\">Upload failed</span>\n }\n </div>\n\n <div class=\"ngx-dropzone-row-actions\">\n @if (!autoUpload() && uploadMode() === 'single' && isPending(item)) {\n <button\n type=\"button\"\n class=\"ngx-dropzone-upload\"\n [disabled]=\"disabled() || !hasUploadConfiguration()\"\n [attr.aria-label]=\"'Upload ' + item.file.name\"\n (click)=\"uploadSingle(item.id); $event.stopPropagation()\">\n Upload\n </button>\n }\n\n @if (item.status === 'error') {\n <button\n type=\"button\"\n class=\"ngx-dropzone-retry\"\n [disabled]=\"disabled() || !hasUploadConfiguration()\"\n [attr.aria-label]=\"'Retry upload for ' + item.file.name\"\n (click)=\"retryUpload(item.id); $event.stopPropagation()\">\n Retry\n </button>\n }\n\n @if (item.status === 'uploaded') {\n <span class=\"ngx-dropzone-status success\" aria-label=\"Uploaded\">✓</span>\n } @else if (item.status === 'uploading') {\n <span class=\"ngx-dropzone-status uploading\" aria-label=\"Uploading\"></span>\n } @else if (item.status === 'error') {\n <span class=\"ngx-dropzone-status error\" aria-label=\"Upload failed\">!</span>\n } @else {\n <span class=\"ngx-dropzone-status pending\" aria-label=\"Pending\">•</span>\n }\n\n <button\n type=\"button\"\n class=\"ngx-dropzone-remove\"\n [attr.aria-label]=\"'Remove ' + item.file.name\"\n (click)=\"removeFile(item.id); $event.stopPropagation()\">\n ✕\n </button>\n </div>\n </li>\n }\n </ul>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ngx-kit-dropzone.mjs","sources":["../../../projects/libs/dropzone/services/ngx-dropzone-http-upload.service.ts","../../../projects/libs/dropzone/services/ngx-dropzone-upload.token.ts","../../../projects/libs/dropzone/utils/file-matching.ts","../../../projects/libs/dropzone/components/dropzone.component.ts","../../../projects/libs/dropzone/components/dropzone.component.html","../../../projects/libs/dropzone/ngx-kit-dropzone.ts"],"sourcesContent":["import {\r\n HttpClient,\r\n HttpEvent,\r\n HttpEventType,\r\n HttpHeaders,\r\n HttpResponse,\r\n HttpUploadProgressEvent,\r\n} from '@angular/common/http';\r\nimport { Injectable, inject } from '@angular/core';\r\nimport { Observable, filter, map } from 'rxjs';\r\nimport {\r\n NgxDropzoneUploadEvent,\r\n NgxDropzoneUploadRequest,\r\n NgxDropzoneUploadService,\r\n} from '../contracts/dropzone-upload';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class NgxDropzoneHttpUploadService implements NgxDropzoneUploadService {\r\n private readonly http = inject(HttpClient);\r\n\r\n upload<TResponse = unknown>(\r\n request: NgxDropzoneUploadRequest,\r\n ): Observable<NgxDropzoneUploadEvent<TResponse>> {\r\n const body = new FormData();\r\n body.append(request.alias, request.file, request.file.name);\r\n\r\n for (const [key, value] of Object.entries(request.data ?? {})) {\r\n body.append(key, value instanceof Blob ? value : String(value));\r\n }\r\n\r\n const headers =\r\n request.headers instanceof HttpHeaders ? request.headers : new HttpHeaders(request.headers);\r\n\r\n return this.http\r\n .post<TResponse>(request.url, body, {\r\n headers,\r\n withCredentials: request.withCredentials ?? false,\r\n observe: 'events',\r\n reportProgress: true,\r\n })\r\n .pipe(\r\n filter(\r\n (event): event is HttpUploadProgressEvent | HttpResponse<TResponse> =>\r\n event.type === HttpEventType.UploadProgress || event.type === HttpEventType.Response,\r\n ),\r\n map((event): NgxDropzoneUploadEvent<TResponse> => {\r\n if (event.type === HttpEventType.UploadProgress) {\r\n const total = event.total;\r\n\r\n return {\r\n type: 'progress',\r\n loaded: event.loaded,\r\n total,\r\n percent: total ? Math.min(100, Math.round((event.loaded / total) * 100)) : 0,\r\n };\r\n }\r\n\r\n return {\r\n type: 'response',\r\n response: event.body as TResponse,\r\n status: event.status,\r\n headers: event.headers,\r\n };\r\n }),\r\n );\r\n }\r\n}\r\n","import { InjectionToken, inject } from '@angular/core';\nimport { NgxDropzoneHttpUploadService } from './ngx-dropzone-http-upload.service';\nimport { NgxDropzoneUploadService } from '../contracts/dropzone-upload';\n\n/**\n * Upload adapter used by ngx-dropzone.\n *\n * Default: Angular HttpClient.\n * Override this token at application/component level to use Axios or any\n * other upload implementation.\n */\nexport const NGX_DROPZONE_UPLOAD_SERVICE = new InjectionToken<NgxDropzoneUploadService>(\n 'NGX_DROPZONE_UPLOAD_SERVICE',\n {\n providedIn: 'root',\n factory: () => inject(NgxDropzoneHttpUploadService),\n },\n);\n","/**\n * چک میکنه یه فایل با pattern رشتهای accept (مثل input[type=file])\n * مطابقت داره یا نه. پشتیبانی میشه از:\n * - MIME کامل: \"image/png\"\n * - MIME با wildcard: \"image/*\"\n * - پسوند فایل: \".png\", \".jpg\"\n * - لیست کاما-جدا از موارد بالا: \"image/*,.pdf,.docx\"\n */\nexport function matchesAccept(file: File, accept?: string): boolean {\n if (!accept || accept.trim() === '') return true;\n\n const patterns = accept\n .split(',')\n .map((p) => p.trim().toLowerCase())\n .filter(Boolean);\n\n if (!patterns.length) return true;\n\n const fileName = file.name.toLowerCase();\n const fileType = (file.type || '').toLowerCase();\n\n return patterns.some((pattern) => {\n if (pattern.startsWith('.')) {\n return fileName.endsWith(pattern);\n }\n if (pattern.endsWith('/*')) {\n const prefix = pattern.slice(0, -1); // \"image/\"\n return fileType.startsWith(prefix);\n }\n return fileType === pattern;\n });\n}\n\n/** تبدیل بایت به یه رشتهی خوانا (KB/MB/GB) */\nexport function formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B';\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\n const i = Math.floor(Math.log(bytes) / Math.log(1024));\n const value = bytes / Math.pow(1024, i);\n return `${value.toFixed(i === 0 ? 0 : 1)} ${units[i]}`;\n}\n\n/** استخراج فایلهای واقعی از یک DataTransfer، شامل پیمایش بازگشتیِ پوشهها (وقتی مرورگر پشتیبانی کنه) */\nexport async function extractFilesFromDataTransfer(dataTransfer: DataTransfer): Promise<File[]> {\n const items = Array.from(dataTransfer.items || []);\n const hasEntrySupport = items.length > 0 && typeof items[0].webkitGetAsEntry === 'function';\n\n if (!hasEntrySupport) {\n return Array.from(dataTransfer.files || []);\n }\n\n const entries = items\n .map((item) => item.webkitGetAsEntry?.())\n .filter((e): e is FileSystemEntry => !!e);\n\n if (!entries.length) {\n return Array.from(dataTransfer.files || []);\n }\n\n const files: File[] = [];\n await Promise.all(entries.map((entry) => walkEntry(entry, files)));\n return files;\n}\n\nfunction walkEntry(entry: FileSystemEntry, out: File[]): Promise<void> {\n return new Promise((resolve) => {\n if (entry.isFile) {\n (entry as FileSystemFileEntry).file(\n (file) => {\n out.push(file);\n resolve();\n },\n () => resolve(),\n );\n } else if (entry.isDirectory) {\n const reader = (entry as FileSystemDirectoryEntry).createReader();\n const readAll: FileSystemEntry[] = [];\n const readBatch = () => {\n reader.readEntries(\n async (batch) => {\n if (!batch.length) {\n await Promise.all(readAll.map((e) => walkEntry(e, out)));\n resolve();\n return;\n }\n readAll.push(...batch);\n readBatch();\n },\n () => resolve(),\n );\n };\n readBatch();\n } else {\n resolve();\n }\n });\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n OnDestroy,\n computed,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { Subscription, finalize } from 'rxjs';\nimport {\n NgxDropzoneFile,\n NgxDropzoneRejectedFile,\n NgxDropzoneRejectionReason,\n} from '../contracts/dropzone-file';\nimport {\n NgxDropzoneUploadProgressEvent,\n NgxDropzoneUploadService,\n} from '../contracts/dropzone-upload';\nimport { NGX_DROPZONE_UPLOAD_SERVICE } from '../services/ngx-dropzone-upload.token';\nimport { extractFilesFromDataTransfer, formatBytes, matchesAccept } from '../utils/file-matching';\n\nlet uidCounter = 0;\nfunction nextId(): string {\n return `ngx-dz-${Date.now().toString(36)}-${uidCounter++}`;\n}\n\nexport type NgxDropzoneUploadMode = 'all' | 'single';\n\n@Component({\n selector: 'ngx-dropzone',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './dropzone.component.html',\n styleUrl: './dropzone.component.scss',\n host: {\n class: 'ngx-dropzone-host',\n },\n})\nexport class NgxDropzoneComponent implements OnDestroy {\n /** الگوی accept مثل input[type=file]: \"image/*\", \".pdf,.docx\" و ... */\n accept = input<string>('');\n multiple = input<boolean>(true);\n /** حداکثر حجم هر فایل به بایت؛ undefined یعنی بدون محدودیت */\n maxFileSize = input<number | undefined>(undefined);\n /** حداکثر تعداد فایل مجاز؛ undefined یعنی بدون محدودیت */\n maxFiles = input<number | undefined>(undefined);\n disabled = input<boolean>(false);\n /** نمایش لیست/پیشنمایش فایلهای انتخابشده داخل خودِ کامپوننت */\n showFileList = input<boolean>(true);\n\n /** Upload endpoint. */\n uploadUrl = input<string>('');\n /** Multipart form-data field name. */\n uploadAlias = input<string>('file');\n /** Automatically enqueue newly accepted files for upload. */\n autoUpload = input<boolean>(false);\n /** Maximum number of simultaneous uploads. */\n maxParallel = input<number>(3);\n /**\n * Manual upload behavior:\n * - all: one \"Upload all\" action uploads all pending files.\n * - single: every pending row gets its own Upload button.\n */\n uploadMode = input<NgxDropzoneUploadMode>('all');\n /** Extra multipart form fields sent with every file. */\n uploadData = input<Record<string, string | Blob | number | boolean>>({});\n /** Optional request headers. */\n uploadHeaders = input<Record<string, string | string[]>>({});\n /** Send credentials/cookies with the upload request. */\n uploadWithCredentials = input<boolean>(false);\n\n filesAdded = output<File[]>();\n filesRejected = output<NgxDropzoneRejectedFile[]>();\n filesChange = output<File[]>();\n\n /** Emitted when an individual upload starts. */\n uploadStarted = output<NgxDropzoneFile>();\n /** Emitted for every upload progress update. */\n uploadProgress = output<NgxDropzoneUploadProgressEvent>();\n /** Emitted after a file is successfully uploaded. */\n uploadSuccess = output<NgxDropzoneFile>();\n /** Emitted when an upload fails. */\n uploadError = output<{ item: NgxDropzoneFile; error: unknown }>();\n\n protected readonly files = signal<NgxDropzoneFile[]>([]);\n protected readonly isDragging = signal(false);\n private dragCounter = 0;\n\n private readonly uploadService = inject<NgxDropzoneUploadService>(NGX_DROPZONE_UPLOAD_SERVICE);\n private readonly fileInput = viewChild<ElementRef<HTMLInputElement>>('fileInput');\n private readonly uploadSubscriptions = new Map<string, Subscription>();\n private readonly uploadQueue: string[] = [];\n private activeUploads = 0;\n private readonly activeUploadIds = new Set<string>();\n\n protected readonly pendingCount = computed(\n () => this.files().filter((item) => this.isPending(item)).length,\n );\n\n protected readonly hasUploadConfiguration = computed(() => this.uploadUrl().trim().length > 0);\n\n protected readonly hint = computed(() => {\n const parts: string[] = [];\n const accept = this.accept();\n if (accept) parts.push(accept);\n const max = this.maxFileSize();\n if (max) parts.push(`max ${formatBytes(max)}`);\n return parts.join(' · ');\n });\n\n protected formatSize(bytes: number): string {\n return formatBytes(bytes);\n }\n\n protected isPending(item: NgxDropzoneFile): boolean {\n return item.status === 'pending' || item.status === 'accepted';\n }\n\n protected trackById(_index: number, item: NgxDropzoneFile): string {\n return item.id;\n }\n\n ngOnDestroy(): void {\n for (const subscription of this.uploadSubscriptions.values()) {\n subscription.unsubscribe();\n }\n this.uploadSubscriptions.clear();\n\n for (const item of this.files()) {\n if (item.previewUrl) URL.revokeObjectURL(item.previewUrl);\n }\n }\n\n protected onDragEnter(ev: DragEvent): void {\n ev.preventDefault();\n if (this.disabled()) return;\n this.dragCounter++;\n this.isDragging.set(true);\n }\n\n protected onDragOver(ev: DragEvent): void {\n ev.preventDefault();\n if (ev.dataTransfer) {\n ev.dataTransfer.dropEffect = this.disabled() ? 'none' : 'copy';\n }\n }\n\n protected onDragLeave(ev: DragEvent): void {\n ev.preventDefault();\n if (this.disabled()) return;\n this.dragCounter = Math.max(0, this.dragCounter - 1);\n if (this.dragCounter === 0) this.isDragging.set(false);\n }\n\n protected async onDrop(ev: DragEvent): Promise<void> {\n ev.preventDefault();\n this.dragCounter = 0;\n this.isDragging.set(false);\n if (this.disabled() || !ev.dataTransfer) return;\n\n const files = await extractFilesFromDataTransfer(ev.dataTransfer);\n this.handleIncomingFiles(files);\n }\n\n protected onBrowseClick(): void {\n if (this.disabled()) return;\n this.fileInput()?.nativeElement.click();\n }\n\n protected onKeydown(ev: KeyboardEvent): void {\n if (ev.key === 'Enter' || ev.key === ' ') {\n ev.preventDefault();\n this.onBrowseClick();\n }\n }\n\n protected onFileInputChange(ev: Event): void {\n const input = ev.target as HTMLInputElement;\n const files = Array.from(input.files ?? []);\n this.handleIncomingFiles(files);\n input.value = '';\n }\n\n protected removeFile(id: string): void {\n const target = this.files().find((f) => f.id === id);\n this.uploadSubscriptions.get(id)?.unsubscribe();\n this.uploadSubscriptions.delete(id);\n\n // Unsubscribing an HttpClient upload cancels the request. Release its\n // concurrency slot immediately; finalize() will see that the id is no\n // longer active and won't decrement twice.\n if (this.activeUploadIds.delete(id)) {\n this.activeUploads = Math.max(0, this.activeUploads - 1);\n }\n\n if (target?.previewUrl) URL.revokeObjectURL(target.previewUrl);\n\n this.files.update((list) => list.filter((f) => f.id !== id));\n\n // Remove stale queue entries. The queue is intentionally lazy, so an\n // entry can safely remain until pumpQueue() sees that it no longer exists.\n this.emitCurrentFiles();\n this.pumpQueue();\n }\n\n protected uploadAll(): void {\n this.enqueueUploads(\n this.files()\n .filter((item) => this.isPending(item))\n .map((item) => item.id),\n );\n }\n\n protected uploadSingle(id: string): void {\n this.enqueueUploads([id]);\n }\n\n protected retryUpload(id: string): void {\n this.files.update((list) =>\n list.map((item) =>\n item.id === id ? { ...item, status: 'pending', progress: 0, error: undefined } : item,\n ),\n );\n this.enqueueUploads([id]);\n }\n\n private handleIncomingFiles(incoming: File[]): void {\n if (!incoming.length) return;\n\n const accepted: NgxDropzoneFile[] = [];\n const rejected: NgxDropzoneRejectedFile[] = [];\n\n // A single-file dropzone behaves like a native single-select input:\n // selecting another file replaces the previous one.\n const existingCount = this.multiple() ? this.files().length : 0;\n const maxFiles = this.maxFiles();\n const maxSize = this.maxFileSize();\n const isMultiple = this.multiple();\n\n const pool = isMultiple ? incoming : incoming.slice(0, 1);\n\n for (const file of pool) {\n let reason: NgxDropzoneRejectionReason | undefined;\n\n if (!matchesAccept(file, this.accept())) {\n reason = 'type';\n } else if (maxSize != null && file.size > maxSize) {\n reason = 'size';\n } else if (maxFiles != null && existingCount + accepted.length >= maxFiles) {\n reason = 'count';\n }\n\n if (reason) {\n rejected.push({ file, reason });\n continue;\n }\n\n const isImage = file.type.startsWith('image/');\n accepted.push({\n id: nextId(),\n file,\n previewUrl: isImage ? URL.createObjectURL(file) : undefined,\n status: 'accepted',\n progress: 0,\n });\n }\n\n if (accepted.length) {\n if (!isMultiple) {\n for (const previous of this.files()) {\n this.uploadSubscriptions.get(previous.id)?.unsubscribe();\n this.uploadSubscriptions.delete(previous.id);\n this.activeUploadIds.delete(previous.id);\n if (previous.previewUrl) URL.revokeObjectURL(previous.previewUrl);\n }\n this.activeUploads = this.activeUploadIds.size;\n }\n\n this.files.update((list) => (isMultiple ? [...list, ...accepted] : accepted));\n this.filesAdded.emit(accepted.map((a) => a.file));\n this.emitCurrentFiles();\n\n if (this.autoUpload()) {\n this.enqueueUploads(accepted.map((item) => item.id));\n }\n }\n\n if (rejected.length) {\n this.filesRejected.emit(rejected);\n }\n }\n\n private enqueueUploads(ids: string[]): void {\n if (!this.uploadUrl().trim()) {\n const error = new Error('ngx-dropzone: uploadUrl is required for uploading files.');\n for (const id of ids) this.markUploadError(id, error, false);\n return;\n }\n\n const queued = new Set(this.uploadQueue);\n for (const id of ids) {\n const item = this.files().find((file) => file.id === id);\n if (!item || !this.isPending(item) || queued.has(id)) continue;\n this.uploadQueue.push(id);\n queued.add(id);\n }\n\n this.pumpQueue();\n }\n\n private pumpQueue(): void {\n const limit = Math.max(1, Math.floor(this.maxParallel() || 1));\n\n while (this.activeUploads < limit && this.uploadQueue.length) {\n const id = this.uploadQueue.shift()!;\n const item = this.files().find((file) => file.id === id);\n\n if (!item || !this.isPending(item)) continue;\n\n this.startUpload(item);\n }\n }\n\n private startUpload(item: NgxDropzoneFile): void {\n this.activeUploads++;\n this.activeUploadIds.add(item.id);\n\n this.updateFile(item.id, {\n status: 'uploading',\n progress: 0,\n error: undefined,\n });\n\n const current = this.files().find((file) => file.id === item.id);\n if (current) this.uploadStarted.emit(current);\n\n let subscription: Subscription;\n\n try {\n subscription = this.uploadService\n .upload({\n url: this.uploadUrl(),\n alias: this.uploadAlias() || 'file',\n file: item.file,\n data: this.uploadData(),\n headers: this.uploadHeaders(),\n withCredentials: this.uploadWithCredentials(),\n })\n .pipe(finalize(() => this.finishUpload(item.id)))\n .subscribe({\n next: (event) => {\n if (event.type === 'progress') {\n this.updateFile(item.id, {\n progress: event.percent,\n });\n\n const updated = this.files().find((file) => file.id === item.id);\n if (updated) {\n this.uploadProgress.emit({\n item: updated,\n loaded: event.loaded,\n total: event.total,\n percent: event.percent,\n });\n }\n return;\n }\n\n this.updateFile(item.id, {\n status: 'uploaded',\n progress: 100,\n response: event.response,\n error: undefined,\n });\n\n const updated = this.files().find((file) => file.id === item.id);\n if (updated) this.uploadSuccess.emit(updated);\n },\n error: (error) => {\n this.markUploadError(item.id, error, true);\n },\n });\n } catch (error) {\n this.markUploadError(item.id, error, true);\n this.finishUpload(item.id);\n return;\n }\n\n if (!subscription.closed) this.uploadSubscriptions.set(item.id, subscription);\n }\n\n private markUploadError(id: string, error: unknown, releaseActiveSlot: boolean): void {\n this.updateFile(id, {\n status: 'error',\n error,\n });\n\n const item = this.files().find((file) => file.id === id);\n if (item) this.uploadError.emit({ item, error });\n\n if (!releaseActiveSlot) {\n this.pumpQueue();\n }\n }\n\n private finishUpload(id: string): void {\n this.uploadSubscriptions.delete(id);\n\n if (this.activeUploadIds.delete(id)) {\n this.activeUploads = Math.max(0, this.activeUploads - 1);\n }\n\n this.pumpQueue();\n }\n\n private updateFile(id: string, patch: Partial<NgxDropzoneFile>): void {\n this.files.update((list) =>\n list.map((item) => (item.id === id ? { ...item, ...patch } : item)),\n );\n }\n\n private emitCurrentFiles(): void {\n this.filesChange.emit(this.files().map((f) => f.file));\n }\n}\n","<div\n class=\"ngx-dropzone\"\n [class.dragging]=\"isDragging()\"\n [class.disabled]=\"disabled()\"\n [class.has-files]=\"files().length > 0\"\n tabindex=\"0\"\n role=\"button\"\n [attr.aria-disabled]=\"disabled()\"\n (click)=\"onBrowseClick()\"\n (keydown)=\"onKeydown($event)\"\n (dragenter)=\"onDragEnter($event)\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\">\n <input\n #fileInput\n type=\"file\"\n class=\"ngx-dropzone-input\"\n [accept]=\"accept()\"\n [multiple]=\"multiple()\"\n [disabled]=\"disabled()\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"onFileInputChange($event)\" />\n\n <div class=\"ngx-dropzone-icon-wrap\">\n <ng-content select=\"[dropzone-icon]\">\n <svg class=\"ngx-dropzone-icon\" viewBox=\"0 0 24 24\" fill=\"none\" width=\"30\" height=\"30\">\n <path\n d=\"M12 16V4M12 4l-4 4M12 4l4 4M4 16v2a2 2 0 002 2h12a2 2 0 002-2v-2\"\n stroke=\"currentColor\"\n stroke-width=\"1.8\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </ng-content>\n </div>\n\n <div class=\"ngx-dropzone-text\">\n <ng-content>\n <strong>Drop files here</strong>\n <span>or click to browse</span>\n </ng-content>\n </div>\n\n @if (hint()) {\n <div class=\"ngx-dropzone-hint\">{{ hint() }}</div>\n }\n</div>\n\n@if (!autoUpload() && uploadMode() === 'all' && pendingCount() > 0) {\n <div class=\"ngx-dropzone-actions\">\n <button\n type=\"button\"\n class=\"ngx-dropzone-upload-all\"\n [disabled]=\"disabled() || !hasUploadConfiguration()\"\n (click)=\"uploadAll(); $event.stopPropagation()\">\n Upload all\n <span>{{ pendingCount() }}</span>\n </button>\n </div>\n}\n\n@if (showFileList() && files().length) {\n <ul class=\"ngx-dropzone-list\">\n @for (item of files(); track item.id) {\n <li class=\"ngx-dropzone-item\" [class.is-uploading]=\"item.status === 'uploading'\">\n <div class=\"ngx-dropzone-thumb-wrap\">\n @if (item.previewUrl) {\n <img class=\"ngx-dropzone-thumb\" [src]=\"item.previewUrl\" [alt]=\"item.file.name\" />\n } @else {\n <span class=\"ngx-dropzone-file-icon\">📄</span>\n }\n </div>\n\n <div class=\"ngx-dropzone-meta\">\n <span class=\"ngx-dropzone-name\" [title]=\"item.file.name\">{{ item.file.name }}</span>\n <span class=\"ngx-dropzone-size\">{{ formatSize(item.file.size) }}</span>\n\n @if (item.status === 'uploading' || item.status === 'uploaded') {\n <div\n class=\"ngx-dropzone-progress\"\n role=\"progressbar\"\n [attr.aria-valuenow]=\"item.progress\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n [attr.aria-label]=\"'Upload progress for ' + item.file.name\">\n <span class=\"ngx-dropzone-progress-bar\" [style.width.%]=\"item.progress\"></span>\n </div>\n <span class=\"ngx-dropzone-progress-text\">{{ item.progress }}%</span>\n }\n\n @if (item.status === 'error') {\n <span class=\"ngx-dropzone-error\">Upload failed</span>\n }\n </div>\n\n <div class=\"ngx-dropzone-row-actions\">\n @if (!autoUpload() && uploadMode() === 'single' && isPending(item)) {\n <button\n type=\"button\"\n class=\"ngx-dropzone-upload\"\n [disabled]=\"disabled() || !hasUploadConfiguration()\"\n [attr.aria-label]=\"'Upload ' + item.file.name\"\n (click)=\"uploadSingle(item.id); $event.stopPropagation()\">\n Upload\n </button>\n }\n\n @if (item.status === 'error') {\n <button\n type=\"button\"\n class=\"ngx-dropzone-retry\"\n [disabled]=\"disabled() || !hasUploadConfiguration()\"\n [attr.aria-label]=\"'Retry upload for ' + item.file.name\"\n (click)=\"retryUpload(item.id); $event.stopPropagation()\">\n Retry\n </button>\n }\n\n @if (item.status === 'uploaded') {\n <span class=\"ngx-dropzone-status success\" aria-label=\"Uploaded\">✓</span>\n } @else if (item.status === 'uploading') {\n <span class=\"ngx-dropzone-status uploading\" aria-label=\"Uploading\"></span>\n } @else if (item.status === 'error') {\n <span class=\"ngx-dropzone-status error\" aria-label=\"Upload failed\">!</span>\n } @else {\n <span class=\"ngx-dropzone-status pending\" aria-label=\"Pending\">•</span>\n }\n\n <button\n type=\"button\"\n class=\"ngx-dropzone-remove\"\n [attr.aria-label]=\"'Remove ' + item.file.name\"\n (click)=\"removeFile(item.id); $event.stopPropagation()\">\n ✕\n </button>\n </div>\n </li>\n }\n </ul>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { InjectionToken, signal, inject, input, computed, ViewEncapsulation, ChangeDetectionStrategy, Component, ElementRef, HostListener, Directive } from '@angular/core';
|
|
2
|
+
import { InjectionToken, signal, inject, input, computed, model, ViewEncapsulation, ChangeDetectionStrategy, Component, ElementRef, HostListener, Directive } from '@angular/core';
|
|
3
3
|
|
|
4
4
|
const MX_FORM_FIELD = new InjectionToken('mx-form-field', {
|
|
5
5
|
factory: () => new MgxFormFieldRef(),
|
|
@@ -35,13 +35,19 @@ class NgxFormField {
|
|
|
35
35
|
...(ngDevMode ? [{ debugName: "hintVisible" }] : /* istanbul ignore next */ []));
|
|
36
36
|
errorVisible = computed(() => this.invalid(), /* @ts-ignore */
|
|
37
37
|
...(ngDevMode ? [{ debugName: "errorVisible" }] : /* istanbul ignore next */ []));
|
|
38
|
+
value = model(/* @ts-ignore */
|
|
39
|
+
...(ngDevMode ? [undefined, { debugName: "value" }] : /* istanbul ignore next */ []));
|
|
40
|
+
errorMessages = input(/* @ts-ignore */
|
|
41
|
+
...(ngDevMode ? [undefined, { debugName: "errorMessages" }] : /* istanbul ignore next */ []));
|
|
42
|
+
rows = input(/* @ts-ignore */
|
|
43
|
+
...(ngDevMode ? [undefined, { debugName: "rows" }] : /* istanbul ignore next */ []));
|
|
38
44
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxFormField, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
39
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: NgxFormField, isStandalone: true, selector: "ngx-form-field", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, float: { classPropertyName: "float", publicName: "float", isSignal: true, isRequired: false, transformFunction: null }, invalid: { classPropertyName: "invalid", publicName: "invalid", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div\n class=\"mx-form-field\"\n [class.mx-form-field--float]=\"float()\"\n [class.mx-form-field--disabled]=\"disabled()\"\n [class.mx-form-field--readonly]=\"readonly()\"\n [class.mx-form-field--invalid]=\"invalid()\"\n [class.mx-form-field--required]=\"required()\">\n <div class=\"mx-form-field__before\">\n <div class=\"mx-form-field__prefix\">\n <ng-content select=\"[ngxPrefix],ngx-prefix\"></ng-content>\n </div>\n </div>\n\n <ng-content select=\"[ngxInput],ngx-input\"></ng-content>\n\n <span class=\"mx-form-field__label\">\n <span [aria-label]=\"label()\">{{ label() }}</span>\n </span>\n\n <div class=\"mx-form-field__after\">\n <div class=\"mx-form-field__suffix\">\n <ng-content select=\"[ngxSuffix],ngx-suffix\"></ng-content>\n </div>\n </div>\n</div>\n\n@if (hintVisible()) {\n <div class=\"mx-form-field__hint\">\n <ng-content select=\"[ngxHint],ngx-hint\"></ng-content>\n </div>\n}\n\n@if (errorVisible()) {\n <div class=\"mx-form-field__error-list\" role=\"alert\">\n <ng-content select=\"[ngxError],ngx-error\"></ng-content>\n </div>\n}\n", styles: ["ngx-form-field{--mx-field-height: 44px;--mx-field-radius: 6px;--mx-field-border-width: 1px;--mx-field-side-width: 40px;--mx-field-border-color: light-dark(#737373, #8f8f8f);--mx-field-hover-color: light-dark(#3f3f3f, #d0d0d0);--mx-field-active-color: light-dark(#007ffe, #4da3ff);--mx-field-invalid-color: light-dark(#d60000, #ff4d5a);--mx-field-disabled-color: light-dark(#bdbdbd, #555);--mx-field-label-color: light-dark(#555, #c7c7c7);--mx-field-text-color: light-dark(#1a1a1a, #f5f5f5);--mx-field-placeholder-color: light-dark(#888, #999);--mx-field-hint-color: light-dark(#007bd4, #03a9f4);--mx-field-focus-ring: light-dark(rgb(0 127 254 / 12%), rgb(77 163 255 / 18%));display:inline-flex;flex-direction:column;width:fit-content;max-width:100%;font-family:Inter,Segoe UI,Roboto,Arial,sans-serif}.mx-form-field{position:relative;display:flex;align-items:stretch;width:100%;min-width:220px;height:var(--mx-field-height);color:var(--mx-field-text-color);isolation:isolate}.mx-form-field__before,.mx-form-field__label,.mx-form-field__after{flex:1 1 auto;border:var(--mx-field-border-width) solid var(--mx-field-border-color);pointer-events:none;transition:border-color .15s ease,color .15s ease}.mx-form-field__before{display:flex;flex:0 0 var(--mx-field-side-width);min-width:0;border-inline-end:0;border-radius:var(--mx-field-radius) 0 0 var(--mx-field-radius)}.mx-form-field__after{display:flex;justify-content:flex-end;min-width:var(--mx-field-side-width);border-inline-start:0;border-radius:0 var(--mx-field-radius) var(--mx-field-radius) 0}.mx-form-field__prefix,.mx-form-field__suffix{display:flex;align-items:center;justify-content:center;min-width:0;height:100%;pointer-events:auto}.mx-form-field__prefix button,.mx-form-field__suffix button{background:none;border:none}.mx-form-field__prefix{padding-inline-start:8px}.mx-form-field__suffix{padding-inline-end:8px}.mx-form-field__prefix:empty,.mx-form-field__suffix:empty{display:none}.mx-form-field__prefix ::ng-deep>*,.mx-form-field__suffix ::ng-deep>*{max-width:100%}.mx-form-field__label{position:relative;display:flex;flex:0 0 auto;align-items:center;min-width:0;max-width:70%;border-inline:0;color:var(--mx-field-label-color);white-space:nowrap;overflow:visible}.mx-form-field__label span{display:block;opacity:.72;transform-origin:center;transform:translateY(0) scale(1);transition:transform .15s cubic-bezier(.2,0,0,1),opacity .15s ease,color .15s ease}.mx-form-field>input,.mx-form-field>textarea,.mx-form-field>select{position:absolute;inset:0;z-index:2;width:100%;height:100%;min-width:0;margin:0;padding:0 16px;border:0;outline:0;background:transparent;color:var(--mx-field-text-color);font:inherit;font-size:14px;line-height:1.4;text-align:start;caret-color:var(--mx-field-active-color)}.mx-form-field>textarea{min-height:100%;resize:vertical}.mx-form-field>select{cursor:pointer;appearance:none;-webkit-appearance:none}.mx-form-field>input:disabled,.mx-form-field>textarea:disabled,.mx-form-field>select:disabled{cursor:not-allowed}.mx-form-field>input::placeholder,.mx-form-field>textarea::placeholder{color:var(--mx-field-placeholder-color);opacity:0;transition:opacity .12s ease}.mx-form-field>input:focus::placeholder,.mx-form-field>textarea:focus::placeholder{opacity:.75}.mx-form-field:has(>input.has-value) .mx-form-field__label span,.mx-form-field:has(>textarea.has-value) .mx-form-field__label span,.mx-form-field:has(>select.has-value) .mx-form-field__label span,.mx-form-field.mx-form-field--float .mx-form-field__label span,.mx-form-field:focus-within .mx-form-field__label span{transform:translateY(-100%) scale(.86);opacity:1}.mx-form-field:has(>input.has-value) .mx-form-field__label,.mx-form-field:has(>textarea.has-value) .mx-form-field__label,.mx-form-field:has(>select.has-value) .mx-form-field__label,.mx-form-field.mx-form-field--float .mx-form-field__label,.mx-form-field:focus-within .mx-form-field__label{border-top-width:0}.mx-form-field:has(>input.has-value) .mx-form-field__label:before,.mx-form-field:has(>input.has-value) .mx-form-field__label:after,.mx-form-field:has(>textarea.has-value) .mx-form-field__label:before,.mx-form-field:has(>textarea.has-value) .mx-form-field__label:after,.mx-form-field:has(>select.has-value) .mx-form-field__label:before,.mx-form-field:has(>select.has-value) .mx-form-field__label:after,.mx-form-field.mx-form-field--float .mx-form-field__label:before,.mx-form-field.mx-form-field--float .mx-form-field__label:after,.mx-form-field:focus-within .mx-form-field__label:before,.mx-form-field:focus-within .mx-form-field__label:after{width:0}.mx-form-field:hover:not(:has(>input:disabled)):not(:has(>textarea:disabled)):not(:has(>select:disabled)) .mx-form-field__before,.mx-form-field:hover:not(:has(>input:disabled)):not(:has(>textarea:disabled)):not(:has(>select:disabled)) .mx-form-field__label,.mx-form-field:hover:not(:has(>input:disabled)):not(:has(>textarea:disabled)):not(:has(>select:disabled)) .mx-form-field__after{border-color:var(--mx-field-hover-color)}.mx-form-field:focus-within .mx-form-field__before,.mx-form-field:focus-within .mx-form-field__label,.mx-form-field:focus-within .mx-form-field__after{border-color:var(--mx-field-active-color)}.mx-form-field:focus-within .mx-form-field__label span{color:var(--mx-field-active-color)}.mx-form-field.mx-form-field--invalid .mx-form-field__before,.mx-form-field.mx-form-field--invalid .mx-form-field__label,.mx-form-field.mx-form-field--invalid .mx-form-field__after,.mx-form-field:has(>input.ng-invalid) .mx-form-field__before,.mx-form-field:has(>input.ng-invalid) .mx-form-field__label,.mx-form-field:has(>input.ng-invalid) .mx-form-field__after,.mx-form-field:has(>textarea.ng-invalid) .mx-form-field__before,.mx-form-field:has(>textarea.ng-invalid) .mx-form-field__label,.mx-form-field:has(>textarea.ng-invalid) .mx-form-field__after,.mx-form-field:has(>select.ng-invalid) .mx-form-field__before,.mx-form-field:has(>select.ng-invalid) .mx-form-field__label,.mx-form-field:has(>select.ng-invalid) .mx-form-field__after{border-color:var(--mx-field-invalid-color)}.mx-form-field.mx-form-field--invalid .mx-form-field__label span,.mx-form-field:has(>input.ng-invalid) .mx-form-field__label span,.mx-form-field:has(>textarea.ng-invalid) .mx-form-field__label span,.mx-form-field:has(>select.ng-invalid) .mx-form-field__label span{color:var(--mx-field-invalid-color)}.mx-form-field.mx-form-field--invalid:focus-within:after,.mx-form-field:has(>input.ng-invalid:focus):after,.mx-form-field:has(>textarea.ng-invalid:focus):after,.mx-form-field:has(>select.ng-invalid:focus):after{border-color:color-mix(in srgb,var(--mx-field-invalid-color) 20%,transparent)}.mx-form-field>input:user-invalid,.mx-form-field>textarea:user-invalid,.mx-form-field>select:user-invalid{color:var(--mx-field-text-color)}.mx-form-field.mx-form-field--disabled{opacity:.62;cursor:not-allowed}.mx-form-field.mx-form-field--disabled .mx-form-field__before,.mx-form-field.mx-form-field--disabled .mx-form-field__label,.mx-form-field.mx-form-field--disabled .mx-form-field__after{border-color:var(--mx-field-disabled-color)}.mx-form-field.mx-form-field--readonly .mx-form-field__label{color:var(--mx-field-label-color)}.mx-form-field.mx-form-field--readonly>input,.mx-form-field.mx-form-field--readonly>textarea{cursor:default}.mx-form-field input:-webkit-autofill,.mx-form-field input:-webkit-autofill:hover,.mx-form-field input:-webkit-autofill:focus{-webkit-text-fill-color:var(--mx-field-text-color);caret-color:var(--mx-field-text-color);transition:background-color 99999s ease-in-out 0s}.mx-form-field__hint,.mx-form-field__error-list{display:block;margin-top:5px;padding-inline:2px;font-size:.8rem;line-height:1.4}.mx-form-field__hint{color:var(--mx-field-hint-color)}.mx-form-field__error-list{color:var(--mx-field-invalid-color)}[dir=rtl] .mx-form-field__before{border-inline-start:var(--mx-field-border-width) solid var(--mx-field-border-color);border-inline-end:0;border-radius:0 var(--mx-field-radius) var(--mx-field-radius) 0}[dir=rtl] .mx-form-field__after{border-inline-end:var(--mx-field-border-width) solid var(--mx-field-border-color);border-inline-start:0;border-radius:var(--mx-field-radius) 0 0 var(--mx-field-radius)}[dir=rtl] .mx-form-field__label span{transform-origin:center}@media(prefers-reduced-motion:reduce){.mx-form-field *,.mx-form-field:after{transition:none!important}}@media(forced-colors:active){.mx-form-field__before,.mx-form-field__label,.mx-form-field__after{border-color:CanvasText}.mx-form-field:focus-within .mx-form-field__before,.mx-form-field:focus-within .mx-form-field__label,.mx-form-field:focus-within .mx-form-field__after{border-color:Highlight}.mx-form-field__label span{color:CanvasText}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
45
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: NgxFormField, isStandalone: true, selector: "ngx-form-field", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, float: { classPropertyName: "float", publicName: "float", isSignal: true, isRequired: false, transformFunction: null }, invalid: { classPropertyName: "invalid", publicName: "invalid", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, errorMessages: { classPropertyName: "errorMessages", publicName: "errorMessages", isSignal: true, isRequired: false, transformFunction: null }, rows: { classPropertyName: "rows", publicName: "rows", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, ngImport: i0, template: "<div\n class=\"mx-form-field\"\n [class.mx-form-field--float]=\"float()\"\n [class.mx-form-field--disabled]=\"disabled()\"\n [class.mx-form-field--readonly]=\"readonly()\"\n [class.mx-form-field--invalid]=\"invalid()\"\n [class.mx-form-field--required]=\"required()\">\n <div class=\"mx-form-field__before\">\n <div class=\"mx-form-field__prefix\">\n <ng-content select=\"[ngxPrefix],ngx-prefix\"></ng-content>\n </div>\n </div>\n\n <ng-content select=\"[ngxInput],ngx-input\"></ng-content>\n\n <span class=\"mx-form-field__label\">\n <span [aria-label]=\"label()\">{{ label() }}</span>\n </span>\n\n <div class=\"mx-form-field__after\">\n <div class=\"mx-form-field__suffix\">\n <ng-content select=\"[ngxSuffix],ngx-suffix\"></ng-content>\n </div>\n </div>\n</div>\n\n@if (hintVisible()) {\n <div class=\"mx-form-field__hint\">\n <ng-content select=\"[ngxHint],ngx-hint\"></ng-content>\n </div>\n}\n\n@if (errorVisible()) {\n <div class=\"mx-form-field__error-list\" role=\"alert\">\n <ng-content select=\"[ngxError],ngx-error\"></ng-content>\n </div>\n}\n", styles: ["ngx-form-field{--mx-field-height: 44px;--mx-field-radius: 6px;--mx-field-border-width: 1px;--mx-field-side-width: 40px;--mx-field-border-color: light-dark(#737373, #8f8f8f);--mx-field-hover-color: light-dark(#3f3f3f, #d0d0d0);--mx-field-active-color: light-dark(#007ffe, #4da3ff);--mx-field-invalid-color: light-dark(#d60000, #ff4d5a);--mx-field-disabled-color: light-dark(#bdbdbd, #555);--mx-field-label-color: light-dark(#555, #c7c7c7);--mx-field-text-color: light-dark(#1a1a1a, #f5f5f5);--mx-field-placeholder-color: light-dark(#888, #999);--mx-field-hint-color: light-dark(#007bd4, #03a9f4);--mx-field-focus-ring: light-dark(rgb(0 127 254 / 12%), rgb(77 163 255 / 18%));display:inline-flex;flex-direction:column;width:fit-content;max-width:100%;font-family:Inter,Segoe UI,Roboto,Arial,sans-serif}.mx-form-field{position:relative;display:flex;align-items:stretch;width:100%;min-width:220px;height:var(--mx-field-height);color:var(--mx-field-text-color);isolation:isolate}.mx-form-field__before,.mx-form-field__label,.mx-form-field__after{flex:1 1 auto;border:var(--mx-field-border-width) solid var(--mx-field-border-color);pointer-events:none;transition:border-color .15s ease,color .15s ease}.mx-form-field__before{display:flex;flex:0 0 var(--mx-field-side-width);min-width:0;border-inline-end:0;border-radius:var(--mx-field-radius) 0 0 var(--mx-field-radius)}.mx-form-field__after{display:flex;justify-content:flex-end;min-width:var(--mx-field-side-width);border-inline-start:0;border-radius:0 var(--mx-field-radius) var(--mx-field-radius) 0}.mx-form-field__prefix,.mx-form-field__suffix{display:flex;align-items:center;justify-content:center;min-width:0;height:100%;pointer-events:auto}.mx-form-field__prefix button,.mx-form-field__suffix button{background:none;border:none}.mx-form-field__prefix{padding-inline-start:8px}.mx-form-field__suffix{padding-inline-end:8px}.mx-form-field__prefix:empty,.mx-form-field__suffix:empty{display:none}.mx-form-field__prefix ::ng-deep>*,.mx-form-field__suffix ::ng-deep>*{max-width:100%}.mx-form-field__label{position:relative;display:flex;flex:0 0 auto;align-items:center;min-width:0;max-width:70%;border-inline:0;color:var(--mx-field-label-color);white-space:nowrap;overflow:visible}.mx-form-field__label span{display:block;opacity:.72;transform-origin:center;transform:translateY(0) scale(1);transition:transform .15s cubic-bezier(.2,0,0,1),opacity .15s ease,color .15s ease}.mx-form-field>input,.mx-form-field>textarea,.mx-form-field>select{position:absolute;inset:0;z-index:2;width:100%;height:100%;min-width:0;margin:0;padding:0 16px;border:0;outline:0;background:transparent;color:var(--mx-field-text-color);font:inherit;font-size:14px;line-height:1.4;text-align:start;caret-color:var(--mx-field-active-color)}.mx-form-field>textarea{min-height:100%;resize:vertical}.mx-form-field>select{cursor:pointer;appearance:none;-webkit-appearance:none}.mx-form-field>input:disabled,.mx-form-field>textarea:disabled,.mx-form-field>select:disabled{cursor:not-allowed}.mx-form-field>input::placeholder,.mx-form-field>textarea::placeholder{color:var(--mx-field-placeholder-color);opacity:0;transition:opacity .12s ease}.mx-form-field>input:focus::placeholder,.mx-form-field>textarea:focus::placeholder{opacity:.75}.mx-form-field:has(>input.has-value) .mx-form-field__label span,.mx-form-field:has(>textarea.has-value) .mx-form-field__label span,.mx-form-field:has(>select.has-value) .mx-form-field__label span,.mx-form-field.mx-form-field--float .mx-form-field__label span,.mx-form-field:focus-within .mx-form-field__label span{transform:translateY(-100%) scale(.86);opacity:1}.mx-form-field:has(>input.has-value) .mx-form-field__label,.mx-form-field:has(>textarea.has-value) .mx-form-field__label,.mx-form-field:has(>select.has-value) .mx-form-field__label,.mx-form-field.mx-form-field--float .mx-form-field__label,.mx-form-field:focus-within .mx-form-field__label{border-top-width:0}.mx-form-field:has(>input.has-value) .mx-form-field__label:before,.mx-form-field:has(>input.has-value) .mx-form-field__label:after,.mx-form-field:has(>textarea.has-value) .mx-form-field__label:before,.mx-form-field:has(>textarea.has-value) .mx-form-field__label:after,.mx-form-field:has(>select.has-value) .mx-form-field__label:before,.mx-form-field:has(>select.has-value) .mx-form-field__label:after,.mx-form-field.mx-form-field--float .mx-form-field__label:before,.mx-form-field.mx-form-field--float .mx-form-field__label:after,.mx-form-field:focus-within .mx-form-field__label:before,.mx-form-field:focus-within .mx-form-field__label:after{width:0}.mx-form-field:hover:not(:has(>input:disabled)):not(:has(>textarea:disabled)):not(:has(>select:disabled)) .mx-form-field__before,.mx-form-field:hover:not(:has(>input:disabled)):not(:has(>textarea:disabled)):not(:has(>select:disabled)) .mx-form-field__label,.mx-form-field:hover:not(:has(>input:disabled)):not(:has(>textarea:disabled)):not(:has(>select:disabled)) .mx-form-field__after{border-color:var(--mx-field-hover-color)}.mx-form-field:focus-within .mx-form-field__before,.mx-form-field:focus-within .mx-form-field__label,.mx-form-field:focus-within .mx-form-field__after{border-color:var(--mx-field-active-color)}.mx-form-field:focus-within .mx-form-field__label span{color:var(--mx-field-active-color)}.mx-form-field.mx-form-field--invalid .mx-form-field__before,.mx-form-field.mx-form-field--invalid .mx-form-field__label,.mx-form-field.mx-form-field--invalid .mx-form-field__after,.mx-form-field:has(>input.ng-invalid) .mx-form-field__before,.mx-form-field:has(>input.ng-invalid) .mx-form-field__label,.mx-form-field:has(>input.ng-invalid) .mx-form-field__after,.mx-form-field:has(>textarea.ng-invalid) .mx-form-field__before,.mx-form-field:has(>textarea.ng-invalid) .mx-form-field__label,.mx-form-field:has(>textarea.ng-invalid) .mx-form-field__after,.mx-form-field:has(>select.ng-invalid) .mx-form-field__before,.mx-form-field:has(>select.ng-invalid) .mx-form-field__label,.mx-form-field:has(>select.ng-invalid) .mx-form-field__after{border-color:var(--mx-field-invalid-color)}.mx-form-field.mx-form-field--invalid .mx-form-field__label span,.mx-form-field:has(>input.ng-invalid) .mx-form-field__label span,.mx-form-field:has(>textarea.ng-invalid) .mx-form-field__label span,.mx-form-field:has(>select.ng-invalid) .mx-form-field__label span{color:var(--mx-field-invalid-color)}.mx-form-field.mx-form-field--invalid:focus-within:after,.mx-form-field:has(>input.ng-invalid:focus):after,.mx-form-field:has(>textarea.ng-invalid:focus):after,.mx-form-field:has(>select.ng-invalid:focus):after{border-color:color-mix(in srgb,var(--mx-field-invalid-color) 20%,transparent)}.mx-form-field>input:user-invalid,.mx-form-field>textarea:user-invalid,.mx-form-field>select:user-invalid{color:var(--mx-field-text-color)}.mx-form-field.mx-form-field--disabled{opacity:.62;cursor:not-allowed}.mx-form-field.mx-form-field--disabled .mx-form-field__before,.mx-form-field.mx-form-field--disabled .mx-form-field__label,.mx-form-field.mx-form-field--disabled .mx-form-field__after{border-color:var(--mx-field-disabled-color)}.mx-form-field.mx-form-field--readonly .mx-form-field__label{color:var(--mx-field-label-color)}.mx-form-field.mx-form-field--readonly>input,.mx-form-field.mx-form-field--readonly>textarea{cursor:default}.mx-form-field input:-webkit-autofill,.mx-form-field input:-webkit-autofill:hover,.mx-form-field input:-webkit-autofill:focus{-webkit-text-fill-color:var(--mx-field-text-color);caret-color:var(--mx-field-text-color);transition:background-color 99999s ease-in-out 0s}.mx-form-field__hint,.mx-form-field__error-list{display:block;margin-top:5px;padding-inline:2px;font-size:.8rem;line-height:1.4}.mx-form-field__hint{color:var(--mx-field-hint-color)}.mx-form-field__error-list{color:var(--mx-field-invalid-color)}[dir=rtl] .mx-form-field__before{border-inline-start:var(--mx-field-border-width) solid var(--mx-field-border-color);border-inline-end:0;border-radius:0 var(--mx-field-radius) var(--mx-field-radius) 0}[dir=rtl] .mx-form-field__after{border-inline-end:var(--mx-field-border-width) solid var(--mx-field-border-color);border-inline-start:0;border-radius:var(--mx-field-radius) 0 0 var(--mx-field-radius)}[dir=rtl] .mx-form-field__label span{transform-origin:center}@media(prefers-reduced-motion:reduce){.mx-form-field *,.mx-form-field:after{transition:none!important}}@media(forced-colors:active){.mx-form-field__before,.mx-form-field__label,.mx-form-field__after{border-color:CanvasText}.mx-form-field:focus-within .mx-form-field__before,.mx-form-field:focus-within .mx-form-field__label,.mx-form-field:focus-within .mx-form-field__after{border-color:Highlight}.mx-form-field__label span{color:CanvasText}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
40
46
|
}
|
|
41
47
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxFormField, decorators: [{
|
|
42
48
|
type: Component,
|
|
43
49
|
args: [{ selector: 'ngx-form-field', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<div\n class=\"mx-form-field\"\n [class.mx-form-field--float]=\"float()\"\n [class.mx-form-field--disabled]=\"disabled()\"\n [class.mx-form-field--readonly]=\"readonly()\"\n [class.mx-form-field--invalid]=\"invalid()\"\n [class.mx-form-field--required]=\"required()\">\n <div class=\"mx-form-field__before\">\n <div class=\"mx-form-field__prefix\">\n <ng-content select=\"[ngxPrefix],ngx-prefix\"></ng-content>\n </div>\n </div>\n\n <ng-content select=\"[ngxInput],ngx-input\"></ng-content>\n\n <span class=\"mx-form-field__label\">\n <span [aria-label]=\"label()\">{{ label() }}</span>\n </span>\n\n <div class=\"mx-form-field__after\">\n <div class=\"mx-form-field__suffix\">\n <ng-content select=\"[ngxSuffix],ngx-suffix\"></ng-content>\n </div>\n </div>\n</div>\n\n@if (hintVisible()) {\n <div class=\"mx-form-field__hint\">\n <ng-content select=\"[ngxHint],ngx-hint\"></ng-content>\n </div>\n}\n\n@if (errorVisible()) {\n <div class=\"mx-form-field__error-list\" role=\"alert\">\n <ng-content select=\"[ngxError],ngx-error\"></ng-content>\n </div>\n}\n", styles: ["ngx-form-field{--mx-field-height: 44px;--mx-field-radius: 6px;--mx-field-border-width: 1px;--mx-field-side-width: 40px;--mx-field-border-color: light-dark(#737373, #8f8f8f);--mx-field-hover-color: light-dark(#3f3f3f, #d0d0d0);--mx-field-active-color: light-dark(#007ffe, #4da3ff);--mx-field-invalid-color: light-dark(#d60000, #ff4d5a);--mx-field-disabled-color: light-dark(#bdbdbd, #555);--mx-field-label-color: light-dark(#555, #c7c7c7);--mx-field-text-color: light-dark(#1a1a1a, #f5f5f5);--mx-field-placeholder-color: light-dark(#888, #999);--mx-field-hint-color: light-dark(#007bd4, #03a9f4);--mx-field-focus-ring: light-dark(rgb(0 127 254 / 12%), rgb(77 163 255 / 18%));display:inline-flex;flex-direction:column;width:fit-content;max-width:100%;font-family:Inter,Segoe UI,Roboto,Arial,sans-serif}.mx-form-field{position:relative;display:flex;align-items:stretch;width:100%;min-width:220px;height:var(--mx-field-height);color:var(--mx-field-text-color);isolation:isolate}.mx-form-field__before,.mx-form-field__label,.mx-form-field__after{flex:1 1 auto;border:var(--mx-field-border-width) solid var(--mx-field-border-color);pointer-events:none;transition:border-color .15s ease,color .15s ease}.mx-form-field__before{display:flex;flex:0 0 var(--mx-field-side-width);min-width:0;border-inline-end:0;border-radius:var(--mx-field-radius) 0 0 var(--mx-field-radius)}.mx-form-field__after{display:flex;justify-content:flex-end;min-width:var(--mx-field-side-width);border-inline-start:0;border-radius:0 var(--mx-field-radius) var(--mx-field-radius) 0}.mx-form-field__prefix,.mx-form-field__suffix{display:flex;align-items:center;justify-content:center;min-width:0;height:100%;pointer-events:auto}.mx-form-field__prefix button,.mx-form-field__suffix button{background:none;border:none}.mx-form-field__prefix{padding-inline-start:8px}.mx-form-field__suffix{padding-inline-end:8px}.mx-form-field__prefix:empty,.mx-form-field__suffix:empty{display:none}.mx-form-field__prefix ::ng-deep>*,.mx-form-field__suffix ::ng-deep>*{max-width:100%}.mx-form-field__label{position:relative;display:flex;flex:0 0 auto;align-items:center;min-width:0;max-width:70%;border-inline:0;color:var(--mx-field-label-color);white-space:nowrap;overflow:visible}.mx-form-field__label span{display:block;opacity:.72;transform-origin:center;transform:translateY(0) scale(1);transition:transform .15s cubic-bezier(.2,0,0,1),opacity .15s ease,color .15s ease}.mx-form-field>input,.mx-form-field>textarea,.mx-form-field>select{position:absolute;inset:0;z-index:2;width:100%;height:100%;min-width:0;margin:0;padding:0 16px;border:0;outline:0;background:transparent;color:var(--mx-field-text-color);font:inherit;font-size:14px;line-height:1.4;text-align:start;caret-color:var(--mx-field-active-color)}.mx-form-field>textarea{min-height:100%;resize:vertical}.mx-form-field>select{cursor:pointer;appearance:none;-webkit-appearance:none}.mx-form-field>input:disabled,.mx-form-field>textarea:disabled,.mx-form-field>select:disabled{cursor:not-allowed}.mx-form-field>input::placeholder,.mx-form-field>textarea::placeholder{color:var(--mx-field-placeholder-color);opacity:0;transition:opacity .12s ease}.mx-form-field>input:focus::placeholder,.mx-form-field>textarea:focus::placeholder{opacity:.75}.mx-form-field:has(>input.has-value) .mx-form-field__label span,.mx-form-field:has(>textarea.has-value) .mx-form-field__label span,.mx-form-field:has(>select.has-value) .mx-form-field__label span,.mx-form-field.mx-form-field--float .mx-form-field__label span,.mx-form-field:focus-within .mx-form-field__label span{transform:translateY(-100%) scale(.86);opacity:1}.mx-form-field:has(>input.has-value) .mx-form-field__label,.mx-form-field:has(>textarea.has-value) .mx-form-field__label,.mx-form-field:has(>select.has-value) .mx-form-field__label,.mx-form-field.mx-form-field--float .mx-form-field__label,.mx-form-field:focus-within .mx-form-field__label{border-top-width:0}.mx-form-field:has(>input.has-value) .mx-form-field__label:before,.mx-form-field:has(>input.has-value) .mx-form-field__label:after,.mx-form-field:has(>textarea.has-value) .mx-form-field__label:before,.mx-form-field:has(>textarea.has-value) .mx-form-field__label:after,.mx-form-field:has(>select.has-value) .mx-form-field__label:before,.mx-form-field:has(>select.has-value) .mx-form-field__label:after,.mx-form-field.mx-form-field--float .mx-form-field__label:before,.mx-form-field.mx-form-field--float .mx-form-field__label:after,.mx-form-field:focus-within .mx-form-field__label:before,.mx-form-field:focus-within .mx-form-field__label:after{width:0}.mx-form-field:hover:not(:has(>input:disabled)):not(:has(>textarea:disabled)):not(:has(>select:disabled)) .mx-form-field__before,.mx-form-field:hover:not(:has(>input:disabled)):not(:has(>textarea:disabled)):not(:has(>select:disabled)) .mx-form-field__label,.mx-form-field:hover:not(:has(>input:disabled)):not(:has(>textarea:disabled)):not(:has(>select:disabled)) .mx-form-field__after{border-color:var(--mx-field-hover-color)}.mx-form-field:focus-within .mx-form-field__before,.mx-form-field:focus-within .mx-form-field__label,.mx-form-field:focus-within .mx-form-field__after{border-color:var(--mx-field-active-color)}.mx-form-field:focus-within .mx-form-field__label span{color:var(--mx-field-active-color)}.mx-form-field.mx-form-field--invalid .mx-form-field__before,.mx-form-field.mx-form-field--invalid .mx-form-field__label,.mx-form-field.mx-form-field--invalid .mx-form-field__after,.mx-form-field:has(>input.ng-invalid) .mx-form-field__before,.mx-form-field:has(>input.ng-invalid) .mx-form-field__label,.mx-form-field:has(>input.ng-invalid) .mx-form-field__after,.mx-form-field:has(>textarea.ng-invalid) .mx-form-field__before,.mx-form-field:has(>textarea.ng-invalid) .mx-form-field__label,.mx-form-field:has(>textarea.ng-invalid) .mx-form-field__after,.mx-form-field:has(>select.ng-invalid) .mx-form-field__before,.mx-form-field:has(>select.ng-invalid) .mx-form-field__label,.mx-form-field:has(>select.ng-invalid) .mx-form-field__after{border-color:var(--mx-field-invalid-color)}.mx-form-field.mx-form-field--invalid .mx-form-field__label span,.mx-form-field:has(>input.ng-invalid) .mx-form-field__label span,.mx-form-field:has(>textarea.ng-invalid) .mx-form-field__label span,.mx-form-field:has(>select.ng-invalid) .mx-form-field__label span{color:var(--mx-field-invalid-color)}.mx-form-field.mx-form-field--invalid:focus-within:after,.mx-form-field:has(>input.ng-invalid:focus):after,.mx-form-field:has(>textarea.ng-invalid:focus):after,.mx-form-field:has(>select.ng-invalid:focus):after{border-color:color-mix(in srgb,var(--mx-field-invalid-color) 20%,transparent)}.mx-form-field>input:user-invalid,.mx-form-field>textarea:user-invalid,.mx-form-field>select:user-invalid{color:var(--mx-field-text-color)}.mx-form-field.mx-form-field--disabled{opacity:.62;cursor:not-allowed}.mx-form-field.mx-form-field--disabled .mx-form-field__before,.mx-form-field.mx-form-field--disabled .mx-form-field__label,.mx-form-field.mx-form-field--disabled .mx-form-field__after{border-color:var(--mx-field-disabled-color)}.mx-form-field.mx-form-field--readonly .mx-form-field__label{color:var(--mx-field-label-color)}.mx-form-field.mx-form-field--readonly>input,.mx-form-field.mx-form-field--readonly>textarea{cursor:default}.mx-form-field input:-webkit-autofill,.mx-form-field input:-webkit-autofill:hover,.mx-form-field input:-webkit-autofill:focus{-webkit-text-fill-color:var(--mx-field-text-color);caret-color:var(--mx-field-text-color);transition:background-color 99999s ease-in-out 0s}.mx-form-field__hint,.mx-form-field__error-list{display:block;margin-top:5px;padding-inline:2px;font-size:.8rem;line-height:1.4}.mx-form-field__hint{color:var(--mx-field-hint-color)}.mx-form-field__error-list{color:var(--mx-field-invalid-color)}[dir=rtl] .mx-form-field__before{border-inline-start:var(--mx-field-border-width) solid var(--mx-field-border-color);border-inline-end:0;border-radius:0 var(--mx-field-radius) var(--mx-field-radius) 0}[dir=rtl] .mx-form-field__after{border-inline-end:var(--mx-field-border-width) solid var(--mx-field-border-color);border-inline-start:0;border-radius:var(--mx-field-radius) 0 0 var(--mx-field-radius)}[dir=rtl] .mx-form-field__label span{transform-origin:center}@media(prefers-reduced-motion:reduce){.mx-form-field *,.mx-form-field:after{transition:none!important}}@media(forced-colors:active){.mx-form-field__before,.mx-form-field__label,.mx-form-field__after{border-color:CanvasText}.mx-form-field:focus-within .mx-form-field__before,.mx-form-field:focus-within .mx-form-field__label,.mx-form-field:focus-within .mx-form-field__after{border-color:Highlight}.mx-form-field__label span{color:CanvasText}}\n"] }]
|
|
44
|
-
}], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: true }] }], float: [{ type: i0.Input, args: [{ isSignal: true, alias: "float", required: false }] }], invalid: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalid", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }] } });
|
|
50
|
+
}], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: true }] }], float: [{ type: i0.Input, args: [{ isSignal: true, alias: "float", required: false }] }], invalid: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalid", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], errorMessages: [{ type: i0.Input, args: [{ isSignal: true, alias: "errorMessages", required: false }] }], rows: [{ type: i0.Input, args: [{ isSignal: true, alias: "rows", required: false }] }] } });
|
|
45
51
|
|
|
46
52
|
class NgxInput {
|
|
47
53
|
el = inject(ElementRef);
|