@12-apps/ui 6.74.1 → 6.75.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. package/NATIVE.md +1 -1
  2. package/dist/_internal/components/index.js +4 -4
  3. package/dist/_internal/components/layout/Drawer/Drawer.js +1 -1
  4. package/dist/_internal/components/layout/index.js +1 -1
  5. package/dist/_internal/components/navigation/SectionNav/SectionNav.bar.js +3 -3
  6. package/dist/_internal/components/navigation/SectionNav/SectionNav.js +4 -4
  7. package/dist/_internal/components/navigation/SectionNav/SectionNav.sheet.js +2 -2
  8. package/dist/_internal/components/navigation/index.js +4 -4
  9. package/dist/{chunk-27F2VXS4.js → chunk-7IXXASQ6.js} +2 -2
  10. package/dist/{chunk-UALPKKAY.js → chunk-F742IMLQ.js} +5 -2
  11. package/dist/{chunk-UALPKKAY.js.map → chunk-F742IMLQ.js.map} +1 -1
  12. package/dist/{chunk-NM46HQSW.js → chunk-J26ZWYQI.js} +2 -2
  13. package/dist/{chunk-URSYEHPU.js → chunk-PMRLFNBT.js} +2 -2
  14. package/dist/layout/Drawer.js +1 -1
  15. package/dist/native/layout/Screen.js +4 -1
  16. package/dist/native/layout/Screen.js.map +1 -1
  17. package/dist/navigation/SectionNav.js +4 -4
  18. package/dist/types/components/layout/Drawer/Drawer.d.ts.map +1 -1
  19. package/dist/types-native/components/layout/Screen/Screen.native.d.ts.map +1 -1
  20. package/package.json +1 -1
  21. package/src/components/layout/Drawer/Drawer.tsx +4 -1
  22. package/src/components/layout/Screen/Screen.md +3 -1
  23. package/src/components/layout/Screen/Screen.native.tsx +11 -1
  24. /package/dist/{chunk-27F2VXS4.js.map → chunk-7IXXASQ6.js.map} +0 -0
  25. /package/dist/{chunk-NM46HQSW.js.map → chunk-J26ZWYQI.js.map} +0 -0
  26. /package/dist/{chunk-URSYEHPU.js.map → chunk-PMRLFNBT.js.map} +0 -0
package/NATIVE.md CHANGED
@@ -113,5 +113,5 @@ Ported: **28 of 149** public subpaths carry a `react-native` condition.
113
113
  | `@12-apps/ui/typography/Heading` | 26 | 1 | `gradient` paints the gradient's first stop as a flat colour: React Native has no `background-clip: text` and no gradient fill in core. A host wanting the real thing adds a masked-gradient library. |
114
114
  | `@12-apps/ui/typography/Paragraph` | 17 | 1 | — |
115
115
  | `@12-apps/ui/typography/Text` | 26 | 3 | — |
116
- | `@12-apps/ui/layout/Screen` | 10 | 0 | Keyboard geometry uses React Native KeyboardAvoidingView; react-native-web unit/story lanes verify its wiring, not a real Android/iOS keyboard. Device keyboard/rotation QA remains explicit.; Web safe-area values come from CSS environment variables; native values come from the existing navigator or an internal safe-area provider. Browser keyboard resizing remains browser-managed. |
116
+ | `@12-apps/ui/layout/Screen` | 11 | 0 | Keyboard geometry uses React Native KeyboardAvoidingView; react-native-web unit/story lanes verify its wiring, not a real Android/iOS keyboard. Device keyboard/rotation QA remains explicit.; Web safe-area values come from CSS environment variables; native values come from the existing navigator or an internal safe-area provider. Browser keyboard resizing remains browser-managed. |
117
117
  <!-- native-parity:end -->
@@ -130,13 +130,13 @@ import "../../chunk-3AIRFAI3.js";
130
130
  import "../../chunk-R26KYJHK.js";
131
131
  import {
132
132
  SectionNav
133
- } from "../../chunk-27F2VXS4.js";
133
+ } from "../../chunk-7IXXASQ6.js";
134
134
  import "../../chunk-SNWCT6JN.js";
135
135
  import "../../chunk-ILJ3FXIC.js";
136
136
  import {
137
137
  sectionNavBarInset
138
- } from "../../chunk-URSYEHPU.js";
139
- import "../../chunk-NM46HQSW.js";
138
+ } from "../../chunk-PMRLFNBT.js";
139
+ import "../../chunk-J26ZWYQI.js";
140
140
  import {
141
141
  RaisedActionButton
142
142
  } from "../../chunk-UKUGSU3Y.js";
@@ -201,7 +201,7 @@ import {
201
201
  Drawer,
202
202
  DrawerContent,
203
203
  DrawerHeader
204
- } from "../../chunk-UALPKKAY.js";
204
+ } from "../../chunk-F742IMLQ.js";
205
205
  import "../../chunk-ENORM6S2.js";
206
206
  import {
207
207
  Resizable
@@ -2,7 +2,7 @@ import {
2
2
  Drawer,
3
3
  DrawerContent,
4
4
  DrawerHeader
5
- } from "../../../../chunk-UALPKKAY.js";
5
+ } from "../../../../chunk-F742IMLQ.js";
6
6
  import "../../../../chunk-XJAD6E3V.js";
7
7
  import "../../../../chunk-F5H2ZXST.js";
8
8
  import "../../../../chunk-N3GAFIXG.js";
@@ -58,7 +58,7 @@ import {
58
58
  Drawer,
59
59
  DrawerContent,
60
60
  DrawerHeader
61
- } from "../../../chunk-UALPKKAY.js";
61
+ } from "../../../chunk-F742IMLQ.js";
62
62
  import "../../../chunk-ENORM6S2.js";
63
63
  import {
64
64
  Resizable
@@ -2,13 +2,13 @@ import {
2
2
  SectionNavBar,
3
3
  sectionNavBarInset,
4
4
  sectionNavSheetOffset
5
- } from "../../../../chunk-URSYEHPU.js";
6
- import "../../../../chunk-NM46HQSW.js";
5
+ } from "../../../../chunk-PMRLFNBT.js";
6
+ import "../../../../chunk-J26ZWYQI.js";
7
7
  import "../../../../chunk-UKUGSU3Y.js";
