react-native-nitro-modal 0.1.5 → 0.3.0-rc

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 (99) hide show
  1. package/README.md +65 -11
  2. package/android/src/main/java/com/margelo/nitro/nitromodal/BottomSheetPresenter.kt +335 -34
  3. package/android/src/main/java/com/margelo/nitro/nitromodal/HybridNitroModal.kt +63 -22
  4. package/android/src/main/java/com/margelo/nitro/nitromodal/ModalConfig.kt +31 -1
  5. package/android/src/main/java/com/margelo/nitro/nitromodal/ModalContentRoot.kt +48 -5
  6. package/android/src/main/java/com/margelo/nitro/nitromodal/ModalPresenter.kt +63 -4
  7. package/android/src/main/java/com/margelo/nitro/nitromodal/NitroModalHostView.kt +68 -8
  8. package/ios/HybridNitroModal.swift +111 -20
  9. package/ios/ModalConfig.swift +44 -2
  10. package/ios/NitroModalHostView.swift +73 -8
  11. package/ios/SheetView.swift +575 -0
  12. package/ios/SheetViewController.swift +19 -450
  13. package/lib/module/NitroModal.js +39 -7
  14. package/lib/module/NitroModal.js.map +1 -1
  15. package/lib/module/NitroModalView.js +4 -3
  16. package/lib/module/NitroModalView.js.map +1 -1
  17. package/lib/module/NitroModalView.native.js +3 -0
  18. package/lib/module/NitroModalView.native.js.map +1 -1
  19. package/lib/module/NitroModalView.web.js +159 -0
  20. package/lib/module/NitroModalView.web.js.map +1 -0
  21. package/lib/module/index.js.map +1 -1
  22. package/lib/module/web/AnimatedValue.js +126 -0
  23. package/lib/module/web/AnimatedValue.js.map +1 -0
  24. package/lib/module/web/ModalConfig.js +30 -0
  25. package/lib/module/web/ModalConfig.js.map +1 -0
  26. package/lib/module/web/ModalController.js +306 -0
  27. package/lib/module/web/ModalController.js.map +1 -0
  28. package/lib/module/web/ModalPresenter.js +280 -0
  29. package/lib/module/web/ModalPresenter.js.map +1 -0
  30. package/lib/module/web/PopupPresenter.js +117 -0
  31. package/lib/module/web/PopupPresenter.js.map +1 -0
  32. package/lib/module/web/SheetPresenter.js +494 -0
  33. package/lib/module/web/SheetPresenter.js.map +1 -0
  34. package/lib/module/web/dom.js +138 -0
  35. package/lib/module/web/dom.js.map +1 -0
  36. package/lib/typescript/src/NitroModal.d.ts +35 -4
  37. package/lib/typescript/src/NitroModal.d.ts.map +1 -1
  38. package/lib/typescript/src/NitroModal.nitro.d.ts +29 -2
  39. package/lib/typescript/src/NitroModal.nitro.d.ts.map +1 -1
  40. package/lib/typescript/src/NitroModalView.d.ts +2 -1
  41. package/lib/typescript/src/NitroModalView.d.ts.map +1 -1
  42. package/lib/typescript/src/NitroModalView.native.d.ts +1 -0
  43. package/lib/typescript/src/NitroModalView.native.d.ts.map +1 -1
  44. package/lib/typescript/src/NitroModalView.web.d.ts +6 -0
  45. package/lib/typescript/src/NitroModalView.web.d.ts.map +1 -0
  46. package/lib/typescript/src/index.d.ts +2 -2
  47. package/lib/typescript/src/index.d.ts.map +1 -1
  48. package/lib/typescript/src/web/AnimatedValue.d.ts +49 -0
  49. package/lib/typescript/src/web/AnimatedValue.d.ts.map +1 -0
  50. package/lib/typescript/src/web/ModalConfig.d.ts +30 -0
  51. package/lib/typescript/src/web/ModalConfig.d.ts.map +1 -0
  52. package/lib/typescript/src/web/ModalController.d.ts +70 -0
  53. package/lib/typescript/src/web/ModalController.d.ts.map +1 -0
  54. package/lib/typescript/src/web/ModalPresenter.d.ts +107 -0
  55. package/lib/typescript/src/web/ModalPresenter.d.ts.map +1 -0
  56. package/lib/typescript/src/web/PopupPresenter.d.ts +20 -0
  57. package/lib/typescript/src/web/PopupPresenter.d.ts.map +1 -0
  58. package/lib/typescript/src/web/SheetPresenter.d.ts +65 -0
  59. package/lib/typescript/src/web/SheetPresenter.d.ts.map +1 -0
  60. package/lib/typescript/src/web/dom.d.ts +42 -0
  61. package/lib/typescript/src/web/dom.d.ts.map +1 -0
  62. package/nitrogen/generated/android/c++/JHybridNitroModalSpec.cpp +60 -6
  63. package/nitrogen/generated/android/c++/JHybridNitroModalSpec.hpp +10 -2
  64. package/nitrogen/generated/android/c++/JNamedSheetDetent.hpp +64 -0
  65. package/nitrogen/generated/android/c++/JSheetDetent.cpp +26 -0
  66. package/nitrogen/generated/android/c++/JSheetDetent.hpp +42 -37
  67. package/nitrogen/generated/android/c++/views/JHybridNitroModalStateUpdater.cpp +20 -0
  68. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromodal/HybridNitroModalSpec.kt +40 -0
  69. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromodal/NamedSheetDetent.kt +25 -0
  70. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromodal/SheetDetent.kt +47 -10
  71. package/nitrogen/generated/android/nitromodal+autolinking.cmake +1 -0
  72. package/nitrogen/generated/ios/NitroModal-Swift-Cxx-Bridge.hpp +53 -8
  73. package/nitrogen/generated/ios/NitroModal-Swift-Cxx-Umbrella.hpp +4 -3
  74. package/nitrogen/generated/ios/c++/HybridNitroModalSpecSwift.hpp +32 -5
  75. package/nitrogen/generated/ios/c++/views/HybridNitroModalComponent.mm +24 -0
  76. package/nitrogen/generated/ios/swift/HybridNitroModalSpec.swift +4 -0
  77. package/nitrogen/generated/ios/swift/HybridNitroModalSpec_cxx.swift +110 -5
  78. package/nitrogen/generated/ios/swift/NamedSheetDetent.swift +48 -0
  79. package/nitrogen/generated/ios/swift/SheetDetent.swift +15 -33
  80. package/nitrogen/generated/shared/c++/HybridNitroModalSpec.cpp +8 -0
  81. package/nitrogen/generated/shared/c++/HybridNitroModalSpec.hpp +14 -5
  82. package/nitrogen/generated/shared/c++/{SheetDetent.hpp → NamedSheetDetent.hpp} +17 -17
  83. package/nitrogen/generated/shared/c++/views/HybridNitroModalComponent.cpp +9 -1
  84. package/nitrogen/generated/shared/c++/views/HybridNitroModalComponent.hpp +15 -2
  85. package/nitrogen/generated/shared/json/NitroModalConfig.json +4 -0
  86. package/package.json +3 -2
  87. package/src/NitroModal.nitro.ts +30 -2
  88. package/src/NitroModal.tsx +71 -8
  89. package/src/NitroModalView.native.tsx +4 -0
  90. package/src/NitroModalView.tsx +9 -4
  91. package/src/NitroModalView.web.tsx +180 -0
  92. package/src/index.tsx +2 -0
  93. package/src/web/AnimatedValue.ts +193 -0
  94. package/src/web/ModalConfig.ts +67 -0
  95. package/src/web/ModalController.ts +338 -0
  96. package/src/web/ModalPresenter.ts +333 -0
  97. package/src/web/PopupPresenter.ts +129 -0
  98. package/src/web/SheetPresenter.ts +647 -0
  99. package/src/web/dom.ts +171 -0
