react-native-terra-ui 0.9.0 → 0.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/lib/module/components/screen/Screen.js +87 -27
  3. package/lib/module/components/screen/Screen.js.map +1 -1
  4. package/lib/module/components/screen/ScreenContext.js +5 -1
  5. package/lib/module/components/screen/ScreenContext.js.map +1 -1
  6. package/lib/module/components/screen/ScreenList.js +11 -3
  7. package/lib/module/components/screen/ScreenList.js.map +1 -1
  8. package/lib/module/components/screen/ScreenScrollView.js +11 -3
  9. package/lib/module/components/screen/ScreenScrollView.js.map +1 -1
  10. package/lib/module/components/screen/hooks/use-nested-container-warning.js +39 -0
  11. package/lib/module/components/screen/hooks/use-nested-container-warning.js.map +1 -0
  12. package/lib/module/components/screen/parts/ScreenFrame.js +1 -0
  13. package/lib/module/components/screen/parts/ScreenFrame.js.map +1 -1
  14. package/lib/typescript/src/components/screen/Screen.d.ts +6 -0
  15. package/lib/typescript/src/components/screen/Screen.d.ts.map +1 -1
  16. package/lib/typescript/src/components/screen/ScreenContext.d.ts +27 -1
  17. package/lib/typescript/src/components/screen/ScreenContext.d.ts.map +1 -1
  18. package/lib/typescript/src/components/screen/ScreenList.d.ts.map +1 -1
  19. package/lib/typescript/src/components/screen/ScreenScrollView.d.ts.map +1 -1
  20. package/lib/typescript/src/components/screen/hooks/use-nested-container-warning.d.ts +24 -0
  21. package/lib/typescript/src/components/screen/hooks/use-nested-container-warning.d.ts.map +1 -0
  22. package/lib/typescript/src/components/screen/parts/ScreenFrame.d.ts.map +1 -1
  23. package/package.json +1 -1
  24. package/src/components/screen/Screen.tsx +81 -17
  25. package/src/components/screen/ScreenContext.tsx +32 -0
  26. package/src/components/screen/ScreenList.tsx +9 -1
  27. package/src/components/screen/ScreenScrollView.tsx +9 -1
  28. package/src/components/screen/hooks/use-nested-container-warning.ts +40 -0
  29. package/src/components/screen/parts/ScreenFrame.tsx +8 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.9.1](https://github.com/earthlin9/react-native-terra-ui/compare/v0.9.0...v0.9.1) (2026-09-07)
4
+
5
+ ### Bug Fixes
6
+
7
+ * **ui:** [screen] hand vertical insets to UIKit on header-less screens ([4f1a95c](https://github.com/earthlin9/react-native-terra-ui/commit/4f1a95c31bfbcf6d8424095b3961ee28ea1743ab))
8
+ * **ui:** [screen] require both vertical edges before handing insets over ([f135e01](https://github.com/earthlin9/react-native-terra-ui/commit/f135e010c372b0812171bd6b9771503acf094f47))
9
+
3
10
  ## [0.9.0](https://github.com/earthlin9/react-native-terra-ui/compare/v0.8.1...v0.9.0) (2026-09-07)
4
11
 
5
12
  ### ⚠ BREAKING CHANGES
@@ -2,7 +2,8 @@
2
2
 
3
3
  import { View } from "react-native-unistyles/components/native/View";
4
4
  import { Children, Fragment, forwardRef, isValidElement, useMemo } from "react";
5
- import { StyleSheet, useUnistyles } from "react-native-unistyles";
5
+ import { Platform } from "react-native";
6
+ import { useUnistyles } from "react-native-unistyles";
6
7
  import { resolveThemeColor } from "../../utils/resolve-theme-color.js";
7
8
  import { PortalProvider } from "../portal/index.js";
8
9
  import { ScreenFrame } from "./parts/ScreenFrame.js";
@@ -105,43 +106,108 @@ const ScreenBase = /*#__PURE__*/forwardRef(function Screen({
105
106
  const hasHeader = useMemo(() => hasScreenHeader(children), [children]);
106
107
  const resolvedMargins = contentPadding ?? margins ?? (hasMargins === false ? "none" : "all");
107
108
  const edges = useMemo(() => resolveSafeAreaEdges(safeArea), [safeArea]);
109
+ const hasVerticalScrollContainer = useMemo(() => hasScrollContainerOwningBottom(children), [children]);
108
110
  /*
109
- The bottom edge goes to the scroll container when there is one to take it.
111
+ A screen with no `Screen.Header` wears UIKit's own navigation bar, and only
112
+ UIKit can inset a scroll view for one.
113
+ A native large title changes height on every frame of its collapse, and the
114
+ bar is a sibling view this screen cannot measure — so an inset computed in JS
115
+ is always a frame late and always the wrong size. Worse, UIKit will not
116
+ collapse the title at all unless the scroll view it finds fills the screen:
117
+ padding the top edge on the frame starts that view 168pt down (measured on an
118
+ iPhone 17, expanded title), and the title then stays full size while rows
119
+ scroll up and overprint it.
120
+ So the frame keeps no vertical edge on such a screen, the container turns
121
+ UIKit's `contentInsetAdjustmentBehavior` back on, and UIKit pays the top and
122
+ the bottom both — which is why `ScreenBottomInset` stands down here rather
123
+ than paying that edge a second time. iOS only: this is UIKit's mechanism, and
124
+ Android has no navigation bar to track.
125
+ Both vertical edges have to be protected to hand them over, because UIKit
126
+ adjusts for both or for neither. A policy that asks for one and not the other
127
+ cannot be expressed this way, so it keeps the ordinary treatment below and
128
+ is honoured exactly as written — at the cost of the title collapse, which is
129
+ the better trade: an edge list is an explicit instruction, and silently
130
+ insetting an edge the caller excluded would be the worse surprise.
131
+ */
132
+ const platformInsetsEligible = Platform.OS === "ios" && !hasHeader && edges.top && edges.bottom;
133
+ const platformAdjustsInsets = platformInsetsEligible && hasVerticalScrollContainer;
134
+ /*
135
+ Otherwise the bottom edge goes to the scroll container when there is one to
136
+ take it.
110
137
  Applied to the frame, the bottom inset shrinks the scroll viewport, so content
111
138
  stops above a tab bar rather than passing beneath it — and on iOS that inset
112
139
  includes the bar itself, which UIKit folds into a tab screen's safe area. The
113
140
  container reaches the same resting position by padding the end of its content
114
141
  instead, which is how the platform's own content-inset adjustment behaves.
115
142
  */
116
- const contentOwnsBottomInset = useMemo(() => edges.bottom && hasScrollContainerOwningBottom(children), [edges.bottom, children]);
117
- const frameEdges = useMemo(() => contentOwnsBottomInset ? {
143
+ const contentOwnsBottomInset = !platformAdjustsInsets && edges.bottom && hasVerticalScrollContainer;
144
+ const frameEdges = useMemo(() => platformAdjustsInsets ? {
118
145
  ...edges,
146
+ top: false,
119
147
  bottom: false
120
- } : edges, [contentOwnsBottomInset, edges]);
148
+ } : contentOwnsBottomInset ? {
149
+ ...edges,
150
+ bottom: false
151
+ } : edges, [platformAdjustsInsets, contentOwnsBottomInset, edges]);
121
152
  const {
122
153
  theme
123
154
  } = useUnistyles();
124
155
  const resolvedBackground = resolveThemeColor(background, theme) ?? theme.color["surface.canvas"];
125
- return /*#__PURE__*/_jsx(View, {
126
- ref: ref,
127
- style: [styles.container(resolvedBackground), style],
128
- ...rest,
129
- children: /*#__PURE__*/_jsx(ScreenScrollProvider, {
130
- background: resolvedBackground,
131
- contentPadding: resolvedMargins,
132
- safeArea: safeArea,
133
- contentOwnsBottomInset: contentOwnsBottomInset,
134
- hasHeader: hasHeader,
135
- children: /*#__PURE__*/_jsx(ScreenHeaderAppearanceProvider, {
136
- children: /*#__PURE__*/_jsx(ScreenFrame, {
137
- edges: frameEdges,
138
- children: /*#__PURE__*/_jsx(PortalProvider, {
139
- children: children
156
+ /*
157
+ A plain object, not a Unistyles stylesheet, and the background belongs in it
158
+ rather than arriving later.
159
+ Unistyles applies a dynamic function's style after mount. UIKit resolves a
160
+ screen's scroll view once, while it is being presented, and a scroll area
161
+ that was not yet the size of the screen at that moment never drives the
162
+ navigation bar afterwards — the large title stays expanded for the rest of
163
+ the screen's life.
164
+ */
165
+ const rootStyle = useMemo(() => ({
166
+ flex: 1,
167
+ backgroundColor: resolvedBackground
168
+ }), [resolvedBackground]);
169
+ return (
170
+ /*#__PURE__*/
171
+ /*
172
+ `collapsable={false}`, because a background colour alone is the worst of
173
+ both worlds here.
174
+ Fabric decides two things separately: whether a view is mounted at all, and
175
+ whether it *keeps* its children. A `View` with only layout styles is
176
+ dropped and its children are re-parented to its own parent — harmless. Give
177
+ it a background and it is mounted, but it still does not form a stacking
178
+ context, so the children are mounted *beside* it instead of inside it. The
179
+ screen's view then begins with an empty full-screen view, and UIKit — which
180
+ finds the scroll view by walking first subviews down from the view
181
+ controller (`RNSScrollViewFinder` mirrors the same walk) — reaches that dead
182
+ end and finds nothing. Measured on an iPhone 17: no content-inset
183
+ adjustment and no large-title collapse at all.
184
+ `collapsable={false}` forms the stacking context, so the frame, the safe
185
+ areas, and the scroll container stay in one unbroken first-subview chain.
186
+ */
187
+ _jsx(View, {
188
+ collapsable: false,
189
+ ref: ref,
190
+ style: [rootStyle, style],
191
+ ...rest,
192
+ children: /*#__PURE__*/_jsx(ScreenScrollProvider, {
193
+ background: resolvedBackground,
194
+ contentPadding: resolvedMargins,
195
+ safeArea: safeArea,
196
+ contentOwnsBottomInset: contentOwnsBottomInset,
197
+ platformAdjustsInsets: platformAdjustsInsets,
198
+ platformInsetsEligible: platformInsetsEligible,
199
+ hasHeader: hasHeader,
200
+ children: /*#__PURE__*/_jsx(ScreenHeaderAppearanceProvider, {
201
+ children: /*#__PURE__*/_jsx(ScreenFrame, {
202
+ edges: frameEdges,
203
+ children: /*#__PURE__*/_jsx(PortalProvider, {
204
+ children: children
205
+ })
140
206
  })
141
207
  })
142
208
  })
143
209
  })
144
- });
210
+ );
145
211
  });
146
212
  ScreenBase.Header = ScreenHeader;
147
213
  ScreenBase.ScrollView = ScreenScrollView;
@@ -167,10 +233,4 @@ ScreenBase.List = ScreenList;
167
233
  * ```
168
234
  */
169
235
  export const Screen = ScreenBase;
170
- const styles = StyleSheet.create(() => ({
171
- container: backgroundColor => ({
172
- flex: 1,
173
- backgroundColor
174
- })
175
- }));
176
236
  //# sourceMappingURL=Screen.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["Children","Fragment","forwardRef","isValidElement","useMemo","StyleSheet","useUnistyles","resolveThemeColor","PortalProvider","ScreenFrame","ScreenHeaderAppearanceProvider","ScreenHeaderAppearanceSlot","ScreenScrollProvider","ScreenFlatList","ScreenList","ScreenScrollView","resolveSafeAreaEdges","jsx","_jsx","ScreenHeader","children","as","rest","Component","displayName","ownsBottomInset","child","props","horizontal","type","hasScrollContainerOwningBottom","found","forEach","hasScreenHeader","ScreenBase","Screen","background","contentPadding","safeArea","margins","hasMargins","inTabView","_inTabView","style","ref","hasHeader","resolvedMargins","edges","contentOwnsBottomInset","bottom","frameEdges","theme","resolvedBackground","color","View","styles","container","Header","ScrollView","FlatList","List","create","backgroundColor","flex"],"sourceRoot":"../../../../src","sources":["components/screen/Screen.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["Children","Fragment","forwardRef","isValidElement","useMemo","Platform","useUnistyles","resolveThemeColor","PortalProvider","ScreenFrame","ScreenHeaderAppearanceProvider","ScreenHeaderAppearanceSlot","ScreenScrollProvider","ScreenFlatList","ScreenList","ScreenScrollView","resolveSafeAreaEdges","jsx","_jsx","ScreenHeader","children","as","rest","Component","displayName","ownsBottomInset","child","props","horizontal","type","hasScrollContainerOwningBottom","found","forEach","hasScreenHeader","ScreenBase","Screen","background","contentPadding","safeArea","margins","hasMargins","inTabView","_inTabView","style","ref","hasHeader","resolvedMargins","edges","hasVerticalScrollContainer","platformInsetsEligible","OS","top","bottom","platformAdjustsInsets","contentOwnsBottomInset","frameEdges","theme","resolvedBackground","color","rootStyle","flex","backgroundColor","View","collapsable","Header","ScrollView","FlatList","List"],"sourceRoot":"../../../../src","sources":["components/screen/Screen.tsx"],"mappings":"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","ignoreList":[]}
@@ -24,6 +24,8 @@ export function ScreenScrollProvider({
24
24
  contentPadding = "all",
25
25
  safeArea = "auto",
26
26
  contentOwnsBottomInset = false,
27
+ platformAdjustsInsets = false,
28
+ platformInsetsEligible = false,
27
29
  hasHeader = false
28
30
  }) {
29
31
  const scrollY = useSharedValue(0);
@@ -45,6 +47,8 @@ export function ScreenScrollProvider({
45
47
  contentPadding,
46
48
  safeArea,
47
49
  contentOwnsBottomInset,
50
+ platformAdjustsInsets,
51
+ platformInsetsEligible,
48
52
  margins: contentPadding,
49
53
  hasHeader,
50
54
  scrollY,
@@ -53,7 +57,7 @@ export function ScreenScrollProvider({
53
57
  setHeaderCollapseHeight,
54
58
  scrollRef,
55
59
  scrollHandler
56
- }), [background, contentPadding, safeArea, contentOwnsBottomInset, hasHeader, scrollY, headerCollapseHeight, headerSnapOffsets, setHeaderCollapseHeight, scrollRef, scrollHandler]);
60
+ }), [background, contentPadding, safeArea, contentOwnsBottomInset, platformAdjustsInsets, platformInsetsEligible, hasHeader, scrollY, headerCollapseHeight, headerSnapOffsets, setHeaderCollapseHeight, scrollRef, scrollHandler]);
57
61
  return /*#__PURE__*/_jsx(ScreenContext.Provider, {
58
62
  value: value,
59
63
  children: children
@@ -1 +1 @@
1
- {"version":3,"names":["createContext","useCallback","useContext","useMemo","useState","useAnimatedRef","useAnimatedScrollHandler","useSharedValue","jsx","_jsx","SCREEN_HEADER_PORTAL_HOST","ScreenContext","ScreenScrollProvider","background","children","contentPadding","safeArea","contentOwnsBottomInset","hasHeader","scrollY","headerCollapseHeight","headerSnapOffsets","setHeaderSnapOffsets","scrollRef","setHeaderCollapseHeight","height","rounded","Math","round","value","undefined","scrollHandler","onScroll","event","contentOffset","y","margins","Provider","useScreen","context","Error"],"sourceRoot":"../../../../src","sources":["components/screen/ScreenContext.tsx"],"mappings":";;AAAA,SAASA,aAAa,EAAkBC,WAAW,EAAEC,UAAU,EAAEC,OAAO,EAAEC,QAAQ,QAAQ,OAAO;AAEjG,SAIEC,cAAc,EACdC,wBAAwB,EACxBC,cAAc,QACT,yBAAyB;;AAIhC;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAGA;AACA,OAAO,MAAMC,yBAAyB,GAAG,eAAe;;AAExD;;AAmDA,OAAO,MAAMC,aAAa,gBAAGX,aAAa,CAA4B,IAAI,CAAC;;AAE3E;;AAeA;AACA;AACA;AACA;AACA,OAAO,SAASY,oBAAoBA,CAAC;EACnCC,UAAU,GAAG,aAAa;EAC1BC,QAAQ;EACRC,cAAc,GAAG,KAAK;EACtBC,QAAQ,GAAG,MAAM;EACjBC,sBAAsB,GAAG,KAAK;EAC9BC,SAAS,GAAG;AACa,CAAC,EAAE;EAC5B,MAAMC,OAAO,GAAGZ,cAAc,CAAC,CAAC,CAAC;EACjC,MAAMa,oBAAoB,GAAGb,cAAc,CAAC,CAAC,CAAC;EAC9C,MAAM,CAACc,iBAAiB,EAAEC,oBAAoB,CAAC,GAAGlB,QAAQ,CAAW,CAAC;EACtE,MAAMmB,SAAS,GAAGlB,cAAc,CAAsB,CAAC;EAEvD,MAAMmB,uBAAuB,GAAGvB,WAAW,CACxCwB,MAAc,IAAK;IAClB,MAAMC,OAAO,GAAGC,IAAI,CAACC,KAAK,CAACH,MAAM,CAAC;IAClCL,oBAAoB,CAACS,KAAK,GAAGH,OAAO;IACpCJ,oBAAoB,CAACI,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,EAAEA,OAAO,CAAC,GAAGI,SAAS,CAAC;EAC9D,CAAC,EACD,CAACV,oBAAoB,CACvB,CAAC;EAED,MAAMW,aAAa,GAAGzB,wBAAwB,CAAC;IAC7C0B,QAAQ,EAAGC,KAAK,IAAK;MACnBd,OAAO,CAACU,KAAK,GAAGI,KAAK,CAACC,aAAa,CAACC,CAAC;IACvC;EACF,CAAC,CAAC;EAEF,MAAMN,KAAK,GAAG1B,OAAO,CACnB,OAAO;IACLU,UAAU;IACVE,cAAc;IACdC,QAAQ;IACRC,sBAAsB;IACtBmB,OAAO,EAAErB,cAAc;IACvBG,SAAS;IACTC,OAAO;IACPC,oBAAoB;IACpBC,iBAAiB;IACjBG,uBAAuB;IACvBD,SAAS;IACTQ;EACF,CAAC,CAAC,EACF,CACElB,UAAU,EACVE,cAAc,EACdC,QAAQ,EACRC,sBAAsB,EACtBC,SAAS,EACTC,OAAO,EACPC,oBAAoB,EACpBC,iBAAiB,EACjBG,uBAAuB,EACvBD,SAAS,EACTQ,aAAa,CAEjB,CAAC;EAED,oBAAOtB,IAAA,CAACE,aAAa,CAAC0B,QAAQ;IAACR,KAAK,EAAEA,KAAM;IAAAf,QAAA,EAAEA;EAAQ,CAAyB,CAAC;AAClF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASwB,SAASA,CAAA,EAAuB;EAC9C,MAAMC,OAAO,GAAGrC,UAAU,CAACS,aAAa,CAAC;EACzC,IAAI,CAAC4B,OAAO,EAAE;IACZ,MAAM,IAAIC,KAAK,CAAC,kDAAkD,CAAC;EACrE;EACA,OAAOD,OAAO;AAChB","ignoreList":[]}
1
+ {"version":3,"names":["createContext","useCallback","useContext","useMemo","useState","useAnimatedRef","useAnimatedScrollHandler","useSharedValue","jsx","_jsx","SCREEN_HEADER_PORTAL_HOST","ScreenContext","ScreenScrollProvider","background","children","contentPadding","safeArea","contentOwnsBottomInset","platformAdjustsInsets","platformInsetsEligible","hasHeader","scrollY","headerCollapseHeight","headerSnapOffsets","setHeaderSnapOffsets","scrollRef","setHeaderCollapseHeight","height","rounded","Math","round","value","undefined","scrollHandler","onScroll","event","contentOffset","y","margins","Provider","useScreen","context","Error"],"sourceRoot":"../../../../src","sources":["components/screen/ScreenContext.tsx"],"mappings":";;AAAA,SAASA,aAAa,EAAkBC,WAAW,EAAEC,UAAU,EAAEC,OAAO,EAAEC,QAAQ,QAAQ,OAAO;AAEjG,SAIEC,cAAc,EACdC,wBAAwB,EACxBC,cAAc,QACT,yBAAyB;;AAIhC;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAGA;AACA,OAAO,MAAMC,yBAAyB,GAAG,eAAe;;AAExD;;AAyEA,OAAO,MAAMC,aAAa,gBAAGX,aAAa,CAA4B,IAAI,CAAC;;AAE3E;;AAmBA;AACA;AACA;AACA;AACA,OAAO,SAASY,oBAAoBA,CAAC;EACnCC,UAAU,GAAG,aAAa;EAC1BC,QAAQ;EACRC,cAAc,GAAG,KAAK;EACtBC,QAAQ,GAAG,MAAM;EACjBC,sBAAsB,GAAG,KAAK;EAC9BC,qBAAqB,GAAG,KAAK;EAC7BC,sBAAsB,GAAG,KAAK;EAC9BC,SAAS,GAAG;AACa,CAAC,EAAE;EAC5B,MAAMC,OAAO,GAAGd,cAAc,CAAC,CAAC,CAAC;EACjC,MAAMe,oBAAoB,GAAGf,cAAc,CAAC,CAAC,CAAC;EAC9C,MAAM,CAACgB,iBAAiB,EAAEC,oBAAoB,CAAC,GAAGpB,QAAQ,CAAW,CAAC;EACtE,MAAMqB,SAAS,GAAGpB,cAAc,CAAsB,CAAC;EAEvD,MAAMqB,uBAAuB,GAAGzB,WAAW,CACxC0B,MAAc,IAAK;IAClB,MAAMC,OAAO,GAAGC,IAAI,CAACC,KAAK,CAACH,MAAM,CAAC;IAClCL,oBAAoB,CAACS,KAAK,GAAGH,OAAO;IACpCJ,oBAAoB,CAACI,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,EAAEA,OAAO,CAAC,GAAGI,SAAS,CAAC;EAC9D,CAAC,EACD,CAACV,oBAAoB,CACvB,CAAC;EAED,MAAMW,aAAa,GAAG3B,wBAAwB,CAAC;IAC7C4B,QAAQ,EAAGC,KAAK,IAAK;MACnBd,OAAO,CAACU,KAAK,GAAGI,KAAK,CAACC,aAAa,CAACC,CAAC;IACvC;EACF,CAAC,CAAC;EAEF,MAAMN,KAAK,GAAG5B,OAAO,CACnB,OAAO;IACLU,UAAU;IACVE,cAAc;IACdC,QAAQ;IACRC,sBAAsB;IACtBC,qBAAqB;IACrBC,sBAAsB;IACtBmB,OAAO,EAAEvB,cAAc;IACvBK,SAAS;IACTC,OAAO;IACPC,oBAAoB;IACpBC,iBAAiB;IACjBG,uBAAuB;IACvBD,SAAS;IACTQ;EACF,CAAC,CAAC,EACF,CACEpB,UAAU,EACVE,cAAc,EACdC,QAAQ,EACRC,sBAAsB,EACtBC,qBAAqB,EACrBC,sBAAsB,EACtBC,SAAS,EACTC,OAAO,EACPC,oBAAoB,EACpBC,iBAAiB,EACjBG,uBAAuB,EACvBD,SAAS,EACTQ,aAAa,CAEjB,CAAC;EAED,oBAAOxB,IAAA,CAACE,aAAa,CAAC4B,QAAQ;IAACR,KAAK,EAAEA,KAAM;IAAAjB,QAAA,EAAEA;EAAQ,CAAyB,CAAC;AAClF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAAS0B,SAASA,CAAA,EAAuB;EAC9C,MAAMC,OAAO,GAAGvC,UAAU,CAACS,aAAa,CAAC;EACzC,IAAI,CAAC8B,OAAO,EAAE;IACZ,MAAM,IAAIC,KAAK,CAAC,kDAAkD,CAAC;EACrE;EACA,OAAOD,OAAO;AAChB","ignoreList":[]}
@@ -7,6 +7,7 @@ import Animated from "react-native-reanimated";
7
7
  import { StyleSheet } from "react-native-unistyles";
8
8
  import { resolveScreenPadding } from "../../theme/screen-padding.js";
9
9
  import { PortalHost } from "../portal/index.js";
10
+ import { useNestedContainerWarning } from "./hooks/use-nested-container-warning.js";
10
11
  import { useScreenRef } from "./hooks/use-screen-ref.js";
11
12
  import { useScreenScrollHandler } from "./hooks/use-screen-scroll-handler.js";
12
13
  import { ScreenBottomInset } from "./parts/ScreenBottomInset";
@@ -61,11 +62,13 @@ const ScreenListBase = /*#__PURE__*/forwardRef(function ScreenList({
61
62
  headerSnapOffsets,
62
63
  contentPadding: screenPadding,
63
64
  hasHeader,
64
- contentOwnsBottomInset
65
+ contentOwnsBottomInset,
66
+ platformAdjustsInsets
65
67
  } = useScreen();
66
68
  // The root yields the bottom edge only to a vertical container, so a horizontal
67
69
  // one here is a secondary container and must not pay the inset a second time.
68
70
  const ownsBottomInset = contentOwnsBottomInset && !horizontal;
71
+ useNestedContainerWarning("Screen.List", horizontal);
69
72
  const mergedRef = useScreenRef(isDefaultFlatList ? scrollRef : undefined, ref);
70
73
  const resolvedPadding = contentPadding ?? margins ?? screenPadding;
71
74
  const resolvedLoading = isLoading ?? loading;
@@ -94,8 +97,13 @@ const ScreenListBase = /*#__PURE__*/forwardRef(function ScreenList({
94
97
  style: [{
95
98
  backgroundColor: background
96
99
  }, style],
97
- horizontal: horizontal,
98
- contentInsetAdjustmentBehavior: "never",
100
+ horizontal: horizontal
101
+ /*
102
+ UIKit owns the vertical insets on a header-less iOS screen — see
103
+ `platformAdjustsInsets`. Everywhere else the frame has already paid them,
104
+ so a second adjustment here would count them twice.
105
+ */,
106
+ contentInsetAdjustmentBehavior: platformAdjustsInsets ? "automatic" : "never",
99
107
  automaticallyAdjustContentInsets: false,
100
108
  automaticallyAdjustsScrollIndicatorInsets: false,
101
109
  contentContainerStyle: [styles.content(resolvedPadding, hasHeader, bottomInset, extraBottomPadding), contentContainerStyle],
@@ -1 +1 @@
1
- {"version":3,"names":["forwardRef","useMemo","Animated","StyleSheet","resolveScreenPadding","PortalHost","useScreenRef","useScreenScrollHandler","ScreenBottomInset","renderScreenPlaceholder","SCREEN_HEADER_PORTAL_HOST","useScreen","hasHorizontalPadding","hasVerticalPadding","renderListComponent","jsx","_jsx","Fragment","_Fragment","jsxs","_jsxs","ScreenListBase","ScreenList","as","data","renderItem","style","contentContainerStyle","ListHeaderComponent","ListFooterComponent","ListEmptyComponent","horizontal","isLoading","loading","loadingContent","LoadingComponent","emptyContent","EmptyComponent","contentPadding","margins","bottomInset","extraBottomPadding","scrollHandler","externalScrollHandler","onScroll","rest","ref","isDefaultFlatList","undefined","FlatList","Component","AnimatedComponent","createAnimatedComponent","background","scrollRef","headerSnapOffsets","screenPadding","hasHeader","contentOwnsBottomInset","ownsBottomInset","mergedRef","resolvedPadding","resolvedLoading","placeholder","isEmpty","length","composedScrollHandler","header","children","View","styles","headerWrapper","name","footer","backgroundColor","contentInsetAdjustmentBehavior","automaticallyAdjustContentInsets","automaticallyAdjustsScrollIndicatorInsets","content","showsVerticalScrollIndicator","scrollEventThrottle","snapToOffsets","displayName","create","theme","runtime","padding","x","y","breakpoint","flexGrow","paddingTop","layout","height","paddingHorizontal","paddingBottom","uni__dependencies","marginHorizontal"],"sourceRoot":"../../../../src","sources":["components/screen/ScreenList.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["forwardRef","useMemo","Animated","StyleSheet","resolveScreenPadding","PortalHost","useNestedContainerWarning","useScreenRef","useScreenScrollHandler","ScreenBottomInset","renderScreenPlaceholder","SCREEN_HEADER_PORTAL_HOST","useScreen","hasHorizontalPadding","hasVerticalPadding","renderListComponent","jsx","_jsx","Fragment","_Fragment","jsxs","_jsxs","ScreenListBase","ScreenList","as","data","renderItem","style","contentContainerStyle","ListHeaderComponent","ListFooterComponent","ListEmptyComponent","horizontal","isLoading","loading","loadingContent","LoadingComponent","emptyContent","EmptyComponent","contentPadding","margins","bottomInset","extraBottomPadding","scrollHandler","externalScrollHandler","onScroll","rest","ref","isDefaultFlatList","undefined","FlatList","Component","AnimatedComponent","createAnimatedComponent","background","scrollRef","headerSnapOffsets","screenPadding","hasHeader","contentOwnsBottomInset","platformAdjustsInsets","ownsBottomInset","mergedRef","resolvedPadding","resolvedLoading","placeholder","isEmpty","length","composedScrollHandler","header","children","View","styles","headerWrapper","name","footer","backgroundColor","contentInsetAdjustmentBehavior","automaticallyAdjustContentInsets","automaticallyAdjustsScrollIndicatorInsets","content","showsVerticalScrollIndicator","scrollEventThrottle","snapToOffsets","displayName","create","theme","runtime","padding","x","y","breakpoint","flexGrow","paddingTop","layout","height","paddingHorizontal","paddingBottom","uni__dependencies","marginHorizontal"],"sourceRoot":"../../../../src","sources":["components/screen/ScreenList.tsx"],"mappings":"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","ignoreList":[]}
@@ -6,6 +6,7 @@ import Animated from "react-native-reanimated";
6
6
  import { StyleSheet } from "react-native-unistyles";
7
7
  import { resolveScreenPadding } from "../../theme/screen-padding.js";
8
8
  import { PortalHost } from "../portal/index.js";
9
+ import { useNestedContainerWarning } from "./hooks/use-nested-container-warning.js";
9
10
  import { useScreenRef } from "./hooks/use-screen-ref.js";
10
11
  import { useScreenScrollHandler } from "./hooks/use-screen-scroll-handler.js";
11
12
  import { ScreenBottomInset } from "./parts/ScreenBottomInset";
@@ -58,11 +59,13 @@ export const ScreenScrollView = /*#__PURE__*/forwardRef(function ScreenScrollVie
58
59
  contentPadding: screenPadding,
59
60
  hasHeader,
60
61
  background,
61
- contentOwnsBottomInset
62
+ contentOwnsBottomInset,
63
+ platformAdjustsInsets
62
64
  } = useScreen();
63
65
  // The root yields the bottom edge only to a vertical container, so a horizontal
64
66
  // one here is a secondary container and must not pay the inset a second time.
65
67
  const ownsBottomInset = contentOwnsBottomInset && !horizontal;
68
+ useNestedContainerWarning("Screen.ScrollView", horizontal);
66
69
  const resolvedPadding = contentPadding ?? margins ?? screenPadding;
67
70
  const mergedRef = useScreenRef(scrollRef, ref);
68
71
  const placeholder = renderScreenPlaceholder({
@@ -77,8 +80,13 @@ export const ScreenScrollView = /*#__PURE__*/forwardRef(function ScreenScrollVie
77
80
  style: [{
78
81
  backgroundColor: background
79
82
  }, style],
80
- horizontal: horizontal,
81
- contentInsetAdjustmentBehavior: "never",
83
+ horizontal: horizontal
84
+ /*
85
+ UIKit owns the vertical insets on a header-less iOS screen — see
86
+ `platformAdjustsInsets`. Everywhere else the frame has already paid
87
+ them, so a second adjustment here would count them twice.
88
+ */,
89
+ contentInsetAdjustmentBehavior: platformAdjustsInsets ? "automatic" : "never",
82
90
  automaticallyAdjustContentInsets: false,
83
91
  automaticallyAdjustsScrollIndicatorInsets: false,
84
92
  showsVerticalScrollIndicator: false,
@@ -1 +1 @@
1
- {"version":3,"names":["Children","forwardRef","Animated","StyleSheet","resolveScreenPadding","PortalHost","useScreenRef","useScreenScrollHandler","ScreenBottomInset","renderScreenPlaceholder","SCREEN_HEADER_PORTAL_HOST","useScreen","hasHorizontalPadding","hasVerticalPadding","jsx","_jsx","jsxs","_jsxs","ScreenScrollView","children","style","contentContainerStyle","contentStyle","scrollHandler","externalScrollHandler","onScroll","horizontal","isLoading","loading","loadingContent","LoadingComponent","emptyContent","EmptyComponent","contentPadding","margins","extraBottomPadding","isEmpty","rest","ref","scrollRef","screenPadding","hasHeader","background","contentOwnsBottomInset","ownsBottomInset","resolvedPadding","mergedRef","placeholder","undefined","toArray","length","composedScrollHandler","ScrollView","backgroundColor","contentInsetAdjustmentBehavior","automaticallyAdjustContentInsets","automaticallyAdjustsScrollIndicatorInsets","showsVerticalScrollIndicator","scrollEventThrottle","styles","scrollContent","View","headerWrapper","name","content","displayName","create","theme","runtime","padding","x","y","breakpoint","flexGrow","paddingTop","layout","header","height","paddingHorizontal","paddingBottom","uni__dependencies","marginHorizontal","flexDirection"],"sourceRoot":"../../../../src","sources":["components/screen/ScreenScrollView.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["Children","forwardRef","Animated","StyleSheet","resolveScreenPadding","PortalHost","useNestedContainerWarning","useScreenRef","useScreenScrollHandler","ScreenBottomInset","renderScreenPlaceholder","SCREEN_HEADER_PORTAL_HOST","useScreen","hasHorizontalPadding","hasVerticalPadding","jsx","_jsx","jsxs","_jsxs","ScreenScrollView","children","style","contentContainerStyle","contentStyle","scrollHandler","externalScrollHandler","onScroll","horizontal","isLoading","loading","loadingContent","LoadingComponent","emptyContent","EmptyComponent","contentPadding","margins","extraBottomPadding","isEmpty","rest","ref","scrollRef","screenPadding","hasHeader","background","contentOwnsBottomInset","platformAdjustsInsets","ownsBottomInset","resolvedPadding","mergedRef","placeholder","undefined","toArray","length","composedScrollHandler","ScrollView","backgroundColor","contentInsetAdjustmentBehavior","automaticallyAdjustContentInsets","automaticallyAdjustsScrollIndicatorInsets","showsVerticalScrollIndicator","scrollEventThrottle","styles","scrollContent","View","headerWrapper","name","content","displayName","create","theme","runtime","padding","x","y","breakpoint","flexGrow","paddingTop","layout","header","height","paddingHorizontal","paddingBottom","uni__dependencies","marginHorizontal","flexDirection"],"sourceRoot":"../../../../src","sources":["components/screen/ScreenScrollView.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+
3
+ import { useEffect } from "react";
4
+ import { useScreen } from "../ScreenContext.js";
5
+
6
+ /**
7
+ * Warns, in development, when this container is the one the screen root failed
8
+ * to find.
9
+ *
10
+ * The root inspects its own children and fragments but does not execute
11
+ * component children, so a container rendered inside one is invisible to it (see
12
+ * `hasScrollContainerOwningBottom`). On a header-less iOS screen that changes
13
+ * behaviour rather than just bookkeeping: the frame pads the top edge, the scroll
14
+ * view no longer fills the screen, and UIKit stops collapsing the native large
15
+ * title — silently, with the screen otherwise looking correct.
16
+ *
17
+ * The container is the only place that can tell. `platformInsetsEligible` says
18
+ * the screen qualified; a container mounting while `platformAdjustsInsets` is
19
+ * false says the root never saw it. Both true together mean exactly this mistake,
20
+ * so there is nothing here to false-positive on: a screen with no scroll
21
+ * container at all never runs this hook, and a deliberate `safeArea` opt-out is
22
+ * not eligible in the first place.
23
+ *
24
+ * @param container Name to report, e.g. `"Screen.List"`.
25
+ * @param horizontal Whether this container scrolls horizontally; those are never
26
+ * candidates for the vertical insets and never warn.
27
+ */
28
+ export function useNestedContainerWarning(container, horizontal) {
29
+ const {
30
+ platformAdjustsInsets,
31
+ platformInsetsEligible
32
+ } = useScreen();
33
+ const isNested = platformInsetsEligible && !platformAdjustsInsets && !horizontal;
34
+ useEffect(() => {
35
+ if (!__DEV__ || !isNested) return;
36
+ console.warn(`[react-native-terra-ui] ${container} is nested inside another component, so its Screen could not find it. ` + "On iOS a Screen with no Screen.Header hands its vertical insets to UIKit, but only when the scroll " + "container is among its own children — nested, the frame pads the top instead and a native large title " + `will not collapse. Render ${container} as a direct child of Screen; fragments are fine.`);
37
+ }, [container, isNested]);
38
+ }
39
+ //# sourceMappingURL=use-nested-container-warning.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useEffect","useScreen","useNestedContainerWarning","container","horizontal","platformAdjustsInsets","platformInsetsEligible","isNested","__DEV__","console","warn"],"sourceRoot":"../../../../../src","sources":["components/screen/hooks/use-nested-container-warning.ts"],"mappings":";;AAAA,SAASA,SAAS,QAAQ,OAAO;AAEjC,SAASC,SAAS;;AAElB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,yBAAyBA,CAACC,SAAiB,EAAEC,UAAmB,EAAQ;EACtF,MAAM;IAAEC,qBAAqB;IAAEC;EAAuB,CAAC,GAAGL,SAAS,CAAC,CAAC;EACrE,MAAMM,QAAQ,GAAGD,sBAAsB,IAAI,CAACD,qBAAqB,IAAI,CAACD,UAAU;EAEhFJ,SAAS,CAAC,MAAM;IACd,IAAI,CAACQ,OAAO,IAAI,CAACD,QAAQ,EAAE;IAC3BE,OAAO,CAACC,IAAI,CACV,2BAA2BP,SAAS,wEAAwE,GAC1G,qGAAqG,GACrG,wGAAwG,GACxG,6BAA6BA,SAAS,mDAC1C,CAAC;EACH,CAAC,EAAE,CAACA,SAAS,EAAEI,QAAQ,CAAC,CAAC;AAC3B","ignoreList":[]}
@@ -21,6 +21,7 @@ export function ScreenFrame({
21
21
  children: [/*#__PURE__*/_jsx(ScreenSafeArea, {
22
22
  edges: edges,
23
23
  children: /*#__PURE__*/_jsx(View, {
24
+ collapsable: false,
24
25
  style: styles.content,
25
26
  onLayout: onLayout,
26
27
  children: children
@@ -1 +1 @@
1
- {"version":3,"names":["useCallback","useContext","useState","Animated","StyleSheet","ScreenHeaderAppearanceContext","ScreenSafeArea","jsx","_jsx","Fragment","_Fragment","jsxs","_jsxs","ScreenFrame","children","edges","appearance","topInset","setTopInset","onLayout","event","nativeEvent","layout","y","View","style","styles","content","top","background","undefined","pointerEvents","topSafeArea","color","animatedStyle","create","flex","height","backgroundColor","position","left","right"],"sourceRoot":"../../../../../src","sources":["components/screen/parts/ScreenFrame.tsx"],"mappings":";;;AAAA,SAAiCA,WAAW,EAAEC,UAAU,EAAEC,QAAQ,QAAQ,OAAO;AAGjF,OAAOC,QAAQ,MAAM,yBAAyB;AAC9C,SAASC,UAAU,QAAQ,wBAAwB;AAGnD,SAASC,6BAA6B;AACtC,SAASC,cAAc;AAA2B,SAAAC,GAAA,IAAAC,IAAA,EAAAC,QAAA,IAAAC,SAAA,EAAAC,IAAA,IAAAC,KAAA;AAElD,OAAO,SAASC,WAAWA,CAAC;EAAEC,QAAQ;EAAEC;AAAyD,CAAC,EAAE;EAClG,MAAMC,UAAU,GAAGf,UAAU,CAACI,6BAA6B,CAAC;EAC5D,MAAM,CAACY,QAAQ,EAAEC,WAAW,CAAC,GAAGhB,QAAQ,CAAC,CAAC,CAAC;EAC3C,MAAMiB,QAAQ,GAAGnB,WAAW,CAAEoB,KAAwB,IAAK;IACzD;IACAF,WAAW,CAACE,KAAK,CAACC,WAAW,CAACC,MAAM,CAACC,CAAC,CAAC;EACzC,CAAC,EAAE,EAAE,CAAC;EAEN,oBACEX,KAAA,CAAAF,SAAA;IAAAI,QAAA,gBACEN,IAAA,CAACF,cAAc;MAACS,KAAK,EAAEA,KAAM;MAAAD,QAAA,eAC3BN,IAAA,CAACgB,IAAI;QAACC,KAAK,EAAEC,MAAM,CAACC,OAAQ;QAACR,QAAQ,EAAEA,QAAS;QAAAL,QAAA,EAC7CA;MAAQ,CACL;IAAC,CACO,CAAC,EAChBC,KAAK,CAACa,GAAG,IAAIZ,UAAU,EAAEa,UAAU,KAAKC,SAAS,iBAChDtB,IAAA,CAACL,QAAQ,CAACqB,IAAI;MACZO,aAAa,EAAC,MAAM;MACpBN,KAAK,EAAE,CACLC,MAAM,CAACM,WAAW,CAACf,QAAQ,EAAED,UAAU,CAACa,UAAU,CAACI,KAAK,CAAC,EACzDjB,UAAU,CAACa,UAAU,CAACK,aAAa;IACnC,CACH,CACF;EAAA,CACD,CAAC;AAEP;AAEA,MAAMR,MAAM,GAAGtB,UAAU,CAAC+B,MAAM,CAAC,OAAO;EACtCR,OAAO,EAAE;IAAES,IAAI,EAAE;EAAE,CAAC;EACpBJ,WAAW,EAAEA,CAACK,MAAc,EAAEC,eAAuB,MAAM;IACzDC,QAAQ,EAAE,UAAU;IACpBX,GAAG,EAAE,CAAC;IACNY,IAAI,EAAE,CAAC;IACPC,KAAK,EAAE,CAAC;IACRJ,MAAM;IACNC;EACF,CAAC;AACH,CAAC,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["useCallback","useContext","useState","Animated","StyleSheet","ScreenHeaderAppearanceContext","ScreenSafeArea","jsx","_jsx","Fragment","_Fragment","jsxs","_jsxs","ScreenFrame","children","edges","appearance","topInset","setTopInset","onLayout","event","nativeEvent","layout","y","View","collapsable","style","styles","content","top","background","undefined","pointerEvents","topSafeArea","color","animatedStyle","create","flex","height","backgroundColor","position","left","right"],"sourceRoot":"../../../../../src","sources":["components/screen/parts/ScreenFrame.tsx"],"mappings":";;;AAAA,SAAiCA,WAAW,EAAEC,UAAU,EAAEC,QAAQ,QAAQ,OAAO;AAGjF,OAAOC,QAAQ,MAAM,yBAAyB;AAC9C,SAASC,UAAU,QAAQ,wBAAwB;AAGnD,SAASC,6BAA6B;AACtC,SAASC,cAAc;AAA2B,SAAAC,GAAA,IAAAC,IAAA,EAAAC,QAAA,IAAAC,SAAA,EAAAC,IAAA,IAAAC,KAAA;AAElD,OAAO,SAASC,WAAWA,CAAC;EAAEC,QAAQ;EAAEC;AAAyD,CAAC,EAAE;EAClG,MAAMC,UAAU,GAAGf,UAAU,CAACI,6BAA6B,CAAC;EAC5D,MAAM,CAACY,QAAQ,EAAEC,WAAW,CAAC,GAAGhB,QAAQ,CAAC,CAAC,CAAC;EAC3C,MAAMiB,QAAQ,GAAGnB,WAAW,CAAEoB,KAAwB,IAAK;IACzD;IACAF,WAAW,CAACE,KAAK,CAACC,WAAW,CAACC,MAAM,CAACC,CAAC,CAAC;EACzC,CAAC,EAAE,EAAE,CAAC;EAEN,oBACEX,KAAA,CAAAF,SAAA;IAAAI,QAAA,gBACEN,IAAA,CAACF,cAAc;MAACS,KAAK,EAAEA,KAAM;MAAAD,QAAA,eAQ3BN,IAAA,CAACgB,IAAI;QAACC,WAAW,EAAE,KAAM;QAACC,KAAK,EAAEC,MAAM,CAACC,OAAQ;QAACT,QAAQ,EAAEA,QAAS;QAAAL,QAAA,EACjEA;MAAQ,CACL;IAAC,CACO,CAAC,EAChBC,KAAK,CAACc,GAAG,IAAIb,UAAU,EAAEc,UAAU,KAAKC,SAAS,iBAChDvB,IAAA,CAACL,QAAQ,CAACqB,IAAI;MACZQ,aAAa,EAAC,MAAM;MACpBN,KAAK,EAAE,CACLC,MAAM,CAACM,WAAW,CAAChB,QAAQ,EAAED,UAAU,CAACc,UAAU,CAACI,KAAK,CAAC,EACzDlB,UAAU,CAACc,UAAU,CAACK,aAAa;IACnC,CACH,CACF;EAAA,CACD,CAAC;AAEP;AAEA,MAAMR,MAAM,GAAGvB,UAAU,CAACgC,MAAM,CAAC,OAAO;EACtCR,OAAO,EAAE;IAAES,IAAI,EAAE;EAAE,CAAC;EACpBJ,WAAW,EAAEA,CAACK,MAAc,EAAEC,eAAuB,MAAM;IACzDC,QAAQ,EAAE,UAAU;IACpBX,GAAG,EAAE,CAAC;IACNY,IAAI,EAAE,CAAC;IACPC,KAAK,EAAE,CAAC;IACRJ,MAAM;IACNC;EACF,CAAC;AACH,CAAC,CAAC,CAAC","ignoreList":[]}
@@ -61,6 +61,12 @@ export interface ScreenProps extends ViewProps {
61
61
  * root frame. Drop `"bottom"` from the list to reserve no room for the bar at
62
62
  * all — see `extraBottomPadding` for adding your own.
63
63
  *
64
+ * On iOS, a screen with no `Screen.Header` hands both vertical edges to UIKit's
65
+ * own content-inset adjustment instead: the bar above such a screen is a native
66
+ * navigation bar, and a native large title only collapses for a scroll view
67
+ * that fills the screen. Do not also pass `contentInsetAdjustmentBehavior` to
68
+ * the container there — the default already asks UIKit for it.
69
+ *
64
70
  * @defaultValue "auto"
65
71
  */
66
72
  safeArea?: ScreenSafeAreaPolicy;
@@ -1 +1 @@
1
- {"version":3,"file":"Screen.d.ts","sourceRoot":"","sources":["../../../../../src/components/screen/Screen.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,wBAAwB,EAC7B,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,QAAQ,EACR,UAAU,EAEV,KAAK,iBAAiB,EAEtB,KAAK,SAAS,EAEf,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,IAAI,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAIpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAM/C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAkB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAc,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,oBAAoB,EAAE,aAAa,EAAE,cAAc,IAAI,oBAAoB,EAAE,MAAM,YAAS,CAAC;AAG3G,qFAAqF;AACrF,MAAM,MAAM,iBAAiB,CAAC,CAAC,SAAS,WAAW,GAAG,OAAO,QAAQ,IAAI,iBAAiB,CACxF;IACE;;;;OAIG;IACH,EAAE,CAAC,EAAE,CAAC,CAAC;CACR,GAAG,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAClD,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,iBAAS,YAAY,CAAC,CAAC,SAAS,WAAW,GAAG,OAAO,QAAQ,EAAE,EAC7D,QAAQ,EACR,EAAE,EACF,GAAG,IAAI,EACR,EAAE,iBAAiB,CAAC,CAAC,CAAC,+BAOtB;kBAXQ,YAAY;;;AA+DrB,uFAAuF;AACvF,MAAM,WAAW,WAAY,SAAQ,SAAS;IAC5C,qFAAqF;IACrF,QAAQ,EAAE,SAAS,CAAC;IACpB;;;;OAIG;IACH,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;;OAIG;IACH,cAAc,CAAC,EAAE,oBAAoB,CAAC;IACtC;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IAChC,sCAAsC;IACtC,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,KAAK,eAAe,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,YAAY,CAAC,OAAO,IAAI,CAAC,EAAE,WAAW,CAAC,CAAC,GAAG;IAC7F,2DAA2D;IAC3D,MAAM,EAAE,OAAO,YAAY,CAAC;IAC5B,6EAA6E;IAC7E,UAAU,EAAE,OAAO,gBAAgB,CAAC;IACpC,kEAAkE;IAClE,QAAQ,EAAE,OAAO,cAAc,CAAC;IAChC,sEAAsE;IACtE,IAAI,EAAE,OAAO,UAAU,CAAC;CACzB,CAAC;AA+DF;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,MAAM,iBAAa,CAAC"}
1
+ {"version":3,"file":"Screen.d.ts","sourceRoot":"","sources":["../../../../../src/components/screen/Screen.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,wBAAwB,EAC7B,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,QAAQ,EACR,UAAU,EAEV,KAAK,iBAAiB,EAEtB,KAAK,SAAS,EAEf,MAAM,OAAO,CAAC;AACf,OAAO,EAAY,IAAI,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAI9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAM/C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAkB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAc,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,oBAAoB,EAAE,aAAa,EAAE,cAAc,IAAI,oBAAoB,EAAE,MAAM,YAAS,CAAC;AAG3G,qFAAqF;AACrF,MAAM,MAAM,iBAAiB,CAAC,CAAC,SAAS,WAAW,GAAG,OAAO,QAAQ,IAAI,iBAAiB,CACxF;IACE;;;;OAIG;IACH,EAAE,CAAC,EAAE,CAAC,CAAC;CACR,GAAG,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAClD,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,iBAAS,YAAY,CAAC,CAAC,SAAS,WAAW,GAAG,OAAO,QAAQ,EAAE,EAC7D,QAAQ,EACR,EAAE,EACF,GAAG,IAAI,EACR,EAAE,iBAAiB,CAAC,CAAC,CAAC,+BAOtB;kBAXQ,YAAY;;;AA+DrB,uFAAuF;AACvF,MAAM,WAAW,WAAY,SAAQ,SAAS;IAC5C,qFAAqF;IACrF,QAAQ,EAAE,SAAS,CAAC;IACpB;;;;OAIG;IACH,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;;OAIG;IACH,cAAc,CAAC,EAAE,oBAAoB,CAAC;IACtC;;;;;;;;;;;;;;;;;OAiBG;IACH,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IAChC,sCAAsC;IACtC,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,KAAK,eAAe,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,YAAY,CAAC,OAAO,IAAI,CAAC,EAAE,WAAW,CAAC,CAAC,GAAG;IAC7F,2DAA2D;IAC3D,MAAM,EAAE,OAAO,YAAY,CAAC;IAC5B,6EAA6E;IAC7E,UAAU,EAAE,OAAO,gBAAgB,CAAC;IACpC,kEAAkE;IAClE,QAAQ,EAAE,OAAO,cAAc,CAAC;IAChC,sEAAsE;IACtE,IAAI,EAAE,OAAO,UAAU,CAAC;CACzB,CAAC;AAgIF;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,MAAM,iBAAa,CAAC"}
@@ -25,6 +25,28 @@ export interface ScreenContextValue {
25
25
  * or a horizontal container needs.
26
26
  */
27
27
  contentOwnsBottomInset: boolean;
28
+ /**
29
+ * Whether the platform's own content-inset adjustment pays the vertical insets.
30
+ *
31
+ * True on an iOS screen with no `Screen.Header`: the navigation bar above such a
32
+ * screen is UIKit's, and only UIKit can inset a scroll view for one — a native
33
+ * large title resizes on every frame of its collapse, and it refuses to collapse
34
+ * at all for a scroll view that does not fill the screen. The frame therefore
35
+ * keeps no vertical edge, the container asks for
36
+ * `contentInsetAdjustmentBehavior: "automatic"` rather than `"never"`, and
37
+ * `contentOwnsBottomInset` stays false because UIKit pays that edge too.
38
+ */
39
+ platformAdjustsInsets: boolean;
40
+ /**
41
+ * Whether this screen *would* hand its vertical insets to the platform, if it
42
+ * found a vertical scroll container among its children.
43
+ *
44
+ * Everything `platformAdjustsInsets` needs except the container itself. The two
45
+ * differ only when the container is nested inside another component, where the
46
+ * root cannot see it — which is a mistake on such a screen, and the difference
47
+ * is how a mounting container detects that it was the one missed.
48
+ */
49
+ platformInsetsEligible: boolean;
28
50
  /** @deprecated Use contentPadding. */
29
51
  margins: ScreenContentPadding;
30
52
  /** Whether a `Screen.Header` is present. Used by scroll containers to add top inset. */
@@ -63,6 +85,10 @@ export interface ScreenScrollProviderProps {
63
85
  safeArea?: ScreenSafeArea;
64
86
  /** Whether the primary scroll container pads the bottom safe area. Default false. */
65
87
  contentOwnsBottomInset?: boolean;
88
+ /** Whether the platform adjusts the scroll container's vertical insets. Default false. */
89
+ platformAdjustsInsets?: boolean;
90
+ /** Whether the screen qualifies for that, container aside. Default false. */
91
+ platformInsetsEligible?: boolean;
66
92
  /** Whether a `Screen.Header` child is present. Default false. */
67
93
  hasHeader?: boolean;
68
94
  /** Resolved background color shared with scroll containers. */
@@ -72,7 +98,7 @@ export interface ScreenScrollProviderProps {
72
98
  * Owns the screen's shared scroll ref, offset, snap offsets, and header collapse
73
99
  * metrics. Scroll containers bind the ref via {@link useScreen}.
74
100
  */
75
- export declare function ScreenScrollProvider({ background, children, contentPadding, safeArea, contentOwnsBottomInset, hasHeader, }: ScreenScrollProviderProps): import("react").JSX.Element;
101
+ export declare function ScreenScrollProvider({ background, children, contentPadding, safeArea, contentOwnsBottomInset, platformAdjustsInsets, platformInsetsEligible, hasHeader, }: ScreenScrollProviderProps): import("react").JSX.Element;
76
102
  /**
77
103
  * Reads the nearest `Screen`'s configuration, shared scroll state, and ref.
78
104
  * Read `scrollY.value` in Reanimated worklets to animate without React renders.
@@ -1 +1 @@
1
- {"version":3,"file":"ScreenContext.d.ts","sourceRoot":"","sources":["../../../../../src/components/screen/ScreenContext.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,SAAS,EAA8C,MAAM,OAAO,CAAC;AAElG,OAAO,QAAQ,EAAE,EACf,KAAK,WAAW,EAChB,KAAK,sBAAsB,EAC3B,KAAK,WAAW,EAIjB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,KAAK,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,YAAS,CAAC;AAEpE,6EAA6E;AAC7E,MAAM,MAAM,eAAe,GAAG,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;AAE/D,yDAAyD;AACzD,eAAO,MAAM,yBAAyB,kBAAkB,CAAC;AAEzD,gFAAgF;AAChF,MAAM,WAAW,kBAAkB;IACjC;;;OAGG;IACH,cAAc,EAAE,oBAAoB,CAAC;IACrC,6EAA6E;IAC7E,QAAQ,EAAE,cAAc,CAAC;IACzB;;;;;;;;;OASG;IACH,sBAAsB,EAAE,OAAO,CAAC;IAChC,sCAAsC;IACtC,OAAO,EAAE,oBAAoB,CAAC;IAC9B,wFAAwF;IACxF,SAAS,EAAE,OAAO,CAAC;IACnB,8EAA8E;IAC9E,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC7B;;;OAGG;IACH,oBAAoB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC1C;;;OAGG;IACH,iBAAiB,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IACxC,iGAAiG;IACjG,uBAAuB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAClD;;;;OAIG;IACH,SAAS,EAAE,eAAe,CAAC;IAC3B,yDAAyD;IACzD,aAAa,EAAE,sBAAsB,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAE/D,+DAA+D;IAC/D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,aAAa,oDAAiD,CAAC;AAE5E,4DAA4D;AAC5D,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,SAAS,CAAC;IACpB,sFAAsF;IACtF,cAAc,CAAC,EAAE,oBAAoB,CAAC;IACtC,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,qFAAqF;IACrF,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,iEAAiE;IACjE,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB,+DAA+D;IAC/D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,EACnC,UAA0B,EAC1B,QAAQ,EACR,cAAsB,EACtB,QAAiB,EACjB,sBAA8B,EAC9B,SAAiB,GAClB,EAAE,yBAAyB,+BAoD3B;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,SAAS,IAAI,kBAAkB,CAM9C"}
1
+ {"version":3,"file":"ScreenContext.d.ts","sourceRoot":"","sources":["../../../../../src/components/screen/ScreenContext.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,SAAS,EAA8C,MAAM,OAAO,CAAC;AAElG,OAAO,QAAQ,EAAE,EACf,KAAK,WAAW,EAChB,KAAK,sBAAsB,EAC3B,KAAK,WAAW,EAIjB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,KAAK,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,YAAS,CAAC;AAEpE,6EAA6E;AAC7E,MAAM,MAAM,eAAe,GAAG,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;AAE/D,yDAAyD;AACzD,eAAO,MAAM,yBAAyB,kBAAkB,CAAC;AAEzD,gFAAgF;AAChF,MAAM,WAAW,kBAAkB;IACjC;;;OAGG;IACH,cAAc,EAAE,oBAAoB,CAAC;IACrC,6EAA6E;IAC7E,QAAQ,EAAE,cAAc,CAAC;IACzB;;;;;;;;;OASG;IACH,sBAAsB,EAAE,OAAO,CAAC;IAChC;;;;;;;;;;OAUG;IACH,qBAAqB,EAAE,OAAO,CAAC;IAC/B;;;;;;;;OAQG;IACH,sBAAsB,EAAE,OAAO,CAAC;IAChC,sCAAsC;IACtC,OAAO,EAAE,oBAAoB,CAAC;IAC9B,wFAAwF;IACxF,SAAS,EAAE,OAAO,CAAC;IACnB,8EAA8E;IAC9E,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC7B;;;OAGG;IACH,oBAAoB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC1C;;;OAGG;IACH,iBAAiB,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IACxC,iGAAiG;IACjG,uBAAuB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAClD;;;;OAIG;IACH,SAAS,EAAE,eAAe,CAAC;IAC3B,yDAAyD;IACzD,aAAa,EAAE,sBAAsB,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAE/D,+DAA+D;IAC/D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,aAAa,oDAAiD,CAAC;AAE5E,4DAA4D;AAC5D,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,SAAS,CAAC;IACpB,sFAAsF;IACtF,cAAc,CAAC,EAAE,oBAAoB,CAAC;IACtC,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,qFAAqF;IACrF,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,0FAA0F;IAC1F,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,6EAA6E;IAC7E,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,iEAAiE;IACjE,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB,+DAA+D;IAC/D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,EACnC,UAA0B,EAC1B,QAAQ,EACR,cAAsB,EACtB,QAAiB,EACjB,sBAA8B,EAC9B,qBAA6B,EAC7B,sBAA8B,EAC9B,SAAiB,GAClB,EAAE,yBAAyB,+BAwD3B;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,SAAS,IAAI,kBAAkB,CAM9C"}
@@ -1 +1 @@
1
- {"version":3,"file":"ScreenList.d.ts","sourceRoot":"","sources":["../../../../../src/components/screen/ScreenList.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ScreenList.d.ts","sourceRoot":"","sources":["../../../../../src/components/screen/ScreenList.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ScreenScrollView.d.ts","sourceRoot":"","sources":["../../../../../src/components/screen/ScreenScrollView.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA2C,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAChF,OAAO,EAAmB,KAAK,eAAe,EAAE,KAAK,SAAS,EAAQ,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAY3G,OAAO,KAAK,EAAwB,qBAAqB,EAAE,MAAM,YAAS,CAAC;AAG3E,qFAAqF;AACrF,MAAM,WAAW,qBAAsB,SAAQ,IAAI,CAAC,eAAe,EAAE,YAAY,CAAC,EAAE,qBAAqB;IACvG,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,iEAAiE;IACjE,YAAY,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IACpC,uFAAuF;IACvF,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,gBAAgB,8MAsE5B,CAAC"}
1
+ {"version":3,"file":"ScreenScrollView.d.ts","sourceRoot":"","sources":["../../../../../src/components/screen/ScreenScrollView.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA2C,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAChF,OAAO,EAAmB,KAAK,eAAe,EAAE,KAAK,SAAS,EAAQ,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAa3G,OAAO,KAAK,EAAwB,qBAAqB,EAAE,MAAM,YAAS,CAAC;AAG3E,qFAAqF;AACrF,MAAM,WAAW,qBAAsB,SAAQ,IAAI,CAAC,eAAe,EAAE,YAAY,CAAC,EAAE,qBAAqB;IACvG,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,iEAAiE;IACjE,YAAY,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IACpC,uFAAuF;IACvF,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,gBAAgB,8MA6E5B,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Warns, in development, when this container is the one the screen root failed
3
+ * to find.
4
+ *
5
+ * The root inspects its own children and fragments but does not execute
6
+ * component children, so a container rendered inside one is invisible to it (see
7
+ * `hasScrollContainerOwningBottom`). On a header-less iOS screen that changes
8
+ * behaviour rather than just bookkeeping: the frame pads the top edge, the scroll
9
+ * view no longer fills the screen, and UIKit stops collapsing the native large
10
+ * title — silently, with the screen otherwise looking correct.
11
+ *
12
+ * The container is the only place that can tell. `platformInsetsEligible` says
13
+ * the screen qualified; a container mounting while `platformAdjustsInsets` is
14
+ * false says the root never saw it. Both true together mean exactly this mistake,
15
+ * so there is nothing here to false-positive on: a screen with no scroll
16
+ * container at all never runs this hook, and a deliberate `safeArea` opt-out is
17
+ * not eligible in the first place.
18
+ *
19
+ * @param container Name to report, e.g. `"Screen.List"`.
20
+ * @param horizontal Whether this container scrolls horizontally; those are never
21
+ * candidates for the vertical insets and never warn.
22
+ */
23
+ export declare function useNestedContainerWarning(container: string, horizontal: boolean): void;
24
+ //# sourceMappingURL=use-nested-container-warning.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-nested-container-warning.d.ts","sourceRoot":"","sources":["../../../../../../src/components/screen/hooks/use-nested-container-warning.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,GAAG,IAAI,CAatF"}
@@ -1 +1 @@
1
- {"version":3,"file":"ScreenFrame.d.ts","sourceRoot":"","sources":["../../../../../../src/components/screen/parts/ScreenFrame.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,iBAAiB,EAAqC,MAAM,OAAO,CAAC;AAMlF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAU,CAAC;AAIpD,wBAAgB,WAAW,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,iBAAiB,CAAC;IAAE,KAAK,EAAE,mBAAmB,CAAA;CAAE,CAAC,+BA0BjG"}
1
+ {"version":3,"file":"ScreenFrame.d.ts","sourceRoot":"","sources":["../../../../../../src/components/screen/parts/ScreenFrame.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,iBAAiB,EAAqC,MAAM,OAAO,CAAC;AAMlF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAU,CAAC;AAIpD,wBAAgB,WAAW,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,iBAAiB,CAAC;IAAE,KAAK,EAAE,mBAAmB,CAAA;CAAE,CAAC,+BAiCjG"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-terra-ui",
3
- "version": "0.9.0",
3
+ "version": "0.9.1",
4
4
  "description": "Themeable React Native UI components built on react-native-unistyles",
5
5
  "main": "./lib/module/index.js",
6
6
  "types": "./lib/typescript/src/index.d.ts",
@@ -11,9 +11,9 @@ import {
11
11
  type ReactNode,
12
12
  useMemo,
13
13
  } from "react";
14
- import { View, type ViewProps } from "react-native";
14
+ import { Platform, View, type ViewProps } from "react-native";
15
15
 
16
- import { StyleSheet, useUnistyles } from "react-native-unistyles";
16
+ import { useUnistyles } from "react-native-unistyles";
17
17
 
18
18
  import type { ColorToken } from "#theme/types";
19
19
  import { resolveThemeColor } from "#utils/resolve-theme-color";
@@ -145,6 +145,12 @@ export interface ScreenProps extends ViewProps {
145
145
  * root frame. Drop `"bottom"` from the list to reserve no room for the bar at
146
146
  * all — see `extraBottomPadding` for adding your own.
147
147
  *
148
+ * On iOS, a screen with no `Screen.Header` hands both vertical edges to UIKit's
149
+ * own content-inset adjustment instead: the bar above such a screen is a native
150
+ * navigation bar, and a native large title only collapses for a scroll view
151
+ * that fills the screen. Do not also pass `contentInsetAdjustmentBehavior` to
152
+ * the container there — the default already asks UIKit for it.
153
+ *
148
154
  * @defaultValue "auto"
149
155
  */
150
156
  safeArea?: ScreenSafeAreaPolicy;
@@ -184,8 +190,37 @@ const ScreenBase = forwardRef<ComponentRef<typeof View>, ScreenProps>(function S
184
190
  const hasHeader = useMemo(() => hasScreenHeader(children), [children]);
185
191
  const resolvedMargins = contentPadding ?? margins ?? (hasMargins === false ? "none" : "all");
186
192
  const edges = useMemo(() => resolveSafeAreaEdges(safeArea), [safeArea]);
193
+ const hasVerticalScrollContainer = useMemo(() => hasScrollContainerOwningBottom(children), [children]);
187
194
  /*
188
- The bottom edge goes to the scroll container when there is one to take it.
195
+ A screen with no `Screen.Header` wears UIKit's own navigation bar, and only
196
+ UIKit can inset a scroll view for one.
197
+
198
+ A native large title changes height on every frame of its collapse, and the
199
+ bar is a sibling view this screen cannot measure — so an inset computed in JS
200
+ is always a frame late and always the wrong size. Worse, UIKit will not
201
+ collapse the title at all unless the scroll view it finds fills the screen:
202
+ padding the top edge on the frame starts that view 168pt down (measured on an
203
+ iPhone 17, expanded title), and the title then stays full size while rows
204
+ scroll up and overprint it.
205
+
206
+ So the frame keeps no vertical edge on such a screen, the container turns
207
+ UIKit's `contentInsetAdjustmentBehavior` back on, and UIKit pays the top and
208
+ the bottom both — which is why `ScreenBottomInset` stands down here rather
209
+ than paying that edge a second time. iOS only: this is UIKit's mechanism, and
210
+ Android has no navigation bar to track.
211
+
212
+ Both vertical edges have to be protected to hand them over, because UIKit
213
+ adjusts for both or for neither. A policy that asks for one and not the other
214
+ cannot be expressed this way, so it keeps the ordinary treatment below and
215
+ is honoured exactly as written — at the cost of the title collapse, which is
216
+ the better trade: an edge list is an explicit instruction, and silently
217
+ insetting an edge the caller excluded would be the worse surprise.
218
+ */
219
+ const platformInsetsEligible = Platform.OS === "ios" && !hasHeader && edges.top && edges.bottom;
220
+ const platformAdjustsInsets = platformInsetsEligible && hasVerticalScrollContainer;
221
+ /*
222
+ Otherwise the bottom edge goes to the scroll container when there is one to
223
+ take it.
189
224
 
190
225
  Applied to the frame, the bottom inset shrinks the scroll viewport, so content
191
226
  stops above a tab bar rather than passing beneath it — and on iOS that inset
@@ -193,24 +228,60 @@ const ScreenBase = forwardRef<ComponentRef<typeof View>, ScreenProps>(function S
193
228
  container reaches the same resting position by padding the end of its content
194
229
  instead, which is how the platform's own content-inset adjustment behaves.
195
230
  */
196
- const contentOwnsBottomInset = useMemo(
197
- () => edges.bottom && hasScrollContainerOwningBottom(children),
198
- [edges.bottom, children]
199
- );
231
+ const contentOwnsBottomInset = !platformAdjustsInsets && edges.bottom && hasVerticalScrollContainer;
200
232
  const frameEdges = useMemo(
201
- () => (contentOwnsBottomInset ? { ...edges, bottom: false } : edges),
202
- [contentOwnsBottomInset, edges]
233
+ () =>
234
+ platformAdjustsInsets
235
+ ? { ...edges, top: false, bottom: false }
236
+ : contentOwnsBottomInset
237
+ ? { ...edges, bottom: false }
238
+ : edges,
239
+ [platformAdjustsInsets, contentOwnsBottomInset, edges]
203
240
  );
204
241
  const { theme } = useUnistyles();
205
242
  const resolvedBackground = resolveThemeColor(background, theme) ?? theme.color["surface.canvas"];
243
+ /*
244
+ A plain object, not a Unistyles stylesheet, and the background belongs in it
245
+ rather than arriving later.
246
+
247
+ Unistyles applies a dynamic function's style after mount. UIKit resolves a
248
+ screen's scroll view once, while it is being presented, and a scroll area
249
+ that was not yet the size of the screen at that moment never drives the
250
+ navigation bar afterwards — the large title stays expanded for the rest of
251
+ the screen's life.
252
+ */
253
+ const rootStyle = useMemo(
254
+ () => ({ flex: 1, backgroundColor: resolvedBackground }) as const,
255
+ [resolvedBackground]
256
+ );
206
257
 
207
258
  return (
208
- <View ref={ref} style={[styles.container(resolvedBackground), style]} {...rest}>
259
+ /*
260
+ `collapsable={false}`, because a background colour alone is the worst of
261
+ both worlds here.
262
+
263
+ Fabric decides two things separately: whether a view is mounted at all, and
264
+ whether it *keeps* its children. A `View` with only layout styles is
265
+ dropped and its children are re-parented to its own parent — harmless. Give
266
+ it a background and it is mounted, but it still does not form a stacking
267
+ context, so the children are mounted *beside* it instead of inside it. The
268
+ screen's view then begins with an empty full-screen view, and UIKit — which
269
+ finds the scroll view by walking first subviews down from the view
270
+ controller (`RNSScrollViewFinder` mirrors the same walk) — reaches that dead
271
+ end and finds nothing. Measured on an iPhone 17: no content-inset
272
+ adjustment and no large-title collapse at all.
273
+
274
+ `collapsable={false}` forms the stacking context, so the frame, the safe
275
+ areas, and the scroll container stay in one unbroken first-subview chain.
276
+ */
277
+ <View collapsable={false} ref={ref} style={[rootStyle, style]} {...rest}>
209
278
  <ScreenScrollProvider
210
279
  background={resolvedBackground}
211
280
  contentPadding={resolvedMargins}
212
281
  safeArea={safeArea}
213
282
  contentOwnsBottomInset={contentOwnsBottomInset}
283
+ platformAdjustsInsets={platformAdjustsInsets}
284
+ platformInsetsEligible={platformInsetsEligible}
214
285
  hasHeader={hasHeader}
215
286
  >
216
287
  <ScreenHeaderAppearanceProvider>
@@ -247,10 +318,3 @@ ScreenBase.List = ScreenList;
247
318
  * ```
248
319
  */
249
320
  export const Screen = ScreenBase;
250
-
251
- const styles = StyleSheet.create(() => ({
252
- container: (backgroundColor: string) => ({
253
- flex: 1,
254
- backgroundColor,
255
- }),
256
- }));
@@ -37,6 +37,28 @@ export interface ScreenContextValue {
37
37
  * or a horizontal container needs.
38
38
  */
39
39
  contentOwnsBottomInset: boolean;
40
+ /**
41
+ * Whether the platform's own content-inset adjustment pays the vertical insets.
42
+ *
43
+ * True on an iOS screen with no `Screen.Header`: the navigation bar above such a
44
+ * screen is UIKit's, and only UIKit can inset a scroll view for one — a native
45
+ * large title resizes on every frame of its collapse, and it refuses to collapse
46
+ * at all for a scroll view that does not fill the screen. The frame therefore
47
+ * keeps no vertical edge, the container asks for
48
+ * `contentInsetAdjustmentBehavior: "automatic"` rather than `"never"`, and
49
+ * `contentOwnsBottomInset` stays false because UIKit pays that edge too.
50
+ */
51
+ platformAdjustsInsets: boolean;
52
+ /**
53
+ * Whether this screen *would* hand its vertical insets to the platform, if it
54
+ * found a vertical scroll container among its children.
55
+ *
56
+ * Everything `platformAdjustsInsets` needs except the container itself. The two
57
+ * differ only when the container is nested inside another component, where the
58
+ * root cannot see it — which is a mistake on such a screen, and the difference
59
+ * is how a mounting container detects that it was the one missed.
60
+ */
61
+ platformInsetsEligible: boolean;
40
62
  /** @deprecated Use contentPadding. */
41
63
  margins: ScreenContentPadding;
42
64
  /** Whether a `Screen.Header` is present. Used by scroll containers to add top inset. */
@@ -78,6 +100,10 @@ export interface ScreenScrollProviderProps {
78
100
  safeArea?: ScreenSafeArea;
79
101
  /** Whether the primary scroll container pads the bottom safe area. Default false. */
80
102
  contentOwnsBottomInset?: boolean;
103
+ /** Whether the platform adjusts the scroll container's vertical insets. Default false. */
104
+ platformAdjustsInsets?: boolean;
105
+ /** Whether the screen qualifies for that, container aside. Default false. */
106
+ platformInsetsEligible?: boolean;
81
107
  /** Whether a `Screen.Header` child is present. Default false. */
82
108
  hasHeader?: boolean;
83
109
 
@@ -95,6 +121,8 @@ export function ScreenScrollProvider({
95
121
  contentPadding = "all",
96
122
  safeArea = "auto",
97
123
  contentOwnsBottomInset = false,
124
+ platformAdjustsInsets = false,
125
+ platformInsetsEligible = false,
98
126
  hasHeader = false,
99
127
  }: ScreenScrollProviderProps) {
100
128
  const scrollY = useSharedValue(0);
@@ -123,6 +151,8 @@ export function ScreenScrollProvider({
123
151
  contentPadding,
124
152
  safeArea,
125
153
  contentOwnsBottomInset,
154
+ platformAdjustsInsets,
155
+ platformInsetsEligible,
126
156
  margins: contentPadding,
127
157
  hasHeader,
128
158
  scrollY,
@@ -137,6 +167,8 @@ export function ScreenScrollProvider({
137
167
  contentPadding,
138
168
  safeArea,
139
169
  contentOwnsBottomInset,
170
+ platformAdjustsInsets,
171
+ platformInsetsEligible,
140
172
  hasHeader,
141
173
  scrollY,
142
174
  headerCollapseHeight,
@@ -16,6 +16,7 @@ import { StyleSheet } from "react-native-unistyles";
16
16
 
17
17
  import { resolveScreenPadding } from "#theme/screen-padding";
18
18
  import { PortalHost } from "../portal";
19
+ import { useNestedContainerWarning } from "./hooks/use-nested-container-warning";
19
20
  import { useScreenRef } from "./hooks/use-screen-ref";
20
21
  import { useScreenScrollHandler } from "./hooks/use-screen-scroll-handler";
21
22
  import { ScreenBottomInset } from "./parts/ScreenBottomInset";
@@ -174,10 +175,12 @@ const ScreenListBase = forwardRef(function ScreenList(
174
175
  contentPadding: screenPadding,
175
176
  hasHeader,
176
177
  contentOwnsBottomInset,
178
+ platformAdjustsInsets,
177
179
  } = useScreen();
178
180
  // The root yields the bottom edge only to a vertical container, so a horizontal
179
181
  // one here is a secondary container and must not pay the inset a second time.
180
182
  const ownsBottomInset = contentOwnsBottomInset && !horizontal;
183
+ useNestedContainerWarning("Screen.List", horizontal);
181
184
  const mergedRef = useScreenRef(isDefaultFlatList ? scrollRef : undefined, ref);
182
185
  const resolvedPadding = contentPadding ?? margins ?? screenPadding;
183
186
  const resolvedLoading = isLoading ?? loading;
@@ -212,7 +215,12 @@ const ScreenListBase = forwardRef(function ScreenList(
212
215
  renderItem={renderItem}
213
216
  style={[{ backgroundColor: background }, style]}
214
217
  horizontal={horizontal}
215
- contentInsetAdjustmentBehavior="never"
218
+ /*
219
+ UIKit owns the vertical insets on a header-less iOS screen — see
220
+ `platformAdjustsInsets`. Everywhere else the frame has already paid them,
221
+ so a second adjustment here would count them twice.
222
+ */
223
+ contentInsetAdjustmentBehavior={platformAdjustsInsets ? "automatic" : "never"}
216
224
  automaticallyAdjustContentInsets={false}
217
225
  automaticallyAdjustsScrollIndicatorInsets={false}
218
226
  contentContainerStyle={[
@@ -6,6 +6,7 @@ import { StyleSheet } from "react-native-unistyles";
6
6
 
7
7
  import { resolveScreenPadding } from "#theme/screen-padding";
8
8
  import { PortalHost } from "../portal";
9
+ import { useNestedContainerWarning } from "./hooks/use-nested-container-warning";
9
10
  import { useScreenRef } from "./hooks/use-screen-ref";
10
11
  import { useScreenScrollHandler } from "./hooks/use-screen-scroll-handler";
11
12
  import { ScreenBottomInset } from "./parts/ScreenBottomInset";
@@ -72,10 +73,12 @@ export const ScreenScrollView = forwardRef<ComponentRef<typeof ScrollView>, Scre
72
73
  hasHeader,
73
74
  background,
74
75
  contentOwnsBottomInset,
76
+ platformAdjustsInsets,
75
77
  } = useScreen();
76
78
  // The root yields the bottom edge only to a vertical container, so a horizontal
77
79
  // one here is a secondary container and must not pay the inset a second time.
78
80
  const ownsBottomInset = contentOwnsBottomInset && !horizontal;
81
+ useNestedContainerWarning("Screen.ScrollView", horizontal);
79
82
  const resolvedPadding = contentPadding ?? margins ?? screenPadding;
80
83
  const mergedRef = useScreenRef(scrollRef, ref);
81
84
  const placeholder = renderScreenPlaceholder({
@@ -91,7 +94,12 @@ export const ScreenScrollView = forwardRef<ComponentRef<typeof ScrollView>, Scre
91
94
  ref={mergedRef}
92
95
  style={[{ backgroundColor: background }, style]}
93
96
  horizontal={horizontal}
94
- contentInsetAdjustmentBehavior="never"
97
+ /*
98
+ UIKit owns the vertical insets on a header-less iOS screen — see
99
+ `platformAdjustsInsets`. Everywhere else the frame has already paid
100
+ them, so a second adjustment here would count them twice.
101
+ */
102
+ contentInsetAdjustmentBehavior={platformAdjustsInsets ? "automatic" : "never"}
95
103
  automaticallyAdjustContentInsets={false}
96
104
  automaticallyAdjustsScrollIndicatorInsets={false}
97
105
  showsVerticalScrollIndicator={false}
@@ -0,0 +1,40 @@
1
+ import { useEffect } from "react";
2
+
3
+ import { useScreen } from "../ScreenContext";
4
+
5
+ /**
6
+ * Warns, in development, when this container is the one the screen root failed
7
+ * to find.
8
+ *
9
+ * The root inspects its own children and fragments but does not execute
10
+ * component children, so a container rendered inside one is invisible to it (see
11
+ * `hasScrollContainerOwningBottom`). On a header-less iOS screen that changes
12
+ * behaviour rather than just bookkeeping: the frame pads the top edge, the scroll
13
+ * view no longer fills the screen, and UIKit stops collapsing the native large
14
+ * title — silently, with the screen otherwise looking correct.
15
+ *
16
+ * The container is the only place that can tell. `platformInsetsEligible` says
17
+ * the screen qualified; a container mounting while `platformAdjustsInsets` is
18
+ * false says the root never saw it. Both true together mean exactly this mistake,
19
+ * so there is nothing here to false-positive on: a screen with no scroll
20
+ * container at all never runs this hook, and a deliberate `safeArea` opt-out is
21
+ * not eligible in the first place.
22
+ *
23
+ * @param container Name to report, e.g. `"Screen.List"`.
24
+ * @param horizontal Whether this container scrolls horizontally; those are never
25
+ * candidates for the vertical insets and never warn.
26
+ */
27
+ export function useNestedContainerWarning(container: string, horizontal: boolean): void {
28
+ const { platformAdjustsInsets, platformInsetsEligible } = useScreen();
29
+ const isNested = platformInsetsEligible && !platformAdjustsInsets && !horizontal;
30
+
31
+ useEffect(() => {
32
+ if (!__DEV__ || !isNested) return;
33
+ console.warn(
34
+ `[react-native-terra-ui] ${container} is nested inside another component, so its Screen could not find it. ` +
35
+ "On iOS a Screen with no Screen.Header hands its vertical insets to UIKit, but only when the scroll " +
36
+ "container is among its own children — nested, the frame pads the top instead and a native large title " +
37
+ `will not collapse. Render ${container} as a direct child of Screen; fragments are fine.`
38
+ );
39
+ }, [container, isNested]);
40
+ }
@@ -19,7 +19,14 @@ export function ScreenFrame({ children, edges }: PropsWithChildren<{ edges: Scre
19
19
  return (
20
20
  <>
21
21
  <ScreenSafeArea edges={edges}>
22
- <View style={styles.content} onLayout={onLayout}>
22
+ {/*
23
+ `collapsable={false}` for the same reason as the `Screen` root: whatever
24
+ Fabric decides about this view, its children have to stay inside it.
25
+ UIKit finds a screen's scroll view by walking first subviews down from
26
+ the view controller, and a mounted-but-childless view in that chain is a
27
+ dead end — the large title then never collapses.
28
+ */}
29
+ <View collapsable={false} style={styles.content} onLayout={onLayout}>
23
30
  {children}
24
31
  </View>
25
32
  </ScreenSafeArea>