8
8
  import "../../../../chunk-24HHUCWB.js";
9
9
  import "../../../../chunk-YCCWJ5XQ.js";
10
10
  import "../../../../chunk-TMSWLFL4.js";
11
- import "../../../../chunk-UALPKKAY.js";
11
+ import "../../../../chunk-F742IMLQ.js";
12
12
  import "../../../../chunk-PUFA7FQ7.js";
13
13
  import "../../../../chunk-5AK2EZG5.js";
14
14
  import "../../../../chunk-N5PVD4J5.js";
@@ -1,15 +1,15 @@
1
1
  import {
2
2
  SectionNav
3
- } from "../../../../chunk-27F2VXS4.js";
3
+ } from "../../../../chunk-7IXXASQ6.js";
4
4
  import "../../../../chunk-SNWCT6JN.js";
5
5
  import "../../../../chunk-ILJ3FXIC.js";
6
- import "../../../../chunk-URSYEHPU.js";
7
- import "../../../../chunk-NM46HQSW.js";
6
+ import "../../../../chunk-PMRLFNBT.js";
7
+ import "../../../../chunk-J26ZWYQI.js";
8
8
  import "../../../../chunk-UKUGSU3Y.js";
9
9
  import "../../../../chunk-24HHUCWB.js";
10
10
  import "../../../../chunk-YCCWJ5XQ.js";
11
11
  import "../../../../chunk-TMSWLFL4.js";
12
- import "../../../../chunk-UALPKKAY.js";
12
+ import "../../../../chunk-F742IMLQ.js";
13
13
  import "../../../../chunk-PUFA7FQ7.js";
14
14
  import "../../../../chunk-5AK2EZG5.js";
15
15
  import "../../../../chunk-N5PVD4J5.js";
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  SectionNavSheet
3
- } from "../../../../chunk-NM46HQSW.js";
3
+ } from "../../../../chunk-J26ZWYQI.js";
4
4
  import "../../../../chunk-24HHUCWB.js";
5
5
  import "../../../../chunk-YCCWJ5XQ.js";
6
6
  import "../../../../chunk-TMSWLFL4.js";
7
- import "../../../../chunk-UALPKKAY.js";
7
+ import "../../../../chunk-F742IMLQ.js";
8
8
  import "../../../../chunk-PUFA7FQ7.js";
9
9
  import "../../../../chunk-5AK2EZG5.js";
10
10
  import "../../../../chunk-N5PVD4J5.js";
@@ -54,20 +54,20 @@ import "../../../chunk-3AIRFAI3.js";
54
54
  import "../../../chunk-R26KYJHK.js";
55
55
  import {
56
56
  SectionNav
57
- } from "../../../chunk-27F2VXS4.js";
57
+ } from "../../../chunk-7IXXASQ6.js";
58
58
  import "../../../chunk-SNWCT6JN.js";
59
59
  import "../../../chunk-ILJ3FXIC.js";
60
60
  import {
61
61
  sectionNavBarInset
62
- } from "../../../chunk-URSYEHPU.js";
63
- import "../../../chunk-NM46HQSW.js";
62
+ } from "../../../chunk-PMRLFNBT.js";
63
+ import "../../../chunk-J26ZWYQI.js";
64
64
  import {
65
65
  RaisedActionButton
66
66
  } from "../../../chunk-UKUGSU3Y.js";
67
67
  import "../../../chunk-24HHUCWB.js";
68
68
  import "../../../chunk-YCCWJ5XQ.js";
69
69
  import "../../../chunk-TMSWLFL4.js";
70
- import "../../../chunk-UALPKKAY.js";
70
+ import "../../../chunk-F742IMLQ.js";
71
71
  import "../../../chunk-7K23NEZO.js";
72
72
  import "../../../chunk-5MMAV7XK.js";
73
73
  import "../../../chunk-3ROCD7XF.js";
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-SNWCT6JN.js";
4
4
  import {
5
5
  SectionNavBar
6
- } from "./chunk-URSYEHPU.js";
6
+ } from "./chunk-PMRLFNBT.js";
7
7
 
8
8
  // src/components/navigation/SectionNav/SectionNav.tsx
9
9
  import { jsx } from "react/jsx-runtime";
