ngx-kit 7.4.0 → 8.0.1

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,125 +0,0 @@
1
- # ngx-kit/drawer-menu
2
-
3
- A gesture-first Angular navigation drawer designed for desktop and mobile.
4
-
5
- ## Highlights
6
-
7
- - Logical `start` / `end` placement with RTL/LTR support.
8
- - Mouse + touch + pen drag using Pointer Events.
9
- - Open from the screen edge when closed.
10
- - Drag the drawer itself to close it.
11
- - Live 0..1 gesture progress — effects react while dragging.
12
- - Fabric / curtain / spring / elastic effects.
13
- - `overlay`, `push`, and `reveal` content modes.
14
- - Desktop/mobile responsive state.
15
- - True docked desktop sidebar: open means it occupies layout space and clicking the page never closes it.
16
- - Mobile overlay behavior with backdrop and edge swipe.
17
- - Pin/unpin support.
18
- - Controlled state with `[(open)]`.
19
- - Reduced-motion support.
20
- - Escape and backdrop closing.
21
-
22
- ## Recommended configuration
23
-
24
- ```html
25
- <ngx-drawer-menu
26
- side="start"
27
- mode="push"
28
- effect="fabric"
29
- [width]="300"
30
- [openOnDesktop]="true"
31
- [openOnMobile]="false"
32
- [mobileBreakpoint]="960"
33
- [(open)]="drawerOpen"
34
- [(pinned)]="drawerPinned">
35
- <router-outlet />
36
-
37
- <div drawerContent>
38
- <!-- navigation -->
39
- </div>
40
- </ngx-drawer-menu>
41
- ```
42
-
43
- ## Behavior model
44
-
45
- The drawer owns one continuous `progress` value between `0` and `1`.
46
-
47
- - `0`: fully closed.
48
- - `1`: fully open.
49
- - Pointer dragging directly changes progress.
50
- - On release, velocity and the configured threshold decide the final state.
51
-
52
- This is the key to getting a physical-feeling drawer instead of a drawer that simply jumps between CSS classes.
53
-
54
- ## Inputs
55
-
56
- | Input | Default | Purpose |
57
- | ------------------- | --------- | ------------------------------------------------------------ |
58
- | `side` | `start` | Logical drawer side. |
59
- | `mode` | `overlay` | `overlay`, `push`, or `reveal`. |
60
- | `effect` | `fabric` | `slide`, `spring`, `fabric`, `curtain`, `elastic`, `reveal`. |
61
- | `width` | `300` | Drawer width in px. |
62
- | `maxWidth` | `420` | Safety cap for drawer width. |
63
- | `edgeSize` | `34` | Edge swipe activation area. |
64
- | `swipeEnabled` | `true` | Enables gesture interaction. |
65
- | `backdropClose` | `true` | Close on backdrop press. |
66
- | `escapeClose` | `true` | Close on Escape. |
67
- | `open` | `true` | Two-way state via `[(open)]`. |
68
- | `pinned` | `false` | Persistent drawer state via `[(pinned)]`. |
69
- | `mobileBreakpoint` | `768` | Mobile breakpoint. |
70
- | `openOnDesktop` | `true` | State on desktop. |
71
- | `openOnMobile` | `false` | State on mobile/tablet. |
72
- | `respondToViewport` | `true` | Enables live responsive switching. |
73
- | `transitionMs` | `420` | Settle animation duration. |
74
-
75
- ## Responsive behavior
76
-
77
- By default:
78
-
79
- - Desktop >= 768px: open.
80
- - Mobile < 768px: closed.
81
- - Crossing the breakpoint updates the drawer live.
82
- - A pinned drawer is not closed by responsive rules.
83
-
84
- A full `responsive` object is also available when a single config object is preferable:
85
-
86
- ```html
87
- <ngx-drawer-menu
88
- [responsive]="{
89
- mode: 'auto',
90
- breakpoint: 960,
91
- desktopOpen: true,
92
- mobileOpen: false,
93
- respectPinned: true
94
- }"></ngx-drawer-menu>
95
- ```
96
-
97
- ## Recommended responsive behavior
98
-
99
- When `respondToViewport` is enabled, the drawer uses a real sidebar on desktop and an overlay drawer on mobile by default:
100
-
101
- ```html
102
- <ngx-drawer-menu
103
- side="start"
104
- [responsive]="{
105
- mode: 'auto',
106
- breakpoint: 960,
107
- desktopOpen: true,
108
- mobileOpen: false,
109
- desktopBehavior: 'dock',
110
- mobileBehavior: 'overlay',
111
- respectPinned: true
112
- }"
113
- effect="fabric"
114
- [width]="300">
115
- <router-outlet />
116
- <nav drawerContent>...</nav>
117
- </ngx-drawer-menu>
118
- ```
119
-
120
- In this setup:
121
-
122
- - `>= 960px`: the open drawer is a real docked sidebar; it owns layout width and does not create a backdrop.
123
- - `< 960px`: the drawer is an overlay; the page is dimmed and clicking the backdrop can close it.
124
- - On desktop the drawer can still be dragged closed from its full-height edge handle.
125
- - When closed, the screen edge remains a mouse/touch drag target and opens the drawer.
@@ -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