ngx-kit 6.1.0 → 6.3.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.
Files changed (52) hide show
  1. package/README.md +3 -3
  2. package/angle-selector/README.md +34 -34
  3. package/box-shadow/README.md +33 -33
  4. package/color-picker/README.md +49 -49
  5. package/data-table/README.md +113 -113
  6. package/date-picker/README.md +69 -69
  7. package/dialog/README.md +92 -92
  8. package/drawer-menu/README.md +110 -62
  9. package/dropzone/README.md +422 -422
  10. package/fesm2022/ngx-kit-angle-selector.mjs +2 -2
  11. package/fesm2022/ngx-kit-angle-selector.mjs.map +1 -1
  12. package/fesm2022/ngx-kit-box-shadow.mjs +2 -2
  13. package/fesm2022/ngx-kit-box-shadow.mjs.map +1 -1
  14. package/fesm2022/ngx-kit-color-picker.mjs +4 -4
  15. package/fesm2022/ngx-kit-color-picker.mjs.map +1 -1
  16. package/fesm2022/ngx-kit-data-table.mjs +2 -2
  17. package/fesm2022/ngx-kit-data-table.mjs.map +1 -1
  18. package/fesm2022/ngx-kit-date-picker.mjs +1324 -200
  19. package/fesm2022/ngx-kit-date-picker.mjs.map +1 -1
  20. package/fesm2022/ngx-kit-dialog.mjs +2 -2
  21. package/fesm2022/ngx-kit-dialog.mjs.map +1 -1
  22. package/fesm2022/ngx-kit-drawer-menu.mjs +302 -140
  23. package/fesm2022/ngx-kit-drawer-menu.mjs.map +1 -1
  24. package/fesm2022/ngx-kit-dropzone.mjs +2 -2
  25. package/fesm2022/ngx-kit-dropzone.mjs.map +1 -1
  26. package/fesm2022/ngx-kit-form-field.mjs.map +1 -1
  27. package/fesm2022/ngx-kit-gallery.mjs +2 -2
  28. package/fesm2022/ngx-kit-gallery.mjs.map +1 -1
  29. package/fesm2022/ngx-kit-gradient-picker.mjs.map +1 -1
  30. package/fesm2022/ngx-kit-image-editor.mjs +75 -11
  31. package/fesm2022/ngx-kit-image-editor.mjs.map +1 -1
  32. package/fesm2022/ngx-kit-menu.mjs +8 -8
  33. package/fesm2022/ngx-kit-menu.mjs.map +1 -1
  34. package/fesm2022/ngx-kit-message.mjs +2 -2
  35. package/fesm2022/ngx-kit-message.mjs.map +1 -1
  36. package/fesm2022/ngx-kit-notify.mjs.map +1 -1
  37. package/fesm2022/ngx-kit-shared.mjs +2 -2
  38. package/fesm2022/ngx-kit-shared.mjs.map +1 -1
  39. package/fesm2022/ngx-kit-time-picker.mjs +2 -2
  40. package/fesm2022/ngx-kit-time-picker.mjs.map +1 -1
  41. package/gallery/README.md +71 -71
  42. package/gradient-picker/README.md +41 -41
  43. package/menu/README.md +85 -85
  44. package/message/README.md +70 -70
  45. package/notify/README.md +58 -58
  46. package/package.json +1 -1
  47. package/shared/README.md +117 -117
  48. package/time-picker/README.md +95 -95
  49. package/types/ngx-kit-date-picker.d.ts +303 -36
  50. package/types/ngx-kit-drawer-menu.d.ts +97 -86
  51. package/types/ngx-kit-dropzone.d.ts +5 -5
  52. package/types/ngx-kit-image-editor.d.ts +29 -4
@@ -1,186 +1,348 @@
1
1
  import * as i0 from '@angular/core';
2
- import { input, model, inject, DOCUMENT, DestroyRef, signal, computed, effect, HostListener, ChangeDetectionStrategy, Component } from '@angular/core';
3
- import { DirectionService, startDragSession } from 'ngx-kit/shared';
2
+ import { input, signal, model, computed, inject, DOCUMENT, DestroyRef, effect, ChangeDetectionStrategy, Component } from '@angular/core';
3
+ import { DirectionService } from 'ngx-kit/shared';
4
4
 
5
5
  /**
6
- * درور منو (side drawer) با ۶ جلوه‌ی بازوبسته‌شدنِ متفاوت (از ساده تا
7
- * سه‌بعدی/ژله‌ای) و ۳ رفتار برای محتوای صفحه (overlay/push/reveal) —
8
- * دقیقاً مدل کتابخونه‌های حرفه‌ای مثل react-burger-menu یا Ionic Menu، ولی
9
- * signal-based و بدون هیچ وابستگی خارجی.
6
+ * Structural (not reference) equality for the `responsive` config.
10
7
  *
11
- * نکات معماری:
12
- * - از 'start'/'end' منطقی استفاده می‌کنه، پس با CSS logical properties
13
- * زیر RTL خودکار برعکس می‌شه؛ فقط ریاضیِ درگ (که برخلاف CSS جهت فیزیکیِ
14
- * واقعی لازم داره) از DirectionService مشترک استفاده می‌کنه.
15
- * - وضعیت باز/بسته با model() دوطرفه‌ست، پس هم با [(open)] قابل کنترله و
16
- * هم می‌تونه به‌صورت خودکار و زنده با عرض صفحه هماهنگ بشه (respondToViewport)
17
- * — یعنی رد شدن از breakpoint (نه فقط بار اول لود) می‌تونه خودکار باز/بسته‌ش کنه.
18
- * - افکت‌های jelly/pull با keyframe سه‌مرحله‌ای (overshoot → نوسان → استقرار)
19
- * پیاده شدن، نه فقط یه transition ساده.
8
+ * Consumers are expected to pass this as an inline object literal (see README),
9
+ * which means the parent template creates a brand-new object on every change
10
+ * detection run. Without this comparator, the `responsive` input signal sees a
11
+ * "change" on every such run even when nothing actually changed, which re-triggers
12
+ * the viewport-sync effect and forcibly resets `open` back to the configured
13
+ * desktop/mobile default — silently overriding whatever the user just did by
14
+ * dragging, clicking, or toggling the drawer.
20
15
  */