@@ -55,4 +55,4 @@ function SectionNav({
55
55
  export {
56
56
  SectionNav
57
57
  };
58
- //# sourceMappingURL=chunk-27F2VXS4.js.map
58
+ //# sourceMappingURL=chunk-7IXXASQ6.js.map
@@ -122,7 +122,10 @@ var DrawerHeader = ({
122
122
  sx: {
123
123
  display: "flex",
124
124
  alignItems: "center",
125
- padding: theme.spacing(2),
125
+ // 12px above and below: the close button is 40px tall, so the header lands on
126
+ // its own 64px minimum instead of 72 — the height of the page header beside
127
+ // a docked drawer (FUT-3476).
128
+ padding: theme.spacing(1.5, 2),
126
129
  borderBottom: `1px solid ${theme.palette.divider}`,
127
130
  minHeight: rem(theme, 64),
128
131
  justifyContent: "space-between"
@@ -164,4 +167,4 @@ export {
164
167
  DrawerHeader,
165
168
  DrawerContent
166
169
  };
167
- //# sourceMappingURL=chunk-UALPKKAY.js.map
170
+ //# sourceMappingURL=chunk-F742IMLQ.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/layout/Drawer/Drawer.tsx"],"sourcesContent":["import Close from '@mui/icons-material/Close';\nimport type { Theme } from '@mui/material/styles/index.js';\nimport Box from '@mui/material/Box/index.js';\nimport MuiDrawer from '@mui/material/Drawer/index.js';\nimport IconButton from '@mui/material/IconButton/index.js';\nimport Typography from '@mui/material/Typography/index.js';\nimport { alpha, useTheme } from '@mui/material/styles/index.js';\nimport React from 'react';\n\nimport type { DrawerContentProps,DrawerHeaderProps, DrawerProps } from './Drawer.types';\nimport { shadowInk } from '../../../tokens/ink';\nimport { rem, rems } from '../../../tokens/relative';\n\ntype DrawerAnchor = 'left' | 'right' | 'top' | 'bottom';\n\n/**\n * A `width`/`height` prop as CSS. `sx` reads a number of 1 or less as a\n * fraction of the parent, and that stays so; any other number is design px,\n * through the type scale; a string is as given.\n */\nconst drawerLength = (theme: Theme, value: number | string | undefined): string | undefined => {\n if (typeof value !== 'number') return value;\n return value <= 1 && value !== 0 ? `${value * 100}%` : rem(theme, value);\n};\n\n// `variant` doubles as a position preset, but an explicit `anchor` always wins.\nconst resolveAnchor = (\n anchor: DrawerProps['anchor'],\n variant: DrawerProps['variant'],\n): DrawerAnchor => {\n if (anchor) return anchor;\n\n // Map variant to anchor position\n switch (variant) {\n case 'right':\n return 'right';\n case 'top':\n return 'top';\n case 'bottom':\n return 'bottom';\n case 'glass':\n return 'right';\n case 'left':\n default:\n return 'left';\n }\n};\n\nconst buildDrawerStyles = (\n theme: Theme,\n anchor: DrawerAnchor,\n variant: DrawerProps['variant'],\n width: DrawerProps['width'],\n height: DrawerProps['height'],\n // Merged LAST into the surface's own rules, so a caller can shape the sliding\n // surface itself (rounded corners on a bottom sheet, a docked panel's offset)\n // without reaching for the MUI paper class from outside. Undefined by default:\n // omit it and the drawer styles exactly as it always has.\n paperSx?: DrawerProps['paperSx'],\n) => {\n const widthCss = drawerLength(theme, width);\n const heightCss = drawerLength(theme, height);\n const baseStyles = {\n width: ['left', 'right'].includes(anchor) ? widthCss : '100%',\n height: ['top', 'bottom'].includes(anchor) ? heightCss : '100%',\n flexShrink: 0,\n };\n\n if (variant === 'glass') {\n return {\n ...baseStyles,\n '& .MuiDrawer-paper': {\n width: widthCss,\n height: '100%',\n backgroundColor: alpha(theme.palette.background.paper, 0.1),\n backdropFilter: `blur(${rem(theme, 20)})`,\n border: `1px solid ${alpha(theme.palette.primary.main, 0.2)}`,\n boxShadow: `${rems(theme, 0, 8, 32)} ${shadowInk(theme, 0.1)}`,\n ...paperSx,\n },\n };\n }\n\n return {\n ...baseStyles,\n '& .MuiDrawer-paper': {\n width: ['left', 'right'].includes(anchor) ? widthCss : '100%',\n height: ['top', 'bottom'].includes(anchor) ? heightCss : '100%',\n boxSizing: 'border-box',\n ...paperSx,\n },\n };\n};\n\nexport const Drawer: React.FC<DrawerProps> = ({\n children,\n open,\n onClose,\n variant = 'left',\n anchor,\n width,\n height = '100%',\n persistent = false,\n backdrop = true,\n hideBackdrop = false,\n keepMounted = false,\n paperSx,\n className,\n dataTestId,\n ...rest\n}) => {\n const theme = useTheme();\n const drawerAnchor = resolveAnchor(anchor, variant);\n\n return (\n <MuiDrawer\n anchor={drawerAnchor}\n open={open}\n onClose={onClose}\n variant={persistent ? 'persistent' : 'temporary'}\n ModalProps={{\n keepMounted,\n hideBackdrop,\n BackdropProps: {\n invisible: !backdrop,\n },\n }}\n sx={buildDrawerStyles(theme, drawerAnchor, variant, width ?? 280, height, paperSx)}\n className={className}\n data-testid={dataTestId || 'drawer'}\n {...rest}\n >\n {children}\n </MuiDrawer>\n );\n};\n\nexport const DrawerHeader: React.FC<DrawerHeaderProps> = ({\n children,\n onClose,\n showCloseButton = true,\n closeLabel,\n dataTestId,\n}) => {\n const theme = useTheme();\n\n return (\n <Box\n data-testid={dataTestId || 'drawer-header'}\n sx={{\n display: 'flex',\n alignItems: 'center',\n padding: theme.spacing(2),\n borderBottom: `1px solid ${theme.palette.divider}`,\n minHeight: rem(theme, 64),\n justifyContent: 'space-between',\n }}\n >\n <Box sx={{ flex: 1 }} data-testid={dataTestId ? `${dataTestId}-title` : 'drawer-title'}>\n {typeof children === 'string' ? <Typography variant=\"h6\">{children}</Typography> : children}\n </Box>\n {showCloseButton && onClose && (\n <IconButton\n onClick={onClose}\n edge=\"end\"\n aria-label={closeLabel ?? 'Close drawer'}\n data-testid={dataTestId ? `${dataTestId}-close` : 'drawer-close'}\n >\n <Close />\n </IconButton>\n )}\n </Box>\n );\n};\n\nexport const DrawerContent: React.FC<DrawerContentProps> = ({ children, padding = true, dataTestId }) => {\n const theme = useTheme();\n\n return (\n <Box\n data-testid={dataTestId || 'drawer-content'}\n sx={{\n flex: 1,\n overflow: 'auto',\n padding: padding ? theme.spacing(2) : 0,\n }}\n >\n {children}\n </Box>\n );\n};\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/components/layout/Drawer/Drawer.tsx"],"sourcesContent":["import Close from '@mui/icons-material/Close';\nimport type { Theme } from '@mui/material/styles/index.js';\nimport Box from '@mui/material/Box/index.js';\nimport MuiDrawer from '@mui/material/Drawer/index.js';\nimport IconButton from '@mui/material/IconButton/index.js';\nimport Typography from '@mui/material/Typography/index.js';\nimport { alpha, useTheme } from '@mui/material/styles/index.js';\nimport React from 'react';\n\nimport type { DrawerContentProps,DrawerHeaderProps, DrawerProps } from './Drawer.types';\nimport { shadowInk } from '../../../tokens/ink';\nimport { rem, rems } from '../../../tokens/relative';\n\ntype DrawerAnchor = 'left' | 'right' | 'top' | 'bottom';\n\n/**\n * A `width`/`height` prop as CSS. `sx` reads a number of 1 or less as a\n * fraction of the parent, and that stays so; any other number is design px,\n * through the type scale; a string is as given.\n */\nconst drawerLength = (theme: Theme, value: number | string | undefined): string | undefined => {\n if (typeof value !== 'number') return value;\n return value <= 1 && value !== 0 ? `${value * 100}%` : rem(theme, value);\n};\n\n// `variant` doubles as a position preset, but an explicit `anchor` always wins.\nconst resolveAnchor = (\n anchor: DrawerProps['anchor'],\n variant: DrawerProps['variant'],\n): DrawerAnchor => {\n if (anchor) return anchor;\n\n // Map variant to anchor position\n switch (variant) {\n case 'right':\n return 'right';\n case 'top':\n return 'top';\n case 'bottom':\n return 'bottom';\n case 'glass':\n return 'right';\n case 'left':\n default:\n return 'left';\n }\n};\n\nconst buildDrawerStyles = (\n theme: Theme,\n anchor: DrawerAnchor,\n variant: DrawerProps['variant'],\n width: DrawerProps['width'],\n height: DrawerProps['height'],\n // Merged LAST into the surface's own rules, so a caller can shape the sliding\n // surface itself (rounded corners on a bottom sheet, a docked panel's offset)\n // without reaching for the MUI paper class from outside. Undefined by default:\n // omit it and the drawer styles exactly as it always has.\n paperSx?: DrawerProps['paperSx'],\n) => {\n const widthCss = drawerLength(theme, width);\n const heightCss = drawerLength(theme, height);\n const baseStyles = {\n width: ['left', 'right'].includes(anchor) ? widthCss : '100%',\n height: ['top', 'bottom'].includes(anchor) ? heightCss : '100%',\n flexShrink: 0,\n };\n\n if (variant === 'glass') {\n return {\n ...baseStyles,\n '& .MuiDrawer-paper': {\n width: widthCss,\n height: '100%',\n backgroundColor: alpha(theme.palette.background.paper, 0.1),\n backdropFilter: `blur(${rem(theme, 20)})`,\n border: `1px solid ${alpha(theme.palette.primary.main, 0.2)}`,\n boxShadow: `${rems(theme, 0, 8, 32)} ${shadowInk(theme, 0.1)}`,\n ...paperSx,\n },\n };\n }\n\n return {\n ...baseStyles,\n '& .MuiDrawer-paper': {\n width: ['left', 'right'].includes(anchor) ? widthCss : '100%',\n height: ['top', 'bottom'].includes(anchor) ? heightCss : '100%',\n boxSizing: 'border-box',\n ...paperSx,\n },\n };\n};\n\nexport const Drawer: React.FC<DrawerProps> = ({\n children,\n open,\n onClose,\n variant = 'left',\n anchor,\n width,\n height = '100%',\n persistent = false,\n backdrop = true,\n hideBackdrop = false,\n keepMounted = false,\n paperSx,\n className,\n dataTestId,\n ...rest\n}) => {\n const theme = useTheme();\n const drawerAnchor = resolveAnchor(anchor, variant);\n\n return (\n <MuiDrawer\n anchor={drawerAnchor}\n open={open}\n onClose={onClose}\n variant={persistent ? 'persistent' : 'temporary'}\n ModalProps={{\n keepMounted,\n hideBackdrop,\n BackdropProps: {\n invisible: !backdrop,\n },\n }}\n sx={buildDrawerStyles(theme, drawerAnchor, variant, width ?? 280, height, paperSx)}\n className={className}\n data-testid={dataTestId || 'drawer'}\n {...rest}\n >\n {children}\n </MuiDrawer>\n );\n};\n\nexport const DrawerHeader: React.FC<DrawerHeaderProps> = ({\n children,\n onClose,\n showCloseButton = true,\n closeLabel,\n dataTestId,\n}) => {\n const theme = useTheme();\n\n return (\n <Box\n data-testid={dataTestId || 'drawer-header'}\n sx={{\n display: 'flex',\n alignItems: 'center',\n // 12px above and below: the close button is 40px tall, so the header lands on\n // its own 64px minimum instead of 72 — the height of the page header beside\n // a docked drawer (FUT-3476).\n padding: theme.spacing(1.5, 2),\n borderBottom: `1px solid ${theme.palette.divider}`,\n minHeight: rem(theme, 64),\n justifyContent: 'space-between',\n }}\n >\n <Box sx={{ flex: 1 }} data-testid={dataTestId ? `${dataTestId}-title` : 'drawer-title'}>\n {typeof children === 'string' ? <Typography variant=\"h6\">{children}</Typography> : children}\n </Box>\n {showCloseButton && onClose && (\n <IconButton\n onClick={onClose}\n edge=\"end\"\n aria-label={closeLabel ?? 'Close drawer'}\n data-testid={dataTestId ? `${dataTestId}-close` : 'drawer-close'}\n >\n <Close />\n </IconButton>\n )}\n </Box>\n );\n};\n\nexport const DrawerContent: React.FC<DrawerContentProps> = ({ children, padding = true, dataTestId }) => {\n const theme = useTheme();\n\n return (\n <Box\n data-testid={dataTestId || 'drawer-content'}\n sx={{\n flex: 1,\n overflow: 'auto',\n padding: padding ? theme.spacing(2) : 0,\n }}\n >\n {children}\n </Box>\n );\n};\n"],"mappings":"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","names":[]}
@@ -9,7 +9,7 @@ import {
9
9
  Drawer,
10
10
  DrawerContent,
11
11
  DrawerHeader
12
- } from "./chunk-UALPKKAY.js";
12
+ } from "./chunk-F742IMLQ.js";
13
13
  import {
14
14
  rem
15
15
  } from "./chunk-YKCAJ2TN.js";
@@ -175,4 +175,4 @@ function SectionNavSheet({
175
175
  export {
176
176
  SectionNavSheet
177
177
  };
178
- //# sourceMappingURL=chunk-NM46HQSW.js.map
178
+ //# sourceMappingURL=chunk-J26ZWYQI.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  SectionNavSheet
3
- } from "./chunk-NM46HQSW.js";
3
+ } from "./chunk-J26ZWYQI.js";
4
4
  import {
5
5
  RaisedActionButton,
6
6
  raisedLift
@@ -327,4 +327,4 @@ export {
327
327
  sectionNavSheetOffset,
328
328
  SectionNavBar
329
329
  };
330
- //# sourceMappingURL=chunk-URSYEHPU.js.map
330
+ //# sourceMappingURL=chunk-PMRLFNBT.js.map
@@ -3,7 +3,7 @@ import {
3
3
  Drawer,
4
4
  DrawerContent,
5
5
  DrawerHeader
6
- } from "../chunk-UALPKKAY.js";
6
+ } from "../chunk-F742IMLQ.js";
7
7
  import "../chunk-XJAD6E3V.js";
8
8
  import "../chunk-F5H2ZXST.js";
9
9
  import "../chunk-N3GAFIXG.js";
@@ -25,6 +25,9 @@ function keyboardBehavior(enabled) {
25
25
  if (!enabled) return void 0;
26
26
  return Platform.OS === "ios" ? "padding" : "height";
27
27
  }
28
+ function keyboardDismissMode() {
29
+ return Platform.OS === "web" ? "none" : "on-drag";
30
+ }
28
31
  function ScreenBoundary({ children }) {
29
32
  const insets = React.useContext(SafeAreaInsetsContext);
30
33
  return insets === null ? /* @__PURE__ */ jsx(SafeAreaProvider, { style: styles.fill, children }) : /* @__PURE__ */ jsx(Fragment, { children });
@@ -56,7 +59,7 @@ var Screen = React.forwardRef(({
56
59
  ScrollView,
57
60
  {
58
61
  keyboardShouldPersistTaps: "handled",
59
- keyboardDismissMode: "on-drag",
62
+ keyboardDismissMode: keyboardDismissMode(),
60
63
  ...scrollViewProps,
61
64
  testID: scrollViewProps?.testID ?? (testID ? `${testID}-viewport` : void 0),
62
65
  style: styles.fill,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/layout/Screen/Screen.native.tsx","../../../src/components/layout/Screen/Screen.base.ts"],"sourcesContent":["import * as React from 'react';\nimport { KeyboardAvoidingView, Platform, ScrollView, StyleSheet, View } from 'react-native';\nimport { SafeAreaInsetsContext, SafeAreaProvider, SafeAreaView } from 'react-native-safe-area-context';\n\nimport { SCREEN_EDGES } from './Screen.base';\nimport type { ScreenProps } from './Screen.types.native';\nimport { resolveBoxLayout, splitBoxProps } from '../Box/box-layout';\nimport { resolveTestId } from '../../../platform/test-id';\nimport { useUiTheme } from '../../../provider/use-ui-theme.native';\n\nconst styles = StyleSheet.create({ fill: { flex: 1 }, content: { flexGrow: 1 } });\n\nfunction keyboardBehavior(enabled: boolean): 'padding' | 'height' | undefined {\n if (!enabled) return undefined;\n return Platform.OS === 'ios' ? 'padding' : 'height';\n}\n\n/** Reuse a navigator's context, or own one outside the scrolling view. */\nfunction ScreenBoundary({ children }: { children: React.ReactNode }): React.JSX.Element {\n const insets = React.useContext(SafeAreaInsetsContext);\n return insets === null\n ? <SafeAreaProvider style={styles.fill}>{children}</SafeAreaProvider>\n : <>{children}</>;\n}\n\nexport const Screen = React.forwardRef<View, ScreenProps>(({\n children, scroll = true, safeAreaEdges = SCREEN_EDGES,\n keyboardAvoiding = true, keyboardVerticalOffset = 0, bg = 'default',\n style, contentContainerStyle, scrollViewProps, ...props\n}, ref) => {\n const theme = useUiTheme();\n const { layout, rest } = splitBoxProps(props);\n const testID = resolveTestId(layout);\n const contentStyle = [styles.content, resolveBoxLayout({ ...layout, direction: 'column' }, theme), contentContainerStyle];\n return (\n <ScreenBoundary>\n <View ref={ref} testID={testID} {...rest} style={[styles.fill, resolveBoxLayout({ bg }, theme), style]}>\n <SafeAreaView edges={safeAreaEdges} style={styles.fill}>\n <KeyboardAvoidingView style={styles.fill} enabled={keyboardAvoiding}\n behavior={keyboardBehavior(keyboardAvoiding)} keyboardVerticalOffset={keyboardVerticalOffset}>\n {scroll ? (\n <ScrollView keyboardShouldPersistTaps=\"handled\" keyboardDismissMode=\"on-drag\" {...scrollViewProps}\n testID={scrollViewProps?.testID ?? (testID ? `${testID}-viewport` : undefined)}\n style={styles.fill} contentContainerStyle={contentStyle}\n horizontal={false} automaticallyAdjustKeyboardInsets={false}\n automaticallyAdjustContentInsets={false} contentInsetAdjustmentBehavior=\"never\">\n {children}\n </ScrollView>\n ) : <View style={[styles.fill, contentStyle]}>{children}</View>}\n </KeyboardAvoidingView>\n </SafeAreaView>\n </View>\n </ScreenBoundary>\n );\n});\nScreen.displayName = 'Screen';\n","import type { BoxBaseProps } from '../Box/Box.base';\n\n/** Physical screen edges, independent of a native dependency. */\nexport type ScreenEdge = 'top' | 'right' | 'bottom' | 'left';\nexport const SCREEN_EDGES: readonly ScreenEdge[] = ['top', 'right', 'bottom', 'left'];\n\n/** Padding and gap apply to the content, inside the selected safe-area edges. */\nexport interface ScreenBaseProps extends Pick<\n BoxBaseProps,\n 'children' | 'p' | 'px' | 'py' | 'pt' | 'pr' | 'pb' | 'pl' | 'gap' | 'bg' | 'testID' | 'dataTestId'\n> {\n /** Vertical scrolling; turn off when a child owns scrolling. Default true. */\n scroll?: boolean;\n /** Omit bottom when a navigator's tab bar already owns that inset. */\n safeAreaEdges?: readonly ScreenEdge[];\n /** Lift the native viewport above the soft keyboard. Default true. */\n keyboardAvoiding?: boolean;\n /** Native distance from the window top to the screen's parent, in dp. */\n keyboardVerticalOffset?: number;\n}\n"],"mappings":";;;;;;;;;;;;;AAAA,YAAY,WAAW;AACvB,SAAS,sBAAsB,UAAU,YAAY,YAAY,YAAY;AAC7E,SAAS,uBAAuB,kBAAkB,oBAAoB;;;ACE/D,IAAM,eAAsC,CAAC,OAAO,SAAS,UAAU,MAAM;;;ADiB9E,SACA,UADA;AAXN,IAAM,SAAS,WAAW,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,UAAU,EAAE,EAAE,CAAC;AAEhF,SAAS,iBAAiB,SAAoD;AAC5E,MAAI,CAAC,QAAS,QAAO;AACrB,SAAO,SAAS,OAAO,QAAQ,YAAY;AAC7C;AAGA,SAAS,eAAe,EAAE,SAAS,GAAqD;AACtF,QAAM,SAAe,iBAAW,qBAAqB;AACrD,SAAO,WAAW,OACd,oBAAC,oBAAiB,OAAO,OAAO,MAAO,UAAS,IAChD,gCAAG,UAAS;AAClB;AAEO,IAAM,SAAe,iBAA8B,CAAC;AAAA,EACzD;AAAA,EAAU,SAAS;AAAA,EAAM,gBAAgB;AAAA,EACzC,mBAAmB;AAAA,EAAM,yBAAyB;AAAA,EAAG,KAAK;AAAA,EAC1D;AAAA,EAAO;AAAA,EAAuB;AAAA,EAAiB,GAAG;AACpD,GAAG,QAAQ;AACT,QAAM,QAAQ,WAAW;AACzB,QAAM,EAAE,QAAQ,KAAK,IAAI,cAAc,KAAK;AAC5C,QAAM,SAAS,cAAc,MAAM;AACnC,QAAM,eAAe,CAAC,OAAO,SAAS,iBAAiB,EAAE,GAAG,QAAQ,WAAW,SAAS,GAAG,KAAK,GAAG,qBAAqB;AACxH,SACE,oBAAC,kBACC,8BAAC,QAAK,KAAU,QAAiB,GAAG,MAAM,OAAO,CAAC,OAAO,MAAM,iBAAiB,EAAE,GAAG,GAAG,KAAK,GAAG,KAAK,GACnG,8BAAC,gBAAa,OAAO,eAAe,OAAO,OAAO,MAChD;AAAA,IAAC;AAAA;AAAA,MAAqB,OAAO,OAAO;AAAA,MAAM,SAAS;AAAA,MACjD,UAAU,iBAAiB,gBAAgB;AAAA,MAAG;AAAA,MAC7C,mBACC;AAAA,QAAC;AAAA;AAAA,UAAW,2BAA0B;AAAA,UAAU,qBAAoB;AAAA,UAAW,GAAG;AAAA,UAChF,QAAQ,iBAAiB,WAAW,SAAS,GAAG,MAAM,cAAc;AAAA,UACpE,OAAO,OAAO;AAAA,UAAM,uBAAuB;AAAA,UAC3C,YAAY;AAAA,UAAO,mCAAmC;AAAA,UACtD,kCAAkC;AAAA,UAAO,gCAA+B;AAAA,UACvE;AAAA;AAAA,MACH,IACE,oBAAC,QAAK,OAAO,CAAC,OAAO,MAAM,YAAY,GAAI,UAAS;AAAA;AAAA,EAC1D,GACF,GACF,GACF;AAEJ,CAAC;AACD,OAAO,cAAc;","names":[]}
1
+ {"version":3,"sources":["../../../src/components/layout/Screen/Screen.native.tsx","../../../src/components/layout/Screen/Screen.base.ts"],"sourcesContent":["import * as React from 'react';\nimport { KeyboardAvoidingView, Platform, ScrollView, StyleSheet, View } from 'react-native';\nimport { SafeAreaInsetsContext, SafeAreaProvider, SafeAreaView } from 'react-native-safe-area-context';\n\nimport { SCREEN_EDGES } from './Screen.base';\nimport type { ScreenProps } from './Screen.types.native';\nimport { resolveBoxLayout, splitBoxProps } from '../Box/box-layout';\nimport { resolveTestId } from '../../../platform/test-id';\nimport { useUiTheme } from '../../../provider/use-ui-theme.native';\n\nconst styles = StyleSheet.create({ fill: { flex: 1 }, content: { flexGrow: 1 } });\n\nfunction keyboardBehavior(enabled: boolean): 'padding' | 'height' | undefined {\n if (!enabled) return undefined;\n return Platform.OS === 'ios' ? 'padding' : 'height';\n}\n\n/**\n * Drag-to-dismiss on a device only. react-native-web runs `dismissKeyboard()`\n * on EVERY scroll event of an `on-drag` ScrollView, including the one the\n * browser fires to bring a just-focused field into view, so on the web the\n * field the user tapped lost focus as soon as the viewport moved.\n */\nfunction keyboardDismissMode(): 'on-drag' | 'none' {\n return Platform.OS === 'web' ? 'none' : 'on-drag';\n}\n\n/** Reuse a navigator's context, or own one outside the scrolling view. */\nfunction ScreenBoundary({ children }: { children: React.ReactNode }): React.JSX.Element {\n const insets = React.useContext(SafeAreaInsetsContext);\n return insets === null\n ? <SafeAreaProvider style={styles.fill}>{children}</SafeAreaProvider>\n : <>{children}</>;\n}\n\nexport const Screen = React.forwardRef<View, ScreenProps>(({\n children, scroll = true, safeAreaEdges = SCREEN_EDGES,\n keyboardAvoiding = true, keyboardVerticalOffset = 0, bg = 'default',\n style, contentContainerStyle, scrollViewProps, ...props\n}, ref) => {\n const theme = useUiTheme();\n const { layout, rest } = splitBoxProps(props);\n const testID = resolveTestId(layout);\n const contentStyle = [styles.content, resolveBoxLayout({ ...layout, direction: 'column' }, theme), contentContainerStyle];\n return (\n <ScreenBoundary>\n <View ref={ref} testID={testID} {...rest} style={[styles.fill, resolveBoxLayout({ bg }, theme), style]}>\n <SafeAreaView edges={safeAreaEdges} style={styles.fill}>\n <KeyboardAvoidingView style={styles.fill} enabled={keyboardAvoiding}\n behavior={keyboardBehavior(keyboardAvoiding)} keyboardVerticalOffset={keyboardVerticalOffset}>\n {scroll ? (\n <ScrollView keyboardShouldPersistTaps=\"handled\" keyboardDismissMode={keyboardDismissMode()} {...scrollViewProps}\n testID={scrollViewProps?.testID ?? (testID ? `${testID}-viewport` : undefined)}\n style={styles.fill} contentContainerStyle={contentStyle}\n horizontal={false} automaticallyAdjustKeyboardInsets={false}\n automaticallyAdjustContentInsets={false} contentInsetAdjustmentBehavior=\"never\">\n {children}\n </ScrollView>\n ) : <View style={[styles.fill, contentStyle]}>{children}</View>}\n </KeyboardAvoidingView>\n </SafeAreaView>\n </View>\n </ScreenBoundary>\n );\n});\nScreen.displayName = 'Screen';\n","import type { BoxBaseProps } from '../Box/Box.base';\n\n/** Physical screen edges, independent of a native dependency. */\nexport type ScreenEdge = 'top' | 'right' | 'bottom' | 'left';\nexport const SCREEN_EDGES: readonly ScreenEdge[] = ['top', 'right', 'bottom', 'left'];\n\n/** Padding and gap apply to the content, inside the selected safe-area edges. */\nexport interface ScreenBaseProps extends Pick<\n BoxBaseProps,\n 'children' | 'p' | 'px' | 'py' | 'pt' | 'pr' | 'pb' | 'pl' | 'gap' | 'bg' | 'testID' | 'dataTestId'\n> {\n /** Vertical scrolling; turn off when a child owns scrolling. Default true. */\n scroll?: boolean;\n /** Omit bottom when a navigator's tab bar already owns that inset. */\n safeAreaEdges?: readonly ScreenEdge[];\n /** Lift the native viewport above the soft keyboard. Default true. */\n keyboardAvoiding?: boolean;\n /** Native distance from the window top to the screen's parent, in dp. */\n keyboardVerticalOffset?: number;\n}\n"],"mappings":";;;;;;;;;;;;;AAAA,YAAY,WAAW;AACvB,SAAS,sBAAsB,UAAU,YAAY,YAAY,YAAY;AAC7E,SAAS,uBAAuB,kBAAkB,oBAAoB;;;ACE/D,IAAM,eAAsC,CAAC,OAAO,SAAS,UAAU,MAAM;;;AD2B9E,SACA,UADA;AArBN,IAAM,SAAS,WAAW,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,UAAU,EAAE,EAAE,CAAC;AAEhF,SAAS,iBAAiB,SAAoD;AAC5E,MAAI,CAAC,QAAS,QAAO;AACrB,SAAO,SAAS,OAAO,QAAQ,YAAY;AAC7C;AAQA,SAAS,sBAA0C;AACjD,SAAO,SAAS,OAAO,QAAQ,SAAS;AAC1C;AAGA,SAAS,eAAe,EAAE,SAAS,GAAqD;AACtF,QAAM,SAAe,iBAAW,qBAAqB;AACrD,SAAO,WAAW,OACd,oBAAC,oBAAiB,OAAO,OAAO,MAAO,UAAS,IAChD,gCAAG,UAAS;AAClB;AAEO,IAAM,SAAe,iBAA8B,CAAC;AAAA,EACzD;AAAA,EAAU,SAAS;AAAA,EAAM,gBAAgB;AAAA,EACzC,mBAAmB;AAAA,EAAM,yBAAyB;AAAA,EAAG,KAAK;AAAA,EAC1D;AAAA,EAAO;AAAA,EAAuB;AAAA,EAAiB,GAAG;AACpD,GAAG,QAAQ;AACT,QAAM,QAAQ,WAAW;AACzB,QAAM,EAAE,QAAQ,KAAK,IAAI,cAAc,KAAK;AAC5C,QAAM,SAAS,cAAc,MAAM;AACnC,QAAM,eAAe,CAAC,OAAO,SAAS,iBAAiB,EAAE,GAAG,QAAQ,WAAW,SAAS,GAAG,KAAK,GAAG,qBAAqB;AACxH,SACE,oBAAC,kBACC,8BAAC,QAAK,KAAU,QAAiB,GAAG,MAAM,OAAO,CAAC,OAAO,MAAM,iBAAiB,EAAE,GAAG,GAAG,KAAK,GAAG,KAAK,GACnG,8BAAC,gBAAa,OAAO,eAAe,OAAO,OAAO,MAChD;AAAA,IAAC;AAAA;AAAA,MAAqB,OAAO,OAAO;AAAA,MAAM,SAAS;AAAA,MACjD,UAAU,iBAAiB,gBAAgB;AAAA,MAAG;AAAA,MAC7C,mBACC;AAAA,QAAC;AAAA;AAAA,UAAW,2BAA0B;AAAA,UAAU,qBAAqB,oBAAoB;AAAA,UAAI,GAAG;AAAA,UAC9F,QAAQ,iBAAiB,WAAW,SAAS,GAAG,MAAM,cAAc;AAAA,UACpE,OAAO,OAAO;AAAA,UAAM,uBAAuB;AAAA,UAC3C,YAAY;AAAA,UAAO,mCAAmC;AAAA,UACtD,kCAAkC;AAAA,UAAO,gCAA+B;AAAA,UACvE;AAAA;AAAA,MACH,IACE,oBAAC,QAAK,OAAO,CAAC,OAAO,MAAM,YAAY,GAAI,UAAS;AAAA;AAAA,EAC1D,GACF,GACF,GACF;AAEJ,CAAC;AACD,OAAO,cAAc;","names":[]}
@@ -1,20 +1,20 @@
1
1
  import "../chunk-R26KYJHK.js";
2
2
  import {
3
3
  SectionNav
4
- } from "../chunk-27F2VXS4.js";
4
+ } from "../chunk-7IXXASQ6.js";
5
5
  import "../chunk-SNWCT6JN.js";
6
6
  import "../chunk-ILJ3FXIC.js";
7
7
  import {
8
8
  sectionNavBarInset
9
- } from "../chunk-URSYEHPU.js";
10
- import "../chunk-NM46HQSW.js";
9
+ } from "../chunk-PMRLFNBT.js";
10
+ import "../chunk-J26ZWYQI.js";
11
11
  import {
12
12
  RaisedActionButton
13
13
  } from "../chunk-UKUGSU3Y.js";
14
14
  import "../chunk-24HHUCWB.js";
15
15
  import "../chunk-YCCWJ5XQ.js";
16
16
  import "../chunk-TMSWLFL4.js";
17
- import "../chunk-UALPKKAY.js";
17
+ import "../chunk-F742IMLQ.js";
18
18
  import "../chunk-PUFA7FQ7.js";
19
19
  import "../chunk-5AK2EZG5.js";
20
20
  import "../chunk-N5PVD4J5.js";
@@ -1 +1 @@
1
- {"version":3,"file":"Drawer.d.ts","sourceRoot":"","sources":["../../../../../src/components/layout/Drawer/Drawer.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,kBAAkB,EAAC,iBAAiB,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAqFxF,eAAO,MAAM,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,WAAW,CAyCxC,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAoCpD,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CAetD,CAAC"}
1
+ {"version":3,"file":"Drawer.d.ts","sourceRoot":"","sources":["../../../../../src/components/layout/Drawer/Drawer.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,kBAAkB,EAAC,iBAAiB,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAqFxF,eAAO,MAAM,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,WAAW,CAyCxC,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAuCpD,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CAetD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"Screen.native.d.ts","sourceRoot":"","sources":["../../../../../src/components/layout/Screen/Screen.native.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAA0D,IAAI,EAAE,MAAM,cAAc,CAAC;AAwB5F,eAAO,MAAM,MAAM;;;8BA6BjB,CAAC"}
1
+ {"version":3,"file":"Screen.native.d.ts","sourceRoot":"","sources":["../../../../../src/components/layout/Screen/Screen.native.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAA0D,IAAI,EAAE,MAAM,cAAc,CAAC;AAkC5F,eAAO,MAAM,MAAM;;;8BA6BjB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@12-apps/ui",
3
- "version": "6.74.1",
3
+ "version": "6.75.0",
4
4
  "license": "MIT",
5
5
  "packageManager": "pnpm@10.34.5",
6
6
  "type": "module",
@@ -150,7 +150,10 @@ export const DrawerHeader: React.FC<DrawerHeaderProps> = ({
150
150
  sx={{
151
151
  display: 'flex',
152
152
  alignItems: 'center',
153
- padding: theme.spacing(2),
153
+ // 12px above and below: the close button is 40px tall, so the header lands on
154
+ // its own 64px minimum instead of 72 — the height of the page header beside
155
+ // a docked drawer (FUT-3476).
156
+ padding: theme.spacing(1.5, 2),
154
157
  borderBottom: `1px solid ${theme.palette.divider}`,
155
158
  minHeight: rem(theme, 64),
156
159
  justifyContent: 'space-between',
@@ -45,7 +45,9 @@ on iOS and height on Android. Its measured viewport already excludes the bottom
45
45
  safe area, so the home-indicator inset is not added again above the keyboard.
46
46
  ScrollView automatic keyboard and content insets are off so those owners do not
47
47
  also apply the same lift/insets. Handled child taps remain usable with the
48
- keyboard open; dragging dismisses it. `scrollViewProps` can change tap/dismiss
48
+ keyboard open; on a device, dragging dismisses it. On the web nothing is dismissed
49
+ on scroll: react-native-web would blur the focused field on every scroll event,
50
+ including the browser's own scroll to a just-focused field. `scrollViewProps` can change tap/dismiss
49
51
  policy, but cannot override the viewport geometry or automatic inset ownership.
50
52
 
51
53
  ## Layout and accessibility
@@ -15,6 +15,16 @@ function keyboardBehavior(enabled: boolean): 'padding' | 'height' | undefined {
15
15
  return Platform.OS === 'ios' ? 'padding' : 'height';
16
16
  }
17
17
 
18
+ /**
19
+ * Drag-to-dismiss on a device only. react-native-web runs `dismissKeyboard()`
20
+ * on EVERY scroll event of an `on-drag` ScrollView, including the one the
21
+ * browser fires to bring a just-focused field into view, so on the web the
22
+ * field the user tapped lost focus as soon as the viewport moved.
23
+ */
24
+ function keyboardDismissMode(): 'on-drag' | 'none' {
25
+ return Platform.OS === 'web' ? 'none' : 'on-drag';
26
+ }
27
+
18
28
  /** Reuse a navigator's context, or own one outside the scrolling view. */
19
29
  function ScreenBoundary({ children }: { children: React.ReactNode }): React.JSX.Element {
20
30
  const insets = React.useContext(SafeAreaInsetsContext);
@@ -39,7 +49,7 @@ export const Screen = React.forwardRef<View, ScreenProps>(({
39
49
  <KeyboardAvoidingView style={styles.fill} enabled={keyboardAvoiding}
40
50
  behavior={keyboardBehavior(keyboardAvoiding)} keyboardVerticalOffset={keyboardVerticalOffset}>
41
51
  {scroll ? (
42
- <ScrollView keyboardShouldPersistTaps="handled" keyboardDismissMode="on-drag" {...scrollViewProps}
52
+ <ScrollView keyboardShouldPersistTaps="handled" keyboardDismissMode={keyboardDismissMode()} {...scrollViewProps}
43
53
  testID={scrollViewProps?.testID ?? (testID ? `${testID}-viewport` : undefined)}
44
54
  style={styles.fill} contentContainerStyle={contentStyle}
45
55
  horizontal={false} automaticallyAdjustKeyboardInsets={false}