ngx-kit 7.4.0 → 8.0.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.
@@ -1,456 +0,0 @@
1
- import * as i0 from '@angular/core';
2
- import { inject, ElementRef, Renderer2, DestroyRef, PLATFORM_ID, input, model, signal, computed, effect, afterNextRender, HostBinding, ChangeDetectionStrategy, Component } from '@angular/core';
3
- import { isPlatformBrowser } from '@angular/common';
4
-
5
- const DEFAULT_DRAWER_RESPONSIVE = {
6
- mode: 'auto',
7
- breakpoint: 960,
8
- desktopOpen: true,
9
- mobileOpen: false,
10
- desktopBehavior: 'dock',
11
- mobileBehavior: 'overlay',
12
- respectPinned: true,
13
- };
14
-
15
- class NgxDrawerMenuComponent {
16
- elementRef = inject((ElementRef));
17
- renderer = inject(Renderer2);
18
- destroyRef = inject(DestroyRef);
19
- platformId = inject(PLATFORM_ID);
20
- // ---------------------------------------------------------------------------
21
- // Inputs
22
- // ---------------------------------------------------------------------------
23
- side = input('start', /* @ts-ignore */
24
- ...(ngDevMode ? [{ debugName: "side" }] : /* istanbul ignore next */ []));
25
- effect = input('fabric', /* @ts-ignore */
26
- ...(ngDevMode ? [{ debugName: "effect" }] : /* istanbul ignore next */ []));
27
- width = input(300, /* @ts-ignore */
28
- ...(ngDevMode ? [{ debugName: "width" }] : /* istanbul ignore next */ []));
29
- /**
30
- * Main drawer state.
31
- *
32
- * Usage:
33
- *
34
- * [(open)]="sidebarOpen"
35
- */
36
- open = model(false, /* @ts-ignore */
37
- ...(ngDevMode ? [{ debugName: "open" }] : /* istanbul ignore next */ []));
38
- /**
39
- * Pinned state.
40
- *
41
- * Useful for desktop layouts.
42
- *
43
- * [(pinned)]="sidebarPinned"
44
- */
45
- pinned = model(false, /* @ts-ignore */
46
- ...(ngDevMode ? [{ debugName: "pinned" }] : /* istanbul ignore next */ []));
47
- responsive = input(DEFAULT_DRAWER_RESPONSIVE, /* @ts-ignore */
48
- ...(ngDevMode ? [{ debugName: "responsive" }] : /* istanbul ignore next */ []));
49
- /**
50
- * Whether clicking backdrop closes drawer.
51
- */
52
- closeOnBackdrop = input(true, /* @ts-ignore */
53
- ...(ngDevMode ? [{ debugName: "closeOnBackdrop" }] : /* istanbul ignore next */ []));
54
- /**
55
- * Whether Escape closes drawer.
56
- */
57
- closeOnEscape = input(true, /* @ts-ignore */
58
- ...(ngDevMode ? [{ debugName: "closeOnEscape" }] : /* istanbul ignore next */ []));
59
- /**
60
- * Whether body scrolling should be locked
61
- * while an overlay drawer is open.
62
- */
63
- lockBodyScroll = input(true, /* @ts-ignore */
64
- ...(ngDevMode ? [{ debugName: "lockBodyScroll" }] : /* istanbul ignore next */ []));
65
- /**
66
- * Animation duration in milliseconds.
67
- */
68
- animationDuration = input(280, /* @ts-ignore */
69
- ...(ngDevMode ? [{ debugName: "animationDuration" }] : /* istanbul ignore next */ []));
70
- /**
71
- * z-index.
72
- */
73
- zIndex = input(1000, /* @ts-ignore */
74
- ...(ngDevMode ? [{ debugName: "zIndex" }] : /* istanbul ignore next */ []));
75
- // ---------------------------------------------------------------------------
76
- // Internal state
77
- // ---------------------------------------------------------------------------
78
- isBrowser = isPlatformBrowser(this.platformId);
79
- isMobile = signal(false, /* @ts-ignore */
80
- ...(ngDevMode ? [{ debugName: "isMobile" }] : /* istanbul ignore next */ []));
81
- initialized = signal(false, /* @ts-ignore */
82
- ...(ngDevMode ? [{ debugName: "initialized" }] : /* istanbul ignore next */ []));
83
- /**
84
- * Used to avoid applying responsive defaults repeatedly.
85
- */
86
- previousResponsiveMode = null;
87
- mediaQuery;
88
- removeMediaQueryListener;
89
- // ---------------------------------------------------------------------------
90
- // Computed
91
- // ---------------------------------------------------------------------------
92
- responsiveConfig = computed(() => {
93
- const config = this.responsive();
94
- return {
95
- ...DEFAULT_DRAWER_RESPONSIVE,
96
- ...config,
97
- };
98
- }, /* @ts-ignore */
99
- ...(ngDevMode ? [{ debugName: "responsiveConfig" }] : /* istanbul ignore next */ []));
100
- currentMode = computed(() => {
101
- const config = this.responsiveConfig();
102
- if (config.mode === 'desktop') {
103
- return 'desktop';
104
- }
105
- if (config.mode === 'mobile') {
106
- return 'mobile';
107
- }
108
- return this.isMobile() ? 'mobile' : 'desktop';
109
- }, /* @ts-ignore */
110
- ...(ngDevMode ? [{ debugName: "currentMode" }] : /* istanbul ignore next */ []));
111
- currentBehavior = computed(() => {
112
- const config = this.responsiveConfig();
113
- return this.currentMode() === 'mobile' ? config.mobileBehavior : config.desktopBehavior;
114
- }, /* @ts-ignore */
115
- ...(ngDevMode ? [{ debugName: "currentBehavior" }] : /* istanbul ignore next */ []));
116
- isOverlay = computed(() => {
117
- return this.currentBehavior() === 'overlay';
118
- }, /* @ts-ignore */
119
- ...(ngDevMode ? [{ debugName: "isOverlay" }] : /* istanbul ignore next */ []));
120
- isDocked = computed(() => {
121
- return this.currentBehavior() === 'dock';
122
- }, /* @ts-ignore */
123
- ...(ngDevMode ? [{ debugName: "isDocked" }] : /* istanbul ignore next */ []));
124
- shouldShowBackdrop = computed(() => {
125
- return this.isOverlay() && this.open();
126
- }, /* @ts-ignore */
127
- ...(ngDevMode ? [{ debugName: "shouldShowBackdrop" }] : /* istanbul ignore next */ []));
128
- drawerWidth = computed(() => {
129
- const width = this.width();
130
- if (typeof width === 'number') {
131
- return `${width}px`;
132
- }
133
- return width;
134
- }, /* @ts-ignore */
135
- ...(ngDevMode ? [{ debugName: "drawerWidth" }] : /* istanbul ignore next */ []));
136
- drawerVisible = computed(() => {
137
- return this.open();
138
- }, /* @ts-ignore */
139
- ...(ngDevMode ? [{ debugName: "drawerVisible" }] : /* istanbul ignore next */ []));
140
- shouldPreservePinned = computed(() => {
141
- return this.responsiveConfig().respectPinned;
142
- }, /* @ts-ignore */
143
- ...(ngDevMode ? [{ debugName: "shouldPreservePinned" }] : /* istanbul ignore next */ []));
144
- isPinnedAndDesktop = computed(() => {
145
- return this.currentMode() === 'desktop' && this.pinned() && this.shouldPreservePinned();
146
- }, /* @ts-ignore */
147
- ...(ngDevMode ? [{ debugName: "isPinnedAndDesktop" }] : /* istanbul ignore next */ []));
148
- // ---------------------------------------------------------------------------
149
- // Host bindings
150
- // ---------------------------------------------------------------------------
151
- get drawerStart() {
152
- return this.side() === 'start';
153
- }
154
- get drawerEnd() {
155
- return this.side() === 'end';
156
- }
157
- get drawerOpen() {
158
- return this.open();
159
- }
160
- get drawerMobile() {
161
- return this.currentMode() === 'mobile';
162
- }
163
- get drawerDesktop() {
164
- return this.currentMode() === 'desktop';
165
- }
166
- get drawerOverlay() {
167
- return this.isOverlay();
168
- }
169
- get drawerDock() {
170
- return this.isDocked();
171
- }
172
- get hostWidth() {
173
- return this.drawerWidth();
174
- }
175
- get hostDuration() {
176
- return `${this.animationDuration()}ms`;
177
- }
178
- get hostZIndex() {
179
- return this.zIndex();
180
- }
181
- get effectNone() {
182
- return this.effect() === 'none';
183
- }
184
- get effectFabric() {
185
- return this.effect() === 'fabric';
186
- }
187
- get effectSlide() {
188
- return this.effect() === 'slide';
189
- }
190
- get effectPush() {
191
- return this.effect() === 'push';
192
- }
193
- get effectScale() {
194
- return this.effect() === 'scale';
195
- }
196
- // ---------------------------------------------------------------------------
197
- // Constructor
198
- // ---------------------------------------------------------------------------
199
- constructor() {
200
- this.setupResponsive();
201
- effect(() => {
202
- const mode = this.currentMode();
203
- if (!this.initialized()) {
204
- return;
205
- }
206
- this.handleResponsiveModeChange(mode);
207
- });
208
- effect(() => {
209
- const shouldLock = this.lockBodyScroll();
210
- const shouldLockNow = this.isOverlay() && this.open();
211
- if (!shouldLock) {
212
- return;
213
- }
214
- if (shouldLockNow) {
215
- this.lockScroll();
216
- }
217
- else {
218
- this.unlockScroll();
219
- }
220
- });
221
- this.destroyRef.onDestroy(() => {
222
- this.destroyResponsive();
223
- this.unlockScroll();
224
- });
225
- }
226
- // ---------------------------------------------------------------------------
227
- // Responsive
228
- // ---------------------------------------------------------------------------
229
- setupResponsive() {
230
- if (!this.isBrowser) {
231
- return;
232
- }
233
- afterNextRender(() => {
234
- this.setupMediaQuery();
235
- this.initialized.set(true);
236
- const mode = this.currentMode();
237
- this.previousResponsiveMode = mode;
238
- this.applyInitialResponsiveState(mode);
239
- });
240
- }
241
- setupMediaQuery() {
242
- const config = this.responsiveConfig();
243
- if (config.mode !== 'auto' || this.isBrowser) {
244
- this.isMobile.set(config.mode === 'mobile');
245
- return;
246
- }
247
- const breakpoint = config.breakpoint;
248
- this.mediaQuery = window.matchMedia(`(max-width: ${breakpoint - 0.02}px)`);
249
- this.updateMobileState();
250
- const listener = () => {
251
- this.updateMobileState();
252
- };
253
- this.mediaQuery.addEventListener('change', listener);
254
- this.removeMediaQueryListener = () => {
255
- this.mediaQuery?.removeEventListener('change', listener);
256
- };
257
- }
258
- updateMobileState() {
259
- if (!this.mediaQuery) {
260
- return;
261
- }
262
- this.isMobile.set(this.mediaQuery.matches);
263
- }
264
- handleResponsiveModeChange(mode) {
265
- if (this.previousResponsiveMode === null) {
266
- this.previousResponsiveMode = mode;
267
- return;
268
- }
269
- if (this.previousResponsiveMode === mode) {
270
- return;
271
- }
272
- const previousMode = this.previousResponsiveMode;
273
- this.previousResponsiveMode = mode;
274
- const config = this.responsiveConfig();
275
- /**
276
- * If pinned should be respected,
277
- * don't overwrite the current open state.
278
- */
279
- if (config.respectPinned && this.pinned()) {
280
- return;
281
- }
282
- if (mode === 'desktop') {
283
- this.open.set(config.desktopOpen);
284
- }
285
- else {
286
- this.open.set(config.mobileOpen);
287
- }
288
- this.renderer.setAttribute(this.elementRef.nativeElement, 'data-previous-mode', previousMode);
289
- }
290
- applyInitialResponsiveState(mode) {
291
- const config = this.responsiveConfig();
292
- if (config.respectPinned && this.pinned()) {
293
- return;
294
- }
295
- /**
296
- * Don't blindly overwrite an explicitly bound
297
- * [(open)] value after initialization.
298
- *
299
- * The default is only applied when the model
300
- * has not already been initialized.
301
- */
302
- if (mode === 'desktop') {
303
- this.open.set(config.desktopOpen);
304
- }
305
- else {
306
- this.open.set(config.mobileOpen);
307
- }
308
- }
309
- destroyResponsive() {
310
- this.removeMediaQueryListener?.();
311
- this.mediaQuery = undefined;
312
- }
313
- // ---------------------------------------------------------------------------
314
- // Public API
315
- // ---------------------------------------------------------------------------
316
- toggle() {
317
- if (this.open()) {
318
- this.close();
319
- }
320
- else {
321
- this.openDrawer();
322
- }
323
- }
324
- openDrawer() {
325
- this.open.set(true);
326
- }
327
- close() {
328
- if (this.pinned() && this.isPinnedAndDesktop()) {
329
- return;
330
- }
331
- this.open.set(false);
332
- }
333
- pin() {
334
- this.pinned.set(true);
335
- this.open.set(true);
336
- }
337
- unpin() {
338
- this.pinned.set(false);
339
- }
340
- togglePinned() {
341
- if (this.pinned()) {
342
- this.unpin();
343
- }
344
- else {
345
- this.pin();
346
- }
347
- }
348
- // ---------------------------------------------------------------------------
349
- // Events
350
- // ---------------------------------------------------------------------------
351
- onBackdropClick() {
352
- if (!this.closeOnBackdrop()) {
353
- return;
354
- }
355
- this.close();
356
- }
357
- onKeyDown(event) {
358
- if (event.key !== 'Escape') {
359
- return;
360
- }
361
- if (!this.closeOnEscape()) {
362
- return;
363
- }
364
- if (!this.open()) {
365
- return;
366
- }
367
- this.close();
368
- }
369
- // ---------------------------------------------------------------------------
370
- // Scroll locking
371
- // ---------------------------------------------------------------------------
372
- lockScroll() {
373
- if (!this.isBrowser) {
374
- return;
375
- }
376
- if (!document.body) {
377
- return;
378
- }
379
- if (document.body.dataset['ngxDrawerScrollLocked'] === 'true') {
380
- return;
381
- }
382
- this.renderer.setAttribute(document.body, 'data-ngx-drawer-scroll-locked', 'true');
383
- this.renderer.setStyle(document.body, 'overflow', 'hidden');
384
- }
385
- unlockScroll() {
386
- if (!this.isBrowser) {
387
- return;
388
- }
389
- if (!document.body) {
390
- return;
391
- }
392
- if (document.body.dataset['ngxDrawerScrollLocked'] !== 'true') {
393
- return;
394
- }
395
- this.renderer.removeAttribute(document.body, 'data-ngx-drawer-scroll-locked');
396
- this.renderer.removeStyle(document.body, 'overflow');
397
- }
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 });
400
- }
401
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxDrawerMenuComponent, decorators: [{
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"] }]
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
- type: HostBinding,
406
- args: ['class.drawer-start']
407
- }], drawerEnd: [{
408
- type: HostBinding,
409
- args: ['class.drawer-end']
410
- }], drawerOpen: [{
411
- type: HostBinding,
412
- args: ['class.drawer-open']
413
- }], drawerMobile: [{
414
- type: HostBinding,
415
- args: ['class.drawer-mobile']
416
- }], drawerDesktop: [{
417
- type: HostBinding,
418
- args: ['class.drawer-desktop']
419
- }], drawerOverlay: [{
420
- type: HostBinding,
421
- args: ['class.drawer-overlay']
422
- }], drawerDock: [{
423
- type: HostBinding,
424
- args: ['class.drawer-dock']
425
- }], hostWidth: [{
426
- type: HostBinding,
427
- args: ['style.--ngx-drawer-width']
428
- }], hostDuration: [{
429
- type: HostBinding,
430
- args: ['style.--ngx-drawer-duration']
431
- }], hostZIndex: [{
432
- type: HostBinding,
433
- args: ['style.--ngx-drawer-z-index']
434
- }], effectNone: [{
435
- type: HostBinding,
436
- args: ['class.effect-none']
437
- }], effectFabric: [{
438
- type: HostBinding,
439
- args: ['class.effect-fabric']
440
- }], effectSlide: [{
441
- type: HostBinding,
442
- args: ['class.effect-slide']
443
- }], effectPush: [{
444
- type: HostBinding,
445
- args: ['class.effect-push']
446
- }], effectScale: [{
447
- type: HostBinding,
448
- args: ['class.effect-scale']
449
- }] } });
450
-
451
- /**
452
- * Generated bundle index. Do not edit.
453
- */
454
-
455
- export { DEFAULT_DRAWER_RESPONSIVE, NgxDrawerMenuComponent };
456
- //# sourceMappingURL=ngx-kit-drawer-menu.mjs.map
@@ -1 +0,0 @@
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 = 'none' | 'fabric' | 'slide' | 'push' | 'scale';\n\nexport type NgxDrawerBehavior = 'dock' | 'overlay';\n\nexport type NgxDrawerResponsiveMode = 'auto' | 'desktop' | '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};\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' || this.isBrowser) {\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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"}