16
+ function responsiveConfigsEqual(a, b) {
17
+ return (a === b ||
18
+ (a.mode === b.mode &&
19
+ a.breakpoint === b.breakpoint &&
20
+ a.desktopOpen === b.desktopOpen &&
21
+ a.mobileOpen === b.mobileOpen &&
22
+ a.desktopBehavior === b.desktopBehavior &&
23
+ a.mobileBehavior === b.mobileBehavior &&
24
+ a.respectPinned === b.respectPinned));
25
+ }
21
26
  class NgxDrawerMenuComponent {
22
27
  side = input('start', /* @ts-ignore */
23
28
  ...(ngDevMode ? [{ debugName: "side" }] : /* istanbul ignore next */ []));
24
- effect = input('slide', /* @ts-ignore */
29
+ mode = input('overlay', /* @ts-ignore */
30
+ ...(ngDevMode ? [{ debugName: "mode" }] : /* istanbul ignore next */ []));
31
+ /** When responsive mode is active, desktop/mobile can use different layout behavior. */
32
+ desktopBehavior = input('dock', /* @ts-ignore */
33
+ ...(ngDevMode ? [{ debugName: "desktopBehavior" }] : /* istanbul ignore next */ []));
34
+ mobileBehavior = input('overlay', /* @ts-ignore */
35
+ ...(ngDevMode ? [{ debugName: "mobileBehavior" }] : /* istanbul ignore next */ []));
36
+ responsiveDesktopBehavior = signal(null, /* @ts-ignore */
37
+ ...(ngDevMode ? [{ debugName: "responsiveDesktopBehavior" }] : /* istanbul ignore next */ []));
38
+ responsiveMobileBehavior = signal(null, /* @ts-ignore */
39
+ ...(ngDevMode ? [{ debugName: "responsiveMobileBehavior" }] : /* istanbul ignore next */ []));
40
+ effect = input('fabric', /* @ts-ignore */
25
41
  ...(ngDevMode ? [{ debugName: "effect" }] : /* istanbul ignore next */ []));
26
- contentBehavior = input('overlay', /* @ts-ignore */
27
- ...(ngDevMode ? [{ debugName: "contentBehavior" }] : /* istanbul ignore next */ []));
28
- width = input(280, /* @ts-ignore */
42
+ width = input(300, /* @ts-ignore */
29
43
  ...(ngDevMode ? [{ debugName: "width" }] : /* istanbul ignore next */ []));
30
- swipeEdgeSize = input(24, /* @ts-ignore */
31
- ...(ngDevMode ? [{ debugName: "swipeEdgeSize" }] : /* istanbul ignore next */ []));
32
- curtainStrips = input(7, /* @ts-ignore */
33
- ...(ngDevMode ? [{ debugName: "curtainStrips" }] : /* istanbul ignore next */ []));
34
- backdropClose = input(true, /* @ts-ignore */
35
- ...(ngDevMode ? [{ debugName: "backdropClose" }] : /* istanbul ignore next */ []));
44
+ maxWidth = input(420, /* @ts-ignore */
45
+ ...(ngDevMode ? [{ debugName: "maxWidth" }] : /* istanbul ignore next */ []));
46
+ edgeSize = input(34, /* @ts-ignore */
47
+ ...(ngDevMode ? [{ debugName: "edgeSize" }] : /* istanbul ignore next */ []));
48
+ dragThreshold = input(0.38, /* @ts-ignore */
49
+ ...(ngDevMode ? [{ debugName: "dragThreshold" }] : /* istanbul ignore next */ []));
50
+ velocityThreshold = input(0.45, /* @ts-ignore */
51
+ ...(ngDevMode ? [{ debugName: "velocityThreshold" }] : /* istanbul ignore next */ []));
52
+ /** Opens/closes the panel from the edge and while the panel itself is dragged. */
36
53
  swipeEnabled = input(true, /* @ts-ignore */
37
54
  ...(ngDevMode ? [{ debugName: "swipeEnabled" }] : /* istanbul ignore next */ []));
38
- /** اگه true باشه، رد شدن از mobileBreakpoint به‌صورت زنده open رو با openOnDesktop/openOnMobile هماهنگ می‌کنه */
55
+ /** Allows closing by clicking the backdrop. */
56
+ backdropClose = input(true, /* @ts-ignore */
57
+ ...(ngDevMode ? [{ debugName: "backdropClose" }] : /* istanbul ignore next */ []));
58
+ /** Allows Escape to close the drawer. */
59
+ escapeClose = input(true, /* @ts-ignore */
60
+ ...(ngDevMode ? [{ debugName: "escapeClose" }] : /* istanbul ignore next */ []));
61
+ /** The drawer starts open unless explicitly configured otherwise. */
62
+ open = model(true, /* @ts-ignore */
63
+ ...(ngDevMode ? [{ debugName: "open" }] : /* istanbul ignore next */ []));
64
+ /** Pinned drawers are intended for persistent desktop navigation. */
65
+ pinned = model(false, /* @ts-ignore */
66
+ ...(ngDevMode ? [{ debugName: "pinned" }] : /* istanbul ignore next */ []));
67
+ /** Responsive behavior. Can be overridden with individual inputs below. */
68
+ responsive = input({
69
+ mode: 'auto',
70
+ breakpoint: 768,
71
+ desktopOpen: true,
72
+ mobileOpen: false,
73
+ respectPinned: true,
74
+ desktopBehavior: 'dock',
75
+ mobileBehavior: 'overlay',
76
+ }, /* @ts-ignore */
77
+ ...(ngDevMode ? [{ debugName: "responsive" }] : /* istanbul ignore next */ []));
78
+ /** Convenience aliases for the common responsive configuration. */
39
79
  respondToViewport = input(true, /* @ts-ignore */
40
80
  ...(ngDevMode ? [{ debugName: "respondToViewport" }] : /* istanbul ignore next */ []));
81
+ mobileBreakpoint = input(768, /* @ts-ignore */
82
+ ...(ngDevMode ? [{ debugName: "mobileBreakpoint" }] : /* istanbul ignore next */ []));
41
83
  openOnDesktop = input(true, /* @ts-ignore */
42
84
  ...(ngDevMode ? [{ debugName: "openOnDesktop" }] : /* istanbul ignore next */ []));
43
85
  openOnMobile = input(false, /* @ts-ignore */
44
86
  ...(ngDevMode ? [{ debugName: "openOnMobile" }] : /* istanbul ignore next */ []));
45
- mobileBreakpoint = input(768, /* @ts-ignore */
46
- ...(ngDevMode ? [{ debugName: "mobileBreakpoint" }] : /* istanbul ignore next */ []));
47
- /** state دوطرفه‌ی باز/بسته؛ با [(open)] قابل bind هست */
48
- open = model(false, /* @ts-ignore */
49
- ...(ngDevMode ? [{ debugName: "open" }] : /* istanbul ignore next */ []));
50
- directionService = inject(DirectionService);
51
- doc = inject(DOCUMENT);
52
- destroyRef = inject(DestroyRef);
53
- /** فقط حین یه درگِ واقعی مقدار داره؛ null یعنی از روی open() تصمیم بگیر */
54
- dragRatio = signal(null, /* @ts-ignore */
55
- ...(ngDevMode ? [{ debugName: "dragRatio" }] : /* istanbul ignore next */ []));
56
- isDragging = computed(() => this.dragRatio() !== null, /* @ts-ignore */
87
+ /** Visual tuning. */
88
+ curtainStrips = input(9, /* @ts-ignore */
89
+ ...(ngDevMode ? [{ debugName: "curtainStrips" }] : /* istanbul ignore next */ []));
90
+ backdropOpacity = input(0.46, /* @ts-ignore */
91
+ ...(ngDevMode ? [{ debugName: "backdropOpacity" }] : /* istanbul ignore next */ []));
92
+ transitionMs = input(420, /* @ts-ignore */
93
+ ...(ngDevMode ? [{ debugName: "transitionMs" }] : /* istanbul ignore next */ []));
94
+ focusOnOpen = input(true, /* @ts-ignore */
95
+ ...(ngDevMode ? [{ debugName: "focusOnOpen" }] : /* istanbul ignore next */ []));
96
+ dragProgress = signal(null, /* @ts-ignore */
97
+ ...(ngDevMode ? [{ debugName: "dragProgress" }] : /* istanbul ignore next */ []));
98
+ dragVelocity = signal(0, /* @ts-ignore */
99
+ ...(ngDevMode ? [{ debugName: "dragVelocity" }] : /* istanbul ignore next */ []));
100
+ isMobile = signal(false, /* @ts-ignore */
101
+ ...(ngDevMode ? [{ debugName: "isMobile" }] : /* istanbul ignore next */ []));
102
+ effectiveBehavior = computed(() => {
103
+ if (!this.respondToViewport() || this.responsive().mode === 'off') {
104
+ return this.mode() === 'push' ? 'dock' : 'overlay';
105
+ }
106
+ return this.isMobile()
107
+ ? (this.responsiveMobileBehavior() ?? this.mobileBehavior())
108
+ : (this.responsiveDesktopBehavior() ?? this.desktopBehavior());
109
+ }, /* @ts-ignore */
110
+ ...(ngDevMode ? [{ debugName: "effectiveBehavior" }] : /* istanbul ignore next */ []));
111
+ isDocked = computed(() => this.respondToViewport() ? this.effectiveBehavior() === 'dock' : this.mode() === 'push', /* @ts-ignore */
112
+ ...(ngDevMode ? [{ debugName: "isDocked" }] : /* istanbul ignore next */ []));
113
+ usesOverlay = computed(() => !this.isDocked(), /* @ts-ignore */
114
+ ...(ngDevMode ? [{ debugName: "usesOverlay" }] : /* istanbul ignore next */ []));
115
+ isDragging = computed(() => this.dragProgress() !== null, /* @ts-ignore */
57
116
  ...(ngDevMode ? [{ debugName: "isDragging" }] : /* istanbul ignore next */ []));
58
- visualOpen = computed(() => this.dragRatio() ?? (this.open() ? 1 : 0), /* @ts-ignore */
59
- ...(ngDevMode ? [{ debugName: "visualOpen" }] : /* istanbul ignore next */ []));
60
- strips = computed(() => Array.from({ length: this.curtainStrips() }, (_, i) => i), /* @ts-ignore */
117
+ progress = computed(() => this.dragProgress() ?? (this.open() ? 1 : 0), /* @ts-ignore */
118
+ ...(ngDevMode ? [{ debugName: "progress" }] : /* istanbul ignore next */ []));
119
+ isActuallyOpen = computed(() => this.progress() > 0.001, /* @ts-ignore */
120
+ ...(ngDevMode ? [{ debugName: "isActuallyOpen" }] : /* istanbul ignore next */ []));
121
+ strips = computed(() => Array.from({ length: Math.max(3, this.curtainStrips()) }, (_, i) => i), /* @ts-ignore */
61
122
  ...(ngDevMode ? [{ debugName: "strips" }] : /* istanbul ignore next */ []));
62
- /**
63
- * +۱ یعنی این پنل فیزیکاً روی لبه‌ی چپِ صفحه‌ست، -۱ یعنی لبه‌ی راست —
64
- * برای transform:translateX() محتوای اصلی (که برخلاف inset-inline، به
65
- * dir=rtl خودکار واکنش نشون نمی‌ده) لازمه. reactive هست چون هم به side()
66
- * و هم به جهتِ زنده‌ی صفحه (directionService.isRtl()) وابسته‌ست.
67
- */
68
- pushDirSign = computed(() => (this.isPhysicalLeftEdge() ? 1 : -1), /* @ts-ignore */
69
- ...(ngDevMode ? [{ debugName: "pushDirSign" }] : /* istanbul ignore next */ []));
70
- /** برای افکت‌های keyframe‌محور (jelly/pull) — فقط لحظه‌ی رهاشدن (نه حین درگ زنده) پخش می‌شه */
71
- playEffectClass = signal(false, /* @ts-ignore */
72
- ...(ngDevMode ? [{ debugName: "playEffectClass" }] : /* istanbul ignore next */ []));
73
- stopDrag;
123
+ /** Physical side: true means the drawer is attached to the physical left edge. */
124
+ isPhysicalLeft = computed(() => {
125
+ const rtl = this.directionService.isRtl();
126
+ return this.side() === 'start' ? !rtl : rtl;
127
+ }, /* @ts-ignore */
128
+ ...(ngDevMode ? [{ debugName: "isPhysicalLeft" }] : /* istanbul ignore next */ []));
129
+ physicalSign = computed(() => (this.isPhysicalLeft() ? 1 : -1), /* @ts-ignore */
130
+ ...(ngDevMode ? [{ debugName: "physicalSign" }] : /* istanbul ignore next */ []));
131
+ effectiveMode = computed(() => {
132
+ if (!this.respondToViewport() || this.responsive().mode === 'off')
133
+ return this.mode();
134
+ return this.effectiveBehavior() === 'dock' ? 'push' : 'overlay';
135
+ }, /* @ts-ignore */
136
+ ...(ngDevMode ? [{ debugName: "effectiveMode" }] : /* istanbul ignore next */ []));
137
+ duration = computed(() => `${this.transitionMs()}ms`, /* @ts-ignore */
138
+ ...(ngDevMode ? [{ debugName: "duration" }] : /* istanbul ignore next */ []));
139
+ directionService = inject(DirectionService);
140
+ document = inject(DOCUMENT);
141
+ destroyRef = inject(DestroyRef);
142
+ pointerId = null;
74
143
  dragStartX = 0;
75
- dragStartRatio = 0;
76
- prevOpen = false;
144
+ dragStartProgress = 0;
145
+ dragLastX = 0;
146
+ dragLastTime = 0;
147
+ lastVelocity = 0;
148
+ activePointerTarget = null;
149
+ resizeObserver;
150
+ mediaQuery;
151
+ mediaQueryListener;
152
+ lastManagedViewportState = null;
77
153
  constructor() {
78
- // قفل اسکرول پس‌زمینه حین باز بودن پنل (فقط در حالت overlay واقعاً لازمه،
79
- // ولی در push/reveal هم بی‌ضرره و تجربه‌ی بهتری می‌ده)
80
154
  effect((onCleanup) => {
81
- if (this.open() && this.contentBehavior() === 'overlay') {
82
- const prevOverflow = this.doc.body.style.overflow;
83
- this.doc.body.style.overflow = 'hidden';
84
- onCleanup(() => {
85
- this.doc.body.style.overflow = prevOverflow;
86
- });
87
- }
155
+ const locked = this.open() && this.effectiveMode() === 'overlay';
156
+ if (!locked)
157
+ return;
158
+ const body = this.document.body;
159
+ const previous = body.style.overflow;
160
+ body.style.overflow = 'hidden';
161
+ onCleanup(() => (body.style.overflow = previous));
88
162
  });
89
- // پخش انیمیشن keyframe‌محور فقط لحظه‌ای که open() واقعاً عوض می‌شه (نه هر CD)
90
163
  effect(() => {
91
- const isOpen = this.open();
92
- if (isOpen !== this.prevOpen) {
93
- this.prevOpen = isOpen;
94
- this.playEffectClass.set(true);
95
- const id = setTimeout(() => this.playEffectClass.set(false), 700);
96
- // پاک‌سازی در صورتی که کامپوننت زودتر destroy بشه
97
- this.destroyRef.onDestroy(() => clearTimeout(id));
98
- }
164
+ const config = this.responsive();
165
+ const enabled = this.respondToViewport() && config.mode !== 'off';
166
+ const breakpoint = config.breakpoint ?? this.mobileBreakpoint();
167
+ const desktopOpen = config.desktopOpen ?? this.openOnDesktop();
168
+ const mobileOpen = config.mobileOpen ?? this.openOnMobile();
169
+ const desktopBehavior = config.desktopBehavior ?? this.desktopBehavior();
170
+ const mobileBehavior = config.mobileBehavior ?? this.mobileBehavior();
171
+ this.responsiveDesktopBehavior.set(desktopBehavior);
172
+ this.responsiveMobileBehavior.set(mobileBehavior);
173
+ this.setupViewportSync(enabled, breakpoint, desktopOpen, mobileOpen, config.respectPinned ?? true);
174
+ });
175
+ this.destroyRef.onDestroy(() => {
176
+ this.disposePointer();
177
+ this.disposeViewportSync();
99
178
  });
100
- this.destroyRef.onDestroy(() => this.stopDrag?.());
101
- // هماهنگیِ زنده با breakpoint
102
- if (typeof window !== 'undefined') {
103
- const mql = window.matchMedia(`(min-width: ${this.mobileBreakpoint()}px)`);
104
- const applyForCurrentViewport = (isDesktop) => {
105
- if (this.respondToViewport()) {
106
- this.open.set(isDesktop ? this.openOnDesktop() : this.openOnMobile());
107
- }
108
- };
109
- applyForCurrentViewport(mql.matches);
110
- const handler = (e) => applyForCurrentViewport(e.matches);
111
- mql.addEventListener('change', handler);
112
- this.destroyRef.onDestroy(() => mql.removeEventListener('change', handler));
113
- }
114
179
  }
115
- onEscape() {
116
- if (this.open())
117
- this.open.set(false);
180
+ toggle() {
181
+ if (this.pinned() && this.open())
182
+ return;
183
+ this.open.update((value) => !value);
118
184
  }
119
- closeFromBackdrop() {
120
- if (this.backdropClose())
185
+ openDrawer() {
186
+ this.open.set(true);
187
+ }
188
+ closeDrawer() {
189
+ if (!this.pinned())
121
190
  this.open.set(false);
122
191
  }
123
- toggle() {
124
- this.open.update((o) => !o);
192
+ pin() {
193
+ this.pinned.set(true);
194
+ this.open.set(true);
125
195
  }
126
- /** true یعنی این پنل فیزیکاً روی لبه‌ی چپِ صفحه‌ست (صرف‌نظر از start/end منطقی) */
127
- isPhysicalLeftEdge() {
128
- const isRtl = this.directionService.isRtl();
129
- return this.side() === 'start' ? !isRtl : isRtl;
196
+ unpin() {
197
+ this.pinned.set(false);
130
198
  }
131
- stripDelay(index) {
132
- const count = this.curtainStrips();
133
- const order = this.open() ? index : count - 1 - index;
134
- return `${order * 28}ms`;
199
+ onEscape() {
200
+ if (this.escapeClose() && !this.pinned())
201
+ this.closeDrawer();
135
202
  }
136
- // ---------- درگ (هم برای باز کردن از لبه، هم بستن با کشیدنِ پنل) ----------
137
- onEdgeDragStart(ev) {
138
- if (!this.swipeEnabled() || this.open())
203
+ onBackdropPointerDown(event) {
204
+ if (!this.backdropClose() || this.pinned() || !this.usesOverlay())
139
205
  return;
140
- this.beginDrag(ev, 0);
206
+ event.preventDefault();
207
+ this.closeDrawer();
141
208
  }
142
- onPanelDragStart(ev) {
143
- if (!this.open())
209
+ onEdgePointerDown(event) {
210
+ if (!this.swipeEnabled() || this.open() || this.pinned())
144
211
  return;
145
- this.beginDrag(ev, 1);
212
+ this.beginDrag(event, 0);
146
213
  }
147
- beginDrag(ev, startRatio) {
148
- ev.preventDefault();
149
- this.dragStartX = this.clientXOf(ev);
150
- this.dragStartRatio = startRatio;
151
- this.dragRatio.set(startRatio);
152
- this.stopDrag?.();
153
- this.stopDrag = startDragSession({
154
- onMove: (moveEv) => {
155
- const dx = this.clientXOf(moveEv) - this.dragStartX;
156
- const opensToward = this.isPhysicalLeftEdge() ? 1 : -1;
157
- const signedRatio = (dx * opensToward) / this.width();
158
- const ratio = Math.min(1, Math.max(0, this.dragStartRatio + signedRatio));
159
- this.dragRatio.set(ratio);
160
- },
161
- onEnd: () => {
162
- const ratio = this.dragRatio() ?? this.dragStartRatio;
163
- this.open.set(ratio > 0.4);
164
- this.dragRatio.set(null);
165
- this.stopDrag = undefined;
166
- },
167
- });
214
+ onPanelPointerDown(event) {
215
+ if (!this.swipeEnabled() || !this.open() || this.pinned())
216
+ return;
217
+ if (event.button !== 0)
218
+ return;
219
+ this.beginDrag(event, 1);
220
+ }
221
+ beginDrag(event, startProgress) {
222
+ if (this.pointerId !== null)
223
+ return;
224
+ const target = event.currentTarget;
225
+ if (!target)
226
+ return;
227
+ this.pointerId = event.pointerId;
228
+ this.activePointerTarget = target;
229
+ this.dragStartX = event.clientX;
230
+ this.dragLastX = event.clientX;
231
+ this.dragLastTime = performance.now();
232
+ this.dragStartProgress = startProgress;
233
+ this.lastVelocity = 0;
234
+ this.dragProgress.set(startProgress);
235
+ target.setPointerCapture?.(event.pointerId);
236
+ event.preventDefault();
237
+ target.addEventListener('pointermove', this.onPointerMove);
238
+ target.addEventListener('pointerup', this.onPointerUp);
239
+ target.addEventListener('pointercancel', this.onPointerCancel);
240
+ }
241
+ onPointerMove = (event) => {
242
+ if (event.pointerId !== this.pointerId)
243
+ return;
244
+ const now = performance.now();
245
+ const dx = event.clientX - this.dragStartX;
246
+ const signedDistance = dx * this.physicalSign();
247
+ const next = this.clamp01(this.dragStartProgress + signedDistance / this.width());
248
+ const dt = Math.max(8, now - this.dragLastTime);
249
+ this.lastVelocity = ((event.clientX - this.dragLastX) * this.physicalSign()) / dt;
250
+ this.dragVelocity.set(this.lastVelocity);
251
+ this.dragLastX = event.clientX;
252
+ this.dragLastTime = now;
253
+ this.dragProgress.set(next);
254
+ event.preventDefault();
255
+ };
256
+ onPointerUp = (event) => {
257
+ if (event.pointerId !== this.pointerId)
258
+ return;
259
+ const progress = this.dragProgress() ?? this.dragStartProgress;
260
+ const velocity = this.dragVelocity();
261
+ const opening = velocity > this.velocityThreshold();
262
+ const closing = velocity < -this.velocityThreshold();
263
+ let shouldOpen;
264
+ if (opening)
265
+ shouldOpen = true;
266
+ else if (closing)
267
+ shouldOpen = false;
268
+ else
269
+ shouldOpen = progress >= this.dragThreshold();
270
+ this.open.set(shouldOpen);
271
+ this.dragProgress.set(null);
272
+ this.dragVelocity.set(0);
273
+ this.disposePointer(event.pointerId);
274
+ };
275
+ onPointerCancel = (event) => {
276
+ if (event.pointerId !== this.pointerId)
277
+ return;
278
+ const progress = this.dragProgress() ?? this.dragStartProgress;
279
+ this.open.set(progress >= 0.5);
280
+ this.dragProgress.set(null);
281
+ this.dragVelocity.set(0);
282
+ this.disposePointer(event.pointerId);
283
+ };
284
+ disposePointer(pointerId) {
285
+ if (pointerId !== undefined && this.pointerId !== pointerId)
286
+ return;
287
+ const target = this.activePointerTarget;
288
+ if (target) {
289
+ target.removeEventListener('pointermove', this.onPointerMove);
290
+ target.removeEventListener('pointerup', this.onPointerUp);
291
+ target.removeEventListener('pointercancel', this.onPointerCancel);
292
+ if (this.pointerId !== null) {
293
+ try {
294
+ target.releasePointerCapture?.(this.pointerId);
295
+ }
296
+ catch {
297
+ // Pointer capture may already be released by the browser.
298
+ }
299
+ }
300
+ }
301
+ this.pointerId = null;
302
+ this.activePointerTarget = null;
303
+ }
304
+ setupViewportSync(enabled, breakpoint, desktopOpen, mobileOpen, respectPinned) {
305
+ this.disposeViewportSync();
306
+ if (!enabled || typeof window === 'undefined') {
307
+ this.isMobile.set(false);
308
+ return;
309
+ }
310
+ this.mediaQuery = window.matchMedia(`(max-width: ${Math.max(0, breakpoint - 0.02)}px)`);
311
+ const apply = (isMobile) => {
312
+ this.isMobile.set(isMobile);
313
+ if (respectPinned && this.pinned())
314
+ return;
315
+ const next = isMobile ? mobileOpen : desktopOpen;
316
+ if (this.lastManagedViewportState === next)
317
+ return;
318
+ this.lastManagedViewportState = next;
319
+ this.open.set(next);
320
+ };
321
+ apply(this.mediaQuery.matches);
322
+ this.mediaQueryListener = (event) => apply(event.matches);
323
+ this.mediaQuery.addEventListener('change', this.mediaQueryListener);
324
+ }
325
+ disposeViewportSync() {
326
+ if (this.mediaQuery && this.mediaQueryListener) {
327
+ this.mediaQuery.removeEventListener('change', this.mediaQueryListener);
328
+ }
329
+ this.mediaQuery = undefined;
330
+ this.mediaQueryListener = undefined;
331
+ this.lastManagedViewportState = null;
168
332
  }
169
- clientXOf(ev) {
170
- return 'touches' in ev
171
- ? (ev.touches[0]?.clientX ?? ev.changedTouches[0]?.clientX ?? 0)
172
- : ev.clientX;
333
+ clamp01(value) {
334
+ return Math.max(0, Math.min(1, value));
173
335
  }
174
336
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxDrawerMenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
175
- 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 }, contentBehavior: { classPropertyName: "contentBehavior", publicName: "contentBehavior", isSignal: true, isRequired: false, transformFunction: null }, width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, swipeEdgeSize: { classPropertyName: "swipeEdgeSize", publicName: "swipeEdgeSize", isSignal: true, isRequired: false, transformFunction: null }, curtainStrips: { classPropertyName: "curtainStrips", publicName: "curtainStrips", isSignal: true, isRequired: false, transformFunction: null }, backdropClose: { classPropertyName: "backdropClose", publicName: "backdropClose", isSignal: true, isRequired: false, transformFunction: null }, swipeEnabled: { classPropertyName: "swipeEnabled", publicName: "swipeEnabled", isSignal: true, isRequired: false, transformFunction: null }, respondToViewport: { classPropertyName: "respondToViewport", publicName: "respondToViewport", isSignal: true, isRequired: false, transformFunction: null }, openOnDesktop: { classPropertyName: "openOnDesktop", publicName: "openOnDesktop", isSignal: true, isRequired: false, transformFunction: null }, openOnMobile: { classPropertyName: "openOnMobile", publicName: "openOnMobile", isSignal: true, isRequired: false, transformFunction: null }, mobileBreakpoint: { classPropertyName: "mobileBreakpoint", publicName: "mobileBreakpoint", isSignal: true, isRequired: false, transformFunction: null }, open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { open: "openChange" }, host: { listeners: { "document:keydown.escape": "onEscape()" }, classAttribute: "ngx-drawer-menu-host" }, ngImport: i0, template: "<div\n class=\"ngx-drawer-root\"\n [class]=\"'behavior-' + contentBehavior()\"\n [style.perspective.px]=\"1200\">\n @if (swipeEnabled() && !open()) {\n <div\n class=\"ngx-drawer-edge-zone\"\n [class.edge-start]=\"side() === 'start'\"\n [class.edge-end]=\"side() === 'end'\"\n [style.--ngx-drawer-edge-size]=\"swipeEdgeSize() + 'px'\"\n (mousedown)=\"onEdgeDragStart($event)\"\n (touchstart)=\"onEdgeDragStart($event)\"></div>\n }\n\n @if (visualOpen() > 0 && contentBehavior() === 'overlay') {\n <div\n class=\"ngx-drawer-backdrop\"\n [style.opacity]=\"visualOpen()\"\n [class.no-transition]=\"isDragging()\"\n (click)=\"closeFromBackdrop()\"></div>\n }\n\n <div\n class=\"ngx-drawer-main\"\n [class.no-transition]=\"isDragging()\"\n [style.--ngx-drawer-width]=\"width() + 'px'\"\n [style.--ngx-drawer-open]=\"visualOpen()\"\n [style.--ngx-drawer-dir]=\"pushDirSign()\">\n <ng-content></ng-content>\n\n @if (visualOpen() > 0 && contentBehavior() !== 'overlay') {\n <div\n class=\"ngx-drawer-main-dim\"\n [style.opacity]=\"visualOpen() * 0.35\"\n (click)=\"closeFromBackdrop()\"></div>\n }\n </div>\n\n <aside\n class=\"ngx-drawer-panel\"\n [class]=\"'effect-' + effect()\"\n [class.side-start]=\"side() === 'start'\"\n [class.side-end]=\"side() === 'end'\"\n [class.no-transition]=\"isDragging()\"\n [class.is-open]=\"open()\"\n [class.playing]=\"playEffectClass()\"\n [style.--ngx-drawer-width]=\"width() + 'px'\"\n [style.--ngx-drawer-open]=\"visualOpen()\"\n role=\"dialog\"\n aria-modal=\"true\">\n <div\n class=\"ngx-drawer-drag-handle\"\n [class.edge-start]=\"side() === 'start'\"\n [class.edge-end]=\"side() === 'end'\"\n (mousedown)=\"onPanelDragStart($event)\"\n (touchstart)=\"onPanelDragStart($event)\"></div>\n\n <div class=\"ngx-drawer-content\">\n <ng-content select=\"[drawerContent]\"></ng-content>\n </div>\n\n @if (effect() === 'curtain') {\n <div\n class=\"ngx-drawer-curtain\"\n [class.open]=\"open()\"\n [class.revealed]=\"visualOpen() >= 1 && !isDragging()\">\n @for (i of strips(); track i) {\n <div\n class=\"ngx-drawer-strip\"\n [class.side-start]=\"side() === 'start'\"\n [class.side-end]=\"side() === 'end'\"\n [style.transition-delay]=\"stripDelay(i)\"></div>\n }\n </div>\n }\n </aside>\n</div>\n", styles: ["@charset \"UTF-8\";:host{display:contents}:host{display:block;position:relative}.ngx-drawer-root{display:block;position:relative;min-block-size:100%}.ngx-drawer-edge-zone{position:fixed;inset-block:0;inline-size:var(--ngx-drawer-edge-size, 24px);z-index:1400;touch-action:pan-y}.ngx-drawer-edge-zone.edge-start{inset-inline-start:0}.ngx-drawer-edge-zone.edge-end{inset-inline-end:0}.ngx-drawer-backdrop{position:fixed;inset:0;background:#00000080;z-index:1450;transition:opacity .22s ease}.ngx-drawer-backdrop.no-transition{transition:none}.ngx-drawer-main{position:relative;min-block-size:100%;transition:transform .32s cubic-bezier(.22,.9,.32,1)}.ngx-drawer-main.no-transition{transition:none}.ngx-drawer-main-dim{position:absolute;inset:0;background:#000;pointer-events:auto;transition:opacity .22s ease}.behavior-push .ngx-drawer-main{transform:translate(calc(var(--ngx-drawer-open, 0) * var(--ngx-drawer-width, 280px) * var(--ngx-drawer-dir, 1)))}.behavior-reveal .ngx-drawer-main{transform-origin:center;border-radius:calc(var(--ngx-drawer-open, 0) * 16px);overflow:hidden;transform:scale(calc(1 - .08 * var(--ngx-drawer-open, 0))) translate(calc(var(--ngx-drawer-open, 0) * var(--ngx-drawer-width, 280px) * .28 * var(--ngx-drawer-dir, 1)))}.ngx-drawer-panel{position:fixed;inset-block:0;inline-size:var(--ngx-drawer-width, 280px);background:light-dark(#ffffff,#1c1c20);color:light-dark(#111827,#f4f4f5);z-index:1500;box-shadow:0 0 24px #00000040;overflow:hidden;transition:inset-inline-start .32s cubic-bezier(.22,.9,.32,1),inset-inline-end .32s cubic-bezier(.22,.9,.32,1),transform .32s cubic-bezier(.22,.9,.32,1),opacity .32s ease}.ngx-drawer-panel.side-start{inset-inline-start:calc((var(--ngx-drawer-open, 0) - 1) * var(--ngx-drawer-width, 280px))}.ngx-drawer-panel.side-end{inset-inline-end:calc((var(--ngx-drawer-open, 0) - 1) * var(--ngx-drawer-width, 280px))}.ngx-drawer-panel.no-transition{transition:none}.ngx-drawer-drag-handle{position:absolute;inset-block:0;inline-size:20px;z-index:2;touch-action:pan-y}.ngx-drawer-drag-handle.edge-start{inset-inline-end:-10px}.ngx-drawer-drag-handle.edge-end{inset-inline-start:-10px}.ngx-drawer-content{position:relative;block-size:100%;overflow-y:auto}.effect-scale.side-start{inset-inline-start:0;inset-inline-end:auto}.effect-scale.side-end{inset-inline-start:auto;inset-inline-end:0}.effect-scale{transform-origin:center;transform:scale(calc(.72 + .28 * var(--ngx-drawer-open, 0)));opacity:var(--ngx-drawer-open, 0);pointer-events:none}.effect-scale.is-open{pointer-events:auto}.effect-rotate3d{transform-style:preserve-3d;opacity:calc(.35 + .65 * var(--ngx-drawer-open, 0))}.effect-rotate3d.side-start{inset-inline-start:0;inset-inline-end:auto;transform-origin:left center;transform:rotateY(calc((1 - var(--ngx-drawer-open, 0)) * -100deg))}.effect-rotate3d.side-end{inset-inline-start:auto;inset-inline-end:0;transform-origin:right center;transform:rotateY(calc((1 - var(--ngx-drawer-open, 0)) * 100deg))}.effect-flip3d{transform-style:preserve-3d;box-shadow:0 0 30px #00000059}.effect-flip3d.side-start{inset-inline-start:0;inset-inline-end:auto;transform-origin:left center;transform:rotateY(calc((1 - var(--ngx-drawer-open, 0)) * -115deg)) translateZ(calc((1 - var(--ngx-drawer-open, 0)) * -50px))}.effect-flip3d.side-end{inset-inline-start:auto;inset-inline-end:0;transform-origin:right center;transform:rotateY(calc((1 - var(--ngx-drawer-open, 0)) * 115deg)) translateZ(calc((1 - var(--ngx-drawer-open, 0)) * -50px))}@keyframes ngx-drawer-jelly-open{0%{transform:scaleX(.55) skewY(4deg)}35%{transform:scaleX(1.09) skewY(-2.5deg)}55%{transform:scaleX(.96) skewY(1.5deg)}75%{transform:scaleX(1.03) skewY(-.6deg)}to{transform:scaleX(1) skewY(0)}}@keyframes ngx-drawer-jelly-close{0%{transform:scaleX(1) skewY(0)}30%{transform:scaleX(1.07) skewY(2deg)}to{transform:scaleX(.4) skewY(-5deg)}}.effect-jelly.side-start{transform-origin:left center}.effect-jelly.side-end{transform-origin:right center}.effect-jelly.playing.is-open{animation:ngx-drawer-jelly-open .62s cubic-bezier(.34,1.56,.64,1) both}.effect-jelly.playing:not(.is-open){animation:ngx-drawer-jelly-close .48s ease-in both}@keyframes ngx-drawer-pull-open{0%{transform:scaleX(.5)}60%{transform:scaleX(1.14)}to{transform:scaleX(1)}}@keyframes ngx-drawer-pull-close{0%{transform:scaleX(1)}40%{transform:scaleX(1.12)}to{transform:scaleX(.5)}}.effect-pull.side-start{transform-origin:left center}.effect-pull.side-end{transform-origin:right center}.effect-pull.playing.is-open{animation:ngx-drawer-pull-open .42s cubic-bezier(.16,1,.3,1) both}.effect-pull.playing:not(.is-open){animation:ngx-drawer-pull-close .38s ease-in both}.ngx-drawer-curtain{position:absolute;inset:0;display:flex;z-index:1;pointer-events:none}.ngx-drawer-curtain.revealed{display:none}.ngx-drawer-strip{flex:1 1 0;background:light-dark(#ffffff,#1c1c20);transform:scaleX(1);transition:transform .32s cubic-bezier(.65,0,.35,1)}.ngx-drawer-strip.side-start{transform-origin:left center}.ngx-drawer-strip.side-end{transform-origin:right center}.ngx-drawer-curtain.open .ngx-drawer-strip{transform:scaleX(0)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
337
+ 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 }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, desktopBehavior: { classPropertyName: "desktopBehavior", publicName: "desktopBehavior", isSignal: true, isRequired: false, transformFunction: null }, mobileBehavior: { classPropertyName: "mobileBehavior", publicName: "mobileBehavior", 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 }, maxWidth: { classPropertyName: "maxWidth", publicName: "maxWidth", isSignal: true, isRequired: false, transformFunction: null }, edgeSize: { classPropertyName: "edgeSize", publicName: "edgeSize", isSignal: true, isRequired: false, transformFunction: null }, dragThreshold: { classPropertyName: "dragThreshold", publicName: "dragThreshold", isSignal: true, isRequired: false, transformFunction: null }, velocityThreshold: { classPropertyName: "velocityThreshold", publicName: "velocityThreshold", isSignal: true, isRequired: false, transformFunction: null }, swipeEnabled: { classPropertyName: "swipeEnabled", publicName: "swipeEnabled", isSignal: true, isRequired: false, transformFunction: null }, backdropClose: { classPropertyName: "backdropClose", publicName: "backdropClose", isSignal: true, isRequired: false, transformFunction: null }, escapeClose: { classPropertyName: "escapeClose", publicName: "escapeClose", 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 }, respondToViewport: { classPropertyName: "respondToViewport", publicName: "respondToViewport", isSignal: true, isRequired: false, transformFunction: null }, mobileBreakpoint: { classPropertyName: "mobileBreakpoint", publicName: "mobileBreakpoint", isSignal: true, isRequired: false, transformFunction: null }, openOnDesktop: { classPropertyName: "openOnDesktop", publicName: "openOnDesktop", isSignal: true, isRequired: false, transformFunction: null }, openOnMobile: { classPropertyName: "openOnMobile", publicName: "openOnMobile", isSignal: true, isRequired: false, transformFunction: null }, curtainStrips: { classPropertyName: "curtainStrips", publicName: "curtainStrips", isSignal: true, isRequired: false, transformFunction: null }, backdropOpacity: { classPropertyName: "backdropOpacity", publicName: "backdropOpacity", isSignal: true, isRequired: false, transformFunction: null }, transitionMs: { classPropertyName: "transitionMs", publicName: "transitionMs", isSignal: true, isRequired: false, transformFunction: null }, focusOnOpen: { classPropertyName: "focusOnOpen", publicName: "focusOnOpen", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { open: "openChange", pinned: "pinnedChange" }, host: { listeners: { "keydown.escape": "onEscape()" }, classAttribute: "ngx-drawer-menu-host" }, ngImport: i0, template: "<div\n class=\"ngx-drawer\"\n [class.is-open]=\"isActuallyOpen()\"\n [class.is-dragging]=\"isDragging()\"\n [class.is-pinned]=\"pinned()\"\n [class.is-docked]=\"isDocked()\"\n [class.is-overlay]=\"usesOverlay()\"\n [class.side-start]=\"side() === 'start'\"\n [class.side-end]=\"side() === 'end'\"\n [class.physical-left]=\"isPhysicalLeft()\"\n [class.physical-right]=\"!isPhysicalLeft()\"\n [class.mode-overlay]=\"effectiveMode() === 'overlay'\"\n [class.mode-push]=\"effectiveMode() === 'push'\"\n [class.mode-reveal]=\"effectiveMode() === 'reveal'\"\n [class.effect-slide]=\"effect() === 'slide'\"\n [class.effect-spring]=\"effect() === 'spring'\"\n [class.effect-fabric]=\"effect() === 'fabric'\"\n [class.effect-curtain]=\"effect() === 'curtain'\"\n [class.effect-elastic]=\"effect() === 'elastic'\"\n [class.effect-reveal]=\"effect() === 'reveal'\"\n [style.--ngx-progress]=\"progress()\"\n [style.--ngx-width.px]=\"width()\"\n [style.--ngx-edge-size.px]=\"edgeSize()\"\n [style.--ngx-max-width.px]=\"maxWidth()\"\n [style.--ngx-duration]=\"duration()\"\n [style.--ngx-backdrop-opacity]=\"backdropOpacity()\"\n [style.--ngx-physical-sign]=\"physicalSign()\"\n [style.--ngx-closed-translate.px]=\"(1 - progress()) * -width() * physicalSign()\"\n [style.--ngx-transform-origin]=\"isPhysicalLeft() ? 'left center' : 'right center'\"\n [style.--ngx-fabric-skew]=\"(1 - progress()) * 10 + 'deg'\">\n @if (swipeEnabled() && !isActuallyOpen() && !pinned()) {\n <div\n class=\"ngx-drawer-edge-zone\"\n [class.edge-start]=\"side() === 'start'\"\n [class.edge-end]=\"side() === 'end'\"\n (pointerdown)=\"onEdgePointerDown($event)\"\n aria-hidden=\"true\"></div>\n }\n\n @if (isActuallyOpen() && usesOverlay()) {\n <button\n class=\"ngx-drawer-backdrop\"\n type=\"button\"\n tabindex=\"-1\"\n aria-label=\"Close navigation\"\n (pointerdown)=\"onBackdropPointerDown($event)\"></button>\n }\n\n <main class=\"ngx-drawer-main\">\n <ng-content></ng-content>\n </main>\n\n <aside\n class=\"ngx-drawer-panel\"\n [attr.aria-hidden]=\"!isActuallyOpen()\"\n [attr.inert]=\"!isActuallyOpen() ? '' : null\"\n role=\"navigation\">\n <div class=\"ngx-drawer-fabric\" aria-hidden=\"true\">\n <div class=\"ngx-fabric-fold fold-1\"></div>\n <div class=\"ngx-fabric-fold fold-2\"></div>\n <div class=\"ngx-fabric-fold fold-3\"></div>\n <div class=\"ngx-fabric-fold fold-4\"></div>\n <div class=\"ngx-fabric-edge\"></div>\n </div>\n\n <!-- Full-height drag affordance at the physical edge of the panel. -->\n @if (swipeEnabled() && !pinned()) {\n <div\n class=\"ngx-drawer-drag-handle\"\n [class.handle-start]=\"side() === 'start'\"\n [class.handle-end]=\"side() === 'end'\"\n (pointerdown)=\"onPanelPointerDown($event)\"\n aria-hidden=\"true\">\n <span></span>\n </div>\n }\n\n <div class=\"ngx-drawer-inner\">\n <div class=\"ngx-drawer-content\">\n <ng-content select=\"[drawerContent]\"></ng-content>\n </div>\n </div>\n\n @if (effect() === 'curtain') {\n <div class=\"ngx-drawer-curtain\" aria-hidden=\"true\">\n @for (i of strips(); track i) {\n <span\n class=\"ngx-drawer-strip\"\n [style.--strip-index]=\"i\"\n [style.--strip-count]=\"curtainStrips()\"></span>\n }\n </div>\n }\n </aside>\n</div>\n", styles: [":host{display:block;min-block-size:100%;--ngx-ease: cubic-bezier(.22, .9, .28, 1);--ngx-spring: cubic-bezier(.17, .88, .32, 1.24)}.ngx-drawer{position:relative;min-block-size:100%;isolation:isolate;color:light-dark(#101114,#f5f7fb);--progress: var(--ngx-progress, 0);--closed-offset: var(--ngx-closed-translate, 0px)}.ngx-drawer-edge-zone{position:fixed;inset-block:0;inline-size:max(var(--ngx-edge-size, 34px),env(safe-area-inset-left),env(safe-area-inset-right));z-index:1600;touch-action:none;cursor:ew-resize}.ngx-drawer-edge-zone.edge-start{inset-inline-start:0}.ngx-drawer-edge-zone.edge-end{inset-inline-end:0}.ngx-drawer.is-docked{display:grid;grid-template-rows:minmax(0,1fr);min-inline-size:0;overflow:clip}.ngx-drawer.is-docked.side-start{grid-template-columns:calc(var(--progress) * min(var(--ngx-width),var(--ngx-max-width))) minmax(0,1fr)}.ngx-drawer.is-docked.side-end{grid-template-columns:minmax(0,1fr) calc(var(--progress) * min(var(--ngx-width),var(--ngx-max-width)))}.ngx-drawer.is-docked .ngx-drawer-main{position:relative;min-inline-size:0;min-block-size:100%;grid-row:1;transition:min-inline-size var(--ngx-duration) var(--ngx-ease),transform var(--ngx-duration) var(--ngx-ease)}.ngx-drawer.is-docked.side-start .ngx-drawer-main{grid-column:2}.ngx-drawer.is-docked.side-end .ngx-drawer-main{grid-column:1}.ngx-drawer.is-docked .ngx-drawer-panel{position:relative;inset:auto!important;grid-row:1;inline-size:auto;min-inline-size:0;max-inline-size:none;block-size:100%;overflow:hidden;z-index:2;transform:none!important;box-shadow:none;border-radius:0}.ngx-drawer.is-docked.side-start .ngx-drawer-panel{grid-column:1}.ngx-drawer.is-docked.side-end .ngx-drawer-panel{grid-column:2}.ngx-drawer.is-overlay{min-block-size:100%;overflow:clip}.ngx-drawer-backdrop{position:fixed;inset:0;z-index:1450;appearance:none;border:0;padding:0;background:#000;cursor:default;opacity:calc(var(--progress) * var(--ngx-backdrop-opacity));transition:opacity var(--ngx-duration) var(--ngx-ease)}.ngx-drawer.is-overlay .ngx-drawer-main{position:relative;min-block-size:100%;min-inline-size:0;z-index:1}.ngx-drawer.is-dragging .ngx-drawer-main,.ngx-drawer.is-dragging .ngx-drawer-backdrop,.ngx-drawer.is-dragging .ngx-drawer-panel{transition:none!important}.ngx-drawer-panel{position:fixed;inset-block:0;z-index:1500;inline-size:min(var(--ngx-width),var(--ngx-max-width));max-inline-size:calc(100vw - 12px);overflow:visible;background:light-dark(#fff,#181a1f);box-shadow:0 18px 55px #00000029,0 4px 18px #0000001f;will-change:transform;transition:transform var(--ngx-duration) var(--ngx-ease),box-shadow .26s ease;contain:layout}.ngx-drawer.is-overlay.side-start .ngx-drawer-panel{inset-inline-start:0;transform:translate3d(var(--closed-offset),0,0)}.ngx-drawer.is-overlay.side-end .ngx-drawer-panel{inset-inline-end:0;transform:translate3d(var(--closed-offset),0,0)}.ngx-drawer-drag-handle{position:absolute;inset-block:0;inline-size:42px;z-index:30;touch-action:none;cursor:ew-resize}.ngx-drawer-drag-handle.handle-start{inset-inline-end:-18px}.ngx-drawer-drag-handle.handle-end{inset-inline-start:-18px}.ngx-drawer-drag-handle span{position:absolute;inset-block-start:50%;inline-size:4px;block-size:54px;border-radius:999px;background:color-mix(in srgb,currentColor 18%,transparent);opacity:0;transform:translateY(-50%);transition:opacity .14s ease,block-size .14s ease}.ngx-drawer-drag-handle.handle-start span{inset-inline-start:0}.ngx-drawer-drag-handle.handle-end span{inset-inline-end:0}.ngx-drawer-drag-handle:hover span,.ngx-drawer-drag-handle:active span{opacity:.9;block-size:68px}.ngx-drawer-inner{position:relative;block-size:100%;min-block-size:100%;z-index:5;overflow:hidden}.ngx-drawer-content{position:relative;block-size:100%;min-block-size:100%;overflow:auto;overscroll-behavior:contain;scrollbar-width:thin}.ngx-drawer.is-overlay.mode-push .ngx-drawer-main{transition:transform var(--ngx-duration) var(--ngx-ease)}.ngx-drawer.is-overlay.mode-push.physical-left .ngx-drawer-main{transform:translate3d(calc(var(--progress) * var(--ngx-width)),0,0)}.ngx-drawer.is-overlay.mode-push.physical-right .ngx-drawer-main{transform:translate3d(calc(var(--progress) * var(--ngx-width) * -1),0,0)}.ngx-drawer.is-overlay.mode-reveal .ngx-drawer-main{border-radius:calc(var(--progress) * 20px);transform:scale(calc(1 - var(--progress) * .055));overflow:clip}.effect-slide .ngx-drawer-panel{transform:translate3d(var(--closed-offset),0,0)}.effect-spring .ngx-drawer-panel{transform:translate3d(var(--closed-offset),0,0) scaleX(calc(.92 + var(--progress) * .08));transform-origin:center}.effect-elastic .ngx-drawer-panel{transform:translate3d(var(--closed-offset),0,0) scaleX(calc(1 + sin((var(--progress) - .5) * 3.14)*.035))}.effect-fabric .ngx-drawer-panel{transform:translate3d(var(--closed-offset),0,0) skewY(calc((1 - var(--progress)) * var(--ngx-fabric-skew))) scaleX(calc(.78 + var(--progress) * .22))}.effect-curtain .ngx-drawer-panel{transform:translate3d(var(--closed-offset),0,0) scaleX(calc(.82 + var(--progress) * .18))}.effect-reveal .ngx-drawer-panel{transform:translate3d(var(--closed-offset),0,0) scaleY(calc(.96 + var(--progress) * .04))}.ngx-drawer.is-docked .ngx-drawer-panel,.ngx-drawer.is-docked.effect-fabric .ngx-drawer-panel,.ngx-drawer.is-docked.effect-spring .ngx-drawer-panel,.ngx-drawer.is-docked.effect-elastic .ngx-drawer-panel,.ngx-drawer.is-docked.effect-curtain .ngx-drawer-panel,.ngx-drawer.is-docked.effect-reveal .ngx-drawer-panel{transform:none!important}.ngx-drawer-fabric{position:absolute;inset:0;pointer-events:none;z-index:8;overflow:hidden;opacity:calc((1 - var(--progress)) * .9);transition:opacity .22s ease;mix-blend-mode:multiply}.ngx-fabric-fold{position:absolute;inset-block:-5%;inline-size:19%;transform-origin:center;background:linear-gradient(90deg,#fff0,#ffffff29 28%,#00000024 52%,#ffffff1a 72%,#fff0);filter:blur(.4px)}.ngx-fabric-fold.fold-1{inset-inline-start:1%;transform:skewY(6deg)}.ngx-fabric-fold.fold-2{inset-inline-start:21%;transform:skewY(-4deg)}.ngx-fabric-fold.fold-3{inset-inline-start:43%;transform:skewY(5deg)}.ngx-fabric-fold.fold-4{inset-inline-start:65%;transform:skewY(-3deg)}.ngx-fabric-edge{position:absolute;inset-block:0;inline-size:18px;background:linear-gradient(90deg,rgba(0,0,0,.25),transparent);filter:blur(3px)}.ngx-drawer.side-end .ngx-fabric-edge{inset-inline-end:0}.ngx-drawer.side-start .ngx-fabric-edge{inset-inline-start:0}.ngx-drawer-curtain{position:absolute;inset:0;z-index:11;display:flex;pointer-events:none;overflow:hidden}.ngx-drawer-strip{flex:1 1 0;block-size:100%;background:linear-gradient(90deg,#ffffff0f,#ffffff3d,#00000014,#ffffff14);transform-origin:center;transform:scaleX(calc(1 - var(--progress)));transition:transform var(--ngx-duration) var(--ngx-ease);transition-delay:calc(var(--strip-index) / var(--strip-count) * 60ms)}.ngx-drawer.is-dragging .ngx-drawer-strip{transition:none}@media(prefers-reduced-motion:reduce){.ngx-drawer *,.ngx-drawer{transition-duration:1ms!important;animation-duration:1ms!important}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
176
338
  }
177
339
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxDrawerMenuComponent, decorators: [{
178
340
  type: Component,
179
- args: [{ selector: 'ngx-drawer-menu', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'ngx-drawer-menu-host' }, template: "<div\n class=\"ngx-drawer-root\"\n [class]=\"'behavior-' + contentBehavior()\"\n [style.perspective.px]=\"1200\">\n @if (swipeEnabled() && !open()) {\n <div\n class=\"ngx-drawer-edge-zone\"\n [class.edge-start]=\"side() === 'start'\"\n [class.edge-end]=\"side() === 'end'\"\n [style.--ngx-drawer-edge-size]=\"swipeEdgeSize() + 'px'\"\n (mousedown)=\"onEdgeDragStart($event)\"\n (touchstart)=\"onEdgeDragStart($event)\"></div>\n }\n\n @if (visualOpen() > 0 && contentBehavior() === 'overlay') {\n <div\n class=\"ngx-drawer-backdrop\"\n [style.opacity]=\"visualOpen()\"\n [class.no-transition]=\"isDragging()\"\n (click)=\"closeFromBackdrop()\"></div>\n }\n\n <div\n class=\"ngx-drawer-main\"\n [class.no-transition]=\"isDragging()\"\n [style.--ngx-drawer-width]=\"width() + 'px'\"\n [style.--ngx-drawer-open]=\"visualOpen()\"\n [style.--ngx-drawer-dir]=\"pushDirSign()\">\n <ng-content></ng-content>\n\n @if (visualOpen() > 0 && contentBehavior() !== 'overlay') {\n <div\n class=\"ngx-drawer-main-dim\"\n [style.opacity]=\"visualOpen() * 0.35\"\n (click)=\"closeFromBackdrop()\"></div>\n }\n </div>\n\n <aside\n class=\"ngx-drawer-panel\"\n [class]=\"'effect-' + effect()\"\n [class.side-start]=\"side() === 'start'\"\n [class.side-end]=\"side() === 'end'\"\n [class.no-transition]=\"isDragging()\"\n [class.is-open]=\"open()\"\n [class.playing]=\"playEffectClass()\"\n [style.--ngx-drawer-width]=\"width() + 'px'\"\n [style.--ngx-drawer-open]=\"visualOpen()\"\n role=\"dialog\"\n aria-modal=\"true\">\n <div\n class=\"ngx-drawer-drag-handle\"\n [class.edge-start]=\"side() === 'start'\"\n [class.edge-end]=\"side() === 'end'\"\n (mousedown)=\"onPanelDragStart($event)\"\n (touchstart)=\"onPanelDragStart($event)\"></div>\n\n <div class=\"ngx-drawer-content\">\n <ng-content select=\"[drawerContent]\"></ng-content>\n </div>\n\n @if (effect() === 'curtain') {\n <div\n class=\"ngx-drawer-curtain\"\n [class.open]=\"open()\"\n [class.revealed]=\"visualOpen() >= 1 && !isDragging()\">\n @for (i of strips(); track i) {\n <div\n class=\"ngx-drawer-strip\"\n [class.side-start]=\"side() === 'start'\"\n [class.side-end]=\"side() === 'end'\"\n [style.transition-delay]=\"stripDelay(i)\"></div>\n }\n </div>\n }\n </aside>\n</div>\n", styles: ["@charset \"UTF-8\";:host{display:contents}:host{display:block;position:relative}.ngx-drawer-root{display:block;position:relative;min-block-size:100%}.ngx-drawer-edge-zone{position:fixed;inset-block:0;inline-size:var(--ngx-drawer-edge-size, 24px);z-index:1400;touch-action:pan-y}.ngx-drawer-edge-zone.edge-start{inset-inline-start:0}.ngx-drawer-edge-zone.edge-end{inset-inline-end:0}.ngx-drawer-backdrop{position:fixed;inset:0;background:#00000080;z-index:1450;transition:opacity .22s ease}.ngx-drawer-backdrop.no-transition{transition:none}.ngx-drawer-main{position:relative;min-block-size:100%;transition:transform .32s cubic-bezier(.22,.9,.32,1)}.ngx-drawer-main.no-transition{transition:none}.ngx-drawer-main-dim{position:absolute;inset:0;background:#000;pointer-events:auto;transition:opacity .22s ease}.behavior-push .ngx-drawer-main{transform:translate(calc(var(--ngx-drawer-open, 0) * var(--ngx-drawer-width, 280px) * var(--ngx-drawer-dir, 1)))}.behavior-reveal .ngx-drawer-main{transform-origin:center;border-radius:calc(var(--ngx-drawer-open, 0) * 16px);overflow:hidden;transform:scale(calc(1 - .08 * var(--ngx-drawer-open, 0))) translate(calc(var(--ngx-drawer-open, 0) * var(--ngx-drawer-width, 280px) * .28 * var(--ngx-drawer-dir, 1)))}.ngx-drawer-panel{position:fixed;inset-block:0;inline-size:var(--ngx-drawer-width, 280px);background:light-dark(#ffffff,#1c1c20);color:light-dark(#111827,#f4f4f5);z-index:1500;box-shadow:0 0 24px #00000040;overflow:hidden;transition:inset-inline-start .32s cubic-bezier(.22,.9,.32,1),inset-inline-end .32s cubic-bezier(.22,.9,.32,1),transform .32s cubic-bezier(.22,.9,.32,1),opacity .32s ease}.ngx-drawer-panel.side-start{inset-inline-start:calc((var(--ngx-drawer-open, 0) - 1) * var(--ngx-drawer-width, 280px))}.ngx-drawer-panel.side-end{inset-inline-end:calc((var(--ngx-drawer-open, 0) - 1) * var(--ngx-drawer-width, 280px))}.ngx-drawer-panel.no-transition{transition:none}.ngx-drawer-drag-handle{position:absolute;inset-block:0;inline-size:20px;z-index:2;touch-action:pan-y}.ngx-drawer-drag-handle.edge-start{inset-inline-end:-10px}.ngx-drawer-drag-handle.edge-end{inset-inline-start:-10px}.ngx-drawer-content{position:relative;block-size:100%;overflow-y:auto}.effect-scale.side-start{inset-inline-start:0;inset-inline-end:auto}.effect-scale.side-end{inset-inline-start:auto;inset-inline-end:0}.effect-scale{transform-origin:center;transform:scale(calc(.72 + .28 * var(--ngx-drawer-open, 0)));opacity:var(--ngx-drawer-open, 0);pointer-events:none}.effect-scale.is-open{pointer-events:auto}.effect-rotate3d{transform-style:preserve-3d;opacity:calc(.35 + .65 * var(--ngx-drawer-open, 0))}.effect-rotate3d.side-start{inset-inline-start:0;inset-inline-end:auto;transform-origin:left center;transform:rotateY(calc((1 - var(--ngx-drawer-open, 0)) * -100deg))}.effect-rotate3d.side-end{inset-inline-start:auto;inset-inline-end:0;transform-origin:right center;transform:rotateY(calc((1 - var(--ngx-drawer-open, 0)) * 100deg))}.effect-flip3d{transform-style:preserve-3d;box-shadow:0 0 30px #00000059}.effect-flip3d.side-start{inset-inline-start:0;inset-inline-end:auto;transform-origin:left center;transform:rotateY(calc((1 - var(--ngx-drawer-open, 0)) * -115deg)) translateZ(calc((1 - var(--ngx-drawer-open, 0)) * -50px))}.effect-flip3d.side-end{inset-inline-start:auto;inset-inline-end:0;transform-origin:right center;transform:rotateY(calc((1 - var(--ngx-drawer-open, 0)) * 115deg)) translateZ(calc((1 - var(--ngx-drawer-open, 0)) * -50px))}@keyframes ngx-drawer-jelly-open{0%{transform:scaleX(.55) skewY(4deg)}35%{transform:scaleX(1.09) skewY(-2.5deg)}55%{transform:scaleX(.96) skewY(1.5deg)}75%{transform:scaleX(1.03) skewY(-.6deg)}to{transform:scaleX(1) skewY(0)}}@keyframes ngx-drawer-jelly-close{0%{transform:scaleX(1) skewY(0)}30%{transform:scaleX(1.07) skewY(2deg)}to{transform:scaleX(.4) skewY(-5deg)}}.effect-jelly.side-start{transform-origin:left center}.effect-jelly.side-end{transform-origin:right center}.effect-jelly.playing.is-open{animation:ngx-drawer-jelly-open .62s cubic-bezier(.34,1.56,.64,1) both}.effect-jelly.playing:not(.is-open){animation:ngx-drawer-jelly-close .48s ease-in both}@keyframes ngx-drawer-pull-open{0%{transform:scaleX(.5)}60%{transform:scaleX(1.14)}to{transform:scaleX(1)}}@keyframes ngx-drawer-pull-close{0%{transform:scaleX(1)}40%{transform:scaleX(1.12)}to{transform:scaleX(.5)}}.effect-pull.side-start{transform-origin:left center}.effect-pull.side-end{transform-origin:right center}.effect-pull.playing.is-open{animation:ngx-drawer-pull-open .42s cubic-bezier(.16,1,.3,1) both}.effect-pull.playing:not(.is-open){animation:ngx-drawer-pull-close .38s ease-in both}.ngx-drawer-curtain{position:absolute;inset:0;display:flex;z-index:1;pointer-events:none}.ngx-drawer-curtain.revealed{display:none}.ngx-drawer-strip{flex:1 1 0;background:light-dark(#ffffff,#1c1c20);transform:scaleX(1);transition:transform .32s cubic-bezier(.65,0,.35,1)}.ngx-drawer-strip.side-start{transform-origin:left center}.ngx-drawer-strip.side-end{transform-origin:right center}.ngx-drawer-curtain.open .ngx-drawer-strip{transform:scaleX(0)}\n"] }]
180
- }], ctorParameters: () => [], propDecorators: { side: [{ type: i0.Input, args: [{ isSignal: true, alias: "side", required: false }] }], effect: [{ type: i0.Input, args: [{ isSignal: true, alias: "effect", required: false }] }], contentBehavior: [{ type: i0.Input, args: [{ isSignal: true, alias: "contentBehavior", required: false }] }], width: [{ type: i0.Input, args: [{ isSignal: true, alias: "width", required: false }] }], swipeEdgeSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "swipeEdgeSize", required: false }] }], curtainStrips: [{ type: i0.Input, args: [{ isSignal: true, alias: "curtainStrips", required: false }] }], backdropClose: [{ type: i0.Input, args: [{ isSignal: true, alias: "backdropClose", required: false }] }], swipeEnabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "swipeEnabled", required: false }] }], respondToViewport: [{ type: i0.Input, args: [{ isSignal: true, alias: "respondToViewport", required: false }] }], openOnDesktop: [{ type: i0.Input, args: [{ isSignal: true, alias: "openOnDesktop", required: false }] }], openOnMobile: [{ type: i0.Input, args: [{ isSignal: true, alias: "openOnMobile", required: false }] }], mobileBreakpoint: [{ type: i0.Input, args: [{ isSignal: true, alias: "mobileBreakpoint", required: false }] }], open: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: false }] }, { type: i0.Output, args: ["openChange"] }], onEscape: [{
181
- type: HostListener,
182
- args: ['document:keydown.escape']
183
- }] } });
341
+ args: [{ selector: 'ngx-drawer-menu', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, host: {
342
+ class: 'ngx-drawer-menu-host',
343
+ '(keydown.escape)': 'onEscape()',
344
+ }, template: "<div\n class=\"ngx-drawer\"\n [class.is-open]=\"isActuallyOpen()\"\n [class.is-dragging]=\"isDragging()\"\n [class.is-pinned]=\"pinned()\"\n [class.is-docked]=\"isDocked()\"\n [class.is-overlay]=\"usesOverlay()\"\n [class.side-start]=\"side() === 'start'\"\n [class.side-end]=\"side() === 'end'\"\n [class.physical-left]=\"isPhysicalLeft()\"\n [class.physical-right]=\"!isPhysicalLeft()\"\n [class.mode-overlay]=\"effectiveMode() === 'overlay'\"\n [class.mode-push]=\"effectiveMode() === 'push'\"\n [class.mode-reveal]=\"effectiveMode() === 'reveal'\"\n [class.effect-slide]=\"effect() === 'slide'\"\n [class.effect-spring]=\"effect() === 'spring'\"\n [class.effect-fabric]=\"effect() === 'fabric'\"\n [class.effect-curtain]=\"effect() === 'curtain'\"\n [class.effect-elastic]=\"effect() === 'elastic'\"\n [class.effect-reveal]=\"effect() === 'reveal'\"\n [style.--ngx-progress]=\"progress()\"\n [style.--ngx-width.px]=\"width()\"\n [style.--ngx-edge-size.px]=\"edgeSize()\"\n [style.--ngx-max-width.px]=\"maxWidth()\"\n [style.--ngx-duration]=\"duration()\"\n [style.--ngx-backdrop-opacity]=\"backdropOpacity()\"\n [style.--ngx-physical-sign]=\"physicalSign()\"\n [style.--ngx-closed-translate.px]=\"(1 - progress()) * -width() * physicalSign()\"\n [style.--ngx-transform-origin]=\"isPhysicalLeft() ? 'left center' : 'right center'\"\n [style.--ngx-fabric-skew]=\"(1 - progress()) * 10 + 'deg'\">\n @if (swipeEnabled() && !isActuallyOpen() && !pinned()) {\n <div\n class=\"ngx-drawer-edge-zone\"\n [class.edge-start]=\"side() === 'start'\"\n [class.edge-end]=\"side() === 'end'\"\n (pointerdown)=\"onEdgePointerDown($event)\"\n aria-hidden=\"true\"></div>\n }\n\n @if (isActuallyOpen() && usesOverlay()) {\n <button\n class=\"ngx-drawer-backdrop\"\n type=\"button\"\n tabindex=\"-1\"\n aria-label=\"Close navigation\"\n (pointerdown)=\"onBackdropPointerDown($event)\"></button>\n }\n\n <main class=\"ngx-drawer-main\">\n <ng-content></ng-content>\n </main>\n\n <aside\n class=\"ngx-drawer-panel\"\n [attr.aria-hidden]=\"!isActuallyOpen()\"\n [attr.inert]=\"!isActuallyOpen() ? '' : null\"\n role=\"navigation\">\n <div class=\"ngx-drawer-fabric\" aria-hidden=\"true\">\n <div class=\"ngx-fabric-fold fold-1\"></div>\n <div class=\"ngx-fabric-fold fold-2\"></div>\n <div class=\"ngx-fabric-fold fold-3\"></div>\n <div class=\"ngx-fabric-fold fold-4\"></div>\n <div class=\"ngx-fabric-edge\"></div>\n </div>\n\n <!-- Full-height drag affordance at the physical edge of the panel. -->\n @if (swipeEnabled() && !pinned()) {\n <div\n class=\"ngx-drawer-drag-handle\"\n [class.handle-start]=\"side() === 'start'\"\n [class.handle-end]=\"side() === 'end'\"\n (pointerdown)=\"onPanelPointerDown($event)\"\n aria-hidden=\"true\">\n <span></span>\n </div>\n }\n\n <div class=\"ngx-drawer-inner\">\n <div class=\"ngx-drawer-content\">\n <ng-content select=\"[drawerContent]\"></ng-content>\n </div>\n </div>\n\n @if (effect() === 'curtain') {\n <div class=\"ngx-drawer-curtain\" aria-hidden=\"true\">\n @for (i of strips(); track i) {\n <span\n class=\"ngx-drawer-strip\"\n [style.--strip-index]=\"i\"\n [style.--strip-count]=\"curtainStrips()\"></span>\n }\n </div>\n }\n </aside>\n</div>\n", styles: [":host{display:block;min-block-size:100%;--ngx-ease: cubic-bezier(.22, .9, .28, 1);--ngx-spring: cubic-bezier(.17, .88, .32, 1.24)}.ngx-drawer{position:relative;min-block-size:100%;isolation:isolate;color:light-dark(#101114,#f5f7fb);--progress: var(--ngx-progress, 0);--closed-offset: var(--ngx-closed-translate, 0px)}.ngx-drawer-edge-zone{position:fixed;inset-block:0;inline-size:max(var(--ngx-edge-size, 34px),env(safe-area-inset-left),env(safe-area-inset-right));z-index:1600;touch-action:none;cursor:ew-resize}.ngx-drawer-edge-zone.edge-start{inset-inline-start:0}.ngx-drawer-edge-zone.edge-end{inset-inline-end:0}.ngx-drawer.is-docked{display:grid;grid-template-rows:minmax(0,1fr);min-inline-size:0;overflow:clip}.ngx-drawer.is-docked.side-start{grid-template-columns:calc(var(--progress) * min(var(--ngx-width),var(--ngx-max-width))) minmax(0,1fr)}.ngx-drawer.is-docked.side-end{grid-template-columns:minmax(0,1fr) calc(var(--progress) * min(var(--ngx-width),var(--ngx-max-width)))}.ngx-drawer.is-docked .ngx-drawer-main{position:relative;min-inline-size:0;min-block-size:100%;grid-row:1;transition:min-inline-size var(--ngx-duration) var(--ngx-ease),transform var(--ngx-duration) var(--ngx-ease)}.ngx-drawer.is-docked.side-start .ngx-drawer-main{grid-column:2}.ngx-drawer.is-docked.side-end .ngx-drawer-main{grid-column:1}.ngx-drawer.is-docked .ngx-drawer-panel{position:relative;inset:auto!important;grid-row:1;inline-size:auto;min-inline-size:0;max-inline-size:none;block-size:100%;overflow:hidden;z-index:2;transform:none!important;box-shadow:none;border-radius:0}.ngx-drawer.is-docked.side-start .ngx-drawer-panel{grid-column:1}.ngx-drawer.is-docked.side-end .ngx-drawer-panel{grid-column:2}.ngx-drawer.is-overlay{min-block-size:100%;overflow:clip}.ngx-drawer-backdrop{position:fixed;inset:0;z-index:1450;appearance:none;border:0;padding:0;background:#000;cursor:default;opacity:calc(var(--progress) * var(--ngx-backdrop-opacity));transition:opacity var(--ngx-duration) var(--ngx-ease)}.ngx-drawer.is-overlay .ngx-drawer-main{position:relative;min-block-size:100%;min-inline-size:0;z-index:1}.ngx-drawer.is-dragging .ngx-drawer-main,.ngx-drawer.is-dragging .ngx-drawer-backdrop,.ngx-drawer.is-dragging .ngx-drawer-panel{transition:none!important}.ngx-drawer-panel{position:fixed;inset-block:0;z-index:1500;inline-size:min(var(--ngx-width),var(--ngx-max-width));max-inline-size:calc(100vw - 12px);overflow:visible;background:light-dark(#fff,#181a1f);box-shadow:0 18px 55px #00000029,0 4px 18px #0000001f;will-change:transform;transition:transform var(--ngx-duration) var(--ngx-ease),box-shadow .26s ease;contain:layout}.ngx-drawer.is-overlay.side-start .ngx-drawer-panel{inset-inline-start:0;transform:translate3d(var(--closed-offset),0,0)}.ngx-drawer.is-overlay.side-end .ngx-drawer-panel{inset-inline-end:0;transform:translate3d(var(--closed-offset),0,0)}.ngx-drawer-drag-handle{position:absolute;inset-block:0;inline-size:42px;z-index:30;touch-action:none;cursor:ew-resize}.ngx-drawer-drag-handle.handle-start{inset-inline-end:-18px}.ngx-drawer-drag-handle.handle-end{inset-inline-start:-18px}.ngx-drawer-drag-handle span{position:absolute;inset-block-start:50%;inline-size:4px;block-size:54px;border-radius:999px;background:color-mix(in srgb,currentColor 18%,transparent);opacity:0;transform:translateY(-50%);transition:opacity .14s ease,block-size .14s ease}.ngx-drawer-drag-handle.handle-start span{inset-inline-start:0}.ngx-drawer-drag-handle.handle-end span{inset-inline-end:0}.ngx-drawer-drag-handle:hover span,.ngx-drawer-drag-handle:active span{opacity:.9;block-size:68px}.ngx-drawer-inner{position:relative;block-size:100%;min-block-size:100%;z-index:5;overflow:hidden}.ngx-drawer-content{position:relative;block-size:100%;min-block-size:100%;overflow:auto;overscroll-behavior:contain;scrollbar-width:thin}.ngx-drawer.is-overlay.mode-push .ngx-drawer-main{transition:transform var(--ngx-duration) var(--ngx-ease)}.ngx-drawer.is-overlay.mode-push.physical-left .ngx-drawer-main{transform:translate3d(calc(var(--progress) * var(--ngx-width)),0,0)}.ngx-drawer.is-overlay.mode-push.physical-right .ngx-drawer-main{transform:translate3d(calc(var(--progress) * var(--ngx-width) * -1),0,0)}.ngx-drawer.is-overlay.mode-reveal .ngx-drawer-main{border-radius:calc(var(--progress) * 20px);transform:scale(calc(1 - var(--progress) * .055));overflow:clip}.effect-slide .ngx-drawer-panel{transform:translate3d(var(--closed-offset),0,0)}.effect-spring .ngx-drawer-panel{transform:translate3d(var(--closed-offset),0,0) scaleX(calc(.92 + var(--progress) * .08));transform-origin:center}.effect-elastic .ngx-drawer-panel{transform:translate3d(var(--closed-offset),0,0) scaleX(calc(1 + sin((var(--progress) - .5) * 3.14)*.035))}.effect-fabric .ngx-drawer-panel{transform:translate3d(var(--closed-offset),0,0) skewY(calc((1 - var(--progress)) * var(--ngx-fabric-skew))) scaleX(calc(.78 + var(--progress) * .22))}.effect-curtain .ngx-drawer-panel{transform:translate3d(var(--closed-offset),0,0) scaleX(calc(.82 + var(--progress) * .18))}.effect-reveal .ngx-drawer-panel{transform:translate3d(var(--closed-offset),0,0) scaleY(calc(.96 + var(--progress) * .04))}.ngx-drawer.is-docked .ngx-drawer-panel,.ngx-drawer.is-docked.effect-fabric .ngx-drawer-panel,.ngx-drawer.is-docked.effect-spring .ngx-drawer-panel,.ngx-drawer.is-docked.effect-elastic .ngx-drawer-panel,.ngx-drawer.is-docked.effect-curtain .ngx-drawer-panel,.ngx-drawer.is-docked.effect-reveal .ngx-drawer-panel{transform:none!important}.ngx-drawer-fabric{position:absolute;inset:0;pointer-events:none;z-index:8;overflow:hidden;opacity:calc((1 - var(--progress)) * .9);transition:opacity .22s ease;mix-blend-mode:multiply}.ngx-fabric-fold{position:absolute;inset-block:-5%;inline-size:19%;transform-origin:center;background:linear-gradient(90deg,#fff0,#ffffff29 28%,#00000024 52%,#ffffff1a 72%,#fff0);filter:blur(.4px)}.ngx-fabric-fold.fold-1{inset-inline-start:1%;transform:skewY(6deg)}.ngx-fabric-fold.fold-2{inset-inline-start:21%;transform:skewY(-4deg)}.ngx-fabric-fold.fold-3{inset-inline-start:43%;transform:skewY(5deg)}.ngx-fabric-fold.fold-4{inset-inline-start:65%;transform:skewY(-3deg)}.ngx-fabric-edge{position:absolute;inset-block:0;inline-size:18px;background:linear-gradient(90deg,rgba(0,0,0,.25),transparent);filter:blur(3px)}.ngx-drawer.side-end .ngx-fabric-edge{inset-inline-end:0}.ngx-drawer.side-start .ngx-fabric-edge{inset-inline-start:0}.ngx-drawer-curtain{position:absolute;inset:0;z-index:11;display:flex;pointer-events:none;overflow:hidden}.ngx-drawer-strip{flex:1 1 0;block-size:100%;background:linear-gradient(90deg,#ffffff0f,#ffffff3d,#00000014,#ffffff14);transform-origin:center;transform:scaleX(calc(1 - var(--progress)));transition:transform var(--ngx-duration) var(--ngx-ease);transition-delay:calc(var(--strip-index) / var(--strip-count) * 60ms)}.ngx-drawer.is-dragging .ngx-drawer-strip{transition:none}@media(prefers-reduced-motion:reduce){.ngx-drawer *,.ngx-drawer{transition-duration:1ms!important;animation-duration:1ms!important}}\n"] }]
345
+ }], ctorParameters: () => [], propDecorators: { side: [{ type: i0.Input, args: [{ isSignal: true, alias: "side", required: false }] }], mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }], desktopBehavior: [{ type: i0.Input, args: [{ isSignal: true, alias: "desktopBehavior", required: false }] }], mobileBehavior: [{ type: i0.Input, args: [{ isSignal: true, alias: "mobileBehavior", required: false }] }], effect: [{ type: i0.Input, args: [{ isSignal: true, alias: "effect", required: false }] }], width: [{ type: i0.Input, args: [{ isSignal: true, alias: "width", required: false }] }], maxWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxWidth", required: false }] }], edgeSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "edgeSize", required: false }] }], dragThreshold: [{ type: i0.Input, args: [{ isSignal: true, alias: "dragThreshold", required: false }] }], velocityThreshold: [{ type: i0.Input, args: [{ isSignal: true, alias: "velocityThreshold", required: false }] }], swipeEnabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "swipeEnabled", required: false }] }], backdropClose: [{ type: i0.Input, args: [{ isSignal: true, alias: "backdropClose", required: false }] }], escapeClose: [{ type: i0.Input, args: [{ isSignal: true, alias: "escapeClose", 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 }] }], respondToViewport: [{ type: i0.Input, args: [{ isSignal: true, alias: "respondToViewport", required: false }] }], mobileBreakpoint: [{ type: i0.Input, args: [{ isSignal: true, alias: "mobileBreakpoint", required: false }] }], openOnDesktop: [{ type: i0.Input, args: [{ isSignal: true, alias: "openOnDesktop", required: false }] }], openOnMobile: [{ type: i0.Input, args: [{ isSignal: true, alias: "openOnMobile", required: false }] }], curtainStrips: [{ type: i0.Input, args: [{ isSignal: true, alias: "curtainStrips", required: false }] }], backdropOpacity: [{ type: i0.Input, args: [{ isSignal: true, alias: "backdropOpacity", required: false }] }], transitionMs: [{ type: i0.Input, args: [{ isSignal: true, alias: "transitionMs", required: false }] }], focusOnOpen: [{ type: i0.Input, args: [{ isSignal: true, alias: "focusOnOpen", required: false }] }] } });
184
346
 
185
347
  /**
186
348
  * Generated bundle index. Do not edit.