@@ -0,0 +1,306 @@
1
+ "use strict";
2
+
3
+ /// <reference lib="dom" />
4
+
5
+ import { canUseDOM, estimateViewport, inlineInsets, readSafeAreaInsets } from "./dom.js";
6
+ import { isSameConfig, makeConfig } from "./ModalConfig.js";
7
+ import { popupContentArea, PopupPresenter } from "./PopupPresenter.js";
8
+ import { sheetContentArea, SheetPresenter } from "./SheetPresenter.js";
9
+ /**
10
+ * The web counterpart of the native `HybridNitroModal`: receives the host
11
+ * view's props and drives one presenter per presentation.
12
+ *
13
+ * Presentation is a small state machine so that rapid `isOpen` toggles, user
14
+ * dismissals and unmounts always settle on a consistent state, and every
15
+ * accepted present request ends with exactly one `onDismiss`. Transitions are
16
+ * interrupted rather than queued: closing mid-enter turns the enter around,
17
+ * and opening mid-exit turns the exit around (that session carries on, so it
18
+ * gets no `onDismiss` and at most one `onPresent`).
19
+ */
20
+ export class ModalController {
21
+ methods = {
22
+ present: () => this.requestPresent(),
23
+ dismiss: () => this.requestDismiss('programmatic'),
24
+ snapToDetent: index => {
25
+ if (Number.isFinite(index)) {
26
+ this.presenter?.snapToDetent(Math.trunc(index));
27
+ }
28
+ }
29
+ };
30
+ props = null;
31
+ config = null;
32
+ isOpen = false;
33
+ phase = 'idle';
34
+ /** What React (or an imperative call) asked for. */
35
+ wantsOpen = false;
36
+ /** A present request was accepted and its `onDismiss` is still owed. */
37
+ sessionActive = false;
38
+ /** `onPresent` was sent for the current session. */
39
+ presentSent = false;
40
+ dismissReason = 'programmatic';
41
+ reconcileScheduled = false;
42
+ isAttached = false;
43
+ presenter = null;
44
+ elements = null;
45
+ /** Inline: the element the sheet fills. */
46
+ host = null;
47
+ lastContentArea = null;
48
+
49
+ /** `setMounted` renders (or removes) the modal's elements. */
50
+ constructor(setMounted) {
51
+ this.setMounted = setMounted;
52
+ }
53
+
54
+ // Host view lifecycle
55
+
56
+ attach() {
57
+ this.isAttached = true;
58
+ window.addEventListener('resize', this.handleWindowResize);
59
+ }
60
+
61
+ /** The host view unmounted. Also runs for React's strict-mode remount, so `attach` must work again. */
62
+ detach() {
63
+ this.isAttached = false;
64
+ window.removeEventListener('resize', this.handleWindowResize);
65
+ this.presenter?.destroy();
66
+ this.presenter = null;
67
+ this.phase = 'idle';
68
+ this.wantsOpen = false;
69
+ this.sessionActive = false;
70
+ this.presentSent = false;
71
+ this.dismissReason = 'programmatic';
72
+ // Applied again from the props on the next `update`.
73
+ this.isOpen = false;
74
+ this.config = null;
75
+ this.lastContentArea = null;
76
+ this.setMounted(false);
77
+ }
78
+
79
+ /** The host view rendered with new props. */
80
+ update(props) {
81
+ this.props = props;
82
+ const next = makeConfig(props);
83
+ if (!this.config || !isSameConfig(next, this.config)) {
84
+ this.config = next;
85
+ if (this.presenter) {
86
+ this.presenter.update(next);
87
+ } else {
88
+ this.reportEstimatedContentArea();
89
+ }
90
+ }
91
+ if (props.isOpen !== this.isOpen) {
92
+ this.isOpen = props.isOpen;
93
+ if (props.isOpen) {
94
+ this.requestPresent();
95
+ } else {
96
+ this.requestDismiss('programmatic');
97
+ }
98
+ }
99
+ }
100
+
101
+ /** Inline: the element the sheet fills, rendered in place. */
102
+ hostDidChange(host) {
103
+ if (host === this.host) return;
104
+ this.host = host;
105
+ if (!this.presenter) {
106
+ this.reportEstimatedContentArea();
107
+ }
108
+ }
109
+ elementsDidMount(elements) {
110
+ this.elements = elements;
111
+ if (this.presenter && !this.presenter.isShown) {
112
+ this.presenter.show(elements);
113
+ }
114
+ }
115
+ elementsWillUnmount() {
116
+ this.elements = null;
117
+ }
118
+ contentDidRender() {
119
+ this.presenter?.contentDidRender();
120
+ }
121
+
122
+ /** Escape key, routed by React Native Web's `Modal` to the topmost modal. */
123
+ handleBackPress = () => {
124
+ // Already on its way out: the press is spent.
125
+ if (!this.isVisible) return;
126
+ this.props?.onBackButtonPress?.();
127
+ if (!this.config?.dismissOnBackButton) return;
128
+ this.requestDismiss('backButton');
129
+ this.reconcile();
130
+ };
131
+
132
+ // State machine
133
+
134
+ get isVisible() {
135
+ return this.phase === 'presenting' || this.phase === 'presented';
136
+ }
137
+ requestPresent() {
138
+ if (!this.isAttached) return;
139
+ this.wantsOpen = true;
140
+ this.sessionActive = true;
141
+ this.scheduleReconcile();
142
+ }
143
+ requestDismiss(reason) {
144
+ if (this.wantsOpen) {
145
+ this.dismissReason = reason;
146
+ }
147
+ this.wantsOpen = false;
148
+ this.scheduleReconcile();
149
+ }
150
+
151
+ /** Coalesces the requests made in one task, e.g. an open and a close in the same handler. */
152
+ scheduleReconcile() {
153
+ if (this.reconcileScheduled) return;
154
+ this.reconcileScheduled = true;
155
+ queueMicrotask(() => {
156
+ this.reconcileScheduled = false;
157
+ if (this.isAttached) {
158
+ this.reconcile();
159
+ }
160
+ });
161
+ }
162
+ reconcile() {
163
+ switch (this.phase) {
164
+ case 'presenting':
165
+ case 'presented':
166
+ if (!this.wantsOpen) {
167
+ this.startDismiss();
168
+ }
169
+ break;
170
+ case 'dismissing':
171
+ if (this.wantsOpen && this.presenter?.cancelDismiss()) {
172
+ this.phase = 'presenting';
173
+ this.dismissReason = 'programmatic';
174
+ }
175
+ break;
176
+ case 'idle':
177
+ if (this.wantsOpen) {
178
+ this.startPresent();
179
+ } else if (this.sessionActive) {
180
+ this.endSession(); // Cancelled before anything appeared.
181
+ }
182
+ break;
183
+ }
184
+ }
185
+ startPresent() {
186
+ const {
187
+ config
188
+ } = this;
189
+ if (!canUseDOM || !config) return;
190
+ const presenter = config.mode === 'popup' ? new PopupPresenter(config, this) : new SheetPresenter(config, this);
191
+ this.presenter = presenter;
192
+ this.phase = 'presenting';
193
+ this.setMounted(true);
194
+ // Still mounted from a presentation that just ended.
195
+ if (this.elements) {
196
+ presenter.show(this.elements);
197
+ }
198
+ }
199
+ startDismiss() {
200
+ const {
201
+ presenter
202
+ } = this;
203
+ if (!presenter?.isShown) {
204
+ // Its elements never mounted.
205
+ presenter?.destroy();
206
+ this.finishDismiss();
207
+ return;
208
+ }
209
+ this.phase = 'dismissing';
210
+ presenter.dismiss();
211
+ }
212
+ finishDismiss() {
213
+ this.phase = 'idle';
214
+ this.presenter = null;
215
+ this.setMounted(false);
216
+ this.endSession();
217
+ this.reconcile();
218
+ }
219
+ endSession() {
220
+ if (!this.sessionActive) return;
221
+ const reason = this.dismissReason;
222
+ this.dismissReason = 'programmatic';
223
+ this.presentSent = false;
224
+ // A present requested while we were dismissing starts a new session.
225
+ this.sessionActive = this.wantsOpen;
226
+ if (this.isAttached) {
227
+ this.props?.onDismiss?.(reason);
228
+ }
229
+ }
230
+
231
+ // PresenterListener
232
+
233
+ onPresented() {
234
+ if (this.phase !== 'presenting') return;
235
+ this.phase = 'presented';
236
+ if (!this.presentSent) {
237
+ this.presentSent = true;
238
+ this.props?.onPresent?.();
239
+ }
240
+ this.reconcile();
241
+ }
242
+ onDismissed() {
243
+ this.finishDismiss();
244
+ }
245
+ onBackdropPress() {
246
+ this.props?.onBackdropPress?.();
247
+ if (!this.config?.dismissOnBackdropPress || !this.isVisible) return;
248
+ this.requestDismiss('backdrop');
249
+ this.reconcile();
250
+ }
251
+ onSwipeDismiss() {
252
+ if (!this.config?.dismissOnSwipe || !this.isVisible) return;
253
+ this.requestDismiss('swipe');
254
+ this.reconcile();
255
+ }
256
+ onDetentChange(index) {
257
+ this.props?.onDetentChange?.(index);
258
+ }
259
+ onPullToRefresh() {
260
+ this.props?.onPullToRefresh?.();
261
+ }
262
+ onContentAreaChange(width, height) {
263
+ const area = {
264
+ width: Math.floor(width),
265
+ height: Math.floor(height)
266
+ };
267
+ const last = this.lastContentArea;
268
+ if (area.width <= 0 || area.height <= 0) return;
269
+ if (last?.width === area.width && last.height === area.height) return;
270
+ this.lastContentArea = area;
271
+ this.props?.onContentAreaChange?.(area);
272
+ }
273
+
274
+ // Helpers
275
+
276
+ /** Lets React size the content before the first presentation. */
277
+ reportEstimatedContentArea() {
278
+ const {
279
+ config
280
+ } = this;
281
+ if (!canUseDOM || !this.isAttached || !config) return;
282
+ if (config.isInline) {
283
+ const {
284
+ host
285
+ } = this;
286
+ if (!host || host.clientWidth === 0 || host.clientHeight === 0) return;
287
+ const viewport = {
288
+ width: host.clientWidth,
289
+ height: host.clientHeight
290
+ };
291
+ const area = sheetContentArea(config.detents, viewport, inlineInsets(host), true);
292
+ this.onContentAreaChange(area.width, area.height);
293
+ return;
294
+ }
295
+ const viewport = estimateViewport();
296
+ const insets = readSafeAreaInsets();
297
+ const area = config.mode === 'popup' ? popupContentArea(viewport, insets) : sheetContentArea(config.detents, viewport, insets, false);
298
+ this.onContentAreaChange(area.width, area.height);
299
+ }
300
+ handleWindowResize = () => {
301
+ if (!this.presenter) {
302
+ this.reportEstimatedContentArea();
303
+ }
304
+ };
305
+ }
306
+ //# sourceMappingURL=ModalController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["canUseDOM","estimateViewport","inlineInsets","readSafeAreaInsets","isSameConfig","makeConfig","popupContentArea","PopupPresenter","sheetContentArea","SheetPresenter","ModalController","methods","present","requestPresent","dismiss","requestDismiss","snapToDetent","index","Number","isFinite","presenter","Math","trunc","props","config","isOpen","phase","wantsOpen","sessionActive","presentSent","dismissReason","reconcileScheduled","isAttached","elements","host","lastContentArea","constructor","setMounted","attach","window","addEventListener","handleWindowResize","detach","removeEventListener","destroy","update","next","reportEstimatedContentArea","hostDidChange","elementsDidMount","isShown","show","elementsWillUnmount","contentDidRender","handleBackPress","isVisible","onBackButtonPress","dismissOnBackButton","reconcile","scheduleReconcile","reason","queueMicrotask","startDismiss","cancelDismiss","startPresent","endSession","mode","finishDismiss","onDismiss","onPresented","onPresent","onDismissed","onBackdropPress","dismissOnBackdropPress","onSwipeDismiss","dismissOnSwipe","onDetentChange","onPullToRefresh","onContentAreaChange","width","height","area","floor","last","isInline","clientWidth","clientHeight","viewport","detents","insets"],"sourceRoot":"../../../src","sources":["web/ModalController.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,280 @@
1
+ "use strict";
2
+
3
+ /// <reference lib="dom" />
4
+
5
+ import { canScrollWithin, clipOverflow, inlineInsets, readKeyboardHeight, readSafeAreaInsets, toCSSColor, ZERO_INSETS } from "./dom.js";
6
+
7
+ /** DOM rendered by the web host view for one presentation. */
8
+
9
+ /**
10
+ * Owns one presentation from show to dismiss. Subclasses lay out the surface
11
+ * and drive the enter/exit animations; this class tracks the viewport, the
12
+ * on-screen keyboard and the content size, and handles the backdrop and
13
+ * teardown.
14
+ *
15
+ * Transitions are interruptible: dismissing mid-enter turns the enter around,
16
+ * and `cancelDismiss` turns an exit back around. Once an exit starts the modal
17
+ * stops taking input.
18
+ *
19
+ * Inline, the elements fill the host view in place of a full-window layer:
20
+ * only the surface takes input, and the keyboard is left to the page.
21
+ */
22
+ export class ModalPresenter {
23
+ elements = null;
24
+ viewport = {
25
+ width: 0,
26
+ height: 0
27
+ };
28
+ insets = ZERO_INSETS;
29
+ /** Part of the viewport covered by the on-screen keyboard, from the bottom. */
30
+ keyboardHeight = 0;
31
+ /** Measured size of the React content. */
32
+ contentSize = {
33
+ width: 0,
34
+ height: 0
35
+ };
36
+ entering = false;
37
+ isDismissing = false;
38
+ finished = false;
39
+ observedContent = null;
40
+ resizeObserver = null;
41
+ /** Inline: follows the host's size, which can change without a window resize. */
42
+ hostObserver = null;
43
+ constructor(config, listener) {
44
+ this.config = config;
45
+ this.listener = listener;
46
+ }
47
+ get isShown() {
48
+ return this.elements != null;
49
+ }
50
+
51
+ /** Takes over the rendered elements and starts the enter transition. */
52
+ show(elements) {
53
+ if (this.elements || this.finished) return;
54
+ this.elements = elements;
55
+ // The elements can outlive a previous presentation (an immediate re-present).
56
+ this.setInteractive(true);
57
+ elements.surface.style.overflow = clipOverflow();
58
+ elements.surface.style.opacity = '';
59
+ elements.surface.style.transform = '';
60
+ elements.backdrop.style.display = this.config.isInline ? 'none' : '';
61
+ window.addEventListener('resize', this.handleResize);
62
+ if (this.config.isInline) {
63
+ if (typeof ResizeObserver !== 'undefined') {
64
+ this.hostObserver = new ResizeObserver(this.handleResize);
65
+ this.hostObserver.observe(elements.overlay);
66
+ }
67
+ } else {
68
+ window.visualViewport?.addEventListener('resize', this.handleKeyboard);
69
+ window.visualViewport?.addEventListener('scroll', this.handleKeyboard);
70
+ elements.backdrop.addEventListener('click', this.handleBackdropClick);
71
+ elements.overlay.addEventListener('wheel', this.handleWheel, {
72
+ passive: false
73
+ });
74
+ }
75
+ if (typeof ResizeObserver !== 'undefined') {
76
+ this.resizeObserver = new ResizeObserver(this.handleContentResize);
77
+ }
78
+ this.measureViewport();
79
+ this.observeContent();
80
+ this.applyBackdrop();
81
+ this.didShow();
82
+ this.entering = true;
83
+ this.animateIn();
84
+ }
85
+ update(config) {
86
+ const previous = this.config;
87
+ this.config = config;
88
+ if (!this.elements) return;
89
+ this.applyBackdrop();
90
+ this.configDidChange(previous);
91
+ }
92
+
93
+ /** The React content re-rendered; its root element may have changed. */
94
+ contentDidRender() {
95
+ if (this.elements && this.observeContent()) {
96
+ this.contentSizeDidChange();
97
+ }
98
+ }
99
+
100
+ /**
101
+ * Animated dismissal, also from mid-enter. `onDismissed` follows when it
102
+ * completes, unless `cancelDismiss` turns it around first.
103
+ */
104
+ dismiss() {
105
+ const elements = this.elements;
106
+ if (!elements || this.isDismissing || this.finished) return;
107
+ this.isDismissing = true;
108
+ this.entering = false;
109
+ this.setInteractive(false);
110
+ // Also hides the on-screen keyboard.
111
+ const focused = document.activeElement;
112
+ if (focused instanceof HTMLElement && elements.overlay.contains(focused)) {
113
+ focused.blur();
114
+ }
115
+ this.animateOut(() => this.finish());
116
+ }
117
+
118
+ /**
119
+ * Reverses a running exit from wherever it is. `onPresented` follows once
120
+ * it settles. Returns false when there is no exit to reverse.
121
+ */
122
+ cancelDismiss() {
123
+ if (!this.elements || !this.isDismissing || this.finished) return false;
124
+ this.isDismissing = false;
125
+ this.setInteractive(true);
126
+ this.entering = true;
127
+ this.animateIn();
128
+ return true;
129
+ }
130
+
131
+ /** Tears down without animating or notifying the listener. */
132
+ destroy() {
133
+ if (this.finished) return;
134
+ this.finished = true;
135
+ this.teardown();
136
+ }
137
+ snapToDetent(_index) {}
138
+
139
+ /** The elements are in place; lay out the hidden state. */
140
+
141
+ /** Animates from the current state to presented, then calls `notifyPresented`. */
142
+
143
+ /** Animates from the current state (possibly mid-enter) to gone, then calls `onEnd`. */
144
+
145
+ /** The viewport size, safe area or keyboard height changed. */
146
+
147
+ /** For subclasses: the running enter animation settled. */
148
+ notifyPresented() {
149
+ if (!this.entering || this.isDismissing || this.finished) return;
150
+ this.entering = false;
151
+ this.listener.onPresented();
152
+ }
153
+ reportContentArea(width, height) {
154
+ if (width > 0 && height > 0) {
155
+ this.listener.onContentAreaChange(width, height);
156
+ }
157
+ }
158
+ teardown() {
159
+ this.stopAnimations();
160
+ window.removeEventListener('resize', this.handleResize);
161
+ window.visualViewport?.removeEventListener('resize', this.handleKeyboard);
162
+ window.visualViewport?.removeEventListener('scroll', this.handleKeyboard);
163
+ this.elements?.backdrop.removeEventListener('click', this.handleBackdropClick);
164
+ this.elements?.overlay.removeEventListener('wheel', this.handleWheel);
165
+ this.resizeObserver?.disconnect();
166
+ this.resizeObserver = null;
167
+ this.hostObserver?.disconnect();
168
+ this.hostObserver = null;
169
+ this.observedContent = null;
170
+ }
171
+ finish() {
172
+ if (this.finished) return;
173
+ this.finished = true;
174
+ this.teardown();
175
+ this.listener.onDismissed();
176
+ }
177
+ applyBackdrop() {
178
+ const {
179
+ backdrop,
180
+ surface
181
+ } = this.elements;
182
+ const {
183
+ config
184
+ } = this;
185
+ backdrop.style.backgroundColor = toCSSColor(config.backdropColor, config.backdropOpacity);
186
+ const blur = config.backdropBlurRadius > 0 ? `blur(${config.backdropBlurRadius}px)` : '';
187
+ backdrop.style.setProperty('backdrop-filter', blur);
188
+ backdrop.style.setProperty('-webkit-backdrop-filter', blur);
189
+ // `Canvas` follows the page's `color-scheme`, like a system background.
190
+ surface.style.backgroundColor = config.contentBackgroundColor != null ? toCSSColor(config.contentBackgroundColor) : 'Canvas';
191
+ }
192
+
193
+ /** Inline, only the surface takes input; the rest reaches the page. */
194
+ setInteractive(interactive) {
195
+ const {
196
+ overlay,
197
+ surface
198
+ } = this.elements;
199
+ if (this.config.isInline) {
200
+ overlay.style.pointerEvents = 'none';
201
+ surface.style.pointerEvents = interactive ? 'auto' : 'none';
202
+ } else {
203
+ overlay.style.pointerEvents = interactive ? '' : 'none';
204
+ }
205
+ }
206
+ measureViewport() {
207
+ const {
208
+ overlay
209
+ } = this.elements;
210
+ this.viewport = {
211
+ width: overlay.clientWidth,
212
+ height: overlay.clientHeight
213
+ };
214
+ if (this.config.isInline) {
215
+ this.insets = inlineInsets(overlay);
216
+ this.keyboardHeight = 0;
217
+ } else {
218
+ this.insets = readSafeAreaInsets();
219
+ this.keyboardHeight = readKeyboardHeight(this.viewport.height);
220
+ }
221
+ }
222
+
223
+ /** Re-targets the observer at the content's root element. Returns whether its size changed. */
224
+ observeContent() {
225
+ const root = this.elements?.content.firstElementChild;
226
+ const element = root instanceof HTMLElement ? root : null;
227
+ if (element !== this.observedContent) {
228
+ if (this.observedContent) {
229
+ this.resizeObserver?.unobserve(this.observedContent);
230
+ }
231
+ this.observedContent = element;
232
+ if (element) {
233
+ this.resizeObserver?.observe(element);
234
+ }
235
+ }
236
+ return this.measureContent();
237
+ }
238
+ measureContent() {
239
+ // Layout sizes, unaffected by the transition's transforms.
240
+ const width = this.observedContent?.offsetWidth ?? 0;
241
+ const height = this.observedContent?.offsetHeight ?? 0;
242
+ if (width === this.contentSize.width && height === this.contentSize.height) return false;
243
+ this.contentSize = {
244
+ width,
245
+ height
246
+ };
247
+ return true;
248
+ }
249
+ handleContentResize = () => {
250
+ if (this.measureContent()) {
251
+ this.contentSizeDidChange();
252
+ }
253
+ };
254
+ handleResize = () => {
255
+ if (!this.elements) return;
256
+ this.measureViewport();
257
+ this.viewportDidChange();
258
+ };
259
+ handleKeyboard = () => {
260
+ if (this.config.isInline) return;
261
+ const height = readKeyboardHeight(this.viewport.height);
262
+ if (height === this.keyboardHeight) return;
263
+ this.keyboardHeight = height;
264
+ this.viewportDidChange();
265
+ };
266
+ handleBackdropClick = () => {
267
+ if (!this.isDismissing && !this.finished) {
268
+ this.listener.onBackdropPress();
269
+ }
270
+ };
271
+
272
+ /** Keeps the page behind the modal from scrolling; scrollable content still scrolls. */
273
+ handleWheel = event => {
274
+ if (event.ctrlKey || Math.abs(event.deltaX) > Math.abs(event.deltaY)) return;
275
+ if (!canScrollWithin(event.target, this.elements.overlay, event.deltaY)) {
276
+ event.preventDefault();
277
+ }
278
+ };
279
+ }
280
+ //# sourceMappingURL=ModalPresenter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["canScrollWithin","clipOverflow","inlineInsets","readKeyboardHeight","readSafeAreaInsets","toCSSColor","ZERO_INSETS","ModalPresenter","elements","viewport","width","height","insets","keyboardHeight","contentSize","entering","isDismissing","finished","observedContent","resizeObserver","hostObserver","constructor","config","listener","isShown","show","setInteractive","surface","style","overflow","opacity","transform","backdrop","display","isInline","window","addEventListener","handleResize","ResizeObserver","observe","overlay","visualViewport","handleKeyboard","handleBackdropClick","handleWheel","passive","handleContentResize","measureViewport","observeContent","applyBackdrop","didShow","animateIn","update","previous","configDidChange","contentDidRender","contentSizeDidChange","dismiss","focused","document","activeElement","HTMLElement","contains","blur","animateOut","finish","cancelDismiss","destroy","teardown","snapToDetent","_index","notifyPresented","onPresented","reportContentArea","onContentAreaChange","stopAnimations","removeEventListener","disconnect","onDismissed","backgroundColor","backdropColor","backdropOpacity","backdropBlurRadius","setProperty","contentBackgroundColor","interactive","pointerEvents","clientWidth","clientHeight","root","content","firstElementChild","element","unobserve","measureContent","offsetWidth","offsetHeight","viewportDidChange","onBackdropPress","event","ctrlKey","Math","abs","deltaX","deltaY","target","preventDefault"],"sourceRoot":"../../../src","sources":["web/ModalPresenter.ts"],"mappings":"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","ignoreList":[]}