@oxyhq/bloom 0.14.0 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/commonjs/alert-dialog/AlertDialog.js +35 -27
- package/lib/commonjs/alert-dialog/AlertDialog.js.map +1 -1
- package/lib/commonjs/alert-dialog/index.js +1 -1
- package/lib/commonjs/alert-dialog/index.js.map +1 -1
- package/lib/commonjs/alert-dialog/index.web.js +1 -1
- package/lib/commonjs/alert-dialog/index.web.js.map +1 -1
- package/lib/commonjs/command/Command.js +27 -16
- package/lib/commonjs/command/Command.js.map +1 -1
- package/lib/commonjs/command/index.js +1 -1
- package/lib/commonjs/command/index.js.map +1 -1
- package/lib/commonjs/command/index.web.js +1 -1
- package/lib/commonjs/command/index.web.js.map +1 -1
- package/lib/commonjs/dialog/Dialog.js +336 -43
- package/lib/commonjs/dialog/Dialog.js.map +1 -1
- package/lib/commonjs/dialog/Dialog.web.js +420 -66
- package/lib/commonjs/dialog/Dialog.web.js.map +1 -1
- package/lib/commonjs/dialog/index.js +2 -9
- package/lib/commonjs/dialog/index.js.map +1 -1
- package/lib/commonjs/dialog/index.web.js +2 -15
- package/lib/commonjs/dialog/index.web.js.map +1 -1
- package/lib/commonjs/dialog/placement.js +104 -0
- package/lib/commonjs/dialog/placement.js.map +1 -0
- package/lib/commonjs/index.js +7 -29
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/index.web.js +13 -35
- package/lib/commonjs/index.web.js.map +1 -1
- package/lib/module/alert-dialog/AlertDialog.js +35 -27
- package/lib/module/alert-dialog/AlertDialog.js.map +1 -1
- package/lib/module/alert-dialog/index.js +2 -2
- package/lib/module/alert-dialog/index.js.map +1 -1
- package/lib/module/alert-dialog/index.web.js +2 -2
- package/lib/module/alert-dialog/index.web.js.map +1 -1
- package/lib/module/command/Command.js +27 -16
- package/lib/module/command/Command.js.map +1 -1
- package/lib/module/command/index.js +2 -2
- package/lib/module/command/index.js.map +1 -1
- package/lib/module/command/index.web.js +2 -2
- package/lib/module/command/index.web.js.map +1 -1
- package/lib/module/dialog/Dialog.js +335 -46
- package/lib/module/dialog/Dialog.js.map +1 -1
- package/lib/module/dialog/Dialog.web.js +418 -68
- package/lib/module/dialog/Dialog.web.js.map +1 -1
- package/lib/module/dialog/index.js +1 -2
- package/lib/module/dialog/index.js.map +1 -1
- package/lib/module/dialog/index.web.js +1 -2
- package/lib/module/dialog/index.web.js.map +1 -1
- package/lib/module/dialog/placement.js +100 -0
- package/lib/module/dialog/placement.js.map +1 -0
- package/lib/module/index.js +1 -3
- package/lib/module/index.js.map +1 -1
- package/lib/module/index.web.js +1 -3
- package/lib/module/index.web.js.map +1 -1
- package/lib/typescript/commonjs/alert-dialog/AlertDialog.d.ts +13 -12
- package/lib/typescript/commonjs/alert-dialog/AlertDialog.d.ts.map +1 -1
- package/lib/typescript/commonjs/alert-dialog/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/alert-dialog/index.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/command/Command.d.ts +8 -8
- package/lib/typescript/commonjs/command/Command.d.ts.map +1 -1
- package/lib/typescript/commonjs/command/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/command/index.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/dialog/Dialog.d.ts +17 -15
- package/lib/typescript/commonjs/dialog/Dialog.d.ts.map +1 -1
- package/lib/typescript/commonjs/dialog/Dialog.web.d.ts +18 -5
- package/lib/typescript/commonjs/dialog/Dialog.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/dialog/index.d.ts +2 -4
- package/lib/typescript/commonjs/dialog/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/dialog/index.web.d.ts +2 -4
- package/lib/typescript/commonjs/dialog/index.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/dialog/placement.d.ts +71 -0
- package/lib/typescript/commonjs/dialog/placement.d.ts.map +1 -0
- package/lib/typescript/commonjs/dialog/types.d.ts +66 -3
- package/lib/typescript/commonjs/dialog/types.d.ts.map +1 -1
- package/lib/typescript/commonjs/index.d.ts +2 -4
- package/lib/typescript/commonjs/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/index.web.d.ts +2 -4
- package/lib/typescript/commonjs/index.web.d.ts.map +1 -1
- package/lib/typescript/module/alert-dialog/AlertDialog.d.ts +13 -12
- package/lib/typescript/module/alert-dialog/AlertDialog.d.ts.map +1 -1
- package/lib/typescript/module/alert-dialog/index.d.ts.map +1 -1
- package/lib/typescript/module/alert-dialog/index.web.d.ts.map +1 -1
- package/lib/typescript/module/command/Command.d.ts +8 -8
- package/lib/typescript/module/command/Command.d.ts.map +1 -1
- package/lib/typescript/module/command/index.d.ts.map +1 -1
- package/lib/typescript/module/command/index.web.d.ts.map +1 -1
- package/lib/typescript/module/dialog/Dialog.d.ts +17 -15
- package/lib/typescript/module/dialog/Dialog.d.ts.map +1 -1
- package/lib/typescript/module/dialog/Dialog.web.d.ts +18 -5
- package/lib/typescript/module/dialog/Dialog.web.d.ts.map +1 -1
- package/lib/typescript/module/dialog/index.d.ts +2 -4
- package/lib/typescript/module/dialog/index.d.ts.map +1 -1
- package/lib/typescript/module/dialog/index.web.d.ts +2 -4
- package/lib/typescript/module/dialog/index.web.d.ts.map +1 -1
- package/lib/typescript/module/dialog/placement.d.ts +71 -0
- package/lib/typescript/module/dialog/placement.d.ts.map +1 -0
- package/lib/typescript/module/dialog/types.d.ts +66 -3
- package/lib/typescript/module/dialog/types.d.ts.map +1 -1
- package/lib/typescript/module/index.d.ts +2 -4
- package/lib/typescript/module/index.d.ts.map +1 -1
- package/lib/typescript/module/index.web.d.ts +2 -4
- package/lib/typescript/module/index.web.d.ts.map +1 -1
- package/package.json +1 -18
- package/src/__tests__/AlertDialog.test.tsx +122 -0
- package/src/__tests__/Command.test.tsx +107 -0
- package/src/__tests__/DialogPlacement.test.tsx +144 -0
- package/src/alert-dialog/AlertDialog.tsx +46 -36
- package/src/alert-dialog/index.ts +2 -2
- package/src/alert-dialog/index.web.ts +2 -2
- package/src/command/Command.tsx +30 -19
- package/src/command/index.ts +2 -2
- package/src/command/index.web.ts +2 -2
- package/src/dialog/Dialog.tsx +406 -50
- package/src/dialog/Dialog.web.tsx +496 -78
- package/src/dialog/index.ts +4 -3
- package/src/dialog/index.web.ts +4 -7
- package/src/dialog/placement.ts +113 -0
- package/src/dialog/types.ts +69 -3
- package/src/index.ts +4 -11
- package/src/index.web.ts +4 -11
- package/lib/commonjs/dialog/CenteredDialog.js +0 -250
- package/lib/commonjs/dialog/CenteredDialog.js.map +0 -1
- package/lib/commonjs/dialog/CenteredDialog.web.js +0 -328
- package/lib/commonjs/dialog/CenteredDialog.web.js.map +0 -1
- package/lib/commonjs/dialog/centered-dialog-tokens.js +0 -62
- package/lib/commonjs/dialog/centered-dialog-tokens.js.map +0 -1
- package/lib/commonjs/dialog/centered-dialog-types.js +0 -6
- package/lib/commonjs/dialog/centered-dialog-types.js.map +0 -1
- package/lib/commonjs/responsive-sheet/ResponsiveSheet.js +0 -300
- package/lib/commonjs/responsive-sheet/ResponsiveSheet.js.map +0 -1
- package/lib/commonjs/responsive-sheet/ResponsiveSheet.native.js +0 -226
- package/lib/commonjs/responsive-sheet/ResponsiveSheet.native.js.map +0 -1
- package/lib/commonjs/responsive-sheet/const.js +0 -60
- package/lib/commonjs/responsive-sheet/const.js.map +0 -1
- package/lib/commonjs/responsive-sheet/index.js +0 -19
- package/lib/commonjs/responsive-sheet/index.js.map +0 -1
- package/lib/commonjs/responsive-sheet/index.web.js +0 -19
- package/lib/commonjs/responsive-sheet/index.web.js.map +0 -1
- package/lib/commonjs/responsive-sheet/types.js +0 -6
- package/lib/commonjs/responsive-sheet/types.js.map +0 -1
- package/lib/module/dialog/CenteredDialog.js +0 -244
- package/lib/module/dialog/CenteredDialog.js.map +0 -1
- package/lib/module/dialog/CenteredDialog.web.js +0 -322
- package/lib/module/dialog/CenteredDialog.web.js.map +0 -1
- package/lib/module/dialog/centered-dialog-tokens.js +0 -58
- package/lib/module/dialog/centered-dialog-tokens.js.map +0 -1
- package/lib/module/dialog/centered-dialog-types.js +0 -4
- package/lib/module/dialog/centered-dialog-types.js.map +0 -1
- package/lib/module/responsive-sheet/ResponsiveSheet.js +0 -293
- package/lib/module/responsive-sheet/ResponsiveSheet.js.map +0 -1
- package/lib/module/responsive-sheet/ResponsiveSheet.native.js +0 -219
- package/lib/module/responsive-sheet/ResponsiveSheet.native.js.map +0 -1
- package/lib/module/responsive-sheet/const.js +0 -56
- package/lib/module/responsive-sheet/const.js.map +0 -1
- package/lib/module/responsive-sheet/index.js +0 -4
- package/lib/module/responsive-sheet/index.js.map +0 -1
- package/lib/module/responsive-sheet/index.web.js +0 -14
- package/lib/module/responsive-sheet/index.web.js.map +0 -1
- package/lib/module/responsive-sheet/types.js +0 -4
- package/lib/module/responsive-sheet/types.js.map +0 -1
- package/lib/typescript/commonjs/dialog/CenteredDialog.d.ts +0 -20
- package/lib/typescript/commonjs/dialog/CenteredDialog.d.ts.map +0 -1
- package/lib/typescript/commonjs/dialog/CenteredDialog.web.d.ts +0 -29
- package/lib/typescript/commonjs/dialog/CenteredDialog.web.d.ts.map +0 -1
- package/lib/typescript/commonjs/dialog/centered-dialog-tokens.d.ts +0 -47
- package/lib/typescript/commonjs/dialog/centered-dialog-tokens.d.ts.map +0 -1
- package/lib/typescript/commonjs/dialog/centered-dialog-types.d.ts +0 -70
- package/lib/typescript/commonjs/dialog/centered-dialog-types.d.ts.map +0 -1
- package/lib/typescript/commonjs/responsive-sheet/ResponsiveSheet.d.ts +0 -26
- package/lib/typescript/commonjs/responsive-sheet/ResponsiveSheet.d.ts.map +0 -1
- package/lib/typescript/commonjs/responsive-sheet/ResponsiveSheet.native.d.ts +0 -20
- package/lib/typescript/commonjs/responsive-sheet/ResponsiveSheet.native.d.ts.map +0 -1
- package/lib/typescript/commonjs/responsive-sheet/const.d.ts +0 -43
- package/lib/typescript/commonjs/responsive-sheet/const.d.ts.map +0 -1
- package/lib/typescript/commonjs/responsive-sheet/index.d.ts +0 -3
- package/lib/typescript/commonjs/responsive-sheet/index.d.ts.map +0 -1
- package/lib/typescript/commonjs/responsive-sheet/index.web.d.ts +0 -3
- package/lib/typescript/commonjs/responsive-sheet/index.web.d.ts.map +0 -1
- package/lib/typescript/commonjs/responsive-sheet/types.d.ts +0 -55
- package/lib/typescript/commonjs/responsive-sheet/types.d.ts.map +0 -1
- package/lib/typescript/module/dialog/CenteredDialog.d.ts +0 -20
- package/lib/typescript/module/dialog/CenteredDialog.d.ts.map +0 -1
- package/lib/typescript/module/dialog/CenteredDialog.web.d.ts +0 -29
- package/lib/typescript/module/dialog/CenteredDialog.web.d.ts.map +0 -1
- package/lib/typescript/module/dialog/centered-dialog-tokens.d.ts +0 -47
- package/lib/typescript/module/dialog/centered-dialog-tokens.d.ts.map +0 -1
- package/lib/typescript/module/dialog/centered-dialog-types.d.ts +0 -70
- package/lib/typescript/module/dialog/centered-dialog-types.d.ts.map +0 -1
- package/lib/typescript/module/responsive-sheet/ResponsiveSheet.d.ts +0 -26
- package/lib/typescript/module/responsive-sheet/ResponsiveSheet.d.ts.map +0 -1
- package/lib/typescript/module/responsive-sheet/ResponsiveSheet.native.d.ts +0 -20
- package/lib/typescript/module/responsive-sheet/ResponsiveSheet.native.d.ts.map +0 -1
- package/lib/typescript/module/responsive-sheet/const.d.ts +0 -43
- package/lib/typescript/module/responsive-sheet/const.d.ts.map +0 -1
- package/lib/typescript/module/responsive-sheet/index.d.ts +0 -3
- package/lib/typescript/module/responsive-sheet/index.d.ts.map +0 -1
- package/lib/typescript/module/responsive-sheet/index.web.d.ts +0 -3
- package/lib/typescript/module/responsive-sheet/index.web.d.ts.map +0 -1
- package/lib/typescript/module/responsive-sheet/types.d.ts +0 -55
- package/lib/typescript/module/responsive-sheet/types.d.ts.map +0 -1
- package/src/__tests__/CenteredDialog.test.tsx +0 -108
- package/src/__tests__/ResponsiveSheet.test.tsx +0 -104
- package/src/dialog/CenteredDialog.stories.tsx +0 -125
- package/src/dialog/CenteredDialog.tsx +0 -303
- package/src/dialog/CenteredDialog.web.tsx +0 -372
- package/src/dialog/centered-dialog-tokens.ts +0 -68
- package/src/dialog/centered-dialog-types.ts +0 -70
- package/src/responsive-sheet/ResponsiveSheet.native.tsx +0 -257
- package/src/responsive-sheet/ResponsiveSheet.stories.tsx +0 -54
- package/src/responsive-sheet/ResponsiveSheet.tsx +0 -327
- package/src/responsive-sheet/const.ts +0 -53
- package/src/responsive-sheet/index.ts +0 -6
- package/src/responsive-sheet/index.web.ts +0 -16
- package/src/responsive-sheet/types.ts +0 -57
|
@@ -1,4 +1,17 @@
|
|
|
1
1
|
import type { GestureResponderEvent, StyleProp, ViewStyle } from 'react-native';
|
|
2
|
+
import type { ResponsiveDialogPlacement } from './placement';
|
|
3
|
+
export type { DialogPlacement, ResponsiveDialogPlacement } from './placement';
|
|
4
|
+
/**
|
|
5
|
+
* Side-sheet inset (px) from the root overlay's edges. Lets a host place a
|
|
6
|
+
* `left`/`right` placement "inside its own shell" — e.g. offset from the top
|
|
7
|
+
* by a header, or from the anchored edge by a nav rail.
|
|
8
|
+
*/
|
|
9
|
+
export type DialogInset = {
|
|
10
|
+
top?: number;
|
|
11
|
+
bottom?: number;
|
|
12
|
+
left?: number;
|
|
13
|
+
right?: number;
|
|
14
|
+
};
|
|
2
15
|
/**
|
|
3
16
|
* Imperative open/close handle returned by `useDialogControl`.
|
|
4
17
|
*
|
|
@@ -45,7 +58,14 @@ export type DialogAction = {
|
|
|
45
58
|
/**
|
|
46
59
|
* Props accepted by the unified `<Dialog>` component.
|
|
47
60
|
*
|
|
48
|
-
*
|
|
61
|
+
* Open/close is driven by EITHER of two mutually-exclusive modes:
|
|
62
|
+
*
|
|
63
|
+
* - **Imperative `control`** (`useDialogControl()` + `control.open()` /
|
|
64
|
+
* `control.close()`). The legacy default; unchanged.
|
|
65
|
+
* - **Controlled `open`** (an `open` boolean + `onClose`). When `open` is
|
|
66
|
+
* provided it wins and `control` is ignored.
|
|
67
|
+
*
|
|
68
|
+
* Rendering modes (orthogonal to open/close mode) — pick whichever fits:
|
|
49
69
|
*
|
|
50
70
|
* 1. **Declarative (`title` / `description` / `actions`).** Most common
|
|
51
71
|
* confirm/cancel surface. Bloom renders the title, description and
|
|
@@ -57,10 +77,26 @@ export type DialogAction = {
|
|
|
57
77
|
*
|
|
58
78
|
* 3. **Imperative `alert()`.** Bypass the JSX layer entirely — see the
|
|
59
79
|
* module-level `alert()` helper.
|
|
80
|
+
*
|
|
81
|
+
* `placement` controls the surface anchor — centered modal (default), an
|
|
82
|
+
* anchored side-sheet (`left`/`right`), or a bottom-sheet (`bottom`) — and may
|
|
83
|
+
* be a responsive map that collapses to a bottom-sheet on narrow viewports.
|
|
60
84
|
*/
|
|
61
85
|
export type DialogProps = React.PropsWithChildren<{
|
|
62
|
-
|
|
63
|
-
|
|
86
|
+
/**
|
|
87
|
+
* Imperative open/close handle from `useDialogControl()`. Optional — omit it
|
|
88
|
+
* when driving the dialog with the controlled `open` prop instead.
|
|
89
|
+
*/
|
|
90
|
+
control?: DialogControlProps;
|
|
91
|
+
/**
|
|
92
|
+
* Controlled open state (opt-in). When provided, the dialog is driven by
|
|
93
|
+
* this boolean and `onClose`, and `control` is ignored.
|
|
94
|
+
*/
|
|
95
|
+
open?: boolean;
|
|
96
|
+
/**
|
|
97
|
+
* Fires after the dialog has finished closing. In controlled mode it is the
|
|
98
|
+
* close request the host must answer by flipping `open` to `false`.
|
|
99
|
+
*/
|
|
64
100
|
onClose?: () => void;
|
|
65
101
|
testID?: string;
|
|
66
102
|
/** Optional dialog header text. Rendered above `description` / `children`. */
|
|
@@ -72,11 +108,38 @@ export type DialogProps = React.PropsWithChildren<{
|
|
|
72
108
|
* confirm/cancel/destructive buttons for you. Order is preserved.
|
|
73
109
|
*/
|
|
74
110
|
actions?: DialogAction[];
|
|
111
|
+
/**
|
|
112
|
+
* Surface anchor. Defaults to `'center'` (the centered modal — current
|
|
113
|
+
* behavior). `'left'`/`'right'` render an anchored side-sheet, `'bottom'` a
|
|
114
|
+
* bottom-sheet. A responsive map resolves by viewport width, e.g.
|
|
115
|
+
* `{ base: 'bottom', md: 'left' }` (drawer on wide, sheet on narrow).
|
|
116
|
+
*/
|
|
117
|
+
placement?: ResponsiveDialogPlacement;
|
|
118
|
+
/** Side-sheet width (px) on wide screens. Defaults to `460`. */
|
|
119
|
+
width?: number;
|
|
120
|
+
/** Centered-card max width (px). Defaults to `480`. */
|
|
121
|
+
maxWidth?: number;
|
|
122
|
+
/** Bottom-sheet max height as a fraction of the viewport height. Defaults to `0.9`. */
|
|
123
|
+
maxHeightRatio?: number;
|
|
124
|
+
/** Side-sheet inset (px) from the root overlay's edges. */
|
|
125
|
+
inset?: DialogInset;
|
|
126
|
+
/** Whether to render the drag handle in bottom-sheet mode. Defaults to `true`. */
|
|
127
|
+
showHandle?: boolean;
|
|
128
|
+
/** Whether tapping the backdrop dismisses the dialog. Defaults to `true`. */
|
|
129
|
+
dismissOnBackdrop?: boolean;
|
|
75
130
|
/**
|
|
76
131
|
* Style overrides applied to the inner content container on native (the
|
|
77
132
|
* floating bottom-sheet card) and to the modal panel on web.
|
|
78
133
|
*/
|
|
79
134
|
style?: StyleProp<ViewStyle>;
|
|
135
|
+
/** Style overrides for the side/bottom placement panel surface. */
|
|
136
|
+
panelStyle?: StyleProp<ViewStyle>;
|
|
137
|
+
/** NativeWind classes for the side/bottom placement panel surface. */
|
|
138
|
+
panelClassName?: string;
|
|
139
|
+
/** Style for the root overlay (theme-var scope, rail offset, etc.). */
|
|
140
|
+
containerStyle?: StyleProp<ViewStyle>;
|
|
141
|
+
/** NativeWind classes for the root overlay (e.g. `"md:left-[4.75rem]"`). */
|
|
142
|
+
containerClassName?: string;
|
|
80
143
|
/** Accessibility label, applied to the dialog role on web. */
|
|
81
144
|
label?: string;
|
|
82
145
|
}>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/dialog/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEhF;;;;;;;GAOG;AACH,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,KAAK,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,qBAAqB,GAAG;IACvD,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,KAAK,CAAC,SAAS,CAAC,qBAAqB,GAAG,IAAI,CAAC,CAAC;CACpD,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,KAAK,EAAE,kBAAkB,CAAC,OAAO,CAAC,CAAC;IACnC,cAAc,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,QAAQ,GAAG,aAAa,CAAC;AAErE,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,qBAAqB,KAAK,IAAI,CAAC;IAC7C,KAAK,CAAC,EAAE,iBAAiB,CAAC;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;;;OAMG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/dialog/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,8 +9,8 @@ export { useThrottledValue } from './hooks/useThrottledValue';
|
|
|
9
9
|
export * as Icons from './icons';
|
|
10
10
|
export { type Props as IconProps, sizes as iconSizes, useCommonSVGProps } from './icons/common';
|
|
11
11
|
export * from './portal';
|
|
12
|
-
export { Dialog,
|
|
13
|
-
export type { AlertButton, AlertButtonStyle,
|
|
12
|
+
export { Dialog, DIALOG_SHEET_BACKDROP_TESTID, BloomDialogProvider, alert, useDialogContext, useDialogControl, } from './dialog';
|
|
13
|
+
export type { AlertButton, AlertButtonStyle, DialogAction, DialogActionColor, DialogContextProps, DialogControlProps, DialogInset, DialogPlacement, DialogProps, ResponsiveDialogPlacement, } from './dialog';
|
|
14
14
|
export * from './button';
|
|
15
15
|
export { Fab } from './fab';
|
|
16
16
|
export type { FabProps, FabVariant, FabSize, FabPlacement } from './fab';
|
|
@@ -49,8 +49,6 @@ export { Combobox } from './combobox';
|
|
|
49
49
|
export type { ComboboxProps, ComboboxOption } from './combobox';
|
|
50
50
|
export { BottomSheet } from './bottom-sheet';
|
|
51
51
|
export type { BottomSheetRef, BottomSheetProps } from './bottom-sheet';
|
|
52
|
-
export { ResponsiveSheet, RESPONSIVE_SHEET_BACKDROP_TESTID } from './responsive-sheet';
|
|
53
|
-
export type { ResponsiveSheetProps, ResponsiveSheetSide, ResponsiveSheetInset, } from './responsive-sheet';
|
|
54
52
|
export * from './card';
|
|
55
53
|
export * from './badge';
|
|
56
54
|
export * from './chip';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AACA,cAAc,SAAS,CAAC;AAGxB,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAC3D,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAC7D,OAAO,KAAK,MAAM,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAGhF,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAG9D,OAAO,KAAK,KAAK,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,KAAK,KAAK,IAAI,SAAS,EAAE,KAAK,IAAI,SAAS,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAGhG,cAAc,UAAU,CAAC;AACzB,OAAO,EACL,MAAM,EACN,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,8 +9,8 @@ export { useThrottledValue } from './hooks/useThrottledValue';
|
|
|
9
9
|
export * as Icons from './icons';
|
|
10
10
|
export { type Props as IconProps, sizes as iconSizes, useCommonSVGProps } from './icons/common';
|
|
11
11
|
export * from './portal/index.web';
|
|
12
|
-
export { Dialog,
|
|
13
|
-
export type { AlertButton, AlertButtonStyle,
|
|
12
|
+
export { Dialog, DIALOG_SHEET_BACKDROP_TESTID, BloomDialogProvider, alert, useDialogContext, useDialogControl, } from './dialog/index.web';
|
|
13
|
+
export type { AlertButton, AlertButtonStyle, DialogAction, DialogActionColor, DialogContextProps, DialogControlProps, DialogInset, DialogPlacement, DialogProps, ResponsiveDialogPlacement, } from './dialog/index.web';
|
|
14
14
|
export * from './button/index.web';
|
|
15
15
|
export { Fab } from './fab/index.web';
|
|
16
16
|
export type { FabProps, FabVariant, FabSize, FabPlacement } from './fab/index.web';
|
|
@@ -49,8 +49,6 @@ export { Combobox } from './combobox/index.web';
|
|
|
49
49
|
export type { ComboboxProps, ComboboxOption } from './combobox/index.web';
|
|
50
50
|
export { BottomSheet } from './bottom-sheet';
|
|
51
51
|
export type { BottomSheetRef, BottomSheetProps } from './bottom-sheet';
|
|
52
|
-
export { ResponsiveSheet, RESPONSIVE_SHEET_BACKDROP_TESTID } from './responsive-sheet/index.web';
|
|
53
|
-
export type { ResponsiveSheetProps, ResponsiveSheetSide, ResponsiveSheetInset, } from './responsive-sheet/index.web';
|
|
54
52
|
export * from './card';
|
|
55
53
|
export * from './badge';
|
|
56
54
|
export * from './chip';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.web.d.ts","sourceRoot":"","sources":["../../../src/index.web.ts"],"names":[],"mappings":"AAMA,cAAc,SAAS,CAAC;AAGxB,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAC3D,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAC7D,OAAO,KAAK,MAAM,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAGhF,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAG9D,OAAO,KAAK,KAAK,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,KAAK,KAAK,IAAI,SAAS,EAAE,KAAK,IAAI,SAAS,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAGhG,cAAc,oBAAoB,CAAC;AACnC,OAAO,EACL,MAAM,EACN,
|
|
1
|
+
{"version":3,"file":"index.web.d.ts","sourceRoot":"","sources":["../../../src/index.web.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@oxyhq/bloom",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.16.0",
|
|
4
4
|
"description": "Bloom UI — Oxy ecosystem component library for React Native + Expo + Web",
|
|
5
5
|
"main": "lib/commonjs/index.js",
|
|
6
6
|
"module": "lib/module/index.js",
|
|
@@ -463,22 +463,6 @@
|
|
|
463
463
|
"default": "./lib/commonjs/bottom-sheet/index.js"
|
|
464
464
|
}
|
|
465
465
|
},
|
|
466
|
-
"./responsive-sheet": {
|
|
467
|
-
"react-native": "./src/responsive-sheet/index.ts",
|
|
468
|
-
"browser": {
|
|
469
|
-
"types": "./lib/typescript/module/responsive-sheet/index.web.d.ts",
|
|
470
|
-
"import": "./lib/module/responsive-sheet/index.web.js",
|
|
471
|
-
"require": "./lib/commonjs/responsive-sheet/index.web.js"
|
|
472
|
-
},
|
|
473
|
-
"import": {
|
|
474
|
-
"types": "./lib/typescript/module/responsive-sheet/index.d.ts",
|
|
475
|
-
"default": "./lib/module/responsive-sheet/index.js"
|
|
476
|
-
},
|
|
477
|
-
"require": {
|
|
478
|
-
"types": "./lib/typescript/commonjs/responsive-sheet/index.d.ts",
|
|
479
|
-
"default": "./lib/commonjs/responsive-sheet/index.js"
|
|
480
|
-
}
|
|
481
|
-
},
|
|
482
466
|
"./context-menu": {
|
|
483
467
|
"react-native": "./src/context-menu/index.tsx",
|
|
484
468
|
"browser": {
|
|
@@ -782,7 +766,6 @@
|
|
|
782
766
|
"select",
|
|
783
767
|
"context-menu",
|
|
784
768
|
"bottom-sheet",
|
|
785
|
-
"responsive-sheet",
|
|
786
769
|
"card",
|
|
787
770
|
"badge",
|
|
788
771
|
"chip",
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { act, fireEvent, render } from '@testing-library/react-native';
|
|
3
|
+
|
|
4
|
+
import { AlertDialog } from '../alert-dialog';
|
|
5
|
+
import { BloomThemeProvider } from '../theme/BloomThemeProvider';
|
|
6
|
+
|
|
7
|
+
function renderWithTheme(ui: React.ReactElement) {
|
|
8
|
+
return render(
|
|
9
|
+
<BloomThemeProvider mode="light" colorPreset="teal">
|
|
10
|
+
{ui}
|
|
11
|
+
</BloomThemeProvider>,
|
|
12
|
+
);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
// `AlertDialog` is now a thin wrapper over `<Dialog placement="center">`. These
|
|
16
|
+
// tests assert the public-API contract it owns (controlled visibility, the
|
|
17
|
+
// title/description copy, the confirm/cancel action row, and the
|
|
18
|
+
// confirm/cancel/dismiss callbacks) holds on the native Dialog surface.
|
|
19
|
+
describe('AlertDialog (built on Dialog)', () => {
|
|
20
|
+
it('renders nothing when not visible', () => {
|
|
21
|
+
const { queryByText } = renderWithTheme(
|
|
22
|
+
<AlertDialog
|
|
23
|
+
visible={false}
|
|
24
|
+
onClose={() => {}}
|
|
25
|
+
title="Delete app?"
|
|
26
|
+
description="This cannot be undone."
|
|
27
|
+
/>,
|
|
28
|
+
);
|
|
29
|
+
expect(queryByText('Delete app?')).toBeNull();
|
|
30
|
+
expect(queryByText('This cannot be undone.')).toBeNull();
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it('renders title, description and the confirm/cancel row when visible', () => {
|
|
34
|
+
const { getByText } = renderWithTheme(
|
|
35
|
+
<AlertDialog
|
|
36
|
+
visible
|
|
37
|
+
onClose={() => {}}
|
|
38
|
+
title="Delete app?"
|
|
39
|
+
description="This cannot be undone."
|
|
40
|
+
confirmLabel="Delete"
|
|
41
|
+
cancelLabel="Keep"
|
|
42
|
+
/>,
|
|
43
|
+
);
|
|
44
|
+
expect(getByText('Delete app?')).toBeTruthy();
|
|
45
|
+
expect(getByText('This cannot be undone.')).toBeTruthy();
|
|
46
|
+
expect(getByText('Delete')).toBeTruthy();
|
|
47
|
+
expect(getByText('Keep')).toBeTruthy();
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
it('runs onConfirm then onClose when the confirm button is pressed', () => {
|
|
51
|
+
const onConfirm = jest.fn();
|
|
52
|
+
const onClose = jest.fn();
|
|
53
|
+
const { getByText } = renderWithTheme(
|
|
54
|
+
<AlertDialog
|
|
55
|
+
visible
|
|
56
|
+
onClose={onClose}
|
|
57
|
+
title="Confirm?"
|
|
58
|
+
confirmLabel="Yes"
|
|
59
|
+
onConfirm={onConfirm}
|
|
60
|
+
/>,
|
|
61
|
+
);
|
|
62
|
+
act(() => {
|
|
63
|
+
fireEvent.press(getByText('Yes'));
|
|
64
|
+
});
|
|
65
|
+
expect(onConfirm).toHaveBeenCalledTimes(1);
|
|
66
|
+
expect(onClose).toHaveBeenCalledTimes(1);
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
it('runs onCancel then onClose when the cancel button is pressed', () => {
|
|
70
|
+
const onCancel = jest.fn();
|
|
71
|
+
const onClose = jest.fn();
|
|
72
|
+
const { getByText } = renderWithTheme(
|
|
73
|
+
<AlertDialog
|
|
74
|
+
visible
|
|
75
|
+
onClose={onClose}
|
|
76
|
+
title="Confirm?"
|
|
77
|
+
cancelLabel="No"
|
|
78
|
+
onCancel={onCancel}
|
|
79
|
+
/>,
|
|
80
|
+
);
|
|
81
|
+
act(() => {
|
|
82
|
+
fireEvent.press(getByText('No'));
|
|
83
|
+
});
|
|
84
|
+
expect(onCancel).toHaveBeenCalledTimes(1);
|
|
85
|
+
expect(onClose).toHaveBeenCalledTimes(1);
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
it('hides the cancel button when hideCancel is set', () => {
|
|
89
|
+
const { queryByText, getByText } = renderWithTheme(
|
|
90
|
+
<AlertDialog
|
|
91
|
+
visible
|
|
92
|
+
onClose={() => {}}
|
|
93
|
+
title="Acknowledge"
|
|
94
|
+
confirmLabel="OK"
|
|
95
|
+
cancelLabel="Cancel"
|
|
96
|
+
hideCancel
|
|
97
|
+
/>,
|
|
98
|
+
);
|
|
99
|
+
expect(getByText('OK')).toBeTruthy();
|
|
100
|
+
expect(queryByText('Cancel')).toBeNull();
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
it('renders a destructive confirm action', () => {
|
|
104
|
+
const onConfirm = jest.fn();
|
|
105
|
+
const { getByText } = renderWithTheme(
|
|
106
|
+
<AlertDialog
|
|
107
|
+
visible
|
|
108
|
+
onClose={() => {}}
|
|
109
|
+
title="Sign out everywhere?"
|
|
110
|
+
confirmLabel="Sign out"
|
|
111
|
+
destructive
|
|
112
|
+
onConfirm={onConfirm}
|
|
113
|
+
/>,
|
|
114
|
+
);
|
|
115
|
+
const confirm = getByText('Sign out');
|
|
116
|
+
expect(confirm).toBeTruthy();
|
|
117
|
+
act(() => {
|
|
118
|
+
fireEvent.press(confirm);
|
|
119
|
+
});
|
|
120
|
+
expect(onConfirm).toHaveBeenCalledTimes(1);
|
|
121
|
+
});
|
|
122
|
+
});
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { act, fireEvent, render } from '@testing-library/react-native';
|
|
3
|
+
|
|
4
|
+
import { Command } from '../command';
|
|
5
|
+
import type { CommandItem } from '../command';
|
|
6
|
+
import { BloomThemeProvider } from '../theme/BloomThemeProvider';
|
|
7
|
+
|
|
8
|
+
function renderWithTheme(ui: React.ReactElement) {
|
|
9
|
+
return render(
|
|
10
|
+
<BloomThemeProvider mode="light" colorPreset="teal">
|
|
11
|
+
{ui}
|
|
12
|
+
</BloomThemeProvider>,
|
|
13
|
+
);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function makeItems(onSelect: () => void): CommandItem[] {
|
|
17
|
+
return [
|
|
18
|
+
{ id: 'profile', label: 'Go to profile', group: 'Navigation', onSelect },
|
|
19
|
+
{ id: 'settings', label: 'Open settings', group: 'Navigation', onSelect },
|
|
20
|
+
{
|
|
21
|
+
id: 'new-app',
|
|
22
|
+
label: 'Create application',
|
|
23
|
+
description: 'Register a new OAuth client',
|
|
24
|
+
group: 'Actions',
|
|
25
|
+
keywords: ['oauth', 'client'],
|
|
26
|
+
onSelect,
|
|
27
|
+
},
|
|
28
|
+
];
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// `Command` is now a ⌘K palette built on `<Dialog placement="center">`. These
|
|
32
|
+
// tests assert the public-API contract it owns (controlled visibility, the
|
|
33
|
+
// grouped results list, query filtering, the empty state, and select →
|
|
34
|
+
// onClose) holds on the native Dialog surface.
|
|
35
|
+
describe('Command (built on Dialog)', () => {
|
|
36
|
+
it('renders nothing when not visible', () => {
|
|
37
|
+
const { queryByText } = renderWithTheme(
|
|
38
|
+
<Command visible={false} onClose={() => {}} items={makeItems(() => {})} />,
|
|
39
|
+
);
|
|
40
|
+
expect(queryByText('Go to profile')).toBeNull();
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it('renders grouped items and their group headers when visible', () => {
|
|
44
|
+
const { getByText } = renderWithTheme(
|
|
45
|
+
<Command visible onClose={() => {}} items={makeItems(() => {})} />,
|
|
46
|
+
);
|
|
47
|
+
expect(getByText('Go to profile')).toBeTruthy();
|
|
48
|
+
expect(getByText('Open settings')).toBeTruthy();
|
|
49
|
+
expect(getByText('Create application')).toBeTruthy();
|
|
50
|
+
// Group headers are rendered above their items.
|
|
51
|
+
expect(getByText('Navigation')).toBeTruthy();
|
|
52
|
+
expect(getByText('Actions')).toBeTruthy();
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
it('filters items by a controlled query (label, description, keywords)', () => {
|
|
56
|
+
const { getByText, queryByText, rerender } = renderWithTheme(
|
|
57
|
+
<Command
|
|
58
|
+
visible
|
|
59
|
+
onClose={() => {}}
|
|
60
|
+
items={makeItems(() => {})}
|
|
61
|
+
query="settings"
|
|
62
|
+
/>,
|
|
63
|
+
);
|
|
64
|
+
expect(getByText('Open settings')).toBeTruthy();
|
|
65
|
+
expect(queryByText('Go to profile')).toBeNull();
|
|
66
|
+
|
|
67
|
+
// A keyword on a different item matches that item.
|
|
68
|
+
rerender(
|
|
69
|
+
<BloomThemeProvider mode="light" colorPreset="teal">
|
|
70
|
+
<Command
|
|
71
|
+
visible
|
|
72
|
+
onClose={() => {}}
|
|
73
|
+
items={makeItems(() => {})}
|
|
74
|
+
query="oauth"
|
|
75
|
+
/>
|
|
76
|
+
</BloomThemeProvider>,
|
|
77
|
+
);
|
|
78
|
+
expect(getByText('Create application')).toBeTruthy();
|
|
79
|
+
expect(queryByText('Open settings')).toBeNull();
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
it('shows the empty state when nothing matches', () => {
|
|
83
|
+
const { getByText } = renderWithTheme(
|
|
84
|
+
<Command
|
|
85
|
+
visible
|
|
86
|
+
onClose={() => {}}
|
|
87
|
+
items={makeItems(() => {})}
|
|
88
|
+
query="zzz-no-match"
|
|
89
|
+
emptyText="Nothing here"
|
|
90
|
+
/>,
|
|
91
|
+
);
|
|
92
|
+
expect(getByText('Nothing here')).toBeTruthy();
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
it('invokes onSelect then onClose when an item is pressed', () => {
|
|
96
|
+
const onSelect = jest.fn();
|
|
97
|
+
const onClose = jest.fn();
|
|
98
|
+
const { getByText } = renderWithTheme(
|
|
99
|
+
<Command visible onClose={onClose} items={makeItems(onSelect)} />,
|
|
100
|
+
);
|
|
101
|
+
act(() => {
|
|
102
|
+
fireEvent.press(getByText('Open settings'));
|
|
103
|
+
});
|
|
104
|
+
expect(onSelect).toHaveBeenCalledTimes(1);
|
|
105
|
+
expect(onClose).toHaveBeenCalledTimes(1);
|
|
106
|
+
});
|
|
107
|
+
});
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Text } from 'react-native';
|
|
3
|
+
import { act, fireEvent, render } from '@testing-library/react-native';
|
|
4
|
+
|
|
5
|
+
import { Dialog } from '../dialog';
|
|
6
|
+
import {
|
|
7
|
+
BREAKPOINT_MD,
|
|
8
|
+
useResolvedPlacement,
|
|
9
|
+
type DialogPlacement,
|
|
10
|
+
type ResponsiveDialogPlacement,
|
|
11
|
+
} from '../dialog/placement';
|
|
12
|
+
import { BloomThemeProvider } from '../theme/BloomThemeProvider';
|
|
13
|
+
|
|
14
|
+
// The RN test mock reports a 375px-wide viewport (below every breakpoint), so a
|
|
15
|
+
// responsive `placement` map resolves to its `base`.
|
|
16
|
+
const MOCK_VIEWPORT_WIDTH = 375;
|
|
17
|
+
|
|
18
|
+
function renderWithTheme(ui: React.ReactElement) {
|
|
19
|
+
return render(
|
|
20
|
+
<BloomThemeProvider mode="light" colorPreset="teal">
|
|
21
|
+
{ui}
|
|
22
|
+
</BloomThemeProvider>,
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/** Capture `useResolvedPlacement`'s output for a given input. */
|
|
27
|
+
function ResolveProbe({
|
|
28
|
+
placement,
|
|
29
|
+
onResolve,
|
|
30
|
+
}: {
|
|
31
|
+
placement: ResponsiveDialogPlacement | undefined;
|
|
32
|
+
onResolve: (p: DialogPlacement) => void;
|
|
33
|
+
}) {
|
|
34
|
+
const resolved = useResolvedPlacement(placement);
|
|
35
|
+
onResolve(resolved);
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function resolve(placement: ResponsiveDialogPlacement | undefined): DialogPlacement {
|
|
40
|
+
let captured: DialogPlacement = 'center';
|
|
41
|
+
renderWithTheme(
|
|
42
|
+
<ResolveProbe placement={placement} onResolve={(p) => { captured = p; }} />,
|
|
43
|
+
);
|
|
44
|
+
return captured;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
describe('useResolvedPlacement', () => {
|
|
48
|
+
it('defaults to center when placement is undefined', () => {
|
|
49
|
+
expect(resolve(undefined)).toBe('center');
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
it('returns a plain string placement unchanged', () => {
|
|
53
|
+
expect(resolve('left')).toBe('left');
|
|
54
|
+
expect(resolve('right')).toBe('right');
|
|
55
|
+
expect(resolve('bottom')).toBe('bottom');
|
|
56
|
+
expect(resolve('center')).toBe('center');
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
it('resolves a responsive map to base below the first breakpoint', () => {
|
|
60
|
+
// Sanity: the mock viewport is narrower than md, so md/lg/xl never apply.
|
|
61
|
+
expect(MOCK_VIEWPORT_WIDTH).toBeLessThan(BREAKPOINT_MD);
|
|
62
|
+
expect(resolve({ base: 'bottom', md: 'left' })).toBe('bottom');
|
|
63
|
+
expect(resolve({ base: 'bottom', md: 'center' })).toBe('bottom');
|
|
64
|
+
expect(resolve({ base: 'bottom', sm: 'right', lg: 'center' })).toBe('bottom');
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
it('ignores higher breakpoint keys that exceed the viewport width', () => {
|
|
68
|
+
// Only `base` applies at 375px wide; the `xl` override does not engage.
|
|
69
|
+
expect(resolve({ base: 'right', xl: 'left' })).toBe('right');
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
describe('Dialog controlled open mode', () => {
|
|
74
|
+
it('does not render content while open is false', () => {
|
|
75
|
+
const { queryByText } = renderWithTheme(
|
|
76
|
+
<Dialog open={false} onClose={() => {}} title="Controlled">
|
|
77
|
+
<Text>Controlled body</Text>
|
|
78
|
+
</Dialog>,
|
|
79
|
+
);
|
|
80
|
+
expect(queryByText('Controlled body')).toBeNull();
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
it('renders content when open flips to true (no control needed)', () => {
|
|
84
|
+
const { getByText, rerender } = renderWithTheme(
|
|
85
|
+
<Dialog open={false} onClose={() => {}} title="Controlled">
|
|
86
|
+
<Text>Controlled body</Text>
|
|
87
|
+
</Dialog>,
|
|
88
|
+
);
|
|
89
|
+
rerender(
|
|
90
|
+
<BloomThemeProvider mode="light" colorPreset="teal">
|
|
91
|
+
<Dialog open onClose={() => {}} title="Controlled">
|
|
92
|
+
<Text>Controlled body</Text>
|
|
93
|
+
</Dialog>
|
|
94
|
+
</BloomThemeProvider>,
|
|
95
|
+
);
|
|
96
|
+
expect(getByText('Controlled body')).toBeTruthy();
|
|
97
|
+
expect(getByText('Controlled')).toBeTruthy();
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
it('unmounts after open flips back to false and the close settles', () => {
|
|
101
|
+
jest.useFakeTimers();
|
|
102
|
+
try {
|
|
103
|
+
const { getByText, queryByText, rerender } = renderWithTheme(
|
|
104
|
+
<Dialog open onClose={() => {}} title="Controlled">
|
|
105
|
+
<Text>Controlled body</Text>
|
|
106
|
+
</Dialog>,
|
|
107
|
+
);
|
|
108
|
+
expect(getByText('Controlled body')).toBeTruthy();
|
|
109
|
+
|
|
110
|
+
rerender(
|
|
111
|
+
<BloomThemeProvider mode="light" colorPreset="teal">
|
|
112
|
+
<Dialog open={false} onClose={() => {}} title="Controlled">
|
|
113
|
+
<Text>Controlled body</Text>
|
|
114
|
+
</Dialog>
|
|
115
|
+
</BloomThemeProvider>,
|
|
116
|
+
);
|
|
117
|
+
act(() => {
|
|
118
|
+
jest.advanceTimersByTime(500);
|
|
119
|
+
});
|
|
120
|
+
expect(queryByText('Controlled body')).toBeNull();
|
|
121
|
+
} finally {
|
|
122
|
+
jest.useRealTimers();
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
it('requests close via onClose exactly once when an action is pressed (no double-fire)', () => {
|
|
127
|
+
const onClose = jest.fn();
|
|
128
|
+
const { getByText } = renderWithTheme(
|
|
129
|
+
<Dialog
|
|
130
|
+
open
|
|
131
|
+
onClose={onClose}
|
|
132
|
+
title="Controlled"
|
|
133
|
+
actions={[{ label: 'Done' }]}
|
|
134
|
+
/>,
|
|
135
|
+
);
|
|
136
|
+
act(() => {
|
|
137
|
+
fireEvent.press(getByText('Done'));
|
|
138
|
+
});
|
|
139
|
+
// In controlled mode the action's close() requests dismissal via onClose
|
|
140
|
+
// once; the host (not the dialog) then flips `open`. It must not fire the
|
|
141
|
+
// close-completion onClose a second time.
|
|
142
|
+
expect(onClose).toHaveBeenCalledTimes(1);
|
|
143
|
+
});
|
|
144
|
+
});
|