@oxyhq/bloom 0.45.0 → 0.46.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 (111) hide show
  1. package/lib/commonjs/dialog/Dialog.js +12 -3
  2. package/lib/commonjs/dialog/Dialog.js.map +1 -1
  3. package/lib/commonjs/dialog/Dialog.web.js +23 -8
  4. package/lib/commonjs/dialog/Dialog.web.js.map +1 -1
  5. package/lib/commonjs/index.js +29 -0
  6. package/lib/commonjs/index.js.map +1 -1
  7. package/lib/commonjs/index.web.js +73 -44
  8. package/lib/commonjs/index.web.js.map +1 -1
  9. package/lib/commonjs/surfaces/SurfaceHost.js +189 -0
  10. package/lib/commonjs/surfaces/SurfaceHost.js.map +1 -0
  11. package/lib/commonjs/surfaces/api.js +83 -0
  12. package/lib/commonjs/surfaces/api.js.map +1 -0
  13. package/lib/commonjs/surfaces/index.js +82 -0
  14. package/lib/commonjs/surfaces/index.js.map +1 -0
  15. package/lib/commonjs/surfaces/index.web.js +77 -0
  16. package/lib/commonjs/surfaces/index.web.js.map +1 -0
  17. package/lib/commonjs/surfaces/prompts.js +154 -0
  18. package/lib/commonjs/surfaces/prompts.js.map +1 -0
  19. package/lib/commonjs/surfaces/surfaceStore.js +172 -0
  20. package/lib/commonjs/surfaces/surfaceStore.js.map +1 -0
  21. package/lib/commonjs/surfaces/types.js +6 -0
  22. package/lib/commonjs/surfaces/types.js.map +1 -0
  23. package/lib/commonjs/surfaces/useSurface.js +36 -0
  24. package/lib/commonjs/surfaces/useSurface.js.map +1 -0
  25. package/lib/module/dialog/Dialog.js +13 -4
  26. package/lib/module/dialog/Dialog.js.map +1 -1
  27. package/lib/module/dialog/Dialog.web.js +23 -8
  28. package/lib/module/dialog/Dialog.web.js.map +1 -1
  29. package/lib/module/index.js +5 -0
  30. package/lib/module/index.js.map +1 -1
  31. package/lib/module/index.web.js +5 -0
  32. package/lib/module/index.web.js.map +1 -1
  33. package/lib/module/surfaces/SurfaceHost.js +184 -0
  34. package/lib/module/surfaces/SurfaceHost.js.map +1 -0
  35. package/lib/module/surfaces/api.js +48 -0
  36. package/lib/module/surfaces/api.js.map +1 -0
  37. package/lib/module/surfaces/index.js +24 -0
  38. package/lib/module/surfaces/index.js.map +1 -0
  39. package/lib/module/surfaces/index.web.js +19 -0
  40. package/lib/module/surfaces/index.web.js.map +1 -0
  41. package/lib/module/surfaces/prompts.js +148 -0
  42. package/lib/module/surfaces/prompts.js.map +1 -0
  43. package/lib/module/surfaces/surfaceStore.js +159 -0
  44. package/lib/module/surfaces/surfaceStore.js.map +1 -0
  45. package/lib/module/surfaces/types.js +4 -0
  46. package/lib/module/surfaces/types.js.map +1 -0
  47. package/lib/module/surfaces/useSurface.js +31 -0
  48. package/lib/module/surfaces/useSurface.js.map +1 -0
  49. package/lib/typescript/commonjs/dialog/Dialog.d.ts.map +1 -1
  50. package/lib/typescript/commonjs/dialog/Dialog.web.d.ts.map +1 -1
  51. package/lib/typescript/commonjs/dialog/types.d.ts +10 -0
  52. package/lib/typescript/commonjs/dialog/types.d.ts.map +1 -1
  53. package/lib/typescript/commonjs/index.d.ts +2 -0
  54. package/lib/typescript/commonjs/index.d.ts.map +1 -1
  55. package/lib/typescript/commonjs/index.web.d.ts +2 -0
  56. package/lib/typescript/commonjs/index.web.d.ts.map +1 -1
  57. package/lib/typescript/commonjs/surfaces/SurfaceHost.d.ts +25 -0
  58. package/lib/typescript/commonjs/surfaces/SurfaceHost.d.ts.map +1 -0
  59. package/lib/typescript/commonjs/surfaces/api.d.ts +41 -0
  60. package/lib/typescript/commonjs/surfaces/api.d.ts.map +1 -0
  61. package/lib/typescript/commonjs/surfaces/index.d.ts +25 -0
  62. package/lib/typescript/commonjs/surfaces/index.d.ts.map +1 -0
  63. package/lib/typescript/commonjs/surfaces/index.web.d.ts +20 -0
  64. package/lib/typescript/commonjs/surfaces/index.web.d.ts.map +1 -0
  65. package/lib/typescript/commonjs/surfaces/prompts.d.ts +13 -0
  66. package/lib/typescript/commonjs/surfaces/prompts.d.ts.map +1 -0
  67. package/lib/typescript/commonjs/surfaces/surfaceStore.d.ts +51 -0
  68. package/lib/typescript/commonjs/surfaces/surfaceStore.d.ts.map +1 -0
  69. package/lib/typescript/commonjs/surfaces/types.d.ts +145 -0
  70. package/lib/typescript/commonjs/surfaces/types.d.ts.map +1 -0
  71. package/lib/typescript/commonjs/surfaces/useSurface.d.ts +21 -0
  72. package/lib/typescript/commonjs/surfaces/useSurface.d.ts.map +1 -0
  73. package/lib/typescript/module/dialog/Dialog.d.ts.map +1 -1
  74. package/lib/typescript/module/dialog/Dialog.web.d.ts.map +1 -1
  75. package/lib/typescript/module/dialog/types.d.ts +10 -0
  76. package/lib/typescript/module/dialog/types.d.ts.map +1 -1
  77. package/lib/typescript/module/index.d.ts +2 -0
  78. package/lib/typescript/module/index.d.ts.map +1 -1
  79. package/lib/typescript/module/index.web.d.ts +2 -0
  80. package/lib/typescript/module/index.web.d.ts.map +1 -1
  81. package/lib/typescript/module/surfaces/SurfaceHost.d.ts +25 -0
  82. package/lib/typescript/module/surfaces/SurfaceHost.d.ts.map +1 -0
  83. package/lib/typescript/module/surfaces/api.d.ts +41 -0
  84. package/lib/typescript/module/surfaces/api.d.ts.map +1 -0
  85. package/lib/typescript/module/surfaces/index.d.ts +25 -0
  86. package/lib/typescript/module/surfaces/index.d.ts.map +1 -0
  87. package/lib/typescript/module/surfaces/index.web.d.ts +20 -0
  88. package/lib/typescript/module/surfaces/index.web.d.ts.map +1 -0
  89. package/lib/typescript/module/surfaces/prompts.d.ts +13 -0
  90. package/lib/typescript/module/surfaces/prompts.d.ts.map +1 -0
  91. package/lib/typescript/module/surfaces/surfaceStore.d.ts +51 -0
  92. package/lib/typescript/module/surfaces/surfaceStore.d.ts.map +1 -0
  93. package/lib/typescript/module/surfaces/types.d.ts +145 -0
  94. package/lib/typescript/module/surfaces/types.d.ts.map +1 -0
  95. package/lib/typescript/module/surfaces/useSurface.d.ts +21 -0
  96. package/lib/typescript/module/surfaces/useSurface.d.ts.map +1 -0
  97. package/package.json +17 -1
  98. package/src/__tests__/surfaceStore.test.ts +219 -0
  99. package/src/dialog/Dialog.tsx +14 -3
  100. package/src/dialog/Dialog.web.tsx +25 -6
  101. package/src/dialog/types.ts +10 -0
  102. package/src/index.ts +15 -0
  103. package/src/index.web.ts +15 -0
  104. package/src/surfaces/SurfaceHost.tsx +207 -0
  105. package/src/surfaces/api.ts +55 -0
  106. package/src/surfaces/index.ts +38 -0
  107. package/src/surfaces/index.web.ts +33 -0
  108. package/src/surfaces/prompts.tsx +178 -0
  109. package/src/surfaces/surfaceStore.ts +168 -0
  110. package/src/surfaces/types.ts +156 -0
  111. package/src/surfaces/useSurface.ts +33 -0
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.SurfaceProvider = exports.SurfaceHost = void 0;
7
+ Object.defineProperty(exports, "confirm", {
8
+ enumerable: true,
9
+ get: function () {
10
+ return _api.confirm;
11
+ }
12
+ });
13
+ Object.defineProperty(exports, "dismiss", {
14
+ enumerable: true,
15
+ get: function () {
16
+ return _api.dismiss;
17
+ }
18
+ });
19
+ Object.defineProperty(exports, "dismissAll", {
20
+ enumerable: true,
21
+ get: function () {
22
+ return _api.dismissAll;
23
+ }
24
+ });
25
+ Object.defineProperty(exports, "dismissById", {
26
+ enumerable: true,
27
+ get: function () {
28
+ return _api.dismissById;
29
+ }
30
+ });
31
+ Object.defineProperty(exports, "dismissToRoot", {
32
+ enumerable: true,
33
+ get: function () {
34
+ return _api.dismissToRoot;
35
+ }
36
+ });
37
+ Object.defineProperty(exports, "present", {
38
+ enumerable: true,
39
+ get: function () {
40
+ return _api.present;
41
+ }
42
+ });
43
+ Object.defineProperty(exports, "prompt", {
44
+ enumerable: true,
45
+ get: function () {
46
+ return _api.prompt;
47
+ }
48
+ });
49
+ Object.defineProperty(exports, "surfaces", {
50
+ enumerable: true,
51
+ get: function () {
52
+ return _api.surfaces;
53
+ }
54
+ });
55
+ Object.defineProperty(exports, "useSurface", {
56
+ enumerable: true,
57
+ get: function () {
58
+ return _useSurface.useSurface;
59
+ }
60
+ });
61
+ var _dialog = require("../dialog");
62
+ var _SurfaceHost = require("./SurfaceHost.js");
63
+ var _api = require("./api.js");
64
+ var _useSurface = require("./useSurface.js");
65
+ /**
66
+ * The shared, content-agnostic SURFACE STACK.
67
+ *
68
+ * `<SurfaceProvider>`/`<SurfaceHost>` render the coordinated stack; the
69
+ * imperative `surfaces` API (+ its named functions) present into it from
70
+ * anywhere; `useSurface()` gives a presented surface its own controls.
71
+ *
72
+ * `SurfaceHost`/`SurfaceProvider` are bound to the NATIVE `Dialog` here; the web
73
+ * fork (`./index.web`) binds the web `Dialog`. The store, imperative API, hook,
74
+ * and types are platform-agnostic and shared by both.
75
+ */
76
+ const {
77
+ SurfaceHost,
78
+ SurfaceProvider
79
+ } = (0, _SurfaceHost.createSurfaceHost)(_dialog.Dialog);
80
+ exports.SurfaceProvider = SurfaceProvider;
81
+ exports.SurfaceHost = SurfaceHost;
82
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_dialog","require","_SurfaceHost","_api","_useSurface","SurfaceHost","SurfaceProvider","createSurfaceHost","Dialog","exports"],"sourceRoot":"../../../src","sources":["surfaces/index.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,OAAA,GAAAC,OAAA;AACA,IAAAC,YAAA,GAAAD,OAAA;AAgBA,IAAAE,IAAA,GAAAF,OAAA;AAUA,IAAAG,WAAA,GAAAH,OAAA;AAxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;EAAEI,WAAW;EAAEC;AAAgB,CAAC,GAAG,IAAAC,8BAAiB,EAACC,cAAM,CAAC;AAACC,OAAA,CAAAH,eAAA,GAAAA,eAAA;AAAAG,OAAA,CAAAJ,WAAA,GAAAA,WAAA","ignoreList":[]}
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.SurfaceProvider = exports.SurfaceHost = void 0;
7
+ Object.defineProperty(exports, "confirm", {
8
+ enumerable: true,
9
+ get: function () {
10
+ return _api.confirm;
11
+ }
12
+ });
13
+ Object.defineProperty(exports, "dismiss", {
14
+ enumerable: true,
15
+ get: function () {
16
+ return _api.dismiss;
17
+ }
18
+ });
19
+ Object.defineProperty(exports, "dismissAll", {
20
+ enumerable: true,
21
+ get: function () {
22
+ return _api.dismissAll;
23
+ }
24
+ });
25
+ Object.defineProperty(exports, "dismissById", {
26
+ enumerable: true,
27
+ get: function () {
28
+ return _api.dismissById;
29
+ }
30
+ });
31
+ Object.defineProperty(exports, "dismissToRoot", {
32
+ enumerable: true,
33
+ get: function () {
34
+ return _api.dismissToRoot;
35
+ }
36
+ });
37
+ Object.defineProperty(exports, "present", {
38
+ enumerable: true,
39
+ get: function () {
40
+ return _api.present;
41
+ }
42
+ });
43
+ Object.defineProperty(exports, "prompt", {
44
+ enumerable: true,
45
+ get: function () {
46
+ return _api.prompt;
47
+ }
48
+ });
49
+ Object.defineProperty(exports, "surfaces", {
50
+ enumerable: true,
51
+ get: function () {
52
+ return _api.surfaces;
53
+ }
54
+ });
55
+ Object.defineProperty(exports, "useSurface", {
56
+ enumerable: true,
57
+ get: function () {
58
+ return _useSurface.useSurface;
59
+ }
60
+ });
61
+ var _indexWeb = require("../dialog/index.web.js");
62
+ var _SurfaceHost = require("./SurfaceHost.js");
63
+ var _api = require("./api.js");
64
+ var _useSurface = require("./useSurface.js");
65
+ /**
66
+ * Web variant of the surface stack barrel. Identical surface area to the native
67
+ * `./index.ts` — it just binds the web-fork `Dialog` (`Dialog.web.tsx`, a
68
+ * pure-DOM overlay) instead of the native `BottomSheet`-backed one. The store,
69
+ * imperative API, hook, and types are shared, platform-agnostic modules.
70
+ */
71
+ const {
72
+ SurfaceHost,
73
+ SurfaceProvider
74
+ } = (0, _SurfaceHost.createSurfaceHost)(_indexWeb.Dialog);
75
+ exports.SurfaceProvider = SurfaceProvider;
76
+ exports.SurfaceHost = SurfaceHost;
77
+ //# sourceMappingURL=index.web.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_indexWeb","require","_SurfaceHost","_api","_useSurface","SurfaceHost","SurfaceProvider","createSurfaceHost","Dialog","exports"],"sourceRoot":"../../../src","sources":["surfaces/index.web.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,SAAA,GAAAC,OAAA;AACA,IAAAC,YAAA,GAAAD,OAAA;AAWA,IAAAE,IAAA,GAAAF,OAAA;AAUA,IAAAG,WAAA,GAAAH,OAAA;AAnBA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;EAAEI,WAAW;EAAEC;AAAgB,CAAC,GAAG,IAAAC,8BAAiB,EAACC,gBAAM,CAAC;AAACC,OAAA,CAAAH,eAAA,GAAAA,eAAA;AAAAG,OAAA,CAAAJ,WAAA,GAAAA,WAAA","ignoreList":[]}
@@ -0,0 +1,154 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.confirm = confirm;
7
+ exports.prompt = prompt;
8
+ var _react = _interopRequireWildcard(require("react"));
9
+ var _reactNative = require("react-native");
10
+ var _button = require("../button");
11
+ var _index = require("../text-field/index.js");
12
+ var _useTheme = require("../theme/use-theme.js");
13
+ var _surfaceStore = require("./surfaceStore.js");
14
+ var _jsxRuntime = require("react/jsx-runtime");
15
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
16
+ /**
17
+ * Built-in `confirm` / `prompt` surfaces.
18
+ *
19
+ * They are implemented AS surfaces — each calls `present(...)` so it STACKS
20
+ * correctly above any open surface with the right layer/z (unlike Bloom's
21
+ * one-at-a-time `alert()` FIFO queue, which cannot layer over another surface).
22
+ * Their buttons resolve through the surface's own `dismiss(result)` (NOT the
23
+ * underlying `Dialog`'s close), so the value flows back through the `present()`
24
+ * promise.
25
+ */
26
+
27
+ const TITLE_STYLE = {
28
+ fontSize: 22,
29
+ fontWeight: '600',
30
+ lineHeight: 30
31
+ };
32
+ const MESSAGE_STYLE = {
33
+ fontSize: 16,
34
+ lineHeight: 22
35
+ };
36
+ function ConfirmSurface({
37
+ options,
38
+ surface
39
+ }) {
40
+ const theme = (0, _useTheme.useTheme)();
41
+ const onConfirm = (0, _react.useCallback)(() => surface.dismiss(true), [surface]);
42
+ const onCancel = (0, _react.useCallback)(() => surface.dismiss(false), [surface]);
43
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
44
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
45
+ style: [TITLE_STYLE, {
46
+ color: theme.colors.text,
47
+ paddingBottom: options.message ? 4 : 16
48
+ }],
49
+ children: options.title
50
+ }), options.message ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
51
+ style: [MESSAGE_STYLE, {
52
+ color: theme.colors.textSecondary,
53
+ paddingBottom: 16
54
+ }],
55
+ children: options.message
56
+ }) : null, /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
57
+ style: {
58
+ gap: 8
59
+ },
60
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_button.Button, {
61
+ variant: options.destructive ? 'destructive' : 'primary',
62
+ onPress: onConfirm,
63
+ testID: "bloom-surface-confirm-confirm",
64
+ children: options.confirmLabel ?? 'Confirm'
65
+ }), options.hideCancel ? null : /*#__PURE__*/(0, _jsxRuntime.jsx)(_button.Button, {
66
+ variant: "secondary",
67
+ onPress: onCancel,
68
+ testID: "bloom-surface-confirm-cancel",
69
+ children: options.cancelLabel ?? 'Cancel'
70
+ })]
71
+ })]
72
+ });
73
+ }
74
+ function PromptSurface({
75
+ options,
76
+ surface
77
+ }) {
78
+ const theme = (0, _useTheme.useTheme)();
79
+ const [value, setValue] = (0, _react.useState)(options.defaultValue ?? '');
80
+ const onSubmit = (0, _react.useCallback)(() => surface.dismiss(value), [surface, value]);
81
+ const onCancel = (0, _react.useCallback)(() => surface.dismiss(null), [surface]);
82
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
83
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
84
+ style: [TITLE_STYLE, {
85
+ color: theme.colors.text,
86
+ paddingBottom: options.message ? 4 : 16
87
+ }],
88
+ children: options.title
89
+ }), options.message ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
90
+ style: [MESSAGE_STYLE, {
91
+ color: theme.colors.textSecondary,
92
+ paddingBottom: 16
93
+ }],
94
+ children: options.message
95
+ }) : null, /*#__PURE__*/(0, _jsxRuntime.jsx)(_index.TextFieldInput, {
96
+ label: options.inputLabel ?? options.title,
97
+ placeholder: options.placeholder,
98
+ value: value,
99
+ onChangeText: setValue,
100
+ autoFocus: true,
101
+ returnKeyType: "done",
102
+ onSubmitEditing: onSubmit,
103
+ testID: "bloom-surface-prompt-input"
104
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
105
+ style: {
106
+ gap: 8,
107
+ paddingTop: 16
108
+ },
109
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_button.Button, {
110
+ variant: "primary",
111
+ onPress: onSubmit,
112
+ testID: "bloom-surface-prompt-confirm",
113
+ children: options.confirmLabel ?? 'OK'
114
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_button.Button, {
115
+ variant: "secondary",
116
+ onPress: onCancel,
117
+ testID: "bloom-surface-prompt-cancel",
118
+ children: options.cancelLabel ?? 'Cancel'
119
+ })]
120
+ })]
121
+ });
122
+ }
123
+
124
+ /**
125
+ * Present a confirm surface stacked on top of anything currently open. Resolves
126
+ * `true` on confirm, `false` on cancel OR on backdrop/Escape/back dismissal.
127
+ */
128
+ function confirm(options) {
129
+ return (0, _surfaceStore.present)(surface => /*#__PURE__*/(0, _jsxRuntime.jsx)(ConfirmSurface, {
130
+ options: options,
131
+ surface: surface
132
+ }), {
133
+ placement: options.placement ?? 'center',
134
+ dismissOnBackdrop: options.dismissible ?? true,
135
+ label: options.title
136
+ }).then(result => result === true);
137
+ }
138
+
139
+ /**
140
+ * Present a prompt surface stacked on top of anything currently open. Resolves
141
+ * the entered string on submit, or `null` on cancel OR backdrop/Escape/back
142
+ * dismissal.
143
+ */
144
+ function prompt(options) {
145
+ return (0, _surfaceStore.present)(surface => /*#__PURE__*/(0, _jsxRuntime.jsx)(PromptSurface, {
146
+ options: options,
147
+ surface: surface
148
+ }), {
149
+ placement: options.placement ?? 'center',
150
+ dismissOnBackdrop: options.dismissible ?? true,
151
+ label: options.title
152
+ }).then(result => typeof result === 'string' ? result : null);
153
+ }
154
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_button","_index","_useTheme","_surfaceStore","_jsxRuntime","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","TITLE_STYLE","fontSize","fontWeight","lineHeight","MESSAGE_STYLE","ConfirmSurface","options","surface","theme","useTheme","onConfirm","useCallback","dismiss","onCancel","jsxs","View","children","jsx","Text","style","color","colors","text","paddingBottom","message","title","textSecondary","gap","Button","variant","destructive","onPress","testID","confirmLabel","hideCancel","cancelLabel","PromptSurface","value","setValue","useState","defaultValue","onSubmit","TextFieldInput","label","inputLabel","placeholder","onChangeText","autoFocus","returnKeyType","onSubmitEditing","paddingTop","confirm","present","placement","dismissOnBackdrop","dismissible","then","result","prompt"],"sourceRoot":"../../../src","sources":["surfaces/prompts.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,172 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.__resetSurfacesForTests = __resetSurfacesForTests;
7
+ exports.dismissAll = dismissAll;
8
+ exports.dismissToRoot = dismissToRoot;
9
+ exports.dismissTop = dismissTop;
10
+ exports.finalizeClose = finalizeClose;
11
+ exports.getSnapshot = getSnapshot;
12
+ exports.present = present;
13
+ exports.requestDismiss = requestDismiss;
14
+ exports.resetSurfaces = resetSurfaces;
15
+ exports.subscribe = subscribe;
16
+ /**
17
+ * The shared, content-agnostic SURFACE STACK.
18
+ *
19
+ * A module-singleton store (same pattern as `theme/ambient-store.ts` and
20
+ * `dialog/alert-store.ts`) holding an ordered stack of surfaces presented ON TOP
21
+ * of each other — bottom→top, the last entry is the top. One coordinated stack
22
+ * that the whole ecosystem (the SDK AND consumer apps) presents into, so
23
+ * overlays never clash: per-layer z, top-only interactivity, backdrop/Escape/
24
+ * back routed to the TOP surface, lower layers dimmed.
25
+ *
26
+ * It is CONTENT-AGNOSTIC: `present` takes a render function, not a route name.
27
+ * Bloom must never know about routes; the SDK layers its route registry on top.
28
+ *
29
+ * `getSnapshot` returns a STABLE reference while unchanged (the array identity
30
+ * only changes on a real mutation), so `useSyncExternalStore` — and the React
31
+ * Compiler — never see a silently-stale value.
32
+ */
33
+
34
+ let idCounter = 0;
35
+ function genId() {
36
+ idCounter += 1;
37
+ return `bloom-surface-${idCounter}`;
38
+ }
39
+
40
+ /** A single frozen "empty stack" snapshot returned by `getSnapshot` when idle. */
41
+ const EMPTY = Object.freeze([]);
42
+ let surfaces = EMPTY;
43
+ const listeners = new Set();
44
+ function emit() {
45
+ for (const listener of listeners) listener();
46
+ }
47
+
48
+ /** Subscribe to stack changes. Returns an unsubscribe fn. */
49
+ function subscribe(listener) {
50
+ listeners.add(listener);
51
+ return () => {
52
+ listeners.delete(listener);
53
+ };
54
+ }
55
+
56
+ /** Current stack snapshot (stable ref while unchanged). Bottom→top. */
57
+ function getSnapshot() {
58
+ return surfaces;
59
+ }
60
+
61
+ /**
62
+ * Present a new surface on TOP of the stack. Returns a promise that resolves
63
+ * with the value passed to `dismiss(result)` (or `undefined` when the surface is
64
+ * dismissed without a result / by a stack-wide clear).
65
+ */
66
+ function present(render, opts) {
67
+ return new Promise(resolve => {
68
+ const entry = {
69
+ id: genId(),
70
+ render,
71
+ presentation: opts ?? {},
72
+ status: 'open',
73
+ resolve: resolve,
74
+ settled: false,
75
+ generation: 0
76
+ };
77
+ surfaces = [...surfaces, entry];
78
+ emit();
79
+ });
80
+ }
81
+
82
+ /**
83
+ * Request dismissal of a surface. RESOLVES THE PROMISE IMMEDIATELY (the exit
84
+ * animation that follows is cosmetic) and flips the entry to `'closing'` so the
85
+ * host runs its exit animation. Resolution is resolve-once via the `settled`
86
+ * guard — a second request (or the host's post-exit `onClose`) never re-resolves
87
+ * with a different value. Bumps the entry `generation` so a completion callback
88
+ * from a superseded cycle is inert.
89
+ */
90
+ function requestDismiss(id, result) {
91
+ const entry = surfaces.find(e => e.id === id);
92
+ if (!entry) return;
93
+
94
+ // Resolve-once. The mapped replacement below carries `settled: true`, so a
95
+ // later `requestDismiss(id)` reads the settled entry and skips this branch —
96
+ // no in-place mutation of the live entry is needed.
97
+ if (!entry.settled) {
98
+ entry.resolve(result);
99
+ }
100
+ if (entry.status === 'closing') return;
101
+ surfaces = surfaces.map(e => e.id === id ? {
102
+ ...e,
103
+ settled: true,
104
+ status: 'closing',
105
+ generation: e.generation + 1
106
+ } : e);
107
+ emit();
108
+ }
109
+
110
+ /**
111
+ * Splice a surface out of the stack once its exit animation has settled. Called
112
+ * by the host from the `Dialog`'s post-exit `onClose`. Idempotent and gated on
113
+ * `'closing'` status: a stale/duplicate call — or one for an entry that is not
114
+ * actually closing — is a no-op, which (together with unique entry ids) is the
115
+ * stale-callback hygiene `BottomSheetBase`'s generation guard provides for its
116
+ * reused instance.
117
+ */
118
+ function finalizeClose(id) {
119
+ const entry = surfaces.find(e => e.id === id);
120
+ if (!entry || entry.status !== 'closing') return;
121
+ const next = surfaces.filter(e => e.id !== id);
122
+ surfaces = next.length === 0 ? EMPTY : next;
123
+ emit();
124
+ }
125
+
126
+ /** Dismiss the TOP surface, resolving its promise with `result`. */
127
+ function dismissTop(result) {
128
+ const top = surfaces[surfaces.length - 1];
129
+ if (top) requestDismiss(top.id, result);
130
+ }
131
+
132
+ /**
133
+ * Dismiss every surface ABOVE the bottom-most one, keeping the root surface
134
+ * open. Pending awaiters of the dismissed surfaces resolve with `undefined` so
135
+ * they never hang. No-op with 0 or 1 surfaces.
136
+ */
137
+ function dismissToRoot() {
138
+ if (surfaces.length <= 1) return;
139
+ const above = surfaces.slice(1).map(e => e.id);
140
+ for (const id of above) requestDismiss(id, undefined);
141
+ }
142
+
143
+ /**
144
+ * Dismiss the ENTIRE stack. Every pending awaiter resolves with `undefined` so
145
+ * none hang.
146
+ */
147
+ function dismissAll() {
148
+ const ids = surfaces.map(e => e.id);
149
+ for (const id of ids) requestDismiss(id, undefined);
150
+ }
151
+
152
+ /**
153
+ * Hard-reset the stack synchronously (no exit animation), resolving all pending
154
+ * awaiters with `undefined`. Used when the host provider unmounts so no
155
+ * `present()` promise is stranded.
156
+ */
157
+ function resetSurfaces() {
158
+ if (surfaces.length === 0) return;
159
+ const pending = surfaces;
160
+ surfaces = EMPTY;
161
+ for (const entry of pending) {
162
+ if (!entry.settled) entry.resolve(undefined);
163
+ }
164
+ emit();
165
+ }
166
+
167
+ /** Test-only: hard-reset without notifying (drops listeners' work). */
168
+ function __resetSurfacesForTests() {
169
+ surfaces = EMPTY;
170
+ idCounter = 0;
171
+ }
172
+ //# sourceMappingURL=surfaceStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["idCounter","genId","EMPTY","Object","freeze","surfaces","listeners","Set","emit","listener","subscribe","add","delete","getSnapshot","present","render","opts","Promise","resolve","entry","id","presentation","status","settled","generation","requestDismiss","result","find","e","map","finalizeClose","next","filter","length","dismissTop","top","dismissToRoot","above","slice","undefined","dismissAll","ids","resetSurfaces","pending","__resetSurfacesForTests"],"sourceRoot":"../../../src","sources":["surfaces/surfaceStore.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sourceRoot":"../../../src","sources":["surfaces/types.ts"],"mappings":"","ignoreList":[]}
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.SurfaceContext = void 0;
7
+ exports.useSurface = useSurface;
8
+ var _react = require("react");
9
+ /**
10
+ * Context carrying the CURRENT surface's controls. The host wraps each presented
11
+ * surface's content in a provider bound to that entry's id, so a nested surface
12
+ * reads its OWN controls — `dismiss` targets this surface, `present` stacks a
13
+ * child above it.
14
+ */
15
+ const SurfaceContext = exports.SurfaceContext = /*#__PURE__*/(0, _react.createContext)(null);
16
+ SurfaceContext.displayName = 'BloomSurfaceContext';
17
+
18
+ /**
19
+ * Read the current surface's {@link SurfaceControls} from inside a presented
20
+ * surface. Equivalent to the `surface` argument the render function receives —
21
+ * use whichever is convenient (props vs. context).
22
+ *
23
+ * DEPTH only: `dismiss` (resolve this surface's promise + close) and `present`
24
+ * (stack a child). Navigation within a surface is the SDK's route layer, not
25
+ * this hook.
26
+ *
27
+ * @throws if called outside a presented surface.
28
+ */
29
+ function useSurface() {
30
+ const controls = (0, _react.useContext)(SurfaceContext);
31
+ if (!controls) {
32
+ throw new Error('useSurface must be called from within a presented surface (rendered by <SurfaceProvider>/<SurfaceHost>).');
33
+ }
34
+ return controls;
35
+ }
36
+ //# sourceMappingURL=useSurface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_react","require","SurfaceContext","exports","createContext","displayName","useSurface","controls","useContext","Error"],"sourceRoot":"../../../src","sources":["surfaces/useSurface.ts"],"mappings":";;;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AAIA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMC,cAAc,GAAAC,OAAA,CAAAD,cAAA,gBAAG,IAAAE,oBAAa,EAAyB,IAAI,CAAC;AACzEF,cAAc,CAACG,WAAW,GAAG,qBAAqB;;AAElD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASC,UAAUA,CAAA,EAAoB;EAC5C,MAAMC,QAAQ,GAAG,IAAAC,iBAAU,EAACN,cAAc,CAAC;EAC3C,IAAI,CAACK,QAAQ,EAAE;IACb,MAAM,IAAIE,KAAK,CACb,0GACF,CAAC;EACH;EACA,OAAOF,QAAQ;AACjB","ignoreList":[]}
@@ -4,7 +4,7 @@ import React, { useCallback, useEffect, useId, useImperativeHandle, useMemo, use
4
4
  import { Pressable, StyleSheet, useWindowDimensions, View } from 'react-native';
5
5
  import Animated, { cancelAnimation, Easing, runOnJS, useAnimatedStyle, useSharedValue, withTiming } from 'react-native-reanimated';
6
6
  import { BottomSheet } from '../bottom-sheet';
7
- import { Z_INDEX } from "../styles/z-index.js";
7
+ import { Z_INDEX, Z_INDEX_LAYER_STEP } from "../styles/z-index.js";
8
8
  import { useTheme } from "../theme/use-theme.js";
9
9
  import { Context, useDialogControl } from "./context.js";
10
10
  import { DialogBody } from "./DialogContent.js";
@@ -73,6 +73,7 @@ function CenteredOrSideDialog({
73
73
  description,
74
74
  actions,
75
75
  placement,
76
+ layer,
76
77
  width = DEFAULT_SIDE_WIDTH,
77
78
  inset,
78
79
  dismissOnBackdrop = true,
@@ -196,6 +197,7 @@ function CenteredOrSideDialog({
196
197
  open: sideOpen,
197
198
  onDismiss: handleDismiss,
198
199
  side: placement,
200
+ layer: layer,
199
201
  width: width,
200
202
  inset: inset,
201
203
  dismissOnBackdrop: dismissOnBackdrop,
@@ -263,6 +265,7 @@ function SideSheet({
263
265
  open,
264
266
  onDismiss,
265
267
  side,
268
+ layer,
266
269
  width,
267
270
  inset,
268
271
  dismissOnBackdrop,
@@ -352,7 +355,12 @@ function SideSheet({
352
355
  }), [insetTop, insetBottom, side, anchorInset, sideWidth]);
353
356
  if (!mounted) return null;
354
357
  return /*#__PURE__*/_jsxs(View, {
355
- style: [sideStyles.root, containerStyle],
358
+ style: [sideStyles.root,
359
+ // Per-layer offset so a side dialog stacked on top of another (surface
360
+ // stack) paints above it. Layer 0 → offset 0 → unchanged.
361
+ {
362
+ zIndex: Z_INDEX.fullscreen + Z_INDEX_LAYER_STEP * (layer ?? 0)
363
+ }, containerStyle],
356
364
  ...(containerClassName ? {
357
365
  className: containerClassName
358
366
  } : {}),
@@ -393,9 +401,10 @@ function SideSheet({
393
401
  });
394
402
  }
395
403
  const sideStyles = StyleSheet.create({
404
+ // `zIndex` is applied inline (`Z_INDEX.fullscreen + layer offset`) so a side
405
+ // dialog stacked on top of another paints above it in the surface stack.
396
406
  root: {
397
- ...StyleSheet.absoluteFill,
398
- zIndex: Z_INDEX.fullscreen
407
+ ...StyleSheet.absoluteFill
399
408
  },
400
409
  backdrop: {
401
410
  ...StyleSheet.absoluteFill,