@oxy.so/bloom 4.18.0 → 4.19.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.
- package/docs/adoption-matrix.mdx +5 -5
- package/docs/overlay.mdx +32 -0
- package/docs/portal.mdx +37 -0
- package/docs/rating.mdx +19 -2
- package/docs/select.mdx +10 -0
- package/lib/commonjs/bottom-sheet/BottomSheet.web.js +1 -0
- package/lib/commonjs/bottom-sheet/BottomSheet.web.js.map +1 -1
- package/lib/commonjs/chat-list/parts.js +1 -1
- package/lib/commonjs/chat-list/parts.js.map +1 -1
- package/lib/commonjs/chat-screen/ChatBackground.js +6 -6
- package/lib/commonjs/chat-screen/ChatBackground.js.map +1 -1
- package/lib/commonjs/dialog/Dialog.js +5 -0
- package/lib/commonjs/dialog/Dialog.js.map +1 -1
- package/lib/commonjs/dialog/Dialog.web.js +4 -1
- package/lib/commonjs/dialog/Dialog.web.js.map +1 -1
- package/lib/commonjs/index.js +7 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/index.web.js +7 -0
- package/lib/commonjs/index.web.js.map +1 -1
- package/lib/commonjs/location-puck/LocationPuck.js +1 -1
- package/lib/commonjs/location-puck/LocationPuck.js.map +1 -1
- package/lib/commonjs/mail-list/parts.js +1 -1
- package/lib/commonjs/mail-list/parts.js.map +1 -1
- package/lib/commonjs/media-card/parts.js +1 -1
- package/lib/commonjs/media-card/parts.js.map +1 -1
- package/lib/commonjs/overlay/Overlay.js +23 -4
- package/lib/commonjs/overlay/Overlay.js.map +1 -1
- package/lib/commonjs/overlay/OverlayInertBoundary.js +78 -0
- package/lib/commonjs/overlay/OverlayInertBoundary.js.map +1 -0
- package/lib/commonjs/overlay/index.js +14 -0
- package/lib/commonjs/overlay/index.js.map +1 -1
- package/lib/commonjs/overlay/modal-registry.js +104 -0
- package/lib/commonjs/overlay/modal-registry.js.map +1 -0
- package/lib/commonjs/overlay/use-hardware-back.js +32 -0
- package/lib/commonjs/overlay/use-hardware-back.js.map +1 -0
- package/lib/commonjs/overlay/use-modal-overlay-active.js +33 -0
- package/lib/commonjs/overlay/use-modal-overlay-active.js.map +1 -0
- package/lib/commonjs/portal/index.js +7 -0
- package/lib/commonjs/portal/index.js.map +1 -1
- package/lib/commonjs/portal/index.web.js +7 -0
- package/lib/commonjs/portal/index.web.js.map +1 -1
- package/lib/commonjs/rating/Rating.js +33 -2
- package/lib/commonjs/rating/Rating.js.map +1 -1
- package/lib/commonjs/search/Search.js +36 -3
- package/lib/commonjs/search/Search.js.map +1 -1
- package/lib/commonjs/settings-modal/SettingsModal.js +19 -12
- package/lib/commonjs/settings-modal/SettingsModal.js.map +1 -1
- package/lib/commonjs/teleport/PortalHost.js +1 -1
- package/lib/commonjs/zoomable-media-gallery/ZoomableMediaGallery.js +32 -12
- package/lib/commonjs/zoomable-media-gallery/ZoomableMediaGallery.js.map +1 -1
- package/lib/module/bottom-sheet/BottomSheet.web.js +1 -0
- package/lib/module/bottom-sheet/BottomSheet.web.js.map +1 -1
- package/lib/module/chat-list/parts.js +1 -1
- package/lib/module/chat-list/parts.js.map +1 -1
- package/lib/module/chat-screen/ChatBackground.js +6 -6
- package/lib/module/chat-screen/ChatBackground.js.map +1 -1
- package/lib/module/dialog/Dialog.js +5 -0
- package/lib/module/dialog/Dialog.js.map +1 -1
- package/lib/module/dialog/Dialog.web.js +4 -1
- package/lib/module/dialog/Dialog.web.js.map +1 -1
- package/lib/module/index.js +1 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/index.web.js +1 -1
- package/lib/module/index.web.js.map +1 -1
- package/lib/module/location-puck/LocationPuck.js +1 -1
- package/lib/module/location-puck/LocationPuck.js.map +1 -1
- package/lib/module/mail-list/parts.js +1 -1
- package/lib/module/mail-list/parts.js.map +1 -1
- package/lib/module/media-card/parts.js +1 -1
- package/lib/module/media-card/parts.js.map +1 -1
- package/lib/module/overlay/Overlay.js +23 -4
- package/lib/module/overlay/Overlay.js.map +1 -1
- package/lib/module/overlay/OverlayInertBoundary.js +73 -0
- package/lib/module/overlay/OverlayInertBoundary.js.map +1 -0
- package/lib/module/overlay/index.js +2 -0
- package/lib/module/overlay/index.js.map +1 -1
- package/lib/module/overlay/modal-registry.js +96 -0
- package/lib/module/overlay/modal-registry.js.map +1 -0
- package/lib/module/overlay/use-hardware-back.js +29 -0
- package/lib/module/overlay/use-hardware-back.js.map +1 -0
- package/lib/module/overlay/use-modal-overlay-active.js +28 -0
- package/lib/module/overlay/use-modal-overlay-active.js.map +1 -0
- package/lib/module/portal/index.js +4 -0
- package/lib/module/portal/index.js.map +1 -1
- package/lib/module/portal/index.web.js +4 -0
- package/lib/module/portal/index.web.js.map +1 -1
- package/lib/module/rating/Rating.js +32 -2
- package/lib/module/rating/Rating.js.map +1 -1
- package/lib/module/search/Search.js +37 -4
- package/lib/module/search/Search.js.map +1 -1
- package/lib/module/settings-modal/SettingsModal.js +20 -13
- package/lib/module/settings-modal/SettingsModal.js.map +1 -1
- package/lib/module/teleport/PortalHost.js +1 -1
- package/lib/module/zoomable-media-gallery/ZoomableMediaGallery.js +32 -12
- package/lib/module/zoomable-media-gallery/ZoomableMediaGallery.js.map +1 -1
- package/lib/typescript/commonjs/bottom-sheet/BottomSheet.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/dialog/Dialog.web.d.ts +2 -1
- package/lib/typescript/commonjs/dialog/Dialog.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/index.d.ts +1 -1
- package/lib/typescript/commonjs/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/index.web.d.ts +1 -1
- package/lib/typescript/commonjs/index.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/overlay/Overlay.d.ts +1 -1
- package/lib/typescript/commonjs/overlay/Overlay.d.ts.map +1 -1
- package/lib/typescript/commonjs/overlay/OverlayInertBoundary.d.ts +6 -0
- package/lib/typescript/commonjs/overlay/OverlayInertBoundary.d.ts.map +1 -0
- package/lib/typescript/commonjs/overlay/index.d.ts +3 -1
- package/lib/typescript/commonjs/overlay/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/overlay/modal-registry.d.ts +53 -0
- package/lib/typescript/commonjs/overlay/modal-registry.d.ts.map +1 -0
- package/lib/typescript/commonjs/overlay/types.d.ts +36 -0
- package/lib/typescript/commonjs/overlay/types.d.ts.map +1 -1
- package/lib/typescript/commonjs/overlay/use-hardware-back.d.ts +11 -0
- package/lib/typescript/commonjs/overlay/use-hardware-back.d.ts.map +1 -0
- package/lib/typescript/commonjs/overlay/use-modal-overlay-active.d.ts +7 -0
- package/lib/typescript/commonjs/overlay/use-modal-overlay-active.d.ts.map +1 -0
- package/lib/typescript/commonjs/portal/index.d.ts +2 -0
- package/lib/typescript/commonjs/portal/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/portal/index.web.d.ts +2 -0
- package/lib/typescript/commonjs/portal/index.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/rating/Rating.d.ts +9 -1
- package/lib/typescript/commonjs/rating/Rating.d.ts.map +1 -1
- package/lib/typescript/commonjs/rating/types.d.ts +9 -0
- package/lib/typescript/commonjs/rating/types.d.ts.map +1 -1
- package/lib/typescript/commonjs/search/Search.d.ts.map +1 -1
- package/lib/typescript/commonjs/select/types.d.ts +7 -0
- package/lib/typescript/commonjs/select/types.d.ts.map +1 -1
- package/lib/typescript/commonjs/settings-modal/SettingsModal.d.ts.map +1 -1
- package/lib/typescript/commonjs/teleport/PortalHost.d.ts +1 -1
- package/lib/typescript/commonjs/zoomable-media-gallery/ZoomableMediaGallery.d.ts.map +1 -1
- package/lib/typescript/module/bottom-sheet/BottomSheet.web.d.ts.map +1 -1
- package/lib/typescript/module/dialog/Dialog.web.d.ts +2 -1
- package/lib/typescript/module/dialog/Dialog.web.d.ts.map +1 -1
- package/lib/typescript/module/index.d.ts +1 -1
- package/lib/typescript/module/index.d.ts.map +1 -1
- package/lib/typescript/module/index.web.d.ts +1 -1
- package/lib/typescript/module/index.web.d.ts.map +1 -1
- package/lib/typescript/module/overlay/Overlay.d.ts +1 -1
- package/lib/typescript/module/overlay/Overlay.d.ts.map +1 -1
- package/lib/typescript/module/overlay/OverlayInertBoundary.d.ts +6 -0
- package/lib/typescript/module/overlay/OverlayInertBoundary.d.ts.map +1 -0
- package/lib/typescript/module/overlay/index.d.ts +3 -1
- package/lib/typescript/module/overlay/index.d.ts.map +1 -1
- package/lib/typescript/module/overlay/modal-registry.d.ts +53 -0
- package/lib/typescript/module/overlay/modal-registry.d.ts.map +1 -0
- package/lib/typescript/module/overlay/types.d.ts +36 -0
- package/lib/typescript/module/overlay/types.d.ts.map +1 -1
- package/lib/typescript/module/overlay/use-hardware-back.d.ts +11 -0
- package/lib/typescript/module/overlay/use-hardware-back.d.ts.map +1 -0
- package/lib/typescript/module/overlay/use-modal-overlay-active.d.ts +7 -0
- package/lib/typescript/module/overlay/use-modal-overlay-active.d.ts.map +1 -0
- package/lib/typescript/module/portal/index.d.ts +2 -0
- package/lib/typescript/module/portal/index.d.ts.map +1 -1
- package/lib/typescript/module/portal/index.web.d.ts +2 -0
- package/lib/typescript/module/portal/index.web.d.ts.map +1 -1
- package/lib/typescript/module/rating/Rating.d.ts +9 -1
- package/lib/typescript/module/rating/Rating.d.ts.map +1 -1
- package/lib/typescript/module/rating/types.d.ts +9 -0
- package/lib/typescript/module/rating/types.d.ts.map +1 -1
- package/lib/typescript/module/search/Search.d.ts.map +1 -1
- package/lib/typescript/module/select/types.d.ts +7 -0
- package/lib/typescript/module/select/types.d.ts.map +1 -1
- package/lib/typescript/module/settings-modal/SettingsModal.d.ts.map +1 -1
- package/lib/typescript/module/teleport/PortalHost.d.ts +1 -1
- package/lib/typescript/module/zoomable-media-gallery/ZoomableMediaGallery.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/bottom-sheet/BottomSheet.web.tsx +6 -2
- package/src/chat-list/parts.tsx +1 -1
- package/src/chat-screen/ChatBackground.tsx +6 -6
- package/src/dialog/Dialog.tsx +9 -1
- package/src/dialog/Dialog.web.tsx +7 -4
- package/src/index.ts +1 -0
- package/src/index.web.ts +1 -0
- package/src/location-puck/LocationPuck.tsx +1 -1
- package/src/mail-list/parts.tsx +1 -1
- package/src/media-card/parts.tsx +1 -1
- package/src/overlay/Overlay.tsx +36 -14
- package/src/overlay/OverlayInertBoundary.tsx +72 -0
- package/src/overlay/index.ts +3 -1
- package/src/overlay/modal-registry.ts +101 -0
- package/src/overlay/types.ts +37 -0
- package/src/overlay/use-hardware-back.ts +27 -0
- package/src/overlay/use-modal-overlay-active.ts +31 -0
- package/src/portal/index.ts +5 -0
- package/src/portal/index.web.ts +5 -0
- package/src/rating/Rating.tsx +37 -2
- package/src/rating/types.ts +9 -0
- package/src/search/Search.tsx +42 -4
- package/src/select/types.ts +7 -0
- package/src/settings-modal/SettingsModal.tsx +20 -15
- package/src/teleport/PortalHost.tsx +1 -1
- package/src/zoomable-media-gallery/ZoomableMediaGallery.tsx +33 -12
|
@@ -50,6 +50,8 @@ import { WEB_POSITION_FIXED } from "../styles/web-view-style.js";
|
|
|
50
50
|
import { StyledView } from "../styles/styled-primitives.js";
|
|
51
51
|
import { SurfaceLevelProvider } from "../styles/surface-levels.js";
|
|
52
52
|
import { layerForRank } from "./stack.js";
|
|
53
|
+
import { useHardwareBack } from "./use-hardware-back.js";
|
|
54
|
+
import { useModalOverlayRegistration } from "./use-modal-overlay-active.js";
|
|
53
55
|
import { useOverlayLayer } from "./use-overlay-layer.js";
|
|
54
56
|
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
55
57
|
const AnimatedBlurView = Animated.createAnimatedComponent(BlurView);
|
|
@@ -106,8 +108,14 @@ export function OverlayRoot({
|
|
|
106
108
|
className,
|
|
107
109
|
style,
|
|
108
110
|
testID,
|
|
109
|
-
zIndex
|
|
111
|
+
zIndex,
|
|
112
|
+
onRequestClose,
|
|
113
|
+
modal = false
|
|
110
114
|
}) {
|
|
115
|
+
// On the root rather than in each surface: every portaled surface mounts one
|
|
116
|
+
// inside its open guard, so this is the one place that cannot be forgotten.
|
|
117
|
+
// The gallery once forgot it and Android back finished the whole activity.
|
|
118
|
+
useHardwareBack(onRequestClose);
|
|
111
119
|
// Split into two components rather than branching on the hook: a pinned root
|
|
112
120
|
// must not CONSUME a rank either. The toast host is pinned and mounts for the
|
|
113
121
|
// whole life of the app, so holding a rank would keep the live set permanently
|
|
@@ -117,12 +125,14 @@ export function OverlayRoot({
|
|
|
117
125
|
className: className,
|
|
118
126
|
style: style,
|
|
119
127
|
testID: testID,
|
|
128
|
+
modal: modal,
|
|
120
129
|
children: children
|
|
121
130
|
}) : /*#__PURE__*/_jsx(PinnedOverlayRoot, {
|
|
122
131
|
zIndex: zIndex,
|
|
123
132
|
className: className,
|
|
124
133
|
style: style,
|
|
125
134
|
testID: testID,
|
|
135
|
+
modal: modal,
|
|
126
136
|
children: children
|
|
127
137
|
});
|
|
128
138
|
}
|
|
@@ -130,7 +140,8 @@ function StackedOverlayRoot({
|
|
|
130
140
|
children,
|
|
131
141
|
className,
|
|
132
142
|
style,
|
|
133
|
-
testID
|
|
143
|
+
testID,
|
|
144
|
+
modal
|
|
134
145
|
}) {
|
|
135
146
|
const layer = useOverlayLayer();
|
|
136
147
|
return /*#__PURE__*/_jsx(OverlayRootView, {
|
|
@@ -138,6 +149,7 @@ function StackedOverlayRoot({
|
|
|
138
149
|
className: className,
|
|
139
150
|
style: style,
|
|
140
151
|
testID: testID,
|
|
152
|
+
modal: modal,
|
|
141
153
|
children: children
|
|
142
154
|
});
|
|
143
155
|
}
|
|
@@ -146,7 +158,8 @@ function PinnedOverlayRoot({
|
|
|
146
158
|
className,
|
|
147
159
|
style,
|
|
148
160
|
testID,
|
|
149
|
-
zIndex
|
|
161
|
+
zIndex,
|
|
162
|
+
modal
|
|
150
163
|
}) {
|
|
151
164
|
// Outside the stack, so descendants must not read stack depths from it
|
|
152
165
|
// either — every slot is the pinned depth.
|
|
@@ -160,6 +173,7 @@ function PinnedOverlayRoot({
|
|
|
160
173
|
className: className,
|
|
161
174
|
style: style,
|
|
162
175
|
testID: testID,
|
|
176
|
+
modal: modal,
|
|
163
177
|
children: children
|
|
164
178
|
});
|
|
165
179
|
}
|
|
@@ -168,12 +182,17 @@ function OverlayRootView({
|
|
|
168
182
|
className,
|
|
169
183
|
style,
|
|
170
184
|
testID,
|
|
171
|
-
layer
|
|
185
|
+
layer,
|
|
186
|
+
modal
|
|
172
187
|
}) {
|
|
188
|
+
// Android cannot confine TalkBack from this side of the outlet — the app's
|
|
189
|
+
// `OverlayInertBoundary` hides the content once it hears a modal is open.
|
|
190
|
+
useModalOverlayRegistration(modal);
|
|
173
191
|
return /*#__PURE__*/_jsx(OverlayLayerContext.Provider, {
|
|
174
192
|
value: layer,
|
|
175
193
|
children: /*#__PURE__*/_jsx(StyledView, {
|
|
176
194
|
pointerEvents: "box-none",
|
|
195
|
+
accessibilityViewIsModal: modal && Platform.OS !== 'web' ? true : undefined,
|
|
177
196
|
className: className,
|
|
178
197
|
style: [styles.root, {
|
|
179
198
|
zIndex: layer.root
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["createContext","memo","useContext","useMemo","BlurView","useWindowedBlurTarget","Platform","Pressable","StyleSheet","View","Animated","useAnimatedStyle","WEB_POSITION_FIXED","StyledView","SurfaceLevelProvider","layerForRank","useOverlayLayer","jsx","_jsx","Fragment","_Fragment","jsxs","_jsxs","AnimatedBlurView","createAnimatedComponent","OverlayLayerContext","displayName","useOverlayLayerContext","BACKDROP_BLUR_INTENSITY","BACKDROP_DIM_OPACITY","OverlayRoot","children","className","style","testID","zIndex","undefined","StackedOverlayRoot","PinnedOverlayRoot","layer","OverlayRootView","root","backdrop","surface","Provider","value","pointerEvents","styles","level","AnimatedBackdropLayers","blurTarget","progress","blurIntensity","blurTint","dimColor","dimOpacity","staticOpacity","layerStyle","blurFade","opacity","dimFade","intensity","tint","blurMethod","absoluteFill","backgroundColor","StaticBackdropLayers","Backdrop","onPress","disabled","accessibilityLabel","inert","flat","flatten","styleOpacity","styleBackground","rootStyle","resolvedDimColor","layerProps","focusable","accessibilityRole","create","position","
|
|
1
|
+
{"version":3,"names":["createContext","memo","useContext","useMemo","BlurView","useWindowedBlurTarget","Platform","Pressable","StyleSheet","View","Animated","useAnimatedStyle","WEB_POSITION_FIXED","StyledView","SurfaceLevelProvider","layerForRank","useHardwareBack","useModalOverlayRegistration","useOverlayLayer","jsx","_jsx","Fragment","_Fragment","jsxs","_jsxs","AnimatedBlurView","createAnimatedComponent","OverlayLayerContext","displayName","useOverlayLayerContext","BACKDROP_BLUR_INTENSITY","BACKDROP_DIM_OPACITY","OverlayRoot","children","className","style","testID","zIndex","onRequestClose","modal","undefined","StackedOverlayRoot","PinnedOverlayRoot","layer","OverlayRootView","root","backdrop","surface","Provider","value","pointerEvents","accessibilityViewIsModal","OS","styles","level","AnimatedBackdropLayers","blurTarget","progress","blurIntensity","blurTint","dimColor","dimOpacity","staticOpacity","layerStyle","blurFade","opacity","dimFade","intensity","tint","blurMethod","absoluteFill","backgroundColor","StaticBackdropLayers","Backdrop","onPress","disabled","accessibilityLabel","inert","flat","flatten","styleOpacity","styleBackground","rootStyle","resolvedDimColor","layerProps","focusable","accessibilityRole","create","position","top","left","right","bottom"],"sourceRoot":"../../../src","sources":["overlay/Overlay.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* `OverlayInertBoundary` — the app content's half of a modal overlay.
|
|
5
|
+
*
|
|
6
|
+
* A modal Bloom surface renders at the portal outlet, which is the app
|
|
7
|
+
* content's SIBLING. It can mark itself modal (`accessibilityViewIsModal`, which
|
|
8
|
+
* iOS honours by hiding the siblings), but it cannot hide the app on Android:
|
|
9
|
+
* TalkBack only skips a subtree whose OWN root says
|
|
10
|
+
* `importantForAccessibility="no-hide-descendants"`, and that root belongs to
|
|
11
|
+
* the app. Without it, TalkBack walked from the settings modal straight into
|
|
12
|
+
* the Home feed behind it (OxyHQ/Mention#1126).
|
|
13
|
+
*
|
|
14
|
+
* The app wraps its content — everything that is NOT the `PortalOutlet` — in
|
|
15
|
+
* this boundary. While any modal overlay is open (`./modal-registry.ts`) it
|
|
16
|
+
* takes that content out of the accessibility tree:
|
|
17
|
+
*
|
|
18
|
+
* - Android: `importantForAccessibility="no-hide-descendants"`.
|
|
19
|
+
* - iOS: `accessibilityElementsHidden`, alongside the surface's own
|
|
20
|
+
* `accessibilityViewIsModal` (either alone is enough; both costs nothing).
|
|
21
|
+
* - Web: `inert`, which removes the subtree from the tab order AND the
|
|
22
|
+
* accessibility tree, plus `aria-hidden` for engines that lag on `inert`.
|
|
23
|
+
* The web portal root is a child of `document.body`, never of the app
|
|
24
|
+
* root, so the surface itself is untouched. Web dialogs set no focus trap
|
|
25
|
+
* of their own, so nothing is applied twice.
|
|
26
|
+
*
|
|
27
|
+
* Layout: on web the boundary is `display: contents`, so it generates no box
|
|
28
|
+
* and a document-scrolling page lays out exactly as without it. On native it is
|
|
29
|
+
* a `flex: 1` view — the content it wraps already fills the root there — and it
|
|
30
|
+
* is never collapsed, because flattening a layout-only view would drop the
|
|
31
|
+
* accessibility prop the moment it is needed.
|
|
32
|
+
*/
|
|
33
|
+
import { Platform, StyleSheet, View } from 'react-native';
|
|
34
|
+
import { useModalOverlayActive } from "./use-modal-overlay-active.js";
|
|
35
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
36
|
+
export function OverlayInertBoundary({
|
|
37
|
+
children,
|
|
38
|
+
style,
|
|
39
|
+
testID
|
|
40
|
+
}) {
|
|
41
|
+
const active = useModalOverlayActive();
|
|
42
|
+
if (Platform.OS === 'web') {
|
|
43
|
+
return /*#__PURE__*/_jsx(View, {
|
|
44
|
+
testID: testID,
|
|
45
|
+
style: [styles.web, style],
|
|
46
|
+
"aria-hidden": active ? true : undefined,
|
|
47
|
+
...(active ? {
|
|
48
|
+
inert: true
|
|
49
|
+
} : null),
|
|
50
|
+
children: children
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
return /*#__PURE__*/_jsx(View, {
|
|
54
|
+
testID: testID,
|
|
55
|
+
collapsable: false,
|
|
56
|
+
style: [styles.native, style],
|
|
57
|
+
importantForAccessibility: active ? 'no-hide-descendants' : 'auto',
|
|
58
|
+
accessibilityElementsHidden: active,
|
|
59
|
+
children: children
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
OverlayInertBoundary.displayName = 'OverlayInertBoundary';
|
|
63
|
+
const styles = StyleSheet.create({
|
|
64
|
+
native: {
|
|
65
|
+
flex: 1
|
|
66
|
+
},
|
|
67
|
+
// No box of its own on web: the wrapped content lays out against the
|
|
68
|
+
// boundary's parent, flex tree or document scroll alike.
|
|
69
|
+
web: {
|
|
70
|
+
display: 'contents'
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
//# sourceMappingURL=OverlayInertBoundary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["Platform","StyleSheet","View","useModalOverlayActive","jsx","_jsx","OverlayInertBoundary","children","style","testID","active","OS","styles","web","undefined","inert","collapsable","native","importantForAccessibility","accessibilityElementsHidden","displayName","create","flex","display"],"sourceRoot":"../../../src","sources":["overlay/OverlayInertBoundary.tsx"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASA,QAAQ,EAAEC,UAAU,EAAEC,IAAI,QAAQ,cAAc;AAGzD,SAASC,qBAAqB,QAAQ,+BAA4B;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAEnE,OAAO,SAASC,oBAAoBA,CAAC;EAAEC,QAAQ;EAAEC,KAAK;EAAEC;AAAkC,CAAC,EAAE;EAC3F,MAAMC,MAAM,GAAGP,qBAAqB,CAAC,CAAC;EAEtC,IAAIH,QAAQ,CAACW,EAAE,KAAK,KAAK,EAAE;IACzB,oBACEN,IAAA,CAACH,IAAI;MACHO,MAAM,EAAEA,MAAO;MACfD,KAAK,EAAE,CAACI,MAAM,CAACC,GAAG,EAAEL,KAAK,CAAE;MAC3B,eAAaE,MAAM,GAAG,IAAI,GAAGI,SAAU;MAAA,IAClCJ,MAAM,GAAG;QAAEK,KAAK,EAAE;MAAK,CAAC,GAAG,IAAI;MAAAR,QAAA,EAEnCA;IAAQ,CACL,CAAC;EAEX;EAEA,oBACEF,IAAA,CAACH,IAAI;IACHO,MAAM,EAAEA,MAAO;IACfO,WAAW,EAAE,KAAM;IACnBR,KAAK,EAAE,CAACI,MAAM,CAACK,MAAM,EAAET,KAAK,CAAE;IAC9BU,yBAAyB,EAAER,MAAM,GAAG,qBAAqB,GAAG,MAAO;IACnES,2BAA2B,EAAET,MAAO;IAAAH,QAAA,EAEnCA;EAAQ,CACL,CAAC;AAEX;AAEAD,oBAAoB,CAACc,WAAW,GAAG,sBAAsB;AAEzD,MAAMR,MAAM,GAAGX,UAAU,CAACoB,MAAM,CAAC;EAC/BJ,MAAM,EAAE;IAAEK,IAAI,EAAE;EAAE,CAAC;EACnB;EACA;EACAT,GAAG,EAAE;IAAEU,OAAO,EAAE;EAAW;AAC7B,CAAC,CAAC","ignoreList":[]}
|
|
@@ -2,5 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
export { layerForRank, OVERLAY_STACK_BAND, OVERLAY_STACK_BASE, OVERLAY_STACK_MAX_RANK, TOAST_LAYER_Z } from "./stack.js";
|
|
4
4
|
export { useOverlayLayer } from "./use-overlay-layer.js";
|
|
5
|
+
export { useModalOverlayActive } from "./use-modal-overlay-active.js";
|
|
6
|
+
export { OverlayInertBoundary } from "./OverlayInertBoundary.js";
|
|
5
7
|
export { useOverlayLayerContext, BACKDROP_BLUR_INTENSITY, BACKDROP_DIM_OPACITY, OverlayRoot, Backdrop } from "./Overlay.js";
|
|
6
8
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["layerForRank","OVERLAY_STACK_BAND","OVERLAY_STACK_BASE","OVERLAY_STACK_MAX_RANK","TOAST_LAYER_Z","useOverlayLayer","useOverlayLayerContext","BACKDROP_BLUR_INTENSITY","BACKDROP_DIM_OPACITY","OverlayRoot","Backdrop"],"sourceRoot":"../../../src","sources":["overlay/index.ts"],"mappings":";;AAAA,SACEA,YAAY,EACZC,kBAAkB,EAClBC,kBAAkB,EAClBC,sBAAsB,EACtBC,aAAa,QAER,YAAS;AAChB,SAASC,eAAe,QAAQ,wBAAqB;AACrD,SACEC,sBAAsB,EACtBC,uBAAuB,EACvBC,oBAAoB,EACpBC,WAAW,EACXC,QAAQ,QACH,cAAW","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["layerForRank","OVERLAY_STACK_BAND","OVERLAY_STACK_BASE","OVERLAY_STACK_MAX_RANK","TOAST_LAYER_Z","useOverlayLayer","useModalOverlayActive","OverlayInertBoundary","useOverlayLayerContext","BACKDROP_BLUR_INTENSITY","BACKDROP_DIM_OPACITY","OverlayRoot","Backdrop"],"sourceRoot":"../../../src","sources":["overlay/index.ts"],"mappings":";;AAAA,SACEA,YAAY,EACZC,kBAAkB,EAClBC,kBAAkB,EAClBC,sBAAsB,EACtBC,aAAa,QAER,YAAS;AAChB,SAASC,eAAe,QAAQ,wBAAqB;AACrD,SAASC,qBAAqB,QAAQ,+BAA4B;AAClE,SAASC,oBAAoB,QAAQ,2BAAwB;AAC7D,SACEC,sBAAsB,EACtBC,uBAAuB,EACvBC,oBAAoB,EACpBC,WAAW,EACXC,QAAQ,QACH,cAAW","ignoreList":[]}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Which MODAL overlays are open right now, as a subscribable store.
|
|
5
|
+
*
|
|
6
|
+
* ## Why this exists
|
|
7
|
+
*
|
|
8
|
+
* A modal surface has to keep a screen reader inside it. iOS can do that from
|
|
9
|
+
* the overlay's side: `accessibilityViewIsModal` on the `OverlayRoot` hides its
|
|
10
|
+
* siblings, and at the native portal outlet the app content IS a sibling.
|
|
11
|
+
* Android has no equivalent. TalkBack keeps walking into the app behind the
|
|
12
|
+
* open surface (OxyHQ/Mention#1126: the Home feed stayed reachable under the
|
|
13
|
+
* settings modal), and the only switch that stops it —
|
|
14
|
+
* `importantForAccessibility="no-hide-descendants"` — has to sit ON the app
|
|
15
|
+
* content. A portaled surface cannot reach that view: the outlet renders it as
|
|
16
|
+
* the content's sibling, not its ancestor.
|
|
17
|
+
*
|
|
18
|
+
* So the knowledge travels the other way. Every `OverlayRoot` with `modal`
|
|
19
|
+
* registers here while it is mounted, and `OverlayInertBoundary` — which the
|
|
20
|
+
* app wraps around its own content — subscribes and hides what it wraps while
|
|
21
|
+
* anything modal is open.
|
|
22
|
+
*
|
|
23
|
+
* Non-modal overlays (menus, popovers, tooltips, toasts, the shell drawers)
|
|
24
|
+
* never register: the content under an anchored menu must stay reachable.
|
|
25
|
+
*
|
|
26
|
+
* Tokens rather than a counter so StrictMode's mount/unmount/remount and an
|
|
27
|
+
* unmatched release can never drift the count: a token is either in the set or
|
|
28
|
+
* not.
|
|
29
|
+
*/
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* `globalThis`-anchored for the same reason as `./stack.ts`: the surfaces that
|
|
33
|
+
* register (`./dialog`, `./settings-modal`, …) and the boundary the app mounts
|
|
34
|
+
* (`./portal`) are imported through different subpaths, and a bundler can
|
|
35
|
+
* resolve those through different export conditions. Two physical copies of
|
|
36
|
+
* this module would each keep their own set, and the boundary would never hear
|
|
37
|
+
* about the surfaces.
|
|
38
|
+
*/
|
|
39
|
+
function registry() {
|
|
40
|
+
globalThis.__oxy_so_bloom_modal_overlays__ ??= {
|
|
41
|
+
live: new Set(),
|
|
42
|
+
listeners: new Set()
|
|
43
|
+
};
|
|
44
|
+
return globalThis.__oxy_so_bloom_modal_overlays__;
|
|
45
|
+
}
|
|
46
|
+
function notify(reg) {
|
|
47
|
+
for (const listener of Array.from(reg.listeners)) listener();
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Mark a modal overlay as open. Returns its release. Called from an effect in
|
|
52
|
+
* `OverlayRoot`, which React balances even under StrictMode.
|
|
53
|
+
*/
|
|
54
|
+
export function registerModalOverlay(token) {
|
|
55
|
+
const reg = registry();
|
|
56
|
+
const wasActive = reg.live.size > 0;
|
|
57
|
+
reg.live.add(token);
|
|
58
|
+
if (!wasActive) notify(reg);
|
|
59
|
+
return () => {
|
|
60
|
+
const current = registry();
|
|
61
|
+
if (!current.live.delete(token)) return;
|
|
62
|
+
if (current.live.size === 0) notify(current);
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/** Whether any modal overlay is open. */
|
|
67
|
+
export function hasActiveModalOverlays() {
|
|
68
|
+
return registry().live.size > 0;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/** How many modal overlays are open. Exported for tests. */
|
|
72
|
+
export function activeModalOverlayCount() {
|
|
73
|
+
return registry().live.size;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Subscribe to changes in `hasActiveModalOverlays()`. Listeners fire only when
|
|
78
|
+
* the answer flips — a second modal opening over a first changes nothing for
|
|
79
|
+
* the content underneath.
|
|
80
|
+
*/
|
|
81
|
+
export function subscribeModalOverlays(listener) {
|
|
82
|
+
const reg = registry();
|
|
83
|
+
reg.listeners.add(listener);
|
|
84
|
+
return () => {
|
|
85
|
+
registry().listeners.delete(listener);
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/** Test seam — drops all open modals, notifying current subscribers. */
|
|
90
|
+
export function resetModalOverlays() {
|
|
91
|
+
const reg = registry();
|
|
92
|
+
const wasActive = reg.live.size > 0;
|
|
93
|
+
reg.live.clear();
|
|
94
|
+
if (wasActive) notify(reg);
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=modal-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["registry","globalThis","__oxy_so_bloom_modal_overlays__","live","Set","listeners","notify","reg","listener","Array","from","registerModalOverlay","token","wasActive","size","add","current","delete","hasActiveModalOverlays","activeModalOverlayCount","subscribeModalOverlays","resetModalOverlays","clear"],"sourceRoot":"../../../src","sources":["overlay/modal-registry.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAYA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASA,QAAQA,CAAA,EAAkB;EACjCC,UAAU,CAACC,+BAA+B,KAAK;IAAEC,IAAI,EAAE,IAAIC,GAAG,CAAC,CAAC;IAAEC,SAAS,EAAE,IAAID,GAAG,CAAC;EAAE,CAAC;EACxF,OAAOH,UAAU,CAACC,+BAA+B;AACnD;AAEA,SAASI,MAAMA,CAACC,GAAkB,EAAQ;EACxC,KAAK,MAAMC,QAAQ,IAAIC,KAAK,CAACC,IAAI,CAACH,GAAG,CAACF,SAAS,CAAC,EAAEG,QAAQ,CAAC,CAAC;AAC9D;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASG,oBAAoBA,CAACC,KAAa,EAAc;EAC9D,MAAML,GAAG,GAAGP,QAAQ,CAAC,CAAC;EACtB,MAAMa,SAAS,GAAGN,GAAG,CAACJ,IAAI,CAACW,IAAI,GAAG,CAAC;EACnCP,GAAG,CAACJ,IAAI,CAACY,GAAG,CAACH,KAAK,CAAC;EACnB,IAAI,CAACC,SAAS,EAAEP,MAAM,CAACC,GAAG,CAAC;EAC3B,OAAO,MAAM;IACX,MAAMS,OAAO,GAAGhB,QAAQ,CAAC,CAAC;IAC1B,IAAI,CAACgB,OAAO,CAACb,IAAI,CAACc,MAAM,CAACL,KAAK,CAAC,EAAE;IACjC,IAAII,OAAO,CAACb,IAAI,CAACW,IAAI,KAAK,CAAC,EAAER,MAAM,CAACU,OAAO,CAAC;EAC9C,CAAC;AACH;;AAEA;AACA,OAAO,SAASE,sBAAsBA,CAAA,EAAY;EAChD,OAAOlB,QAAQ,CAAC,CAAC,CAACG,IAAI,CAACW,IAAI,GAAG,CAAC;AACjC;;AAEA;AACA,OAAO,SAASK,uBAAuBA,CAAA,EAAW;EAChD,OAAOnB,QAAQ,CAAC,CAAC,CAACG,IAAI,CAACW,IAAI;AAC7B;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASM,sBAAsBA,CAACZ,QAAoB,EAAc;EACvE,MAAMD,GAAG,GAAGP,QAAQ,CAAC,CAAC;EACtBO,GAAG,CAACF,SAAS,CAACU,GAAG,CAACP,QAAQ,CAAC;EAC3B,OAAO,MAAM;IACXR,QAAQ,CAAC,CAAC,CAACK,SAAS,CAACY,MAAM,CAACT,QAAQ,CAAC;EACvC,CAAC;AACH;;AAEA;AACA,OAAO,SAASa,kBAAkBA,CAAA,EAAS;EACzC,MAAMd,GAAG,GAAGP,QAAQ,CAAC,CAAC;EACtB,MAAMa,SAAS,GAAGN,GAAG,CAACJ,IAAI,CAACW,IAAI,GAAG,CAAC;EACnCP,GAAG,CAACJ,IAAI,CAACmB,KAAK,CAAC,CAAC;EAChB,IAAIT,SAAS,EAAEP,MAAM,CAACC,GAAG,CAAC;AAC5B","ignoreList":[]}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { useEffect, useRef } from 'react';
|
|
4
|
+
import { BackHandler, Platform } from 'react-native';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Consume Android's hardware back for as long as the caller is mounted with a
|
|
8
|
+
* handler, calling the CURRENT `onBack` (read through a ref, so a new closure
|
|
9
|
+
* each render does not re-register and lose its place in the LIFO order).
|
|
10
|
+
*
|
|
11
|
+
* `BackHandler` runs the newest listener first, so surfaces opened later close
|
|
12
|
+
* first. No-op off Android and when `BackHandler` is absent (web bundles, and
|
|
13
|
+
* some test environments' react-native mocks).
|
|
14
|
+
*/
|
|
15
|
+
export function useHardwareBack(onBack) {
|
|
16
|
+
const onBackRef = useRef(onBack);
|
|
17
|
+
onBackRef.current = onBack;
|
|
18
|
+
const active = onBack !== undefined;
|
|
19
|
+
useEffect(() => {
|
|
20
|
+
if (!active || Platform.OS !== 'android') return;
|
|
21
|
+
if (typeof BackHandler?.addEventListener !== 'function') return;
|
|
22
|
+
const subscription = BackHandler.addEventListener('hardwareBackPress', () => {
|
|
23
|
+
onBackRef.current?.();
|
|
24
|
+
return true;
|
|
25
|
+
});
|
|
26
|
+
return () => subscription.remove();
|
|
27
|
+
}, [active]);
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=use-hardware-back.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["useEffect","useRef","BackHandler","Platform","useHardwareBack","onBack","onBackRef","current","active","undefined","OS","addEventListener","subscription","remove"],"sourceRoot":"../../../src","sources":["overlay/use-hardware-back.ts"],"mappings":";;AAAA,SAASA,SAAS,EAAEC,MAAM,QAAQ,OAAO;AACzC,SAASC,WAAW,EAAEC,QAAQ,QAAQ,cAAc;;AAEpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,eAAeA,CAACC,MAAgC,EAAQ;EACtE,MAAMC,SAAS,GAAGL,MAAM,CAACI,MAAM,CAAC;EAChCC,SAAS,CAACC,OAAO,GAAGF,MAAM;EAC1B,MAAMG,MAAM,GAAGH,MAAM,KAAKI,SAAS;EAEnCT,SAAS,CAAC,MAAM;IACd,IAAI,CAACQ,MAAM,IAAIL,QAAQ,CAACO,EAAE,KAAK,SAAS,EAAE;IAC1C,IAAI,OAAOR,WAAW,EAAES,gBAAgB,KAAK,UAAU,EAAE;IACzD,MAAMC,YAAY,GAAGV,WAAW,CAACS,gBAAgB,CAAC,mBAAmB,EAAE,MAAM;MAC3EL,SAAS,CAACC,OAAO,GAAG,CAAC;MACrB,OAAO,IAAI;IACb,CAAC,CAAC;IACF,OAAO,MAAMK,YAAY,CAACC,MAAM,CAAC,CAAC;EACpC,CAAC,EAAE,CAACL,MAAM,CAAC,CAAC;AACd","ignoreList":[]}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* `useModalOverlayActive` — whether any modal Bloom overlay is open.
|
|
5
|
+
*
|
|
6
|
+
* Re-renders only when the answer flips. See `./modal-registry.ts` for who
|
|
7
|
+
* registers and why.
|
|
8
|
+
*/
|
|
9
|
+
import { useEffect, useSyncExternalStore } from 'react';
|
|
10
|
+
import { hasActiveModalOverlays, registerModalOverlay, subscribeModalOverlays } from "./modal-registry.js";
|
|
11
|
+
|
|
12
|
+
/** `false` on the server: nothing is open before hydration. */
|
|
13
|
+
const serverSnapshot = () => false;
|
|
14
|
+
export function useModalOverlayActive() {
|
|
15
|
+
return useSyncExternalStore(subscribeModalOverlays, hasActiveModalOverlays, serverSnapshot);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Register as an open modal overlay while mounted and `modal` is true. Used by
|
|
20
|
+
* `OverlayRoot`; exported only within the family.
|
|
21
|
+
*/
|
|
22
|
+
export function useModalOverlayRegistration(modal) {
|
|
23
|
+
useEffect(() => {
|
|
24
|
+
if (!modal) return undefined;
|
|
25
|
+
return registerModalOverlay({});
|
|
26
|
+
}, [modal]);
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=use-modal-overlay-active.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["useEffect","useSyncExternalStore","hasActiveModalOverlays","registerModalOverlay","subscribeModalOverlays","serverSnapshot","useModalOverlayActive","useModalOverlayRegistration","modal","undefined"],"sourceRoot":"../../../src","sources":["overlay/use-modal-overlay-active.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA,SAASA,SAAS,EAAEC,oBAAoB,QAAQ,OAAO;AAEvD,SACEC,sBAAsB,EACtBC,oBAAoB,EACpBC,sBAAsB,QACjB,qBAAkB;;AAEzB;AACA,MAAMC,cAAc,GAAGA,CAAA,KAAM,KAAK;AAElC,OAAO,SAASC,qBAAqBA,CAAA,EAAY;EAC/C,OAAOL,oBAAoB,CAACG,sBAAsB,EAAEF,sBAAsB,EAAEG,cAAc,CAAC;AAC7F;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASE,2BAA2BA,CAACC,KAAc,EAAQ;EAChER,SAAS,CAAC,MAAM;IACd,IAAI,CAACQ,KAAK,EAAE,OAAOC,SAAS;IAC5B,OAAON,oBAAoB,CAAC,CAAC,CAAC,CAAC;EACjC,CAAC,EAAE,CAACK,KAAK,CAAC,CAAC;AACb","ignoreList":[]}
|
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
export { PortalProvider, PortalOutlet, Portal } from './Portal';
|
|
4
|
+
// The app-content half of a modal overlay: wrap everything EXCEPT the
|
|
5
|
+
// `PortalOutlet` in it. Lives in `overlay/` (it reads the modal registry) and is
|
|
6
|
+
// offered here because this is the subpath the app root already imports.
|
|
7
|
+
export { OverlayInertBoundary } from "../overlay/OverlayInertBoundary.js";
|
|
4
8
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["PortalProvider","PortalOutlet","Portal"],"sourceRoot":"../../../src","sources":["portal/index.ts"],"mappings":";;AAAA,SACEA,cAAc,EACdC,YAAY,EACZC,MAAM,QACD,UAAU","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["PortalProvider","PortalOutlet","Portal","OverlayInertBoundary"],"sourceRoot":"../../../src","sources":["portal/index.ts"],"mappings":";;AAAA,SACEA,cAAc,EACdC,YAAY,EACZC,MAAM,QACD,UAAU;AACjB;AACA;AACA;AACA,SAASC,oBAAoB,QAAQ,oCAAiC","ignoreList":[]}
|
|
@@ -6,4 +6,8 @@
|
|
|
6
6
|
// changing that barrel or the set of web-forked subpaths.
|
|
7
7
|
|
|
8
8
|
export { PortalProvider, PortalOutlet, Portal } from "./Portal.web.js";
|
|
9
|
+
// The app-content half of a modal overlay: wrap everything EXCEPT the
|
|
10
|
+
// `PortalOutlet` in it. Lives in `overlay/` (it reads the modal registry) and is
|
|
11
|
+
// offered here because this is the subpath the app root already imports.
|
|
12
|
+
export { OverlayInertBoundary } from "../overlay/OverlayInertBoundary.js";
|
|
9
13
|
//# sourceMappingURL=index.web.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["PortalProvider","PortalOutlet","Portal"],"sourceRoot":"../../../src","sources":["portal/index.web.ts"],"mappings":";;AAAA;AACA;AACA;AACA;;AAEA,SACEA,cAAc,EACdC,YAAY,EACZC,MAAM,QACD,iBAAc","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["PortalProvider","PortalOutlet","Portal","OverlayInertBoundary"],"sourceRoot":"../../../src","sources":["portal/index.web.ts"],"mappings":";;AAAA;AACA;AACA;AACA;;AAEA,SACEA,cAAc,EACdC,YAAY,EACZC,MAAM,QACD,iBAAc;AACrB;AACA;AACA;AACA,SAASC,oBAAoB,QAAQ,oCAAiC","ignoreList":[]}
|
|
@@ -25,7 +25,8 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
25
25
|
* `variant="stars"` draws five stars before the value instead of one, 2px
|
|
26
26
|
* apart, each filled to its share of the value: the unfilled star in
|
|
27
27
|
* `emptyStarColor` (border), and over it the filled star clipped to the
|
|
28
|
-
* fraction. The
|
|
28
|
+
* fraction. The fill comes from `fillValue` when given, else from `value`
|
|
29
|
+
* (parsed by `parseRatingValue` when it is a localised string). The clip is anchored with a LOGICAL inset (`insetInlineStart`) so a
|
|
29
30
|
* right-to-left row fills from the right — the root carries
|
|
30
31
|
* `useDirectionProps()` for react-native-web to resolve it.
|
|
31
32
|
*
|
|
@@ -58,11 +59,39 @@ const IS_WEB = Platform.OS === 'web';
|
|
|
58
59
|
const STAR_COUNT = 5;
|
|
59
60
|
const STAR_GAP = 2;
|
|
60
61
|
|
|
62
|
+
/**
|
|
63
|
+
* Bidi isolates and marks (U+2066–U+2069 LRI/RLI/FSI/PDI, U+200E/U+200F
|
|
64
|
+
* LRM/RLM, U+061C ALM) a localised string is wrapped in. None of them are
|
|
65
|
+
* part of the number.
|
|
66
|
+
*/
|
|
67
|
+
const FORMAT_CHARACTERS = /[\u2066-\u2069\u200E\u200F\u061C]/g;
|
|
68
|
+
/** Arabic-Indic (U+0660) and extended Arabic-Indic (U+06F0) digit zeros. */
|
|
69
|
+
const ARABIC_ZERO = 0x0660;
|
|
70
|
+
const EXTENDED_ARABIC_ZERO = 0x06f0;
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* The number a drawn rating value stands for, for the `stars` fill: a number
|
|
74
|
+
* is itself; a string is read after dropping bidi/format characters, with a
|
|
75
|
+
* comma or Arabic decimal separator (U+066B) accepted as the decimal point and
|
|
76
|
+
* Arabic-Indic digits accepted — so "4,5" wrapped in FSI…PDI is 4.5. Otherwise it is
|
|
77
|
+
* `Number()`'s reading, so anything unreadable is `NaN` (no fill).
|
|
78
|
+
*/
|
|
79
|
+
export function parseRatingValue(value) {
|
|
80
|
+
if (typeof value === 'number') return value;
|
|
81
|
+
const text = value.replace(FORMAT_CHARACTERS, '').trim().replace(/[\u0660-\u0669]/g, d => String(d.charCodeAt(0) - ARABIC_ZERO)).replace(/[\u06F0-\u06F9]/g, d => String(d.charCodeAt(0) - EXTENDED_ARABIC_ZERO)).replace(/[,\u066B]/, '.');
|
|
82
|
+
return Number(text);
|
|
83
|
+
}
|
|
84
|
+
|
|
61
85
|
/** How much of star `index` (0-based) a rating fills, `0..1`. */
|
|
62
86
|
export function starFill(rating, index) {
|
|
63
87
|
if (!Number.isFinite(rating)) return 0;
|
|
64
88
|
return Math.min(1, Math.max(0, rating - index));
|
|
65
89
|
}
|
|
90
|
+
|
|
91
|
+
/** A fill on the five-star scale, clamped to `0..5`; `NaN` stays `NaN` (no fill). */
|
|
92
|
+
function clampRating(rating) {
|
|
93
|
+
return Math.min(STAR_COUNT, Math.max(0, rating));
|
|
94
|
+
}
|
|
66
95
|
function StarRow({
|
|
67
96
|
rating,
|
|
68
97
|
size,
|
|
@@ -123,6 +152,7 @@ function RatingComponent({
|
|
|
123
152
|
starColor,
|
|
124
153
|
countColor,
|
|
125
154
|
emptyStarColor,
|
|
155
|
+
fillValue,
|
|
126
156
|
accessibilityLabel,
|
|
127
157
|
style,
|
|
128
158
|
testID
|
|
@@ -152,7 +182,7 @@ function RatingComponent({
|
|
|
152
182
|
gap: 4
|
|
153
183
|
}, style],
|
|
154
184
|
children: [variant === 'stars' && rated ? /*#__PURE__*/_jsx(StarRow, {
|
|
155
|
-
rating:
|
|
185
|
+
rating: clampRating(fillValue ?? parseRatingValue(value)),
|
|
156
186
|
size: config.star,
|
|
157
187
|
fill: starPaint,
|
|
158
188
|
empty: emptyStarColor ?? theme.colors.border,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","memo","Platform","View","RiStarFill","useDirectionProps","useTheme","Text","jsx","_jsx","jsxs","_jsxs","SIZE_CONFIG","small","star","value","count","medium","formatRatingValue","Number","isInteger","toFixed","String","Math","round","IS_WEB","OS","STAR_COUNT","STAR_GAP","starFill","rating","index","isFinite","min","max","StarRow","size","fill","empty","testID","style","flexDirection","alignItems","gap","children","Array","from","length","_","share","width","height","undefined","position","top","bottom","insetInlineStart","overflow","RatingComponent","countStyle","reviewsLabel","newLabel","variant","color","starColor","countColor","emptyStarColor","accessibilityLabel","theme","directionProps","textColor","colors","
|
|
1
|
+
{"version":3,"names":["React","memo","Platform","View","RiStarFill","useDirectionProps","useTheme","Text","jsx","_jsx","jsxs","_jsxs","SIZE_CONFIG","small","star","value","count","medium","formatRatingValue","Number","isInteger","toFixed","String","Math","round","IS_WEB","OS","STAR_COUNT","STAR_GAP","FORMAT_CHARACTERS","ARABIC_ZERO","EXTENDED_ARABIC_ZERO","parseRatingValue","text","replace","trim","d","charCodeAt","starFill","rating","index","isFinite","min","max","clampRating","StarRow","size","fill","empty","testID","style","flexDirection","alignItems","gap","children","Array","from","length","_","share","width","height","undefined","position","top","bottom","insetInlineStart","overflow","RatingComponent","countStyle","reviewsLabel","newLabel","variant","color","starColor","countColor","emptyStarColor","fillValue","accessibilityLabel","theme","directionProps","textColor","colors","starPaint","countPaint","textSecondary","config","rated","shownValue","hasCount","countText","name","accessible","role","border","fontVariant","Rating","displayName"],"sourceRoot":"../../../src","sources":["rating/Rating.tsx"],"mappings":";;AAAA,OAAOA,KAAK,IAAIC,IAAI,QAAQ,OAAO;AACnC,SAASC,QAAQ,EAAEC,IAAI,QAAQ,cAAc;AAE7C,SAASC,UAAU,QAAQ,8BAA2B;AACtD,SAASC,iBAAiB,QAAQ,wBAAqB;AACvD,SAASC,QAAQ,QAAQ,uBAAoB;AAC7C,SAASC,IAAI,QAAQ,wBAAe;AAAC,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAIrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,MAAMC,WAAmG,GAAG;EAC1GC,KAAK,EAAE;IAAEC,IAAI,EAAE,EAAE;IAAEC,KAAK,EAAE,iBAAiB;IAAEC,KAAK,EAAE;EAAiB,CAAC;EACtEC,MAAM,EAAE;IAAEH,IAAI,EAAE,EAAE;IAAEC,KAAK,EAAE,eAAe;IAAEC,KAAK,EAAE;EAAe;AACpE,CAAC;;AAED;AACA,OAAO,SAASE,iBAAiBA,CAACH,KAAsB,EAAU;EAChE,IAAI,OAAOA,KAAK,KAAK,QAAQ,EAAE,OAAOA,KAAK;EAC3C,IAAII,MAAM,CAACC,SAAS,CAACL,KAAK,CAAC,EAAE,OAAOA,KAAK,CAACM,OAAO,CAAC,CAAC,CAAC;EACpD,OAAOC,MAAM,CAACC,IAAI,CAACC,KAAK,CAACT,KAAK,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;AAC9C;AAEA,MAAMU,MAAM,GAAGvB,QAAQ,CAACwB,EAAE,KAAK,KAAK;;AAEpC;AACA,MAAMC,UAAU,GAAG,CAAC;AACpB,MAAMC,QAAQ,GAAG,CAAC;;AAElB;AACA;AACA;AACA;AACA;AACA,MAAMC,iBAAiB,GAAG,oCAAoC;AAC9D;AACA,MAAMC,WAAW,GAAG,MAAM;AAC1B,MAAMC,oBAAoB,GAAG,MAAM;;AAEnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,gBAAgBA,CAACjB,KAAsB,EAAU;EAC/D,IAAI,OAAOA,KAAK,KAAK,QAAQ,EAAE,OAAOA,KAAK;EAC3C,MAAMkB,IAAI,GAAGlB,KAAK,CACfmB,OAAO,CAACL,iBAAiB,EAAE,EAAE,CAAC,CAC9BM,IAAI,CAAC,CAAC,CACND,OAAO,CAAC,kBAAkB,EAAGE,CAAC,IAAKd,MAAM,CAACc,CAAC,CAACC,UAAU,CAAC,CAAC,CAAC,GAAGP,WAAW,CAAC,CAAC,CACzEI,OAAO,CAAC,kBAAkB,EAAGE,CAAC,IAAKd,MAAM,CAACc,CAAC,CAACC,UAAU,CAAC,CAAC,CAAC,GAAGN,oBAAoB,CAAC,CAAC,CAClFG,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC;EAC5B,OAAOf,MAAM,CAACc,IAAI,CAAC;AACrB;;AAEA;AACA,OAAO,SAASK,QAAQA,CAACC,MAAc,EAAEC,KAAa,EAAU;EAC9D,IAAI,CAACrB,MAAM,CAACsB,QAAQ,CAACF,MAAM,CAAC,EAAE,OAAO,CAAC;EACtC,OAAOhB,IAAI,CAACmB,GAAG,CAAC,CAAC,EAAEnB,IAAI,CAACoB,GAAG,CAAC,CAAC,EAAEJ,MAAM,GAAGC,KAAK,CAAC,CAAC;AACjD;;AAEA;AACA,SAASI,WAAWA,CAACL,MAAc,EAAU;EAC3C,OAAOhB,IAAI,CAACmB,GAAG,CAACf,UAAU,EAAEJ,IAAI,CAACoB,GAAG,CAAC,CAAC,EAAEJ,MAAM,CAAC,CAAC;AAClD;AAEA,SAASM,OAAOA,CAAC;EACfN,MAAM;EACNO,IAAI;EACJC,IAAI;EACJC,KAAK;EACLC;AAOF,CAAC,EAAE;EACD,oBACExC,IAAA,CAACN,IAAI;IAAC+C,KAAK,EAAE;MAAEC,aAAa,EAAE,KAAK;MAAEC,UAAU,EAAE,QAAQ;MAAEC,GAAG,EAAEzB;IAAS,CAAE;IAACqB,MAAM,EAAEA,MAAO;IAAAK,QAAA,EACxFC,KAAK,CAACC,IAAI,CAAC;MAAEC,MAAM,EAAE9B;IAAW,CAAC,EAAE,CAAC+B,CAAC,EAAElB,KAAK,KAAK;MAChD,MAAMmB,KAAK,GAAGrB,QAAQ,CAACC,MAAM,EAAEC,KAAK,CAAC;MACrC,oBACE7B,KAAA,CAACR,IAAI;QAAa+C,KAAK,EAAE;UAAEU,KAAK,EAAEd,IAAI;UAAEe,MAAM,EAAEf;QAAK,CAAE;QAAAQ,QAAA,gBACrD7C,IAAA,CAACL,UAAU;UAACwD,KAAK,EAAEd,IAAK;UAACe,MAAM,EAAEf,IAAK;UAACC,IAAI,EAAEC;QAAM,CAAE,CAAC,EACrDW,KAAK,GAAG,CAAC,gBACRlD,IAAA,CAACN,IAAI;UACH8C,MAAM,EAAEA,MAAM,GAAG,GAAGA,MAAM,IAAIT,KAAK,EAAE,GAAGsB,SAAU;UAClDZ,KAAK,EAAE;YACLa,QAAQ,EAAE,UAAU;YACpBC,GAAG,EAAE,CAAC;YACNC,MAAM,EAAE,CAAC;YACTC,gBAAgB,EAAE,CAAC;YACnBN,KAAK,EAAEd,IAAI,GAAGa,KAAK;YACnBQ,QAAQ,EAAE,QAAQ;YAClBf,UAAU,EAAE;UACd,CAAE;UAAAE,QAAA,eAEF7C,IAAA,CAACL,UAAU;YAACwD,KAAK,EAAEd,IAAK;YAACe,MAAM,EAAEf,IAAK;YAACC,IAAI,EAAEA;UAAK,CAAE;QAAC,CACjD,CAAC,GACL,IAAI;MAAA,GAjBCP,KAkBL,CAAC;IAEX,CAAC;EAAC,CACE,CAAC;AAEX;AAEA,SAAS4B,eAAeA,CAAC;EACvBrD,KAAK;EACLC,KAAK;EACLqD,UAAU,GAAG,aAAa;EAC1BC,YAAY,GAAG,SAAS;EACxBC,QAAQ,GAAG,KAAK;EAChBzB,IAAI,GAAG,QAAQ;EACf0B,OAAO,GAAG,SAAS;EACnBC,KAAK;EACLC,SAAS;EACTC,UAAU;EACVC,cAAc;EACdC,SAAS;EACTC,kBAAkB;EAClB5B,KAAK;EACLD;AACW,CAAC,EAAE;EACd,MAAM8B,KAAK,GAAGzE,QAAQ,CAAC,CAAC;EACxB,MAAM0E,cAAc,GAAG3E,iBAAiB,CAAC,CAAC;EAC1C,MAAM4E,SAAS,GAAGR,KAAK,IAAIM,KAAK,CAACG,MAAM,CAACjD,IAAI;EAC5C,MAAMkD,SAAS,GAAGT,SAAS,IAAIO,SAAS;EACxC,MAAMG,UAAU,GAAGT,UAAU,IAAIF,KAAK,IAAIM,KAAK,CAACG,MAAM,CAACG,aAAa;EACpE,MAAMC,MAAM,GAAG1E,WAAW,CAACkC,IAAI,CAAC;EAChC,MAAMyC,KAAK,GAAGxE,KAAK,IAAI,IAAI,IAAIA,KAAK,KAAK,EAAE;EAC3C,MAAMyE,UAAU,GAAGD,KAAK,GAAGrE,iBAAiB,CAACH,KAAK,CAAC,GAAGwD,QAAQ;EAC9D,MAAMkB,QAAQ,GAAGF,KAAK,IAAIvE,KAAK,IAAI,IAAI,IAAIA,KAAK,KAAK,EAAE;EACvD,MAAM0E,SAAS,GAAGD,QAAQ,GACtBpB,UAAU,KAAK,SAAS,GACtB,KAAKrD,KAAK,IAAIsD,YAAY,EAAE,GAC5B,IAAItD,KAAK,GAAG,GACd,IAAI;EACR,MAAM2E,IAAI,GACRb,kBAAkB,KACjBS,KAAK,GACF,SAASC,UAAU,YAAYC,QAAQ,GAAG,KAAKzE,KAAK,IAAIsD,YAAY,EAAE,GAAG,EAAE,EAAE,GAC7EC,QAAQ,CAAC;EAEf,oBACE5D,KAAA,CAACR,IAAI;IAAA,GACC6E,cAAc;IAClB/B,MAAM,EAAEA,MAAO;IACf2C,UAAU;IACVd,kBAAkB,EAAEa,IAAK;IAAA,IACpBlE,MAAM,GAAG;MAAEoE,IAAI,EAAE;IAAe,CAAC,GAAG,IAAI;IAC7C3C,KAAK,EAAE,CAAC;MAAEC,aAAa,EAAE,KAAK;MAAEC,UAAU,EAAE,QAAQ;MAAEC,GAAG,EAAE;IAAE,CAAC,EAAEH,KAAK,CAAE;IAAAI,QAAA,GAEtEkB,OAAO,KAAK,OAAO,IAAIe,KAAK,gBAC3B9E,IAAA,CAACoC,OAAO;MACNN,MAAM,EAAEK,WAAW,CAACiC,SAAS,IAAI7C,gBAAgB,CAACjB,KAAK,CAAC,CAAE;MAC1D+B,IAAI,EAAEwC,MAAM,CAACxE,IAAK;MAClBiC,IAAI,EAAEoC,SAAU;MAChBnC,KAAK,EAAE4B,cAAc,IAAIG,KAAK,CAACG,MAAM,CAACY,MAAO;MAC7C7C,MAAM,EAAEA,MAAM,GAAG,GAAGA,MAAM,QAAQ,GAAGa;IAAU,CAChD,CAAC,GACAU,OAAO,KAAK,OAAO,GAAG,IAAI,gBAC5B/D,IAAA,CAACL,UAAU;MAACwD,KAAK,EAAE0B,MAAM,CAACxE,IAAK;MAAC+C,MAAM,EAAEyB,MAAM,CAACxE,IAAK;MAACiC,IAAI,EAAEoC;IAAU,CAAE,CACxE,eACD1E,IAAA,CAACF,IAAI;MAACiE,OAAO,EAAEc,MAAM,CAACvE,KAAM;MAACmC,KAAK,EAAE;QAAEuB,KAAK,EAAEQ,SAAS;QAAEc,WAAW,EAAE,CAAC,cAAc;MAAE,CAAE;MAAAzC,QAAA,EACrFkC;IAAU,CACP,CAAC,EACNE,SAAS,IAAI,IAAI,iBAChBjF,IAAA,CAACF,IAAI;MAACiE,OAAO,EAAEc,MAAM,CAACtE,KAAM;MAACkC,KAAK,EAAE;QAAEuB,KAAK,EAAEW;MAAW,CAAE;MAAA9B,QAAA,EACvDoC;IAAS,CACN,CACP;EAAA,CACG,CAAC;AAEX;AAEA,OAAO,MAAMM,MAAM,gBAAG/F,IAAI,CAACmE,eAAe,CAAC;AAC3C4B,MAAM,CAACC,WAAW,GAAG,QAAQ","ignoreList":[]}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import { forwardRef } from 'react';
|
|
3
|
+
import { forwardRef, useCallback, useMemo, useRef } from 'react';
|
|
4
4
|
import { Platform, View } from 'react-native';
|
|
5
|
+
import { mergeRefs } from "../hooks/merge-refs.js";
|
|
5
6
|
import { useTheme } from "../theme/use-theme.js";
|
|
6
7
|
import { atoms as a } from "../styles/index.js";
|
|
7
8
|
import { borderRadius } from "../styles/tokens.js";
|
|
@@ -14,10 +15,41 @@ export const Search = /*#__PURE__*/forwardRef(function Search({
|
|
|
14
15
|
value,
|
|
15
16
|
label = 'Search',
|
|
16
17
|
onClearText,
|
|
18
|
+
onFocus,
|
|
19
|
+
onPressIn,
|
|
17
20
|
...rest
|
|
18
21
|
}, ref) {
|
|
19
22
|
const theme = useTheme();
|
|
20
23
|
const showClear = value != null && value.length > 0;
|
|
24
|
+
|
|
25
|
+
// Select-on-focus, done here rather than through RN's `selectTextOnFocus`.
|
|
26
|
+
// On Android that prop does not select on focus: it arms a one-shot flag and
|
|
27
|
+
// calls `selectAll()` on the input's NEXT layout while focused. An
|
|
28
|
+
// autofocused search lays out nothing after focusing until the first
|
|
29
|
+
// keystroke mounts the clear button and pads the input for it — and that
|
|
30
|
+
// layout selects everything, so the SECOND keystroke replaced the query.
|
|
31
|
+
// Typing "mention" in one burst left "on" (OxyHQ/Mention#1126). Now a
|
|
32
|
+
// press-driven focus selects the current query once, immediately, and a
|
|
33
|
+
// programmatic focus (autoFocus, `ref.focus()`) selects nothing. Web never
|
|
34
|
+
// selected on focus and still does not.
|
|
35
|
+
const inputRef = useRef(null);
|
|
36
|
+
const refs = useMemo(() => mergeRefs([inputRef, ref]), [ref]);
|
|
37
|
+
const pressedRef = useRef(false);
|
|
38
|
+
const valueRef = useRef(value);
|
|
39
|
+
valueRef.current = value;
|
|
40
|
+
const handlePressIn = useCallback(event => {
|
|
41
|
+
pressedRef.current = true;
|
|
42
|
+
onPressIn?.(event);
|
|
43
|
+
}, [onPressIn]);
|
|
44
|
+
const handleFocus = useCallback(event => {
|
|
45
|
+
onFocus?.(event);
|
|
46
|
+
const pressed = pressedRef.current;
|
|
47
|
+
pressedRef.current = false;
|
|
48
|
+
const length = valueRef.current?.length ?? 0;
|
|
49
|
+
if (pressed && Platform.OS !== 'web' && length > 0) {
|
|
50
|
+
inputRef.current?.setSelection(0, length);
|
|
51
|
+
}
|
|
52
|
+
}, [onFocus]);
|
|
21
53
|
return /*#__PURE__*/_jsxs(View, {
|
|
22
54
|
style: [a.w_full, a.relative],
|
|
23
55
|
children: [/*#__PURE__*/_jsxs(TextField, {
|
|
@@ -25,13 +57,12 @@ export const Search = /*#__PURE__*/forwardRef(function Search({
|
|
|
25
57
|
children: [/*#__PURE__*/_jsx(TextFieldIcon, {
|
|
26
58
|
icon: MagnifyingGlassIcon
|
|
27
59
|
}), /*#__PURE__*/_jsx(TextFieldInput, {
|
|
28
|
-
inputRef:
|
|
60
|
+
inputRef: refs,
|
|
29
61
|
label: label,
|
|
30
62
|
value: value,
|
|
31
63
|
placeholder: label,
|
|
32
64
|
returnKeyType: "search",
|
|
33
65
|
keyboardAppearance: theme.mode === 'light' ? 'light' : 'dark',
|
|
34
|
-
selectTextOnFocus: Platform.OS !== 'web',
|
|
35
66
|
autoFocus: false,
|
|
36
67
|
accessibilityRole: "search",
|
|
37
68
|
autoCorrect: false,
|
|
@@ -40,7 +71,9 @@ export const Search = /*#__PURE__*/forwardRef(function Search({
|
|
|
40
71
|
style: showClear ? {
|
|
41
72
|
paddingRight: 24
|
|
42
73
|
} : undefined,
|
|
43
|
-
...rest
|
|
74
|
+
...rest,
|
|
75
|
+
onPressIn: handlePressIn,
|
|
76
|
+
onFocus: handleFocus
|
|
44
77
|
})]
|
|
45
78
|
}), showClear && /*#__PURE__*/_jsx(View, {
|
|
46
79
|
style: [a.absolute, a.z_20, a.my_auto, a.inset_0, a.justify_center, a.pr_sm, {
|