react-native-nitro-modal 0.1.4 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/README.md +19 -7
  2. package/android/src/main/java/com/margelo/nitro/nitromodal/BottomSheetPresenter.kt +72 -21
  3. package/android/src/main/java/com/margelo/nitro/nitromodal/HybridNitroModal.kt +17 -3
  4. package/android/src/main/java/com/margelo/nitro/nitromodal/ModalPresenter.kt +121 -12
  5. package/android/src/main/java/com/margelo/nitro/nitromodal/PopupPresenter.kt +92 -31
  6. package/lib/module/NitroModal.js +1 -2
  7. package/lib/module/NitroModal.js.map +1 -1
  8. package/lib/module/NitroModalView.js +4 -3
  9. package/lib/module/NitroModalView.js.map +1 -1
  10. package/lib/module/NitroModalView.native.js +3 -0
  11. package/lib/module/NitroModalView.native.js.map +1 -1
  12. package/lib/module/NitroModalView.web.js +129 -0
  13. package/lib/module/NitroModalView.web.js.map +1 -0
  14. package/lib/module/web/AnimatedValue.js +123 -0
  15. package/lib/module/web/AnimatedValue.js.map +1 -0
  16. package/lib/module/web/ModalConfig.js +26 -0
  17. package/lib/module/web/ModalConfig.js.map +1 -0
  18. package/lib/module/web/ModalController.js +279 -0
  19. package/lib/module/web/ModalController.js.map +1 -0
  20. package/lib/module/web/ModalPresenter.js +245 -0
  21. package/lib/module/web/ModalPresenter.js.map +1 -0
  22. package/lib/module/web/PopupPresenter.js +117 -0
  23. package/lib/module/web/PopupPresenter.js.map +1 -0
  24. package/lib/module/web/SheetPresenter.js +469 -0
  25. package/lib/module/web/SheetPresenter.js.map +1 -0
  26. package/lib/module/web/dom.js +125 -0
  27. package/lib/module/web/dom.js.map +1 -0
  28. package/lib/typescript/src/NitroModal.d.ts +2 -2
  29. package/lib/typescript/src/NitroModal.d.ts.map +1 -1
  30. package/lib/typescript/src/NitroModalView.d.ts +2 -1
  31. package/lib/typescript/src/NitroModalView.d.ts.map +1 -1
  32. package/lib/typescript/src/NitroModalView.native.d.ts +1 -0
  33. package/lib/typescript/src/NitroModalView.native.d.ts.map +1 -1
  34. package/lib/typescript/src/NitroModalView.web.d.ts +6 -0
  35. package/lib/typescript/src/NitroModalView.web.d.ts.map +1 -0
  36. package/lib/typescript/src/web/AnimatedValue.d.ts +48 -0
  37. package/lib/typescript/src/web/AnimatedValue.d.ts.map +1 -0
  38. package/lib/typescript/src/web/ModalConfig.d.ts +24 -0
  39. package/lib/typescript/src/web/ModalConfig.d.ts.map +1 -0
  40. package/lib/typescript/src/web/ModalController.d.ts +65 -0
  41. package/lib/typescript/src/web/ModalController.d.ts.map +1 -0
  42. package/lib/typescript/src/web/ModalPresenter.d.ts +98 -0
  43. package/lib/typescript/src/web/ModalPresenter.d.ts.map +1 -0
  44. package/lib/typescript/src/web/PopupPresenter.d.ts +20 -0
  45. package/lib/typescript/src/web/PopupPresenter.d.ts.map +1 -0
  46. package/lib/typescript/src/web/SheetPresenter.d.ts +65 -0
  47. package/lib/typescript/src/web/SheetPresenter.d.ts.map +1 -0
  48. package/lib/typescript/src/web/dom.d.ts +40 -0
  49. package/lib/typescript/src/web/dom.d.ts.map +1 -0
  50. package/package.json +3 -2
  51. package/src/NitroModal.tsx +3 -4
  52. package/src/NitroModalView.native.tsx +4 -0
  53. package/src/NitroModalView.tsx +9 -4
  54. package/src/NitroModalView.web.tsx +138 -0
  55. package/src/web/AnimatedValue.ts +189 -0
  56. package/src/web/ModalConfig.ts +57 -0
  57. package/src/web/ModalController.ts +305 -0
  58. package/src/web/ModalPresenter.ts +298 -0
  59. package/src/web/PopupPresenter.ts +129 -0
  60. package/src/web/SheetPresenter.ts +582 -0
  61. package/src/web/dom.ts +154 -0
package/src/web/dom.ts ADDED
@@ -0,0 +1,154 @@
1
+ /// <reference lib="dom" />
2
+
3
+ export interface Size {
4
+ width: number;
5
+ height: number;
6
+ }
7
+
8
+ export interface Insets {
9
+ top: number;
10
+ right: number;
11
+ bottom: number;
12
+ left: number;
13
+ }
14
+
15
+ export const ZERO_INSETS: Insets = { top: 0, right: 0, bottom: 0, left: 0 };
16
+
17
+ export const canUseDOM =
18
+ typeof window !== 'undefined' && typeof document !== 'undefined';
19
+
20
+ /** Converts a color from `processColor` (0xAARRGGBB) to CSS, scaling its alpha by `opacity`. */
21
+ export function toCSSColor(argb: number, opacity = 1): string {
22
+ // As an unsigned 32-bit value, whatever the sign it was passed with.
23
+ const value = ((argb % 2 ** 32) + 2 ** 32) % 2 ** 32;
24
+ const channel = (shift: number) => Math.floor(value / 2 ** shift) % 256;
25
+ const alpha = (channel(24) / 255) * Math.min(Math.max(opacity, 0), 1);
26
+ return `rgba(${channel(16)}, ${channel(8)}, ${channel(0)}, ${Number(alpha.toFixed(3))})`;
27
+ }
28
+
29
+ let safeAreaProbe: HTMLElement | null = null;
30
+
31
+ /**
32
+ * `env(safe-area-inset-*)`, read through a hidden probe element. Non-zero on
33
+ * notched devices when the page opts in with `viewport-fit=cover`.
34
+ */
35
+ export function readSafeAreaInsets(): Insets {
36
+ if (!safeAreaProbe?.isConnected) {
37
+ if (!document.body) return ZERO_INSETS;
38
+ const probe = document.createElement('div');
39
+ probe.setAttribute('aria-hidden', 'true');
40
+ probe.style.cssText =
41
+ 'position:fixed;top:0;left:0;width:0;height:0;visibility:hidden;pointer-events:none;' +
42
+ 'padding:env(safe-area-inset-top,0px) env(safe-area-inset-right,0px) ' +
43
+ 'env(safe-area-inset-bottom,0px) env(safe-area-inset-left,0px);';
44
+ document.body.appendChild(probe);
45
+ safeAreaProbe = probe;
46
+ }
47
+ const style = getComputedStyle(safeAreaProbe);
48
+ return {
49
+ top: parseFloat(style.paddingTop) || 0,
50
+ right: parseFloat(style.paddingRight) || 0,
51
+ bottom: parseFloat(style.paddingBottom) || 0,
52
+ left: parseFloat(style.paddingLeft) || 0,
53
+ };
54
+ }
55
+
56
+ /**
57
+ * Height of the on-screen keyboard over a layout viewport `layoutHeight` tall.
58
+ * Mobile browsers keep the layout viewport and shrink the visual one.
59
+ */
60
+ export function readKeyboardHeight(layoutHeight: number): number {
61
+ const visual = window.visualViewport;
62
+ // Pinch zoom shrinks the visual viewport too.
63
+ if (!visual || Math.abs(visual.scale - 1) > 0.01) return 0;
64
+ const covered = layoutHeight - visual.offsetTop - visual.height;
65
+ return covered >= 1 ? Math.round(covered) : 0;
66
+ }
67
+
68
+ /** The size of the viewport before anything is on screen. */
69
+ export function estimateViewport(): Size {
70
+ return {
71
+ width: document.documentElement.clientWidth || window.innerWidth,
72
+ height: window.innerHeight,
73
+ };
74
+ }
75
+
76
+ function isVerticalScroller(node: Element): node is HTMLElement {
77
+ if (!(node instanceof HTMLElement) || node.scrollHeight <= node.clientHeight)
78
+ return false;
79
+ const { overflowY } = getComputedStyle(node);
80
+ return overflowY === 'auto' || overflowY === 'scroll';
81
+ }
82
+
83
+ /** The innermost element from `target` up to (not including) `root` that scrolls vertically. */
84
+ export function findVerticalScroller(
85
+ target: EventTarget | null,
86
+ root: Element
87
+ ): HTMLElement | null {
88
+ let node = target instanceof Element ? target : null;
89
+ for (; node && node !== root; node = node.parentElement) {
90
+ if (isVerticalScroller(node)) return node;
91
+ }
92
+ return null;
93
+ }
94
+
95
+ /** Whether a scroller between `target` and `root` can scroll further by `deltaY`. */
96
+ export function canScrollWithin(
97
+ target: EventTarget | null,
98
+ root: Element,
99
+ deltaY: number
100
+ ): boolean {
101
+ let node = target instanceof Element ? target : null;
102
+ for (; node && node !== root; node = node.parentElement) {
103
+ if (!isVerticalScroller(node)) continue;
104
+ const canScroll =
105
+ deltaY < 0
106
+ ? node.scrollTop > 0
107
+ : node.scrollTop + node.clientHeight < node.scrollHeight - 1;
108
+ if (canScroll) return true;
109
+ }
110
+ return false;
111
+ }
112
+
113
+ export function isTextInput(target: EventTarget | null): boolean {
114
+ return (
115
+ target instanceof Element &&
116
+ target.closest(
117
+ 'input, textarea, select, [contenteditable]:not([contenteditable="false"])'
118
+ ) != null
119
+ );
120
+ }
121
+
122
+ /** Swallows the click that follows a mouse drag, so the content under the pointer isn't pressed. */
123
+ export function suppressNextClick() {
124
+ const swallow = (event: Event) => {
125
+ event.stopPropagation();
126
+ event.preventDefault();
127
+ };
128
+ window.addEventListener('click', swallow, { capture: true, once: true });
129
+ // A click, if any, is dispatched in the same task as the pointerup.
130
+ setTimeout(() => {
131
+ window.removeEventListener('click', swallow, { capture: true });
132
+ }, 0);
133
+ }
134
+
135
+ export function prefersReducedMotion(): boolean {
136
+ return (
137
+ typeof window.matchMedia === 'function' &&
138
+ window.matchMedia('(prefers-reduced-motion: reduce)').matches
139
+ );
140
+ }
141
+
142
+ let clipValue: string | null = null;
143
+
144
+ /**
145
+ * `overflow: clip` rounds the corners without making the element a scroll
146
+ * container, which focusing an input could otherwise scroll.
147
+ */
148
+ export function clipOverflow(): string {
149
+ clipValue ??=
150
+ typeof CSS !== 'undefined' && CSS.supports('overflow', 'clip')
151
+ ? 'clip'
152
+ : 'hidden';
153
+ return clipValue;
154
+ }